示例#1
0
        public static Lbl.Impresion.ClasesImpresora ObtenerClaseImpresora(Lbl.Comprobantes.Comprobante comprobante)
        {
            Lbl.Impresion.ClasesImpresora Res;
            if (Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero.ContainsKey(comprobante.PV))
            {
                switch (Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Tipo)
                {
                case Lbl.Comprobantes.TipoPv.Talonario:
                    Res = Lbl.Impresion.ClasesImpresora.Papel;
                    break;

                case Lbl.Comprobantes.TipoPv.ControladorFiscal:
                    Res = Lbl.Impresion.ClasesImpresora.FiscalAfip;
                    break;

                case Lbl.Comprobantes.TipoPv.ElectronicoAfip:
                    Res = Lbl.Impresion.ClasesImpresora.ElectronicaAfip;
                    break;

                case Lbl.Comprobantes.TipoPv.Inactivo:
                    throw new ApplicationException("No se puede imprimir en un PV inactivo.");

                default:
                    throw new ApplicationException("Tipo de PV no reconocido " + Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Tipo.ToString());
                }
            }
            else
            {
                Res = Lbl.Impresion.ClasesImpresora.Papel;
            }

            return(Res);
        }
示例#2
0
        public static int ProximoNumero(Lbl.Comprobantes.Comprobante comprobante)
        {
            string TipoReal = "";

            // Las notas de crédito y débito comparten la numeración de las comprob
            switch (comprobante.Tipo.Nomenclatura)
            {
            case "A":
            case "FA":
            case "NCA":
            case "NDA":
                TipoReal = "'FA', 'NCA', 'NDA'";
                break;

            case "B":
            case "FB":
            case "NCB":
            case "NDB":
                TipoReal = "'FB', 'NCB', 'NDB'";
                break;

            case "C":
            case "FC":
            case "NCC":
            case "NDC":
                TipoReal = "'FC', 'NCC', 'NDC'";
                break;

            case "E":
            case "FE":
            case "NCE":
            case "NDE":
                TipoReal = "'FE', 'NCE', 'NDE'";
                break;

            case "M":
            case "FM":
            case "NCM":
            case "NDM":
                TipoReal = "'FM', 'NCM', 'NDM'";
                break;

            default:
                TipoReal = "'" + comprobante.Tipo.Nomenclatura + "'";
                break;
            }

            string SqlWhere = "pv=" + comprobante.PV.ToString() + " AND tipo_fac IN (" + TipoReal + ")";

            if (comprobante is Lbl.Comprobantes.ComprobanteConArticulos)
            {
                // Si es comprobante con artículos, agrego una condicion más para los comprobantes de compra
                SqlWhere += " AND compra=" + (((Lbl.Comprobantes.ComprobanteConArticulos)(comprobante)).Compra ? "1" : "0");
            }

            return(comprobante.Connection.FieldInt("SELECT MAX(numero) FROM " + comprobante.TablaDatos + " WHERE " + SqlWhere) + 1);
        }
示例#3
0
 public override void AfterSave(System.Data.IDbTransaction transaction)
 {
     Lbl.Comprobantes.Comprobante Compr = this.Elemento as Lbl.Comprobantes.Comprobante;
     if (Compr != null && Compr.Tipo != null && Compr.Tipo.ImprimirAlGuardar)
     {
         Lazaro.Impresion.Impresor Impr = Lazaro.Impresion.Instanciador.InstanciarImpresor(Compr, transaction);
         Impr.Imprimir();
     }
 }
示例#4
0
        public static Lbl.Impresion.Impresora ObtenerImpresora(Lbl.Comprobantes.Comprobante comprobante)
        {
            // Primero busco una una impresora específica para este comprobante
            Lbl.Impresion.Impresora Res = comprobante.ObtenerImpresora();

            // Si no hay, devuelvo la impresora para este tipo de elemento
            if (Res == null)
            {
                // TODO: return base.ObtenerImpresora();
                return(null);
            }
            else
            {
                return(Res);
            }
        }
示例#5
0
 public static Lbl.Impresion.Plantilla ObtenerPlantilla(Lbl.Comprobantes.Comprobante comprobante)
 {
     if (Lbl.Impresion.Plantilla.TodasPorCodigo.ContainsKey(comprobante.Tipo.Nomenclatura))
     {
         // Busco una plantilla para el tipo exacto
         return(Lbl.Impresion.Plantilla.TodasPorCodigo[comprobante.Tipo.Nomenclatura]);
     }
     else if (comprobante.Tipo.EsFacturaNCoND && Lbl.Impresion.Plantilla.TodasPorCodigo.ContainsKey("F" + comprobante.Tipo.Letra))
     {
         // En caso de NC y ND, pruebo utilizando la plantilla de facturas
         return(Lbl.Impresion.Plantilla.TodasPorCodigo["F" + comprobante.Tipo.Letra]);
     }
     else
     {
         // TODO: return base.ObtenerPlantilla();
         return(null);
     }
 }
示例#6
0
文件: Editar.cs 项目: njmube/lazaro
 public override void AfterSave(System.Data.IDbTransaction transaction)
 {
     Lbl.Comprobantes.Comprobante Comprob = this.Elemento as Lbl.Comprobantes.Comprobante;
     if (Comprob != null && Comprob.Tipo != null && Comprob.Tipo.ImprimirAlGuardar)
     {
         if (transaction == null)
         {
             using (transaction = this.Connection.BeginTransaction()) {
                 var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction);
                 Controlador.Imprimir(Comprob, null);
                 transaction.Commit();
                 transaction = null;
             }
         }
         else
         {
             var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction);
             Controlador.Imprimir(Comprob, null);
         }
     }
 }
示例#7
0
        public static decimal DescancelarImpagos(Lbl.Personas.Persona cliente, Lbl.Comprobantes.ColeccionComprobanteImporte listaComprob, Lbl.Comprobantes.Comprobante comprob, decimal importe)
        {
            // Doy los comprob por cancelados
            decimal TotalACancelar = Math.Abs(importe);

            //"Descancelo" comprob
            if (listaComprob != null && listaComprob.Count > 0)
            {
                // Si hay una lista de comprob, los descancelo
                foreach (ComprobanteImporte CompImp in listaComprob)
                {
                    // Intento descancelar todo
                    decimal Cancelando = CompImp.Importe;

                    // Si mes demasiado, hago un pago parcial
                    if (Cancelando > CompImp.Comprobante.ImporteCancelado)
                    {
                        Cancelando = CompImp.Comprobante.ImporteCancelado;
                    }

                    // 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.DescancelarImporte(Cancelando, comprob);
                    }

                    TotalACancelar = TotalACancelar - Cancelando;
                    if (TotalACancelar == 0)
                    {
                        break;
                    }
                }
            }

            if (TotalACancelar > 0)
            {
                // Si queda más saldo, sigo buscando facturas a descancelar
                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.GreaterThan, 0);
                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 DESC";
                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.ImporteCancelado;
                        decimal ImporteASaldar = SaldoFactura;

                        if (ImporteASaldar > TotalACancelar)
                        {
                            ImporteASaldar = TotalACancelar;
                        }

                        Fact.DescancelarImporte(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.AjustesYMovimientos;
             *      cliente.CuentaCorriente.Movimiento(true, Conc, "Anulación de " + comprob.ToString(), TotalACancelar * DireccionCtaCte, comprob.Obs, comprob as Lbl.Comprobantes.ComprobanteConArticulos, comprob as Lbl.Comprobantes.Recibo, null);
             *      TotalACancelar = 0;
             * } */

            // Devuelvo el sobrante
            return(TotalACancelar);
        }
示例#8
0
        public Lfx.Types.OperationResult Imprimir(Lbl.Comprobantes.Comprobante comprobante, Lbl.Impresion.Impresora impresora)
        {
            if (impresora == null)
            {
                impresora = Util.Comprobantes.Impresion.ObtenerImpresora(comprobante);
            }

            var Reimpresion = comprobante.Impreso;
            var ClaseImpr   = Util.Comprobantes.Impresion.ObtenerClaseImpresora(comprobante);

            if (ClaseImpr != Lbl.Impresion.ClasesImpresora.FiscalAfip && ClaseImpr != Lbl.Impresion.ClasesImpresora.ElectronicaAfip && impresora != null)
            {
                ClaseImpr = impresora.Clase;

                if (comprobante.Tipo.EsFacturaNCoND && impresora.EsVistaPrevia)
                {
                    return(new Lfx.Types.FailureOperationResult("Este tipo de comprobante no puede ser previsualizado"));
                }
            }

            Lfx.Types.OperationResult ResultadoImprimir;
            Lbl.Comprobantes.ComprobanteConArticulos ComprobConArt = comprobante as Lbl.Comprobantes.ComprobanteConArticulos;

            switch (ClaseImpr)
            {
            case Lbl.Impresion.ClasesImpresora.ElectronicaAfip:
                if (ComprobConArt == null)
                {
                    throw new InvalidOperationException("El comprobante no es una factura");
                }
                if (Reimpresion)
                {
                    this.GenerarPdf(ComprobConArt);
                    return(new Lfx.Types.SuccessOperationResult());
                }
                else
                {
                    ResultadoImprimir = this.ImprimirFacturaElectronicaAfip(comprobante as Lbl.Comprobantes.ComprobanteConArticulos);
                    if (ResultadoImprimir.Success == true)
                    {
                        //Resto el stock si corresponde
                        ComprobConArt.MoverExistencias(false);

                        // Asentar pagos si corresponde
                        ComprobConArt.AsentarPago(false);
                    }
                    return(ResultadoImprimir);
                }

            case Lbl.Impresion.ClasesImpresora.FiscalAfip:
                if (Reimpresion)
                {
                    return(new Lfx.Types.FailureOperationResult("No se permiten reimpresiones fiscales"));
                }

                // Primero hago un COMMIT, porque si no el otro proceso no va a poder hacer movimientos
                if (this.Transaction != null)
                {
                    this.Transaction.Commit();
                    this.Transaction.Dispose();
                    this.Transaction = null;
                }

                // Lo mando a imprimir al servidor fiscal
                string Estacion = null;
                if (ClaseImpr == Lbl.Impresion.ClasesImpresora.FiscalAfip)
                {
                    Estacion = Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Estacion;
                }

                if (Estacion == null && impresora != null)
                {
                    Estacion = impresora.Estacion;
                }

                if (Estacion != null)
                {
                    Lfx.Workspace.Master.DefaultScheduler.AddTask("IMPRIMIR " + comprobante.Id.ToString(), "fiscal" + comprobante.PV.ToString(), Estacion);
                }
                else
                {
                    throw new Exception("No se ha definido el equipo al cual está conectada la impresora remota");
                }

                //Espero hasta que la factura está impresa o hasta que pasen X segundos
                System.DateTime FinEsperaFiscal = System.DateTime.Now.AddSeconds(90);
                int             NumeroFiscal    = 0;
                while (System.DateTime.Now < FinEsperaFiscal && NumeroFiscal == 0)
                {
                    System.Threading.Thread.Sleep(1000);
                    NumeroFiscal = comprobante.Connection.FieldInt("SELECT numero FROM comprob WHERE impresa<>0 AND id_comprob=" + comprobante.Id.ToString());
                }
                if (NumeroFiscal == 0)
                {
                    // Llegó el fin del tiempo de espera y no imprimió
                    return(new Lfx.Types.FailureOperationResult("Se superó el tiempo de espera para recibir respuesta del Servidor Fiscal."));
                }
                else
                {
                    comprobante.Cargar();
                    // Tengo número de factura. Imprimió Ok
                    return(new Lfx.Types.SuccessOperationResult());
                }

            case Lbl.Impresion.ClasesImpresora.Nula:
                if (Reimpresion == false && comprobante.Tipo.NumerarAlImprimir)
                {
                    new Lbl.Comprobantes.Numerador(comprobante).Numerar(true);
                }

                if (Reimpresion == false)
                {
                    //Resto el stock si corresponde
                    ComprobConArt.MoverExistencias(false);

                    // Asentar pagos si corresponde
                    ComprobConArt.AsentarPago(false);
                }

                return(new Lfx.Types.SuccessOperationResult());

            case Lbl.Impresion.ClasesImpresora.Papel:
                if (impresora == null || impresora.EsLocal)
                {
                    var Impresor = Lazaro.Base.Util.Impresion.Instanciador.InstanciarImpresor(comprobante, this.Transaction);
                    return(Impresor.Imprimir());
                }
                else
                {
                    if (Reimpresion)
                    {
                        throw new Lfx.Types.DomainException("No se permiten reimpresiones remotas");
                    }

                    // Primero hago un COMMIT, porque si no el otro proceso no va a poder hacer movimientos
                    if (this.Transaction != null)
                    {
                        this.Transaction.Commit();
                        this.Transaction.Dispose();
                        this.Transaction = null;
                    }

                    // Lo mando a imprimir a la estación remota
                    Lfx.Workspace.Master.DefaultScheduler.AddTask("IMPRIMIR " + comprobante.GetType().ToString() + " " + comprobante.Id.ToString() + " EN " + impresora.Dispositivo, "lazaro", impresora.Estacion);

                    if (Reimpresion == false)
                    {
                        //Espero hasta que la factura está impresa o hasta que pasen X segundos
                        System.DateTime FinEspera = System.DateTime.Now.AddSeconds(90);
                        int             Impreso   = 0;
                        while (System.DateTime.Now < FinEspera && Impreso == 0)
                        {
                            System.Threading.Thread.Sleep(1000);
                            Impreso = comprobante.Connection.FieldInt("SELECT impresa FROM comprob WHERE impresa<>0 AND id_comprob=" + comprobante.Id.ToString());
                        }
                        if (Impreso == 0)
                        {
                            // Llegó el fin del tiempo de espera y no imprimió
                            return(new Lfx.Types.FailureOperationResult("Se superó el tiempo de espera para recibir respuesta del sistema remoto."));
                        }
                        else
                        {
                            comprobante.Cargar();

                            // Tengo número de factura. Imprimió Ok
                            return(new Lfx.Types.SuccessOperationResult());
                        }
                    }

                    return(new Lfx.Types.SuccessOperationResult());
                }

            default:
                throw new NotImplementedException("No se reconoce el tipo de impresora " + ClaseImpr.ToString());
            }
        }
示例#9
0
 public GeneradorManual(Lbl.Comprobantes.Comprobante comprobante)
     : base(comprobante)
 {
 }
示例#10
0
                /// <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;
                }
示例#11
0
 public Numerador(Lbl.Comprobantes.Comprobante comprob)
 {
     this.Comprob = comprob;
 }
示例#12
0
 public Generador(Lbl.Comprobantes.Comprobante comprobante)
 {
     this.Comprobante = comprobante;
 }