viernes, 23 de marzo de 2018

Don't let select a paid invoice on another payment #3


/***
    @author: José Francisco Rodríguez Chávez
    @email: jfrodriguez.idempiere@gmail.com
    @created: 20/03/2018 10:45 am
    @lastupdated: 20/03/2018 10:45 am
    @version: 1.0
    @description: Don't let duplicated invoices on payment allocate
    @name: beanshell:ValidarFacturaVariosPagos
***/

import org.compiere.util.DB;
import org.compiere.util.Env;
import org.adempiere.webui.window.FDialog;

v_id_factura = A_PO.get_Value("C_Invoice_ID");

pcheck = (v_id_factura == null || v_id_factura == VOID);

if(!pcheck)
{
    String sql = "SELECT * FROM adempiere.fnt_validar_factura_varios_pagos(" + v_id_factura + ");";
    String sql2 = "SELECT * FROM adempiere.fnt_obtener_vpagos_factura(" + v_id_factura + ");";

    rows = DB.getRowSet(sql.toString());
    rows2 = DB.getRowSet(sql2.toString());

    if(rows.next())
    {
        if(rows.getBoolean(1) == false)
        {
            if(rows2.next())
            {
                String pagos = rows2.getString(1);

                return "La factura seleccionada ya esta en uso en el pago: " + pagos;
            }
        }
    }
}

Don't let select a paid invoice on another payment #2


-- SET search_path TO adempiere;

-- SELECT * FROM fnt_obtener_vpagos_factura(1000000);

-- SELECT * FROM fnt_obtener_vpagos_factura(1109368);

-- SELECT * FROM fnt_obtener_vpagos_factura(1008186);

-- SELECT * FROM fnt_obtener_vpagos_factura(1074626);

-- DROP FUNCTION fnt_obtener_vpagos_factura(p_invoice_id NUMERIC(10,0));

CREATE OR REPLACE FUNCTION fnt_obtener_vpagos_factura(p_invoice_id NUMERIC(10,0))
RETURNS VARCHAR
AS $$
BEGIN
    RETURN
    (
        WITH cte_factura_pagos AS
        (
            SELECT
                p.c_payment_id AS id_pago,
                p.documentno AS num_pago,
                pa.c_paymentallocate_id AS id_abono,
                pa.c_invoice_id AS id_factura,
                pa.overunderamt AS monto_subpago
            FROM c_payment p
                JOIN c_paymentallocate pa
                ON p.c_payment_id = pa.c_payment_id
            WHERE p.ad_client_id = 1000000
                AND p.docstatus IN ('CO', 'CL')
                AND pa.c_invoice_id = p_invoice_id
        )
        SELECT COALESCE(
        (
            SELECT list_horizontal(fp.num_pago)::VARCHAR FROM cte_factura_pagos fp
            WHERE
            ((
                SELECT
                    COUNT(cp.id_factura) + 1
                FROM cte_factura_pagos AS cp
               
            ) > 1
            AND (
                SELECT
                    fr.monto_subpago
                FROM cte_factura_pagos fr
                WHERE fr.id_abono =
                (
                    SELECT
                        MAX(r.id_abono)
                    FROM cte_factura_pagos AS r
                )
            ) = 0)
        ), '')
    );
END;
$$ LANGUAGE plpgsql;

Don't let select a paid invoice on another payment #1


-- SET search_path TO adempiere;

-- SELECT * FROM fnt_validar_factura_varios_pagos(1000000);

-- SELECT * FROM fnt_validar_factura_varios_pagos(1109368);

-- SELECT * FROM fnt_validar_factura_varios_pagos(1008186);

-- SELECT * FROM fnt_validar_factura_varios_pagos(1074626);

CREATE OR REPLACE FUNCTION fnt_validar_factura_varios_pagos(p_invoice_id NUMERIC(10,0))
RETURNS BOOLEAN
AS $$
DECLARE
    v_resultado INT = 0;
BEGIN
    v_resultado =
    (
        WITH cte_factura_pagos AS
        (
            SELECT
                p.c_payment_id AS id_pago,
                pa.c_paymentallocate_id AS id_abono,
                pa.c_invoice_id AS id_factura,
                pa.overunderamt AS monto_subpago
            FROM c_payment p
                JOIN c_paymentallocate pa
                ON p.c_payment_id = pa.c_payment_id
            WHERE p.ad_client_id = 1000000
                AND p.docstatus IN ('CO', 'CL')
                AND pa.c_invoice_id = p_invoice_id
        )
        SELECT COALESCE(
        (
            SELECT DISTINCT 1 FROM cte_factura_pagos fp
            WHERE
            ((
                SELECT
                    COUNT(cp.id_factura) + 1
                FROM cte_factura_pagos AS cp
              
            ) > 1
            AND (
                SELECT
                    fr.monto_subpago
                FROM cte_factura_pagos fr
                WHERE fr.id_abono =
                (
                    SELECT
                        MAX(r.id_abono)
                    FROM cte_factura_pagos AS r
                )
            ) = 0)
        ), 0)
    );
  
    IF(v_resultado = 1)THEN
        RETURN FALSE;
    ELSE
        RETURN TRUE;
    END IF;
END;
$$ LANGUAGE plpgsql;


miércoles, 21 de marzo de 2018

List Horizontal in iDempiere


/*********************************************************/

-- Function: coma_concat(text, text)

-- DROP FUNCTION coma_concat(text, text);

CREATE OR REPLACE FUNCTION coma_concat(
    text,
    text)
  RETURNS text AS
$BODY$
    SELECT
    CASE
        WHEN $2 IS NULL OR $2 = '' THEN '[' ||  $1 || ']'
        WHEN $1 IS NULL OR $1 = '' THEN '[' ||  $2 || ']'
        ELSE $1 || ';' ||   '[' || $2 || ']'

    END
    $BODY$
  LANGUAGE sql VOLATILE
  COST 100;

/*********************************************************/

-- Aggregate: list_horizontal(text)

-- DROP AGGREGATE list_horizontal(text);

CREATE AGGREGATE list_horizontal(text) (
  SFUNC=coma_concat,
  STYPE=text,
  INITCOND=''
);

/*********************************************************/

EXAMPLE:

SELECT  adempiere.list_horizontal(c."name") FROM adempiere.AD_Client AS c;

RESULT:

[GardenWorld];[System];[Company X]