Advertisement
aadddrr

sv_submit_product_usage_for_service

Nov 17th, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Function: sv_submit_product_usage_for_service(bigint, character varying, character varying)
  2.  
  3. -- DROP FUNCTION sv_submit_product_usage_for_service(bigint, character varying, character varying);
  4.  
  5. CREATE OR REPLACE FUNCTION sv_submit_product_usage_for_service(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.     vProductUsageId             bigint;
  15.     vUserId                     bigint;
  16.     vDatetime                   character varying(14);
  17.     vEmptyId                    bigint := -99;
  18.     vJournalTrxId               bigint := -99;
  19.     vOne                        numeric := 1;
  20.     vEmptyValue                 character varying := '';
  21.     vOuId                       bigint;
  22.     vOuWarehouseId              bigint;
  23.     vOuStructureJournalItem     OU_BU_STRUCTURE%ROWTYPE;
  24.    
  25.     vDocJournal                 DOC_JOURNAL%ROWTYPE;
  26.     vOuStructure                OU_BU_STRUCTURE%ROWTYPE;
  27.     result                      RECORD;
  28.     vProductUsageDocNo          character varying(100);
  29.     vProductUsageDocDate        character varying(8);
  30.     vReason                     character varying(1);
  31.     vReasonKanibal              character varying := 'K';
  32.     vReasonReplacement          character varying := 'R';
  33.     vSignCredit                 character varying := 'K';
  34.     vSignDebit                  character varying := 'D';
  35.     vYes                        character varying := 'Y';
  36.     vStatusDraft                character varying := 'D';
  37.     vStatusRelease              character varying := 'R';
  38.     vProductCOA                 character varying := 'PRODUCT';
  39.     vTypeRate                   character varying := 'COM';
  40.     vActivityCOA                character varying := 'ACTIVITY';
  41.     vWarehouseReplacementId     bigint;
  42.     vQtyPlusOne                 numeric := 1;
  43.     vQtyMinusOne                numeric := -1;
  44. BEGIN
  45.     SELECT A.process_message_id INTO vProcessId
  46.     FROM t_process_message A
  47.     WHERE A.tenant_id = pTenantId AND
  48.         A.process_name = 'sv_submit_product_usage_for_service' AND
  49.         A.process_no = pProcessNo;
  50.        
  51.     SELECT CAST(A.process_parameter_value AS bigint) INTO vProductUsageId
  52.     FROM t_process_parameter A
  53.     WHERE A.process_message_id = vProcessId AND
  54.         A.process_parameter_key = 'productUsageId';
  55.    
  56.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  57.     FROM t_process_parameter A
  58.     WHERE A.process_message_id = vProcessId AND
  59.         A.process_parameter_key = 'userId';
  60.  
  61.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  62.     FROM t_process_parameter A
  63.     WHERE A.process_message_id = vProcessId AND
  64.         A.process_parameter_key = 'datetime';
  65.    
  66.     DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  67.    
  68.     SELECT f_get_ou_bu_structure(A.ou_from_id) AS ou, f_get_document_journal(A.doc_type_id) as doc, A.doc_no, A.doc_date, A.reason,
  69.             B.warehouse_id
  70.     FROM sv_product_usage A
  71.     INNER JOIN sv_product_usage_item B ON A.tenant_id = B.tenant_id AND A.product_usage_id = B.product_usage_id
  72.     WHERE A.product_usage_id = vProductUsageId INTO result;
  73.    
  74.     vOuStructure := result.ou;
  75.     vDocJournal := result.doc;
  76.     vProductUsageDocNo := result.doc_no;
  77.     vProductUsageDocDate := result.doc_date;
  78.     vReason := result.reason;
  79.     vWarehouseReplacementId := result.warehouse_id;
  80.    
  81.     RAISE NOTICE 'results : %',result;
  82.    
  83.     UPDATE sv_product_usage SET status_doc = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  84.     WHERE product_usage_id = vProductUsageId;
  85.  
  86.     SELECT A.ou_from_id, C.ou_id INTO vOuId, vOuWarehouseId
  87.     FROM sv_product_usage A
  88.     INNER JOIN sv_product_usage_item B ON A.tenant_id = B.tenant_id AND A.product_usage_id = B.product_usage_id
  89.     INNER JOIN m_warehouse_ou C ON B.warehouse_id = C.warehouse_id
  90.     WHERE A.product_usage_id = vProductUsageId;
  91.    
  92.     IF (vOuId <> vOuWarehouseId) THEN
  93.         SELECT f_get_ou_bu_structure(vOuWarehouseId) as ou_structure INTO result;
  94.         vOuStructureJournalItem := result.ou_structure;
  95.     ELSE
  96.         vOuStructureJournalItem := ROW(-99, -99, -99);
  97.     END IF;
  98.    
  99.    
  100.     --replacement
  101.     -- plus barang masuk bekas/rusak in_product_balance_stock
  102.     -- tulis log product balance stock
  103.     -- update serial number current yang ada di balance rma + log --
  104.    
  105. --  IF vReason = vReasonReplacement THEN
  106. --      RAISE NOTICE 'REPLACEMENT';
  107. --     
  108.     UPDATE in_product_balance_stock
  109.     SET qty = in_product_balance_stock.qty + 1,
  110.         update_datetime = vDatetime, update_user_id = vUserId, version = in_product_balance_stock.version + 1
  111.     FROM sv_product_usage A
  112.     INNER JOIN in_product_balance B ON A.tenant_id = B.tenant_id AND A.serial_number_service = B.serial_number
  113.     WHERE in_product_balance_stock.tenant_id = A.tenant_id
  114.         AND in_product_balance_stock.product_balance_id = B.product_balance_id
  115.         AND in_product_balance_stock.warehouse_id = A.warehouse_from_id
  116.         AND A.product_usage_id = vProductUsageId;
  117.    
  118.     INSERT INTO in_product_balance_stock
  119.     (tenant_id, warehouse_id, product_id, product_balance_id, product_status, base_uom_id, qty,
  120.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  121.     SELECT A.tenant_id, A.warehouse_from_id, B.product_id, B.product_balance_id, A.product_status, C.base_uom_id, vOne,
  122.             0, vDatetime, vUserId, vDatetime, vUserId
  123.     FROM sv_product_usage A
  124.     INNER JOIN in_product_balance B ON A.tenant_id = B.tenant_id AND A.serial_number_service = B.serial_number
  125.     INNER JOIN m_product C ON B.product_id = C.product_id
  126.     WHERE A.product_usage_id = vProductUsageId AND
  127.         NOT EXISTS (SELECT 1 FROM in_product_balance_stock C
  128.                     WHERE C.tenant_id = A.tenant_id AND
  129.                         C.warehouse_id = A.warehouse_from_id AND
  130.                         C.product_id = B.product_id AND
  131.                         C.product_balance_id = B.product_balance_id AND
  132.                         C.product_status = A.product_status);
  133.    
  134.     INSERT INTO in_log_product_balance_stock(
  135.         tenant_id, ou_id, doc_type_id,
  136.         ref_id, doc_no, doc_date, partner_id, product_id, warehouse_id,
  137.         product_balance_id, product_status, base_uom_id, qty, version,
  138.         create_datetime, create_user_id, update_datetime, update_user_id)
  139.     SELECT A.tenant_id, B.ou_from_id, B.doc_type_id,
  140.         B.product_usage_id, B.doc_no, B.doc_date, B.partner_id, A.product_id, A.warehouse_id,
  141.         A.product_balance_id, A.product_status, A.base_uom_id, vOne, A.version,
  142.         vDatetime, vUserId, vDatetime, vUserId
  143.     FROM in_product_balance_stock A
  144.     INNER JOIN sv_product_usage B ON A.tenant_id = B.tenant_id  AND A.product_status = B.product_status
  145.     INNER JOIN in_product_balance C ON A.tenant_id = C.tenant_id AND B.serial_number_service = C.serial_number AND A.product_balance_id = C.product_balance_id
  146.     WHERE A.product_status = B.product_status
  147.         AND A.warehouse_id = B.warehouse_from_id
  148.         AND B.product_usage_id = vProductUsageId;
  149.    
  150.     --Adrian, Nov 17, 2017
  151.     --Insert in_log_product_balance_stock untuk product pengganti
  152.     INSERT INTO in_log_product_balance_stock(
  153.         tenant_id, ou_id, doc_type_id,
  154.         ref_id, doc_no, doc_date, partner_id, product_id, warehouse_id,
  155.         product_balance_id, product_status, base_uom_id, qty, version,
  156.         create_datetime, create_user_id, update_datetime, update_user_id)
  157.     SELECT B.tenant_id, A.ou_from_id, A.doc_type_id,
  158.         B.product_usage_id, A.doc_no, A.doc_date, A.partner_id, B.product_id, B.warehouse_id,
  159.         B.product_balance_id, B.product_status, B.base_uom_id, -1 * vOne, B.version,
  160.         vDatetime, vUserId, vDatetime, vUserId
  161.     FROM sv_product_usage A
  162.     INNER JOIN sv_product_usage_item B ON A.product_usage_id = B.product_usage_id
  163.     INNER JOIN in_product_balance C ON B.product_balance_id = C.product_balance_id
  164.     INNER JOIN in_product_balance_stock D ON B.tenant_id = D.tenant_id
  165.         AND D.warehouse_id = A.warehouse_from_id
  166.         AND B.product_id = D.product_id
  167.         AND C.product_balance_id = D.product_balance_id
  168.         AND B.product_status = D.product_status
  169.     WHERE B.product_usage_id = vProductUsageId;
  170.    
  171.     UPDATE sv_product_warranty_balance
  172.     SET product_balance_current_id = B.product_balance_id,
  173.         product_current_id = B.product_id,
  174.         flg_substitute = vYes,
  175.         version = sv_product_warranty_balance.version + 1,
  176.         update_user_id = vUserId,
  177.         update_datetime = vDatetime
  178.     FROM sv_product_usage A
  179.     INNER JOIN sv_product_usage_item B ON A.tenant_id = B.tenant_id AND A.product_usage_id = B.product_usage_id
  180.     INNER JOIN in_product_balance C ON A.tenant_id = C.tenant_id AND A.serial_number_service = C.serial_number
  181.     WHERE A.product_usage_id = vProductUsageId
  182.         AND sv_product_warranty_balance.invoice_id = A.ref_id
  183.         AND sv_product_warranty_balance.product_current_id = A.product_service_id
  184.         AND sv_product_warranty_balance.product_balance_current_id = C.product_balance_id;
  185.        
  186.     INSERT INTO sv_log_product_warranty_balance(
  187.         product_warranty_balance_id, tenant_id, ou_id, product_id, product_balance_id,
  188.         qty, product_current_id, product_balance_current_id, flg_substitute,
  189.         invoice_id, invoice_doc_no, invoice_doc_date, do_item_id, do_doc_no,
  190.         do_doc_date, partner_id, partner_cp_id, partner_bill_to_id, partner_ship_to_id,
  191.         partner_ship_address_id, flg_replacement, status_item, version,
  192.         create_datetime, create_user_id, update_datetime, update_user_id)
  193.     SELECT A.product_warranty_balance_id, A.tenant_id, A.ou_id, A.product_id, A.product_balance_id,
  194.             A.qty, A.product_current_id, A.product_balance_current_id, A.flg_substitute,
  195.             A.invoice_id, A.invoice_doc_no, A.invoice_doc_date, A.do_item_id, A.do_doc_no,
  196.             A.do_doc_date, A.partner_id, A.partner_cp_id, A.partner_bill_to_id, A.partner_ship_to_id,
  197.             A. partner_ship_address_id, A.flg_replacement, A.status_item, A.version,
  198.             vDatetime, vUserId, vDatetime, vUserId
  199.     FROM sv_product_warranty_balance A
  200.     INNER JOIN sv_product_usage B ON A.invoice_id = B.ref_id
  201.                                     AND A.tenant_id = B.tenant_id
  202.                                     AND A.ou_id = B.ou_from_id
  203.                                     AND A.product_current_id = B.product_service_id
  204.     INNER JOIN sv_product_usage_item C ON B.tenant_id = C.tenant_id
  205.                                     AND B.product_usage_id = C.product_usage_id
  206.                                     AND A.product_balance_current_id = C.product_balance_id
  207.     WHERE B.product_usage_id = vProductUsageId;
  208.        
  209. --  END IF;
  210. -- 
  211.     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)
  212.     FROM sv_product_usage A
  213.     WHERE A.product_usage_id = vProductUsageId;
  214.    
  215.     SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  216.    
  217.     INSERT INTO gl_journal_trx
  218.     (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  219.     ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,  
  220.     ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  221.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  222.     SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.product_usage_id, A.doc_no, A.doc_date,
  223.         (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, A.partner_id, vEmptyId, vEmptyId, A.ext_doc_no, A.ext_doc_date,
  224.         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',
  225.         0, vDatetime, vUserId, vDatetime, vUserId
  226.     FROM sv_product_usage A
  227.     WHERE A.product_usage_id = vProductUsageId;
  228.    
  229.     -- product yang didapat dari customer dari service
  230.     INSERT INTO tt_journal_trx_item
  231.     (session_id, tenant_id, journal_trx_id, line_no,
  232.     ref_doc_type_id, ref_id,
  233.     partner_id, product_id, cashbank_id, ou_rc_id,
  234.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  235.     coa_id, curr_code, qty, uom_id,
  236.     amount, journal_date, type_rate,
  237.     numerator_rate, denominator_rate, journal_desc, remark)
  238.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  239.         A.doc_type_id, A.product_usage_id,
  240.         A.partner_id, A.product_service_id, vEmptyId, vEmptyId,
  241.         vEmptyId, vSignDebit, vProductCOA, vEmptyId,
  242.         f_get_product_coa_group_product(A.tenant_id, A.product_service_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), vQtyPlusOne, B.base_uom_id,
  243.         0 , A.doc_date, vTypeRate,
  244.         1, 1, 'PRODUCT_STOCK', A.remark
  245.     FROM sv_product_usage A
  246.     INNER JOIN m_product B ON A.tenant_id = B.tenant_id AND A.product_service_id = B.product_id
  247.     WHERE A.product_usage_id = vProductUsageId;
  248.    
  249.     -- product yang dikeluarkan dari stock untuk service
  250.     INSERT INTO tt_journal_trx_item
  251.     (session_id, tenant_id, journal_trx_id, line_no,
  252.     ref_doc_type_id, ref_id,
  253.     partner_id, product_id, cashbank_id, ou_rc_id,
  254.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  255.     coa_id, curr_code, qty, uom_id,
  256.     amount, journal_date, type_rate,
  257.     numerator_rate, denominator_rate, journal_desc, remark)
  258.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  259.         A.doc_type_id, B.product_usage_item_id,
  260.         A.partner_id, B.product_id, vEmptyId, vEmptyId,
  261.         vEmptyId, vSignCredit, vProductCOA, vEmptyId,
  262.         f_get_product_coa_group_product(A.tenant_id, B.product_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), ABS(vQtyPlusOne), C.base_uom_id,
  263.         0 , A.doc_date, vTypeRate,
  264.         1, 1, 'PRODUCT_STOCK', B.remark
  265.     FROM sv_product_usage A
  266.     INNER JOIN sv_product_usage_item B ON A.tenant_id = B.tenant_id AND A.product_usage_id = B.product_usage_id
  267.     INNER JOIN m_product C ON B.tenant_id = C.tenant_id AND B.product_id = C.product_id
  268.     WHERE A.product_usage_id = vProductUsageId;
  269.  
  270.     INSERT INTO tt_journal_trx_item
  271.     (session_id, tenant_id, journal_trx_id, line_no,
  272.     ref_doc_type_id, ref_id,
  273.     partner_id, product_id, cashbank_id, ou_rc_id,
  274.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  275.     coa_id, curr_code, qty, uom_id,
  276.     amount, journal_date, type_rate,
  277.     numerator_rate, denominator_rate, journal_desc, remark)
  278.     SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  279.         vEmptyId, vEmptyId,
  280.         vEmptyId, vEmptyId, vEmptyId, A.ou_rc_id,
  281.         A.segment_id, vSignCredit, vActivityCOA, A.activity_gl_id,
  282.         D.coa_id, f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), 0, vEmptyId,
  283.         0 , A.doc_date, vTypeRate,
  284.         1, 1, 'ADJUSMENT_STOCK', vEmptyValue
  285.     FROM sv_product_usage A, m_activity_gl D
  286.     WHERE A.product_usage_id = vProductUsageId AND
  287.         A.activity_gl_id = D.activity_gl_id;
  288.        
  289.     INSERT INTO gl_journal_trx_item
  290.     (tenant_id, journal_trx_id, line_no,
  291.     ref_doc_type_id, ref_id,
  292.     partner_id, product_id, cashbank_id, ou_rc_id,
  293.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  294.     coa_id, curr_code, qty, uom_id,
  295.     amount, journal_date, type_rate,
  296.     numerator_rate, denominator_rate, journal_desc, remark,
  297.     "version", create_datetime, create_user_id, update_datetime, update_user_id,
  298.     ou_branch_id, ou_sub_bu_id)
  299.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  300.         A.ref_doc_type_id, A.ref_id,
  301.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  302.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  303.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  304.         A.amount, A.journal_date, A.type_rate,
  305.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  306.         0, vDatetime, vUserId, vDatetime, vUserId,
  307.         (vOuStructureJournalItem).ou_branch_id, (vOuStructureJournalItem).ou_sub_bu_id
  308.     FROM tt_journal_trx_item A
  309.     WHERE A.session_id = pSessionId AND
  310.         A.journal_desc = 'PRODUCT_STOCK';
  311.        
  312.     INSERT INTO gl_journal_trx_mapping
  313.     (tenant_id, journal_trx_id, line_no,
  314.     ref_doc_type_id, ref_id,
  315.     partner_id, product_id, cashbank_id, ou_rc_id,
  316.     segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  317.     coa_id, curr_code, qty, uom_id,
  318.     amount, journal_date, type_rate,
  319.     numerator_rate, denominator_rate, journal_desc, remark,
  320.     "version", create_datetime, create_user_id, update_datetime, update_user_id)
  321.     SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  322.         A.ref_doc_type_id, A.ref_id,
  323.         A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  324.         A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  325.         A.coa_id, A.curr_code, A.qty, A.uom_id,
  326.         A.amount, A.journal_date, A.type_rate,
  327.         A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  328.         0, vDatetime, vUserId, vDatetime, vUserId
  329.     FROM tt_journal_trx_item A
  330.     WHERE A.session_id = pSessionId AND
  331.         A.journal_desc = 'ADJUSMENT_STOCK';
  332.  
  333. --  DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  334. END;   
  335. $BODY$
  336.   LANGUAGE plpgsql VOLATILE
  337.   COST 100;
  338. ALTER FUNCTION sv_submit_product_usage_for_service(bigint, character varying, character varying)
  339.   OWNER TO postgres;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement