Advertisement
aadddrr

in_submit_return_note_katamata

Sep 6th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: in_submit_return_note(bigint, character varying, character varying)
  2.  
  3. -- DROP FUNCTION in_submit_return_note(bigint, character varying, character varying);
  4.  
  5. CREATE OR REPLACE FUNCTION in_submit_return_note(bigint, character varying, character varying)
  6.   RETURNS void AS
  7. $BODY$
  8. DECLARE
  9.     pTenantId           ALIAS FOR $1;
  10.     pSessionId          ALIAS FOR $2;
  11.     pProcessNo          ALIAS FOR $3;
  12.  
  13.     vProcessId      bigint;
  14.     vReturnNoteId   bigint;
  15.     vUserId         bigint;
  16.     vDatetime       character varying(14);
  17.     vFlagInvoice    character varying(1);
  18.     vEmptyId        bigint;
  19.     vStatusRelease  character varying(1);
  20.     vEmptyValue     character varying(1);
  21.     vStatusFinal    character varying(1);
  22.     vStatusDraft    character varying(1);  
  23.     vFlagYes            character varying(1);
  24.     vFlagNo             character varying(1);
  25.     vEmptyString        character varying(1);  
  26.     vJournalType        character varying(20);
  27.     vSignDebit          character varying(1);
  28.     vSignCredit         character varying(1);
  29.     vTypeRate           character varying(3);
  30.     vProductCOA         character varying(10);
  31.     vSystemCOA          character varying(10);
  32.     vParentOuId         bigint;
  33.     vJournalTrxId       bigint;
  34.     vTagKeyMou          character varying(10);
  35.    
  36.     vDocJournal             DOC_JOURNAL%ROWTYPE;
  37.     vOuStructure            OU_BU_STRUCTURE%ROWTYPE;
  38.     result                  RECORD;
  39.    
  40.     vReturnNoteDocTypeId    bigint;
  41.     vRoundingModeNonTax     character varying(5);
  42.    
  43.     vSoId                   bigint;
  44.     vDigitDppRoundingTax    integer;
  45.    
  46.     vEmptyAmount            numeric := 0;
  47.     vFlgYes                 character varying(1) := 'Y';
  48.     vFlgNo                  character varying(1) := 'N';
  49.    
  50. BEGIN
  51.    
  52.     vFlagInvoice := 'N';
  53.     vEmptyId := -99;
  54.     vEmptyValue := ' ';
  55.     vStatusRelease := 'R';
  56.     vStatusFinal := 'F';
  57.     vStatusDraft := 'D';   
  58.     vFlagYes := 'Y';
  59.     vFlagNo := 'N';
  60.     vEmptyString := ' ';
  61.     vSignDebit := 'D';
  62.     vSignCredit := 'C';
  63.     vTypeRate := 'COM';
  64.     vProductCOA := 'PRODUCT';
  65.     vSystemCOA := 'SYSTEM';
  66.     vTagKeyMou := 'MOU';
  67.    
  68.     vReturnNoteDocTypeId := 502;
  69.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  70.    
  71.    
  72.     SELECT A.process_message_id INTO vProcessId
  73.     FROM t_process_message A
  74.     WHERE A.tenant_id = pTenantId AND
  75.         A.process_name = 'in_submit_return_note' AND
  76.         A.process_no = pProcessNo;
  77.        
  78.     SELECT CAST(A.process_parameter_value AS bigint) INTO vReturnNoteId
  79.     FROM t_process_parameter A
  80.     WHERE A.process_message_id = vProcessId AND
  81.         A.process_parameter_key = 'returnNoteId';
  82.    
  83.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  84.     FROM t_process_parameter A
  85.     WHERE A.process_message_id = vProcessId AND
  86.         A.process_parameter_key = 'userId';
  87.  
  88.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  89.     FROM t_process_parameter A
  90.     WHERE A.process_message_id = vProcessId AND
  91.         A.process_parameter_key = 'datetime';
  92.  
  93.     -- DELETE table temporary  
  94.     DELETE FROM tt_in_so_balance_item WHERE session_id = pSessionId;   
  95.     DELETE FROM tt_coin_detail_brand WHERE session_id = pSessionId;
  96.     DELETE FROM tt_coin_summary WHERE session_id = pSessionId;
  97.    
  98.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'dpp.rounding.decimal.tax')::integer INTO vDigitDppRoundingTax;
  99.    
  100.     /*
  101.      * 1.update status doc in_inventory
  102.      * 2.update data ke in_product_balance_stock / insert data ke in_product-balance_stock
  103.      * 3.insert data ke in_log_product_balance_stock
  104.      * 4.update data sl_so_balance_item
  105.      * 5.insert data sl_log_so_balance_item
  106.      * 6.insert data sl_so_balance_invoice
  107.      * 7.insert data sl_so_balance_invoice_tax
  108.      * 8.update data in_balance_do_item
  109.      * 9.add trx jurnal
  110.      */
  111.        
  112.     SELECT f_get_ou_bu_structure(A.ou_from_id) AS ou, f_get_document_journal(A.doc_type_id) as doc
  113.     FROM in_inventory A
  114.     WHERE A.inventory_id = vReturnNoteId INTO result;
  115.    
  116.     vOuStructure := result.ou;
  117.     vDocJournal := result.doc; 
  118.    
  119.     UPDATE in_inventory SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  120.     WHERE inventory_id = vReturnNoteId;
  121.    
  122.     /*
  123.      * mengambil data dari in_inventory_item tanpa melakukan group by untuk ditampung ke tt_in_product_balance
  124.      */
  125.     INSERT INTO tt_in_product_balance
  126.     (session_id, tenant_id, inventory_id, inventory_item_id, product_balance_id, product_id, product_status,
  127.      serial_number, product_expired_date, product_year_made, lot_number, qty_realization, base_uom_id)
  128.     SELECT pSessionId, A.tenant_id, A.inventory_id, B.inventory_item_id, B.product_balance_id, B.product_id, B.product_status,
  129.         B.serial_number, B.product_expired_date, B.product_year_made, B.lot_number, B.qty_realization, B.base_uom_id
  130.     FROM in_inventory A, in_inventory_item B
  131.     WHERE A.inventory_id = B.inventory_id AND
  132.         A.inventory_id = vReturnNoteId;
  133.        
  134.     /*
  135.      * add product balance yang belum ada
  136.      */
  137.     INSERT INTO in_product_balance
  138.     (tenant_id, product_id, serial_number, lot_number,
  139.     product_expired_date, product_year_made,
  140.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  141.     SELECT A.tenant_id, A.product_id, A.serial_number, A.lot_number,
  142.         A.product_expired_date, A.product_year_made,
  143.         0, vDatetime, vUserId, vDatetime, vUserId
  144.     FROM tt_in_product_balance A
  145.     WHERE A.session_id = pSessionId AND
  146.         A.product_balance_id = vEmptyId AND
  147.         NOT EXISTS (SELECT 1 FROM in_product_balance B
  148.                     WHERE A.tenant_id = B.tenant_id AND
  149.                         A.product_id = B.product_id AND
  150.                         A.serial_number = B.serial_number AND
  151.                         A.lot_number = B.lot_number)
  152.     GROUP BY A.tenant_id, A.product_id, A.serial_number, A.lot_number,
  153.         A.product_expired_date, A.product_year_made;
  154.        
  155.     -- Update product_balance_id yang ada di table temp
  156.     UPDATE tt_in_product_balance A
  157.         SET product_balance_id = B.product_balance_id
  158.     FROM in_product_balance B
  159.     WHERE A.session_id = pSessionId AND
  160.         A.product_balance_id = vEmptyId AND
  161.         A.tenant_id = B.tenant_id AND
  162.         A.product_id = B.product_id AND
  163.         A.serial_number = B.serial_number AND
  164.         A.lot_number = B.lot_number;
  165.    
  166.     /*
  167.      * create summary dari in_inventory_item untuk update yg sudah ada di in_product_balance_stock
  168.      */
  169.     INSERT INTO tt_in_product_balance_summary_stock
  170.             (session_id, tenant_id, inventory_id, warehouse_id, product_id, product_balance_id, product_status, base_uom_id, qty)
  171.     SELECT  B.session_id, B.tenant_id, B.inventory_id, A.warehouse_from_id, B.product_id, B.product_balance_id, B.product_status,
  172.             B.base_uom_id, SUM(B.qty_realization)
  173.     FROM    in_inventory A, tt_in_product_balance B
  174.     WHERE   A.inventory_id = B.inventory_id
  175.         AND B.session_id = pSessionId
  176.     GROUP BY B.session_id, B.tenant_id, B.inventory_id, A.warehouse_from_id, B.product_id, B.product_balance_id, B.product_status,
  177.             B.base_uom_id;
  178.        
  179.     /*
  180.      * update product_balance_stock
  181.      */
  182.     UPDATE in_product_balance_stock
  183.         SET version = in_product_balance_stock.version + 1,
  184.             qty = in_product_balance_stock.qty + A.qty,
  185.             update_datetime = vDatetime,
  186.             update_user_id = vUserId
  187.     FROM tt_in_product_balance_summary_stock A
  188.     WHERE A.session_id = pSessionId AND
  189.         in_product_balance_stock.tenant_id = A.tenant_id AND
  190.         in_product_balance_stock.warehouse_id = A.warehouse_id AND
  191.         in_product_balance_stock.product_id = A.product_id AND
  192.         in_product_balance_stock.product_balance_id = A.product_balance_id AND
  193.         in_product_balance_stock.product_status = A.product_status;
  194.    
  195.     /*
  196.      * insert data in_product_balance_stock
  197.      */
  198.     INSERT INTO in_product_balance_stock
  199.     (tenant_id, warehouse_id, product_id, product_balance_id, product_status, base_uom_id, qty,
  200.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  201.     SELECT A.tenant_id, A.warehouse_id, A.product_id, A.product_balance_id, A.product_status, A.base_uom_id, A.qty,
  202.             0, vDatetime, vUserId, vDatetime, vUserId
  203.     FROM tt_in_product_balance_summary_stock A
  204.     WHERE A.session_id = pSessionId AND
  205.         NOT EXISTS (SELECT 1 FROM in_product_balance_stock C
  206.                     WHERE C.tenant_id = A.tenant_id AND
  207.                         C.warehouse_id = A.warehouse_id AND
  208.                         C.product_id = A.product_id AND
  209.                         C.product_balance_id = A.product_balance_id AND
  210.                         C.product_status = A.product_status);
  211.        
  212.     /*
  213.      * insert data in_log_product_balance_stock
  214.      */    
  215.     INSERT INTO in_log_product_balance_stock
  216.     (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  217.      product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  218.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  219.     SELECT A.tenant_id, A.ou_to_id, A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date, A.partner_id,
  220.         B.product_id, B.product_balance_id, A.warehouse_to_id, B.product_status, B.base_uom_id, B.qty,
  221.         0, vDatetime, vUserId, vDatetime, vUserId
  222.     FROM in_inventory A, tt_in_product_balance_summary_stock B
  223.     WHERE B.session_id = pSessionId AND
  224.         A.inventory_id = B.inventory_id;
  225.  
  226.        
  227.     /*
  228.      * insert data temporer tt_in_so_balance_item
  229.      * custom ambil dari RRS
  230.      *
  231.      * Modify @author Thea, 15 Jul 2016
  232.      * ubah ambil nilai item
  233.      */
  234.     INSERT INTO tt_in_so_balance_item
  235.     (session_id, tenant_id, ou_id, doc_type_id,
  236.     doc_no, doc_date, inventory_id, partner_id,
  237.     inventory_item_id, so_id, do_id, do_item_id,
  238.     qty_return, base_uom_id, remark,
  239.     so_item_id, curr_code, price,
  240.     flg_tax_amount, qty_so, qty_int_so,
  241.     so_uom_id, tax_id, tax_percentage)
  242.     SELECT pSessionId, A.tenant_id, A.ou_from_id, A.doc_type_id,
  243.             A.doc_no, A.doc_date, A.inventory_id, C.partner_id,
  244.             B.inventory_item_id, A.ref_id, B.ref_id, D.request_return_sales_brand_item_id,
  245.             SUM(B.qty_realization), B.base_uom_id, A.remark,
  246.             vEmptyId, D.curr_code, D.nett_sell_price,
  247.             D.flg_tax_amount, D.qty_return, D.qty_return,
  248.             D.uom_id, D.tax_id, D.tax_percentage
  249.     FROM in_inventory A, in_inventory_item B, sl_request_return_sales C, sl_request_return_sales_brand_item D, m_product E
  250.     WHERE A.inventory_id = vReturnNoteId AND
  251.           A.inventory_id = B.inventory_id AND
  252.           A.ref_id = C.request_return_sales_id AND
  253.           C.request_return_sales_id = D.request_return_sales_id AND
  254.           E.product_id = B.product_id AND
  255.           E.brand_id = D.brand_id
  256.     GROUP BY A.tenant_id, A.ou_from_id, A.doc_type_id,
  257.             A.doc_no, A.doc_date, A.inventory_id, C.partner_id,
  258.             B.inventory_item_id, A.ref_id, B.ref_id, D.request_return_sales_brand_item_id,
  259.             B.base_uom_id, A.remark, D.curr_code,  D.nett_sell_price,
  260.             D.flg_tax_amount, D.qty_so,
  261.             D.uom_id, D.tax_id, D.tax_percentage;
  262.        
  263.     /*
  264.      * buat data sl_so_balance_invoice
  265.      * --B.regular_disc_amount langsung SET 0 karena nilai regular disc amount nya selalu 0, tidak di set pada RRS
  266.      */    
  267.     INSERT INTO sl_so_balance_invoice
  268.     (tenant_id, ou_id, partner_id, so_id,
  269.     ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  270.     curr_code, price_so, item_amount, flg_invoice, invoice_id,
  271.     regular_disc_amount, promo_disc_amount, adj_regular_disc_amount, adj_promo_disc_amount,
  272.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  273.     SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  274.         A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date, A.do_item_id, ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)), A.so_uom_id,
  275.         A.curr_code, A.price,
  276.         f_get_dpp_after_discount(ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)) * B.gross_sell_price, A.flg_tax_amount, f_get_tax_amount_after_discount(ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)) * B.gross_sell_price, A.flg_tax_amount, A.tax_percentage, 0)),
  277.         vFlagInvoice, vEmptyId,
  278.         0, 0, 0, 0,
  279.         0, vDatetime, vUserId, vDatetime, vUserId
  280.     FROM tt_in_so_balance_item A
  281.     INNER JOIN sl_request_return_sales_brand_item B ON A.do_item_id = B.request_return_sales_brand_item_id
  282.     WHERE A.session_id = pSessionId
  283.     GROUP BY A.tenant_id, A.ou_id, A.partner_id, A.so_id, A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date, A.do_item_id, A.so_uom_id, A.curr_code, A.price,
  284.         B.gross_sell_price, A.flg_tax_amount, A.tax_percentage;
  285.          
  286.     /*
  287.      * buat data sl_so_balance_invoice_tax
  288.      */
  289.     INSERT INTO sl_so_balance_invoice_tax
  290.     (tenant_id, ou_id, partner_id, so_id,
  291.     ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  292.     tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  293.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  294.     SELECT A.tenant_id, A.ou_id, A.partner_id, A.so_id,
  295.         A.doc_type_id, A.inventory_id, A.do_item_id, A.tax_id, D.flg_amount,
  296.         A.tax_percentage, A.curr_code,
  297.         f_get_dpp_after_discount(ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)) * B.gross_sell_price, A.flg_tax_amount, f_get_tax_amount_after_discount(ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)) * B.gross_sell_price, A.flg_tax_amount, A.tax_percentage, 0)),
  298.         f_get_tax_amount_after_discount(ROUND(SUM((A.qty_return * A.qty_so) / A.qty_int_so)) * B.gross_sell_price, A.flg_tax_amount, A.tax_percentage, 0),
  299.         vFlagInvoice, vEmptyId,
  300.         0, vDatetime, vUserId, vDatetime, vUserId
  301.     FROM tt_in_so_balance_item A, m_tax D, sl_request_return_sales_brand_item B
  302.     WHERE A.session_id = pSessionId AND
  303.           A.tax_id = D.tax_id AND
  304.           A.do_item_id = B.request_return_sales_brand_item_id
  305.     GROUP BY A.tenant_id, A.ou_id, A.partner_id, A.so_id, A.doc_type_id, A.inventory_id, A.do_item_id, A.tax_id,
  306.         D.flg_amount, A.tax_percentage, A.curr_code, B.gross_sell_price, A.flg_tax_amount;
  307.    
  308.     UPDATE in_balance_do_item SET status_item = vStatusFinal
  309.     FROM tt_in_so_balance_item A
  310.     WHERE A.session_id = pSessionId AND
  311.         in_balance_do_item.do_item_id = A.do_item_id AND
  312.         in_balance_do_item.qty_dlv -in_balance_do_item.qty_return <= 0;
  313.  
  314.     UPDATE in_balance_do_item SET status_item = vStatusRelease
  315.     FROM tt_in_so_balance_item A
  316.     WHERE A.session_id = pSessionId AND
  317.         in_balance_do_item.do_item_id = A.do_item_id AND
  318.         in_balance_do_item.qty_dlv -in_balance_do_item.qty_return > 0;
  319.        
  320.     /*
  321.      * Henik
  322.      * For Project Katamata Only, update data balance MOU & insert Log if SO was tagging to MOU
  323.      * For Project Katamata Only, insert into return tagging based on SO if SO was tagging to MOU
  324.      *
  325.      * ======= BEGIN =======
  326.      */
  327.     -- update plafon mou di mou balance
  328.     -- And insert ke table in_return_tagging
  329.     SELECT B.ref_id INTO vSoId
  330.     FROM in_inventory  A
  331.     INNER JOIN sl_request_return_sales B
  332.         ON A.ref_id = B.request_return_sales_id
  333.         AND A.ref_doc_type_id = B.doc_type_id
  334.     WHERE A.inventory_id = vReturnNoteId;
  335.    
  336.     IF EXISTS(SELECT 1 FROM sl_so_tagging WHERE tenant_id = pTenantId AND so_id = vSoId AND tag_key = vTagKeyMou) THEN
  337.         --update data MOU balance if so = so by brand yang tagging ke mou ( and mou_id != -99 )
  338.         WITH summary AS (
  339.             SELECT E.ref_id AS so_id, B.tag_doc_id AS mou_id,
  340.                 SUM(A.item_amount-A.regular_disc_amount)+SUM(COALESCE(C.tax_amount,0)) AS amount_and_tax
  341.             FROM sl_so_balance_invoice A
  342.             INNER JOIN in_inventory D ON A.ref_id = D.inventory_id AND A.ref_doc_type_id = D.doc_type_id
  343.             INNER JOIN sl_request_return_sales E ON D.ref_id = E.request_return_sales_id AND D.ref_doc_type_id = E.doc_type_id
  344.             INNER JOIN sl_so_tagging B ON E.ref_id = B.so_id AND A.tenant_id = B.tenant_id AND B.tag_key = vTagKeyMou
  345.             LEFT JOIN sl_so_balance_invoice_tax C          
  346.                 ON A.partner_id = C.partner_id     
  347.                 AND A.ref_doc_type_id = C.ref_doc_type_id      
  348.                 AND A.ref_id = C.ref_id    
  349.                 AND A.ref_item_id = C.ref_item_id      
  350.                 AND A.do_receipt_item_id = C.do_receipt_item_id    
  351.             WHERE A.tenant_id = pTenantId
  352.                 AND A.ref_id = vReturnNoteId
  353.                 AND A.ref_doc_type_id = vReturnNoteDocTypeId
  354.             GROUP BY E.ref_id, B.tag_doc_id
  355.         )
  356.         UPDATE sl_mou_balance D
  357.         SET usage_balance = D.usage_balance - E.amount_and_tax,
  358.             version = D.version + 1,
  359.             update_datetime = vDatetime,
  360.             update_user_id = vUserId
  361.         FROM summary E
  362.         WHERE D.mou_id = E.mou_id;
  363.        
  364.         --insert log untuk amount nya
  365.         WITH summary AS (
  366.             SELECT A.tenant_id, A.ou_from_id, C.tag_doc_id AS mou_id, A.doc_type_id,
  367.                 A.inventory_id, A.doc_no, A.doc_date, A.partner_id, B.curr_code,
  368.                 SUM(B.item_amount-B.regular_disc_amount) AS amount
  369.             FROM in_inventory A
  370.                 INNER JOIN sl_request_return_sales D ON A.ref_id = D.request_return_sales_id AND A.ref_doc_type_id = D.doc_type_id
  371.                 INNER JOIN sl_so_balance_invoice B ON A.inventory_id = B.ref_id AND A.doc_type_id = B.ref_doc_type_id
  372.                 INNER JOIN sl_so_tagging C ON D.ref_id = C.so_id AND A.tenant_id = C.tenant_id AND C.tag_key = vTagKeyMou
  373.             WHERE A.tenant_id = pTenantId
  374.                  AND A.inventory_id = vReturnNoteId
  375.                  AND A.doc_type_id = vReturnNoteDocTypeId
  376.             GROUP BY A.tenant_id, A.ou_from_id, C.tag_doc_id, A.doc_type_id,
  377.                 A.inventory_id, A.doc_no, A.doc_date, A.partner_id, B.curr_code
  378.         )
  379.         INSERT INTO sl_mou_balance_log (
  380.             tenant_id, ou_id, mou_id, ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  381.             partner_id, curr_code, amount, remark,
  382.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  383.         SELECT D.tenant_id, D.ou_from_id, D.mou_id, D.doc_type_id, D.inventory_id, D.doc_no, D.doc_date,
  384.             D.partner_id, D.curr_code,  D.amount , 'Return Balance MOU from Return-Note',  
  385.             vDatetime, vUserId, vDatetime, vUserId, 0
  386.         FROM summary D;
  387.        
  388.         --insert log untuk amount - tax nya
  389.         WITH summary AS (
  390.             SELECT A.tenant_id, A.ou_from_id, C.tag_doc_id AS mou_id, A.doc_type_id,
  391.                 A.inventory_id, A.doc_no, A.doc_date, A.partner_id, B.curr_code,
  392.                 SUM(B.tax_amount) AS tax_amount
  393.             FROM in_inventory A
  394.                 INNER JOIN sl_request_return_sales D ON A.ref_id = D.request_return_sales_id AND A.ref_doc_type_id = D.doc_type_id
  395.                 INNER JOIN sl_so_balance_invoice_tax B ON A.inventory_id = B.ref_id AND A.doc_type_id = B.ref_doc_type_id
  396.                 INNER JOIN sl_so_tagging C ON D.ref_id = C.so_id AND A.tenant_id = C.tenant_id AND C.tag_key = vTagKeyMou
  397.             WHERE A.tenant_id = pTenantId
  398.                  AND A.inventory_id = vReturnNoteId
  399.                  AND A.doc_type_id = vReturnNoteDocTypeId
  400.             GROUP BY A.tenant_id, A.ou_from_id, C.tag_doc_id, A.doc_type_id,
  401.                 A.inventory_id, A.doc_no, A.doc_date, A.partner_id, B.curr_code
  402.         )
  403.         INSERT INTO sl_mou_balance_log (
  404.             tenant_id, ou_id, mou_id, ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date,
  405.             partner_id, curr_code, amount, remark,
  406.             create_datetime, create_user_id, update_datetime, update_user_id, version)
  407.         SELECT D.tenant_id, D.ou_from_id, D.mou_id, D.doc_type_id, D.inventory_id, D.doc_no, D.doc_date,
  408.             D.partner_id, D.curr_code,  D.tax_amount , 'Return Balance MOU from Return-Note - Tax',  
  409.             vDatetime, vUserId, vDatetime, vUserId, 0
  410.         FROM summary D;
  411.        
  412.         -- Insert ke table in_return_tagging
  413.         INSERT INTO in_return_tagging (
  414.         tenant_id, ou_id, inventory_id, tag_key, tag_doc_id, tag_doc_no, remark,
  415.         create_datetime, create_user_id, update_datetime, update_user_id, version)
  416.         SELECT A.tenant_id, A.ou_from_id, vReturnNoteId, vTagKeyMou, B.tag_doc_id, B.tag_doc_no, 'Tag To MOU (Default by SO)',
  417.             vDatetime, vUserId, vDatetime, vUserId, 0
  418.         FROM in_inventory A
  419.         INNER JOIN sl_request_return_sales C
  420.             ON A.ref_id = C.request_return_sales_id
  421.             AND A.ref_doc_type_id = C.doc_type_id
  422.         INNER JOIN sl_so_tagging B ON C.ref_id = B.so_id AND C.tenant_id = B.tenant_id AND B.tag_key = vTagKeyMou
  423.         WHERE A.inventory_id = vReturnNoteId;
  424.        
  425.     END IF;
  426.     /*======== END ==========*/
  427.    
  428.     ---------------------------------------------------------------------------------------------------------------------------------
  429.     -- Modif by Henik , 25 Agustus 2017
  430.     /* Perhitungan coin (pengurang) dari dok Return Note
  431.      * 1. Selalu lakukan perhitungan coin, baik yg ada referensi SOB maupun tidak
  432.      * 2. Hanya dapat coin promo
  433.      * 3. Menentukan masuk ke promo mana
  434.      *      1. Berdasarkan tgl return, dan brand yg direturn
  435.      *      2. Cek tgl return masuk ke periode promo mana yg masih aktif,
  436.      *         jika masuk ke lebih dari 1 promo maka ambil date from paling akhir
  437.      *         ( date_return BETWEEN date_from AND date_to) -> lebih dr 1 : ambil MAX(date_from)
  438.      *                                                      -> lebih dr 1 : ambil MIN(date_to) ambil satu data yg dibuat paling duluan
  439.      *       
  440.      * 4. Perhitungan : coin promo * (qty return per brand * -1)
  441.      *
  442.      */
  443.    
  444.     -- Prepare data Return Note , dan cari promo mana yg diperoleh
  445.     -- Qty Return di kali -1
  446.     -- nilai promo coin di set bernilai Yes
  447.    WITH prepare_get_promo_return AS (
  448.    
  449.         -- Menentukan RN masuk ke daftar promo mana saja
  450.         SELECT A.tenant_id, A.partner_id, A.inventory_id, A.doc_type_id,
  451.             E.promo_id, E.date_from, E.date_to
  452.         FROM in_inventory A
  453.         INNER JOIN in_inventory_item B ON A.inventory_id = B.inventory_id
  454.         INNER JOIN sl_request_return_sales_brand_item C ON A.ref_id = C.request_return_sales_id
  455.                                                         AND f_get_brand_by_product_id(B.product_id) = C.brand_id
  456.         INNER JOIN m_promo E ON A.tenant_id = E.tenant_id
  457.                              AND E.flg_launching = vFlgNo
  458.                              AND E.active = vFlgYes
  459.         WHERE A.inventory_id = vReturnNoteId
  460.             AND A.doc_date BETWEEN E.date_from AND E.date_to
  461.             AND EXISTS(SELECT 1 FROM m_promo_item X
  462.                        WHERE E.promo_id = X.promo_id
  463.                             AND C.brand_id = X.brand_id)
  464.         GROUP BY A.tenant_id, A.partner_id, A.inventory_id, A.doc_type_id, E.promo_id, E.date_from, E.date_to
  465.        
  466.     ), select_promo_for_return AS (
  467.    
  468.         -- Mengambil promo yg date_from nya paling mendekati tgl return
  469.          SELECT A.tenant_id, A.partner_id, A.inventory_id, A.doc_type_id,
  470.             A.promo_id, A.date_from, A.date_to
  471.          FROM prepare_get_promo_return A
  472.          WHERE EXISTS(SELECT 1
  473.                       FROM prepare_get_promo_return B
  474.                       WHERE A.inventory_id = B.inventory_id
  475.                       HAVING A.date_from = MAX(B.date_from)
  476.                     )
  477.            
  478.     ), filter_promo_for_return AS (
  479.    
  480.         -- jika dari max(date_from) promo ada lebih dari 1, maka ambil date_to promo yg paling dekat dengan tgl RN
  481.         -- data promo akan diorder by promo_id dan dilimit 1 data yg diambil
  482.          SELECT  A.tenant_id, A.partner_id, A.inventory_id, A.doc_type_id,
  483.                 A.promo_id, A.date_from, A.date_to
  484.          FROM select_promo_for_return A
  485.          WHERE EXISTS(SELECT 1
  486.                       FROM select_promo_for_return B
  487.                       WHERE A.inventory_id = B.inventory_id
  488.                       HAVING A.date_to = MIN(B.date_to)
  489.                      )
  490.          ORDER BY A.promo_id
  491.          LIMIT 1
  492.          
  493.     )  
  494.     -- insert data prepare promo for return note untuk di follow up proses perhitungan coinnya
  495.     INSERT INTO tt_coin_detail_brand (
  496.         session_id,tenant_id, partner_id, so_id, ref_id, ref_doc_type_id, salesman_id,
  497.         brand_id, group_brand, qty,
  498.         promo_id, flg_promo_coin, sub_promo_id,
  499.         flg_sub_promo_coin, product_launching_id, flg_launching_coin,
  500.         coin_promo, coin_sub_promo, coin_launching,
  501.         coin_adjustment, coin_periodic_adjustment
  502.     )
  503.     SELECT pSessionId, A.tenant_id, A.partner_id, vEmptyId, A.inventory_id, A.doc_type_id, vEmptyId,
  504.         C.brand_id, C.group_brand, SUM(B.qty_realization *-1) AS qty,
  505.         A.promo_id, vFlgYes, vEmptyId,
  506.         vFlgNo, vEmptyId, vFlgNo,
  507.         vEmptyAmount, vEmptyAmount, vEmptyAmount,
  508.         vEmptyAmount, vEmptyAmount
  509.     FROM filter_promo_for_return A
  510.     INNER JOIN in_inventory_item B ON A.inventory_id = B.inventory_id
  511.     INNER JOIN m_brand_ext C ON f_get_brand_by_product_id(B.product_id) = C.brand_id
  512.     GROUP BY A.tenant_id, A.partner_id, A.inventory_id, A.doc_type_id,
  513.         C.brand_id, C.group_brand, A.promo_id;
  514.    
  515.     -- Dilakukan perhitungan coin dan update data coin promo balance jika dokumen return note memiliki promo   
  516.     IF EXISTS(SELECT 1 FROM tt_coin_detail_brand WHERE session_id = pSessionId AND ref_id = vReturnNoteId AND promo_id <> vEmptyId) THEN
  517.    
  518.         -- Execute function perhitungan coin
  519.         PERFORM f_coin_calculation(pSessionId);            
  520.            
  521.         -- Update data coin promo balance jika data nya sudah ada (lihat berdasarkan partner_id dan promo_id yg sama)
  522.         -- Berdasarkan data di table temp tt_coin_summary hasil dari function f_coin_calculation
  523.         UPDATE sl_coin_promo_balance A SET
  524.                 coin_promo = A.coin_promo + B.coin_promo,
  525.                 coin_sub_promo = A.coin_sub_promo + B.coin_sub_promo,
  526.                 coin_launching = A.coin_launching + B.coin_launching,
  527.                 coin_total = A.coin_total + B.coin_total,
  528.                 version = A.version + 1,
  529.                 update_user_id = vUserId,
  530.                 update_datetime = vDatetime
  531.         FROM tt_coin_summary B
  532.         WHERE B.session_id = pSessionId
  533.             AND A.tenant_id = B.tenant_id
  534.             AND A.partner_id = B.partner_id
  535.             AND A.promo_id = B.promo_id;
  536.        
  537.         -- Insert data coin balance jika belum ada datanya
  538.         -- Berdasarkan data di table temp tt_coin_summary hasil dari function f_coin_calculation
  539.         INSERT INTO sl_coin_promo_balance (
  540.             tenant_id, partner_id, promo_id, coin_promo, coin_sub_promo,
  541.             coin_launching, coin_adjustment, coin_periodic_adjustment, coin_total,
  542.             create_datetime, create_user_id, update_datetime, update_user_id, version          
  543.         )  
  544.         SELECT A.tenant_id, A.partner_id, A.promo_id, A.coin_promo, A.coin_sub_promo,
  545.             A.coin_launching, A.coin_adjustment, A.coin_periodic_adjustment, A.coin_total,
  546.             vDatetime, vUserId, vDatetime, vUserId, 0
  547.         FROM tt_coin_summary A
  548.         WHERE session_id = pSessionId
  549.             AND NOT EXISTS (SELECT 1 FROM sl_coin_promo_balance B
  550.                                      WHERE A.tenant_id = B.tenant_id
  551.                                             AND A.partner_id = B.partner_id
  552.                                             AND A.promo_id = B.promo_id);
  553.                                            
  554.         -- Insert data log coin ke table sl_log_coin_promo_balance
  555.         -- Berdasarkan data di table temp tt_coin_detail_brand hasil dari olahan function f_coin_calculation
  556.         INSERT INTO sl_log_coin_promo_balance (
  557.             tenant_id, partner_id, so_id, ref_id, ref_doc_type_id, promo_id, flg_promo_coin,
  558.             sub_promo_id, flg_sub_promo_coin, product_launching_id, flg_launching_coin,
  559.             brand_id, group_brand, salesman_id, qty, coin_promo, coin_sub_promo,
  560.             coin_launching, coin_adjustment, coin_periodic_adjustment,
  561.             create_datetime, create_user_id, update_datetime, update_user_id, version
  562.         )
  563.         SELECT tenant_id, partner_id, so_id, ref_id, ref_doc_type_id, promo_id, flg_promo_coin,
  564.             sub_promo_id, flg_sub_promo_coin, product_launching_id, flg_launching_coin,
  565.             brand_id, group_brand, salesman_id, qty, coin_promo, coin_sub_promo,
  566.             coin_launching, coin_adjustment, coin_periodic_adjustment,
  567.             vDatetime, vUserId, vDatetime, vUserId, 0
  568.         FROM tt_coin_detail_brand A
  569.         WHERE A.session_id = pSessionId
  570.         ORDER BY A.brand_id;
  571.        
  572.     END IF;
  573.    
  574.    
  575.     ---------------------------------------------------------------------------------------------------------------------------------
  576.    
  577.     /*
  578.      * journal return note
  579.      * Debit Inventory = dari nilai COGS
  580.      * Credit HPP
  581.      */
  582.     /*
  583.      * membuat data transaksi jurnal :
  584.      * 1. buat admin
  585.      * 2. buat temlate jurnal
  586.      */    
  587.     PERFORM gl_manage_admin_journal_trx(A.tenant_id, (vOuStructure).ou_bu_id, A.ou_from_id, (vDocJournal).journal_type, (vDocJournal).ledger_code, f_get_year_month_date(A.doc_date), 'MONTHLY', vDatetime, vUserId)
  588.     FROM in_inventory A
  589.     WHERE A.inventory_id = vReturnNoteId;
  590.        
  591.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  592.    
  593.     INSERT INTO gl_journal_trx
  594.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  595.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  596.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  597.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  598.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.inventory_id, A.doc_no, A.doc_date,
  599.         (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, A.partner_id, vEmptyId, A.warehouse_from_id, A.ext_doc_no, A.ext_doc_date,
  600.         A.ref_doc_type_id, A.ref_id, A.doc_date, f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), A.remark, vStatusDraft, 'DRAFT',
  601.         0, vDatetime, vUserId, vDatetime, vUserId
  602.     FROM in_inventory A
  603.     WHERE A.inventory_id = vReturnNoteId;
  604.    
  605.     INSERT INTO tt_journal_trx_item
  606.     (session_id, tenant_id, journal_trx_id, line_no,
  607.     ref_doc_type_id, ref_id,
  608.     partner_id, product_id, cashbank_id, ou_rc_id,
  609.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  610.     coa_id, curr_code, qty, uom_id,
  611.     amount, journal_date, type_rate,
  612.     numerator_rate, denominator_rate, journal_desc, remark)
  613.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  614.         A.doc_type_id, B.inventory_item_id,
  615.         A.partner_id, B.product_id, vEmptyId, vEmptyId,
  616.         vEmptyId, vSignDebit, vProductCOA, vEmptyId,
  617.         f_get_product_coa_group_product(A.tenant_id, B.product_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), B.qty_realization, B.base_uom_id,
  618.         0 , A.doc_date, vTypeRate,
  619.         1, 1, 'PRODUCT_STOCK', B.remark
  620.     FROM in_inventory A, in_inventory_item B
  621.     WHERE A.inventory_id = vReturnNoteId AND
  622.         A.inventory_id = B.inventory_id;
  623.  
  624.        
  625. /* NK, 1 Feb 2014, journal HPP tidak perlu break down sampai ke product    
  626.     INSERT INTO tt_journal_trx_item
  627.     (session_id, tenant_id, journal_trx_id, line_no,
  628.     ref_doc_type_id, ref_id,
  629.     partner_id, product_id, cashbank_id, ou_rc_id,
  630.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  631.     coa_id, curr_code, qty, uom_id,
  632.     amount, journal_date, type_rate,
  633.     numerator_rate, denominator_rate, journal_desc, remark)
  634.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  635.         A.doc_type_id, B.inventory_item_id,
  636.         A.partner_id, B.product_id, vEmptyId, vEmptyId,
  637.         vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  638.         f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), B.qty_realization, B.base_uom_id,
  639.         0 , A.doc_date, vTypeRate,
  640.         1, 1, 'HPP', B.remark
  641.     FROM in_inventory A, in_inventory_item B
  642.     WHERE A.inventory_id = vReturnNoteId AND
  643.         A.inventory_id = B.inventory_id;
  644. */     
  645. /*     
  646.     INSERT INTO tt_journal_trx_item
  647.     (session_id, tenant_id, journal_trx_id, line_no,
  648.     ref_doc_type_id, ref_id, ou_id, sub_ou_id,
  649.     partner_id, product_id, cashbank_id, ou_rc_id,
  650.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  651.     coa_id, curr_code, qty, uom_id,
  652.     amount, journal_date, type_rate,
  653.     numerator_rate, denominator_rate, journal_desc, remark)
  654.     SELECT pSessionId, A.tenant_id, B.journal_trx_id, 1,
  655.         A.doc_type_id, A.inventory_item_id, B.ou_id, B.sub_ou_id,
  656.         vEmptyId, C.product_id, vEmptyId, vEmptyId,
  657.         vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  658.         f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), A.curr_code, A.qty_return, A.base_uom_id,
  659.         f_get_amount_before_tax((A.qty_return * A.qty_so * A.price) / A.qty_int_so, A.flg_tax_amount, A.tax_percentage,0),
  660.         A.doc_date, vTypeRate,
  661.         1, 1, 'HPP', A.remark
  662.     FROM tt_in_so_balance_item A, gl_journal_trx B, in_inventory_item C
  663.     WHERE A.session_id = pSessionId AND
  664.         B.journal_trx_id = vJournalTrxId AND
  665.         A.inventory_item_id = C.inventory_item_id;
  666.  
  667.     INSERT INTO gl_journal_trx_mapping
  668.     (tenant_id, journal_trx_id, line_no,
  669.     ref_doc_type_id, ref_id,
  670.     partner_id, product_id, cashbank_id, ou_rc_id,
  671.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  672.     coa_id, curr_code, qty, uom_id,
  673.     amount, journal_date, type_rate,
  674.     numerator_rate, denominator_rate, journal_desc, remark,
  675.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  676.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  677.         A.ref_doc_type_id, A.ref_id,
  678.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  679.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  680.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  681.         A.amount, A.journal_date, A.type_rate,
  682.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  683.         0, vDatetime, vUserId, vDatetime, vUserId
  684.     FROM tt_journal_trx_item A
  685.     WHERE A.session_id = pSessionId AND
  686.         A.journal_desc = 'HPP';
  687.                
  688. */
  689.     INSERT INTO gl_journal_trx_item
  690.     (tenant_id, journal_trx_id, line_no,
  691.     ref_doc_type_id, ref_id,
  692.     partner_id, product_id, cashbank_id, ou_rc_id,
  693.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  694.     coa_id, curr_code, qty, uom_id,
  695.     amount, journal_date, type_rate,
  696.     numerator_rate, denominator_rate, journal_desc, remark,
  697.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  698.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  699.         A.ref_doc_type_id, A.ref_id,
  700.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  701.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  702.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  703.         A.amount, A.journal_date, A.type_rate,
  704.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  705.         0, vDatetime, vUserId, vDatetime, vUserId
  706.     FROM tt_journal_trx_item A
  707.     WHERE A.session_id = pSessionId AND
  708.         A.journal_desc = 'PRODUCT_STOCK';
  709.        
  710.     INSERT INTO gl_journal_trx_mapping
  711.     (tenant_id, journal_trx_id, line_no,
  712.     ref_doc_type_id, ref_id,
  713.     partner_id, product_id, cashbank_id, ou_rc_id,
  714.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  715.     coa_id, curr_code, qty, uom_id,
  716.     amount, journal_date, type_rate,
  717.     numerator_rate, denominator_rate, journal_desc, remark,
  718.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  719.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  720.         vEmptyId, vEmptyId,
  721.         vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  722.         vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  723.         f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), 0, vEmptyId,
  724.         0, A.journal_date, A.type_rate,
  725.         1, 1, 'COGS', vEmptyValue,
  726.         0, vDatetime, vUserId, vDatetime, vUserId
  727.     FROM tt_journal_trx_item A
  728.     WHERE A.session_id = pSessionId
  729.     GROUP BY A.tenant_id, A.journal_trx_id, A.journal_date, A.type_rate;
  730.  
  731.     -- DELETE table temporary
  732.     DELETE FROM tt_in_product_balance_summary_stock WHERE session_id = pSessionId;
  733.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;     
  734.     DELETE FROM tt_in_so_balance_item WHERE session_id = pSessionId;         
  735.     DELETE FROM tt_coin_detail_brand WHERE session_id = pSessionId;
  736.     DELETE FROM tt_coin_summary WHERE session_id = pSessionId;
  737. END;
  738. $BODY$
  739.   LANGUAGE plpgsql VOLATILE
  740.   COST 100;
  741. ALTER FUNCTION in_submit_return_note(bigint, character varying, character varying)
  742.   OWNER TO sts;
  743. GRANT EXECUTE ON FUNCTION in_submit_return_note(bigint, character varying, character varying) TO sts;
  744. GRANT EXECUTE ON FUNCTION in_submit_return_note(bigint, character varying, character varying) TO public;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement