Beispiel #1
0
        private void CrearReciboParaEstaFactura()
        {
            Lbl.Comprobantes.ComprobanteConArticulos Factura = this.Elemento as Lbl.Comprobantes.ComprobanteConArticulos;
            Lbl.Comprobantes.ReciboDeCobro           Recibo  = new Lbl.Comprobantes.ReciboDeCobro(Lfx.Workspace.Master.GetNewConnection("Nuevo recibo para " + Factura.ToString()) as Lfx.Data.Connection);
            Recibo.Crear();
            Recibo.Facturas.AddWithValue(Factura, Factura.ImporteImpago);
            Recibo.Cliente = Factura.Cliente;

            Recibo.Concepto      = Lbl.Cajas.Concepto.IngresosPorFacturacion;
            Recibo.ConceptoTexto = "Cancelación de " + Factura.ToString();

            Lfc.FormularioEdicion NuevoRecibo = Lfc.Instanciador.InstanciarFormularioEdicion(Recibo);
            NuevoRecibo.MdiParent = this.ParentForm.MdiParent;
            NuevoRecibo.Show();
        }
Beispiel #2
0
        /// <summary>
        /// Generar un PDF a partir de un comprobante y guardarlo en la carpeta predeterminada de comprobantes.
        /// </summary>
        public void GenerarPdf(Lbl.Comprobantes.ComprobanteConArticulos comprobante)
        {
            var Generador = new Util.Comprobantes.GeneradorPdf(comprobante);

            var VariantePv = Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Variante;

            if (VariantePv > 0)
            {
                Generador.Variante = (Util.Comprobantes.Variantes)VariantePv;
            }

            var Carpeta = System.IO.Path.Combine(Lbl.Sys.Config.CarpetaEmpresa, "Comprobantes", "PV" + comprobante.PV.ToString());

            Lfx.Environment.Folders.EnsurePathExists(Carpeta);

            Generador.GenerarYGuardar(System.IO.Path.Combine(Carpeta, comprobante.ToString() + ".pdf"));
        }
Beispiel #3
0
        private Lfx.Types.OperationResult EditarPago()
        {
            Lbl.Comprobantes.ComprobanteConArticulos Factura = this.Elemento as Lbl.Comprobantes.ComprobanteConArticulos;

            if (Factura.ImporteCancelado >= Factura.Total)
            {
                return(new Lfx.Types.FailureOperationResult("Este comprobante ya fue cancelado en su totalidad."));
            }

            if (Factura.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.Efectivo)
            {
                using (IDbTransaction Trans = Factura.Connection.BeginTransaction()) {
                    Factura.AsentarPago(false);
                    Factura.MoverExistencias(false);
                    Trans.Commit();
                }
                this.PuedeEditarPago = false;
            }
            else if (Factura.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.CuentaCorriente)
            {
                CrearReciboParaEstaFactura();
            }
            else
            {
                using (Comprobantes.Recibos.EditarCobro FormularioEditarPago = new Comprobantes.Recibos.EditarCobro()) {
                    FormularioEditarPago.Cobro.FromCobro(new Lbl.Comprobantes.Cobro(this.Connection, Factura.FormaDePago));
                    FormularioEditarPago.Cobro.FormaDePagoEditable = true;
                    FormularioEditarPago.Cobro.Importe             = Factura.Total;
                    FormularioEditarPago.Cobro.ImporteVisible      = true;
                    FormularioEditarPago.Cobro.ImporteEditable     = false;
                    if (FormularioEditarPago.ShowDialog() == DialogResult.OK)
                    {
                        Lbl.Comprobantes.Cobro MiCobro = FormularioEditarPago.Cobro.ToCobro(Factura.Connection);
                        if (MiCobro.FormaDePago.Id != Factura.FormaDePago.Id)
                        {
                            // Tengo que actualizar la forma de pago
                            using (IDbTransaction Trans = Factura.Connection.BeginTransaction()) {
                                Factura.FormaDePago       = MiCobro.FormaDePago;
                                EntradaFormaPago.Elemento = MiCobro;
                                Factura.Connection.FieldInt("UPDATE comprob SET id_formapago=" + MiCobro.FormaDePago.Id.ToString() + " WHERE id_comprob=" + Factura.Id.ToString());
                                if (MiCobro.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.CuentaCorriente)
                                {
                                    // Si la nueva forma de pago es cta. cte., asiento el saldo
                                    // Y uso saldo a favor, si lo hay
                                    decimal Saldo = Factura.Cliente.CuentaCorriente.ObtenerSaldo(true);
                                    Factura.Cliente.CuentaCorriente.AsentarMovimiento(true,
                                                                                      Lbl.Cajas.Concepto.IngresosPorFacturacion,
                                                                                      "Saldo a Cta. Cte. s/" + Factura.ToString(),
                                                                                      Factura.ImporteImpago,
                                                                                      null,
                                                                                      Factura,
                                                                                      null,
                                                                                      null);
                                    if (Saldo < 0)
                                    {
                                        Saldo = Math.Abs(Saldo);
                                        if (Saldo > Factura.Total)
                                        {
                                            Factura.CancelarImporte(Factura.Total, null);
                                        }
                                        else
                                        {
                                            Factura.CancelarImporte(Saldo, null);
                                        }
                                    }
                                }
                                Trans.Commit();
                            }
                        }
                        switch (Factura.FormaDePago.Tipo)
                        {
                        case Lbl.Pagos.TiposFormasDePago.Efectivo:
                            using (IDbTransaction TransEfe = Factura.Connection.BeginTransaction()) {
                                Lbl.Cajas.Caja CajaDiaria = new Lbl.Cajas.Caja(Factura.Connection, Lfx.Workspace.Master.CurrentConfig.Empresa.CajaDiaria);
                                CajaDiaria.Movimiento(true, Lbl.Cajas.Concepto.IngresosPorFacturacion, Factura.ToString(), Factura.Cliente, Factura.ImporteImpago, Factura.Obs, Factura, null, null);
                                Factura.CancelarImporte(Factura.Total, null);
                                TransEfe.Commit();
                            }
                            break;

                        case Lbl.Pagos.TiposFormasDePago.CuentaCorriente:
                            CrearReciboParaEstaFactura();
                            break;

                        case Lbl.Pagos.TiposFormasDePago.ChequeTerceros:
                            using (IDbTransaction TransCheTer = Factura.Connection.BeginTransaction()) {
                                Lbl.Bancos.Cheque Cheque = MiCobro.Cheque;
                                Cheque.Concepto      = Lbl.Cajas.Concepto.IngresosPorFacturacion;
                                Cheque.ConceptoTexto = "Cobro s/" + this.Elemento.ToString();
                                Cheque.Factura       = Factura;
                                Cheque.Guardar();
                                Factura.CancelarImporte(Factura.Total, null);
                                TransCheTer.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Tarjeta:
                            using (IDbTransaction TransTarj = Factura.Connection.BeginTransaction()) {
                                Lbl.Pagos.Cupon CuponCredito = MiCobro.Cupon;
                                CuponCredito.Concepto      = Lbl.Cajas.Concepto.IngresosPorFacturacion;
                                CuponCredito.ConceptoTexto = "Cobro s/" + Factura.ToString();

                                if (EntradaVendedor.ValueInt > 0)
                                {
                                    CuponCredito.Vendedor = new Lbl.Personas.Persona(Factura.Connection, EntradaVendedor.ValueInt);
                                }

                                CuponCredito.Factura = Factura;
                                CuponCredito.Guardar();

                                Factura.CancelarImporte(Factura.Total, null);
                                TransTarj.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Caja:
                            using (IDbTransaction TransCaja = Factura.Connection.BeginTransaction()) {
                                Lbl.Cajas.Caja CajaDeposito = MiCobro.CajaDestino;
                                CajaDeposito.Movimiento(true, Lbl.Cajas.Concepto.IngresosPorFacturacion, "Cobro s/" + Factura.ToString(), Factura.Cliente, MiCobro.Importe, MiCobro.Obs, Factura, null, null);
                                Factura.CancelarImporte(Factura.Total, null);
                                TransCaja.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        default:
                            throw new NotImplementedException("No se reconoce la forma de pago " + Factura.FormaDePago.Tipo.ToString());
                        }
                    }
                    else
                    {
                        return(new Lfx.Types.SuccessOperationResult());
                    }
                }
                this.PuedeEditarPago = false;
            }

            return(new Lfx.Types.SuccessOperationResult());
        }
Beispiel #4
0
        public override void AfterPrint()
        {
            PuedeEditarPago = this.EsCancelable();

            Lbl.Comprobantes.ComprobanteConArticulos Comprob = this.Elemento as Lbl.Comprobantes.ComprobanteConArticulos;

            if (Comprob.Impreso)
            {
                if (Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero.ContainsKey(Comprob.PV))
                {
                    var Pv = Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[Comprob.PV];
                    if (Pv.Tipo == Lbl.Comprobantes.TipoPv.ElectronicoAfip)
                    {
                        // Es un punto de venta electrónico... abro el PDF generado
                        var Carpeta = System.IO.Path.Combine(Lbl.Sys.Config.CarpetaEmpresa, "Comprobantes", "PV" + Comprob.PV.ToString());
                        System.Diagnostics.Process.Start(System.IO.Path.Combine(Carpeta, Comprob.ToString() + ".pdf"));
                    }
                }

                switch (Comprob.FormaDePago.Tipo)
                {
                case Lbl.Pagos.TiposFormasDePago.Efectivo:
                    //El pago lo asentó la rutina de impresión
                    //Yo sólo muestro la ventanita de calcular el cambio
                    Comprobantes.PagoVuelto FormularioVuelto = new Comprobantes.PagoVuelto();
                    FormularioVuelto.Total = Lfx.Types.Parsing.ParseCurrency(EntradaTotal.Text);
                    FormularioVuelto.ShowDialog();
                    break;

                case Lbl.Pagos.TiposFormasDePago.ChequePropio:
                case Lbl.Pagos.TiposFormasDePago.ChequeTerceros:
                case Lbl.Pagos.TiposFormasDePago.Tarjeta:
                case Lbl.Pagos.TiposFormasDePago.OtroValor:
                case Lbl.Pagos.TiposFormasDePago.Caja:
                    if (this.EsCancelable())
                    {
                        EditarPago();
                    }
                    break;
                }
            }
        }
Beispiel #5
0
        public void MostrarFacturas()
        {
            ListaFacturas.BeginUpdate();
            ListaFacturas.Items.Clear();
            Lbl.Comprobantes.Recibo Rec = this.Elemento as Lbl.Comprobantes.Recibo;

            foreach (Lbl.Comprobantes.ComprobanteImporte CompImp in Rec.Facturas)
            {
                Lbl.Comprobantes.ComprobanteConArticulos Fc = CompImp.Comprobante;
                ListViewItem AgregarFactura = ListaFacturas.Items.Add(Fc.GetHashCode().ToString());
                AgregarFactura.SubItems.Add(new ListViewItem.ListViewSubItem(AgregarFactura, Fc.ToString()));
                AgregarFactura.SubItems.Add(new ListViewItem.ListViewSubItem(AgregarFactura, Lfx.Types.Formatting.FormatDate(Fc.Fecha)));
                AgregarFactura.SubItems.Add(new ListViewItem.ListViewSubItem(AgregarFactura, Lfx.Types.Formatting.FormatCurrency(Fc.Total, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales)));
                AgregarFactura.SubItems.Add(new ListViewItem.ListViewSubItem(AgregarFactura, Lfx.Types.Formatting.FormatCurrency(Fc.Total - Fc.ImporteCancelado, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales)));
            }

            LabelAgregarFacturas.Visible = ListaFacturas.Items.Count == 0 && this.Elemento.Existe == false;
            BotonQuitarFactura.Visible   = ListaFacturas.Items.Count > 0;

            if (ListaFacturas.Items.Count > 0 && ListaFacturas.SelectedItems.Count == 0)
            {
                ListaFacturas.Items[ListaFacturas.Items.Count - 1].Selected = true;
                ListaFacturas.Items[ListaFacturas.Items.Count - 1].Focused  = true;
            }

            EtiquetaFacturasImporte.Text = Lfx.Types.Formatting.FormatCurrency(Rec.Facturas.ImporteImpago, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales);

            ListaFacturas.EndUpdate();
        }
Beispiel #6
0
        public override string ObtenerValorCampo(string nombreCampo, string formato)
        {
            switch (nombreCampo.ToUpperInvariant())
            {
            case "CLIENTE":
            case "CLIENTE.NOMBRE":
                return(this.Comprobante.Cliente.ToString());

            case "LOCALIDAD":
            case "LOCALIDAD.NOMBRE":
            case "CLIENTE.LOCALIDAD":
            case "CLIENTE.LOCALIDAD.NOMBRE":
                if (this.Comprobante.Cliente.Localidad == null)
                {
                    return("");
                }
                else
                {
                    return(this.Comprobante.Cliente.Localidad.ToString());
                }

            case "DOMICILIO":
            case "CLIENTE.DOMICILIO":
                if (this.Comprobante.Cliente.Domicilio != null && this.Comprobante.Cliente.Domicilio.Length > 0)
                {
                    return(this.Comprobante.Cliente.Domicilio);
                }
                else
                {
                    return(this.Comprobante.Cliente.DomicilioLaboral);
                }

            case "CLIENTE.DOCUMENTO":
                if (this.Comprobante.Cliente.ClaveTributaria != null)
                {
                    return(this.Comprobante.Cliente.ClaveTributaria.ToString());
                }
                else
                {
                    return(this.Comprobante.Cliente.NumeroDocumento);
                }

            case "CUIT":
            case "CLIENTE.CUIT":
                if (this.Comprobante.Cliente.ClaveTributaria != null)
                {
                    return(this.Comprobante.Cliente.ClaveTributaria.ToString());
                }
                else
                {
                    return("");
                }

            case "IVA":
            case "CLIENTE.IVA":
                return(this.Comprobante.Cliente.SituacionTributaria.ToString());

            case "CLIENTE.ID":
                return(this.Comprobante.Cliente.Id.ToString());

            case "VENDEDOR":
            case "VENDEDOR.NOMBRE":
                return(this.Comprobante.Vendedor.ToString());

            case "TOTAL":
            case "COMPROBANTE.TOTAL":
                return(Lfx.Types.Formatting.FormatCurrencyForPrint(this.Recibo.Total, Lfx.Workspace.Master.CurrentConfig.Moneda.DecimalesFinal));

            case "SONPESOS":
                return(Lfx.Types.Formatting.SpellNumber(this.Recibo.Total));

            case "FACTURAS":
                if (Recibo.Facturas.Count > 0)
                {
                    string Res = null;
                    foreach (Lbl.Comprobantes.ComprobanteImporte CompImp in Recibo.Facturas)
                    {
                        Lbl.Comprobantes.ComprobanteConArticulos Comprob = CompImp.Comprobante;
                        if (Res == null)
                        {
                            Res = Comprob.ToString();
                        }
                        else
                        {
                            Res += ", " + Comprob.ToString();
                        }
                    }
                    return(Res);
                }
                else
                {
                    return("");
                }

            case "VALORES":
                System.Text.StringBuilder Valores = new System.Text.StringBuilder();
                if (Recibo.Pagos != null && Recibo.Pagos.Count > 0)
                {
                    foreach (Lbl.Comprobantes.Pago Pg in Recibo.Pagos)
                    {
                        switch (Pg.FormaDePago.Tipo)
                        {
                        case Lbl.Pagos.TiposFormasDePago.Efectivo:
                            Valores.AppendLine("Efectivo                 : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            break;

                        case Lbl.Pagos.TiposFormasDePago.ChequeTerceros:
                        case Lbl.Pagos.TiposFormasDePago.ChequePropio:
                            Valores.AppendLine("Cheque                   : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           Nº " + Pg.Cheque.Numero + " del banco " + Pg.Cheque.Banco.ToString());
                            Valores.AppendLine("                           emitido por " + Pg.Cheque.Emisor);
                            Valores.AppendLine("                           el día " + Lfx.Types.Formatting.FormatDate(Pg.Cheque.FechaEmision));
                            Valores.AppendLine("                           pagadero el " + Lfx.Types.Formatting.FormatDate(Pg.Cheque.FechaCobro));
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Tarjeta:
                            Valores.AppendLine("Pago con Tarjeta         : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           tarjeta " + Pg.ConceptoTexto.ToString());
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Caja:
                            Valores.AppendLine("Ingreso en Cuenta        : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           cuenta " + Pg.CajaOrigen.ToString());
                            break;

                        default:
                            Valores.AppendLine("Otro Pago                : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           " + Pg.ToString());
                            break;
                        }
                    }
                }
                else if (Recibo.Cobros != null && Recibo.Cobros.Count > 0)
                {
                    foreach (Lbl.Comprobantes.Cobro Pg in Recibo.Cobros)
                    {
                        switch (Pg.FormaDePago.Tipo)
                        {
                        case Lbl.Pagos.TiposFormasDePago.Efectivo:
                            Valores.AppendLine("Efectivo                 : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            break;

                        case Lbl.Pagos.TiposFormasDePago.ChequeTerceros:
                        case Lbl.Pagos.TiposFormasDePago.ChequePropio:
                            Valores.AppendLine("Cheque                   : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           Nº " + Pg.Cheque.Numero + " del banco " + Pg.Cheque.Banco.ToString());
                            Valores.AppendLine("                           emitido por " + Pg.Cheque.Emisor);
                            Valores.AppendLine("                           el día " + Lfx.Types.Formatting.FormatDate(Pg.Cheque.FechaEmision));
                            Valores.AppendLine("                           pagadero el " + Lfx.Types.Formatting.FormatDate(Pg.Cheque.FechaCobro));
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Tarjeta:
                            Valores.AppendLine("Pago con Tarjeta         : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           cupón " + Pg.Cupon.ToString());
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Caja:
                            Valores.AppendLine("Ingreso en Cuenta        : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           cuenta " + Pg.CajaDestino.ToString());
                            break;

                        default:
                            Valores.AppendLine("Otro Pago                : " + Lbl.Sys.Config.Moneda.Simbolo + " " + Lfx.Types.Formatting.FormatCurrency(Pg.Importe, Lfx.Workspace.Master.CurrentConfig.Moneda.Decimales));
                            Valores.AppendLine("                           " + Pg.ToString());
                            break;
                        }
                    }
                }

                //Agrego las facturas que corresponde al recibo.
                if (Recibo.Facturas != null)
                {
                    Valores.AppendLine("*********    COMPROBANTES    *********");
                    foreach (Lbl.Comprobantes.ComprobanteImporte fac in Recibo.Facturas)
                    {
                        Valores.AppendLine(fac.Comprobante.ToString());
                    }
                }
                return(Valores.ToString());

            default:
                return(base.ObtenerValorCampo(nombreCampo, formato));
            }
        }
Beispiel #7
0
        /// <summary>
        /// Generar un PDF para un comprobante facturable.
        /// </summary>
        public PdfDocument GenerarFactura()
        {
            var Res = new PdfDocument();

            switch (this.Variante)
            {
            case Variantes.RojoYNegro:
                this.Color1 = XColor.FromArgb(242, 46, 46);
                this.Color2 = XColor.FromArgb(220, 200, 135);
                this.Color3 = XColor.FromArgb(220, 200, 135);
                break;

            default:
            case Variantes.AzulYVerde:
                this.Color1 = XColor.FromArgb(48, 113, 242);
                this.Color2 = XColor.FromArgb(194, 243, 31);
                this.Color3 = XColors.Orange;
                break;
            }


            Res.Options.CompressContentStreams = true;
            Res.Language     = "es_AR";
            Res.Info.Title   = Comprob.ToString();
            Res.Info.Author  = Lbl.Sys.Config.Empresa.RazonSocial;
            Res.Info.Creator = "Gestión Gestión; http://www.GestionLazaro.com";
            Res.Info.Subject = "Factura electrónica autorizada por AFIP, CAE " + Comprob.CaeNumero;

            var Pagina = new PdfPage(Res)
            {
                Size = PageSize.A4
            };

            var Gfx = XGraphics.FromPdfPage(Pagina);

            var FuentePredeterminada = new XFont(FuenteSans, 11);
            var FuenteResaltada      = new XFont(FuenteSans, 11, XFontStyle.Bold);
            var FuentePequena        = new XFont(FuenteSans, 9);
            var FuenteArticulos      = new XFont(FuenteSans, 10);
            var AreaUsable           = new XRect(Margenes.Izquierda, Margenes.Arriba, Pagina.Width - Margenes.Derecha - Margenes.Izquierda, Pagina.Height - Margenes.Arriba - Margenes.Abajo);
            var Tf = new XTextFormatter(Gfx)
            {
                Font = FuentePredeterminada
            };

            var LineaFina = new XPen(this.Color1, .3);

            var CuadroEncab = new XRect(AreaUsable.Left, AreaUsable.Top, AreaUsable.Width, 30 * mm);

            //Gfx.DrawRectangle(new XPen(Azul), XBrushes.Transparent, new XRect(-10, AreaUsable.Top, AreaUsable.Right + 10, 30 * mm));
            Gfx.DrawRectangle(XPens.Transparent, new XSolidBrush(this.Color3), new XRect(AreaUsable.Left + AreaUsable.Width / 2 - 12 * mm, -10, 24 * mm, AreaUsable.Top + 10 + 16 * mm));

            Gfx.DrawString(Comprob.Tipo.LetraONomenclatura, new XFont(FuenteSans, 24, XFontStyle.Bold), XBrushes.Black, new XRect(AreaUsable.Left + AreaUsable.Width / 2 - 12 * mm, AreaUsable.Top + 1 * mm, 24 * mm, 10 * mm), XStringFormats.Center);
            Gfx.DrawString("Cód. " + Afip.Ws.FacturaElectronica.Tablas.CodigoDeComprobantePorLetra(Comprob.Tipo.Nomenclatura).ToString().PadLeft(2, '0'), FuentePequena, XBrushes.Black, new XRect(AreaUsable.Left + AreaUsable.Width / 2 - 12 * mm, AreaUsable.Top + 10 * mm, 24 * mm, 6 * mm), XStringFormats.Center);

            var EncabIzquierdo = new XRect(AreaUsable.Left + 2 * mm, AreaUsable.Top + 2 * mm, AreaUsable.Width / 2 - 16 * mm, 26 * mm);
            var EncabDerecho   = new XRect(AreaUsable.Left + AreaUsable.Width / 2 + 14 * mm, AreaUsable.Top + 2 * mm, AreaUsable.Width / 2 - 16 * mm, 26 * mm);

            Tf.Alignment = XParagraphAlignment.Right;
            Tf.DrawString(Comprob.PV.ToString().PadLeft(4, '0') + "-" + Comprob.Numero.ToString().PadLeft(8, '0') + "\n" + Comprob.Tipo.Nombre + "\n\n" + Lfx.Types.Formatting.FormatDate(Comprob.Fecha), FuenteResaltada, XBrushes.Black, EncabDerecho);
            Tf.Alignment = XParagraphAlignment.Left;

            var TextoEncab = "";

            TextoEncab += Lbl.Sys.Config.Empresa.RazonSocial + "\n";
            if (Lbl.Sys.Config.Empresa.SituacionTributaria > 0)
            {
                var EmpresaSituacion = new Lbl.Impuestos.SituacionTributaria(Comprob.Connection, Lbl.Sys.Config.Empresa.SituacionTributaria);
                if (EmpresaSituacion.Existe)
                {
                    TextoEncab += EmpresaSituacion.Nombre + "\n";
                }
            }
            if (Lbl.Sys.Config.Empresa.SucursalActual != null && string.IsNullOrWhiteSpace(Lbl.Sys.Config.Empresa.SucursalActual.Direccion) == false)
            {
                TextoEncab += Lbl.Sys.Config.Empresa.SucursalActual.Direccion + "\n";
            }
            if (Lbl.Sys.Config.Empresa.ClaveTributaria != null)
            {
                TextoEncab += Lbl.Sys.Config.Empresa.ClaveTributaria.Nombre + ": " + Lbl.Sys.Config.Empresa.ClaveTributaria.ToString() + "\n";
            }
            if (string.IsNullOrWhiteSpace(Lbl.Sys.Config.Empresa.NumeroIngresosBrutos) == false)
            {
                TextoEncab += "II.BB.: " + Lbl.Sys.Config.Empresa.NumeroIngresosBrutos + "\n";
            }
            if (Lbl.Sys.Config.Empresa.InicioDeActividades != null)
            {
                TextoEncab += "Inicio act.: " + Lfx.Types.Formatting.FormatDate(Lbl.Sys.Config.Empresa.InicioDeActividades) + "\n";
            }

            Tf.DrawString(TextoEncab, FuentePequena, XBrushes.Black, EncabDerecho);


            var Logo = new Lbl.Sys.Blob(this.Comprob.Connection, 1);

            if (Logo.Existe && Logo.Imagen != null)
            {
                // Poner el logotipo, centrado en el espacio de logo
                var XImagenLogo = XImage.FromGdiPlusImage(Logo.Imagen);

                var RatioX     = (double)EncabIzquierdo.Width / XImagenLogo.PointWidth;
                var RatioY     = (double)EncabDerecho.Height / XImagenLogo.PointHeight;
                var RatioFinal = Math.Min(RatioX, RatioY);

                var LogoTamanio = new XSize(XImagenLogo.PointWidth * RatioFinal, XImagenLogo.PointHeight * RatioFinal);
                var LogoRect    = new XRect(EncabIzquierdo.Left + (EncabIzquierdo.Width - LogoTamanio.Width) / 2, EncabIzquierdo.Top + (EncabIzquierdo.Height - LogoTamanio.Height) / 2, LogoTamanio.Width, LogoTamanio.Height);

                Gfx.DrawImage(XImagenLogo, LogoRect);
            }
            else
            {
                // Poner el nombre de la empresa
                Tf.Alignment = XParagraphAlignment.Center;
                Tf.DrawString(Lbl.Sys.Config.Empresa.Nombre, new XFont(FuenteSans, 16, XFontStyle.Bold), new XSolidBrush(this.Color1), EncabIzquierdo);
            }

            var CuadroCliente = new XRect(AreaUsable.Left, CuadroEncab.Bottom + 4 * mm, AreaUsable.Width, 14 * mm);

            //Gfx.DrawLine(LineaFinaGris, CuadroCliente.Left, CuadroCliente.Bottom, CuadroCliente.Right, CuadroCliente.Bottom);
            Tf.Alignment = XParagraphAlignment.Left;
            Tf.DrawString("Cliente\nDomicilio\nCUIT", FuentePredeterminada, XBrushes.Black, CuadroCliente);
            string DatosCliente1 = Comprob.Cliente.ToString() + "\n" + Comprob.Cliente.Domicilio + "\n";

            if (Comprob.Cliente.ClaveTributaria != null)
            {
                DatosCliente1 += Comprob.Cliente.ClaveTributaria.ToString();
            }
            Tf.DrawString(DatosCliente1, FuenteResaltada, XBrushes.Black, new XRect(CuadroCliente.Left + 20 * mm, CuadroCliente.Top, CuadroCliente.Width, CuadroCliente.Width));

            Tf.DrawString("Condición\nSituación\nCiudad", FuentePredeterminada, XBrushes.Black, new XRect(CuadroCliente.Left + 100 * mm, CuadroCliente.Top, CuadroCliente.Width, CuadroCliente.Width));
            string DatosCliente2 = Comprob.FormaDePago.ToString() + "\n" + Comprob.Cliente.SituacionTributaria.ToString() + "\n";

            if (Comprob.Cliente.Localidad != null)
            {
                DatosCliente2 += Comprob.Cliente.Localidad.ToString();
            }
            Tf.DrawString(DatosCliente2, FuenteResaltada, XBrushes.Black, new XRect(CuadroCliente.Left + 120 * mm, CuadroCliente.Top, CuadroCliente.Width, CuadroCliente.Width));

            // *** Artículos y detalles

            var CuadroArticulos = new XRect(AreaUsable.Left, CuadroCliente.Bottom + 4 * mm, AreaUsable.Width, 140 * mm);

            //Gfx.DrawRectangle(LineaFinaGris, CuadroArticulos);
            Gfx.DrawLine(LineaFina, CuadroArticulos.Left, CuadroArticulos.Top, CuadroArticulos.Right, CuadroArticulos.Top);

            var ColAnchos = new int[] { 24, 92, 14, 22, 22 };

            var CuadroArticulosCodigos    = new XRect(CuadroArticulos.Left, CuadroArticulos.Top, ColAnchos[0] * mm, CuadroArticulos.Height);
            var CuadroArticulosDetalles   = new XRect(CuadroArticulosCodigos.Right, CuadroArticulos.Top, ColAnchos[1] * mm, CuadroArticulos.Height);
            var CuadroArticulosCantidades = new XRect(CuadroArticulosDetalles.Right, CuadroArticulos.Top, ColAnchos[2] * mm, CuadroArticulos.Height);
            var CuadroArticulosUnitarios  = new XRect(CuadroArticulosCantidades.Right, CuadroArticulos.Top, ColAnchos[3] * mm, CuadroArticulos.Height);
            var CuadroArticulosSubtotales = new XRect(CuadroArticulosUnitarios.Right, CuadroArticulos.Top, ColAnchos[4] * mm, CuadroArticulos.Height);

            Gfx.DrawLine(LineaFina, CuadroArticulos.Left, CuadroArticulos.Top + 7 * mm, CuadroArticulos.Right, CuadroArticulos.Top + 7 * mm);
            CuadroArticulosCodigos.Offset(0, 1 * mm);
            CuadroArticulosDetalles.Offset(0, 1 * mm);
            CuadroArticulosCantidades.Offset(0, 1 * mm);
            CuadroArticulosUnitarios.Offset(0, 1 * mm);
            CuadroArticulosSubtotales.Offset(0, 1 * mm);

            Tf.Alignment = XParagraphAlignment.Left;
            Tf.DrawString("Código", FuenteResaltada, XBrushes.Black, CuadroArticulosCodigos);
            Tf.DrawString("Detalle", FuenteResaltada, XBrushes.Black, CuadroArticulosDetalles);
            Tf.Alignment = XParagraphAlignment.Right;
            Tf.DrawString("Cantidad", FuenteResaltada, XBrushes.Black, CuadroArticulosCantidades);
            Tf.DrawString("P. unitario", FuenteResaltada, XBrushes.Black, CuadroArticulosUnitarios);
            Tf.DrawString("Subtotal", FuenteResaltada, XBrushes.Black, CuadroArticulosSubtotales);

            CuadroArticulosCodigos.Offset(0, 7 * mm);
            CuadroArticulosDetalles.Offset(0, 7 * mm);
            CuadroArticulosCantidades.Offset(0, 7 * mm);
            CuadroArticulosUnitarios.Offset(0, 7 * mm);
            CuadroArticulosSubtotales.Offset(0, 7 * mm);

            Tf.Alignment = XParagraphAlignment.Left;

            // Generar un listado de códigos, detalles, cantidades, etc.
            string Codigos = "", Detalles = "", Cantidades = "", Unitarios = "", Importes = "";

            foreach (var Det in Comprob.Articulos)
            {
                string CodigoImprimir, DetalleImprimir;
                if (Det.Articulo == null)
                {
                    CodigoImprimir  = "";
                    DetalleImprimir = Det.Nombre;
                }
                else
                {
                    CodigoImprimir  = Det.Articulo.Id.ToString();
                    DetalleImprimir = Det.Articulo.ToString();
                }

                Codigos    += CodigoImprimir + "\n";
                Detalles   += DetalleImprimir + "\n";
                Cantidades += Lfx.Types.Formatting.FormatNumberForPrint(Det.Cantidad, Lbl.Sys.Config.Articulos.Decimales) + "\n";
                Unitarios  += Lfx.Types.Formatting.FormatCurrencyForPrint(Det.ImporteUnitarioFinalAImprimir, Lfx.Workspace.Master.CurrentConfig.Moneda.DecimalesFinal) + "\n";
                Importes   += Lfx.Types.Formatting.FormatCurrencyForPrint(Det.ImporteAImprimir, Lfx.Workspace.Master.CurrentConfig.Moneda.DecimalesFinal) + "\n";
            }
            Tf.DrawString(Codigos, FuenteArticulos, XBrushes.Black, CuadroArticulosCodigos);
            Tf.DrawString(Detalles, FuenteArticulos, XBrushes.Black, CuadroArticulosDetalles);
            Tf.Alignment = XParagraphAlignment.Right;
            Tf.DrawString(Cantidades, FuenteArticulos, XBrushes.Black, CuadroArticulosCantidades);
            Tf.DrawString(Unitarios, FuenteArticulos, XBrushes.Black, CuadroArticulosUnitarios);
            Tf.DrawString(Importes, FuenteArticulos, XBrushes.Black, CuadroArticulosSubtotales);

            // *** Observaciones

            var CuadroObs = new XRect(AreaUsable.Left, CuadroArticulos.Bottom + 4 * mm, AreaUsable.Width, 26 * mm);

            Tf.Alignment = XParagraphAlignment.Left;
            if (Comprob.Obs != null && Comprob.Obs.Length > 0)
            {
                Tf.DrawString(Comprob.Obs, Comprob.Obs.Length > 400 ? FuentePequena : FuentePredeterminada, XBrushes.Black, CuadroObs);
            }

            Gfx.DrawLine(LineaFina, CuadroObs.Left, CuadroObs.Bottom, CuadroObs.Right, CuadroObs.Bottom);

            // *** Subtotal, IVA, descuento y total

            var CuadroTotales = new XRect(AreaUsable.Left, CuadroObs.Bottom + 4 * mm, 50 * mm, 14 * mm);

            Tf.Alignment = XParagraphAlignment.Left;
            Tf.DrawString("Subtotal\nIVA\nDescuento / recargo", FuentePredeterminada, XBrushes.Black, CuadroTotales);
            Tf.Alignment = XParagraphAlignment.Right;
            Tf.DrawString(string.Concat(
                              Lfx.Types.Formatting.FormatCurrency(Comprob.SubtotalSinIvaFinal), "\n",
                              Lfx.Types.Formatting.FormatCurrency(Comprob.ImporteIvaDiscriminadoFinal), "\n",
                              Lfx.Types.Formatting.FormatNumber(Comprob.Descuento, 2) + "%"
                              ), FuenteResaltada, XBrushes.Black, CuadroTotales);

            //Tf.DrawString("\nSon ciento veintitresmil cuatrocientos cincuenta y seis pesos con 00/100.", FuentePequena, XBrushes.Black, CuadroTotales);

            var CuadroTotal      = new XRect(AreaUsable.Right - 50 * mm, CuadroTotales.Top, 50 * mm, CuadroTotales.Height);
            var CuadroFondoTotal = new XRect(AreaUsable.Right - 45 * mm, CuadroTotales.Top, 90 * mm, CuadroTotales.Height);

            Gfx.DrawRectangle(new XSolidBrush(this.Color2), CuadroFondoTotal);
            //Gfx.DrawRectangle(XBrushes.Silver, CuadroTotal);
            CuadroTotal.Offset(0, 3 * mm);
            Gfx.DrawString("TOTAL", new XFont(FuenteSans, 8), XBrushes.Black, CuadroFondoTotal.Left + 1 * mm, CuadroFondoTotal.Top + 3 * mm);
            Tf.Alignment = XParagraphAlignment.Right;
            Tf.DrawString("$ " + Lfx.Types.Formatting.FormatCurrency(Comprob.Total), new XFont(FuenteSans, 18, XFontStyle.Bold), XBrushes.Black, CuadroTotal);


            // *** Pie con información de AFIP y código de barras

            var CuadroPie = new XRect(AreaUsable.Left, AreaUsable.Bottom - 20 * mm, AreaUsable.Width, 20 * mm);

            Gfx.DrawLine(LineaFina, CuadroPie.Left, CuadroPie.Top, CuadroPie.Right, CuadroPie.Top);

            CuadroPie.Offset(0, 1 * mm);

            Tf.Alignment = XParagraphAlignment.Left;
            Tf.DrawString("Comprobante electrónico\nCAE Nº " + Comprob.CaeNumero + "\nCAE Vence " + Lfx.Types.Formatting.FormatDate(Comprob.CaeVencimiento), FuentePredeterminada, XBrushes.Black, new XRect(CuadroPie.Left + 110 * mm, CuadroPie.Top, CuadroPie.Width, CuadroPie.Height));

            string TextoCodigoBarras = this.GenerarTextoCodigoDeBarras();
            var    CodBarras         = new BarcodeLib.Barcode();
            var    ImagenCodBarras   = CodBarras.Encode(BarcodeLib.TYPE.Interleaved2of5, TextoCodigoBarras, 1000, 120);
            var    XImagenCodBarras  = XImage.FromGdiPlusImage(ImagenCodBarras);

            Gfx.DrawImage(XImagenCodBarras, new XRect(CuadroPie.Left, CuadroPie.Bottom - 20 * mm, 100 * mm, 12 * mm));
            Tf.Alignment = XParagraphAlignment.Center;
            Tf.DrawString(TextoCodigoBarras, FuentePredeterminada, XBrushes.Black, new XRect(CuadroPie.Left, CuadroPie.Bottom - 7 * mm, 100 * mm, 7 * mm));

            Res.AddPage(Pagina);

            return(Res);
        }