public static ResAcc FacturaDevolucion(VentaFacturaDevolucion oFacturaDev, List<VentaFacturaDevolucionDetalle> oDetalle) { // Se generan datos predeterminados o globales, en caso de que apliquen oFacturaDev.Fecha = (oFacturaDev.Fecha != DateTime.MinValue ? oFacturaDev.Fecha : DateTime.Now); oFacturaDev.SucursalID = (oFacturaDev.SucursalID > 0 ? oFacturaDev.SucursalID : Theos.SucursalID); // Aquí tal vez se podría llenar el número de Factura* // Se guarda la nota de crédito Datos.Guardar<VentaFacturaDevolucion>(oFacturaDev); // Se guarda el detalle foreach (var oDevolucion in oDetalle) { oDevolucion.VentaFacturaDevolucionID = oFacturaDev.VentaFacturaDevolucionID; Datos.Guardar<VentaFacturaDevolucionDetalle>(oDevolucion); // 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 FacturaDevolucion(VentaFacturaDevolucion oFacturaDev, List <VentaFacturaDevolucionDetalle> oDetalle) { // Se generan datos predeterminados o globales, en caso de que apliquen oFacturaDev.Fecha = (oFacturaDev.Fecha != DateTime.MinValue ? oFacturaDev.Fecha : DateTime.Now); oFacturaDev.SucursalID = (oFacturaDev.SucursalID > 0 ? oFacturaDev.SucursalID : Theos.SucursalID); // Aquí tal vez se podría llenar el número de Factura* // Se guarda la nota de crédito Datos.Guardar <VentaFacturaDevolucion>(oFacturaDev); // Se guarda el detalle foreach (var oDevolucion in oDetalle) { oDevolucion.VentaFacturaDevolucionID = oFacturaDev.VentaFacturaDevolucionID; Datos.Guardar <VentaFacturaDevolucionDetalle>(oDevolucion); // 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> GenerarFacturaCancelacion(int iFacturaID, List<int> oIdsDevoluciones) { // Se obtiene el folio fiscal var oFactura = Datos.GetEntity<VentaFactura>(c => c.VentaFacturaID == iFacturaID && c.Estatus); string sFolioFiscal = oFactura.FolioFiscal; // Se generan los datos de la cancelación DateTime dAhora = DateTime.Now; var oFacturaDevolucion = new VentaFacturaDevolucion() { VentaFacturaID = iFacturaID, Fecha = dAhora, EsCancelacion = true }; // Se genera el detalle de la devolución de factura, con los Ids de las devoluciones incluidas var oFacturaDevDet = new List<VentaFacturaDevolucionDetalle>(); foreach (int iDevolucionID in oIdsDevoluciones) oFacturaDevDet.Add(new VentaFacturaDevolucionDetalle() { VentaDevolucionID = iDevolucionID }); Guardar.FacturaDevolucion(oFacturaDevolucion, oFacturaDevDet); // Se manda cancelar la factura, y completar los procesos correspondientes var ResCanc = VentasLoc.GenerarFacturaCancelacion(sFolioFiscal, oFacturaDevolucion.VentaFacturaDevolucionID); /* Ya no se sale, pues aunque haya error, se deben guardar los datos, ya que la venta sí se canceló if (ResC.Error) return new ResAcc<bool>(false, ResC.Mensaje); */ var Res = new ResAcc<int>(ResCanc.Exito, ResCanc.Mensaje); Res.Respuesta = oFacturaDevolucion.VentaFacturaDevolucionID; return Res; }
/* public static ResAcc<int> GenerarFacturaDevolucion(int iDevolucionID, int iUsuarioID) { // Se crea la instancia de la clase de Facturación Electrónica var oFacturaE = new FacturaElectronica(); var oConfig = Config.ValoresVarios("Facturacion."); // Se llenan los valores de configuración y los datos del emisor VentasProc.FeLlenarDatosComunes(ref oFacturaE, oConfig); // Se llenan los datos generales de la factura DateTime dAhora = DateTime.Now; var oDev = General.GetEntity<VentasDevolucionesView>(q => q.VentaDevolucionID == iDevolucionID); // Se obtiene el nombre del vendedor var oUsuario = General.GetEntity<Usuario>(q => q.UsuarioID == iUsuarioID && q.Estatus); string sVendedores = oUsuario.NombrePersona; oFacturaE.Adicionales = new Dictionary<string, string>(); oFacturaE.Adicionales.Add("Vendedor", sVendedores); 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.Egreso; oFacturaE.TasaDeImpuesto = GlobalClass.ConfiguracionGlobal.IVA.ToString(); oFacturaE.MetodoDePago = oDev.FormaDePago; // Se llenan los datos del receptor var oVenta = General.GetEntity<Venta>(q => q.VentaID == oDev.VentaID && q.Estatus); int iClienteID = oVenta.ClienteID; var ResRec = VentasProc.FeLlenarDatosReceptor(ref oFacturaE, iClienteID); if (ResRec.Error) return new ResAcc<int>(false, ResRec.Mensaje); // Se llenan los conceptos de la factura var oDevDetalle = General.GetListOf<VentasDevolucionesDetalleView>(q => q.VentaDevolucionID == oDev.VentaDevolucionID); oFacturaE.Conceptos = new List<Concepto>(); foreach (var oDet in oDevDetalle) { oFacturaE.Conceptos.Add(new Concepto() { Identificador = oDet.NumeroParte, Cantidad = oDet.Cantidad, Unidad = oDet.NombreMedida, Descripcion = oDet.NombreParte, ValorUnitario = oDet.PrecioUnitario, Iva = oDet.Iva }); } // Se comienza a procesar la facturación electrónica // Se envía la factura y se obtiene el Xml generado var ResXml = VentasProc.FeEnviarFactura(ref oFacturaE); bool bFacturada = ResXml.Exito; // if (ResXml.Error) // return new ResAcc<int>(false, ResXml.Mensaje); string sCfdiTimbrado = ResXml.Respuesta; // Se guarda la información var oVentaFactura = General.GetEntity<VentasFacturasDetalleView>(q => q.VentaID == oVenta.VentaID); var oFolioFactura = VentasProc.GenerarFolioDeFacturaDevolucion(); oFacturaE.Serie = oFolioFactura["Serie"]; oFacturaE.Folio = oFolioFactura["Folio"]; var oFacturaDevolucion = new VentaFacturaDevolucion() { VentaFacturaID = oVentaFactura.VentaFacturaID, Fecha = dAhora, FolioFiscal = (oFacturaE.Timbre == null ? "" : oFacturaE.Timbre.FolioFiscal), Serie = oFacturaE.Serie, Folio = oFacturaE.Folio, EsCancelacion = false, Procesada = bFacturada, FechaProcesada = (bFacturada ? ((DateTime?)dAhora) : null) }; var oFacturaDevDet = new List<VentaFacturaDevolucionDetalle>(); oFacturaDevDet.Add(new VentaFacturaDevolucionDetalle() { VentaDevolucionID = iDevolucionID }); Guardar.FacturaDevolucion(oFacturaDevolucion, oFacturaDevDet); // oFacturaE.Adicionales.Add("FacturaOrigen", (oVentaFactura.Serie + oVentaFactura.Folio)); // Se manda guardar la factura, en pdf y xml if (bFacturada) VentasProc.FeGuardarArchivosFacturaDevolucion(ref oFacturaE, sCfdiTimbrado, (oFacturaE.Serie + oFacturaE.Folio)); // Se manda la nota de crédito generada, por correo VentasProc.EnviarFacturaDevolucionPorCorreo(oFacturaDevolucion.VentaFacturaDevolucionID); // Se manda imprimir la factura // .. return new ResAcc<int>(bFacturada, oFacturaDevolucion.VentaFacturaDevolucionID); } */ public static ResAcc<int> GenerarFacturaDevolucion(List<VentasPagosDetalleView> oFormasDePago, int iVentaID, List<ProductoVenta> oDetalle, int iUsuarioID , bool bEsDevolucion, int iId) { // 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 obtiene el nombre del vendedor var oUsuario = Datos.GetEntity<Usuario>(q => q.UsuarioID == iUsuarioID && q.Estatus); string sVendedores = oUsuario.NombrePersona; oFacturaE.Adicionales = new Dictionary<string, string>(); oFacturaE.Adicionales.Add("Vendedor", sVendedores); 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.Egreso; oFacturaE.TasaDeImpuesto = GlobalClass.ConfiguracionGlobal.IVA.ToString(); oFacturaE.MetodoDePago = VentasLoc.GenerarMetodoDePagoFactura(oFormasDePago); // Se agraga la cadena del método de pago, como adicional oFacturaE.Adicionales.Add("LeyendaDePago", VentasLoc.GenerarCadenaMetodoDePagoFactura(oFormasDePago)); // Se llenan los datos del receptor // var oVenta = General.GetEntity<Venta>(q => q.VentaID == iVentaID && q.Estatus); var oVentaFactV = Datos.GetEntity<VentasFacturasDetalleAvanzadoView>(c => c.VentaID == iVentaID); int iClienteID = oVentaFactV.ClienteID.Valor(); 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>(); foreach (var oDet in oDetalle) { oFacturaE.Conceptos.Add(new Concepto() { Identificador = oDet.NumeroDeParte, Cantidad = oDet.Cantidad, Unidad = oDet.UnidadDeMedida, Descripcion = oDet.NombreDeParte, ValorUnitario = oDet.PrecioUnitario, Iva = oDet.Iva }); mUnitarioTotal += oDet.PrecioUnitario; mIvaTotal += oDet.Iva; } // 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); bool bFacturada = ResXml.Exito; /* if (ResXml.Error) return new ResAcc<int>(false, ResXml.Mensaje); */ string sCfdiTimbrado = ResXml.Respuesta; // Se guarda la información // var oVentaFactura = General.GetEntity<VentasFacturasDetalleAvanzadoView>(q => q.VentaID == iVentaID); var oFolioFactura = VentasLoc.GenerarFolioDeFacturaDevolucion(); oFacturaE.Serie = oFolioFactura["Serie"]; oFacturaE.Folio = oFolioFactura["Folio"]; var oFacturaDevolucion = new VentaFacturaDevolucion() { VentaFacturaID = oVentaFactV.VentaFacturaID.Valor(), Fecha = dAhora, FolioFiscal = (oFacturaE.Timbre == null ? "" : oFacturaE.Timbre.FolioFiscal), Serie = oFacturaE.Serie, Folio = oFacturaE.Folio, EsCancelacion = false, Procesada = bFacturada, FechaProcesada = (bFacturada ? ((DateTime?)dAhora) : null), Subtotal = mUnitarioTotal, Iva = mIvaTotal }; var oFacturaDevDet = new List<VentaFacturaDevolucionDetalle>(); var oRegFacDevDet = new VentaFacturaDevolucionDetalle(); if (bEsDevolucion) oRegFacDevDet.VentaDevolucionID = iId; else oRegFacDevDet.VentaGarantiaID = iId; oFacturaDevDet.Add(oRegFacDevDet); Guardar.FacturaDevolucion(oFacturaDevolucion, oFacturaDevDet); // Quizá sea buena opción marcar (de alguna forma) el registro de VentaFacturaDetalle como cancelada, si es que fue una cancelación de la Venta // oFacturaE.Adicionales.Add("FacturaOrigen", (oVentaFactV.Serie + oVentaFactV.Folio)); // Se manda guardar la factura, en pdf y xml if (bFacturada) VentasLoc.FeGuardarArchivosFacturaDevolucion(ref oFacturaE, sCfdiTimbrado, (oFacturaE.Serie + oFacturaE.Folio)); // Se manda la nota de crédito generada, por correo VentasLoc.EnviarFacturaDevolucionPorCorreo(oFacturaDevolucion.VentaFacturaDevolucionID); // Se manda imprimir la factura // .. return new ResAcc<int>(bFacturada, oFacturaDevolucion.VentaFacturaDevolucionID); }