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