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);
}
}
}
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;
}
}
Aggregations