private void ValidarDevolucion(EncabDevolucionVenta obj, string empresaDB) { using var db = new ProfitAdmin2K8(conn.GetDbContextOptions(empresaDB)); Utilitarios utilitarios = new Utilitarios(); #region Verificar caja ppal para el cobro caja = db.Cajas.FirstOrDefault(c => c.Cajapri == true); if (caja == null) { throw new ArgumentException("No existe una caja principal para la cancelación del cobro. Llame a su consultor profit."); } #endregion #region Verificar cliente cliente = new ClientesRepositorio().GetCliente(obj.CoCli, empresaDB); if (cliente == null) { throw new ArgumentException($"El cliente {obj.CoCli.Trim()} indicado para la devolución no existe."); } else { if (cliente.Inactivo) { throw new ArgumentException($"El cliente {obj.CoCli.Trim()} indicado para la devolución se encuentra inactivo."); } } #endregion #region Verificar vendedor Vendedor vendor = new VendedoresRepositorio().Find(obj.CoVen, empresaDB); if (vendor != null) { if (!vendor.FunVen) { throw new ArgumentException($"Vendedor {obj.CoVen} indicado no tiene función de 'vendedor'."); } if (!vendor.FunCob) { throw new ArgumentException($"Vendedor {obj.CoVen} indicado no tiene función de 'cobrador'."); } } else { throw new ArgumentException($"El vendedor {obj.CoVen} suministrado no existe."); } #endregion #region Verificar transporte Transpor transporte = db.Transpor.FirstOrDefault(t => t.CoTran == obj.CoTran); if (transporte == null) { throw new ArgumentException($"El transporte {obj.CoTran} suministrado no existe."); } #endregion #region Verificar condicion de pago Condicio condicion = db.Condicio.FirstOrDefault(c => c.CoCond == obj.FormaPag); if (condicion == null) { throw new ArgumentException($"La condición de pago {obj.FormaPag} suministrado no existe."); } #endregion #region Verificar moneda utilitarios.GetMoneda(obj.Moneda, empresaDB); #endregion #region Verificar sucursal utilitarios.GetSucursal(obj.CoSucu, empresaDB); #endregion #region Verificar datos en renglones de factura foreach (var iRengFac in obj.DetaDevolucionVenta) { #region Verificar factura factura = new FacturasVentasRepositorio().Find(iRengFac.NumDoc, empresaDB); if (factura == null) { throw new ArgumentException($"La factura {iRengFac.NumDoc} indicada en el renglón {iRengFac.RengNum} en la devolución de cliente no existe."); } if (factura.Anulada) { throw new ArgumentException($"La factura {iRengFac.NumDoc} indicada en el renglón {iRengFac.RengNum} en la devolución de cliente se encuentra anulada."); } if (factura.Saldo == 0) { throw new ArgumentException($"La factura {iRengFac.NumDoc} indicada en el renglón {iRengFac.RengNum} se encuentra procesada [Saldo=0.00]."); } if (factura.Saldo < iRengFac.RengNeto) { throw new ArgumentException($"La factura {iRengFac.NumDoc} tiene un saldo menor al monto indicado en el renglón {iRengFac.RengNum}."); } if (factura.DetaFacturaVenta.FirstOrDefault(ra => ra.CoArt.Trim() == iRengFac.CoArt.Trim()) == null) { throw new ArgumentException($"El artículo {iRengFac.CoArt.Trim()} indicado en el renglón {iRengFac.RengNum} no se encontró en la factura."); } #endregion #region Verificar articulo Art articulo = new ArticulosRepositorio().Find(iRengFac.CoArt, empresaDB); if (articulo == null) { throw new ArgumentException($"El artículo {iRengFac.CoArt.Trim()} suministrado en el renglón {iRengFac.RengNum} no existe."); } #endregion #region Verificar almacen SubAlma almacen = db.SubAlma.FirstOrDefault(a => a.CoSub == iRengFac.CoAlma); if (almacen == null) { throw new ArgumentException($"El almacén {iRengFac.CoAlma.Trim()} suministrado en el renglón {iRengFac.RengNum} no existe."); } else { if (almacen.CoAlma.Trim() != obj.CoSucu.Trim()) { throw new ArgumentException($"El almacén {iRengFac.CoAlma.Trim()} suministrado en el renglón {iRengFac.RengNum} no está permitido utilizarlo en la sucursal suministrada {obj.CoSucu.Trim()}."); } if (almacen.Noventa) { throw new ArgumentException($"El almacén {iRengFac.CoAlma.Trim()} suministrado en el renglón {iRengFac.RengNum} no está permitido utilizarlo en el módulo de facturas."); } } #endregion #region Verificar unidad primaria Unidades unidad = db.Unidades.FirstOrDefault(u => u.CoUni == iRengFac.UniVenta); if (unidad == null) { throw new ArgumentException($"La unidad de venta {iRengFac.UniVenta.Trim()} suministrada en el renglón {iRengFac.RengNum} no existe."); } #endregion } #endregion }
public Response Save(EncabNotRec item, string empresaDB) { try { using var db = new ProfitAdmin2K8(conn.GetDbContextOptions(empresaDB)); Utilitarios utilitarios = new Utilitarios(); #region Buscar consecutivo var numeroNRecepcion = utilitarios.BuscarConsecutivo("NREC", item.CoSucu, empresaDB); #endregion if (numeroNRecepcion > 0) { #region Calcular exento para el DisCen decimal TotalExento = (decimal)(from exento in item.DetaNotaRecepcion 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 Encabezado factura NotRec NotaRec = new NotRec { #region Campos FactNum = numeroNRecepcion, Factura = item.Factura, Contrib = item.Contrib, DisCen = item.DisCen, Nombre = item.Nombre, Rif = item.Rif, Nit = item.Nit, Status = item.Status, Comentario = item.Comentario, 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, CtaContab = item.CtaContab, 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, CoSucu = item.CoSucu, Rowguid = item.Rowguid, MonIlc = item.MonIlc, Otros1 = item.Otros1, Otros2 = item.Otros2, Otros3 = item.Otros3, Aux01 = item.Aux01, Aux02 = item.Aux02, Salestax = item.Salestax, Origen = item.Origen, OrigenD = item.OrigenD, StaProd = item.StaProd, Telefono = item.Telefono #endregion }; db.Entry(NotaRec).State = EntityState.Added; #endregion #region Renglones List <RengNdr> Renglones = new List <RengNdr>(); foreach (var i in item.DetaNotaRecepcion) { RengNdr reng_ndr = new RengNdr { #region Campos FactNum = numeroNRecepcion, RengNum = i.RengNum, DisCen = i.DisCen, 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, TotalDev = i.TotalDev, MontoDev = i.MontoDev, PrecVta2 = i.PrecVta2, Anulado = i.Anulado, DesArt = i.DesArt, Seleccion = i.Seleccion, CantImp = i.CantImp, Comentario = i.Comentario, Rowguid = i.Rowguid, TotalUni = i.TotalUni, MonIlc = i.MonIlc, Otros = i.Otros, NroLote = i.NroLote, FecLote = i.FecLote, Pendiente2 = i.Pendiente2, TipoDoc2 = i.TipoDoc2, RengDoc2 = i.RengDoc2, NumDoc2 = i.NumDoc2, CoAlma2 = i.CoAlma2, Aux01 = i.Aux01, Aux02 = i.Aux02, CantProd = i.CantProd, ImpProd = i.ImpProd #endregion }; Renglones.Add(reng_ndr); } #region Actualizacion de stock foreach (var i in Renglones) { utilitarios.ActualizarStockArticuloAlmacen(i.CoArt, i.CoAlma, i.TotalArt, true, empresaDB); db.Entry(i).State = EntityState.Added; #region Actualización de costos en articulo #region Valor de la tasa OM parametrizada. decimal tasa = db.Moneda.FirstOrDefault(m => m.CoMone.Trim() == db.ParEmp.FirstOrDefault().MoneArt.Trim()).Cambio; #endregion Art art = db.Art.FirstOrDefault(a => a.CoArt.Trim() == i.CoArt.Trim()); art.CosUnAn = art.UltCosUn; art.FecCosAn = art.FecUltCo; art.UltCosUn = i.PrecVta; art.FecUltCo = DateTime.Now; art.UltCosDo = art.UltCosOm; art.FecCosDo = art.FecUltOm; art.UltCosOm = i.PrecVta / tasa; art.FecUltOm = DateTime.Now; art.CosProUn = i.PrecVta; art.FecCosPr = DateTime.Now; art.CosProOm = i.PrecVta / tasa; art.FecProOm = DateTime.Now; art.CoUsMo = item.CoUsMo; art.FeUsMo = DateTime.Now; db.Entry(art).State = EntityState.Modified; #endregion } #endregion #endregion db.SaveChanges(); #region Actualizar consecutivo utilitarios.ActualizarConsecutivo(numeroNRecepcion, "NREC", item.CoSucu, empresaDB); #endregion return(new Response { Status = "OK", Message = "Transacción realizada con éxito.", FacturaID = numeroNRecepcion.ToString() }); } else { throw new ArgumentException("No se encontró el correlativo configurado para 'NREC'."); } } catch (Exception ex) { return(new Response { Status = "ERROR", Message = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message }); } }
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 }); } }