public void ActualizaCambioEstado(vwCfdTransaccionesDeVenta loteCfds, int evento)
        {
            try
            {
                sMsj = string.Empty;
                iErr = 0;

                if (_lDocumentos.Count() == 0)
                {
                    OnProgreso(0, "No hay documentos válidos para cambiar de estado.");
                    return;
                }

                OnProgreso(0, "Actualizando...");
                foreach (CFDComprobanteFiscalDigital cfd in _lDocumentos)
                {
                    cfd.Actualiza(String.Empty);
                    OnProgreso(0, "Doc: " + cfd.sopnumbe + " " + cfd.sMsj);
                }
            }
            catch (Exception pc)
            {
                sMsj = "Excepción al actualizar cambios de estado. " + pc.Message + " [CFDComprobanteFiscalDigitalFabrica.ActualizaCambioEstado] ";
                iErr++;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Genera y guarda el archivo pdf.
        /// Luego anota en la bitácora la factura impresa y el nuevo estado binario
        /// </summary>
        /// <param name="trxVenta"></param>
        /// <param name="eBase"></param>
        /// <param name="eBinario"></param>
        /// <param name="enLetras"></param>
        /// <returns></returns>
        public bool AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, string eBase, string eBinario, string enLetras)
        {
            ultimoMensaje   = "";
            numMensajeError = 0;

            try
            {
                string nomArchivo      = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
                string rutaYNomArchivo = trxVenta.RutaXml.Trim() + nomArchivo;

                //reporte.generaEnFormatoPDF(rutaYNomArchivo, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);

                //numMensajeError = reporte.numErr; // + codigobb.iErr;
                //ultimoMensaje = reporte.mensajeErr; // + codigobb.strMensajeErr;

                //if (reporte.numErr==0)
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Almacenado en " + rutaYNomArchivo, "0", _Conexion.Usuario, "", eBase, eBinario, enLetras);

                return(ultimoMensaje.Equals(string.Empty));
            }
            catch (Exception eAFE)
            {
                ultimoMensaje = "Contacte a su administrador. No se pudo guardar el archivo PDF ni registrar la Bitácora. [AlmacenaEnRepositorio()] " + eAFE.Message;
                numMensajeError++;
                return(false);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Genera el código de barras bidimensional y guarda el archivo pdf.
        /// Luego anota en la bitácora la factura impresa y el nuevo estado binario
        /// 23/11/16 jcf Genera código qr sólo si parámetro emite=1
        /// </summary>
        /// <param name="trxVenta"></param>
        /// <param name="eBase"></param>
        /// <param name="eBinario"></param>
        /// <param name="enLetras"></param>
        /// <returns></returns>
        public bool AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, string eBase, string eBinario, string enLetras)
        {
            string nomArchivo      = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
            string rutaYNomArchivo = trxVenta.RutaXml.Trim() + nomArchivo;

            //Genera y guarda código de barras bidimensional
            if (_Param.emite)
            {
                getDatosDelXml(trxVenta.Soptype, trxVenta.Sopnumbe);
                codigobb.GeneraCodigoDeBarras(string.Empty,
                                              _Param.URLConsulta + "?&id=" + x_uuid + "&re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente + "&tt=" + Math.Abs(trxVenta.Total).ToString() + "&fe=" + Utiles.Derecha(x_sello, 8)
                                              , trxVenta.RutaXml.Trim() + "cbb\\" + nomArchivo + ".jpg");
            }
            //Genera pdf
            reporte.generaEnFormatoPDF(rutaYNomArchivo, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);

            ultimoMensaje = reporte.mensajeErr;

            if (reporte.numErr == 0)
            {
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Almacenado en " + rutaYNomArchivo, "0", _Conexion.Usuario, "", eBase, eBinario, enLetras);
            }

            return(ultimoMensaje.Equals(string.Empty));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Ejecuta la generación de pdfs en un thread independiente
        /// </summary>
        /// <param name="e">trxVentas</param>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            ReportProgress(0, "Iniciando proceso...\r\n");
            object[] args = e.Argument as object[];
            vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0];
            int    i = 1; int errores = 0;
            string eBinario = "";
            string eBase    = "";
            string msj      = "";
            cfdReglasFacturaXml DocumentoEmitido = new cfdReglasFacturaXml(_Conex, _Param);     //log de facturas xml emitidas y anuladas

            //ReglasME maquina = new ReglasME(_Param);

            //if (DocumentoEmitido.numMensajeError != 0)
            //{
            //    e.Result = DocumentoEmitido.ultimoMensaje + "\r\n";
            //    ReportProgress(100, DocumentoEmitido.ultimoMensaje + "\r\n");
            //    return;
            //}

            //trxVenta.Rewind();                   //move to first record
            //do
            //{
            //    if (CancellationPending) { e.Cancel = true; return; }
            //    msj = "";
            //    if (maquina.ValidaTransicion(_Param.tipoDoc, "IMPRIME PDF", trxVenta.EstadoActual, "impreso"))
            //        if (trxVenta.Voidstts == 0 && trxVenta.EstadoContabilizado.Equals("contabilizado"))  //no anulado y contabilizado
            //        {
            //            if (!_Param.emite && !maquina.impreso(trxVenta.EstadoActual))
            //                eBase = "emitido";
            //            else
            //                eBase = "impreso";

            //            //Si no emite y es primera impresión: guardar el archivo pdf y registrar el log: emitido
            //            //sino: registrar el log impreso
            //            if (DocumentoEmitido.AlmacenaEnRepositorio(trxVenta, eBase, maquina.eBinarioNuevo, maquina.EnLetras(maquina.eBinarioNuevo, _Param.tipoDoc)))
            //            {
            //                eBinario = maquina.eBinarioNuevo;
            //            }
            //            else
            //            {
            //                eBinario = maquina.eBinActualConError;
            //                errores++;
            //            }

            //            if (_Param.emite && !maquina.impreso(trxVenta.EstadoActual))
            //                DocumentoEmitido.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido",
            //                                                    eBinario, maquina.EnLetras(eBinario, _Param.tipoDoc) + DocumentoEmitido.ultimoMensaje, String.Empty);

            //        }
            //        else
            //            msj = "No se puede generar porque no está Contabilizado o está Anulado.";
            //    ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + DocumentoEmitido.ultimoMensaje + maquina.ultimoMensaje + msj + "\r\n");
            //    i++;
            //} while (trxVenta.MoveNext() && errores < 10);
            //e.Result = "Generación de Pdfs finalizado! \r\n";
            ReportProgress(100, "");
        }
        private CFDComprobanteFiscalDigital preparaDte(vwCfdTransaccionesDeVenta loteCfds, XmlDocument autorizacion)
        {
            iErr = 0;
            sMsj = String.Empty;
            CFDComprobanteFiscalDigital cfd = new CFDComprobanteFiscalDigital(_Conex, _Param, _encoding, loteCfds.EstadoActual, loteCfds.IdxSingleStatus, loteCfds.Voidstts,
                                                                              loteCfds.Sopnumbe, loteCfds.Soptype, loteCfds.IdImpuestoCliente, loteCfds.CUSTNMBR, loteCfds.NombreCliente, loteCfds.Doctype);

            cfd.modeloDte.AutorizacionXml = autorizacion;
            cfd.modeloDte.criptografo     = _encriptador;
            cfd.fechaHora = loteCfds.Fechahora;
            iErr         += cfd.iErr;
            sMsj          = cfd.sMsj;

            if (iErr == 0)
            {
                cfd.cicloDeVida.Transiciona(Maquina.eventoEnsamblaLote, _certificados.firma);
                iErr = cfd.cicloDeVida.iErr;
                sMsj = cfd.cicloDeVida.sMsj;
            }

            if (iErr == 0)
            {
                cfd.ensamblaCfd(loteCfds);
                iErr = cfd.iErr;
                sMsj = cfd.sMsj;
            }

            if (iErr == 0)
            {
                //genera el código de barras y guarda el archivo jpg
                cfd.GuardaCodigoBarras();
                iErr = cfd.iErr;
                sMsj = cfd.sMsj;
            }
            if (iErr == 0)
            {
                //registra log de la emisión de factura antes de la impresión
                cfd.Guarda();
                iErr = cfd.iErr;
                sMsj = cfd.sMsj;
            }

            if (iErr == 0)
            {
                cfd.GuardaPdf("B");                                     //B: Original y copia en un solo pdf
                iErr = cfd.iErr;
                sMsj = cfd.sMsj;

                if (sMsj.Contains("Crystal"))                           //no está instalado crystal reports. Se puede continuar pero luego de instalar crystal se debe generar los pdfs
                {
                    iErr = 0;
                    sMsj = "Advertencia. No se ha generado el pdf. " + sMsj;
                }
            }

            return(cfd);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Ejecuta el envío de correos en un thread independiente
        /// </summary>
        /// <param name="e">trxVentas</param>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            int    errores = 0; int i = 1;
            string asunto = ""; string cuerpo = "";

            ReportProgress(0, "Iniciando proceso...\r\n");
            object[] args = e.Argument as object[];
            vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0];

            cfdReglasEmail cliente = new cfdReglasEmail(_Conex, _Param);

            if (!cliente.SeccionesEmail(ref asunto, ref cuerpo))
            {
                e.Result = "No puede enviar e-mails \r\n";
                ReportProgress(100, cliente.ultimoMensaje + "\r\n");
                return;
            }

            //log de facturas xml emitidas y anuladas
            cfdReglasFacturaXml doc     = new cfdReglasFacturaXml(_Conex, _Param);
            EmailSmtp           mail    = new EmailSmtp(_Param.emailSmtp, _Param.emailPort, _Param.emailUser, _Param.emailPwd, _Param.emailSsl);
            ReglasME            maquina = new ReglasME(_Param);
            string eBinario             = "";

            trxVenta.Rewind();                                          //move to first record
            do
            {
                if (CancellationPending)
                {
                    e.Cancel = true; return;
                }
                if (trxVenta.Voidstts == 0)                             //documento no anulado
                {
                    if (maquina.ValidaTransicion(_Param.tipoDoc, "ENVIA EMAIL", trxVenta.EstadoActual, "enviado"))
                    {
                        if (!cliente.ProcesaEnvioMail(mail, trxVenta.CUSTNMBR, trxVenta.Docid, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.NombreCliente,
                                                      trxVenta.EstadoActual, maquina.eBinarioNuevo, trxVenta.Mensaje, asunto, cuerpo))
                        {
                            eBinario = maquina.eBinActualConError;
                            errores++;
                        }
                        else
                        {
                            eBinario = maquina.eBinarioNuevo;
                        }

                        doc.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario,
                                                    "emitido", "emitido", eBinario, maquina.EnLetras(eBinario) + cliente.ultimoMensaje);
                    }
                }
                ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + cliente.ultimoMensaje + maquina.ultimoMensaje + "\r\n");
                i++;
                cliente.ultimoMensaje = "";
            } while (trxVenta.MoveNext() && errores < 10);
            e.Result = "Envío de Emails finalizado! \r\n";
            ReportProgress(100, "");
        }
        /// <summary>
        /// Carga en una lista los dte que ha marcado el usuario. No incluye el xml, sólo la ruta donde está guardado.
        /// </summary>
        /// <param name="loteCfds">Lote de documentos a procesar</param>
        public void cargaLote(vwCfdTransaccionesDeVenta loteCfds, int evento)
        {
            try
            {
                OnProgreso(1, "Preparando comprobantes...");        //Notifica al suscriptor

                loteCfds.Rewind();                                  //move to first record

                sMsj = string.Empty;
                iErr = 0;
                int iMaxErr = 0;
                //string docIdAnterior = string.Empty;
                CFDComprobanteFiscalDigital cfd;
                _lDocumentos.Clear();
                do
                {
                    cfd = new CFDComprobanteFiscalDigital(_Conex, _Param, _encoding, loteCfds.EstadoActual, loteCfds.IdxSingleStatus, loteCfds.Voidstts,
                                                          loteCfds.Sopnumbe, loteCfds.Soptype, loteCfds.IdImpuestoCliente, loteCfds.CUSTNMBR, loteCfds.NombreCliente, loteCfds.Doctype);
                    cfd.rutaXml = loteCfds.RutaXml;
                    cfd.mensaje = loteCfds.Mensaje;
                    iErr       += cfd.iErr;

                    if (iErr == 0)
                    {
                        cfd.cicloDeVida.Transiciona(evento, _certificados.envia);
                        iErr = cfd.cicloDeVida.iErr;
                        sMsj = cfd.cicloDeVida.sMsj;
                    }

                    if (iErr == 0)
                    {
                        _lDocumentos.Add(cfd);
                    }

                    OnProgreso(100 / loteCfds.RowCount, "Doc: " + loteCfds.Sopnumbe + " " + cfd.sMsj.Trim() + sMsj, cfd.modeloDte.xDocXml.ToString());

                    if (iErr > 0)
                    {
                        iMaxErr++;
                    }
                    sMsj = string.Empty;
                    iErr = 0;
                } while (loteCfds.MoveNext() && iMaxErr < 10);
                OnProgreso(100, _lDocumentos.Count().ToString() + " comprobante(s) preparado(s).");
            }
            catch (Exception errorGral)
            {
                sMsj = "Excepción encontrada al cargar lote de comprobantes. " + errorGral.Message + " [CFDComprobanteFiscalDigitalFabrica.cargaLote] ";
                iErr++;
                OnProgreso(0, sMsj);
            }
        }
        /// <summary>
        /// Ensambla y firma una lista de documentos dte a partir de un lote de facturas.
        /// _lDocumentos: Lista de dte's
        /// </summary>
        /// <param name="loteCfds">Lote de documentos a procesar</param>
        public void ensamblaLote(vwCfdTransaccionesDeVenta loteCfds)
        {
            try
            {
                OnProgreso(1, "Iniciando...");                              //Notifica al suscriptor

                loteCfds.Rewind();                                          //move to first record

                sMsj = string.Empty;
                iErr = 0;
                int iMaxErr = 0;
                CFDComprobanteFiscalDigital cfd;
                XmlDocument autorizacion = new XmlDocument();
                autorizacion.PreserveWhitespace = true;
                string rutaCertsAnterior = string.Empty;
                _lDocumentos.Clear();

                do
                {
                    //Obtiene la llave de timbrado por cada nuevo Id de documento de venta
                    if (iErr == 0 && _certificados.firma == 1 && !loteCfds.RutaCerts.Equals(rutaCertsAnterior))
                    {
                        autorizacion.Load(loteCfds.RutaCerts);
                        rutaCertsAnterior = loteCfds.RutaCerts;
                    }
                    cfd = preparaDte(loteCfds, autorizacion);

                    if (iErr == 0)
                    {
                        _lDocumentos.Add(cfd);
                    }

                    OnProgreso(100 / loteCfds.RowCount, "Doc: " + loteCfds.Sopnumbe + " " + sMsj, cfd.modeloDte.xDocXml.ToString());

                    if (iErr > 0)
                    {
                        iMaxErr++;
                    }
                    sMsj = string.Empty;
                    iErr = 0;
                } while (loteCfds.MoveNext() && iMaxErr < 10);

                OnProgreso(100, _lDocumentos.Count().ToString() + " comprobante(s) para enviar al SII. ");
            }
            catch (Exception errorGral)
            {
                sMsj = "Excepción encontrada al ensamblar lote. " + errorGral.Message + " [CFDComprobanteFiscalDigitalFabrica.ensamblaLote] ";
                iErr++;
                OnProgreso(0, sMsj);
            }
        }
        //************************************************************************
        /// <summary>
        /// Arma un cfd vigente (no anulado)
        /// </summary>
        /// <param name="loteCfds">Está posicionado en el cfd que se requiere</param>
        public void ensamblaCfd(vwCfdTransaccionesDeVenta loteCfds)
        {
            try
            {
                iErr     = 0;
                sMsj     = string.Empty;
                _rutaXml = loteCfds.RutaXml;
                _modeloDte.idPersonaRecibe = loteCfds.IdClienteRepLegal;        //persona que recibe facturas por parte del cliente

                //Obtiene objeto Dte
                _modeloDte.DeSerializa(loteCfds.ComprobanteXml);

                //Crea y firma nodo ted
                _modeloDte.ensamblaTed(ts);

                //Canonicaliza documento original
                _modeloDte.Canonicaliza(loteCfds.ComprobanteXml, ts);

                //firma al enviar
                _modeloDte.firma(_modeloDte.dteDoc.ID);

                _modeloDte.VerificaFirma();

                iErr = _modeloDte.iErr;
                sMsj = _modeloDte.sMsj;

                //Validar el esquema del archivo xml
                ValidadorXML validadorxml = new ValidadorXML(_Param.URLArchivoXSD);
                if (iErr == 0)
                {
                    iErr = validadorxml.iErr;
                    sMsj = validadorxml.sMsj;
                }

                if (iErr == 0)
                {
                    validadorxml.ValidarXSD(_modeloDte.xDocXml);
                    iErr = validadorxml.iErr;
                    sMsj = validadorxml.sMsj;
                }

                //Otras validaciones
                //if (iErr==0)
                //    validaClientesEspeciales(_modeloDte.xDocXml);
            }
            catch (Exception ex)
            {
                sMsj = "Excepción al ensamblar factura. " + ex.Message + " [CFDComprobanteFiscalDigital.ensamblaCfd] " + _modeloDte.sMsj;
                iErr++;
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Guarda el archivo xml.
        /// </summary>
        /// <param name="trxVenta">Lista de facturas cuyo índice apunta a la factura que se va procesar.</param>
        /// <param name="comprobante">Documento xml firmado por la sunat</param>
        /// <param name="nombreArchivo">nombre de archivo (opcional)</param>
        /// <param name="tipoDoc">Tipo de documento</param>
        /// <param name="accion">Acción ejecutada por el usuario</param>
        /// <param name="esBinario">Es archivo binario o texto?</param>
        /// <param name="extension">.xml .pdf ...</param>
        public async Task <string> GuardaArchivoAsync(vwCfdTransaccionesDeVenta trxVenta, String comprobante, String nombreArchivo, string extension, bool esBinario)
        {
            string rutaYNomArchivoCfdi = string.Empty;

            try
            {
                rutaYNomArchivoCfdi = Path.Combine(trxVenta.RutaXml.Trim(), nombreArchivo + extension);

                if (esBinario)
                {
                    byte[] data = Convert.FromBase64String(comprobante);
                    using (FileStream SourceStream = File.Open(rutaYNomArchivoCfdi, FileMode.OpenOrCreate))
                    {
                        SourceStream.Seek(0, SeekOrigin.End);
                        await SourceStream.WriteAsync(data, 0, data.Length);
                    }
                }
                else
                {
                    using (StreamWriter outputFile = new StreamWriter(rutaYNomArchivoCfdi))
                    {
                        await outputFile.WriteAsync(comprobante);
                    }
                }
                return(rutaYNomArchivoCfdi);
            }
            catch (DirectoryNotFoundException)
            {
                string smsj = "Verifique la existencia de la carpeta indicada en la configuración de Ruta de archivos Xml de GP. La ruta de la carpeta no existe: " + rutaYNomArchivoCfdi;
                throw new DirectoryNotFoundException(smsj);
            }
            catch (IOException)
            {
                string smsj = "Verifique permisos de escritura en la carpeta: " + rutaYNomArchivoCfdi + ". No se pudo guardar el archivo xml.";
                throw new IOException(smsj);
            }
            catch (Exception eAFE)
            {
                string smsj;
                if (eAFE.Message.Contains("denied"))
                {
                    smsj = "Elimine el archivo xml antes de volver a generar uno nuevo. Luego vuelva a intentar. " + eAFE.Message;
                }
                else
                {
                    smsj = "Contacte a su administrador. No se pudo guardar el archivo XML. " + eAFE.Message + Environment.NewLine + eAFE.StackTrace;
                }
                throw new IOException(smsj);
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Guarda el archivo xml.
        /// </summary>
        /// <param name="trxVenta">Lista de facturas cuyo índice apunta a la factura que se va procesar.</param>
        /// <param name="comprobante">Documento xml firmado por la sunat</param>
        /// <param name="nombreArchivo">nombre de archivo (opcional)</param>
        /// <param name="tipoDoc">Tipo de documento</param>
        /// <param name="accion">Acción ejecutada por el usuario</param>
        public string GuardaArchivo(vwCfdTransaccionesDeVenta trxVenta, String comprobante, String nombreArchivo, String tipoDoc, String accion)
        {
            try
            {   //arma el nombre del archivo xml
                string nomArchivo          = string.IsNullOrEmpty(nombreArchivo) ? Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20) : nombreArchivo;
                string rutaYNomArchivoCfdi = string.Concat(trxVenta.RutaXml.Trim(), nomArchivo, "_", accion.Substring(0, 2), ".xml");

                //Guarda el archivo xml
                if ((tipoDoc.Equals("FACTURA") && accion.Equals("EMITE XML Y PDF")) ||
                    (tipoDoc.Equals("RESUMEN") && accion.Equals("ENVIA RESUMEN")) ||
                    (tipoDoc.Equals("FACTURA") && accion.Equals("DAR DE BAJA")) ||
                    accion.Equals("CONSULTA CDR")
                    )
                {
                    if (!string.IsNullOrEmpty(comprobante))
                    {
                        File.WriteAllText(rutaYNomArchivoCfdi, comprobante);
                    }
                    else
                    {
                        throw new ArgumentException("No se puede guardar el archivo xml " + nomArchivo + " porque está vacío.");
                    }
                }
                return(rutaYNomArchivoCfdi);
            }
            catch (DirectoryNotFoundException)
            {
                string smsj = "Verifique la existencia de la carpeta indicada en la configuración de Ruta de archivos Xml de GP. La ruta de la carpeta no existe: " + trxVenta.RutaXml;
                throw new DirectoryNotFoundException(smsj);
            }
            catch (IOException)
            {
                string smsj = "Verifique permisos de escritura en la carpeta: " + trxVenta.RutaXml + ". No se pudo guardar el archivo xml.";
                throw new IOException(smsj);
            }
            catch (Exception eAFE)
            {
                string smsj;
                if (eAFE.Message.Contains("denied"))
                {
                    smsj = "Elimine el archivo xml antes de volver a generar uno nuevo. Luego vuelva a intentar. " + eAFE.Message;
                }
                else
                {
                    smsj = "Contacte a su administrador. No se pudo guardar el archivo XML. " + eAFE.Message + Environment.NewLine + eAFE.StackTrace;
                }
                throw new Exception(smsj);
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 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 firmado por la sunat</param>
        /// <param name="mEstados">Nuevo set de estados</param>
        /// <param name="ticket"></param>
        /// <param name="tipoDoc"></param>
        /// <param name="accion"></param>
        /// <param name="eBinarioOK"></param>
        public void LogDocumento(vwCfdTransaccionesDeVenta trxVenta, String comprobante, ReglasME mEstados, String ticket, String tipoDoc, String accion, bool eBinarioOK, String rutaYNomArchivoCfdi)
        {
            try
            {
                String statusBase;
                String msjBinActual;
                String eBinario = !eBinarioOK ? mEstados.eBinActualConError : mEstados.eBinarioNuevo;
                switch (accion)
                {
                case "DAR DE BAJA":
                    statusBase   = "publicado";
                    msjBinActual = "Baja solicitada el " + DateTime.Today.ToString();
                    break;

                case "CONSULTA CDR":
                    if (tipoDoc.Equals("FACTURA"))
                    {
                        statusBase = !eBinarioOK ? "rechazo_sunat" : "anulado";
                    }
                    else
                    {
                        statusBase = !eBinarioOK ? "rechazo_sunat" : "acepta_sunat";
                    }

                    msjBinActual = comprobante;
                    break;

                default:
                    statusBase   = "emitido";
                    msjBinActual = mEstados.EnLetras(eBinario, tipoDoc);
                    break;
                }

                //Registra log de la emisión del xml antes de imprimir el pdf, sino habrá error al imprimir
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNomArchivoCfdi, ticket, _Conexion.Usuario, comprobante.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"ISO-8859-1\"", ""),
                                        statusBase, eBinario, msjBinActual);
            }
            catch (Exception eAFE)
            {
                string smsj = "Contacte al administrador. No se pudo registrar el estado del documento en la bitácora. " + eAFE.Message + Environment.NewLine + eAFE.StackTrace;
                throw new Exception(smsj);
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Genera el código de barras bidimensional y guarda el archivo pdf.
        /// Luego anota en la bitácora la factura impresa y el nuevo estado binario
        /// 23/11/16 jcf Genera código qr sólo si parámetro emite=1
        /// </summary>
        /// <param name="trxVenta"></param>
        /// <param name="eBase"></param>
        /// <param name="eBinario"></param>
        /// <param name="enLetras"></param>
        /// <returns></returns>
        public bool AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, string eBase, string eBinario, string enLetras)
        {
            ultimoMensaje   = "";
            numMensajeError = 0;

            try
            {
                string nomArchivo      = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
                string rutaYNomArchivo = trxVenta.RutaXml.Trim() + nomArchivo;

                //Genera y guarda código de barras bidimensional
                if (_Param.emite)
                {
                    codigobb.GenerarQRBidimensional("?re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente + "&tt=" + trxVenta.Total.ToString() +
                                                    "&id=" + trxVenta.UUID, trxVenta.RutaXml.Trim() + "cbb\\" + nomArchivo + ".jpg");
                }

                //Genera pdf
                if (codigobb.iErr == 0)
                {
                    reporte.generaEnFormatoPDF(rutaYNomArchivo, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);
                }

                numMensajeError = reporte.numErr + codigobb.iErr;
                ultimoMensaje   = reporte.mensajeErr + codigobb.strMensajeErr;

                if (reporte.numErr == 0 && codigobb.iErr == 0)
                {
                    RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Almacenado en " + rutaYNomArchivo, "0",
                                            _Conexion.Usuario, "", eBase, eBinario, enLetras);
                }

                return(ultimoMensaje.Equals(string.Empty));
            }
            catch (Exception eAFE)
            {
                ultimoMensaje = "Contacte a su administrador. No se pudo guardar el archivo PDF ni registrar la Bitácora. [AlmacenaEnRepositorio()] " + eAFE.Message;
                numMensajeError++;
                return(false);
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Ejecuta la generación de archivos xml y pdf en un thread independiente
        /// </summary>
        /// <param name="e">trxVentas</param>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            try
            {
                String msj = String.Empty;
                ReportProgress(0, "Iniciando proceso...\r\n");
                object[] args = e.Argument as object[];
                vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0];
                trxVenta.Rewind();                                                          //move to first record

                int errores = 0; int i = 1;
                //string antiguoIdCertificado = "";
                XmlDocument sello = new XmlDocument();
                //TecnicaDeEncriptacion criptografo = null;
                XmlDocument          comprobante = new XmlDocument();
                XmlDocumentFragment  addenda;
                cfdReglasFacturaXml  DocVenta     = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas
                ReglasME             maquina      = new ReglasME(_Param);
                ValidadorXML         validadorxml = new ValidadorXML(_Param);
                TransformerXML       loader       = new TransformerXML();
                XslCompiledTransform xslCompilado = loader.Load(_Param.URLArchivoXSLT);
                //PAC representanteSat = new PAC(trxVenta.Ruta_clavePac, trxVenta.Contrasenia_clavePac, _Param);
                String Sello = string.Empty;

                do
                {
                    msj = String.Empty;
                    try
                    {
                        if (CancellationPending)
                        {
                            e.Cancel = true; return;
                        }

                        if (trxVenta.Estado.Equals("no emitido") &&
                            maquina.ValidaTransicion(_Param.tipoDoc, "EMITE XML Y PDF", trxVenta.EstadoActual, "emitido/impreso"))
                        {
                            if (trxVenta.Voidstts == 0)  //documento no anulado
                            {
                                //Cargar los datos del certificado por cada nuevo Id de certificado asociado al documento de venta
                                //if (!trxVenta.ID_Certificado.Equals(antiguoIdCertificado))
                                //{
                                //    //criptografo = new TecnicaDeEncriptacion(trxVenta.Ruta_clave, trxVenta.Contrasenia_clave, trxVenta.Ruta_certificado.Trim(), trxVenta.Ruta_certificado.Replace(".cer", ".pem").Trim());
                                //    antiguoIdCertificado = trxVenta.ID_Certificado;
                                //}
                                trxVenta.ArmarDocElectronico();

                                ////////////////////////////////////////////////////////////////////////////
                                //comprobante.LoadXml(trxVenta.ComprobanteXml);
                                //comprobante.DocumentElement.SetAttribute("NoCertificado", criptografo.noCertificado);

                                loader.getCadenaOriginal(comprobante, xslCompilado);    //Obtener cadena original del CFD
                                //Sello = criptografo.obtieneSello(loader.cadenaOriginal);//Crear el archivo xml y sellarlo
                                comprobante.DocumentElement.SetAttribute("Sello", Sello);
                                //comprobante.DocumentElement.SetAttribute("Certificado", criptografo.certificadoFormatoPem);

                                if (!_Conex.IntegratedSecurity)                         //para testeo:
                                {
                                    comprobante.Save(new XmlTextWriter(trxVenta.Sopnumbe.Trim() + "tst.xml", Encoding.UTF8));
                                }

                                validadorxml.ValidarXSD(comprobante);                   //Validar el esquema del archivo xml
                                //representanteSat.comprobanteFiscal = comprobante;
                                //representanteSat.timbraCFD();                           //agregar sello al comprobante

                                //Agregar el nodo addenda si existe
                                if (trxVenta.Addenda != null && trxVenta.Addenda.Length > 0)
                                {
                                    addenda          = comprobante.CreateDocumentFragment();
                                    addenda.InnerXml = trxVenta.Addenda;
                                    comprobante.DocumentElement.AppendChild(addenda);
                                }

                                //Guarda el archivo xml, genera el cbb y el pdf.
                                //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf.
                                //DocVenta.AlmacenaEnRepositorio(trxVenta, comprobante.InnerXml, maquina, String.Empty, Sello);

                                //CodigoDeBarras cbb = new CodigoDeBarras();
                                //cbb.GenerarQRBidimensional(_Param.URLConsulta + "?&id=AABBCCDDEEFFGGHHIIOOPPQQRRSSTTUU&re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente.Trim() + "&tt=" + trxVenta.Total.ToString() + "&fe=QWERTYU8"
                                //                        , trxVenta.RutaXml.Trim() + "cbb\\cbbtest.jpg");
                            }
                            else //si el documento está anulado en gp, agregar al log como emitido
                            {
                                maquina.ValidaTransicion("FACTURA", "ANULA VENTA", trxVenta.EstadoActual, "emitido");
                                msj = "Anulado en GP y marcado como emitido.";
                                DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "",
                                                                 "emitido", maquina.eBinarioNuevo, msj.Trim());
                            }
                        }
                    }
                    catch (Exception lo)
                    {
                        string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString();
                        msj = lo.Message + " " + imsj + Environment.NewLine + comprobante.InnerXml; //lo.StackTrace;
                        errores++;
                    }
                    finally
                    {
                        ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine);
                        i++;
                    }
                } while (trxVenta.MoveNext() && errores < 10);
            }
            catch (Exception xw)
            {
                string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString();
                this.ultimoMensaje = xw.Message + " " + imsj + "\r\n" + xw.StackTrace;
            }
            finally
            {
                ReportProgress(100, ultimoMensaje);
            }
            e.Result = "Proceso finalizado! \r\n ";
            ReportProgress(100, "");
        }
        /// <summary>
        /// Ensambla y firma una lista de envíos dte a partir de un lote de facturas. Un envío por factura.
        /// _lContenedores: Lista de envios Dte
        /// </summary>
        /// <param name="loteCfds">Lote de documentos a procesar</param>
        public void ensamblaFacturas(vwCfdTransaccionesDeVenta loteCfds)
        {
            try
            {
                OnProgreso(1, "Iniciando...");                              //Notifica al suscriptor

                loteCfds.Rewind();                                          //move to first record

                sMsj = string.Empty;
                iErr = 0;
                int iMaxErr = 0;
                CFDComprobanteFiscalDigital cfd;
                XmlDocument autorizacion = new XmlDocument();
                autorizacion.PreserveWhitespace = true;
                string rutaCertsAnterior = string.Empty;
                String docXmlLog         = String.Empty;
                do
                {
                    try
                    {
                        //Obtiene la llave de timbrado por cada nuevo Id de documento de venta
                        if (iErr == 0 && _certificados.firma == 1 && !loteCfds.RutaCerts.Equals(rutaCertsAnterior))
                        {
                            autorizacion.Load(loteCfds.RutaCerts);
                            rutaCertsAnterior = loteCfds.RutaCerts;
                        }

                        cfd       = preparaDte(loteCfds, autorizacion);
                        docXmlLog = cfd.modeloDte.xDocXml.ToString();
                        if (iErr == 0)
                        {
                            preparaContenedor(cfd);
                            docXmlLog = _modeloEnvio.xDocXml.ToString();
                        }
                    }
                    catch (Exception errFactura)
                    {
                        if (loteCfds.RutaCerts.Trim().Equals("_noexiste"))
                        {
                            sMsj = "El Id de la factura no está configurado en la tabla de folios o no tiene más folios para emitir. [CFDComprobanteFiscalDigitalFabrica.ensamblaFacturas]";
                        }
                        else
                        {
                            String noExisteTipo = string.Empty;
                            if (loteCfds.Doctype.Equals(string.Empty))
                            {
                                noExisteTipo = "No tiene asociado el tipo de documento de localización. ";
                            }
                            sMsj = noExisteTipo + errFactura.Message + " [CFDComprobanteFiscalDigitalFabrica.ensamblaFacturas] ";
                        }
                        iErr++;
                    }

                    OnProgreso(100 / loteCfds.RowCount, "Doc: " + loteCfds.Sopnumbe + " " + sMsj, docXmlLog);

                    if (iErr > 0)
                    {
                        iMaxErr++;
                    }
                    sMsj = string.Empty;
                    iErr = 0;
                } while (loteCfds.MoveNext() && iMaxErr < 10);

                OnProgreso(100, _lContenedores.Count().ToString() + " comprobante(s) para enviar al SII. ");
                OnProgreso(100, "...");
            }
            catch (Exception errorGral)
            {
                sMsj = "Excepción desconocida al inicializar el ensamble de facturas. " + errorGral.Message + " [CFDComprobanteFiscalDigitalFabrica.ensamblaFacturas] ";
                iErr++;
                OnProgreso(0, sMsj);
            }
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Filtra la lista de transacciones de venta
        /// </summary>
        /// <param name="filtroFecha"></param>
        /// <param name="desdeF"></param>
        /// <param name="hastaF"></param>
        /// <param name="deFDefault"></param>
        /// <param name="aFDefault"></param>
        /// <param name="filtroNumDoc"></param>
        /// <param name="numDocDe"></param>
        /// <param name="numDocA"></param>
        /// <param name="filtroIdDoc"></param>
        /// <param name="idDoc"></param>
        /// <param name="filtroEstado"></param>
        /// <param name="estado"></param>
        /// <param name="filtroCliente"></param>
        /// <param name="cliente"></param>
        /// <param name="trxVenta"></param>
        public void AplicaFiltroAFacturas(bool filtroFecha, DateTime desdeF, DateTime hastaF, DateTime deFDefault, DateTime aFDefault,
                                          bool filtroNumDoc, string numDocDe, string numDocA,
                                          bool filtroIdDoc, string idDoc,
                                          bool filtroEstado, string estado,
                                          bool filtroCliente, string cliente,
                                          out vwCfdTransaccionesDeVenta trxVenta)
        {
            trxVenta = new vwCfdTransaccionesDeVenta(_Conexion.ConnStr);
            trxVenta.Query.AddOrderBy(vwCfdTransaccionesDeVenta.ColumnNames.Sopnumbe, WhereParameter.Dir.ASC);

            DateTime desdeFecha = new DateTime(deFDefault.Year, deFDefault.Month, deFDefault.Day, 0, 0, 0);
            DateTime hastaFecha = new DateTime(aFDefault.Year, aFDefault.Month, aFDefault.Day, 23, 59, 59);

            if (filtroFecha)
            {
                //Filtro personalizado
                desdeFecha = new DateTime(desdeF.Year, desdeF.Month, desdeF.Day, 0, 0, 0);;
                hastaFecha = new DateTime(hastaF.Year, hastaF.Month, hastaF.Day, 23, 59, 59);
                //desdeFecha = desdeF;
                //hastaFecha = hastaF;
            }
            if ((!filtroNumDoc && !filtroIdDoc && !filtroEstado && !filtroCliente) || filtroFecha)
            {   //Filtra los documentos por fecha. De forma predeterminada es la fecha de hoy.
                trxVenta.Where.Fechahora.BetweenBeginValue = desdeFecha;
                trxVenta.Where.Fechahora.BetweenEndValue   = hastaFecha;
                trxVenta.Where.Fechahora.Operator          = WhereParameter.Operand.Between;
            }
            if (filtroNumDoc)
            {
                trxVenta.Where.Sopnumbe.BetweenBeginValue = numDocDe.Trim();
                trxVenta.Where.Sopnumbe.BetweenEndValue   = numDocA.Trim();
                trxVenta.Where.Sopnumbe.Operator          = WhereParameter.Operand.Between;
            }
            if (filtroIdDoc)
            {
                trxVenta.Where.Docid.Value    = idDoc.Trim();
                trxVenta.Where.Docid.Operator = WhereParameter.Operand.Equal;
            }
            if (filtroEstado)
            {
                trxVenta.Where.Estado.Value    = estado;
                trxVenta.Where.Estado.Operator = WhereParameter.Operand.Equal;
            }
            if (filtroCliente)
            {
                trxVenta.Where.NombreCliente.Value    = "%" + cliente + "%";
                trxVenta.Where.NombreCliente.Operator = WhereParameter.Operand.Like;
            }
            try
            {
                if (!trxVenta.Query.Load())
                {
                    ultimoMensaje = "No hay datos para el filtro seleccionado.";
                    numMensajeError++;
                }
            }
            catch (Exception eFiltro)
            {
                ultimoMensaje = "Contacte al administrador. No se pudo consultar la base de datos. [cfdReglasFacturaXml.AplicaFiltroAFacturas]" + eFiltro.Message;
                numMensajeError++;
            }
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Guarda el archivo xml, lo comprime en zip y anota en la bitácora la factura emitida y el nuevo estado binario.
        /// Luego genera y guarda el código de barras bidimensional y pdf. En caso de error, anota en la bitácora.
        /// </summary>
        /// <param name="trxVenta">Lista de facturas cuyo índice apunta a la factura que se va procesar.</param>
        /// <param name="comprobante">Documento xml firmado por la sunat</param>
        /// <param name="mEstados">Nuevo set de estados</param>
        /// <param name="tramaXmlFirmado">trama del xml firmado por la sunat en base 64</param>
        /// <param name="tramaZipCdr">trama zipeada del cdr enviado por la sunat</param>
        public void AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, String comprobante, ReglasME mEstados, String tramaXmlFirmado, String tramaZipCdr, String ticket, String nomArchivoCDR,
                                          String tipoDoc, String accion, bool eBinarioOK)
        {
            try
            {   //arma el nombre del archivo xml
                string nomArchivo          = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
                string rutaYNomArchivoCfdi = string.Concat(trxVenta.RutaXml.Trim(), nomArchivo, "_", accion.Substring(0, 2), ".xml");
                string rutaYNomArchivoCdr  = trxVenta.RutaXml.Trim() + @"CDR\" + nomArchivoCDR;

                //Guarda el archivo xml
                if ((tipoDoc.Equals("FACTURA") && accion.Equals("EMITE XML Y PDF")) ||
                    (tipoDoc.Equals("RESUMEN") && accion.Equals("ENVIA RESUMEN")) ||
                    (tipoDoc.Equals("FACTURA") && accion.Equals("DAR DE BAJA"))
                    )
                {
                    if (!string.IsNullOrEmpty(tramaXmlFirmado))
                    {
                        File.WriteAllBytes($"{rutaYNomArchivoCfdi}", Convert.FromBase64String(tramaXmlFirmado));
                    }
                    else
                    {
                        throw new ArgumentException("No se puede guardar el archivo xml " + nomArchivo + " porque está vacío.");
                    }
                }

                //Guarda el CDR
                if (tipoDoc.Equals("FACTURA") && //accion.Equals("EMITE XML Y PDF") ||
                    accion.Equals("CONSULTA CDR")
                    )
                {
                    if (!string.IsNullOrEmpty(tramaZipCdr))
                    {
                        File.WriteAllBytes($"{rutaYNomArchivoCdr}", Convert.FromBase64String(tramaZipCdr));
                    }
                    else
                    {
                        throw new ArgumentException("No se puede guardar el archivo cdr de la SUNAT porque está vacío.");
                    }
                }

                String status;
                String msjBinActual;
                String eBinario = !eBinarioOK ? mEstados.eBinActualConError : mEstados.eBinarioNuevo;
                switch (accion)
                {
                case "DAR DE BAJA":
                    status       = "publicado";
                    msjBinActual = "Baja solicitada el " + DateTime.Today.ToString();
                    break;

                case "CONSULTA CDR":
                    if (tipoDoc.Equals("FACTURA"))
                    {
                        status = !eBinarioOK ? "rechazo_sunat" : "anulado";
                    }
                    else
                    {
                        status = !eBinarioOK ? "rechazo_sunat" : "acepta_sunat";
                    }

                    msjBinActual        = comprobante;
                    rutaYNomArchivoCfdi = rutaYNomArchivoCdr;
                    break;

                default:
                    status       = "emitido";
                    msjBinActual = mEstados.EnLetras(eBinario, tipoDoc);
                    break;
                }

                //Registra log de la emisión del xml antes de imprimir el pdf, sino habrá error al imprimir
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNomArchivoCfdi, ticket, _Conexion.Usuario, comprobante.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"ISO-8859-1\"", ""),
                                        status, eBinario, msjBinActual);

                //Genera pdf
                //if (tipoDoc.Equals("FACTURA") && accion.Equals("EMITE XML Y PDF"))
                //   reporte.generaEnFormatoPDF(rutaYNomArchivoCfdi, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);
            }
            catch (DirectoryNotFoundException)
            {
                string smsj = "Verifique en GP la existencia de la carpeta indicada en la configuración de Ruta de archivos Xml. La ruta de la carpeta no pudo ser encontrada: " + trxVenta.RutaXml;
                throw new DirectoryNotFoundException(smsj);
            }
            catch (IOException)
            {
                string smsj = "Verifique permisos de escritura en la carpeta: " + trxVenta.RutaXml + ". No se pudo guardar el archivo xml ni registrar el documento en la bitácora. ";
                throw new IOException(smsj);
            }
            catch (Exception eAFE)
            {
                string smsj;
                if (eAFE.Message.Contains("denied"))
                {
                    smsj = "Elimine el archivo xml antes de volver a generar uno nuevo. Luego vuelva a intentar. " + eAFE.Message;
                }
                else
                {
                    smsj = "Contacte a su administrador. No se pudo guardar el archivo XML ni registrar la Bitácora. " + eAFE.Message + Environment.NewLine + eAFE.StackTrace;
                }
                throw new Exception(smsj);
            }
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Guarda el archivo xml, lo comprime en zip y anota en la bitácora la factura emitida y el nuevo estado binario.
        /// Luego genera y guarda el código de barras bidimensional y pdf. En caso de error, anota en la bitácora.
        /// </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>
        /// <param name="uuid">uuid generado por el PAC</param>
        /// <returns>False cuando hay al menos un error</returns>
        public bool AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, XmlDocument comprobante, ReglasME mEstados, String uuid)
        {
            ultimoMensaje   = "";
            numMensajeError = 0;
            try
            {   //arma el nombre del archivo xml
                string nomArchivo      = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
                string rutaYNomArchivo = trxVenta.RutaXml.Trim() + nomArchivo;

                //Guarda el archivo xml
                comprobante.Save(new XmlTextWriter(rutaYNomArchivo + ".xml", Encoding.UTF8));

                //Registra log de la emisión del xml antes de imprimir el pdf, sino habrá error al imprimir
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Almacenado en " + rutaYNomArchivo, "0", _Conexion.Usuario, comprobante.InnerXml,
                                        "emitido", mEstados.eBinarioNuevo, mEstados.EnLetras(mEstados.eBinarioNuevo));

                if (numMensajeError == 0)
                {
                    //Genera y guarda código de barras bidimensional
                    codigobb.GenerarQRBidimensional("?re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente + "&tt=" + trxVenta.Total.ToString() +
                                                    "&id=" + uuid.Trim(), trxVenta.RutaXml.Trim() + "cbb\\" + nomArchivo + ".jpg");
                    //Genera pdf
                    if (codigobb.iErr == 0)
                    {
                        reporte.generaEnFormatoPDF(rutaYNomArchivo, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);
                    }

                    //Comprime el archivo xml
                    if (_Param.zip)
                    {
                        Utiles.Zip(rutaYNomArchivo, ".xml");
                    }

                    numMensajeError = codigobb.iErr + reporte.numErr + Utiles.numErr;
                    ultimoMensaje   = codigobb.strMensajeErr + " " + reporte.mensajeErr + " " + Utiles.msgErr;

                    //Si hay error en cbb o pdf o zip anota en la bitácora
                    if (numMensajeError != 0)
                    {
                        ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conexion.Usuario,
                                                "emitido", "emitido", mEstados.eBinActualConError,
                                                mEstados.EnLetras(mEstados.eBinActualConError) + ultimoMensaje.Trim());
                    }
                }
                return(numMensajeError == 0);
            }
            catch (DirectoryNotFoundException)
            {
                ultimoMensaje = "Verifique la existencia de la ruta indicada en la configuración de Ruta de archivos Xml. La ruta no pudo ser encontrada: " + trxVenta.RutaXml;
                numMensajeError++;
                return(false);
            }
            catch (IOException)
            {
                ultimoMensaje = "Verifique permisos de escritura en: " + trxVenta.RutaXml + ". No se pudo guardar el archivo xml ni registrar el documento en la bitácora. ";
                numMensajeError++;
                return(false);
            }
            catch (Exception eAFE)
            {
                if (eAFE.Message.Contains("denied"))
                {
                    ultimoMensaje = "Elimine el archivo xml antes de volver a generar uno nuevo. Luego vuelva a intentar. " + eAFE.Message;
                }
                else
                {
                    ultimoMensaje = "Contacte a su administrador. No se pudo guardar el archivo XML ni registrar la Bitácora. " + eAFE.Message;
                }
                numMensajeError++;
                return(false);
            }
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Guarda el archivo xml, lo comprime en zip y anota en la bitácora la factura emitida y el nuevo estado binario.
        /// Luego genera y guarda el código de barras bidimensional y pdf. En caso de error, anota en la bitácora.
        /// </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>
        /// <param name="uuid">uuid generado por el PAC</param>
        /// <returns>False cuando hay al menos un error</returns>
        public void AlmacenaEnRepositorio(vwCfdTransaccionesDeVenta trxVenta, XmlDocument comprobante, ReglasME mEstados, String uuid, String sello)
        {
            ultimoMensaje   = "";
            numMensajeError = 0;
            try
            {   //arma el nombre del archivo xml
                string nomArchivo      = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20);
                string rutaYNomArchivo = trxVenta.RutaXml.Trim() + nomArchivo;

                //Guarda el archivo xml
                comprobante.Save(new XmlTextWriter(rutaYNomArchivo + ".xml", Encoding.UTF8));

                //Registra log de la emisión del xml antes de imprimir el pdf, sino habrá error al imprimir
                RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNomArchivo, "0", _Conexion.Usuario, comprobante.InnerXml,
                                        "emitido", mEstados.eBinarioNuevo, mEstados.EnLetras(mEstados.eBinarioNuevo));

                RegistraLogDePagosSimultaneos(trxVenta.Soptype, trxVenta.Sopnumbe, mEstados.eBinarioNuevo, mEstados.EnLetras(mEstados.eBinarioNuevo), mEstados.eBinActualConError, mEstados.EnLetras(mEstados.eBinActualConError));

                //Genera y guarda código de barras bidimensional
                codigobb.GeneraCodigoDeBarras(string.Empty,
                                              _Param.URLConsulta + "?&id=" + uuid.Trim() + "&re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente.Trim() + "&tt=" + Math.Abs(trxVenta.Total).ToString() + "&fe=" + Utiles.Derecha(sello, 8)
                                              , trxVenta.RutaXml.Trim() + "cbb\\" + nomArchivo + ".jpg");
                //Genera pdf
                reporte.generaEnFormatoPDF(rutaYNomArchivo, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.EstadoContabilizado);

                //Comprime el archivo xml
                if (_Param.zip)
                {
                    Utiles.Zip(rutaYNomArchivo, ".xml");
                }

                numMensajeError = reporte.numErr + Utiles.numErr;
                ultimoMensaje   = reporte.mensajeErr + " " + Utiles.msgErr;

                //Si hay error en pdf o zip anota en la bitácora
                if (numMensajeError != 0)
                {
                    ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conexion.Usuario, "emitido", "emitido", mEstados.eBinActualConError,
                                            mEstados.EnLetras(mEstados.eBinActualConError) + ultimoMensaje.Trim());
                }
            }
            catch (DirectoryNotFoundException dn)
            {
                ultimoMensaje = "Verifique la existencia de la ruta: " + trxVenta.RutaXml;
                throw new DirectoryNotFoundException(ultimoMensaje, dn);
            }
            catch (IOException ioe)
            {
                ultimoMensaje = "Verifique permisos de escritura en: " + trxVenta.RutaXml + ". No se pudo guardar el archivo xml ni registrar el documento en la bitácora. ";
                throw new IOException(ultimoMensaje, ioe);
            }
            catch (Exception eAFE)
            {
                if (eAFE.Message.Contains("denied"))
                {
                    ultimoMensaje = "Elimine el archivo xml antes de volver a generar uno nuevo. Luego vuelva a intentar. " + eAFE.Message;
                }
                else
                {
                    ultimoMensaje = "Contacte al administrador. No se pudo guardar el archivo XML y/o registrar la Bitácora. " + eAFE.Message;
                }
                throw new Exception(ultimoMensaje, eAFE);
            }

            if (numMensajeError != 0)
            {
                throw new ArgumentNullException(ultimoMensaje);
            }
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Ejecuta la generación de pdfs en un thread independiente
        /// </summary>
        /// <param name="e">trxVentas</param>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            string msj = "";

            try
            {
                ReportProgress(0, "Iniciando proceso...\r\n");
                object[] args = e.Argument as object[];
                vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0];
                int    i = 1; int errores = 0;
                string eBinario = "";
                string eBase = "";
                cfdReglasFacturaXml DocumentoEmitido = null;
                ReglasME            maquina          = new ReglasME(_Param);

                trxVenta.Rewind();                   //move to first record
                do
                {
                    _Param.PrefijoDefaultFactura = trxVenta.Sopnumbe.Substring(_Param.PosicionPrefijoFactura, 1);
                    DocumentoEmitido             = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas
                    if (CancellationPending)
                    {
                        e.Cancel = true; return;
                    }
                    msj = "";
                    if (maquina.ValidaTransicion(_Param.tipoDoc, "IMPRIME PDF", trxVenta.EstadoActual, "impreso"))
                    {
                        if (trxVenta.Voidstts == 0 && trxVenta.EstadoContabilizado.Equals("contabilizado"))  //no anulado y contabilizado
                        {
                            if (!_Param.emite && !maquina.impreso(trxVenta.EstadoActual))
                            {
                                eBase = "emitido";
                            }
                            else
                            {
                                eBase = "impreso";
                            }

                            //Si no emite y es primera impresión: guardar el archivo pdf y registrar el log: emitido
                            //sino: registrar el log impreso
                            if (DocumentoEmitido.AlmacenaEnRepositorio(trxVenta, eBase, maquina.eBinarioNuevo, maquina.EnLetras(maquina.eBinarioNuevo)))
                            {
                                eBinario = maquina.eBinarioNuevo;
                            }
                            else
                            {
                                eBinario = maquina.eBinActualConError;
                                errores++;
                            }

                            if (_Param.emite && !maquina.impreso(trxVenta.EstadoActual))
                            {
                                DocumentoEmitido.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido",
                                                                         eBinario, maquina.EnLetras(eBinario) + DocumentoEmitido.ultimoMensaje);
                            }
                        }
                        else
                        {
                            msj = "No se puede generar porque no está Contabilizado o está Anulado.";
                        }
                    }
                    ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + DocumentoEmitido.ultimoMensaje + maquina.ultimoMensaje + msj + "\r\n");
                    i++;
                } while (trxVenta.MoveNext() && errores < 10);
                e.Result = "Generación de Pdfs finalizado! \r\n";
                ReportProgress(100, "");
            }
            catch (Exception xw)
            {
                string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString();
                msj = xw.Message + " " + imsj + "\r\n" + xw.StackTrace;
            }
            finally
            {
                ReportProgress(100, msj);
            }
            e.Result = "Proceso finalizado! \r\n ";
            ReportProgress(100, "");
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Ejecuta la generación de archivos xml y pdf en un thread independiente
        /// </summary>
        /// <param name="e">trxVentas</param>
        protected override void OnDoWork(DoWorkEventArgs e)
        {
            ReportProgress(0, "Iniciando proceso...\r\n");
            object[] args = e.Argument as object[];
            vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0];

            trxVenta.Rewind();                                                          //move to first record
            int errores = 0; int i = 1;
            //string antiguoIdCertificado = "";
            XmlDocument           sello = new XmlDocument();
            TecnicaDeEncriptacion criptografo = null;
            XmlDocument           comprobante = new XmlDocument();
            //XmlDocumentFragment addenda;
            cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param);     //log de facturas xml emitidas y anuladas
            ReglasME            maquina = new ReglasME(_Param);
            //ValidadorXML validadorxml = new ValidadorXML(_Param);
            TransformerXML       loader = new TransformerXML();
            XslCompiledTransform xslCompilado = loader.Load(_Param.URLArchivoXSLT);

            //PAC representanteSat = new PAC(trxVenta.Ruta_clavePac, trxVenta.Contrasenia_clavePac, _Param);

            //ultimoMensaje = validadorxml.mensajeError;
            //if (validadorxml.numErrores != 0 || DocVenta.numMensajeError != 0 || loader.numErrores != 0)    // || representanteSat.numErr != 0)
            //{
            //    e.Result = validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + "\r\n";  // representanteSat.msjError+
            //    ReportProgress(100, validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + "\r\n");   //representanteSat.msjError +
            //    return;
            //}
            do
            {
                if (CancellationPending)
                {
                    e.Cancel = true; return;
                }

                if (trxVenta.Estado.Equals("no emitido") &&
                    maquina.ValidaTransicion(_Param.tipoDoc, "EMITE XML Y PDF", trxVenta.EstadoActual, "emitido/impreso"))
                {
                    if (trxVenta.Voidstts == 0)  //documento no anulado
                    {
                        //Cargar los datos del certificado por cada nuevo Id de certificado asociado al documento de venta
                        //if (!trxVenta.ID_Certificado.Equals(antiguoIdCertificado))
                        //{
                        //    criptografo = new TecnicaDeEncriptacion(trxVenta.Ruta_clave, trxVenta.Contrasenia_clave, trxVenta.Ruta_certificado.Trim(), trxVenta.Ruta_certificado.Replace(".cer", ".pem").Trim());
                        //    antiguoIdCertificado = trxVenta.ID_Certificado;
                        //}

                        comprobante.LoadXml(trxVenta.ComprobanteXml);
                        if (criptografo.numErrores == 0 &&
                            loader.getCadenaOriginal(comprobante, xslCompilado))    //Obtener cadena original del CFD
                        {                                                           //Crear el archivo xml y sellarlo
                            //comprobante.DocumentElement.SetAttribute("sello", criptografo.obtieneSello(loader.cadenaOriginal));
                            //comprobante.DocumentElement.SetAttribute("noCertificado", criptografo.noCertificado);
                            //comprobante.DocumentElement.SetAttribute("certificado", criptografo.certificadoFormatoPem);
//para testeo:
//                            comprobante.Save(new XmlTextWriter(@"D:\GPElectronicInvoice\feTowersMexTST\" + trxVenta.Sopnumbe + "tst.xml", Encoding.UTF8));
                        }

                        //if (loader.numErrores == 0 &&
                        //    criptografo.numErrores == 0 &&
                        //    validadorxml.ValidarXSD(comprobante))                   //Validar el esquema del archivo xml
                        //{
                        //representanteSat.comprobanteFiscal = comprobante;
                        //representanteSat.timbraCFD();                           //agregar sello al comprobante
                        //}
                        //else
                        //    errores++;

                        if (loader.numErrores == 0 &&
//                            validadorxml.numErrores == 0 &&
                            criptografo.numErrores == 0)    //&&
//                            representanteSat.numErr == 0)
                        {
                            //Agregar el nodo addenda si existe
                            //if (trxVenta.Addenda != null && trxVenta.Addenda.Length > 0)
                            //{
                            //    addenda = comprobante.CreateDocumentFragment();
                            //    addenda.InnerXml = trxVenta.Addenda;
                            //    comprobante.DocumentElement.AppendChild(addenda);

                            //    //comprobante.DocumentElement.SetAttribute("xmlns:del", "http://www.deloitte.com/CFD/Addenda/Receptor");
                            //    //XmlAttribute attr = comprobante.CreateAttribute("xsi", "schemaLocation", " ");
                            //    //attr.Value = "http://www.deloitte.com/CFD/Addenda/Receptor http://www.pegasotecnologia.com/secfd/schemas/Deloitte_recepcion.xsd";
                            //    //comprobante.Attributes.Append(attr);
                            //}

                            //Guarda el archivo xml, genera el cbb y el pdf.
                            //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf.
                            //if (!DocVenta.AlmacenaEnRepositorio(trxVenta, comprobante, maquina))
                            //    errores++;
                        }
                        else
                        {
                            errores++;
                        }
                        //this.ultimoMensaje = criptografo.ultimoMensaje + " " + validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " +
                        //            loader.mensajeError;    // +" " + representanteSat.msjError;
                    }
                    else //si el documento está anulado en gp, agregar al log como emitido
                    {
                        maquina.ValidaTransicion("FACTURA", "ANULA VENTA", trxVenta.EstadoActual, "emitido");
                        this.ultimoMensaje = "Anulado en GP y marcado como emitido.";
                        DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "",
                                                         "emitido", maquina.eBinarioNuevo, this.ultimoMensaje.Trim());
                    }
                }
                ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + this.ultimoMensaje.Trim() + "\r\n");
                i++;
            } while (trxVenta.MoveNext() && errores < 10);
            e.Result = "Generación de archivos finalizado! \r\n";
            ReportProgress(100, "");
        }