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); }
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)); }
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); }
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); }