Advertisement
Evra70

SI

Dec 28th, 2021
1,808
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.     DELETE FROM tt_process_dw_sales_header WHERE session_id = pSessionId;
  32.    
  33.     --persiapan dokumen yang akan di proses item" nya
  34.     INSERT INTO tt_process_dw_sales_header (
  35.         session_id,doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  36.         year_month, customer_id, salesman_id, province, city)
  37.     SELECT pSessionId,A.doc_type_id, B.invoice_id, A.invoice_ar_balance_id, B.doc_no, B.doc_date,
  38.             LEFT(B.doc_date, 6) AS year_month, B.partner_id, B.salesman_id,
  39.             f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city
  40.     FROM fi_invoice_ar_balance A
  41.     INNER JOIN sl_invoice B ON A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  42.     WHERE A.tenant_id = pTenantId
  43.     AND A.ou_id = pOuId
  44.     AND A.invoice_ar_balance_id > vLastId  
  45.     AND A.doc_type_id = vDocTypeInvoice;
  46.    
  47.     --get data Invoice Non FOC dari DO
  48.     INSERT INTO tt_process_dw_sales (
  49.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  50.         year_month, customer_id, salesman_id, warehouse_id,
  51.         product_id, ctgr_product_id,
  52.         sub_ctgr_product_id,
  53.         brand_id,
  54.         province, city,
  55.         qty, price, item_amount,
  56.         discount_amount, tax_amount)
  57.     SELECT pSessionId, pDataId, A.doc_type_id,A.doc_id, A.data_log_id, A.doc_no, A.doc_date,
  58.         A.year_month, A.partner_id, A.salesman_id, E.warehouse_id,
  59.         D.product_id, f_get_ctgr_product_by_product_id(D.product_id) AS ctgr_product_id,
  60.         f_get_sub_ctgr_product_by_product_id(D.product_id) AS sub_ctgr_product_id,
  61.         f_get_brand_by_product_id(D.product_id) AS brand_id,
  62.         A.province, A.city,
  63.         SUM(G.qty_dlv_so), F.nett_sell_price, SUM(G.item_amount - G.regular_disc_amount) AS item_amount,
  64.         SUM(G.regular_disc_amount) AS discount_amount, SUM(COALESCE(H.tax_amount,0)) AS tax_amount
  65.     FROM tt_process_dw_sales_header A
  66.         INNER JOIN sl_invoice_item C ON A.doc_id = C.invoice_id
  67.         INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id
  68.         INNER JOIN sl_do E ON D.do_id = E.do_id
  69.         INNER JOIN sl_so_item F ON D.ref_id = F.so_item_id
  70.         INNER JOIN sl_so_balance_invoice G ON C.tenant_id = G.tenant_id
  71.             AND G.ou_id = B.ou_id
  72.             AND G.so_id = E.ref_id
  73.             AND G.ref_item_id = C.ref_item_id
  74.             AND G.ref_doc_type_id = E.doc_type_id
  75.             AND G.ref_id = E.do_id
  76.             AND C.do_receipt_item_id = G.do_receipt_item_id
  77.             AND C.do_receipt_item_id = vEmptyId
  78.         LEFT OUTER JOIN sl_so_balance_invoice_tax H ON B.tenant_id = H.tenant_id
  79.             AND H.ou_id = B.ou_id
  80.             AND H.so_id = E.ref_id
  81.             AND H.ref_item_id = C.ref_item_id
  82.             AND H.ref_doc_type_id = E.doc_type_id
  83.             AND H.ref_id = E.do_id
  84.             AND C.do_receipt_item_id = H.do_receipt_item_id
  85.             AND C.do_receipt_item_id = vEmptyId
  86.             AND F.tax_id = H.tax_id
  87.     WHERE A.session_id = pSessionId
  88.     AND F.nett_sell_price <> 0
  89.     GROUP BY A.doc_type_id,A.doc_id, A.data_log_id, A.doc_no, A.doc_date,
  90.         A.partner_id, A.salesman_id, E.warehouse_id, D.product_id, F.nett_sell_price,A.province, A.city,A.year_month
  91.     HAVING SUM(G.qty_dlv_so) > 0;
  92.        
  93.     --get data Invoice FOC
  94.     INSERT INTO tt_process_dw_sales (
  95.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  96.         year_month, customer_id, salesman_id, warehouse_id,
  97.         product_id, ctgr_product_id,
  98.         sub_ctgr_product_id,
  99.         brand_id,
  100.         province, city,
  101.         qty_foc, price, item_amount,
  102.         discount_amount, tax_amount)
  103.     SELECT pSessionId, pDataId, A.doc_type_id, A.doc_id, A.data_log_id, A.doc_no, A.doc_date,
  104.         A.year_month, A.partner_id, A.salesman_id, E.warehouse_id,
  105.         D.product_id, f_get_ctgr_product_by_product_id(D.product_id) AS ctgr_product_id,
  106.         f_get_sub_ctgr_product_by_product_id(D.product_id) AS sub_ctgr_product_id,
  107.         f_get_brand_by_product_id(D.product_id) AS brand_id,
  108.         A.province, A.city,
  109.         SUM(G.qty_dlv_so), F.nett_sell_price, SUM(G.item_amount - G.regular_disc_amount) AS item_amount,
  110.         SUM(G.regular_disc_amount) AS discount_amount, SUM(COALESCE(H.tax_amount,0)) AS tax_amount
  111.     FROM tt_process_dw_sales_header A
  112.         INNER JOIN sl_invoice_item C ON A.doc_id = C.invoice_id
  113.         INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id
  114.         INNER JOIN sl_do E ON D.do_id = E.do_id
  115.         INNER JOIN sl_so_item F ON D.ref_id = F.so_item_id
  116.         INNER JOIN sl_so_balance_invoice G ON C.tenant_id = G.tenant_id
  117.             AND G.ou_id = B.ou_id
  118.             AND G.so_id = E.ref_id
  119.             AND G.ref_item_id = C.ref_item_id
  120.             AND G.ref_doc_type_id = E.doc_type_id
  121.             AND G.ref_id = E.do_id
  122.             AND C.do_receipt_item_id = G.do_receipt_item_id
  123.             AND C.do_receipt_item_id = vEmptyId
  124.         LEFT OUTER JOIN sl_so_balance_invoice_tax H ON B.tenant_id = H.tenant_id
  125.             AND H.ou_id = B.ou_id
  126.             AND H.so_id = E.ref_id
  127.             AND H.ref_item_id = C.ref_item_id
  128.             AND H.ref_doc_type_id = E.doc_type_id
  129.             AND H.ref_id = E.do_id
  130.             AND C.do_receipt_item_id = H.do_receipt_item_id
  131.             AND C.do_receipt_item_id = vEmptyId
  132.             AND F.tax_id = H.tax_id
  133.     WHERE A.session_id = pSessionId
  134.     AND F.nett_sell_price = 0
  135.     GROUP BY A.doc_type_id, A.doc_id, A.data_log_id, A.doc_no, A.doc_date,
  136.         A.partner_id, A.salesman_id, E.warehouse_id, D.product_id, F.nett_sell_price,A.province, A.city,A.year_month
  137.     HAVING SUM(G.qty_dlv_so) > 0;
  138.    
  139.     -- INSERT DATA DO RECEIPT UNTUK DATA INVOICE
  140.     WITH tt_process_dw_sales_inv_temp AS (
  141.         SELECT data_id, doc_type_id, doc_id, data_log_id
  142.         FROM tt_process_dw_sales
  143.         WHERE session_id = pSessionId
  144.             AND data_id =  pDataId
  145.             AND doc_type_id = vDocTypeInvoice
  146.         GROUP BY data_id, doc_type_id, doc_id, data_log_id
  147.     )      
  148.     INSERT INTO tt_process_dw_sales (
  149.         session_id, data_id, doc_type_id, doc_id, data_log_id, doc_no, doc_date,
  150.         year_month, customer_id, salesman_id, warehouse_id,
  151.         product_id, ctgr_product_id,
  152.         sub_ctgr_product_id,
  153.         brand_id,
  154.         province, city,
  155.         qty, qty_foc,
  156.         price, item_amount,
  157.         discount_amount, tax_amount)
  158.     SELECT pSessionId, pDataId, B.doc_type_id, B.invoice_id, A.data_log_id, B.doc_no, B.doc_date,
  159.         substr(B.doc_date, 0, 7) AS year_month, B.partner_id, B.salesman_id, F.warehouse_id,
  160.         H.product_id, f_get_ctgr_product_by_product_id(H.product_id) AS ctgr_product_id,
  161.         f_get_sub_ctgr_product_by_product_id(H.product_id) AS sub_ctgr_product_id,
  162.         f_get_brand_by_product_id(H.product_id) AS brand_id,
  163.         f_get_province_by_partner(B.partner_id) AS province, f_get_city_by_partner(B.partner_id) AS city,
  164.         CASE WHEN D.nett_sell_price <> 0 THEN SUM(I.qty_dlv_so) ELSE 0 END AS qty,
  165.         CASE WHEN D.nett_sell_price = 0 THEN SUM(I.qty_dlv_so) ELSE 0 END AS qty_foc,
  166.         D.nett_sell_price, SUM(I.item_amount - I.regular_disc_amount) AS item_amount,
  167.         SUM(I.regular_disc_amount) AS discount_amount, SUM(COALESCE(J.tax_amount, 0)) AS tax_amount
  168.     FROM tt_process_dw_sales_inv_temp A
  169.         INNER JOIN sl_invoice B ON A.doc_type_id = B.doc_type_id AND A.doc_id = B.invoice_id
  170.         INNER JOIN sl_so C ON B.ref_id = C.so_id AND B.ref_doc_type_id = vDocTypeSoByBrand
  171.         INNER JOIN sl_so_item D ON C.so_id = D.so_id
  172.         INNER JOIN sl_do_item E ON D.so_item_id = E.ref_id
  173.         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
  174.         INNER JOIN in_do_receipt G ON F.do_id = G.ref_id AND G.ref_doc_type_id = vDocTypeDo
  175.         INNER JOIN in_do_receipt_item H ON G.do_receipt_id = H.do_receipt_id AND H.ref_id = E.do_item_id
  176.         INNER JOIN sl_so_balance_invoice I ON B.tenant_id = I.tenant_id
  177.             AND I.ou_id = B.ou_id
  178.             AND I.so_id = C.so_id
  179.             AND I.ref_item_id = E.do_item_id
  180.             AND I.ref_doc_type_id = F.doc_type_id
  181.             AND I.ref_id = F.do_id
  182.             AND H.do_receipt_item_id = I.do_receipt_item_id    
  183.         LEFT OUTER JOIN sl_so_balance_invoice_tax J ON B.tenant_id = J.tenant_id
  184.             AND J.ou_id = B.ou_id
  185.             AND J.so_id = C.so_id
  186.             AND J.ref_item_id = E.do_item_id
  187.             AND J.ref_doc_type_id = F.doc_type_id
  188.             AND J.ref_id = F.do_id
  189.             AND H.do_receipt_item_id = J.do_receipt_item_id
  190.             AND D.tax_id = J.tax_id
  191.     GROUP BY B.doc_type_id, B.invoice_id, A.data_log_id, B.doc_no, B.doc_date,
  192.              B.partner_id, B.salesman_id, F.warehouse_id, H.product_id, D.nett_sell_price;
  193.    
  194.     IF EXISTS(SELECT 1 FROM tt_process_dw_sales WHERE session_id = pSessionId AND data_id = pDataId AND doc_type_id = vDocTypeInvoice) THEN
  195.         SELECT MAX(data_log_id) INTO vLastId
  196.         FROM tt_process_dw_sales
  197.         WHERE session_id = pSessionId AND
  198.             data_id = pDataId AND
  199.             doc_type_id = vDocTypeInvoice;
  200.     END IF;
  201.        
  202.     IF EXISTS(SELECT 1 FROM dw_last_data_log WHERE tenant_id = pTenantId AND ou_id = pOuId AND doc_type_id = vDocTypeInvoice) THEN
  203.         UPDATE dw_last_data_log
  204.         SET data_log_id = vLastId,
  205.             update_datetime = pDatetime,
  206.             update_user_id = pUserId,
  207.             version = version + 1
  208.         WHERE tenant_id = pTenantId AND
  209.             ou_id = pOuId AND
  210.             doc_type_id = vDocTypeInvoice;
  211.     ELSE
  212.         INSERT INTO dw_last_data_log (
  213.             tenant_id, ou_id, doc_type_id, doc_desc, data_log_id,
  214.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  215.         SELECT pTenantId, pOuId, vDocTypeInvoice, doc_desc, vLastId,
  216.             pDatetime, pUserId, pDatetime, pUserId, 0 AS version
  217.         FROM m_document
  218.         WHERE doc_type_id = vDocTypeInvoice;   
  219.     END IF;
  220.    
  221.     DELETE FROM tt_process_dw_sales_header WHERE session_id = pSessionId;
  222.    
  223. END;   
  224. $BODY$
  225.   LANGUAGE plpgsql VOLATILE
  226.   COST 100;
  227.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement