Search in sources :

Example 1 with Payment

use of ar.com.ergio.print.fiscal.document.Payment in project lar_361 by comitsrl.

the class FiscalDocumentPrint method loadInvoicePayments.

/**
 * Carga los descuentos para un documento a imprimir.
 * @param document Documento a imprimir
 * @param discounts Lista de descuentos que se deben cargar.
 */
// private void loadDocumentDiscounts(Document document, List<MDocumentDiscount> discounts) {
// BigDecimal generalDiscountAmt = BigDecimal.ZERO;
// DiscountLine discountLine = null;
// for (MDocumentDiscount mDocumentDiscount : discounts) {
// // Solo se tienen en cuenta descuentos que sean Bonificación o a nivel de
// // Documento. Aquellos que son "Al Precio" ya se encuentran reflejados en
// // los precios de las líneas del documento, y no deben se impresos en el
// // ticket.
// if (MDocumentDiscount.CUMULATIVELEVEL_Line.equals(mDocumentDiscount
// .getCumulativeLevel())
// && !mDocumentDiscount.isBonusApplication()) {
// continue;
// }
// 
// // Si es descuento general manual se suma el importe al total de descuento
// // de ese tipo. Este tipo de descuento es proporcional a todas las tasas de
// // impuestos con lo cual no es necesario discriminar los importes según la
// // tasa.
// if (mDocumentDiscount.isManualGeneralDiscountKind()) {
// generalDiscountAmt = generalDiscountAmt.add(mDocumentDiscount
// .getDiscountAmt().negate());
// } else {
// // Para el resto de bonificaciones, se crea una línea de descuento por cada
// // tasa de impuesto debido a que el controlador fiscal requiere saber para
// // cada importe descontado, a que tasa de impuesto afecta para registrar la
// // reducción o incremento del importe computado para la misma.
// for (MDocumentDiscount mDiscountByTax : mDocumentDiscount
// .getDiscountsByTax()) {
// 
// // Crea la línea de descuento para la tasa
// discountLine = new DiscountLine(
// mDiscountByTax.getDescription(),
// mDiscountByTax.getDiscountAmt().negate(),
// true, // Los importes en DocumentDiscount incluyen siempre el impuesto
// mDiscountByTax.getTaxRate());
// // Agrega el descuento al documento.
// document.addDocumentDiscount(discountLine);
// }
// }
// }
// 
// // Si hay descuentos manuales generales se asigna un descuento general
// // al documento.
// if (generalDiscountAmt.compareTo(BigDecimal.ZERO) != 0) {
// document.setGeneralDiscount(
// new DiscountLine(
// Msg.translate(Env.getCtx(), "FiscalTicketGeneralDiscount"),
// generalDiscountAmt,
// true // Incluye impuestos
// )
// );
// }
// 
// }
/**
 * Carga los pagos en la factura a emitir a partir de las imputaciones que
 * tenga la factura en la BD.
 */
private void loadInvoicePayments(final Invoice invoice, final MInvoice mInvoice) {
    BigDecimal totalPaidAmt = BigDecimal.ZERO;
    final String othersDesc = Msg.translate(ctx, "FiscalTicketOthersPayment");
    final String cashDesc = Msg.translate(ctx, "FiscalTicketCashPayment");
    // Lista temporal de pagos creados a partir de los allocations
    List<Payment> payments = new ArrayList<Payment>();
    // Obtiene todas las imputaciones de la factura agrupadas por pago.
    String sql = // TODO - Review this, we may be needed for billing outside POS
    "SELECT C_Payment_ID, " + "C_CashLine_ID, " + // "C_Invoice_Credit_ID, " +
    "SUM(Amount + DiscountAmt + WriteoffAmt) AS PaidAmount " + "FROM C_AllocationLine " + "WHERE C_Invoice_ID = ? " + // /////////////////////////////////////////////////////////////////////////
    "  AND 1=2" + // /////////////////////////////////////////////////////////////////////////
    "GROUP BY C_Payment_ID, C_CashLine_ID " + // , C_Invoice_Credit_ID " +
    "ORDER BY PaidAmount ";
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    // Crea los pagos de Efectivo y Otros para acumular montos de sendos tipos.
    Payment othersPayment = new Payment(BigDecimal.ZERO, othersDesc);
    Payment cashPayment = new Payment(BigDecimal.ZERO, cashDesc);
    try {
        pstmt = DB.prepareStatement(sql, getTrxName());
        pstmt.setInt(1, mInvoice.getC_Invoice_ID());
        rs = pstmt.executeQuery();
        int paymentID;
        int cashLineID;
        // int invoiceCreditID;
        BigDecimal paidAmt = null;
        String description = null;
        // Pago que se crea en caso de que la imputación no entre en la clase
        // Efectivo u Otros Pagos.
        Payment payment = null;
        while (rs.next()) {
            // Obtiene los IDs de los documentos para determinar cual es el que
            // se utilizó para el pago
            paymentID = rs.getInt("C_Payment_ID");
            cashLineID = rs.getInt("C_CashLine_ID");
            // invoiceCreditID = rs.getInt("C_Invoice_Credit_ID");
            paidAmt = rs.getBigDecimal("PaidAmount");
            description = null;
            payment = null;
            // 1. Imputación con un C_Payment.
            if (paymentID > 0) {
                // Obtiene la descripción.
                description = getInvoicePaymentDescription(new MPayment(ctx, paymentID, getTrxName()));
            // 2. Imputación con Línea de Caja
            } else if (cashLineID > 0) {
                // Todas las imputaciones con líneas de caja se suman al pago
                // global en Efectivo para imprimir una única línea que diga
                // "Efectivo".
                cashPayment.setAmount(cashPayment.getAmount().add(paidAmt));
            // 3. Imputación con Factura de Crédito (NC)
            // } else if (invoiceCreditID > 0) {
            // // Obtiene la descripción.
            // description = getInvoicePaymentDescription(new MInvoice(
            // ctx, invoiceCreditID, getTrxName()));
            }
            // al payment de "Otros Pagos".
            if (othersDesc.equals(description)) {
                othersPayment.setAmount(othersPayment.getAmount().add(paidAmt));
            // Caso Contrario (Tarjeta, Cheque, Transferencia, NC, etc), se crea el pago
            // con la descripción.
            } else if (description != null) {
                payment = new Payment(paidAmt, description);
            }
            // según el mayor importe.
            if (payment != null) {
                payments.add(payment);
            }
            totalPaidAmt = totalPaidAmt.add(paidAmt);
        }
    // while
    } catch (SQLException e) {
        log.log(Level.SEVERE, "Error getting invoice allocations", e);
    } finally {
        try {
            if (rs != null)
                rs.close();
            if (pstmt != null)
                pstmt.close();
        } catch (Exception e) {
        }
    }
    // la factura y en la descripción se pone el PaymentRule de la factura.
    if (totalPaidAmt.compareTo(BigDecimal.ZERO) == 0) {
        // Se crea un pago con el total de la factura y el medio de pago en
        // la descripción.
        String paymentRule = mInvoice.getPaymentRule();
        String paymentMedium = MRefList.getListName(ctx, MInvoice.PAYMENTRULE_AD_Reference_ID, paymentRule);
        invoice.addPayment(new Payment(mInvoice.getGrandTotal(), paymentMedium));
    // Si hay pagos, se cargan a los pagos de la factura a emitir.
    } else {
        int paymentQty = 0;
        // Primero el efectivo
        if (cashPayment.getAmount().compareTo(BigDecimal.ZERO) > 0) {
            invoice.addPayment(cashPayment);
            paymentQty++;
        }
        // de la lista de modo que la impresión quede en esa ubicación.
        if (othersPayment.getAmount().compareTo(BigDecimal.ZERO) > 0) {
            paymentQty++;
        }
        int allowedCount = getFiscalPrinter().getAllowedPaymentQty();
        for (Iterator<Payment> paymentsIter = payments.iterator(); paymentsIter.hasNext(); ) {
            Payment payment = paymentsIter.next();
            if (paymentQty == allowedCount - 1) {
                if (!paymentsIter.hasNext() || othersPayment.getAmount().compareTo(BigDecimal.ZERO) > 0) {
                    invoice.addPayment(payment);
                } else {
                    othersPayment.setAmount(othersPayment.getAmount().add(payment.getAmount()));
                }
            } else if (paymentQty < allowedCount) {
                invoice.addPayment(payment);
            } else {
                othersPayment.setAmount(othersPayment.getAmount().add(payment.getAmount()));
            }
            paymentQty++;
        }
        if (othersPayment.getAmount().compareTo(BigDecimal.ZERO) > 0) {
            invoice.addPayment(othersPayment);
        }
    }
}
Also used : Payment(ar.com.ergio.print.fiscal.document.Payment) MPayment(org.compiere.model.MPayment) SQLException(java.sql.SQLException) MPayment(org.compiere.model.MPayment) ArrayList(java.util.ArrayList) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) BigDecimal(java.math.BigDecimal) FiscalPrinterIOException(ar.com.ergio.print.fiscal.exception.FiscalPrinterIOException) SQLException(java.sql.SQLException) IOException(java.io.IOException) DocumentException(ar.com.ergio.print.fiscal.exception.DocumentException)

Example 2 with Payment

use of ar.com.ergio.print.fiscal.document.Payment in project lar_361 by comitsrl.

the class HasarFiscalPrinter method printDocument.

public void printDocument(Invoice invoice) throws FiscalPrinterStatusError, FiscalPrinterIOException, DocumentException {
    Customer customer = invoice.getCustomer();
    FiscalPacket response;
    // Se valida la factura.
    invoice.validate();
    try {
        setCancelAllowed(false);
        // ////////////////////////////////////////////////////////////
        // Se setean los datos del comprador.
        // Comando: @SetCustomerData
        loadCustomerData(customer);
        // Comando: @SetEmbarkNumber
        if (invoice.hasPackingSlipNumber()) {
            execute(cmdSetEmbarkNumber(1, invoice.getPackingSlipNumber()));
        }
        // ////////////////////////////////////////////////////////////
        // Se abre el documento fiscal.
        // Comando: @OpenFiscalReceipt
        response = execute(cmdOpenFiscalReceipt(traduceDocumentType(Document.DT_INVOICE, invoice.getLetter())));
        setLastDocumentNo("");
        setCancelAllowed(true);
        setDocumentOpened(true);
        // Comando: @PrintFiscalText
        for (String observation : invoice.getObservations()) {
            execute(cmdPrintFiscalText(observation, null));
        }
        // ////////////////////////////////////////////////////////////
        // Se cargan los ítems de la factura.
        // Comando: @PrintLineItem
        loadDocumentLineItems(invoice);
        // ////////////////////////////////////////////////////////////
        // Se cargan los descuentos de la factura.
        loadDocumentDiscounts(invoice);
        // ////////////////////////////////////////////////////////////
        // load invoice perception
        loadDocumentPerception(invoice);
        // ////////////////////////////////////////////////////////////
        // Se calcula el subtotal.
        // Comando: @Subtotal
        execute(cmdSubtotal(true, null));
        // Comando: @TotalTender
        for (Payment payment : invoice.getPayments()) {
            execute(cmdTotalTender(payment.getDescription(), payment.getAmount(), false, null));
            setCancelAllowed(false);
        }
        // ////////////////////////////////////////////////////////////
        // Se cierra el comprobante fiscal.
        // Comando: @CloseFiscalReceipt
        response = execute(cmdCloseFiscalReceipt(null));
        setDocumentOpened(false);
        // Chequeo de impuestos
        checkTaxes(invoice);
        // Se obtiene el número de comprobante emitido.
        setLastDocumentNo(response.getString(3));
        invoice.setDocumentNo(getLastDocumentNo());
        // Se obtiene el número del CAI.
        if (invoice.getLetter().equals(Document.DOC_LETTER_A))
            ;
        invoice.setCAINumber(getCAINumber(response));
        // Se indica al manejador de eventos que la impresión ha finalizado.
        firePrintEnded();
    } catch (FiscalPrinterIOException e) {
        // Si ocurrió algún error se intenta cancelar el documento
        // actual y se relanza la excepción.
        cancelCurrentDocument();
        throw e;
    }
}
Also used : Payment(ar.com.ergio.print.fiscal.document.Payment) Customer(ar.com.ergio.print.fiscal.document.Customer) FiscalPrinterIOException(ar.com.ergio.print.fiscal.exception.FiscalPrinterIOException) FiscalPacket(ar.com.ergio.print.fiscal.FiscalPacket)

Aggregations

Payment (ar.com.ergio.print.fiscal.document.Payment)2 FiscalPrinterIOException (ar.com.ergio.print.fiscal.exception.FiscalPrinterIOException)2 FiscalPacket (ar.com.ergio.print.fiscal.FiscalPacket)1 Customer (ar.com.ergio.print.fiscal.document.Customer)1 DocumentException (ar.com.ergio.print.fiscal.exception.DocumentException)1 IOException (java.io.IOException)1 BigDecimal (java.math.BigDecimal)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 SQLException (java.sql.SQLException)1 ArrayList (java.util.ArrayList)1 MPayment (org.compiere.model.MPayment)1