public void generaSETPruebaParaElSII(CFDComprobanteFiscalDigitalFabrica cfdsFabricados)
        {
            _iErr = 0;
            try
            {
                int iMaxErr         = 0;
                int numContenedores = cfdsFabricados.lContenedores.Count();

                CFDServicioDespachoSII.Encriptador = cfdsFabricados.encriptador;
                CFDServicioDespachoSII.uri         = _param.URLwebServPAC;              //"https://maullin.sii.cl/cgi_dte/UPL/DTEUpload";

                String valorToken = String.Empty;

                if (numContenedores > 0)
                {
                    MuestraAvance(1, "SET de prueba para el SII...");
                    //valorToken = CFDServicioDespachoSII.GetToken();
                    //_iErr = CFDServicioDespachoSII.IErr;
                    //_sMsj = CFDServicioDespachoSII.SMsj;
                }

                if (_iErr != 0)
                {
                    MuestraAvance(100 / numContenedores, _sMsj);
                    return;
                }

                foreach (EnvioDteModel envio in cfdsFabricados.lContenedores)
                {
                    _iErr = 0;

                    //guarda el xml
                    string rutaYNomArchivo = envio.GuardaArchivo();
                    _iErr = envio.iErr;
                    _sMsj = envio.sMsj;

                    MuestraAvance(100 / numContenedores, "Set: " + envio.setId + " " + _sMsj);

                    if (_iErr > 0)
                    {
                        iMaxErr++;
                    }
                    if (iMaxErr > 10)
                    {
                        break;
                    }
                }
                if (numContenedores > 0)
                {
                    MuestraAvance(100, "Envío finalizado. ");
                }

                MuestraAvance(100, "");
            }
            catch (Exception es)
            {
                _iErr++;
                _sMsj = "Excepción al enviar sets al SII. [CFDServicioDespachoSolicitudes.generaSETPruebaParaElSII()]" + es.Message;
            }
        }
Esempio n. 2
0
        public CFDLibroCVFabrica(ConexionAFuenteDatos Conex, Parametros Param)
        {
            try
            {
                sMsj   = string.Empty;
                iErr   = 0;
                _Param = Param;
                _Conex = Conex;

                _encoding = Encoding.GetEncoding("ISO-8859-1");
                //_lContenedores = new List<EnvioDteModel>();
                //lDocumentos = new List<CFDComprobanteFiscalDigital>();

                OnProgreso(1, "Preparando certificados...");                //Notifica al suscriptor
                cfdFabrica = new CFDComprobanteFiscalDigitalFabrica(Conex, Param);

                if (cfdFabrica.iErr != 0)
                {
                    iErr = cfdFabrica.iErr;
                    sMsj = cfdFabrica.sMsj;
                }
            }
            catch (Exception cf)
            {
                sMsj = "Excepción al inicializar emisión de libros. " + cf.Message + " [CFDLibroCVFabrica.constructor]";
                iErr++;
            }
        }
        /// <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>
        /// Envía correos
        /// Requisito. Los cfds deben haber transicionado
        /// </summary>
        /// <param name="cfdsFabricados">contiene la lista cfds en la lista lDocumentos y la lista de envíos lContenedores</param>
        public void EnviaAlCliente(CFDComprobanteFiscalDigitalFabrica cfdsFabricados)
        {
            _iErr = 0;
            _sMsj = string.Empty;
            int numDocs = cfdsFabricados.lDocumentos.Count();

            if (numDocs == 0)
            {
                MuestraAvance(0, "No hay comprobantes válidos para enviar a los clientes. Verifique el estado de los documentos que requiere enviar.");
                return;
            }
            else
            {
                MuestraAvance(1, "Iniciando envío de documentos a clientes...");
            }

            cfdReglasEmailSolicitud envio = new cfdReglasEmailSolicitud(_conex, _param);

            if (envio.iErr != 0 || !envio.ObtieneSeccionesEmail(_param.emailCarta))
            {
                MuestraAvance(2, "No puede enviar e-mails. ");
                MuestraAvance(0, envio.sMsj);
                return;
            }

            foreach (CFDComprobanteFiscalDigital cfd in cfdsFabricados.lDocumentos)
            {
                ConstruyeEnvioAlCliente(cfd, cfdsFabricados);

                if (_iErr == 0)
                {
                    if (envio.ProcesaMensaje(cfd.custnmbr, cfd.sopnumbe, cfd.mensaje))
                    {
                        _sMsj = cfd.cicloDeVida.targetSingleStatus;

                        cfd.GuardaActualizaMensaje("E-mail enviado el " + DateTime.Today.ToString());
                    }
                    else
                    {
                        _iErr = envio.iErr;
                        _sMsj = envio.sMsj;
                    }
                }
                MuestraAvance(100 / numDocs, "Doc: " + cfd.sopnumbe + " " + _sMsj);
            }

            if (numDocs > 0)
            {
                MuestraAvance(100, "Envío de correos finalizado. ");
            }
            MuestraAvance(100, "");
        }
        public void EnviaAlSII(CFDComprobanteFiscalDigitalFabrica cfdsFabricados)
        {
            _iErr = 0;
            try
            {
                int iMaxErr         = 0;
                int numContenedores = cfdsFabricados.lContenedores.Count();

                CFDServicioDespachoSII.Encriptador = cfdsFabricados.encriptador;
                CFDServicioDespachoSII.uri         = _param.URLwebServPAC;              //"https://maullin.sii.cl/cgi_dte/UPL/DTEUpload";

                String valorToken = String.Empty;

                //#if DEBUG
                //        MuestraAvance(1, "Iniciando envío de documentos al SII...");
                //#else
                if (numContenedores > 0)
                {
                    MuestraAvance(1, "Iniciando envío de documentos al SII...");
                    valorToken = CFDServicioDespachoSII.GetToken();
                    _iErr      = CFDServicioDespachoSII.IErr;
                    _sMsj      = CFDServicioDespachoSII.SMsj;
                }
                //#endif

                if (_iErr != 0)
                {
                    MuestraAvance(100 / numContenedores, _sMsj);
                    return;
                }

                int i = 1;  //temporal para test
                foreach (EnvioDteModel envio in cfdsFabricados.lContenedores)
                {
                    _iErr = 0;

                    //guarda el xml
                    string rutaYNomArchivo = envio.GuardaArchivo();
                    _iErr = envio.iErr;
                    _sMsj = envio.sMsj;

                    //#if DEBUG
                    //    MuestraAvance(1, "DEBUG enviado al SII...");
                    //#else
                    //enviar al SII
                    if (_iErr == 0)
                    {
                        //CFDServicioDespachoSII.xdocument = XDocument.Parse(envio.xDocXml.InnerXml, LoadOptions.PreserveWhitespace);
                        CFDServicioDespachoSII.nombreArchivo = envio.setId + ".xml";     //envio.RutaXml.Trim() + //
                        CFDServicioDespachoSII.rutEmisor     = envio.RutPersonaEnvia;    //persona
                        CFDServicioDespachoSII.rutEmpresa    = envio.RutEmpresaEmisora;  //compañía

                        //trackId es obtenido por UploadFile
                        CFDServicioDespachoSII.UploadFile(valorToken, envio.xDocXml);           //  habilitar en producción
                        //CFDServicioDespachoSII.trackId = i.ToString();                    //. habilitar para test
                        i++;

                        _iErr = CFDServicioDespachoSII.IErr;
                        _sMsj = CFDServicioDespachoSII.SMsj;
                    }

                    //si el envío fue satisfactorio registrar en la bitácora
                    if (_iErr == 0)
                    {
                        envio.GuardaActualiza(CFDServicioDespachoSII.trackId);
                        _iErr = envio.iErr;
                        _sMsj = envio.sMsj;
                    }
                    //#endif
                    MuestraAvance(100 / numContenedores, "Set: " + envio.setId + " " + _sMsj);

                    if (_iErr > 0)
                    {
                        iMaxErr++;
                    }
                    if (iMaxErr > 10)
                    {
                        break;
                    }
                }
                if (numContenedores > 0)
                {
                    MuestraAvance(100, "Envío finalizado. ");
                }

                MuestraAvance(100, "");
            }
            catch (Exception es)
            {
                _iErr++;
                _sMsj = "Excepción al enviar sets al SII. [CFDServicioDespachoSolicitudes.EnviaAlSII()]" + es.Message;
            }
        }