Evra70

berikut

Dec 28th, 2021
1,724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION dw_insert_sales_invoice(character varying, character varying, bigint, bigint, character varying, bigint)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.  
  6.     pSessionId              ALIAS FOR $1;
  7.     pDataId                 ALIAS FOR $2;
  8.     pTenantId               ALIAS FOR $3;
  9.     pOuId                   ALIAS FOR $4;
  10.     pDatetime               ALIAS FOR $5;
  11.     pUserId                 ALIAS FOR $6;
  12.    
  13.     vDocTypeInvoice         bigint := 321;
  14.     vDocTypeSoByBrand       bigint := 398;
  15.     vDocTypeDo              bigint := 311;
  16.    
  17.     vLastId                 bigint := -99;
  18.     vEmptyId                bigint := -99;
  19.    
  20. BEGIN
  21.    
  22.     --cek last_id for Invoice
  23.     IF EXISTS(SELECT 1 FROM dw_last_data_log WHERE tenant_id = pTenantId AND ou_id = pOuId AND doc_type_id = vDocTypeInvoice) THEN
  24.         SELECT data_log_id INTO vLastId
  25.         FROM dw_last_data_log
  26.         WHERE tenant_id = pTenantId AND
  27.             ou_id = pOuId AND
  28.             doc_type_id = vDocTypeInvoice;
  29.     END IF;
  30.    
  31.     --persiapan dokumen yang akan di proses item" nya
  32.     INSERT INTO tt_process_dw_sales_header (
  33.         session_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  34.         year_month, customer_id, salesman_id, warehouse_id, province, city)
  35.     SELECT pSessionId, A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  36.             substr(B.doc_date, 0, 7) AS year_month, B.partner_id, B.salesman_id, E.warehouse_id,
  37.             f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city
  38.     FROM fi_invoice_ar_balance A
  39.     INNER JOIN sl_invoice B ON A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  40.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  41.     INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id
  42.     INNER JOIN sl_do E ON D.do_id = E.do_id
  43.     WHERE A.tenant_id = pTenantId
  44.     AND A.ou_id = pOuId
  45.     AND A.invoice_ar_balance_id > vLastId  
  46.     AND A.doc_type_id = vDocTypeInvoice
  47.     GROUP BY A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  48.             B.partner_id, B.salesman_id, E.warehouse_id;
  49.    
  50.     --get data Invoice Non FOC dari DO
  51.     INSERT INTO tt_process_dw_sales (
  52.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  53.         year_month, customer_id, salesman_id, warehouse_id,
  54.         product_id, ctgr_product_id,
  55.         sub_ctgr_product_id,
  56.         brand_id,
  57.         province, city,
  58.         qty, price, item_amount,
  59.         discount_amount, tax_amount)
  60.     SELECT pSessionId, pDataId, A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  61.         substr(B.doc_date, 0, 7) AS year_month, B.partner_id, B.salesman_id, E.warehouse_id,
  62.         D.product_id, f_get_ctgr_product_by_product_id(D.product_id) AS ctgr_product_id,
  63.         f_get_sub_ctgr_product_by_product_id(D.product_id) AS sub_ctgr_product_id,
  64.         f_get_brand_by_product_id(D.product_id) AS brand_id,
  65.         f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city,
  66.         SUM(G.qty_dlv_so), F.nett_sell_price, SUM(G.item_amount - G.regular_disc_amount) AS item_amount,
  67.         SUM(G.regular_disc_amount) AS discount_amount, SUM(COALESCE(H.tax_amount,0)) AS tax_amount
  68.     FROM fi_invoice_ar_balance A
  69.         INNER JOIN sl_invoice B ON A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  70.         INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  71.         INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id
  72.         INNER JOIN sl_do E ON D.do_id = E.do_id
  73.         INNER JOIN sl_so_item F ON D.ref_id = F.so_item_id
  74.         INNER JOIN sl_so_balance_invoice G ON C.tenant_id = G.tenant_id
  75.             AND G.ou_id = B.ou_id
  76.             AND G.so_id = E.ref_id
  77.             AND G.ref_item_id = C.ref_item_id
  78.             AND G.ref_doc_type_id = E.doc_type_id
  79.             AND G.ref_id = E.do_id
  80.             AND C.do_receipt_item_id = G.do_receipt_item_id
  81.             AND C.do_receipt_item_id = vEmptyId
  82.         LEFT OUTER JOIN sl_so_balance_invoice_tax H ON B.tenant_id = H.tenant_id
  83.             AND H.ou_id = B.ou_id
  84.             AND H.so_id = E.ref_id
  85.             AND H.ref_item_id = C.ref_item_id
  86.             AND H.ref_doc_type_id = E.doc_type_id
  87.             AND H.ref_id = E.do_id
  88.             AND C.do_receipt_item_id = H.do_receipt_item_id
  89.             AND C.do_receipt_item_id = vEmptyId
  90.             AND F.tax_id = H.tax_id
  91.     WHERE A.tenant_id = pTenantId AND
  92.         A.ou_id = pOuId AND
  93.         A.doc_type_id = vDocTypeInvoice AND
  94.         A.invoice_ar_balance_id > vLastId AND
  95.         F.nett_sell_price <> 0
  96.         AND EXISTS (
  97.             SELECT 1
  98.             FROM tt_process_dw_sales_header I
  99.             WHERE I.session_id = pSessionId
  100.                 AND A.doc_type_id = I.doc_type_id
  101.                 AND B.invoice_id = I.doc_id
  102.                 AND A.invoice_ar_balance_id = I.data_log_id
  103.                 AND B.doc_no = I.doc_no
  104.                 AND B.doc_date = I.doc_date
  105.                 AND substr(B.doc_date, 0, 7) = I.year_month
  106.                 AND B.partner_id = I.customer_id
  107.                 AND B.salesman_id = I.salesman_id
  108.                 AND E.warehouse_id = I.warehouse_id
  109.                 AND f_get_province_by_partner(B.partner_id) = I.province
  110.                 AND f_get_city_by_partner(B.partner_id) = I.city
  111.         )
  112.     GROUP BY A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  113.         B.partner_id, B.salesman_id, E.warehouse_id, D.product_id, F.nett_sell_price
  114.     HAVING SUM(G.qty_dlv_so) > 0;
  115.        
  116.     --get data Invoice FOC
  117.     INSERT INTO tt_process_dw_sales (
  118.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  119.         year_month, customer_id, salesman_id, warehouse_id,
  120.         product_id, ctgr_product_id,
  121.         sub_ctgr_product_id,
  122.         brand_id,
  123.         province, city,
  124.         qty_foc, price, item_amount,
  125.         discount_amount, tax_amount)
  126.     SELECT pSessionId, pDataId, A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  127.         substr(B.doc_date, 0, 7) AS year_month, B.partner_id, B.salesman_id, E.warehouse_id,
  128.         D.product_id, f_get_ctgr_product_by_product_id(D.product_id) AS ctgr_product_id,
  129.         f_get_sub_ctgr_product_by_product_id(D.product_id) AS sub_ctgr_product_id,
  130.         f_get_brand_by_product_id(D.product_id) AS brand_id,
  131.         f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city,
  132.         SUM(G.qty_dlv_so), F.nett_sell_price, SUM(G.item_amount - G.regular_disc_amount) AS item_amount,
  133.         SUM(G.regular_disc_amount) AS discount_amount, SUM(COALESCE(H.tax_amount,0)) AS tax_amount
  134.     FROM fi_invoice_ar_balance A
  135.         INNER JOIN sl_invoice B ON A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  136.         INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  137.         INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id
  138.         INNER JOIN sl_do E ON D.do_id = E.do_id
  139.         INNER JOIN sl_so_item F ON D.ref_id = F.so_item_id
  140.         INNER JOIN sl_so_balance_invoice G ON C.tenant_id = G.tenant_id
  141.             AND G.ou_id = B.ou_id
  142.             AND G.so_id = E.ref_id
  143.             AND G.ref_item_id = C.ref_item_id
  144.             AND G.ref_doc_type_id = E.doc_type_id
  145.             AND G.ref_id = E.do_id
  146.             AND C.do_receipt_item_id = G.do_receipt_item_id
  147.             AND C.do_receipt_item_id = vEmptyId
  148.         LEFT OUTER JOIN sl_so_balance_invoice_tax H ON B.tenant_id = H.tenant_id
  149.             AND H.ou_id = B.ou_id
  150.             AND H.so_id = E.ref_id
  151.             AND H.ref_item_id = C.ref_item_id
  152.             AND H.ref_doc_type_id = E.doc_type_id
  153.             AND H.ref_id = E.do_id
  154.             AND C.do_receipt_item_id = H.do_receipt_item_id
  155.             AND C.do_receipt_item_id = vEmptyId
  156.             AND F.tax_id = H.tax_id
  157.     WHERE A.tenant_id = pTenantId AND
  158.         A.ou_id = pOuId AND
  159.         A.doc_type_id = vDocTypeInvoice AND
  160.         A.invoice_ar_balance_id > vLastId AND
  161.         F.nett_sell_price = 0
  162.         AND EXISTS (
  163.             SELECT 1
  164.             FROM tt_process_dw_sales_header I
  165.             WHERE I.session_id = pSessionId
  166.                 AND A.doc_type_id = I.doc_type_id
  167.                 AND B.invoice_id = I.doc_id
  168.                 AND A.invoice_ar_balance_id = I.data_log_id
  169.                 AND B.doc_no = I.doc_no
  170.                 AND B.doc_date = I.doc_date
  171.                 AND substr(B.doc_date, 0, 7) = I.year_month
  172.                 AND B.partner_id = I.customer_id
  173.                 AND B.salesman_id = I.salesman_id
  174.                 AND E.warehouse_id = I.warehouse_id
  175.                 AND f_get_province_by_partner(B.partner_id) = I.province
  176.                 AND f_get_city_by_partner(B.partner_id) = I.city
  177.         )
  178.     GROUP BY A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  179.         B.partner_id, B.salesman_id, E.warehouse_id, D.product_id, F.nett_sell_price
  180.     HAVING SUM(G.qty_dlv_so) > 0;
  181.    
  182.     -- INSERT DATA DO RECEIPT UNTUK DATA INVOICE
  183.     WITH tt_process_dw_sales_inv_temp AS (
  184.         SELECT data_id, doc_type_id, doc_id, data_log_id
  185.         FROM tt_process_dw_sales
  186.         WHERE session_id = pSessionId
  187.             AND data_id =  pDataId
  188.             AND doc_type_id = vDocTypeInvoice
  189.         GROUP BY data_id, doc_type_id, doc_id, data_log_id
  190.     )      
  191.     INSERT INTO tt_process_dw_sales (
  192.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  193.         year_month, customer_id, salesman_id, warehouse_id,
  194.         product_id, ctgr_product_id,
  195.         sub_ctgr_product_id,
  196.         brand_id,
  197.         province, city,
  198.         qty, qty_foc,
  199.         price, item_amount,
  200.         discount_amount, tax_amount)
  201.     SELECT pSessionId, pDataId, B.doc_type_id, B.invoice_id, A.data_log_id, B.doc_no, B.doc_date,
  202.         substr(B.doc_date, 0, 7) AS year_month, B.partner_id, B.salesman_id, F.warehouse_id,
  203.         H.product_id, f_get_ctgr_product_by_product_id(H.product_id) AS ctgr_product_id,
  204.         f_get_sub_ctgr_product_by_product_id(H.product_id) AS sub_ctgr_product_id,
  205.         f_get_brand_by_product_id(H.product_id) AS brand_id,
  206.         f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city,
  207.         CASE WHEN D.nett_sell_price <> 0 THEN SUM(I.qty_dlv_so) ELSE 0 END AS qty,
  208.         CASE WHEN D.nett_sell_price = 0 THEN SUM(I.qty_dlv_so) ELSE 0 END AS qty_foc,
  209.         D.nett_sell_price, SUM(I.item_amount - I.regular_disc_amount) AS item_amount,
  210.         SUM(I.regular_disc_amount) AS discount_amount, SUM(COALESCE(J.tax_amount, 0)) AS tax_amount
  211.     FROM tt_process_dw_sales_inv_temp A
  212.         INNER JOIN sl_invoice B ON A.doc_type_id = B.doc_type_id AND A.doc_id = B.invoice_id
  213.         INNER JOIN sl_so C ON B.ref_id = C.so_id AND B.ref_doc_type_id = vDocTypeSoByBrand
  214.         INNER JOIN sl_so_item D ON C.so_id = D.so_id
  215.         INNER JOIN sl_do_item E ON D.so_item_id = E.ref_id
  216.         INNER JOIN sl_do F ON E.do_id = F.do_id AND C.so_id = F.ref_id AND C.doc_type_id = F.ref_doc_type_id
  217.         INNER JOIN in_do_receipt G ON F.do_id = G.ref_id AND G.ref_doc_type_id = vDocTypeDo
  218.         INNER JOIN in_do_receipt_item H ON G.do_receipt_id = H.do_receipt_id AND H.ref_id = E.do_item_id
  219.         INNER JOIN sl_so_balance_invoice I ON B.tenant_id = I.tenant_id
  220.             AND I.ou_id = B.ou_id
  221.             AND I.so_id = C.so_id
  222.             AND I.ref_item_id = E.do_item_id
  223.             AND I.ref_doc_type_id = F.doc_type_id
  224.             AND I.ref_id = F.do_id
  225.             AND H.do_receipt_item_id = I.do_receipt_item_id    
  226.         LEFT OUTER JOIN sl_so_balance_invoice_tax J ON B.tenant_id = J.tenant_id
  227.             AND J.ou_id = B.ou_id
  228.             AND J.so_id = C.so_id
  229.             AND J.ref_item_id = E.do_item_id
  230.             AND J.ref_doc_type_id = F.doc_type_id
  231.             AND J.ref_id = F.do_id
  232.             AND H.do_receipt_item_id = J.do_receipt_item_id
  233.             AND D.tax_id = J.tax_id
  234.     GROUP BY B.doc_type_id, B.invoice_id, A.data_log_id, B.doc_no, B.doc_date,
  235.              B.partner_id, B.salesman_id, F.warehouse_id, H.product_id, D.nett_sell_price;
  236.    
  237.     IF EXISTS(SELECT 1 FROM tt_process_dw_sales WHERE session_id = pSessionId AND data_id = pDataId AND doc_type_id = vDocTypeInvoice) THEN
  238.         SELECT MAX(data_log_id) INTO vLastId
  239.         FROM tt_process_dw_sales
  240.         WHERE session_id = pSessionId AND
  241.             data_id = pDataId AND
  242.             doc_type_id = vDocTypeInvoice;
  243.     END IF;
  244.        
  245.     IF EXISTS(SELECT 1 FROM dw_last_data_log WHERE tenant_id = pTenantId AND ou_id = pOuId AND doc_type_id = vDocTypeInvoice) THEN
  246.         UPDATE dw_last_data_log
  247.         SET data_log_id = vLastId,
  248.             update_datetime = pDatetime,
  249.             update_user_id = pUserId,
  250.             version = version + 1
  251.         WHERE tenant_id = pTenantId AND
  252.             ou_id = pOuId AND
  253.             doc_type_id = vDocTypeInvoice;
  254.     ELSE
  255.         INSERT INTO dw_last_data_log (
  256.             tenant_id, ou_id, doc_type_id, doc_desc, data_log_id,
  257.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  258.         SELECT pTenantId, pOuId, vDocTypeInvoice, doc_desc, vLastId,
  259.             pDatetime, pUserId, pDatetime, pUserId, 0 AS version
  260.         FROM m_document
  261.         WHERE doc_type_id = vDocTypeInvoice;   
  262.     END IF;
  263.    
  264. END;   
  265. $BODY$
  266.   LANGUAGE plpgsql VOLATILE
  267.   COST 100;
  268.   /
Advertisement
Add Comment
Please, Sign In to add comment