Advertisement
samuel025

Function Sales Supplier

Apr 5th, 2022
1,306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Modified by Adrian, Apr 20, 2017
  3.  * Menghilangkan filter doc type
  4.  * Menghilangkan insert POS
  5.  * Menggganti in_log_product_balance_stock dan in_log_product_consignment_balance_stock
  6.  *      menjadi sl_so_balance_invoice untuk DO, Return Note, dan DO Receipt
  7.  *
  8.  * 2020 11 04
  9.  * menambahkan informasi price DPP dan PPn
  10.  */
  11.  
  12. CREATE OR REPLACE FUNCTION r_supplier_sales(character varying, bigint, bigint, bigint, character varying, bigint, character varying, character varying, bigint)
  13.   RETURNS SETOF refcursor AS
  14. $BODY$
  15. DECLARE
  16.     pRefHeader          REFCURSOR := 'refHeader';
  17.     pRefDetail          REFCURSOR := 'refDetail';
  18.     pSessionId          ALIAS FOR $1;
  19.     pTenantId           ALIAS FOR $2;
  20.     pUserId             ALIAS FOR $3;
  21.     pRoleId             ALIAS FOR $4;
  22.     pDatetime           ALIAS FOR $5;
  23.     pOuId               ALIAS FOR $6;
  24.     pStartDate          ALIAS FOR $7;
  25.     pEndDate            ALIAS FOR $8;
  26.     pPartnerId          ALIAS FOR $9;
  27.    
  28.     vEmptyId            bigint := -99;
  29.     vEmptyString        character varying := '';
  30.     vEmptyNumeric       numeric := 0;
  31.     vReleaseDoc         character varying := 'R';
  32.     vStock              character varying := 'Y';
  33.     vFilterPartner      text := '';
  34.     vDocTypeDo          bigint := 311;
  35.     vDocTypeDoReceipt   bigint := 526;
  36.     vDocTypeReturnNote  bigint := 502;
  37.     vReceiveGoodsManualDocTypeId bigint:=114;
  38.     vYes                character varying := 'Y';
  39.     vNo                 character varying := 'N';
  40.     vDoc                character varying := '';
  41.     vSubTotal       numeric := 0;
  42.     vDPP            numeric := 0;
  43.     vPPN            numeric := 0;
  44.    
  45. BEGIN
  46.    
  47.     DELETE FROM tr_report_sales_supplier WHERE session_id = pSessionId;
  48.                  
  49.     IF (pRoleId = -2) THEN
  50.  
  51.         SELECT partner_id INTO pPartnerId
  52.         FROM m_partner_user WHERE user_id = pUserId;
  53.  
  54.         vFilterPartner := ' AND C.supplier_id =  ' || pPartnerId;
  55.     ELSE
  56.        IF (pPartnerId <> vEmptyId) THEN
  57.         vFilterPartner := ' AND C.supplier_id = ' || pPartnerId;
  58.        END IF
  59.     END IF;
  60.    
  61.    
  62.     vDoc := 'ALL';
  63.    
  64.     /*
  65.      * insert data into table tr_report_sales_supplier for DO from in_log_product_balance_stock
  66.      */
  67.     EXECUTE '
  68.     INSERT INTO tr_report_sales_supplier(
  69.            session_id, tenant_id, ou_id, partner_id, so_item_id, transaction_type, doc_no,
  70.            doc_date, payment_method, product_id, product_code, supplier_product_code,
  71.            product_name, product_style, color, psize, normal_price, sold_price,
  72.            discount, margin_supp, sold_price_after_margin, qty_so)
  73.     SELECT $1, $2, $3, C.supplier_id, E.ref_id, f_get_doc_desc(D.doc_type_id), D.doc_no,
  74.            D.doc_date, $4, E.product_id, f_get_product_code(E.product_id), C.supplier_product_code,
  75.            f_get_product_name(E.product_id), B.style_product, B.color, B.size, F.normal_price_correction, F.sold_price_used,
  76.            F.discount, F.margin_supp_correction, F.sold_price_after_margin, SUM(E.qty_dlv_int)
  77.     FROM sl_so_balance_invoice A
  78.     INNER JOIN sl_do D ON A.ref_id = D.do_id AND D.doc_type_id = A.ref_doc_type_id AND D.ref_id = A.so_id
  79.     INNER JOIN sl_do_item E ON D.do_id = E.do_id AND A.ref_item_id = E.do_item_id
  80.     INNER JOIN m_product_custom B ON E.product_id = B.product_id
  81.     INNER JOIN m_product_consignment_supp_info C ON E.product_id = C.product_id
  82.     INNER JOIN pu_po_balance_item_consignment_sold F ON E.ref_id = F.so_item_id AND C.supplier_id = F.supplier_id
  83.     WHERE A.tenant_id = $2
  84.         AND D.doc_date BETWEEN $5 AND $6
  85.         AND A.ou_id = $3
  86.         AND B.flg_buy_konsinyasi = $7
  87.         AND A.ref_doc_type_id = $8
  88.         AND A.do_receipt_item_id = -99 ' ||
  89.         vFilterPartner || '
  90.         AND F.from_manual = $9
  91.     GROUP BY C.supplier_id, E.ref_id, D.doc_type_id, D.doc_no, D.doc_date, E.product_id, C.supplier_product_code, B.style_product, B.color, B.size,
  92.     F.normal_price_correction, F.sold_price_used, F.discount, F.margin_supp_correction, F.sold_price_after_margin
  93.     ' USING pSessionId, pTenantId, pOuId, vEmptyString, pStartDate, pEndDate, vYes, vDocTypeDo, vNo, vDocTypeDo;
  94.    
  95.     -- insert data into table tr_report_sales_supplier for GR Manual Consignment
  96.     EXECUTE '
  97.     INSERT INTO tr_report_sales_supplier(
  98.            session_id, tenant_id, ou_id, partner_id, so_item_id, transaction_type, doc_no,
  99.            doc_date, payment_method, product_id, product_code, supplier_product_code,
  100.            product_name, product_style, color, psize, normal_price, sold_price,
  101.            discount, margin_supp, sold_price_after_margin, qty_so)
  102.     SELECT $1, $2, $3, C.supplier_id,A.so_item_id, f_get_doc_desc($10),
  103.             B.doc_no,
  104.             B.doc_date, $4,
  105.            C.product_id, f_get_product_code(C.product_id), C.supplier_product_code,
  106.             f_get_product_name(C.product_id), E.style_product, E.color, E.size,
  107.             A.normal_price_correction, A.sold_price_used,
  108.             A.discount, A.margin_supp_correction, A.sold_price_after_margin, SUM(D.qty_rcv_po)
  109.     FROM pu_po_balance_item_consignment_sold A
  110.     INNER JOIN pu_receive_goods B ON A.receive_goods_id = B.receive_goods_id
  111.     INNER JOIN pu_receive_goods_item D ON B.receive_goods_id = D.receive_goods_id AND A.receive_goods_item_id = D.receive_goods_item_id
  112.     INNER JOIN m_product_consignment_supp_info C ON C.product_id = D.product_id
  113.     INNER JOIN m_product_custom E ON E.product_id = C.product_id
  114.     WHERE B.tenant_id = $2
  115.         AND B.doc_date BETWEEN $5 AND $6
  116.         AND B.ou_id = $3
  117.         AND E.flg_buy_konsinyasi = $7
  118.         AND B.doc_type_id = $8 ' || vFilterPartner || '
  119.         AND A.from_manual = $7
  120.     GROUP BY C.supplier_id, A.so_item_id, B.doc_type_id, B.doc_no, B.doc_date, C.product_id,
  121.              C.supplier_product_code, E.style_product, E.color, E.size,
  122.     A.normal_price_correction, A.sold_price_used, A.discount, A.margin_supp_correction, A.sold_price_after_margin
  123.     ' USING pSessionId, pTenantId, pOuId, vEmptyString, pStartDate, pEndDate, vYes, vReceiveGoodsManualDocTypeId, vYes, vDocTypeDo;    
  124.    
  125.     /*
  126.      * insert data into table tr_report_sales_supplier for Return Note from in_log_product_balance_stock
  127.      */
  128.     EXECUTE '
  129.     INSERT INTO tr_report_sales_supplier(
  130.            session_id, tenant_id, ou_id, partner_id, so_item_id, transaction_type, doc_no,
  131.            doc_date, payment_method, product_id, product_code, supplier_product_code,
  132.            product_name, product_style, color, psize, normal_price, sold_price,
  133.            discount, margin_supp, sold_price_after_margin, qty_so)
  134.     SELECT $1, $2, $3, C.supplier_id, E.ref_id, f_get_doc_desc(D.doc_type_id), D.doc_no,
  135.            D.doc_date, $4, E.product_id, f_get_product_code(E.product_id), C.supplier_product_code,
  136.            f_get_product_name(E.product_id), B.style_product, B.color, B.size, F.normal_price_correction, F.sold_price_used,
  137.            F.discount, F.margin_supp_correction, F.sold_price_after_margin, SUM(G.qty_realization) * -1
  138.     FROM sl_so_balance_invoice A
  139.     INNER JOIN in_inventory D ON A.ref_id = D.inventory_id
  140.     INNER JOIN in_inventory_item G ON D.inventory_id = G.inventory_id AND A.ref_item_id = G.ref_item_id
  141.     INNER JOIN sl_do_item E ON G.ref_item_id = E.do_item_id AND G.product_id = E.product_id
  142.     INNER JOIN m_product_custom B ON E.product_id = B.product_id
  143.     INNER JOIN m_product_consignment_supp_info C ON E.product_id = C.product_id
  144.     INNER JOIN pu_po_balance_item_consignment_sold F ON E.ref_id = F.so_item_id AND C.supplier_id = F.supplier_id
  145.     WHERE A.tenant_id = $2
  146.         AND D.doc_date BETWEEN $5 AND $6
  147.         AND A.ou_id = $3
  148.         AND B.flg_buy_konsinyasi = $7
  149.         AND A.ref_doc_type_id IN ($9) ' || 
  150.         vFilterPartner || '
  151.         AND F.from_manual = $10
  152.     GROUP BY C.supplier_id, E.ref_id, D.doc_type_id, D.doc_no, D.doc_date, E.product_id, C.supplier_product_code, B.style_product, B.color, B.size,
  153.     F.normal_price_correction, F.sold_price_used, F.discount, F.margin_supp_correction, F.sold_price_after_margin
  154.     ' USING pSessionId, pTenantId, pOuId, vEmptyString, pStartDate, pEndDate, vYes, vDocTypeDoReceipt, vDocTypeReturnNote, vNo;
  155.    
  156.    
  157.     /*
  158.      * insert data into table tr_report_sales_supplier for DO Receipt from in_log_product_balance_stock
  159.      */
  160.     EXECUTE '
  161.     INSERT INTO tr_report_sales_supplier(
  162.            session_id, tenant_id, ou_id, partner_id, so_item_id, transaction_type, doc_no,
  163.            doc_date, payment_method, product_id, product_code, supplier_product_code,
  164.            product_name, product_style, color, psize, normal_price, sold_price,
  165.            discount, margin_supp, sold_price_after_margin, qty_so)
  166.     SELECT $1, $2, $3, C.supplier_id, E.ref_id, f_get_doc_desc(D.doc_type_id), D.doc_no,
  167.            D.doc_date, $4, E.product_id, f_get_product_code(E.product_id), C.supplier_product_code,
  168.            f_get_product_name(E.product_id), B.style_product, B.color, B.size, F.normal_price_correction, F.sold_price_used,
  169.            F.discount, F.margin_supp_correction, F.sold_price_after_margin, SUM(G.qty_return) * -1
  170.     FROM sl_so_balance_invoice A
  171.     INNER JOIN in_do_receipt D ON A.ref_id = D.ref_id
  172.     INNER JOIN in_do_receipt_item G ON D.do_receipt_id = G.do_receipt_id AND A.ref_item_id = G.ref_id AND G.do_receipt_item_id = A.do_receipt_item_id
  173.     INNER JOIN sl_do_item E ON G.ref_id = E.do_item_id AND G.product_id = E.product_id AND E.do_item_id = A.ref_item_id
  174.     INNER JOIN m_product_custom B ON E.product_id = B.product_id
  175.     INNER JOIN m_product_consignment_supp_info C ON E.product_id = C.product_id
  176.     INNER JOIN pu_po_balance_item_consignment_sold F ON E.ref_id = F.so_item_id AND C.supplier_id = F.supplier_id
  177.     WHERE A.tenant_id = $2
  178.         AND D.doc_date BETWEEN $5 AND $6
  179.         AND A.ou_id = $3
  180.         AND B.flg_buy_konsinyasi = $7
  181.         AND A.ref_doc_type_id IN ($11) ' ||
  182.         vFilterPartner || '
  183.         AND F.from_manual = $10
  184.     GROUP BY C.supplier_id, E.ref_id, D.doc_type_id, D.doc_no, D.doc_date, E.product_id, C.supplier_product_code, B.style_product, B.color, B.size,
  185.     F.normal_price_correction, F.sold_price_used, F.discount, F.margin_supp_correction, F.sold_price_after_margin
  186.     ' USING pSessionId, pTenantId, pOuId, vEmptyString, pStartDate, pEndDate, vYes, vDocTypeDoReceipt, vDocTypeReturnNote, vNo, vDocTypeDo;
  187.    
  188.  
  189.     SELECT SUM(sub_total) INTO vSubTotal FROM (
  190.     SELECT (sold_price_after_margin * SUM(qty_so)) AS sub_total
  191.         FROM tr_report_sales_supplier
  192.         WHERE session_id = pSessionId
  193.             AND tenant_id = pTenantId
  194.         GROUP BY transaction_type, doc_no, doc_date, payment_method, product_code,
  195.            supplier_product_code, product_name, product_style, color, psize, normal_price,
  196.            sold_price, discount, margin_supp, sold_price_after_margin, partner_id ) Z;
  197.  
  198.     SELECT vSubTotal / (100+COALESCE(B.tax_percentage,0)/100) INTO vDPP
  199.     FROM tr_report_sales_supplier A
  200.     LEFT JOIN sl_so_item B ON A.so_item_id = B.so_item_id
  201.     WHERE A.session_id = pSessionId
  202.     AND A.tenant_id = pTenantId;
  203.            
  204.     --vDPP = vSubTotal / 1.1;
  205.    
  206.     vPPN =  vSubTotal - vDPP;
  207.        
  208.     Open pRefHeader FOR
  209.     SELECT pPartnerId AS partner_id, CASE WHEN pPartnerId = vEmptyId THEN '(All)' ELSE f_get_partner_name(pPartnerId) END AS partner_name, pStartDate AS start_date,   
  210.         pEndDate AS end_date, pDatetime AS print_datetime, pOuId AS ou_id, f_get_ou_name(pOuId) AS ou_name, vDoc AS filter_doc_type,
  211.         ROUND(COALESCE(vDPP, 0.0), 0) AS dpp, ROUND(COALESCE(vPPN, 0.0), 0) AS ppn;
  212.     RETURN NEXT pRefHeader;
  213.    
  214.    
  215.     Open pRefDetail FOR
  216.         WITH data_final AS (
  217.             SELECT A.transaction_type, A.doc_no, A.doc_date, A.payment_method, A.product_code,
  218.                A.supplier_product_code, A.product_name, A.product_style, A.color, A.psize, A.normal_price,
  219.                A.sold_price, A.discount, A.margin_supp, A.sold_price_after_margin, SUM(A.qty_so) AS qty_so,
  220.                f_get_partner_name(A.partner_id) AS supplier_name, f_get_partner_code(A.partner_id) AS supplier_code ,'N' AS flg_pkp,
  221.                --(A.sold_price_after_margin * SUM(A.qty_so)) AS sub_total ,
  222.                ROUND(COALESCE(A.sold_price_after_margin * SUM(A.qty_so) / (100+COALESCE(D.tax_percentage,0)/100),0.0),0) AS dpp,
  223.                ROUND(COALESCE(A.sold_price_after_margin * SUM(A.qty_so) - A.sold_price_after_margin * SUM(A.qty_so) / (100+COALESCE(D.tax_percentage,0)/100),0.0),0) AS ppn,
  224.                ROUND(COALESCE(A.sold_price_after_margin/(100+COALESCE(D.tax_percentage,0)/100),0.0),0) AS price_dpp,
  225.                CASE WHEN B.flg_pkp = vYes AND B.pkp_date <= C.doc_date THEN
  226.                  ROUND(COALESCE(A.sold_price_after_margin,0.0) - COALESCE(A.sold_price_after_margin/(100+COALESCE(D.tax_percentage,0)/100),0.0),0)
  227.                ELSE
  228.                 0.0
  229.                END AS price_ppn
  230.             FROM tr_report_sales_supplier A
  231.             LEFT JOIN m_partner_npwp B ON A.partner_id = B.partner_id AND A.tenant_id = B.tenant_id AND B.active = vYes
  232.             LEFT JOIN sl_so_item D ON A.so_item_id = D.so_item_id
  233.             LEFT JOIN sl_so C ON C.so_id = D.so_id
  234.             WHERE A.session_id = pSessionId
  235.                 AND A.tenant_id = pTenantId
  236.             GROUP BY B.flg_pkp,B.pkp_date,C.doc_date, A.transaction_type, A.doc_no, A.doc_date, A.payment_method, A.product_code,
  237.                A.supplier_product_code, A.product_name, A.product_style, A.color, A.psize, A.normal_price,
  238.                A.sold_price, A.discount, A.margin_supp, A.sold_price_after_margin, A.partner_id, D.tax_percentage
  239.             ORDER BY supplier_name, doc_date, doc_no
  240.         )
  241.         SELECT *, (price_dpp + price_ppn)*qty_so as sub_total
  242.         FROM data_final
  243.         ORDER BY supplier_name, doc_date, doc_no;
  244.     RETURN NEXT pRefDetail ;
  245.    
  246.     DELETE FROM tr_report_sales_supplier WHERE session_id = pSessionId;
  247. END;
  248. $BODY$
  249.   LANGUAGE plpgsql VOLATILE
  250.   COST 100
  251.   ROWS 1000;
  252.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement