CREATE FUNCTION log_insert() RETURNS trigger
    LANGUAGE plpgsql
    AS 
    $func$
    BEGIN
    WITH
    ------------------------------------full extraction-------------------------------------------
    full_ex AS (
        SELECT
            ins.id
            ,a.i gl_line
            ,a.rn gl_row
            ,NEW.bpr#>ARRAY['gl','jpath',(a.rn - 1)::text] gl_ref
            ,p.i ref_line
            ,p.rn ref_row
            ,NEW.bpr#>(p.i->>0)::text[] bpr_extract
        FROM
            ins
            --gl array hold each gl line
            LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(NEW.bpr->'gl'->'lines') WITH ORDINALITY a(i, rn) ON TRUE
            --for each
            LEFT JOIN LATERAL JSONB_ARRAY_ELEMENTS(NEW.bpr#>ARRAY['gl','jpath',(a.rn - 1)::text]) WITH ORDINALITY p(i, rn) ON TRUE
    )
    --------------------------------re-ggregate extraction to gl line level----------------------
    ,ex_gl_line
    SELECT 
        id
        ,gl_line->>'account' account
        ,(gl_line->>'amount')::numeric amount
        ,gl_row
        ,gl_ref
        ,public.jsonb_concat(bpr_extract) ref_extract
    FROM 
        full_ex
    GROUP BY 
        id
        ,gl_line
        ,gl_row
        ,gl_ref;
    RETURN NULL;
    END;
    $func$
    

CREATE TRIGGER log_insert 
    AFTER INSERT ON log 
    REFERENCING NEW TABLE AS ins 
    FOR EACH STATEMENT 
    EXECUTE PROCEDURE log_insert();