Ejemplo n.º 1
0
        /// <summary>
        /// Generacion de factura electronica
        /// </summary>
        /// <param name="iIdFactura"></param>
        /// <param name="sRutaArchivos"></param>
        /// <param name="sUsuario"></param>
        /// <param name="iIdCliente"></param>
        /// <param name="?"></param>
        /// <param name="sFolioFactura"></param>
        public int GenerarFacturaElectronica(int iIdFactura, string sRutaArchivos, string sUsuario,int iIdCliente,string sFolioFactura)
        {
            int iResultado = 0;
            //Datos de la factura
            MedNeg.Facturas.BlFacturas oblFactura = new BlFacturas();
            MedDAL.DAL.facturas oFactura = new MedDAL.DAL.facturas();

            //Datos de la factura
            oFactura = oblFactura.BuscarFactura(iIdFactura);            
            
            //Recuperar la partida de la factura
            List<MedDAL.DAL.facturas_partida> oQuery = new List<MedDAL.DAL.facturas_partida>();
            oQuery.AddRange(oblFactura.RecuperarPartidaFactura(oFactura.idFactura));
            decimal dSubtotal = 0;
            decimal dImpuestosTrasladados = 0;
            decimal dTotal = 0;

            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                dSubtotal += oDetalle.Cantidad * oDetalle.Precio;
                dImpuestosTrasladados += (decimal)oDetalle.Iva + (decimal)oDetalle.IEPS;
            }
            //Total
            dTotal = dSubtotal + dImpuestosTrasladados;

            DateTime dtFechaTest = DateTime.Now;
            string sNumeroCertificado = "";
            string sA, sB, sC;

            //Leer archivo de configuracion
            MedNeg.Configuracion.BlConfiguracion oblConfiguracion = new MedNeg.Configuracion.BlConfiguracion();
            MedDAL.Configuracion.DALConfiguracion odalConfiguracion = new MedDAL.Configuracion.DALConfiguracion();

            odalConfiguracion = (MedDAL.Configuracion.DALConfiguracion)oblConfiguracion.CargaDatos(sRutaArchivos+"/Configuracion.xml");
            
            //Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Certificados/aaa010101aaa_csd_06.cer", out sA, out sB, out sC, out sNumeroCertificado);
            Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Facturacion/"+odalConfiguracion.sRutaCertificado, out sA, out sB, out sC, out sNumeroCertificado);

            //Establecer el numero de cuenta
            string sNumeroCuenta = null;
            if (oFactura.metodo_pago.MetodoPago.Equals("depósito en cuenta", StringComparison.InvariantCultureIgnoreCase) ||
                oFactura.metodo_pago.MetodoPago.Equals("traspaso", StringComparison.InvariantCultureIgnoreCase))
            {
                sNumeroCuenta = oFactura.NumeroCuentaPago;
            }
            

            //Debo validar la vigencia del certificado con sa <= FechaEmision <= sB

            #region generarcomprobante

            //Construir objeto factura
            Comprobante.ComprobanteFiscalDigital oComprobanteFiscalDigital = new Comprobante.ComprobanteFiscalDigital(
                   "", //Serie 
                   sFolioFactura, //Folio 
                   dtFechaTest.ToString("yyyy-MM-ddThh:mm:ss"), //Fecha
                   oFactura.tipo_forma_pago.FormaPago, //FormaDePago
                   sNumeroCertificado, //NoCertificado
                   "",//"Condiciones de pago",
                   dSubtotal.ToString(), //SubTotal
                   "0",//Descuento
                   "",//Motivo del descuento
                   dTotal.ToString(), //Total
                   oFactura.metodo_pago.MetodoPago, //Metodo de pago
                   "Ingreso", //Tipo de comprobante
                   null, //noAprobacion
                   null, //anoAprobacion
                   "3.2", //version
                   null,//TipoCambio
                   null, //Moneda
                   odalConfiguracion.sEstado + "," + odalConfiguracion.sMunicipio, //LugarExpedicion
                   sNumeroCuenta //NumCtaPago
                   );

            //Pendiente la parte de pagos parciales

            //Empresa o razon social y direccion fiscal
            Comprobante.t_Emisor Emisor = new Comprobante.t_Emisor(
                odalConfiguracion.sRfc,
                    odalConfiguracion.sRazonSocial,
                    odalConfiguracion.sDomicilio, //Calle
                    "", //No exterior
                    "", //No interior
                    "", //Colonia
                    "", //Localidad
                    "",//Emisor Referencia
                    odalConfiguracion.sMunicipio,
                    odalConfiguracion.sEstado,
                    odalConfiguracion.sPais,
                    odalConfiguracion.sCodigoPostal
                );

            Emisor.addRegimenFiscal(odalConfiguracion.sRegimenFiscal);

            oComprobanteFiscalDigital.setEmisor(Emisor);

            //Establece la expedición de la factura, se toman lo datos del almacen
            MedDAL.DAL.usuarios oUsuario = new MedDAL.DAL.usuarios();
            MedNeg.Usuarios.BlUsuarios oblUsuario = new Usuarios.BlUsuarios();
            oUsuario = (MedDAL.DAL.usuarios)oblUsuario.Buscar(sUsuario);

            oComprobanteFiscalDigital.setExpedicion(
                    oUsuario.almacenes.Calle.ToString(),//Calle
                    oUsuario.almacenes.NumeroExt.ToString(),//NoExt
                    "", //NoInt
                    oUsuario.almacenes.colonias.Nombre, //Colonia
                    oUsuario.almacenes.poblaciones.Nombre.ToString(), //Población
                    "",//Emisor Referencia Expedicion
                    oUsuario.almacenes.municipios.Nombre.ToString(),//Municipio
                    oUsuario.almacenes.estados.Nombre.ToString(),//Estado
                    oUsuario.almacenes.Pais.ToString(),//Pais
                    oUsuario.almacenes.CodigoPostal.ToString());//CP

            //Establecer los datos del cliente
            MedDAL.DAL.clientes oCliente = new MedDAL.DAL.clientes();
            MedNeg.BlClientes.BlClientes oblClientes = new BlClientes.BlClientes();
            oCliente = oblClientes.BuscarCliente(iIdCliente);

            oComprobanteFiscalDigital.setReceptor(
                oCliente.Rfc.ToString(), //RFC
                oCliente.Nombre.ToString() + " " + oCliente.Apellidos.ToString(), //Nombre
                oCliente.Calle.ToString(), //Calle
                oCliente.NumeroExt.ToString(), //No ext
                oCliente.NumeroInt.ToString(),//No int
                oCliente.colonias.Nombre.ToString(),//Colo
                oCliente.poblaciones.Nombre.ToString(),//Ciudad
                "",//ReferenciaReceptor
                oCliente.municipios.Nombre.ToString(),//Municipio
                oCliente.estados.Nombre.ToString(),//Estado
                "Mexico",//Pais
                oCliente.CodigoPostal.ToString() //Codigo postal
                );


            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                string Cantidad, Codigo, Descripcion, Unidad, PrecioUnitario, Importe, ImporteNeto;
                
                decimal dImporte=0;
                Cantidad = oDetalle.Cantidad.ToString();
                //Codigo = oDetalle.productos.Clave1.ToString();
                //Descripcion = oDetalle.productos.Nombre.ToString();
                //0087 Identificar si es un producto o un ensamble
                if (oDetalle.idEnsamble.Equals(null))
                {
                    //Datos del producto
                    Codigo = oDetalle.productos.Clave1.ToString();
                }
                else
                {
                    //Datos del ensamble
                    Codigo = oDetalle.ensamble.ClaveBom.ToString();
                }
                
                Descripcion = oDetalle.Descripcion.ToString();
                Unidad = oDetalle.productos.UnidadMedida;
                PrecioUnitario = oDetalle.Precio.ToString();
                dImporte=oDetalle.Cantidad * oDetalle.Precio;
                Importe = dImporte.ToString();
                

                Comprobante.Concepto C = new Comprobante.Concepto(
                    Cantidad,
                    Unidad, 
                    Codigo, 
                    Descripcion, 
                    PrecioUnitario, 
                    Importe);
                oComprobanteFiscalDigital.addConcepto(C);//aqui agregas el elemento a la partida

            }



            #endregion

            //Commpruebo que sea válido
            if (oComprobanteFiscalDigital.Valido() == true)
            {
                string sCadenaOriginal = oComprobanteFiscalDigital.CadenaOriginal();
                oComprobanteFiscalDigital.Sellar(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaLlave.ToString(), sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado.ToString(), odalConfiguracion.sContraseña.ToString());
                oComprobanteFiscalDigital.XML().Save(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                //return a.XML();
                /*
                 * Modificaciones de POJO: 1 de Noviembre 2011 : Agregando el webservice para timbrado, guardaré los archivos en /Facturacion/Timbrados/
                 */
                FacturaService.TimbradoClient svcT = new FacturaService.TimbradoClient();
                FacturaService.RespuestaCFDi RespuestaCFDi = new FacturaService.RespuestaCFDi();
                
                //Aquí, cambiar la funcion a svcT.Timbrar cuando vayan a mostrarlo en producción, de otra manera, no serán válidos los cfdi's que emitan.
                try
                {
                    byte [] aArchivo = File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                    RespuestaCFDi = svcT.Timbrar("pojo", "a", aArchivo);                    
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml", RespuestaCFDi.Documento);
                    RespuestaCFDi = svcT.PDF("pojo", "a", File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml"), null);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".pdf", RespuestaCFDi.Documento);
                    return 0;
                }
                catch (System.Net.WebException ex)
                {
                    //Sale cuando no encuentra al server
                    return 1;
                }
                catch (System.Web.Services.Protocols.SoapHeaderException ex)
                {

                    return 3;
                }
                catch (Exception ex)
                {
                    //Para excepciones no conocidas
                    return 4;
                }
                /*
                 * Falta: Revisar errores con PAC (¿Cómo los regresas? ¿Qué pasa si algo está mal? ¿el xml fue correctamente construido?¿Una función nueva?)
                 */
            }
            else
            {
                //Sale cuando el certificado no es valido
                return 2;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Generacion de factura electronica
        /// </summary>
        /// <param name="iIdFactura"></param>
        /// <param name="sRutaArchivos"></param>
        /// <param name="sUsuario"></param>
        /// <param name="iIdCliente"></param>
        /// <param name="?"></param>
        /// <param name="sFolioFactura"></param>
        public int GenerarFacturaElectronica(int iIdFactura, string sRutaArchivos, string sUsuario, int iIdCliente, string sFolioFactura)
        {
            int iResultado = 0;

            //Datos de la factura
            MedNeg.Facturas.BlFacturas oblFactura = new BlFacturas();
            MedDAL.DAL.facturas        oFactura   = new MedDAL.DAL.facturas();

            //Datos de la factura
            oFactura = oblFactura.BuscarFactura(iIdFactura);

            //Recuperar la partida de la factura
            List <MedDAL.DAL.facturas_partida> oQuery = new List <MedDAL.DAL.facturas_partida>();

            oQuery.AddRange(oblFactura.RecuperarPartidaFactura(oFactura.idFactura));
            decimal dSubtotal             = 0;
            decimal dImpuestosTrasladados = 0;
            decimal dTotal = 0;

            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                dSubtotal             += oDetalle.Cantidad * oDetalle.Precio;
                dImpuestosTrasladados += (decimal)oDetalle.Iva + (decimal)oDetalle.IEPS;
            }
            //Total
            dTotal = dSubtotal + dImpuestosTrasladados;

            DateTime dtFechaTest = DateTime.Now;
            string   sNumeroCertificado = "";
            string   sA, sB, sC;

            //Leer archivo de configuracion
            MedNeg.Configuracion.BlConfiguracion  oblConfiguracion  = new MedNeg.Configuracion.BlConfiguracion();
            MedDAL.Configuracion.DALConfiguracion odalConfiguracion = new MedDAL.Configuracion.DALConfiguracion();

            odalConfiguracion = (MedDAL.Configuracion.DALConfiguracion)oblConfiguracion.CargaDatos(sRutaArchivos + "/Configuracion.xml");

            //Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Certificados/aaa010101aaa_csd_06.cer", out sA, out sB, out sC, out sNumeroCertificado);
            Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado, out sA, out sB, out sC, out sNumeroCertificado);

            //Establecer el numero de cuenta
            string sNumeroCuenta = null;

            if (oFactura.metodo_pago.MetodoPago.Equals("depósito en cuenta", StringComparison.InvariantCultureIgnoreCase) ||
                oFactura.metodo_pago.MetodoPago.Equals("traspaso", StringComparison.InvariantCultureIgnoreCase))
            {
                sNumeroCuenta = oFactura.NumeroCuentaPago;
            }


            //Debo validar la vigencia del certificado con sa <= FechaEmision <= sB

            #region generarcomprobante

            //Construir objeto factura
            Comprobante.ComprobanteFiscalDigital oComprobanteFiscalDigital = new Comprobante.ComprobanteFiscalDigital(
                "",                                                             //Serie
                sFolioFactura,                                                  //Folio
                dtFechaTest.ToString("yyyy-MM-ddThh:mm:ss"),                    //Fecha
                oFactura.tipo_forma_pago.FormaPago,                             //FormaDePago
                sNumeroCertificado,                                             //NoCertificado
                "",                                                             //"Condiciones de pago",
                dSubtotal.ToString(),                                           //SubTotal
                "0",                                                            //Descuento
                "",                                                             //Motivo del descuento
                dTotal.ToString(),                                              //Total
                oFactura.metodo_pago.MetodoPago,                                //Metodo de pago
                "Ingreso",                                                      //Tipo de comprobante
                null,                                                           //noAprobacion
                null,                                                           //anoAprobacion
                "3.2",                                                          //version
                null,                                                           //TipoCambio
                null,                                                           //Moneda
                odalConfiguracion.sEstado + "," + odalConfiguracion.sMunicipio, //LugarExpedicion
                sNumeroCuenta                                                   //NumCtaPago
                );

            //Pendiente la parte de pagos parciales

            //Empresa o razon social y direccion fiscal
            Comprobante.t_Emisor Emisor = new Comprobante.t_Emisor(
                odalConfiguracion.sRfc,
                odalConfiguracion.sRazonSocial,
                odalConfiguracion.sDomicilio, //Calle
                "",                           //No exterior
                "",                           //No interior
                "",                           //Colonia
                "",                           //Localidad
                "",                           //Emisor Referencia
                odalConfiguracion.sMunicipio,
                odalConfiguracion.sEstado,
                odalConfiguracion.sPais,
                odalConfiguracion.sCodigoPostal
                );

            Emisor.addRegimenFiscal(odalConfiguracion.sRegimenFiscal);

            oComprobanteFiscalDigital.setEmisor(Emisor);

            //Establece la expedición de la factura, se toman lo datos del almacen
            MedDAL.DAL.usuarios        oUsuario   = new MedDAL.DAL.usuarios();
            MedNeg.Usuarios.BlUsuarios oblUsuario = new Usuarios.BlUsuarios();
            oUsuario = (MedDAL.DAL.usuarios)oblUsuario.Buscar(sUsuario);

            oComprobanteFiscalDigital.setExpedicion(
                oUsuario.almacenes.Calle.ToString(),              //Calle
                oUsuario.almacenes.NumeroExt.ToString(),          //NoExt
                "",                                               //NoInt
                oUsuario.almacenes.colonias.Nombre,               //Colonia
                oUsuario.almacenes.poblaciones.Nombre.ToString(), //Población
                "",                                               //Emisor Referencia Expedicion
                oUsuario.almacenes.municipios.Nombre.ToString(),  //Municipio
                oUsuario.almacenes.estados.Nombre.ToString(),     //Estado
                oUsuario.almacenes.Pais.ToString(),               //Pais
                oUsuario.almacenes.CodigoPostal.ToString());      //CP

            //Establecer los datos del cliente
            MedDAL.DAL.clientes          oCliente    = new MedDAL.DAL.clientes();
            MedNeg.BlClientes.BlClientes oblClientes = new BlClientes.BlClientes();
            oCliente = oblClientes.BuscarCliente(iIdCliente);

            oComprobanteFiscalDigital.setReceptor(
                oCliente.Rfc.ToString(),                                          //RFC
                oCliente.Nombre.ToString() + " " + oCliente.Apellidos.ToString(), //Nombre
                oCliente.Calle.ToString(),                                        //Calle
                oCliente.NumeroExt.ToString(),                                    //No ext
                oCliente.NumeroInt.ToString(),                                    //No int
                oCliente.colonias.Nombre.ToString(),                              //Colo
                oCliente.poblaciones.Nombre.ToString(),                           //Ciudad
                "",                                                               //ReferenciaReceptor
                oCliente.municipios.Nombre.ToString(),                            //Municipio
                oCliente.estados.Nombre.ToString(),                               //Estado
                "Mexico",                                                         //Pais
                oCliente.CodigoPostal.ToString()                                  //Codigo postal
                );


            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                string Cantidad, Codigo, Descripcion, Unidad, PrecioUnitario, Importe, ImporteNeto;

                decimal dImporte = 0;
                Cantidad = oDetalle.Cantidad.ToString();
                //Codigo = oDetalle.productos.Clave1.ToString();
                //Descripcion = oDetalle.productos.Nombre.ToString();
                //0087 Identificar si es un producto o un ensamble
                if (oDetalle.idEnsamble.Equals(null))
                {
                    //Datos del producto
                    Codigo = oDetalle.productos.Clave1.ToString();
                }
                else
                {
                    //Datos del ensamble
                    Codigo = oDetalle.ensamble.ClaveBom.ToString();
                }

                Descripcion    = oDetalle.Descripcion.ToString();
                Unidad         = oDetalle.productos.UnidadMedida;
                PrecioUnitario = oDetalle.Precio.ToString();
                dImporte       = oDetalle.Cantidad * oDetalle.Precio;
                Importe        = dImporte.ToString();


                Comprobante.Concepto C = new Comprobante.Concepto(
                    Cantidad,
                    Unidad,
                    Codigo,
                    Descripcion,
                    PrecioUnitario,
                    Importe);
                oComprobanteFiscalDigital.addConcepto(C);//aqui agregas el elemento a la partida
            }



            #endregion

            //Commpruebo que sea válido
            if (oComprobanteFiscalDigital.Valido() == true)
            {
                string sCadenaOriginal = oComprobanteFiscalDigital.CadenaOriginal();
                oComprobanteFiscalDigital.Sellar(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaLlave.ToString(), sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado.ToString(), odalConfiguracion.sContraseña.ToString());
                oComprobanteFiscalDigital.XML().Save(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                //return a.XML();

                /*
                 * Modificaciones de POJO: 1 de Noviembre 2011 : Agregando el webservice para timbrado, guardaré los archivos en /Facturacion/Timbrados/
                 */
                FacturaService.TimbradoClient svcT          = new FacturaService.TimbradoClient();
                FacturaService.RespuestaCFDi  RespuestaCFDi = new FacturaService.RespuestaCFDi();

                //Aquí, cambiar la funcion a svcT.Timbrar cuando vayan a mostrarlo en producción, de otra manera, no serán válidos los cfdi's que emitan.
                try
                {
                    byte [] aArchivo = File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                    RespuestaCFDi = svcT.Timbrar("pojo", "a", aArchivo);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml", RespuestaCFDi.Documento);
                    RespuestaCFDi = svcT.PDF("pojo", "a", File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml"), null);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".pdf", RespuestaCFDi.Documento);
                    return(0);
                }
                catch (System.Net.WebException ex)
                {
                    //Sale cuando no encuentra al server
                    return(1);
                }
                catch (System.Web.Services.Protocols.SoapHeaderException ex)
                {
                    return(3);
                }
                catch (Exception ex)
                {
                    //Para excepciones no conocidas
                    return(4);
                }

                /*
                 * Falta: Revisar errores con PAC (¿Cómo los regresas? ¿Qué pasa si algo está mal? ¿el xml fue correctamente construido?¿Una función nueva?)
                 */
            }
            else
            {
                //Sale cuando el certificado no es valido
                return(2);
            }
        }