/// <summary> /// Forma el envío de la factura usando como receptor el rut del cliente. El nuevo archivo es guardado con la extensión .cliente.xml /// Debe existir un archivo xml enviado al SII y aceptado por el SII /// </summary> /// <param name="cfd"></param> /// <param name="cfdsFabricados"></param> private void ConstruyeEnvioAlCliente(CFDComprobanteFiscalDigital cfd, CFDComprobanteFiscalDigitalFabrica cfdsFabricados) { try { XmlDocument xDteParaCliente = new XmlDocument(); xDteParaCliente.PreserveWhitespace = true; String rutaYNomArchivo = cfd.mensaje; String dteEnviadoAlSii = ""; using (StreamReader sr = new StreamReader(rutaYNomArchivo, cfdsFabricados.encodig)) { dteEnviadoAlSii = sr.ReadToEnd(); } xDteParaCliente.LoadXml(dteEnviadoAlSii); XPathNavigator navigator = xDteParaCliente.CreateNavigator(); XmlNamespaceManager nsManager = new XmlNamespaceManager(navigator.NameTable); nsManager.AddNamespace("env", "http://www.sii.cl/SiiDte"); nsManager.AddNamespace("sig", "http://www.w3.org/2000/09/xmldsig#"); //Reemplaza el rut del SII por el rut del cliente foreach (XPathNavigator nav in navigator.Select("//env:Caratula/env:RutReceptor", nsManager)) { if (nav.Value.Equals(_rutSII)) { nav.SetValue(cfd.idCliente); } } XmlNodeList nodes = xDteParaCliente.SelectNodes("//env:EnvioDTE/sig:Signature", nsManager); //Quita el nodo Signature del envío foreach (XmlNode node in nodes) { node.RemoveAll(); break; } String sDteParaCliente = xDteParaCliente.InnerXml.Replace("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></Signature>", String.Empty); xDteParaCliente.LoadXml(sDteParaCliente); //Firma el nuevo envío XmlAttribute idAFirmar = (XmlAttribute)xDteParaCliente.SelectSingleNode("//env:EnvioDTE/env:SetDTE/@ID", nsManager); cfdsFabricados.ModeloEnvio = new EnvioDteModel(); cfdsFabricados.ModeloEnvio.setId = idAFirmar.Value; cfdsFabricados.ModeloEnvio.xDocXml = xDteParaCliente; cfdsFabricados.ModeloEnvio.criptografo = cfdsFabricados.encriptador; cfdsFabricados.firmaEnvio(); String rutaYNomArchivoCliente = rutaYNomArchivo.Replace(".xml", ".cliente.xml"); CustomXmlTextWriter tw = new CustomXmlTextWriter(rutaYNomArchivoCliente, cfdsFabricados.encodig.WebName.ToUpper()); cfdsFabricados.ModeloEnvio.xDocXml.Save(tw); tw.Close(); } catch (Exception ce) { _sMsj = "Excepción al formar el envío al cliente. " + ce.Message + " [CFDServicioDespachoSolicitudes.ConstruyeEnvioAlCliente]"; _iErr++; } }
/// <summary> /// Guarda el archivo xml, lo comprime en zip y anota en la bitácora la factura emitida y el nuevo estado binario. /// </summary> /// <param name="trxVenta">Lista de facturas cuyo índice apunta a la factura que se va procesar.</param> /// <param name="comprobante">Documento xml</param> /// <param name="mEstados">Nuevo set de estados</param> /// <returns>False cuando hay al menos un error</returns> public string GuardaArchivo() { sMsj = ""; iErr = 0; //string nomArchivo = string.Empty; string rutaYNomArchivo = string.Empty; try { //arma el nombre del archivo xml rutaYNomArchivo = _rutaXml.Trim() + _nomArchivo; CustomXmlTextWriter tw = new CustomXmlTextWriter(rutaYNomArchivo + ".xml", _encoding.WebName.ToUpper()); _xDocXml.Save(tw); tw.Close(); //Comprime el archivo xml //if (_Param.zip) // Utiles.Zip(rutaYNomArchivo, ".xml"); //iErr = codigobb.iErr + reporte.numErr + Utiles.numErr; //sMsj = codigobb.strMensajeErr + " " + reporte.mensajeErr + " " + Utiles.msgErr; // //Si hay error en cbb o pdf o zip anota en la bitácora // if (iErr != 0) // ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conexion.Usuario, // "emitido", "emitido", mEstados.eBinActualConError, // mEstados.EnLetras(mEstados.eBinActualConError) + sMsj.Trim()); //} return(rutaYNomArchivo); } catch (DirectoryNotFoundException) { sMsj = "Verifique la existencia de la ruta indicada en la configuración de Ruta de archivos Xml. No existe la ruta actual: " + _rutaXml.Trim() + " [EnvioDteModel.Guarda]"; iErr++; return(rutaYNomArchivo); } catch (IOException) { sMsj = "Verifique permisos de escritura en: " + _rutaXml.Trim() + ". No se pudo guardar el archivo xml ni registrar el documento en la bitácora. [EnvioDteModel.Guarda]"; iErr++; return(rutaYNomArchivo); } catch (Exception eAFE) { if (eAFE.Message.Contains("denied")) { sMsj = "Elimine el archivo xml, luego vuelva a intentar. " + eAFE.Message + " [EnvioDteModel.Guarda]"; } else { sMsj = "No se puede guardar el archivo XML ni registrar la Bitácora. " + eAFE.Message + " [EnvioDteModel.Guarda] " + eAFE.StackTrace; } iErr++; return(rutaYNomArchivo); } }
/// <summary> /// Guarda el archivo xml, anota en la bitácora el libro emitido y el nuevo estado binario. /// </summary> public string Guarda() { _sMsj = ""; _iErr = 0; string rutaYNomArchivo = string.Empty; try { //arma el nombre del archivo xml rutaYNomArchivo = _rutaXml.Trim() + _nomArchivo; //Guarda el archivo xml CustomXmlTextWriter tw = new CustomXmlTextWriter(rutaYNomArchivo + ".xml", _encoding.WebName.ToUpper()); //tw.Formatting = Formatting.Indented; _xDocXml.Save(tw); tw.Close(); _bitacora.Save(_periodo, _tipo, _cicloDeVida.targetSingleStatus, rutaYNomArchivo + ".xml", Convert.ToInt16(_cicloDeVida.idxTargetSingleStatus), _cicloDeVida.targetBinStatus, _cicloDeVida.EstadoEnPalabras(_cicloDeVida.targetBinStatus), _xDocXml.InnerXml.Replace(_sDeclaracionXml, String.Empty), _Conex.Usuario); return(rutaYNomArchivo); //if (iErr == 0) //{ // //Comprime el archivo xml // if (_Param.zip) // Utiles.Zip(rutaYNomArchivo, ".xml"); // iErr = codigobb.iErr + reporte.numErr + Utiles.numErr; // sMsj = codigobb.strMensajeErr + " " + reporte.mensajeErr + " " + Utiles.msgErr; // //Si hay error en cbb o pdf o zip anota en la bitácora // if (iErr != 0) // ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conexion.Usuario, // "emitido", "emitido", mEstados.eBinActualConError, // mEstados.EnLetras(mEstados.eBinActualConError) + sMsj.Trim()); //} } catch (DirectoryNotFoundException) { _sMsj = "Verifique la existencia de la ruta indicada en la configuración de Ruta de archivos Xml. No existe la ruta actual: " + _rutaXml.Trim() + " [CFDLibroCV.Guarda]"; _iErr++; throw; } catch (IOException) { _sMsj = "Verifique permisos de escritura en: " + _rutaXml.Trim() + ". No se pudo guardar el archivo xml ni registrar el documento en la bitácora. [CFDLibroCV.Guarda]"; _iErr++; throw; } catch (Exception eAFE) { if (eAFE.Message.Contains("denied")) { _sMsj = "Elimine el archivo xml, luego vuelva a intentar. " + eAFE.Message + " [CFDLibroCV.Guarda]"; } else { _sMsj = "No se puede guardar el archivo XML ni registrar la Bitácora. " + eAFE.Message + " [CFDLibroCV.Guarda] " + eAFE.StackTrace; } _iErr++; throw; } }