public override void Crear() { base.Crear(); this.Fecha = this.Connection.ServerDateTime; Facturas = new ColeccionComprobanteImporte(); if (this.Tipo == null) this.Tipo = Lbl.Comprobantes.Tipo.TodosPorLetra["RC"]; this.PV = Lfx.Workspace.Master.CurrentConfig.ReadGlobalSetting<int>("Sistema.Documentos." + this.Tipo.Nomenclatura + ".PV", Lfx.Workspace.Master.CurrentConfig.Empresa.SucursalActual); this.Vendedor = new Personas.Persona(this.Connection, Lbl.Sys.Config.Actual.UsuarioConectado.Id); }
/// <summary> /// Cancela el importe impago de los comprobantes en listaComprob y si sobra continúa cancelando en los comprobantes /// más viejos que tengan saldo pendiente. Si continúa sobrando, deja el saldo a favor en cta. cte. /// </summary> /// <param name="cliente">El cliente.</param> /// <param name="listaComprob">La lista de comprobantes en los cuales cancelar saldo impago.</param> /// <param name="comprob">El comprobante que está cancelando saldos. Puede ser un recibo o una NC.</param> /// <param name="importe">El importe total a cancelar. Puede ser negativo para hacerlo en contra del cliente.</param> public static decimal CancelarImpagos(Lbl.Personas.Persona cliente, ColeccionComprobanteImporte listaComprob, Lbl.Comprobantes.Comprobante comprob, decimal importe) { decimal TotalACancelar = Math.Abs(importe); if (listaComprob != null && listaComprob.Count > 0) { // Si hay una lista de facturas, las cancelo foreach (ComprobanteImporte CompImp in listaComprob) { // Calculo cuanto queda por cancelar en esta factura decimal ImportePendiente = CompImp.Comprobante.Total - CompImp.Comprobante.ImporteCancelado; // Intento cancelar todo decimal Cancelando = ImportePendiente; // Si se acabó la plata, hago un pago parcial if (Cancelando > TotalACancelar) { Cancelando = TotalACancelar; } // Si alcanzo a cancelar algo, lo asiento if (Cancelando > 0) { CompImp.Comprobante.CancelarImporte(Cancelando, comprob); } CompImp.Importe = Cancelando; TotalACancelar -= Cancelando; if (TotalACancelar <= 0) { break; } } } if (TotalACancelar > 0) { // Si queda más saldo, sigo buscando facturas a cancelar qGen.Select SelFacConSaldo = new qGen.Select("comprob"); SelFacConSaldo.WhereClause = new qGen.Where(); SelFacConSaldo.WhereClause.AddWithValue("impresa", qGen.ComparisonOperators.NotEqual, 0); SelFacConSaldo.WhereClause.AddWithValue("anulada", 0); SelFacConSaldo.WhereClause.AddWithValue("numero", qGen.ComparisonOperators.GreaterThan, 0); SelFacConSaldo.WhereClause.AddWithValue("id_formapago", qGen.ComparisonOperators.In, new int[] { 1, 3, 99 }); SelFacConSaldo.WhereClause.AddWithValue("cancelado", qGen.ComparisonOperators.LessThan, new qGen.SqlExpression("total")); SelFacConSaldo.WhereClause.AddWithValue("id_cliente", cliente.Id); SelFacConSaldo.WhereClause.AddWithValue("tipo_fac", qGen.ComparisonOperators.In, new string[] { "FA", "FB", "FC", "FE", "FM", "NDA", "NDB", "NDC", "NDE", "NDM" }); if (importe > 0) { // Cancelo facturas y ND regulares SelFacConSaldo.WhereClause.AddWithValue("compra", 0); } else { // Cancelo facturas y de compra SelFacConSaldo.WhereClause.AddWithValue("compra", qGen.ComparisonOperators.NotEqual, 0); } SelFacConSaldo.Order = "id_comprob"; using (System.Data.DataTable FacturasConSaldo = cliente.Connection.Select(SelFacConSaldo)) { foreach (System.Data.DataRow Factura in FacturasConSaldo.Rows) { Lbl.Comprobantes.ComprobanteConArticulos Fact = new ComprobanteConArticulos(cliente.Connection, (Lfx.Data.Row)Factura); decimal SaldoFactura = Fact.ImporteImpago; decimal ImporteASaldar = SaldoFactura; if (ImporteASaldar > TotalACancelar) { ImporteASaldar = TotalACancelar; } listaComprob.AddWithValue(Fact, ImporteASaldar); Fact.CancelarImporte(ImporteASaldar, comprob); TotalACancelar -= ImporteASaldar; if (TotalACancelar <= 0) { break; } } } } /* if (TotalACancelar > 0) { * Lbl.Cajas.Concepto Conc; * if (comprob is Recibo) * Conc = ((Recibo)comprob).Concepto; * else * Conc = Lbl.Cajas.Concepto.IngresosPorFacturacion; * cliente.CuentaCorriente.Movimiento(true, Conc, "Saldo s/" + comprob.ToString(), TotalACancelar * DireccionCtaCte, comprob.Obs, comprob as Lbl.Comprobantes.ComprobanteConArticulos, comprob as Lbl.Comprobantes.Recibo, null); * cliente.CuentaCorriente.CancelarComprobantesConSaldo(TotalACancelar * -DireccionCtaCte, true); * TotalACancelar = 0; * } */ // Devuelvo el sobrante return(TotalACancelar); }