Example #1
0
        public static ResAcc Factura(VentaFactura oFactura, List<VentaFacturaDetalle> oDetalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oFactura.Fecha = (oFactura.Fecha != DateTime.MinValue ? oFactura.Fecha : DateTime.Now);
            oFactura.EstatusGenericoID = (oFactura.EstatusGenericoID > 0 ? oFactura.EstatusGenericoID : Cat.EstatusGenericos.Completada);
            oFactura.RealizoUsuarioID = (oFactura.RealizoUsuarioID > 0 ? oFactura.RealizoUsuarioID : Theos.UsuarioID);
            oFactura.SucursalID = (oFactura.SucursalID > 0 ? oFactura.SucursalID : Theos.SucursalID);

            // Aquí tal vez se podría llenar el número de Factura*

            // Se guarda la venta
            Datos.Guardar<VentaFactura>(oFactura);

            // Se guarda el detalle
            foreach (var oVenta in oDetalle)
            {
                oVenta.VentaFacturaID = oFactura.VentaFacturaID;
                Datos.Guardar<VentaFacturaDetalle>(oVenta);

                // Aquí se debe guardar el dato de número de factura en el folio de la venta original
                // ...
            }

            return new ResAcc(true);
        }
Example #2
0
        public static ResAcc Factura(VentaFactura oFactura, List <VentaFacturaDetalle> oDetalle)
        {
            // Se generan datos predeterminados o globales, en caso de que apliquen
            oFactura.Fecha             = (oFactura.Fecha != DateTime.MinValue ? oFactura.Fecha : DateTime.Now);
            oFactura.EstatusGenericoID = (oFactura.EstatusGenericoID > 0 ? oFactura.EstatusGenericoID : Cat.EstatusGenericos.Completada);
            oFactura.RealizoUsuarioID  = (oFactura.RealizoUsuarioID > 0 ? oFactura.RealizoUsuarioID : Theos.UsuarioID);
            oFactura.SucursalID        = (oFactura.SucursalID > 0 ? oFactura.SucursalID : Theos.SucursalID);

            // Aquí tal vez se podría llenar el número de Factura*


            // Se guarda la venta
            Datos.Guardar <VentaFactura>(oFactura);

            // Se guarda el detalle
            foreach (var oVenta in oDetalle)
            {
                oVenta.VentaFacturaID = oFactura.VentaFacturaID;
                Datos.Guardar <VentaFacturaDetalle>(oVenta);

                // Aquí se debe guardar el dato de número de factura en el folio de la venta original
                // ...
            }

            return(new ResAcc(true));
        }
Example #3
0
        public static ResAcc<int> GenerarFacturaGlobal(string sConceptoVentas, decimal mCostoTotal, decimal mTotalVentas
            , string sConceptoCancelaciones, decimal mTotalCancelaciones, string sConceptoDevoluciones, decimal mTotalDevoluciones
            , List<VentasPagosDetalleView> oFormasDePago)
        {
            // Se crea la instancia de la clase de Facturación Electrónica
            var oFacturaE = new FacturaElectronica();
            var oConfig = TheosProc.Config.ValoresVarios("Facturacion.");
            // Se llenan los valores de configuración y los datos del emisor
            VentasLoc.FeLlenarDatosComunes(ref oFacturaE, oConfig);

            // Se llenan los datos generales de la factura
            int iClienteID = Cat.Clientes.Mostrador;
            DateTime dAhora = DateTime.Now;

            oFacturaE.Fecha = dAhora;
            oFacturaE.FormaDePago = "Una sola exhibición";
            oFacturaE.LugarDeExpedicion = string.Format("{0}, {1}", oConfig["Facturacion.Municipio"], oConfig["Facturacion.Estado"]);
            oFacturaE.TipoDeComprobante = Enumerados.TiposDeComprobante.Ingreso;
            oFacturaE.TasaDeImpuesto = GlobalClass.ConfiguracionGlobal.IVA.ToString();
            oFacturaE.MetodoDePago = VentasLoc.GenerarMetodoDePagoFactura(oFormasDePago);
            // Se agraga la cadena del método de pago, como adicional
            oFacturaE.Adicionales = new Dictionary<string, string>();
            oFacturaE.Adicionales.Add("LeyendaDePago", VentasLoc.GenerarCadenaMetodoDePagoFactura(oFormasDePago));

            // Se llenan los datos del receptor
            var ResRec = VentasLoc.FeLlenarDatosReceptor(ref oFacturaE, iClienteID);
            if (ResRec.Error)
                return new ResAcc<int>(false, ResRec.Mensaje);

            // Se calcula el Iva
            decimal mVentasValor = UtilTheos.ObtenerPrecioSinIva(mTotalVentas);
            decimal mVentasIva = UtilTheos.ObtenerIvaDePrecio(mTotalVentas);
            decimal mCancelacionesValor = UtilTheos.ObtenerPrecioSinIva(mTotalCancelaciones);
            decimal mCancelacionesIva = UtilTheos.ObtenerIvaDePrecio(mTotalCancelaciones);
            decimal mDevolucionesValor = UtilTheos.ObtenerPrecioSinIva(mTotalDevoluciones);
            decimal mDevolucionesIva = UtilTheos.ObtenerIvaDePrecio(mTotalDevoluciones);

            // Se llenan los conceptos de la factura
            const string sUnidad = "U";
            oFacturaE.Conceptos = new List<Concepto>();
            // Ventas
            oFacturaE.Conceptos.Add(new Concepto()
            {
                Cantidad = 1,
                Unidad = sUnidad,
                Descripcion = sConceptoVentas,
                ValorUnitario = mVentasValor,
                Iva = mVentasIva
            });
            // Cancelaciones
            oFacturaE.Conceptos.Add(new Concepto()
            {
                Cantidad = 1,
                Unidad = sUnidad,
                Descripcion = sConceptoCancelaciones,
                ValorUnitario = (mCancelacionesValor * -1),
                Iva = (mCancelacionesIva * -1)
            });
            // Devoluciones
            oFacturaE.Conceptos.Add(new Concepto()
            {
                Cantidad = 1,
                Unidad = sUnidad,
                Descripcion = sConceptoDevoluciones,
                ValorUnitario = (mDevolucionesValor * -1),
                Iva = (mDevolucionesIva * -1)
            });

            // Se comienza a procesar la facturación electrónica

            // Se envía la factura y se obtiene el Xml generado
            var ResXml = VentasLoc.FeEnviarFactura(ref oFacturaE);
            if (ResXml.Error)
                return new ResAcc<int>(false, ResXml.Mensaje);
            string sCfdiTimbrado = ResXml.Respuesta;

            // Se guarda la información
            var oFolioFactura = VentasLoc.GenerarFolioDeFactura();
            oFacturaE.Serie = oFolioFactura["Serie"];
            oFacturaE.Folio = oFolioFactura["Folio"];
            var oVentaFactura = new VentaFactura()
            {
                Fecha = dAhora,
                FolioFiscal = oFacturaE.Timbre.FolioFiscal,
                Serie = oFacturaE.Serie,
                Folio = oFacturaE.Folio,
                ClienteID = iClienteID,
                Costo = mCostoTotal,
                Subtotal = (mVentasValor - mCancelacionesValor - mDevolucionesValor),
                Iva = (mVentasIva - mCancelacionesIva - mDevolucionesIva)
            };
            var oVentaFacturaD = new List<VentaFacturaDetalle>();
            // No se agrega ningún detalle, para que las ventas aquí facturadas no aparezcan como facturadas
            // foreach (var oVenta in oVentas)
            //     oVentaFacturaD.Add(new VentaFacturaDetalle() { VentaID = oVenta.VentaID });
            Guardar.Factura(oVentaFactura, oVentaFacturaD);

            // Se manda guardar la factura, en pdf y xml
            var oRep = VentasLoc.FeGuardarArchivosFactura(ref oFacturaE, sCfdiTimbrado, (oFacturaE.Serie + oFacturaE.Folio));

            // Se manda imprimir la factura
            // ..

            return new ResAcc<int>(true, oVentaFactura.VentaFacturaID);
        }
Example #4
0
        public static ResAcc<int> GenerarFacturaElectronica(List<int> VentasIDs, int iClienteID
            , List<ProductoVenta> oListaVenta, List<VentasPagosDetalleView> oFormasDePago, string sObservacion, Dictionary<string, object> oAdicionales)
        {
            // Se crea la instancia de la clase de Facturación Electrónica
            var oFacturaE = new FacturaElectronica();
            var oConfig = TheosProc.Config.ValoresVarios("Facturacion.");
            // Se llenan los valores de configuración y los datos del emisor
            VentasLoc.FeLlenarDatosComunes(ref oFacturaE, oConfig);

            // Se llenan los datos generales de la factura
            DateTime dAhora = DateTime.Now;

            // Se obtienen las ventas a facturar, y los vendedores
            var oVentas = new List<VentasView>();
            string sVendedores = "";
            foreach (int iVentaID in VentasIDs)
            {
                var oVentaV = Datos.GetEntity<VentasView>(q => q.VentaID == iVentaID);
                oVentas.Add(oVentaV);
                sVendedores += (", " + oVentaV.Vendedor);
            }
            sVendedores = (sVendedores == "" ? "" : sVendedores.Substring(2));
            oFacturaE.Adicionales = new Dictionary<string, string>();
            oFacturaE.Adicionales.Add("Vendedor", sVendedores);
            if (oVentas.Count > 0)
            {
                oFacturaE.Adicionales.Add("ACredito", oVentas[0].ACredito.ToString());
                // Se llena el dato de la fecha de vencimiento, sólo de la primer venta
                int iClienteVenID = oVentas[0].ClienteID;
                var oCliente = Datos.GetEntity<Cliente>(q => q.ClienteID == iClienteVenID && q.Estatus);
                oFacturaE.Adicionales.Add("Vencimiento", oVentas[0].Fecha.AddDays(oCliente.DiasDeCredito.Valor()).ToShortDateString());
                // Leyenda de la venta
                oFacturaE.Adicionales.Add("LeyendaDeVenta", VentasProc.ObtenerQuitarLeyenda(oVentas[0].VentaID));
                // Si no hay leyenda, se verifica si hay observación (por tickets convertidos a factura), y si hay, se manda como leyenda
                if (string.IsNullOrEmpty(oFacturaE.Adicionales["LeyendaDeVenta"]) && sObservacion != "")
                    oFacturaE.Adicionales["LeyendaDeVenta"] = sObservacion;
                // Leyenda de vehículo, si aplica
                if (oVentas[0].ClienteVehiculoID.HasValue)
                    oFacturaE.Adicionales.Add("LeyendaDeVehiculo", UtilDatos.LeyendaDeVehiculo(oVentas[0].ClienteVehiculoID.Value));
                // Se agregan los adicionales, si hubiera
                if (oAdicionales != null)
                {
                    if (oAdicionales.ContainsKey("EfectivoRecibido"))
                        oFacturaE.Adicionales.Add("EfectivoRecibido", Util.Cadena(oAdicionales["EfectivoRecibido"]));
                    if (oAdicionales.ContainsKey("Cambio"))
                        oFacturaE.Adicionales.Add("Cambio", Util.Cadena(oAdicionales["Cambio"]));
                }
            }

            // Se procesa la forma de pago con nueva modalidad del sat
            string sFormaDePago = VentasLoc.GenerarMetodoDePagoFactura(oFormasDePago);
            oFacturaE.MetodoDePago = sFormaDePago;
            oFacturaE.CuentaPago = VentasLoc.ObtenerCuentaDePago(oFormasDePago);
            // Se agraga la cadena del método de pago, como adicional
            oFacturaE.Adicionales.Add("LeyendaDePago", VentasLoc.GenerarCadenaMetodoDePagoFactura(oFormasDePago));

            oFacturaE.Fecha = dAhora;
            oFacturaE.FormaDePago = "UNA SOLA EXHIBICIÓN";
            oFacturaE.LugarDeExpedicion = string.Format("{0}, {1}", oConfig["Facturacion.Municipio"], oConfig["Facturacion.Estado"]);
            oFacturaE.TipoDeComprobante = Enumerados.TiposDeComprobante.Ingreso;
            oFacturaE.TasaDeImpuesto = GlobalClass.ConfiguracionGlobal.IVA.ToString();

            // Se llenan los datos del receptor
            var ResRec = VentasLoc.FeLlenarDatosReceptor(ref oFacturaE, iClienteID);
            if (ResRec.Error)
                return new ResAcc<int>(false, ResRec.Mensaje);

            // Se llenan los conceptos de la factura
            decimal mUnitarioTotal = 0, mIvaTotal = 0;
            oFacturaE.Conceptos = new List<Concepto>();
            if (oListaVenta == null)
            {
                List<VentasDetalleView> oVentaDetalle;
                foreach (var oVentaCon in oVentas)
                {
                    oVentaDetalle = Datos.GetListOf<VentasDetalleView>(q => q.VentaID == oVentaCon.VentaID);
                    foreach (var oConcepto in oVentaDetalle)
                    {
                        oFacturaE.Conceptos.Add(new Concepto()
                        {
                            Identificador = oConcepto.NumeroParte,
                            Cantidad = oConcepto.Cantidad,
                            Unidad = oConcepto.Medida,
                            Descripcion = oConcepto.NombreParte,
                            ValorUnitario = oConcepto.PrecioUnitario,
                            Iva = oConcepto.Iva
                        });

                        mUnitarioTotal += oConcepto.PrecioUnitario;
                        mIvaTotal += oConcepto.Iva;
                    }
                }
            }
            else
            {
                foreach (var oConcepto in oListaVenta)
                {
                    oFacturaE.Conceptos.Add(new Concepto()
                    {
                        Identificador = oConcepto.NumeroDeParte,
                        Cantidad = oConcepto.Cantidad,
                        Unidad = oConcepto.UnidadDeMedida,
                        Descripcion = oConcepto.NombreDeParte,
                        ValorUnitario = oConcepto.PrecioUnitario,
                        Iva = oConcepto.Iva
                    });

                    mUnitarioTotal += oConcepto.PrecioUnitario;
                    mIvaTotal += oConcepto.Iva;
                }
            }

            // Se asigna el folio y la serie de la factura
            var oFolioFactura = VentasLoc.GenerarFolioDeFactura();
            oFacturaE.Serie = oFolioFactura["Serie"];
            oFacturaE.Folio = oFolioFactura["Folio"];

            // Se comienza a procesar la facturación electrónica

            // Se envía la factura y se obtiene el Xml generado
            var ResXml = VentasLoc.FeEnviarFactura(ref oFacturaE);
            if (ResXml.Error)
            {
                // Se trata de regresar el folio de facturación apartado
                VentasLoc.RegresarFolioDeFacrtura(oFacturaE.Folio);
                return new ResAcc<int>(false, ResXml.Mensaje);
            }
            string sCfdiTimbrado = ResXml.Respuesta;

            // Se guarda la información
            var oVentaFactura = new VentaFactura()
            {
                Fecha = dAhora,
                FolioFiscal = oFacturaE.Timbre.FolioFiscal,
                Serie = oFacturaE.Serie,
                Folio = oFacturaE.Folio,
                ClienteID = iClienteID,
                Observacion = sObservacion,
                Subtotal = mUnitarioTotal,
                Iva = mIvaTotal
            };
            var oVentaFacturaD = new List<VentaFacturaDetalle>();
            foreach (var oVentaFac in oVentas)
            {
                var oFacturaDet = new VentaFacturaDetalle() { VentaID = oVentaFac.VentaID };

                // Se revisa si es la primera factura para esta venta
                if (!Datos.Exists<VentaFacturaDetalle>(c => c.VentaID == oVentaFac.VentaID && c.Estatus))
                    oFacturaDet.Primera = true;

                oVentaFacturaD.Add(oFacturaDet);
            }
            Guardar.Factura(oVentaFactura, oVentaFacturaD);

            // Se escribe el folio de factura en cada venta
            string sSerieFolio = (oFacturaE.Serie + oFacturaE.Folio);
            foreach (int iVentaID in VentasIDs)
            {
                var oVenta = Datos.GetEntity<Venta>(q => q.VentaID == iVentaID && q.Estatus);
                oVenta.Facturada = true;
                oVenta.Folio = sSerieFolio;
                Datos.Guardar<Venta>(oVenta);
            }

            // Se manda guardar la factura, en pdf y xml. También se manda a salida
            var oRep = VentasLoc.FeGuardarArchivosFactura(ref oFacturaE, sCfdiTimbrado, sSerieFolio);

            // Se manda la factura por correo
            VentasLoc.EnviarFacturaPorCorreo(oVentaFactura.VentaFacturaID);

            return new ResAcc<int>(true, oVentaFactura.VentaFacturaID);
        }