use of org.compiere.model.MInvoiceTax in project lar_361 by comitsrl.
the class Wsfe method getTaxesAmt.
/**
* Obtener el monto total de todos los impuesto aplicados a la factura.
* @param invoice
* @return
*/
public BigDecimal getTaxesAmt(MInvoice invoice) {
MInvoiceTax[] taxes = invoice.getTaxes(false);
BigDecimal total = Env.ZERO;
for (int i = 0; i < taxes.length; i++) {
total = total.add(taxes[i].getTaxAmt());
}
return total;
}
use of org.compiere.model.MInvoiceTax in project lar_361 by comitsrl.
the class WsfeV1 method createInputFile.
/**
* @author: Horacio Alvarez
* @descripcion: Crea el archivo de entrada para el WSFE.PY.
* Setea los valores necesarios con el objeto MInvoice.
*/
@Override
protected void createInputFile() {
try {
StringBuffer line = new StringBuffer();
// *****NRO. COMPROBANTE
if (this.getInvoice().getNumeroComprobante() == 0) {
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoNumeroComprobante"));
return;
}
line.append(this.getInvoice().getNumeroComprobante() + "\n");
// *****PUNTO DE VENTA
final MPOS pos = new MPOS(getM_ctx(), this.getInvoice().get_ValueAsInt("C_Pos_ID"), getTrxName());
if (pos.get_ValueAsInt("PosNumber") == 0) {
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoPuntoDeVenta"));
return;
}
line.append(pos.get_ValueAsInt("PosNumber") + "\n");
// *****TIPO DE COMPROBANTE
MDocType docType = new MDocType(Env.getCtx(), this.getInvoice().getC_DocTypeTarget_ID(), getTrxName());
line.append(docType.getdocsubtypecae() + "\n");
// *****TIPO DOC: 80 CUIT / 96 DNI
MBPartner partner = new MBPartner(this.getM_ctx(), this.getInvoice().getC_BPartner_ID(), getTrxName());
final X_LCO_TaxPayerType taxPayerType = new X_LCO_TaxPayerType(getM_ctx(), partner.get_ValueAsInt("LCO_TaxPayerType_ID"), getTrxName());
if (taxPayerType.getName().equals("ConsumidorFinal")) {
line.append("96" + "\n");
line.append("1" + "\n");
} else {
line.append("80" + "\n");
if (partner.getTaxID() == null || partner.getTaxID().equals("")) {
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoCUIT"));
return;
}
line.append(partner.getTaxID().replaceAll("-", "") + "\n");
}
// *****IMPORTE TOTAL
// line.append(this.getInvoice().getGrandTotal().toString().replace(".", "")+"\n");
line.append(this.getInvoice().getGrandTotal().setScale(2, BigDecimal.ROUND_HALF_UP) + "\n");
// *****IMPORTE NETO
// line.append(this.getInvoice().getTotalLines().toString().replace(".", "")+"\n");
line.append(this.getInvoice().getTotalLines().setScale(2, BigDecimal.ROUND_HALF_UP) + "\n");
// *****FECHA
if (this.getInvoice().getDateAcct() == null) {
this.setMessageError(Msg.translate(this.getM_ctx(), "CaeNoDateAcct"));
return;
}
line.append(formatTime(this.getInvoice().getDateAcct(), "yyyyMMdd") + "\n");
// *****PRESTA SERVICIOS 0-->NO 1-->SI
line.append(MSysConfig.getValue("LAR_PrestaServicios_FE", Env.getAD_Client_ID(Env.getCtx())) + "\n");
// *****MONEDA
MCurrency currency = new MCurrency(this.getM_ctx(), this.getInvoice().getC_Currency_ID(), getTrxName());
line.append(currency.get_ValueAsString("WSFECode") + "\n");
// *****CONVERSION
// Se debe convertir a la moneda del comprobante desde la moneda de la compañía
BigDecimal cotizacion = MCurrency.currencyConvert(Env.ONE, Env.getContextAsInt(this.getM_ctx(), "$C_Currency_ID"), this.getInvoice().getC_Currency_ID(), this.getInvoice().getDateInvoiced(), 0, this.getM_ctx());
line.append(cotizacion + "\n");
// *****IMPUESTO
BigDecimal total_Impuesto = BigDecimal.ZERO;
MInvoiceTax[] taxes = this.getInvoice().getTaxes(false);
MTax tax = null;
int size = taxes.length;
boolean firstLineAppended = false;
for (int i = 0; i < size; i++) {
tax = MTax.get(this.getM_ctx(), taxes[i].getC_Tax_ID());
if (!tax.get_ValueAsBoolean("IsPerception")) {
total_Impuesto = total_Impuesto.add(taxes[i].getTaxAmt().setScale(2, BigDecimal.ROUND_HALF_UP));
taxes[i].getTaxAmt();
taxes[i].getTaxBaseAmt();
tax.get_ValueAsString("WSFECode");
if (firstLineAppended) {
line.append(";");
}
line.append(tax.get_ValueAsString("WSFECode") + ":" + (getTaxBaseAmt(taxes[i].getTaxBaseAmt(), this.getInvoice().getGrandTotal(), getTaxesAmt(this.getInvoice()))).setScale(2, BigDecimal.ROUND_HALF_UP) + ":" + taxes[i].getTaxAmt().setScale(2, BigDecimal.ROUND_HALF_UP));
firstLineAppended = true;
}
}
line.append("\n");
// *****MONTO TOTAL DE IMPUESTOS
line.append(total_Impuesto + "\n");
// *****IMPUESTOS PERCEPCIONES
BigDecimal total_Perception = BigDecimal.ZERO;
MInvoiceTax[] taxesPerc = this.getInvoice().getTaxes(true);
MTax taxPerc = null;
int sizePerc = taxesPerc.length;
boolean firstLineAppended2 = false;
for (int i = 0; i < sizePerc; i++) {
taxPerc = MTax.get(this.getM_ctx(), taxesPerc[i].getC_Tax_ID());
if (taxPerc.get_ValueAsBoolean("IsPerception")) {
total_Perception = total_Perception.add(taxesPerc[i].getTaxAmt().setScale(2, BigDecimal.ROUND_HALF_UP));
taxesPerc[i].getTaxAmt();
taxesPerc[i].getTaxBaseAmt();
taxPerc.get_ValueAsInt("WSFECode");
if (firstLineAppended2) {
line.append(";");
}
BigDecimal alic = (taxPerc.getRate().setScale(2, BigDecimal.ROUND_HALF_UP)).negate();
line.append(taxPerc.get_ValueAsInt("WSFECode") + ":" + (getTaxBaseAmt(taxesPerc[i].getTaxBaseAmt(), this.getInvoice().getGrandTotal(), getTaxesAmt(this.getInvoice()))).setScale(2, BigDecimal.ROUND_HALF_UP) + ":" + taxesPerc[i].getTaxAmt().setScale(2, BigDecimal.ROUND_HALF_UP) + ":" + alic);
firstLineAppended2 = true;
}
}
if (total_Perception.equals(Env.ZERO))
line.append("0");
line.append("\n");
// *****MONTO TOTAL DE PERCEPCIONES
line.append(total_Perception + "\n");
// *****C_INVOICE_ID para seguimiento
line.append(this.getInvoice().getC_Invoice_ID() + "\n");
File textFile = new File(getPath() + "entrada.txt");
FileWriter textOut;
textOut = new FileWriter(textFile);
textOut.write(line.toString());
textOut.close();
} catch (Exception ex) {
this.setMessageError(Msg.translate(this.getM_ctx(), "caeErrorCreateInputFile"));
log.log(Level.SEVERE, this.getMessageError(), ex);
}
}
use of org.compiere.model.MInvoiceTax in project lar_361 by comitsrl.
the class MLARPaymentHeader method recalcPaymentWithholding.
// setPayAmtDirectly
/**
* Realiza el cálculo de la retención sobre la cabecera de pago dada.
* Esto lo lleva a cabo creando por cada confiuración aplicable
* un certificado de retención y un pago de tipo "retención".
*
* @param genera Si es true geera el pago retención y el correspondiente certificado.
* @return verdadero si se generó la retención correctamente
*/
public boolean recalcPaymentWithholding(boolean genera) {
this.load(get_TrxName());
final MDocType dt = new MDocType(getCtx(), getC_DocType_ID(), get_TrxName());
String genwh = dt.get_ValueAsString("GenerateWithholding");
if (genwh == null || genwh.equals("N"))
return true;
// Se Borran los certificados y Pagos Retención del Header
BorrarCertificadosdeRetenciondelHeader();
BorrarPagosRetenciondelHeader();
updateHeaderWithholding(getLAR_PaymentHeader_ID(), get_TrxName());
this.load(get_TrxName());
// Recupera la configuración y calcula
final MBPartner bp = new MBPartner(getCtx(), getC_BPartner_ID(), get_TrxName());
final WithholdingConfig[] configs = WithholdingConfig.getConfig(bp, dt.isSOTrx(), get_TrxName(), null, getDateTrx());
// Si se recuperó correctamente la configuración
if (configs != null)
// Se recorren las configuraciones recuperadas
for (final WithholdingConfig wc : configs) {
log.config("Withholding conf >> " + wc);
BigDecimal impRetencion = Env.ZERO;
// Se recupera el tipo de documento para el Pago Retención
// a partir del tipo de retencion
final int c_DocType_ID = wc.getC_DocType_ID();
int cargoRetencion;
if (c_DocType_ID > 0) {
final MDocType docRet = new MDocType(getCtx(), c_DocType_ID, get_TrxName());
// Se recupera y valida el ID del cargo para retención desde el documento
cargoRetencion = docRet.get_ValueAsInt("LAR_Withholding_Charge_ID");
if (cargoRetencion < 0) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al crear la retenci\u00f3n (No existe cargo retenci\u00f3n configurado en el documento)");
return false;
}
} else {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al crear la retenci\u00f3n (No existe tipo de documento configurado para el Pago Retenci\u00f3n)");
return false;
}
if (wc.isCalcFromPayment()) {
// Se calcula el importe a retener según el tipo de retención
final MPaymentAllocate[] facturas = getInvoices(get_TrxName());
BigDecimal totalOP = getPayHeaderTotalAmt();
BigDecimal impSujetoaRet = Env.ZERO;
BigDecimal aliquot = wc.getAliquot();
BigDecimal impFijo = Env.ZERO;
// En las retenciones de ganancias estos valores se pisan con los recuperados
// desde la tabla de conceptos LAR_Concepto_Ret_Ganancias
BigDecimal impNoSujeto = wc.getamountRefunded();
BigDecimal impRetMin = wc.getPaymentThresholdMin();
BigDecimal impExencion = Env.ZERO;
BigDecimal porcExencion = Env.ZERO;
// Es retención de Ganancias
if (wc.usaTipoGananciasBP()) {
final String tipoGanancias = (String) bp.get_Value("LAR_TipoGanancias");
// Se toma el importe del pago sin IVA
if (facturas.length <= 0)
impSujetoaRet = totalOP.divide(coef_IVA, 2, RoundingMode.HALF_EVEN);
else {
// Se calcula el importe sujeto a retención
BigDecimal sumaImpago = Env.ZERO;
for (final MPaymentAllocate mp : facturas) {
MInvoice factura = mp.getInvoice();
BigDecimal neto = factura.getTotalLines();
BigDecimal impago = mp.getAmount();
/*
* Se suma el importe "impago" de las facturas, si el importe
* impago supera al neto de la factura, solo se suma el neto ya
* que no podemos tomar como importe Sujeto a Retención los
* impuestos (IVA, percepciones, imp. internos, ect).
*/
impSujetoaRet = impSujetoaRet.add(neto.compareTo(impago) >= 0 ? impago : neto);
sumaImpago = sumaImpago.add(impago);
// Si el importe sujeto tomado de las facturas supera al total de la OP
// se toma como importe sujeto a retención el total de la OP-
}
if (totalOP.compareTo(impSujetoaRet) <= 0)
impSujetoaRet = totalOP;
else {
/*
* Se suma al importe sujeto a retención la diferencia
* exedente de la orden de pago (sin tomar en cuenta
* los impuestos de las facturas.
*/
if (totalOP.compareTo(sumaImpago) > 0)
impSujetoaRet = impSujetoaRet.add(totalOP.subtract(sumaImpago));
}
}
// Recuperar el importe pagado a ese proveedor dentro del mes corriente
BigDecimal impPagado = calculaImportePagado(bp);
// Si hay error al recuperar el importe pagado
if (impPagado.compareTo(Env.ZERO) < 0)
continue;
// Configuración del SdN
X_LAR_Concepto_Ret_Ganancias cg = null;
final int concepto_id = bp.get_ValueAsInt("LAR_Concepto_Ret_Ganancias_ID");
// Si no tiene concepto configurado o es "Sin Especificar"
if (concepto_id == 0 || concepto_id == sinEspecificar_ID)
continue;
else {
try {
// Recuperar toda la información asociada al concepto
String sqlcg = "SELECT * " + " FROM LAR_Concepto_Ret_Ganancias " + " WHERE LAR_Concepto_Ret_Ganancias_ID = ?";
PreparedStatement pstmtcg = DB.prepareStatement(sqlcg, get_TrxName());
pstmtcg.setInt(1, concepto_id);
ResultSet rscg = pstmtcg.executeQuery();
if (rscg.next()) {
cg = new X_LAR_Concepto_Ret_Ganancias(Env.getCtx(), rscg, get_TrxName());
} else {
log.warning("No existe configuraci\u00f3n para el concepto LAR_Concepto_Ret_Ganancias_ID = " + concepto_id);
rscg.close();
pstmtcg.close();
continue;
}
rscg.close();
pstmtcg.close();
} catch (SQLException e) {
log.log(Level.SEVERE, "", e);
return false;
}
}
// Recuperar toda la información asociada al concepto
BigDecimal impPiso = Env.ZERO;
// Es cálculo por escala
if (cg.isCalculo_Por_Escala() && tipoGanancias.equals("I")) {
X_LAR_Escala_Ret_Ganancias eg = null;
final List<X_LAR_Escala_Ret_Ganancias> escala = new ArrayList<X_LAR_Escala_Ret_Ganancias>();
// Recuperar la información de la escala
try {
// Recuperar la información de la escala
String sqleg = "SELECT * " + " FROM LAR_Escala_Ret_Ganancias ";
PreparedStatement pstmteg = DB.prepareStatement(sqleg, get_TrxName());
ResultSet rseg = pstmteg.executeQuery();
while (rseg.next()) {
eg = new X_LAR_Escala_Ret_Ganancias(Env.getCtx(), rseg, get_TrxName());
if (!escala.add(eg)) {
log.severe("Error al agregar configuración de escala a la lista");
continue;
}
}
rseg.close();
pstmteg.close();
} catch (SQLException e) {
log.log(Level.SEVERE, "", e);
return false;
}
// Recorrer la escala para encontrar el rango del pago
for (final X_LAR_Escala_Ret_Ganancias esc : escala) {
if (impSujetoaRet.compareTo(esc.getImporte_Desde()) >= 0 && impSujetoaRet.compareTo(esc.getImporte_Hasta()) <= 0) {
// obtener importe fijo, importe no sujeto y alicuota
aliquot = esc.getAlicuota();
// Se corrige la alícuota e impuesto en la config
// para que el certificado de retención quede correcto
wc.setAliquot(aliquot);
wc.setC_Tax_ID(0);
impFijo = esc.getImporte_Fijo();
impPiso = esc.getImporte_No_Sujeto();
impNoSujeto = tipoGanancias.equals("I") ? cg.getImporte_No_Sujeto_Inscripto() : cg.getImporte_No_Sujeto_No_Insc();
break;
}
}
} else // Es cálculo por escala
// Es cáclulo directo
{
// Obtener importe importe no sujeto y alicuota según si el SdN es
// Inscripto o No en el Impuesto a las Ganancias
aliquot = tipoGanancias.equals("I") ? cg.getAlicuota_Inscripto() : cg.getAlicuota_No_Inscripto();
// Se corrige la alícuota e impuesto en la config
// para que el certificado de retención quede correcto
wc.setAliquot(aliquot);
wc.setC_Tax_ID(0);
impNoSujeto = tipoGanancias.equals("I") ? cg.getImporte_No_Sujeto_Inscripto() : cg.getImporte_No_Sujeto_No_Insc();
}
// Se realiza el calculo del importe sujeto a retención en base
// al acumulado en el mes corriente y el importe no sujeto
BigDecimal acumulado = impSujetoaRet.add(impPagado);
// Si se no alcanza el Monto No Sujeto a Retención en el mes corriente, no se genera retención
if ((acumulado).compareTo(impNoSujeto) < 0)
return true;
else {
/*
* Si se supera el importe No Sujeto a Retención con el importe de
* la OP actual se deja como importe Sujeto a Retención la
* diferencia, caso contrario se calcula la retención con el
* importe Sujeto a retención completo.
*/
if (((acumulado.subtract(impNoSujeto)).compareTo(impSujetoaRet)) < 0)
impSujetoaRet = acumulado.subtract(impNoSujeto);
}
// Si es por escala al importe sujeto se le debe restar el "piso" (Sobre Excedente)
if (cg.isCalculo_Por_Escala())
impSujetoaRet = impSujetoaRet.subtract(impPiso);
impRetencion = impSujetoaRet.multiply(aliquot).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN);
impRetencion = impRetencion.add(impFijo);
// Exención de Ganancias
if (bp.get_ValueAsBoolean("LAR_Exento_Ret_Ganancias")) {
Date fechaVenc = (Date) bp.get_Value("LAR_Vencimiento_Cert_Ganancias");
if (!fechaVenc.before(getDateTrx())) {
impExencion = (BigDecimal) bp.get_Value("LAR_Importe_Exencion_Ganancias");
porcExencion = (BigDecimal) bp.get_Value("LAR_Exencion_Ganancias");
} else {
// Advertir al ususario que el certificado de Exención esta vencido
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Certificado de Exenci\u00f3n de Ganancias Vencido");
}
}
// Exenciones % e importe fijo
BigDecimal impExentoDesc = impRetencion.multiply(porcExencion).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN);
impRetencion = impRetencion.subtract(impExentoDesc).subtract(impExencion);
} else // Es retención de Ganancias
{
// La organización está configurada como Responsable Inscripto
if (// no recupera correctamente el loc_taxpayertype_id desde orgInfo && orgI.get_ValueAsInt("LCO_TaxPayerType_ID") == responsableInscripto)
wc.isUseOrgTaxPayerType()) {
// Recupera la categoría de IVA del SdN
final int bpTaxPaxerTypeID = bp.get_ValueAsInt("LCO_TaxPayerType_ID");
// no se genera retención de IVA.
if (bpTaxPaxerTypeID != responsableInscripto && facturas.length <= 0)
continue;
else {
// Se recorren las facturas de la OP
for (final MPaymentAllocate mp : facturas) {
MInvoice factura = mp.getInvoice();
MDocType doc = new MDocType(Env.getCtx(), factura.getC_DocType_ID(), this.get_TrxName());
MInvoiceTax[] impFactura = factura.getTaxes(false);
// Se recorren los impuestos de la factura
for (final MInvoiceTax impuesto : impFactura) {
MTax tax = new MTax(Env.getCtx(), impuesto.getC_Tax_ID(), this.get_TrxName());
// Se recupera la letra del tipo de documento
// si es letra M se retiene el 100% y supera el mínimo
String letra = recuperaLetra(doc.get_ValueAsInt("LAR_DocumentLetter_ID"));
// Si el cálculo esta configurado como Documento se asume que es retención por tipo de doc M
if (wc.getBaseType().equals("D")) {
if (letra.equals("M") && (factura.getGrandTotal().compareTo(wc.getPaymentThresholdMin()) > 0)) {
aliquot = wc.getAliquot();
if (tax.getName().contains("IVA"))
impSujetoaRet = impSujetoaRet.add(impuesto.getTaxAmt());
} else
continue;
} else if (tax.getName().contains("IVA")) {
impSujetoaRet = impSujetoaRet.add(impuesto.getTaxAmt());
// Si es alicuota reducida
if (tax.getRate().compareTo(alicuotaIVAGral) < 0)
aliquot = alicuotaRetReducida;
else
// Si no es reducida, se utiliza la
// alicuota de la configuración
aliquot = wc.getAliquot();
}
// Se calcula y acumula la retención
impRetencion = impRetencion.add(impSujetoaRet.multiply(aliquot).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN));
}
// Se recorren los impuestos de la factura
}
// Se recorren las facturas de la OP
}
// Exención de IVA
if (bp.get_ValueAsBoolean("LAR_Exento_Retenciones_IVA")) {
Date fechaVenc = (Date) bp.get_Value("LAR_Vencimiento_Cert_IVA");
if (!fechaVenc.before(getDateTrx())) {
impExencion = (BigDecimal) bp.get_Value("LAR_Importe_Exencion_IVA");
porcExencion = (BigDecimal) bp.get_Value("LAR_Exencion_IVA");
} else {
// Advertir al ususario que el certificado de Exención esta vencido
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Certificado de Exenci\u00f3n de IVA Vencido");
}
}
// Exenciones % e importe fijo
BigDecimal impExentoDesc = impRetencion.multiply(porcExencion).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN);
impRetencion = impRetencion.subtract(impExentoDesc).subtract(impExencion);
// el importe a pagar
if (totalOP.compareTo(impRetencion) < 0)
impRetencion = totalOP;
}
// Es retención de IVA
}
// Considerar las Exenciones
final X_LCO_WithholdingType wt = new X_LCO_WithholdingType(Env.getCtx(), wc.getWithholdingType_ID(), get_TrxName());
// Exención de IIBB
if (wc.isUseBPISIC() && bp.get_ValueAsBoolean("LAR_Exento_Ret_IIBB")) {
Date fechaVenc = (Date) bp.get_Value("LAR_Vencimiento_Cert_IIBB");
Date fechaInicio = (Date) bp.get_Value("LAR_Inicio_Cert_IIBB");
if (!fechaInicio.after(getDateTrx()) && !fechaVenc.before(getDateTrx())) {
impExencion = (BigDecimal) bp.get_Value("LAR_Importe_Exencion_IIBB");
porcExencion = (BigDecimal) bp.get_Value("LAR_Exencion_IIBB");
} else {
// Advertir al ususario que el certificado de Exención esta vencido
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Certificado de Exenci\u00f3n de IIBB Vencido");
}
// Exenciones % e importe fijo
BigDecimal impExentoDesc = impRetencion.multiply(porcExencion).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN);
impRetencion = impRetencion.subtract(impExentoDesc).subtract(impExencion);
}
// Exención de SUSS
if (wt.getName().contains("SUSS") && bp.get_ValueAsBoolean("LAR_Exento_Retenciones_SUSS")) {
Date fechaVenc = (Date) bp.get_Value("LAR_Vencimiento_Cert_SUSS");
Date fechaInicio = (Date) bp.get_Value("LAR_Inicio_Cert_SUSS");
if (!fechaInicio.after(getDateTrx()) && !fechaVenc.before(getDateTrx())) {
impExencion = (BigDecimal) bp.get_Value("LAR_Importe_Exencion_SUSS");
porcExencion = (BigDecimal) bp.get_Value("LAR_Exencion_SUSS");
} else {
// Advertir al ususario que el certificado de Exención esta vencido
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Certificado de Exenci\u00f3n de SUSS Vencido");
}
// Exenciones % e importe fijo
BigDecimal impExentoDesc = impRetencion.multiply(porcExencion).divide(Env.ONEHUNDRED).setScale(2, BigDecimal.ROUND_HALF_EVEN);
impRetencion = impRetencion.subtract(impExentoDesc).subtract(impExencion);
}
// Si el importe de la retención no supera el mínimo o es cero
if (impRetencion.compareTo(impRetMin) < 0 || impRetencion.compareTo(Env.ZERO) <= 0)
continue;
// Validar que si existen facturas, quede importe disponible a pagar
if (facturas.length > 0) {
BigDecimal sumaRemanente = Env.ZERO;
for (final MPaymentAllocate mp : facturas) sumaRemanente = sumaRemanente.add(mp.getAmount());
if (sumaRemanente.compareTo(impRetencion) < 0) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "No existe suficiente importe pendiente de pago (Revisar las facturas cargadas en la Orden de Pago).");
return false;
}
}
// @fchiappano verifico que existan pagos en los que se pueda
// descontar el importe de la retención.
MPayment pago = null;
boolean compensar = false;
for (MPayment payment : getPayments(get_TrxName())) {
if (!payment.getTenderType().equals("Z") && !payment.get_ValueAsBoolean("EsRetencionIIBB") && payment.getPayAmt().compareTo(impRetencion) >= 0) {
pago = payment;
compensar = true;
// lo utilice prefrentemente por encima de los demás TT que pueden compensar.
if (payment.getTenderType().equals("X"))
break;
}
}
// Existe un pago que permite compensar el importe de la retención
if (compensar && genera) {
// Se crea el Pago Retención compensando el importe
final MPayment pagoRetencion = creaPagoRetencion(impRetencion, cargoRetencion, c_DocType_ID, pago, compensar);
if (pagoRetencion == null) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al generar el Pago Retenci\u00f3n");
return false;
}
log.config("Pago Retenci\u00f3n: " + pagoRetencion.getC_Payment_ID());
// Se crea el Certificado de Retención
final MLARPaymentWithholding certificado = creaCertificadodeRetencion(impRetencion, impSujetoaRet, wc, pagoRetencion.getC_Payment_ID());
if (certificado == null) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al generar el Certificado de Retenci\u00f3n");
return false;
}
log.config("Certificado Retenci\u00f3n: " + certificado.getLAR_PaymentWithholding_ID());
} else if (genera) {
// Se crea el Pago Retención sin compensar el importe
final MPayment pagoRetencion = creaPagoRetencion(impRetencion, cargoRetencion, c_DocType_ID, pago, false);
if (pagoRetencion == null) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al generar el Pago Retenci\u00f3n");
return false;
}
log.config("Pago Retenci\u00f3n: " + pagoRetencion.getC_Payment_ID());
// Se crea el Certificado de Retención
final MLARPaymentWithholding certificado = creaCertificadodeRetencion(impRetencion, impSujetoaRet, wc, pagoRetencion.getC_Payment_ID());
if (certificado == null) {
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al generar el Certificado de Retenci\u00f3n");
return false;
}
log.config("Certificado Retenci\u00f3n: " + certificado.getLAR_PaymentWithholding_ID());
} else
this.setWithholdingAmt(impRetencion);
this.saveEx();
}
}
else // Se recorren las configuraciones recuperadas
{
JDialog dialog = new JDialog();
dialog.setIconImage(Adempiere.getImage16());
ADialog.warn(1, dialog, "Error al recuperar configuración desde el SdN");
return false;
}
// pero en la pestaña se visualizan los eliminados y es necesario refrescar manualmente para ver los nuevos.
return true;
}
use of org.compiere.model.MInvoiceTax in project adempiere by adempiere.
the class TaxDeclarationCreate method create.
// doIt
/**
* Create Data
* @param invoice invoice
*/
private void create(MInvoice invoice) {
/** Lines **
MInvoiceLine[] lines = invoice.getLines();
for (int i = 0; i < lines.length; i++)
{
MInvoiceLine line = lines[i];
if (line.isDescription())
continue;
//
MTaxDeclarationLine tdl = new MTaxDeclarationLine (m_td, invoice, line);
tdl.setLine((m_noLines+1) * 10);
if (tdl.save())
m_noLines++;
}
/** **/
/** Invoice Tax **/
MInvoiceTax[] taxes = invoice.getTaxes(false);
for (int i = 0; i < taxes.length; i++) {
MInvoiceTax tLine = taxes[i];
//
MTaxDeclarationLine tdl = new MTaxDeclarationLine(m_td, invoice, tLine);
tdl.setLine((m_noLines + 1) * 10);
if (tdl.save())
m_noLines++;
}
/** **/
/** Acct **/
String sql = "SELECT * FROM Fact_Acct WHERE AD_Table_ID=? AND Record_ID=?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, MInvoice.Table_ID);
pstmt.setInt(2, invoice.getC_Invoice_ID());
rs = pstmt.executeQuery();
while (rs.next()) {
// no lock
MFactAcct fact = new MFactAcct(getCtx(), rs, null);
MTaxDeclarationAcct tda = new MTaxDeclarationAcct(m_td, fact);
tda.setLine((m_noAccts + 1) * 10);
if (tda.save())
m_noAccts++;
}
} catch (Exception e) {
log.log(Level.SEVERE, sql, e);
} finally {
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
/** **/
}
use of org.compiere.model.MInvoiceTax in project lar_361 by comitsrl.
the class LCO_Validator method translateWithholdingToTaxes.
private String translateWithholdingToTaxes(MInvoice inv) {
BigDecimal sumit = new BigDecimal(0);
MDocType dt = new MDocType(inv.getCtx(), inv.getC_DocTypeTarget_ID(), inv.get_TrxName());
String genwh = dt.get_ValueAsString("GenerateWithholding");
if (genwh == null || genwh.equals("N")) {
// document configured to not manage withholdings - delete any
String sqldel = "DELETE FROM LCO_InvoiceWithholding " + " WHERE C_Invoice_ID = ?";
PreparedStatement pstmtdel = null;
try {
// Delete previous records generated
pstmtdel = DB.prepareStatement(sqldel, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE, inv.get_TrxName());
pstmtdel.setInt(1, inv.getC_Invoice_ID());
int nodel = pstmtdel.executeUpdate();
log.config("LCO_InvoiceWithholding deleted=" + nodel);
} catch (Exception e) {
log.log(Level.SEVERE, sqldel, e);
return "Error creating C_InvoiceTax from LCO_InvoiceWithholding -delete";
} finally {
DB.close(pstmtdel);
pstmtdel = null;
}
inv.set_CustomColumn("WithholdingAmt", Env.ZERO);
} else {
// translate withholding to taxes
String sql = "SELECT C_Tax_ID, NVL(SUM(TaxBaseAmt),0) AS TaxBaseAmt, NVL(SUM(TaxAmt),0) AS TaxAmt " + " FROM LCO_InvoiceWithholding " + " WHERE C_Invoice_ID = ? AND IsCalcOnPayment = 'N' AND IsActive = 'Y' " + "GROUP BY C_Tax_ID";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = DB.prepareStatement(sql, inv.get_TrxName());
pstmt.setInt(1, inv.getC_Invoice_ID());
rs = pstmt.executeQuery();
while (rs.next()) {
MInvoiceTax it = new MInvoiceTax(inv.getCtx(), 0, inv.get_TrxName());
it.setAD_Org_ID(inv.getAD_Org_ID());
it.setC_Invoice_ID(inv.getC_Invoice_ID());
it.setC_Tax_ID(rs.getInt(1));
it.setTaxBaseAmt(rs.getBigDecimal(2));
it.setTaxAmt(rs.getBigDecimal(3).negate());
sumit = sumit.add(rs.getBigDecimal(3));
if (!it.save())
return "Error creating C_InvoiceTax from LCO_InvoiceWithholding - save InvoiceTax";
}
BigDecimal actualamt = (BigDecimal) inv.get_Value("WithholdingAmt");
if (actualamt == null)
actualamt = new BigDecimal(0);
if (actualamt.compareTo(sumit) != 0 || sumit.signum() != 0) {
inv.set_CustomColumn("WithholdingAmt", sumit);
// Subtract to invoice grand total the value of withholdings
BigDecimal gt = inv.getGrandTotal();
inv.setGrandTotal(gt.subtract(sumit));
// need to save here in order to let apply get the right total
inv.save();
}
if (sumit.signum() != 0) {
// GrandTotal changed! If there are payment schedule records they need to be recalculated
// subtract withholdings from the first installment
BigDecimal toSubtract = sumit;
for (MInvoicePaySchedule ips : MInvoicePaySchedule.getInvoicePaySchedule(inv.getCtx(), inv.getC_Invoice_ID(), 0, inv.get_TrxName())) {
if (ips.getDueAmt().compareTo(toSubtract) >= 0) {
ips.setDueAmt(ips.getDueAmt().subtract(toSubtract));
toSubtract = Env.ZERO;
} else {
toSubtract = toSubtract.subtract(ips.getDueAmt());
ips.setDueAmt(Env.ZERO);
}
if (!ips.save()) {
return "Error saving Invoice Pay Schedule subtracting withholdings";
}
if (toSubtract.signum() <= 0)
break;
}
}
} catch (Exception e) {
log.log(Level.SEVERE, sql, e);
return "Error creating C_InvoiceTax from LCO_InvoiceWithholding - select InvoiceTax";
} finally {
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
}
return null;
}
Aggregations