Advertisement
aadddrr

CANCEL SUBMIT MODIFY ITEM SO

Mar 2nd, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Adrian, Mar 2, 2017
  2.  
  3. CREATE OR REPLACE FUNCTION sl_cancel_submit_modify_item_so(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.     pManageSoId                         ALIAS FOR $5;
  12.     pRemarkApproval                     ALIAS FOR $6;
  13.     pPrevProcessNo                      ALIAS FOR $7;
  14.    
  15.     vEmptyId                            bigint;
  16.     vManageSoItemDocTypeId              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.     vStatusVoid                     character varying;
  29.     vWorkflowStatusDraft                character varying;
  30.     vSoId                               bigint;
  31.     vOldSoValue                         json;
  32.     vZero                               bigint;
  33.     vTypeDataItem                       character varying;
  34.    
  35.     vDoDocDate                          character varying;
  36.     vDoReceiptDocDate                   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.     vDeliveryOrderDocTypeId             bigint;
  45.     vDoReceiptDocTypeId                 bigint;
  46.    
  47. BEGIN
  48.  
  49.     vEmptyId := -99;
  50.     vStatusRelease := 'R';
  51.     vFlagNo := 'N';
  52.     vFlagYes := 'Y';
  53.     vManageSoItemDocTypeId := 305;
  54.    
  55.     vFunctionSubmit := 'sl_submit_modify_item_so'
  56.     vStatusDraft := 'D';
  57.     vStatusInProgress = 'I';
  58.     vStatusFinal := 'F';
  59.     vStatusVoid = 'V';
  60.     vWorkflowStatusDraft := 'DRAFT';
  61.     vZero := 0;
  62.     vTypeDataItem := 'item';
  63.    
  64.     vLedgerCode := 'INV';
  65.     vStatusLedgerNotDone := '0';
  66.    
  67.     vEmpty := '';
  68.     vDeliveryOrderDocTypeId := 311;
  69.     vDoReceiptDocTypeId := 525;
  70.    
  71.     --RAISE EXCEPTION 'Function Submit For Document Modify Item SO';
  72.    
  73.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  74.    
  75.     -- get data
  76.     select f_get_ou_bu_structure(A.ou_id) AS ou,
  77.         A.ou_id, A.doc_date,
  78.         COALESCE(C.doc_date, '') AS do_doc_date, COALESCE(D.doc_date, '') AS do_receipt_doc_date,
  79.         A.doc_no, E.scheme
  80.     FROM sl_manage_so A
  81.     LEFT JOIN sl_do C ON C.ref_id = A.so_id
  82.     LEFT JOIN in_do_receipt D ON D.ref_id = C.do_id
  83.     INNER JOIN m_document E ON E.doc_type_id = A.doc_type_id
  84.     WHERE A.manage_so_id = pManageSoId AND
  85.         A.doc_type_id = vManageSoItemDocTypeId AND
  86.         A.status_doc = vStatusRelease INTO RESULT;
  87.    
  88.     IF FOUND THEN
  89.         vOuStructure := RESULT.ou;
  90.         vOuId := RESULT.ou_id;
  91.         vDoDocDate := RESULT.do_doc_date;
  92.         vDoReceiptDocDate := RESULT.do_receipt_doc_date;
  93.         vScheme := RESULT.scheme;
  94.         vDocNo := RESULT.doc_no;
  95.        
  96.         SELECT A.so_id INTO vSoId FROM sl_manage_so A WHERE A.manage_so_id = pManageSoId;
  97.        
  98.         -- Cek status ledger not yet closed for DO
  99.         IF ((vDoDocDate = vEmpty) OR EXISTS (
  100.             SELECT 1
  101.             FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  102.             WHERE e.tenant_id = pTenantId
  103.                 AND e.ou_id = f.ou_bu_id
  104.                 AND f.ou_id = vOuId
  105.                 AND e.date_year_month = SUBSTR(vDoDocDate, 1, 6)
  106.                 AND e.ledger_code = vLedgerCode AND
  107.                 f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone
  108.             )) THEN
  109.            
  110.             -- Cek status ledger not yet closed for DO Receipt
  111.             IF ((vDoReceiptDocDate = vEmpty) OR EXISTS (
  112.                 SELECT 1
  113.                 FROM m_admin_process_ledger e, m_ou_structure f, t_ou g
  114.                 WHERE e.tenant_id = pTenantId
  115.                     AND e.ou_id = f.ou_bu_id
  116.                     AND f.ou_id = vOuId
  117.                     AND e.date_year_month = SUBSTR(vDoReceiptDocDate, 1, 6)
  118.                     AND e.ledger_code = vLedgerCode AND
  119.                     f.ou_id = g.ou_id AND e.status_ledger = vStatusLedgerNotDone
  120.                 )) THEN
  121.        
  122.                 /*
  123.                  * validasi so tidak sedang digunakan
  124.                  */
  125.                 IF NOT EXISTS (
  126.                     SELECT (1)
  127.                     FROM sl_so A, sl_manage_so C
  128.                     WHERE C.manage_so_id = pManageSoId
  129.                         AND A.so_id = C.so_id
  130.                         AND (
  131.                             (A.status_doc <> vStatusRelease)
  132.                             AND (A.status_doc <> vStatusFinal)
  133.                         )
  134.                     ) THEN
  135.                    
  136.                     /**
  137.                      * validasi tidak sedang digunakan oleh PO
  138.                      */
  139.                     IF NOT EXISTS (
  140.                         SELECT (1)
  141.                         FROM sl_so_po_balance_item A, sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  142.                         WHERE A.so_item_id = B.so_item_id
  143.                             AND B.manage_so_id = C.manage_so_id
  144.                             AND A.so_item_id = D.so_item_id
  145.                             AND B.manage_so_id = pManageSoId
  146.                             AND (
  147.                                 (A.status_item <> vStatusRelease)
  148.                                 AND (A.status_item <> vStatusFinal)
  149.                             )
  150.                     ) THEN
  151.                    
  152.                         /**
  153.                          * validasi tidak sedang digunakan oleh dokumen lain
  154.                          */
  155.                         IF NOT EXISTS (
  156.                             SELECT (1)
  157.                             FROM sl_so_balance_item A, sl_manage_so_item B, sl_manage_so C
  158.                             WHERE A.so_item_id = B.so_item_id
  159.                                 AND B.manage_so_id = C.manage_so_id
  160.                                 AND B.manage_so_id = pManageSoId
  161.                                 AND (
  162.                                     (A.status_item <> vStatusRelease)
  163.                                     AND (A.status_item <> vStatusFinal)
  164.                                 )
  165.                         ) THEN
  166.                        
  167.                             /**
  168.                              * validasi tidak sedang digunakan oleh invoice
  169.                              */
  170.                             IF NOT EXISTS (
  171.                                 SELECT (1)
  172.                                 FROM sl_so_balance_invoice A, sl_manage_so B
  173.                                 WHERE A.so_id = B.so_id
  174.                                     AND B.manage_so_id = pManageSoId
  175.                                     AND (
  176.                                         (A.flg_invoice <> vFlagNo)
  177.                                         AND (A.flg_invoice <> vStatusVoid)
  178.                                     )
  179.                             ) THEN
  180.                        
  181.                                 DELETE FROM tt_sl_so_tax_for_modify_so WHERE session_id = pSessionId;
  182.                                
  183.                                 --SELECT A.so_id INTO vSoId FROM sl_manage_so A WHERE A.manage_so_id = pManageSoId;
  184.                                
  185.                                 UPDATE sl_so SET update_datetime = pDatetime, update_user_id = pUserId, version = sl_so.version + 1, status_doc = vStatusInProgress
  186.                                 WHERE sl_so.so_id = vSoId
  187.                                     AND (
  188.                                             (sl_so.status_doc = vStatusRelease)
  189.                                             OR (sl_so.status_doc = vStatusFinal)
  190.                                         );
  191.                                
  192.                                 -- update so item untuk item lama
  193.                                 UPDATE sl_so_item
  194.                                 SET update_datetime = pDatetime,
  195.                                     update_user_id = pUserId,
  196.                                     version = sl_so_item.version + 1,
  197.                                     gross_sell_price = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'grossSellPrice' AS numeric),
  198.                                     flg_tax_amount = (A.old_data_value::json->'salesOrderItemDto')::json->>'flgTaxAmount',
  199.                                     tax_id = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'taxId' AS bigint),
  200.                                     tax_percentage = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'taxPercentage' AS numeric(5,2)),
  201.                                     tax_price = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'taxPrice' AS numeric),
  202.                                     nett_sell_price = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'nettSellPrice' AS numeric),
  203.                                     qty_so = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'qtySo' AS numeric),
  204.                                     qty_int = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'qtyInt' AS numeric),
  205.                                     nett_item_amount = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'nettItemAmount' AS numeric),
  206.                                     tax_amount = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'taxAmount' AS numeric),
  207.                                     flg_disc = (A.old_data_value::json->'salesOrderItemDto')::json->>'flgDisc',
  208.                                     discount_amount = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'discountAmount' AS numeric),
  209.                                     discount_percentage = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'discountPercentage' AS numeric)
  210.                                 FROM sl_manage_so_changes A, sl_manage_so B
  211.                                 WHERE A.manage_so_id = pManageSoId
  212.                                     AND A.manage_so_id = B.manage_so_id
  213.                                     AND A.type_data = vTypeDataItem
  214.                                     AND sl_so_item.so_item_id = CAST((A.old_data_value::json->'salesOrderItemDto')::json->>'id' AS bigint)
  215.                                     AND sl_so_item.so_id = vSoId;
  216.                                    
  217.                                 -- delete so item untuk item baru
  218.                                 DELETE FROM sl_so_item Z
  219.                                 WHERE EXISTS (
  220.                                         SELECT (1)
  221.                                         FROM sl_manage_so_item A
  222.                                         INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  223.                                         WHERE A.manage_so_id = pManageSoId
  224.                                             AND Z.so_item_id = A.so_item_id
  225.                                             AND A.flg_new_item = vFlagYes
  226.                                             AND Z.so_id = vSoId
  227.                                     );
  228.                                    
  229.                                 -- delete so item purchasing untuk item baru
  230.                                 DELETE FROM sl_so_item_purchasing Z
  231.                                 WHERE EXISTS (
  232.                                         SELECT (1)
  233.                                         FROM sl_manage_so_item A
  234.                                         INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  235.                                         WHERE A.manage_so_id = pManageSoId
  236.                                             AND A.flg_new_item = vFlagYes
  237.                                             AND B.so_id = vSoId
  238.                                             AND Z.so_item_id = A.so_item_id
  239.                                     )
  240.                                    
  241.                                 -- delete so activity wo untuk item baru
  242.                                 DELETE FROM sl_so_activity_wo Z
  243.                                 WHERE EXISTS (
  244.                                         SELECT (1)
  245.                                         FROM sl_manage_so_item A
  246.                                         INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  247.                                         WHERE A.manage_so_id = pManageSoId
  248.                                             AND A.flg_new_item = vFlagYes
  249.                                             AND B.so_id = vSoId
  250.                                             AND Z.so_item_id = A.so_item_id
  251.                                     );
  252.                                    
  253.                                 -- update so balance item untuk item lama
  254.                                 UPDATE sl_so_balance_item
  255.                                 SET update_datetime = pDatetime,
  256.                                     update_user_id = pUserId,
  257.                                     version = sl_so_balance_item.version + 1,
  258.                                     status_item = vStatusInProgress,
  259.                                     qty_add = CAST((A.old_data_value::json->'soBalanceItemDto')::json->>'qtyAdd' AS numeric),
  260.                                     qty_add_int = CAST((A.old_data_value::json->'soBalanceItemDto')::json->>'qtyAddInt' AS numeric)
  261.                                 FROM sl_manage_so_changes A, sl_manage_so B, sl_manage_so_item C
  262.                                 WHERE A.manage_so_id = pManageSoId
  263.                                     AND A.manage_so_id = B.manage_so_id
  264.                                     AND CAST((A.old_data_value::json->'soBalanceItemDto')::json->>'soItemId' AS bigint) = C.so_item_id
  265.                                     AND sl_so_balance_item.so_item_id = CAST((A.old_data_value::json->'soBalanceItemDto')::json->>'soItemId' AS bigint)
  266.                                     AND C.flg_new_item = vFlagNo
  267.                                     AND A.type_data = vTypeDataItem
  268.                                     AND B.so_id = vSoId;
  269.                                    
  270.                                 -- delete so balance item untuk item baru
  271.                                 DELETE FROM sl_so_balance_item Z
  272.                                 WHERE EXISTS (
  273.                                         SELECT (1)
  274.                                         FROM sl_manage_so_item A
  275.                                         INNER JOIN sl_manage_so B ON B.manage_so_id = A.manage_so_id
  276.                                         WHERE A.manage_so_id = pManageSoId
  277.                                             AND A.flg_new_item = vFlagYes
  278.                                             AND B.so_id = vSoId
  279.                                             AND Z.so_item_id = A.so_item_id
  280.                                     );
  281.                                    
  282.                                 -- delete dan update dari table saldo qty SO terhadap PO
  283.                                 -- Update status menjadi sama dengan so balance item
  284.                                 UPDATE sl_so_po_balance_item A
  285.                                 SET update_datetime = pDatetime, update_user_id = pUserId, version = A.version + 1, status_item = D.status_item
  286.                                 FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  287.                                 WHERE A.so_item_id = B.so_item_id
  288.                                     AND B.manage_so_id = C.manage_so_id
  289.                                     AND A.so_item_id = D.so_item_id
  290.                                     AND B.manage_so_id = pManageSoId
  291.                                     AND B.flg_new_item = vFlagNo
  292.                                     AND (
  293.                                             (A.status_item = vStatusRelease)
  294.                                             OR (A.status_item = vStatusFinal)
  295.                                         );
  296.                                        
  297.                                 -- Update status menjadi 'I' jika terdapat PO yang menggunakan dan masih draft
  298.                                 UPDATE sl_so_po_balance_item A
  299.                                 SET update_datetime = pDatetime, update_user_id = pUserId, version = A.version + 1, status_item = vStatusInProgress
  300.                                 FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D, pu_po_item E, pu_po F
  301.                                 WHERE A.so_item_id = B.so_item_id
  302.                                     AND B.manage_so_id = C.manage_so_id
  303.                                     AND A.so_item_id = D.so_item_id
  304.                                     AND B.manage_so_id = pManageSoId
  305.                                     AND B.flg_new_item = vFlagNo
  306.                                     AND (
  307.                                             (A.status_item = vStatusRelease)
  308.                                             OR (A.status_item = vStatusFinal)
  309.                                         )
  310.                                     AND E.ref_id = D.so_item_id
  311.                                     AND F.po_id = E.po_id
  312.                                     AND F.status_doc = vStatusDraft;
  313.        
  314.                                 -- delete so sl_so_po_balance_item untuk item baru
  315.                                 DELETE FROM sl_so_po_balance_item Z
  316.                                 WHERE EXISTS(
  317.                                     SELECT (1)
  318.                                     FROM sl_manage_so_item B, sl_manage_so C, sl_so_balance_item D
  319.                                     WHERE Z.so_item_id = B.so_item_id
  320.                                         AND B.manage_so_id = C.manage_so_id
  321.                                         AND Z.so_item_id = D.so_item_id
  322.                                         AND B.manage_so_id = pManageSoId
  323.                                         AND B.flg_new_item = vFlagYes
  324.                                     )
  325.                                 AND (
  326.                                     (Z.status_item = vStatusRelease)
  327.                                     OR (Z.status_item = vStatusFinal)
  328.                                 );
  329.                                
  330.                                 --delete sl_log_so_balnce_item
  331.                                 DELETE FROM sl_log_so_balance_item Z
  332.                                 WHERE EXISTS (
  333.                                     SELECT (1)
  334.                                     FROM sl_manage_so A, sl_manage_so_item B
  335.                                     WHERE Z.tenant_id = A.tenant_id
  336.                                         AND Z.so_id = A.so_id
  337.                                         AND Z.so_item_id = B.so_item_id
  338.                                         AND Z.ref_doc_type_id = A.doc_type_id
  339.                                         AND Z.ref_id = A.manage_so_id
  340.                                         AND Z.ref_item_id = B.manage_so_item_id
  341.                                         AND Z.qty_trx = B.qty_so
  342.                                         AND Z.trx_uom_id = B.so_uom_id
  343.                                         AND Z.qty_int = B.qty_int
  344.                                         AND Z.base_uom_id = B.base_uom_id
  345.                                         AND Z.remark = A.remark
  346.                                         AND A.manage_so_id = pManageSoId
  347.                                         AND A.manage_so_id = B.manage_so_id
  348.                                 );
  349.                                    
  350.                                 -- update tax di so_item
  351.                                 INSERT INTO tt_sl_so_tax_for_modify_so
  352.                                 (session_id, tenant_id, so_id, tax_id, flg_amount,
  353.                                 tax_percentage, base_amount, tax_amount, remark)
  354.                                 SELECT pSessionId, A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  355.                                     A.tax_percentage, SUM(f_get_amount_before_tax((A.gross_sell_price - A.discount_amount) * A.qty_so, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManageSoItemDocTypeId, A.curr_code), vRoundingModeNonTax)),
  356.                                     f_tax_rounding(A.tenant_id, SUM(f_get_amount_before_tax((A.gross_sell_price - A.discount_amount) * A.qty_so, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vManageSoItemDocTypeId, A.curr_code), vRoundingModeNonTax)), A.tax_percentage), B.tax_name
  357.                                 FROM sl_so_item A, m_tax B
  358.                                 WHERE A.tax_id = B.tax_id AND
  359.                                       A.so_id = vSoId AND
  360.                                       A.tax_id <> vEmptyId
  361.                                 GROUP BY A.tenant_id, A.so_id, A.tax_id, B.flg_amount,
  362.                                         A.tax_percentage, B.tax_name;  
  363.                                    
  364.                                 UPDATE sl_so_tax SET base_amount = A.base_amount, tax_amount = A.tax_amount, update_datetime = pDatetime, update_user_id = pUserId, version = sl_so_tax.version + 1
  365.                                 FROM tt_sl_so_tax_for_modify_so A
  366.                                 WHERE sl_so_tax.tenant_id = A.tenant_id
  367.                                 AND A.session_id = pSessionId
  368.                                 AND sl_so_tax.so_id = A.so_id
  369.                                 AND sl_so_tax.tax_id = A.tax_id;
  370.                                    
  371.                                 /*
  372.                                  * jika flg os change do=y, maka update:
  373.                                  * 1. sl_so_balance_invoice
  374.                                  * 2. sl_so_balance_invoice_tax (bisa insert / update)
  375.                                  */
  376.                                
  377.                                 /** UPDATE BALANCE DELIVERY ORDER **/
  378.                                
  379.                                 INSERT INTO tt_os_delivery_order_item_manage_item_so(
  380.                                         session_id, tenant_id,
  381.                                         ou_id, delivery_order_doc_type_id, delivery_order_item_id, delivery_order_id,
  382.                                         so_id, so_item_id, delivery_order_no, delivery_order_date, curr_code,
  383.                                         partner_id, gross_sell_price, discount_amount, nett_sell_price, flg_tax_amount,
  384.                                         tax_id, tax_percentage, qty_dlv_so, so_balance_invoice_id)
  385.                                 SELECT pSessionId, pTenantId,
  386.                                        F.ou_id, C.doc_type_id, D.do_item_id, C.do_id,
  387.                                        G.so_id, G.so_item_id, C.doc_no, C.doc_date, G.curr_code,
  388.                                        F.partner_bill_to_id, G.gross_sell_price, G.discount_amount, G.nett_sell_price, G.flg_tax_amount,
  389.                                        G.tax_id, G.tax_percentage, D.qty_dlv_so, E.so_balance_invoice_id
  390.                                 FROM sl_manage_so_item A
  391.                                 INNER JOIN sl_manage_so B ON A.manage_so_id = B.manage_so_id
  392.                                 INNER JOIN sl_do C ON C.ref_id = B.so_id
  393.                                 INNER JOIN sl_do_item D ON C.do_id = D.do_id AND A.so_item_id = D.ref_id
  394.                                 INNER JOIN sl_so F ON F.so_id = B.so_id
  395.                                 INNER JOIN sl_so_balance_invoice E
  396.                                     ON E.ref_doc_type_id = C.doc_type_id
  397.                                     AND E.ref_id = C.do_id
  398.                                     AND E.ref_item_id = D.do_item_id
  399.                                     AND E.so_id = B.so_id
  400.                                     AND E.tenant_id = pTenantId
  401.                                     AND E.ou_id = B.ou_id
  402.                                     AND E.partner_id = F.partner_bill_to_id
  403.                                     AND E.do_receipt_item_id = vEmptyId
  404.                                 INNER JOIN sl_so_item G ON G.so_item_id = A.so_item_id
  405.                                 WHERE E.flg_invoice = vFlagNo
  406.                                     AND E.invoice_id = vEmptyId
  407.                                     AND A.manage_so_id = pManageSoId
  408.                                     AND A.flg_change_do = vFlagYes;
  409.                                
  410.                                 UPDATE sl_so_balance_invoice A
  411.                                 SET price_so = B.nett_sell_price,
  412.                                     item_amount = f_get_amount_before_tax_and_disc(B.qty_dlv_so * B.gross_sell_price, B.qty_dlv_so * B.discount_amount, B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, B.curr_code), vRoundingModeNonTax),
  413.                                     version = A.version + 1,
  414.                                     update_datetime = pDatetime,
  415.                                     update_user_id = pUserId
  416.                                 FROM tt_os_delivery_order_item_manage_item_so B
  417.                                 WHERE B.session_id = pSessionId
  418.                                 AND B.so_balance_invoice_id = A.so_balance_invoice_id;
  419.                                
  420.                                 DELETE FROM sl_so_balance_invoice_tax A
  421.                                 WHERE A.tenant_id = pTenantId
  422.                                 AND EXISTS (
  423.                                     SELECT 1 FROM tt_os_delivery_order_item_manage_item_so B
  424.                                     WHERE A.tenant_id = B.tenant_id
  425.                                     AND A.ou_id = B.ou_id
  426.                                     AND A.partner_id = B.partner_id
  427.                                     AND A.so_id = B.so_id
  428.                                     AND A.ref_doc_type_id = B.delivery_order_doc_type_id
  429.                                     AND A.ref_id = B.delivery_order_id
  430.                                     AND A.ref_item_id = B.delivery_order_item_id
  431.                                     AND A.do_receipt_item_id = vEmptyId
  432.                                     AND B.session_id = pSessionId
  433.                                 );
  434.                                
  435.                                 INSERT INTO sl_so_balance_invoice_tax
  436.                                     (tenant_id, ou_id, partner_id, so_id,
  437.                                     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  438.                                     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  439.                                     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  440.                                 SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  441.                                     A.delivery_order_doc_type_id, A.delivery_order_id, A.delivery_order_item_id, A.tax_id, B.flg_amount,
  442.                                     A.tax_percentage, A.curr_code,
  443.                                     f_get_amount_before_tax_and_disc(A.qty_dlv_so * A.gross_sell_price, A.qty_dlv_so * A.discount_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, A.curr_code), vRoundingModeNonTax),
  444.                                     f_tax_rounding(A.tenant_id, f_get_amount_before_tax(A.qty_dlv_so * (A.gross_sell_price - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDeliveryOrderDocTypeId, A.curr_code), vRoundingModeNonTax), A.tax_percentage), vFlagNo, vEmptyId,
  445.                                     0, pDatetime, pUserId, pDatetime, pUserId
  446.                                 FROM tt_os_delivery_order_item_manage_item_so A
  447.                                 INNER JOIN m_tax B ON A.tax_id = B.tax_id
  448.                                 WHERE A.session_id = pSessionId;
  449.                                
  450.                                 /** UPDATE BALANCE DO RECEIPT **/
  451.                                
  452.                                 INSERT INTO tt_os_delivery_order_receipt_item_manage_item_so(
  453.                                         session_id, tenant_id,
  454.                                         ou_id, delivery_order_doc_type_id, delivery_order_item_id, delivery_order_id,
  455.                                         so_id, so_item_id, delivery_order_receipt_no, delivery_order_receipt_date, curr_code,
  456.                                         partner_id, gross_sell_price, discount_amount, nett_sell_price,
  457.                                         regular_disc_amount, promo_disc_amount, flg_tax_amount,
  458.                                         tax_id, tax_percentage, qty_return, qty_so, qty_int, qty_dlv_so,
  459.                                         so_balance_invoice_id, do_receipt_item_id)
  460.                                 SELECT pSessionId, pTenantId,
  461.                                        F.ou_id, C.doc_type_id, E.ref_id, C.do_id,
  462.                                        F.so_id, G.so_item_id, D.doc_no, D.doc_date, G.curr_code,
  463.                                        F.partner_bill_to_id, G.gross_sell_price, G.discount_amount, G.nett_sell_price,
  464.                                        I.regular_disc_amount, I.promo_disc_amount, G.flg_tax_amount,
  465.                                        G.tax_id, G.tax_percentage, E.qty_return, G.qty_so, G.qty_int, I.qty_dlv_so,
  466.                                        H.so_balance_invoice_id, E.do_receipt_item_id
  467.                                 FROM sl_manage_so_item A
  468.                                 INNER JOIN sl_manage_so B ON A.manage_so_id = B.manage_so_id
  469.                                 INNER JOIN sl_do C ON C.ref_id = B.so_id
  470.                                 INNER JOIN sl_do_item J ON C.do_id = J.do_id AND A.so_item_id = J.ref_id
  471.                                 INNER JOIN in_do_receipt D ON D.ref_id = C.do_id
  472.                                 INNER JOIN in_do_receipt_item E ON E.do_receipt_id = D.do_receipt_id AND E.ref_id = J.do_item_id
  473.                                 INNER JOIN sl_so F ON B.so_id = F.so_id
  474.                                 INNER JOIN sl_so_item G ON F.so_id = G.so_id AND G.so_item_id = J.ref_id
  475.                                 INNER JOIN sl_so_balance_invoice H
  476.                                     ON H.ref_doc_type_id = C.doc_type_id
  477.                                     AND H.ref_id = C.do_id
  478.                                     AND H.ref_item_id = E.ref_id
  479.                                     AND H.tenant_id = pTenantId
  480.                                     AND H.ou_id = D.ou_id
  481.                                     AND H.partner_id = F.partner_bill_to_id
  482.                                     AND H.do_receipt_item_id = E.do_receipt_item_id
  483.                                 INNER JOIN sl_so_balance_invoice I
  484.                                     ON I.ref_doc_type_id = C.doc_type_id
  485.                                     AND I.ref_id = C.do_id
  486.                                     AND I.ref_item_id = E.ref_id
  487.                                     AND I.tenant_id = pTenantId
  488.                                     AND I.ou_id = D.ou_id
  489.                                     AND I.partner_id = F.partner_bill_to_id
  490.                                     AND I.do_receipt_item_id = vEmptyId
  491.                                 WHERE H.flg_invoice = vFlagNo
  492.                                     AND H.invoice_id = vEmptyId
  493.                                     AND A.manage_so_id = pManageSoId
  494.                                     AND A.flg_change_do = vFlagYes;
  495.                                
  496.                                 UPDATE sl_so_balance_invoice A
  497.                                 SET price_so = f_get_price_before_tax_and_disc(B.gross_sell_price, ((B.regular_disc_amount / B.qty_dlv_so) + (B.promo_disc_amount / B.qty_dlv_so)), B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, B.curr_code), vRoundingModeNonTax),
  498.                                     item_amount = -1 * f_get_amount_before_tax_and_disc((B.qty_return * B.qty_so / B.qty_int) * B.gross_sell_price, (B.regular_disc_amount + B.promo_disc_amount) * (B.qty_return * B.qty_so / B.qty_int) / B.qty_dlv_so, B.flg_tax_amount, B.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, B.curr_code), vRoundingModeNonTax),
  499.                                     version = A.version + 1,
  500.                                     update_datetime = pDatetime,
  501.                                     update_user_id = pUserId
  502.                                 FROM tt_os_delivery_order_receipt_item_manage_item_so B
  503.                                 WHERE B.session_id = pSessionId
  504.                                 AND B.so_balance_invoice_id = A.so_balance_invoice_id;
  505.                                
  506.                                 DELETE FROM sl_so_balance_invoice_tax A
  507.                                 WHERE A.tenant_id = pTenantId
  508.                                 AND EXISTS (
  509.                                     SELECT 1 FROM tt_os_delivery_order_receipt_item_manage_item_so B
  510.                                     WHERE A.tenant_id = B.tenant_id
  511.                                     AND A.ou_id = B.ou_id
  512.                                     AND A.partner_id = B.partner_id
  513.                                     AND A.so_id = B.so_id
  514.                                     AND A.ref_doc_type_id = B.delivery_order_doc_type_id
  515.                                     AND A.ref_id = B.delivery_order_id
  516.                                     AND A.ref_item_id = B.delivery_order_item_id
  517.                                     AND A.do_receipt_item_id = B.do_receipt_item_id
  518.                                     AND B.session_id = pSessionId
  519.                                 );
  520.                                
  521.                                 INSERT INTO sl_so_balance_invoice_tax
  522.                                 (tenant_id, ou_id, partner_id, so_id,
  523.                                 ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  524.                                 tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  525.                                 "version", create_datetime, create_user_id, update_datetime, update_user_id,
  526.                                 do_receipt_item_id)
  527.                                 SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  528.                                     A.delivery_order_doc_type_id, A.delivery_order_id, A.delivery_order_item_id, A.tax_id, B.flg_amount,
  529.                                     A.tax_percentage, A.curr_code,
  530.                                     -1 * f_get_amount_before_tax_and_disc((A.qty_return * A.qty_so / A.qty_int) * A.gross_sell_price, (A.qty_return * A.qty_so / A.qty_int) * A.discount_amount, A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, A.curr_code), vRoundingModeNonTax),
  531.                                     -1 * f_tax_rounding(A.tenant_id, f_get_amount_before_tax((A.qty_return * A.qty_so / A.qty_int) * (A.gross_sell_price - A.discount_amount), A.flg_tax_amount, A.tax_percentage, f_get_digit_decimal_doc_curr(vDoReceiptDocTypeId, A.curr_code), vRoundingModeNonTax), A.tax_percentage), vFlagNo, vEmptyId,
  532.                                     0, pDatetime, pUserId, pDatetime, pUserId,
  533.                                     A.do_receipt_item_id
  534.                                 FROM tt_os_delivery_order_receipt_item_manage_item_so A
  535.                                 INNER JOIN m_tax B ON A.tax_id = B.tax_id
  536.                                 WHERE A.session_id = pSessionId;
  537.                                
  538.                                 -- update nilai so_item_id pada sl_manage_so_item menjadi -99
  539.                                 UPDATE sl_manage_so_item
  540.                                 SET so_item_id = vEmptyId
  541.                                 WHERE flg_new_item = vFlagYes
  542.                                     AND manage_so_id = pManageSoId;
  543.                                    
  544.                                 -- update status doc manage so
  545.                                 UPDATE sl_manage_so SET status_doc = vStatusDraft, workflow_status = vWorkflowStatusDraft, update_datetime = pDatetime, update_user_id = pUserId, version = version + 1
  546.                                 WHERE manage_so_id = pManageSoId
  547.                                     AND status_doc = vStatusRelease;
  548.                                    
  549.                                 DELETE FROM tt_sl_so_tax_for_modify_so WHERE session_id = pSessionId;
  550.                                 DELETE FROM tt_os_delivery_order_item_manage_item_so WHERE session_id = pSessionId;
  551.                                 DELETE FROM tt_os_delivery_order_receipt_item_manage_item_so WHERE session_id = pSessionId;
  552.                                    
  553.                                 -- PERFORM f_reset_approval_to_draft
  554.                                 PERFORM f_reset_approval_to_draft(pTenantId, pSessionId, vScheme, pManageSoId, vDocNo, pDatetime, pRemarkApproval);
  555.                                    
  556.                                 -- UPDATE t_process_message
  557.                                 UPDATE t_process_message
  558.                                 SET process_no = pPrevProcessNo,
  559.                                     update_datetime = pDatetime,
  560.                                     update_user_id = pUserId,
  561.                                     version = version + 1
  562.                                 WHERE tenant_id = pTenantId
  563.                                     AND process_name = vFunctionSubmit
  564.                                     AND process_no = pManageSoId || '_' || vDocNo;     
  565.                
  566.                            
  567.                             ELSE
  568.                                 RAISE EXCEPTION 'Sales Order with id % already used for invoice', vSoId;
  569.                             END IF;
  570.                                    
  571.                         ELSE
  572.                             RAISE EXCEPTION 'Sales Order with id % already used for other document', vSoId;
  573.                         END IF;
  574.                                
  575.                     ELSE
  576.                         RAISE EXCEPTION 'Sales Order with id % is void, or is canceled', vSoId;
  577.                     END IF;
  578.                            
  579.                 ELSE
  580.                     RAISE EXCEPTION 'Sales Order with id % is in use by other document, is void, or is canceled', vSoId;
  581.                 END IF;
  582.                
  583.             ELSE
  584.                 RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vDoReceiptDocDate, 1, 6);
  585.             END IF;
  586.            
  587.         ELSE
  588.             RAISE EXCEPTION 'Admin Process Ledger for Inventory in year month % is already closed', SUBSTR(vDoDocDate, 1, 6);
  589.         END IF;
  590.        
  591.     ELSE
  592.         RAISE EXCEPTION 'Document with id % is not found or document is on approval progress', pManageSoId;
  593.     END IF;
  594.    
  595. END;
  596. $BODY$
  597.   LANGUAGE plpgsql VOLATILE
  598.   COST 100;
  599.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement