Search in sources :

Example 1 with MInvoiceTax

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;
}
Also used : MInvoiceTax(org.compiere.model.MInvoiceTax) BigDecimal(java.math.BigDecimal)

Example 2 with MInvoiceTax

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);
    }
}
Also used : MDocType(org.compiere.model.MDocType) MPOS(org.compiere.model.MPOS) MCurrency(org.compiere.model.MCurrency) FileWriter(java.io.FileWriter) MBPartner(org.compiere.model.MBPartner) BigDecimal(java.math.BigDecimal) X_LCO_TaxPayerType(org.globalqss.model.X_LCO_TaxPayerType) MTax(org.compiere.model.MTax) MInvoiceTax(org.compiere.model.MInvoiceTax) File(java.io.File)

Example 3 with MInvoiceTax

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;
}
Also used : MDocType(org.compiere.model.MDocType) SQLException(java.sql.SQLException) MInvoice(org.compiere.model.MInvoice) PreparedStatement(java.sql.PreparedStatement) MBPartner(org.compiere.model.MBPartner) MPaymentAllocate(org.compiere.model.MPaymentAllocate) BigDecimal(java.math.BigDecimal) Date(java.util.Date) MPayment(org.compiere.model.MPayment) ResultSet(java.sql.ResultSet) X_LCO_WithholdingType(org.globalqss.model.X_LCO_WithholdingType) ArrayList(java.util.ArrayList) List(java.util.List) MTax(org.compiere.model.MTax) MInvoiceTax(org.compiere.model.MInvoiceTax) JDialog(javax.swing.JDialog)

Example 4 with MInvoiceTax

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;
    }
/** **/
}
Also used : MTaxDeclarationAcct(org.compiere.model.MTaxDeclarationAcct) ResultSet(java.sql.ResultSet) MFactAcct(org.compiere.model.MFactAcct) PreparedStatement(java.sql.PreparedStatement) MInvoiceTax(org.compiere.model.MInvoiceTax) MTaxDeclarationLine(org.compiere.model.MTaxDeclarationLine)

Example 5 with MInvoiceTax

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;
}
Also used : MDocType(org.compiere.model.MDocType) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) MInvoiceTax(org.compiere.model.MInvoiceTax) MInvoicePaySchedule(org.compiere.model.MInvoicePaySchedule) BigDecimal(java.math.BigDecimal) SQLException(java.sql.SQLException)

Aggregations

MInvoiceTax (org.compiere.model.MInvoiceTax)5 BigDecimal (java.math.BigDecimal)4 PreparedStatement (java.sql.PreparedStatement)3 ResultSet (java.sql.ResultSet)3 MDocType (org.compiere.model.MDocType)3 SQLException (java.sql.SQLException)2 MBPartner (org.compiere.model.MBPartner)2 MTax (org.compiere.model.MTax)2 File (java.io.File)1 FileWriter (java.io.FileWriter)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 List (java.util.List)1 JDialog (javax.swing.JDialog)1 MCurrency (org.compiere.model.MCurrency)1 MFactAcct (org.compiere.model.MFactAcct)1 MInvoice (org.compiere.model.MInvoice)1 MInvoicePaySchedule (org.compiere.model.MInvoicePaySchedule)1 MPOS (org.compiere.model.MPOS)1 MPayment (org.compiere.model.MPayment)1