Advertisement
Evra70

TSI

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