Advertisement
aadddrr

CANCEL SUBMIT MODIFY ITEM PO

Mar 8th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Adrian, Mar 8, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION pu_cancel_submit_modify_item_po(bigint, character varying, bigint, character varying, bigint, character varying, character varying)
  4.   RETURNS void AS
  5. $BODY$
  6. DECLARE
  7.     pTenantId                           ALIAS FOR $1;
  8.     pSessionId                          ALIAS FOR $2;
  9.     pUserId                             ALIAS FOR $3;
  10.     pDatetime                           ALIAS FOR $4;
  11.     pManagePoId                         ALIAS FOR $5;
  12.     pRemarkApproval                     ALIAS FOR $6;
  13.     pPrevProcessNo                      ALIAS FOR $7;
  14.    
  15.     vEmptyId                            bigint;
  16.     vManagePoItemDocTypeId              bigint;
  17.     vFlagNo                             character varying(1);
  18.     vFlagYes                            character varying(1);
  19.     vRoundingModeNonTax                 character varying(5);
  20.     vStatusRelease                      character varying(1);
  21.     vOuStructure                        OU_BU_STRUCTURE%ROWTYPE;
  22.     RESULT                              RECORD;
  23.    
  24.     vFunctionSubmit                     character varying;
  25.     vStatusDraft                        character varying;
  26.     vStatusInProgress                   character varying;
  27.     vStatusFinal                        character varying;
  28.     vStatusCancel                       character varying;
  29.     vStatusVoid                         character varying;
  30.     vWorkflowStatusDraft                character varying;
  31.     vPoId                               bigint;
  32.     vPoStatusDoc                        character varying(5);
  33.     vZero                               bigint;
  34.     vTypeDataItem                       character varying;
  35.    
  36.     vReceiveGoodsDocDate                character varying;
  37.     vOuId                               bigint;
  38.     vLedgerCode                         character varying;
  39.     vStatusLedgerNotDone                character varying;
  40.     vEmpty                              character varying;
  41.     vScheme                             character varying;
  42.     vDocNo                              character varying;
  43.    
  44.     vReceiveGoodsDocTypeId              bigint;
  45.    
  46. BEGIN
  47.  
  48.     vEmptyId := -99;
  49.     vStatusRelease := 'R';
  50.     vFlagNo := 'N';
  51.     vFlagYes := 'Y';
  52.     vManagePoItemDocTypeId := 105;
  53.    
  54.     vFunctionSubmit := 'pu_submit_modify_item_po'
  55.     vStatusDraft := 'D';
  56.     vStatusInProgress = 'I';
  57.     vStatusFinal := 'F';
  58.     vStatusCancel = 'C';
  59.     vStatusVoid = 'V';
  60.     vWorkflowStatusDraft := 'DRAFT';
  61.     vZero := 0;
  62.     vTypeDataItem := 'item';
  63.    
  64.     vLedgerCode := 'PURCH';
  65.     vStatusLedgerNotDone := '0';
  66.    
  67.     vEmpty := '';
  68.     vReceiveGoodsDocTypeId := 111;
  69.    
  70.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  71.    
  72.     --RAISE EXCEPTION 'Function Cancel submit modify item for PO is not yet Created';
  73.    
  74.     -- get data
  75.     select f_get_ou_bu_structure(A.ou_id) AS ou,
  76.         A.ou_id, A.doc_date,
  77.         COALESCE(B.doc_date, '') AS rg_doc_date,
  78.         A.doc_no, C.scheme,
  79.         A.po_id, A.po_status_doc
  80.     FROM pu_manage_po A
  81.     LEFT JOIN pu_receive_goods B ON B.ref_id = A.po_id
  82.     INNER JOIN m_document C ON C.doc_type_id = A.doc_type_id
  83.     WHERE A.manage_po_id = pManagePoId AND
  84.         A.doc_type_id = vManagePoItemDocTypeId AND
  85.         A.status_doc = vStatusRelease INTO RESULT;
  86.        
  87.     IF FOUND THEN
  88.         vOuStructure := RESULT.ou;
  89.         vOuId := RESULT.ou_id;
  90.         vReceiveGoodsDocDate := RESULT.rg_doc_date;
  91.         vScheme := RESULT.scheme;
  92.         vDocNo := RESULT.doc_no;
  93.         vPoId := RESULT.po_id;
  94.         vPoStatusDoc := RESULT.po_status_doc;
  95.        
  96.         -- Cek status ledger not yet closed for DO
  97.         IF ((vReceiveGoodsDocDate = vEmpty) OR EXISTS (
  98.             SELECT 1
  99.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  100.             WHERE e.tenant_id = pTenantId
  101.                 AND e.ou_id = f.ou_bu_id
  102.                 AND f.ou_id = vOuId
  103.                 AND e.date_year_month = SUBSTR(vReceiveGoodsDocDate, 1, 6)
  104.                 AND e.ledger_code = vLedgerCode AND
  105.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone
  106.             )) THEN
  107.        
  108.             /*
  109.              * validasi po tidak sedang digunakan
  110.              */
  111.             IF NOT EXISTS (
  112.                 SELECT (1)
  113.                 FROM pu_po A, pu_manage_po B
  114.                 WHERE B.manage_po_id = pManagePoId
  115.                     AND A.po_id = B.po_id
  116.                     AND (
  117.                         (A.status_doc <> vStatusRelease)
  118.                         AND (A.status_doc <> vStatusFinal)
  119.                     )
  120.                 ) THEN
  121.                
  122.                 /**
  123.                  * validasi tidak sedang digunakan oleh dokumen lain
  124.                  */
  125.                 IF NOT EXISTS (
  126.                     SELECT (1)
  127.                     FROM pu_po_balance_item A, pu_manage_po_item B, pu_manage_po C
  128.                     WHERE A.po_item_id = B.po_item_id
  129.                         AND B.manage_po_id = C.manage_po_id
  130.                         AND B.manage_po_id = pManagePoId
  131.                         AND (
  132.                             (A.status_item <> vStatusRelease)
  133.                             AND (A.status_item <> vStatusFinal)
  134.                         )
  135.                     ) THEN
  136.                    
  137.                     /**
  138.                      * validasi tidak sedang digunakan oleh invoice
  139.                      */
  140.                     IF NOT EXISTS (
  141.                         SELECT (1)
  142.                         FROM pu_po_balance_invoice A, pu_manage_po B
  143.                         WHERE A.po_id = B.po_id
  144.                             AND B.manage_po_id = pManagePoId
  145.                             AND (
  146.                                 (A.flg_invoice <> vFlagNo)
  147.                                 AND (A.flg_invoice <> vStatusVoid)
  148.                             )
  149.                     ) THEN
  150.                    
  151.                         /**
  152.                          * validasi tidak sedang digunakan
  153.                          */
  154.                         IF NOT EXISTS (
  155.                             SELECT (1)
  156.                             FROM sl_so_po_balance_item A, pu_manage_po_item B
  157.                             WHERE A.so_item_id = B.ref_item_id
  158.                                 AND B.manage_po_id = pManagePoId
  159.                                 AND A.status_item = vStatusInProgress
  160.                         ) THEN
  161.                
  162.                             DELETE FROM tt_pu_po_tax_manage_item_po WHERE session_id = pSessionId;
  163.                             DELETE FROM tt_os_receive_goods_item_manage_item_po WHERE session_id = pSessionId;
  164.                             DELETE FROM tt_product_price_balance_manage_item_po WHERE session_id = pSessionId;
  165.                             DELETE FROM tt_pu_monthly_price_product_manage_item_po WHERE session_id = pSessionId;
  166.                        
  167.                             UPDATE pu_po
  168.                             SET remark = A.remark,
  169.                                 update_datetime = pDatetime,
  170.                                 update_user_id = pUserId,
  171.                                 version = pu_po.version + 1,
  172.                                 status_doc = vPoStatusDoc
  173.                             FROM pu_manage_po A
  174.                             WHERE A.manage_po_id = pManagePoId
  175.                                 AND pu_po.po_id = A.po_id;
  176.                                
  177.                             -- update po item untuk item lama
  178.                             UPDATE pu_po_item
  179.                             SET update_datetime = pDatetime,
  180.                                 update_user_id = pUserId,
  181.                                 version = pu_po_item.version + 1,
  182.                                 gross_price_po = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'grossPricePo' AS numeric),
  183.                                 flg_tax_amount = (A.old_data_value::json->'purchaseOrderItemDto')::json->>'flgTaxAmount',
  184.                                 tax_id = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'taxId' AS bigint),
  185.                                 tax_percentage = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'taxPercentage' AS numeric(5,2)),
  186.                                 tax_price = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'taxPrice' AS numeric),
  187.                                 nett_price_po = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'nettPricePo' AS numeric),
  188.                                 qty_po = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'qtyPo' AS numeric),
  189.                                 qty_int = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'qtyInt' AS numeric),
  190.                                 gross_item_amount = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'grossItemAmount' AS numeric),
  191.                                 nett_item_amount = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'nettItemAmount' AS numeric),
  192.                                 tax_amount = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'taxAmount' AS numeric)
  193.                             FROM pu_manage_po_changes A, pu_manage_po B
  194.                             WHERE A.manage_po_id = pManagePoId
  195.                                 AND A.manage_po_id = B.manage_po_id
  196.                                 AND A.type_data = vTypeDataItem
  197.                                 AND pu_po_item.po_item_id = CAST((A.old_data_value::json->'purchaseOrderItemDto')::json->>'id' AS bigint)
  198.                                 AND pu_po_item.po_id = vPoId;
  199.                                
  200.                             -- delete po item untuk item baru
  201.                             DELETE FROM pu_po_item Z
  202.                             WHERE EXISTS (
  203.                                     SELECT (1)
  204.                                     FROM pu_manage_po_item A
  205.                                     INNER JOIN pu_manage_po B ON B.manage_po_id = A.manage_po_id
  206.                                     WHERE A.manage_po_id = pManagePoId
  207.                                         AND Z.po_item_id = A.po_item_id
  208.                                         AND A.flg_new_item = vFlagYes
  209.                                         AND Z.po_id = vPoId
  210.                                 );
  211.                                
  212.                             -- update po balance item untuk item lama
  213.                             UPDATE pu_po_balance_item
  214.                             SET update_datetime = pDatetime,
  215.                                 update_user_id = pUserId,
  216.                                 version = pu_po_balance_item.version + 1,
  217.                                 status_item = vStatusInProgress,
  218.                                 qty_add = CAST((A.old_data_value::json->'poBalanceItemDto')::json->>'qtyAdd' AS numeric),
  219.                                 qty_int_add = CAST((A.old_data_value::json->'poBalanceItemDto')::json->>'qtyIntAdd' AS numeric)
  220.                             FROM pu_manage_po_changes A, pu_manage_po B, pu_manage_po_item C
  221.                             WHERE A.manage_po_id = pManagePoId
  222.                                 AND A.manage_po_id = B.manage_po_id
  223.                                 AND CAST((A.old_data_value::json->'poBalanceItemDto')::json->>'poItemId' AS bigint) = C.po_item_id
  224.                                 AND pu_po_balance_item.po_item_id = CAST((A.old_data_value::json->'poBalanceItemDto')::json->>'poItemId' AS bigint)
  225.                                 AND C.flg_new_item = vFlagNo
  226.                                 AND A.type_data = vTypeDataItem
  227.                                 AND B.po_id = vPoId;
  228.                                
  229.                             -- delete po balance item untuk item baru
  230.                             DELETE FROM pu_po_balance_item Z
  231.                             WHERE EXISTS (
  232.                                     SELECT (1)
  233.                                     FROM pu_manage_po_item A
  234.                                     INNER JOIN pu_manage_po B ON B.manage_po_id = A.manage_po_id
  235.                                     WHERE A.manage_po_id = pManagePoId
  236.                                         AND A.flg_new_item = vFlagYes
  237.                                         AND B.po_id = vPoId
  238.                                         AND Z.po_item_id = A.po_item_id
  239.                                 )
  240.                                
  241.                             --delete pu_log_po_balance_item
  242.                             DELETE FROM pu_log_po_balance_item Z
  243.                             WHERE EXISTS (
  244.                                 SELECT (1)
  245.                                 FROM pu_manage_po A, pu_manage_po_item B
  246.                                 WHERE Z.tenant_id = A.tenant_id
  247.                                     AND Z.po_id = A.po_id
  248.                                     AND Z.po_item_id = B.po_item_id
  249.                                     AND Z.ref_doc_type_id = vManagePoItemDocTypeId
  250.                                     AND Z.ref_id = pManagePoId
  251.                                     AND Z.ref_item_id = B.manage_po_item_id
  252.                                     AND Z.qty_trx = B.qty_po
  253.                                     AND Z.trx_uom_id = B.po_uom_id
  254.                                     AND Z.qty_int = B.qty_int
  255.                                     AND Z.base_uom_id = B.base_uom_id
  256.                                     AND Z.remark = A.remark
  257.                                     AND A.manage_po_id = pManagePoId
  258.                                     AND A.manage_po_id = B.manage_po_id
  259.                             );
  260.                                
  261.                             -- update tax di po_item
  262.                             INSERT INTO tt_pu_po_tax_manage_item_po
  263.                             (session_id, tenant_id, po_id, tax_id, flg_amount,
  264.                             tax_percentage, base_amount, tax_amount, remark)
  265.                             SELECT pSessionId, A.tenant_id, A.po_id, A.tax_id, B.flg_amount,
  266.                                 A.tax_percentage, SUM(f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManagePoItemDocTypeId, A.curr_code), vRoundingModeNonTax)),
  267.                                 f_tax_rounding(A.tenant_id, SUM(f_get_amount_before_tax(A.gross_item_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManagePoItemDocTypeId, A.curr_code), vRoundingModeNonTax)), A.tax_percentage), B.tax_name
  268.                             FROM pu_po_item A, m_tax B
  269.                             WHERE A.tax_id = B.tax_id AND
  270.                                   A.po_id = vPoId AND
  271.                                   A.tax_id <> vEmptyId
  272.                             GROUP BY A.tenant_id, A.po_id, A.tax_id, B.flg_amount,
  273.                                     A.tax_percentage, B.tax_name;
  274.                                    
  275.                             UPDATE pu_po_tax
  276.                             SET base_amount = A.base_amount,
  277.                                 tax_amount = A.tax_amount,
  278.                                 update_datetime = pDatetime,
  279.                                 update_user_id = pUserId,
  280.                                 version = pu_po_tax.version + 1
  281.                             FROM tt_pu_po_tax_manage_item_po A
  282.                             WHERE pu_po_tax.tenant_id = A.tenant_id
  283.                             AND A.session_id = pSessionId
  284.                             AND pu_po_tax.po_id = A.po_id
  285.                             AND pu_po_tax.tax_id = A.tax_id;   
  286.                                
  287.                             /*
  288.                              * untuk item lama dan untuk item itu memiliki receive goods yang belum diinvoice, maka update:
  289.                              * 1. pu_po_balance_invoice
  290.                              * 2. pu_po_balance_invoice_tax (bisa insert / update)
  291.                              * 3. in_product_price_balance (update)
  292.                              * 4. pu_monthly_price_product (update)
  293.                              * 6. gl_journal_trx_item (update)
  294.                              * 7. gl_journal_trx_mapping (update)
  295.                              */
  296.                                
  297.                             -- ambil dulu receive goods item yang belum dibuat invoice untuk PO yg diubah
  298.                             INSERT INTO tt_os_receive_goods_item_manage_item_po
  299.                             (session_id, tenant_id, ou_id, receive_goods_doc_type_id, receive_goods_item_id, receive_goods_id, po_id, po_item_id,
  300.                              receive_goods_no, receive_goods_date, curr_code, partner_id,
  301.                              gross_price_po, discount_amount, nett_price_po, flg_tax_amount, tax_id, tax_percentage, qty_rcv_po, po_balance_invoice_id)
  302.                             SELECT pSessionId, pTenantId, F.ou_id, C.doc_type_id, D.receive_goods_item_id, C.receive_goods_id, B.po_id, G.po_item_id,
  303.                                    C.doc_no, C.doc_date, G.curr_code, F.partner_id,
  304.                                    G.gross_price_po, G.discount_amount, G.nett_price_po, G.flg_tax_amount, G.tax_id, G.tax_percentage, D.qty_rcv_po, E.po_balance_invoice_id
  305.                             FROM pu_manage_po_item A
  306.                             INNER JOIN pu_manage_po B ON A.manage_po_id = B.manage_po_id
  307.                             INNER JOIN pu_receive_goods C ON C.ref_id = B.po_id
  308.                             INNER JOIN pu_receive_goods_item D ON C.receive_goods_id = D.receive_goods_id AND A.po_item_id = D.ref_id
  309.                             INNER JOIN pu_po_balance_invoice E
  310.                                 ON E.ref_doc_type_id = C.doc_type_id
  311.                                 AND E.ref_id = C.receive_goods_id
  312.                                 AND E.ref_item_id = D.receive_goods_item_id
  313.                                 AND E.po_id = B.po_id
  314.                                 AND E.tenant_id = pTenantId
  315.                                 AND E.ou_id = B.ou_id
  316.                             INNER JOIN pu_po F ON F.po_id = B.po_id
  317.                             INNER JOIN pu_po_item G ON G.po_item_id = A.po_item_id
  318.                             WHERE E.flg_invoice = vFlagNo
  319.                                 AND E.invoice_id = vEmptyId
  320.                                 AND A.manage_po_id = pManagePoId;  
  321.                            
  322.                             UPDATE pu_po_balance_invoice A
  323.                             SET price_po = B.nett_price_po,
  324.                                 item_amount = f_get_amount_before_tax(B.qty_rcv_po * (B.gross_price_po - B.discount_amount), B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, B.curr_code), vRoundingModeNonTax),
  325.                                 version = A.version + 1,
  326.                                 update_datetime = pDatetime,
  327.                                 update_user_id = pUserId
  328.                             FROM tt_os_receive_goods_item_manage_item_po B
  329.                             WHERE B.session_id = pSessionId
  330.                             AND B.po_balance_invoice_id = A.po_balance_invoice_id;
  331.                            
  332.                             DELETE FROM pu_po_balance_invoice_tax A
  333.                             WHERE A.tenant_id = pTenantId
  334.                             AND EXISTS (
  335.                                 SELECT 1 FROM tt_os_receive_goods_item_manage_item_po B
  336.                                 WHERE A.tenant_id = B.tenant_id
  337.                                 AND A.ou_id = B.ou_id
  338.                                 AND A.partner_id = B.partner_id
  339.                                 AND A.po_id = B.po_id
  340.                                 AND A.ref_doc_type_id = B.receive_goods_doc_type_id
  341.                                 AND A.ref_id = B.receive_goods_id
  342.                                 AND A.ref_item_id = B.receive_goods_item_id
  343.                                 AND B.session_id = pSessionId
  344.                             );
  345.                            
  346.                             INSERT INTO pu_po_balance_invoice_tax
  347.                             (tenant_id, ou_id, partner_id, po_id,
  348.                             ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  349.                             tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  350.                             "version", create_datetime, create_user_id, update_datetime, update_user_id)
  351.                             SELECT A.tenant_id, A.ou_id, A.partner_id, A.po_id,
  352.                                 A.receive_goods_doc_type_id, A.receive_goods_id, A.receive_goods_item_id, A.tax_id, B.flg_amount,
  353.                                 A.tax_percentage, A.curr_code,
  354.                                 f_get_amount_before_tax(A.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingModeNonTax),
  355.                                 f_tax_rounding(A.tenant_id, f_get_amount_before_tax(A.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingModeNonTax), A.tax_percentage),
  356.                                 vFlagNo, vEmptyId,
  357.                                 0, pDatetime, pUserId, pDatetime, pUserId
  358.                             FROM tt_os_receive_goods_item_manage_item_po A
  359.                             INNER JOIN m_tax B ON A.tax_id = B.tax_id
  360.                             WHERE A.session_id = pSessionId AND A.tenant_id = pTenantId;
  361.                            
  362.                             INSERT INTO tt_product_price_balance_manage_item_po
  363.                                 (session_id, tenant_id, ou_id, doc_type_id, ref_id, amount)
  364.                             SELECT pSessionId, pTenantId, A.ou_id, A.receive_goods_doc_type_id, A.receive_goods_item_id, SUM(f_get_amount_before_tax(A.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingModeNonTax))
  365.                             FROM tt_os_receive_goods_item_manage_item_po A
  366.                             WHERE A.session_id = pSessionId
  367.                             GROUP BY A.ou_id, A.receive_goods_doc_type_id, A.receive_goods_item_id;
  368.                            
  369.                             UPDATE in_product_price_balance B
  370.                             SET amount = A.amount, version = B.version + 1, update_datetime = pDatetime, update_user_id = pUserId
  371.                             FROM tt_product_price_balance_manage_item_po A
  372.                             WHERE A.session_id = pSessionId
  373.                                 AND A.tenant_id = B.tenant_id
  374.                                 AND A.ou_id = B.ou_id
  375.                                 AND A.doc_type_id = B.doc_type_id
  376.                                 AND A.ref_id = B.ref_id;
  377.                            
  378.                             INSERT INTO tt_pu_monthly_price_product_manage_item_po
  379.                             (session_id, tenant_id, ou_id, year_month_date,
  380.                              product_id, curr_code, amount,
  381.                              flg_tax_amount, tax_id, tax_percentage)
  382.                             SELECT pSessionId, pTenantId, A.ou_id, B.year_month_date,
  383.                                    C.product_id, A.curr_code, SUM(f_get_amount_before_tax(A.qty_rcv_po * (A.gross_price_po - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, A.curr_code), vRoundingModeNonTax)),
  384.                                    A.flg_tax_amount, A.tax_id, A.tax_percentage
  385.                             FROM tt_os_receive_goods_item_manage_item_po A
  386.                             INNER JOIN dt_date B ON A.receive_goods_date = B.string_date
  387.                             INNER JOIN pu_receive_goods_item C ON A.receive_goods_item_id = C.receive_goods_item_id
  388.                             WHERE A.session_id = pSessionId
  389.                             GROUP BY A.ou_id, B.year_month_date, C.product_id, A.curr_code, A.flg_tax_amount, A.tax_id, A.tax_percentage;
  390.                            
  391.                             -- update pu_monthly_price_product
  392.                             UPDATE pu_monthly_price_product SET curr_code = A.curr_code, amount = A.amount,
  393.                                                                 flg_tax_amount = A.flg_tax_amount,
  394.                                                                 tax_id = A.tax_id, tax_percentage = A.tax_percentage,
  395.                                                                 version = pu_monthly_price_product.version + 1,
  396.                                                                 update_datetime = pDatetime,
  397.                                                                 update_user_id = pUserId
  398.                             FROM tt_pu_monthly_price_product_manage_item_po A
  399.                             WHERE A.session_id = pSessionId AND
  400.                                 pu_monthly_price_product.tenant_id = A.tenant_id AND
  401.                                 pu_monthly_price_product.ou_id = A.ou_id AND
  402.                                 pu_monthly_price_product.year_month_date = A.year_month_date AND
  403.                                 pu_monthly_price_product.product_id = A.product_id;
  404.                            
  405.                             -- update gl_journal_trx_item
  406.                             UPDATE gl_journal_trx_item A
  407.                             SET amount = f_get_amount_before_tax(B.qty_rcv_po * (B.gross_price_po - B.discount_amount), B.flg_tax_amount, B.tax_percentage,f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, B.curr_code), vRoundingModeNonTax)
  408.                             FROM tt_os_receive_goods_item_manage_item_po B
  409.                             INNER JOIN gl_journal_trx C ON C.ou_bu_id = B.ou_id AND C.doc_type_id = B.receive_goods_doc_type_id AND C.doc_id = B.receive_goods_id AND C.doc_no = B.receive_goods_no AND C.doc_date = B.receive_goods_date
  410.                             WHERE A.ref_doc_type_id = B.receive_goods_doc_type_id
  411.                                 AND A.ref_id = B.receive_goods_item_id
  412.                                 AND A.journal_trx_id = C.journal_trx_id;
  413.                            
  414.                             -- update gl_journal_trx_mapping
  415.                             WITH summary_for_update_gl_journal_trx_mapping AS (
  416.                                 SELECT C.journal_trx_id, SUM(f_get_amount_before_tax(B.qty_rcv_po * (B.gross_price_po - B.discount_amount), B.flg_tax_amount, B.tax_percentage,f_get_digit_decimal_doc_curr(vReceiveGoodsDocTypeId, B.curr_code), vRoundingModeNonTax)) AS amount
  417.                                 FROM tt_os_receive_goods_item_manage_item_po B
  418.                                 INNER JOIN gl_journal_trx C ON C.doc_type_id = B.receive_goods_doc_type_id AND C.doc_id = B.receive_goods_id AND C.doc_no = B.receive_goods_no AND C.doc_date = B.receive_goods_date
  419.                                 GROUP BY C.journal_trx_id
  420.                             )
  421.                             UPDATE gl_journal_trx_mapping A
  422.                             SET amount = B.amount
  423.                             FROM summary_for_update_gl_journal_trx_mapping B
  424.                             WHERE A.journal_trx_id = B.journal_trx_id; 
  425.                                
  426.                             UPDATE sl_so_po_balance_item A
  427.                             SET status_item = (CASE WHEN A.status_item IN (vStatusCancel, vStatusVoid) THEN A.status_item ELSE vStatusRelease END),
  428.                                 update_datetime = pDatetime,
  429.                                 update_user_id = pUserId,
  430.                                 version = A.version + 1,
  431.                                 qty_po_int_add = A.qty_po_int_add - B.qty_int
  432.                             FROM pu_manage_po_item B
  433.                             WHERE A.so_item_id = B.ref_item_id
  434.                                 AND B.manage_po_id = pManagePoId
  435.                                 AND B.flg_new_item = vFlagNo;
  436.                                
  437.                             UPDATE sl_so_po_balance_item A
  438.                             SET status_item = (CASE WHEN A.status_item IN (vStatusCancel, vStatusVoid) THEN A.status_item ELSE vStatusRelease END),
  439.                                 update_datetime = pDatetime,
  440.                                 update_user_id = pUserId,
  441.                                 version = A.version + 1,
  442.                                 qty_po_int = A.qty_po_int + B.qty_int
  443.                             FROM pu_manage_po_item B
  444.                             WHERE A.so_item_id = B.ref_item_id
  445.                                 AND B.manage_po_id = pManagePoId
  446.                                 AND B.flg_new_item = vFlagYes;
  447.                            
  448.                              -- Update status menjadi F, untuk item-item lama dan baru yang tidak memiliki o/s qty PO terhadap SO
  449.                             UPDATE sl_so_po_balance_item A
  450.                             SET status_item = vStatusFinal
  451.                             FROM pu_manage_po_item B, sl_so_balance_item C
  452.                             WHERE A.so_item_id = B.ref_item_id
  453.                                 AND A.so_item_id = C.so_item_id
  454.                                 AND B.manage_po_id = pManagePoId
  455.                                 -- AND B.flg_new_item = vFlagNo
  456.                                 AND (C.qty_so_int - C.qty_cancel_int + C.qty_add_int) <= (A.qty_po_int - A.qty_po_int_cancel + A.qty_po_int_add)
  457.                                 AND A.status_item = vStatusRelease;
  458.                            
  459.                             -- update nilai po_item_id pada pu_manage_po_item menjadi -99
  460.                             UPDATE pu_manage_po_item
  461.                             SET po_item_id = vEmptyId
  462.                             WHERE flg_new_item = vFlagYes
  463.                                 AND manage_po_id = pManagePoId;
  464.                                
  465.                             UPDATE pu_manage_po
  466.                             SET status_doc = vStatusDraft,
  467.                                 workflow_status = vWorkflowStatusDraft,
  468.                                 update_datetime = pDatetime,
  469.                                 update_user_id = pUserId
  470.                             WHERE manage_po_id = pManagePoId;
  471.                                
  472.                             -- PERFORM f_reset_approval_to_draft
  473.                             PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pManagePoId, vDocNo, pDatetime, pRemarkApproval);
  474.                                                
  475.                             -- UPDATE t_process_message
  476.                             UPDATE t_process_message
  477.                             SET process_no = pPrevProcessNo,
  478.                                 update_datetime = pDatetime,
  479.                                 update_user_id = pUserId,
  480.                                 version = version + 1
  481.                             WHERE tenant_id = pTenantId
  482.                                 AND process_name = vFunctionSubmit
  483.                                 AND process_no = pManagePoId || '_' || vDocNo;
  484.                                
  485.                             DELETE FROM tt_pu_po_tax_manage_item_po WHERE session_id = pSessionId;
  486.                             DELETE FROM tt_os_receive_goods_item_manage_item_po WHERE session_id = pSessionId;
  487.                             DELETE FROM tt_product_price_balance_manage_item_po WHERE session_id = pSessionId;
  488.                             DELETE FROM tt_pu_monthly_price_product_manage_item_po WHERE session_id = pSessionId;
  489.    
  490.                         ELSE
  491.                             RAISE EXCEPTION 'Purchase Order with id % already used for other document', vPoId;
  492.                         END IF;
  493.                            
  494.                     ELSE
  495.                         RAISE EXCEPTION 'Purchase Order with id % already used in invoice', vPoId;
  496.                     END IF;
  497.                            
  498.                 ELSE
  499.                     RAISE EXCEPTION 'Purchase Order with id % already used for other document', vPoId;
  500.                 END IF;
  501.                    
  502.             ELSE
  503.                 RAISE EXCEPTION 'Purchase Order with id % is in use by other document, is void, or is canceled', vPoId;
  504.             END IF;
  505.            
  506.         ELSE
  507.             RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vReceiveGoodsDocDate, 1, 6);
  508.         END IF;
  509.        
  510.     ELSE
  511.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pManagePoId;
  512.     END IF;
  513.    
  514. END;
  515. $BODY$
  516.   LANGUAGE plpgsql VOLATILE
  517.   COST 100;
  518.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement