Search in sources :

Example 1 with X_LCO_WithholdingType

use of org.globalqss.model.X_LCO_WithholdingType 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 2 with X_LCO_WithholdingType

use of org.globalqss.model.X_LCO_WithholdingType in project lar_361 by comitsrl.

the class WithholdingConfig method getConfig.

/**
 *******************************************************
 *  Obtiene la configuración de retenciones/percepciones
 *  @param MBPartner Socio del Negocio
 *  @param isSOTrx
 *  @return Configuraciones de retención
 */
public static WithholdingConfig[] getConfig(final MBPartner bp, boolean isSOTrx, String trxName, MOrder order, Timestamp dateTrx) {
    log.info("");
    final List<WithholdingConfig> list = new ArrayList<WithholdingConfig>();
    try {
        // Fill variables normally needed
        // BP variables
        Integer bp_isic_int = (Integer) bp.get_Value("LCO_ISIC_ID");
        int bp_isic_id = 0;
        if (bp_isic_int != null)
            bp_isic_id = bp_isic_int.intValue();
        Integer bp_taxpayertype_int = (Integer) bp.get_Value("LCO_TaxPayerType_ID");
        int bp_taxpayertype_id = 0;
        if (bp_taxpayertype_int != null)
            bp_taxpayertype_id = bp_taxpayertype_int.intValue();
        String lar_tipoganancias = bp.get_ValueAsString("LAR_TipoGanancias");
        /*
             * No se utiliza la dirección del BP en los tipos de retenciones/percepciones que
             * aplicamos. TODO: Revisar la forma de recuperar la dirección sin estar en un
             * operación que obligue a seleccionarla.
             */
        MBPartnerLocation mbpl = new MBPartnerLocation(Env.getCtx(), bp.getLocations(true)[0].get_ID(), trxName);
        MLocation bpl = MLocation.get(Env.getCtx(), mbpl.getC_Location_ID(), trxName);
        int bp_city_id = bpl.getC_City_ID();
        // OrgInfo variables
        MOrgInfo oi = MOrgInfo.get(Env.getCtx(), Env.getAD_Org_ID(Env.getCtx()), trxName);
        Integer org_isic_int = (Integer) oi.get_Value("LCO_ISIC_ID");
        int org_isic_id = 0;
        if (org_isic_int != null)
            org_isic_id = org_isic_int.intValue();
        Integer org_taxpayertype_int = (Integer) oi.get_Value("LCO_TaxPayerType_ID");
        int org_taxpayertype_id = 0;
        if (org_taxpayertype_int != null)
            org_taxpayertype_id = org_taxpayertype_int.intValue();
        MLocation ol = MLocation.get(Env.getCtx(), oi.getC_Location_ID(), trxName);
        int org_city_id = ol.getC_City_ID();
        // Search withholding types applicable depending on IsSOTrx
        String sqlt = "SELECT LCO_WithholdingType_ID " + " FROM LCO_WithholdingType " + " WHERE IsSOTrx = ? AND IsActive = 'Y'";
        PreparedStatement pstmtt = DB.prepareStatement(sqlt, trxName);
        pstmtt.setString(1, isSOTrx ? "Y" : "N");
        ResultSet rst = pstmtt.executeQuery();
        while (rst.next()) {
            // Por cada una de las retenciones aplicables
            X_LCO_WithholdingType wt = new X_LCO_WithholdingType(Env.getCtx(), rst.getInt(1), trxName);
            X_LCO_WithholdingRuleConf wrc = null;
            log.info("Withholding Type: " + wt.getLCO_WithholdingType_ID() + "/" + wt.getName());
            // look the conf fields
            String sqlrc = "SELECT * " + " FROM LCO_WithholdingRuleConf " + " WHERE LCO_WithholdingType_ID = ? AND IsActive = 'Y'";
            PreparedStatement pstmtrc = DB.prepareStatement(sqlrc, trxName);
            pstmtrc.setInt(1, wt.getLCO_WithholdingType_ID());
            ResultSet rsrc = pstmtrc.executeQuery();
            if (rsrc.next()) {
                wrc = new X_LCO_WithholdingRuleConf(Env.getCtx(), rsrc, trxName);
            } else {
                log.warning("No LCO_WithholdingRuleConf for LCO_WithholdingType = " + wt.getLCO_WithholdingType_ID());
                rsrc.close();
                pstmtrc.close();
                continue;
            }
            rsrc.close();
            pstmtrc.close();
            // look for applicable rules according to config fields (rule)
            StringBuffer sqlr = new StringBuffer("SELECT LCO_WithholdingRule_ID " + "  FROM LCO_WithholdingRule " + " WHERE LCO_WithholdingType_ID = ? " + "   AND IsActive = 'Y' " + "   AND ValidFrom <= ? ");
            if (wrc.isUseBPISIC())
                sqlr.append(" AND LCO_BP_ISIC_ID = ? ");
            if (wrc.isUseBPTaxPayerType())
                sqlr.append(" AND LCO_BP_TaxPayerType_ID = ? ");
            if (wrc.isUseOrgISIC())
                sqlr.append(" AND LCO_Org_ISIC_ID = ? ");
            if (wrc.isUseOrgTaxPayerType())
                sqlr.append(" AND LCO_Org_TaxPayerType_ID = ? ");
            if (wrc.isUseBPCity())
                sqlr.append(" AND LCO_BP_City_ID = ? ");
            if (wrc.isUseOrgCity())
                sqlr.append(" AND LCO_Org_City_ID = ? ");
            if (wrc.get_ValueAsBoolean("LAR_UsaTipoGananciasBP"))
                sqlr.append(" AND LAR_TipoGananciasBP = ? ");
            if (isSOTrx) {
                if (order != null) {
                    // Add withholding categories of lines
                    if (wrc.isUseWithholdingCategory()) {
                        // look the conf fields
                        String sqlwcs = "SELECT DISTINCT COALESCE (p.LCO_WithholdingCategory_ID, COALESCE (c.LCO_WithholdingCategory_ID, 0)) " + "  FROM C_OrderLine il " + "  LEFT OUTER JOIN M_Product p ON (il.M_Product_ID = p.M_Product_ID) " + "  LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID = c.C_Charge_ID) " + "  WHERE C_OrderLine_ID = ? AND il.IsActive='Y'";
                        PreparedStatement pstmtwcs = DB.prepareStatement(sqlwcs, trxName);
                        pstmtwcs.setInt(1, order.getC_Order_ID());
                        ResultSet rswcs = pstmtwcs.executeQuery();
                        int i = 0;
                        int wcid = 0;
                        boolean addedlines = false;
                        while (rswcs.next()) {
                            wcid = rswcs.getInt(1);
                            if (wcid > 0) {
                                if (i == 0) {
                                    sqlr.append(" AND LCO_WithholdingCategory_ID IN (");
                                    addedlines = true;
                                } else {
                                    sqlr.append(",");
                                }
                                sqlr.append(wcid);
                                i++;
                            }
                        }
                        if (addedlines)
                            sqlr.append(") ");
                        rswcs.close();
                        pstmtwcs.close();
                    }
                }
                // Add tax categories of lines
                if (wrc.isUseProductTaxCategory()) {
                    // look the conf fields
                    String sqlwct = "SELECT DISTINCT COALESCE (p.C_TaxCategory_ID, COALESCE (c.C_TaxCategory_ID, 0)) " + "  FROM C_InvoiceLine il " + "  LEFT OUTER JOIN M_Product p ON (il.M_Product_ID = p.M_Product_ID) " + "  LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID = c.C_Charge_ID) " + "  WHERE C_Invoice_ID = ? AND il.IsActive='Y'";
                    PreparedStatement pstmtwct = DB.prepareStatement(sqlwct, trxName);
                    pstmtwct.setInt(1, order.getC_Order_ID());
                    ResultSet rswct = pstmtwct.executeQuery();
                    int i = 0;
                    int wcid = 0;
                    boolean addedlines = false;
                    while (rswct.next()) {
                        wcid = rswct.getInt(1);
                        if (wcid > 0) {
                            if (i == 0) {
                                sqlr.append(" AND C_TaxCategory_ID IN (");
                                addedlines = true;
                            } else {
                                sqlr.append(",");
                            }
                            sqlr.append(wcid);
                            i++;
                        }
                    }
                    if (addedlines)
                        sqlr.append(") ");
                    rswct.close();
                    pstmtwct.close();
                }
            }
            PreparedStatement pstmtr = DB.prepareStatement(sqlr.toString(), trxName);
            int idxpar = 1;
            pstmtr.setInt(idxpar, wt.getLCO_WithholdingType_ID());
            idxpar++;
            pstmtr.setTimestamp(idxpar, dateTrx);
            if (wrc.isUseBPISIC()) {
                idxpar++;
                pstmtr.setInt(idxpar, bp_isic_id);
            }
            if (wrc.isUseBPTaxPayerType()) {
                idxpar++;
                pstmtr.setInt(idxpar, bp_taxpayertype_id);
            }
            if (wrc.isUseOrgISIC()) {
                idxpar++;
                pstmtr.setInt(idxpar, org_isic_id);
            }
            if (wrc.isUseOrgTaxPayerType()) {
                idxpar++;
                pstmtr.setInt(idxpar, org_taxpayertype_id);
            }
            if (wrc.isUseBPCity()) {
                idxpar++;
                pstmtr.setInt(idxpar, bp_city_id);
                if (bp_city_id <= 0)
                    log.warning("Possible configuration error bp city is used but not set");
            }
            if (wrc.isUseOrgCity()) {
                idxpar++;
                pstmtr.setInt(idxpar, org_city_id);
                if (org_city_id <= 0)
                    log.warning("Possible configuration error org city is used but not set");
            }
            if (wrc.get_ValueAsBoolean("LAR_UsaTipoGananciasBP")) {
                idxpar++;
                if (lar_tipoganancias.equals("")) {
                    log.warning("No existe configuraci\u00f3n de Ganancias para el SdN");
                    return null;
                }
                pstmtr.setString(idxpar, lar_tipoganancias);
            }
            ResultSet rsr = pstmtr.executeQuery();
            while (rsr.next()) {
                // for each applicable rule
                X_LCO_WithholdingRule wr = new X_LCO_WithholdingRule(Env.getCtx(), rsr.getInt(1), trxName);
                // bring record for withholding calculation
                X_LCO_WithholdingCalc wc = new X_LCO_WithholdingCalc(Env.getCtx(), wr.getLCO_WithholdingCalc_ID(), trxName);
                if (wc.getLCO_WithholdingCalc_ID() == 0) {
                    log.severe("Regla sin c\u00e1lculo configurado: " + wr.getName());
                    continue;
                }
                // bring record for tax
                MTax tax = new MTax(Env.getCtx(), wc.getC_Tax_ID(), trxName);
                log.info("WithholdingRule: " + wr.getLCO_WithholdingRule_ID() + "/" + wr.getName() + " BaseType:" + wc.getBaseType() + " Calc: " + wc.getLCO_WithholdingCalc_ID() + "/" + wc.getName() + " CalcOnInvoice:" + wc.isCalcOnInvoice() + " Tax: " + tax.getC_Tax_ID() + "/" + tax.getName());
                BigDecimal alicuota = BigDecimal.ZERO;
                BigDecimal tasa = BigDecimal.ZERO;
                alicuota = tax.getRate().setScale(4, BigDecimal.ROUND_HALF_EVEN);
                tasa = alicuota.multiply(BigDecimal.valueOf(100));
                WithholdingConfig config = new WithholdingConfig(alicuota, tasa, (BigDecimal) wrc.get_Value("PaymentThresholdMin"), wc.getThresholdmin(), wc.getThresholdMax(), wc.getAmountRefunded(), wc.isCalcOnPayment(), wr.getLCO_WithholdingRule_ID(), wr.getLCO_WithholdingType_ID(), wc.getC_Tax_ID(), wrc.get_ValueAsInt("C_DocType_ID"), wr.getC_TaxCategory_ID(), wrc.isUseBPISIC(), wrc.get_ValueAsBoolean("LAR_UsaTipoGananciasBP"), wrc.get_ValueAsBoolean("IsUseOrgTaxPayerType"), wc.getBaseType());
                if (!list.add(config)) {
                    log.severe("Error al agregar configuración a la lista");
                    continue;
                }
                ;
            }
        // while each applicable rule
        }
    // while each applicable withholding
    } catch (SQLException e) {
        log.log(Level.SEVERE, "", e);
        return null;
    }
    return list.toArray(new WithholdingConfig[list.size()]);
}
Also used : SQLException(java.sql.SQLException) ArrayList(java.util.ArrayList) PreparedStatement(java.sql.PreparedStatement) X_LCO_WithholdingCalc(org.globalqss.model.X_LCO_WithholdingCalc) BigDecimal(java.math.BigDecimal) MBPartnerLocation(org.compiere.model.MBPartnerLocation) MOrgInfo(org.compiere.model.MOrgInfo) ResultSet(java.sql.ResultSet) X_LCO_WithholdingType(org.globalqss.model.X_LCO_WithholdingType) MTax(org.compiere.model.MTax) X_LCO_WithholdingRule(org.globalqss.model.X_LCO_WithholdingRule) X_LCO_WithholdingRuleConf(org.globalqss.model.X_LCO_WithholdingRuleConf) MLocation(org.compiere.model.MLocation)

Aggregations

BigDecimal (java.math.BigDecimal)2 PreparedStatement (java.sql.PreparedStatement)2 ResultSet (java.sql.ResultSet)2 SQLException (java.sql.SQLException)2 ArrayList (java.util.ArrayList)2 MTax (org.compiere.model.MTax)2 X_LCO_WithholdingType (org.globalqss.model.X_LCO_WithholdingType)2 Date (java.util.Date)1 List (java.util.List)1 JDialog (javax.swing.JDialog)1 MBPartner (org.compiere.model.MBPartner)1 MBPartnerLocation (org.compiere.model.MBPartnerLocation)1 MDocType (org.compiere.model.MDocType)1 MInvoice (org.compiere.model.MInvoice)1 MInvoiceTax (org.compiere.model.MInvoiceTax)1 MLocation (org.compiere.model.MLocation)1 MOrgInfo (org.compiere.model.MOrgInfo)1 MPayment (org.compiere.model.MPayment)1 MPaymentAllocate (org.compiere.model.MPaymentAllocate)1 X_LCO_WithholdingCalc (org.globalqss.model.X_LCO_WithholdingCalc)1