public Response Save(EncabDevolucionVenta item, string empresaDB) { try { using var db = new ProfitAdmin2K8(conn.GetDbContextOptions(empresaDB)); Utilitarios utilitarios = new Utilitarios(); #region Validar devolucion ValidarDevolucion(item, empresaDB); #endregion #region Buscar consecutivos int numeroDevo = utilitarios.BuscarConsecutivo("DEVO", item.CoSucu, empresaDB); int numeroNCR = utilitarios.BuscarConsecutivo("N/CR", item.CoSucu, empresaDB); var numeroControl = utilitarios.BuscarNroControl(item.CoSucu, empresaDB); #endregion if (numeroDevo > 0) { #region Nota de credito #region Calcular exento para el DisCen decimal TotalExento = (from exento in item.DetaDevolucionVenta where exento.TipoImp == "6" select exento).Sum(t => t.RengNeto); #endregion #region Construcción de DisCen string DisCen = utilitarios.ArmarDisCen(item.FecEmis, (decimal)item.TotBruto, item.Iva, TotalExento, empresaDB); #endregion #region Creando N/CR Response ncr = new DocumentosVentasRepositorio() .Save(new DocumCc { #region Campos Numcon = numeroControl, CoCli = item.CoCli, Contrib = cliente.Contribu, NroDoc = 0, TipoDoc = "N/CR", Moneda = item.Moneda, CoVen = item.CoVen, FeUsIn = item.FeUsIn, FeUsMo = item.FeUsMo, FeUsEl = item.FeUsEl, CoSucu = item.CoSucu, Tipo = "1", FecEmis = DateTime.Now, FecVenc = DateTime.Now, MontoImp = item.Iva, Observa = $"Devol. Asoc:Fact No.{factura.FactNum}.", MontoBru = (decimal)item.TotBruto, Recargo = string.Empty, MontoNet = (decimal)item.TotNeto, DocOrig = "DEVO", NroOrig = numeroDevo, Tasa = item.Tasa, Saldo = (decimal)item.TotNeto, Salestax = string.Empty, Aut = true, CoUsIn = item.CoUsIn, CoUsMo = item.CoUsMo, CoUsEl = item.CoUsEl, Feccom = DateTime.Now #endregion }, empresaDB); #endregion #endregion #region Cancelacion automatica de la devolución if (ncr.Status == "OK") { #region Guardar cobro Response cobroresult = new CobrosRepositorio() .Save(new EncabCobro { #region Campos cobro CobNum = 0, Recibo = string.Empty, CoCli = item.CoCli, CoVen = item.CoVen, FecCob = DateTime.Now, Feccom = DateTime.Now, Tasa = item.Tasa, Moneda = item.Moneda, CoUsIn = item.CoUsIn, FeUsIn = item.FeUsIn, CoUsMo = item.CoUsMo, FeUsMo = item.FeUsMo, CoUsEl = item.CoUsEl, FeUsEl = item.FeUsEl, CoSucu = item.CoSucu, Descrip = $"Cobro generado por la Devolución Nro. {numeroDevo}", NumDev = numeroDevo, DetaCobro = new List <DetaCobro> { new DetaCobro { #region Renglon factura CobNum = 0, RengNum = 1, TpDocCob = "FACT", DocNum = factura.FactNum, Neto = (decimal)factura.TotNeto, MontCob = (decimal)factura.TotNeto, Isv = (decimal)factura.Iva, Moneda = item.Moneda, Tasa = item.Tasa, FecEmis = DateTime.Now, FecVenc = DateTime.Now #endregion }, new DetaCobro { #region Renglon nota de crédito CobNum = 0, RengNum = 2, TpDocCob = "N/CR", DocNum = numeroNCR, Neto = (decimal)item.TotNeto, MontCob = (decimal)item.TotNeto, Isv = (decimal)item.Iva, Moneda = item.Moneda, Tasa = item.Tasa, FecEmis = DateTime.Now, FecVenc = DateTime.Now #endregion } }, FormaPagoCobro = new List <FormaPagoCobro> { new FormaPagoCobro { #region Campos CobNum = 0, RengNum = 1, TipCob = "EFEC", Movi = 0, Moneda = item.Moneda, CodCaja = caja.CodCaja, DesCaja = caja.Descrip, FecCheq = DateTime.Now, Banco = "DEVO" // F**k you... #endregion } } #endregion }, empresaDB); #endregion #region Actualizar saldo factura y documento (FACT) if (cobroresult.Status == "OK") { item.NumCob = Convert.ToInt32(cobroresult.FacturaID); //;-) factura.CoUsMo = item.CoUsMo; factura.FeUsMo = item.FeUsMo; factura.Saldo -= (decimal)item.TotNeto; #region Detalle de factura y stock foreach (var iRengDev in item.DetaDevolucionVenta) { #region Monto devuelto en rengfac factura.DetaFacturaVenta.FirstOrDefault(d => d.FactNum == iRengDev.NumDoc && d.RengNum == iRengDev.RengDoc).TotalDev += iRengDev.TotalArt; #endregion #region actualización de stock utilitarios.ActualizarStockArticuloAlmacen(iRengDev.CoArt, iRengDev.CoAlma, iRengDev.TotalArt, true, empresaDB); #endregion } #endregion Response factresult = new FacturasVentasRepositorio().Update(factura, empresaDB); } else { throw new ArgumentException(cobroresult.Message); } #endregion } else { throw new ArgumentException(ncr.Message); } #endregion #region Devolucion List <RengDvc> RengDvcs = new List <RengDvc>(); db.Entry(new DevCli { #region Campos FactNum = numeroDevo, Contrib = item.Contrib, Nombre = item.Nombre, Rif = item.Rif, Nit = item.Nit, NumControl = item.NumControl, Status = item.Status, Comentario = "<Forma Pago: Efectivo>", Descrip = item.Descrip, Saldo = item.Saldo, FecEmis = item.FecEmis, FecVenc = item.FecVenc, CoCli = item.CoCli, CoVen = item.CoVen, CoTran = item.CoTran, DirEnt = item.DirEnt, FormaPag = item.FormaPag, TotBruto = item.TotBruto, TotNeto = item.TotNeto, GlobDesc = item.GlobDesc, TotReca = item.TotReca, PorcGdesc = item.PorcGdesc, PorcReca = item.PorcReca, TotalUc = item.TotalUc, TotalCp = item.TotalCp, TotFlete = item.TotFlete, MontoDev = item.MontoDev, Totklu = item.Totklu, Anulada = item.Anulada, Impresa = item.Impresa, Iva = item.Iva, IvaDev = item.IvaDev, Feccom = item.Feccom, Numcom = item.Numcom, Tasa = item.Tasa, Moneda = item.Moneda, DisCen = DisCen, NcNum = numeroNCR, // ;-) Seriales = item.Seriales, Tasag = item.Tasag, Tasag10 = item.Tasag10, Tasag20 = item.Tasag20, Campo1 = item.Campo1, Campo2 = item.Campo2, Campo3 = item.Campo3, Campo4 = item.Campo4, Campo5 = item.Campo5, Campo6 = item.Campo6, Campo7 = item.Campo7, Campo8 = item.Campo8, CoUsIn = item.CoUsIn, FeUsIn = item.FeUsIn, CoUsMo = item.CoUsMo, FeUsMo = item.FeUsMo, CoUsEl = item.CoUsEl, FeUsEl = item.FeUsEl, Revisado = item.Revisado, Trasnfe = item.Trasnfe, Numcon = numeroControl, CoSucu = item.CoSucu, Rowguid = item.Rowguid, MonIlc = item.MonIlc, Otros1 = item.Otros1, Otros2 = item.Otros2, Otros3 = item.Otros3, NumCob = item.NumCob, //;-) MovCaj = item.MovCaj, MovBan = item.MovBan, SaldoNcr = item.SaldoNcr, NumTurno = item.NumTurno, Aux01 = item.Aux01, Aux02 = item.Aux02, Salestax = item.Salestax, Origen = item.Origen, OrigenD = item.OrigenD, StaProd = item.StaProd, Telefono = item.Telefono #endregion }).State = EntityState.Added; foreach (var i in item.DetaDevolucionVenta) { RengDvc reng = new RengDvc { #region Campos FactNum = numeroDevo, RengNum = i.RengNum, TipoDoc = i.TipoDoc, RengDoc = i.RengDoc, NumDoc = i.NumDoc, CoArt = i.CoArt, CoAlma = i.CoAlma, TotalArt = i.TotalArt, StotalArt = i.StotalArt, Pendiente = i.Pendiente, UniVenta = i.UniVenta, PrecVta = i.PrecVta, PorcDesc = i.PorcDesc, TipoImp = i.TipoImp, RengNeto = i.RengNeto, CosProUn = i.CosProUn, UltCosUn = i.UltCosUn, UltCosOm = i.UltCosOm, CosProOm = i.CosProOm, PrecVta2 = i.PrecVta2, DesArt = i.DesArt, Comentario = i.Comentario, TotalUni = i.TotalUni, MonIlc = i.MonIlc, Otros = i.Otros, NroLote = i.NroLote, FecLote = i.FecLote, TipoPrec = i.TipoPrec, CoAlma2 = i.CoAlma2, Aux01 = i.Aux01, Aux02 = i.Aux02 #endregion }; db.Entry(reng).State = EntityState.Added; } db.SaveChanges(); #endregion #region Actualización de consecutivos utilitarios.ActualizarConsecutivo(numeroDevo, "DEVO", item.CoSucu, empresaDB); utilitarios.ActualizarConsecutivo(numeroNCR, "N/CR", item.CoSucu, empresaDB); #endregion } else { throw new ArgumentException("No se encontró el correlativo configurado para 'DEVO'."); } return(new Response { Status = "OK", Message = "Transacción realizada con éxito." }); } catch (Exception ex) { return(new Response { Status = "ERROR", Message = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message }); } }