congky

Untitled

Aug 25th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION sl_submit_mapping_invoice_to_promo_coin(bigint, character varying, character varying)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.  
  6.     pTenantId           ALIAS FOR $1;
  7.     pSessionId          ALIAS FOR $2;
  8.     pProcessNo          ALIAS FOR $3;
  9.  
  10.     vProcessId          bigint;
  11.     vMappingInvoiceId   bigint;
  12.     vUserId             bigint;
  13.     vRefNullValue       bigint := -99;
  14.     vZeroValue          bigint := 0;
  15.     vNolValue           numeric := 0;
  16.     vDatetime           character varying(14);
  17.     vYes                character varying(1) := 'Y';
  18.     vStatusRelease      character varying(1) := 'R';
  19.     vFlgPromoCoin       character varying(1) := 'P';
  20.     vFlgSubPromoCoin    character varying(1) := 'S';
  21.     vFlgBonusCoin       character varying(1) := 'L';
  22.     vEmptyValue         character varying := '';
  23.     vDocTypeMappingInvoiceToPromoCoin       bigint := 374;
  24.    
  25. BEGIN
  26.    
  27.     SELECT A.process_message_id INTO vProcessId
  28.     FROM t_process_message A
  29.     WHERE A.tenant_id = pTenantId AND
  30.         A.process_name = 'sl_submit_mapping_invoice_to_promo_coin' AND
  31.         A.process_no = pProcessNo;
  32.        
  33.     SELECT CAST(A.process_parameter_value AS bigint) INTO vMappingInvoiceId
  34.     FROM t_process_parameter A
  35.     WHERE A.process_message_id = vProcessId AND
  36.         A.process_parameter_key = 'mappingInvoiceId';
  37.    
  38.     SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  39.     FROM t_process_parameter A
  40.     WHERE A.process_message_id = vProcessId AND
  41.         A.process_parameter_key = 'userId';
  42.  
  43.     SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  44.     FROM t_process_parameter A
  45.     WHERE A.process_message_id = vProcessId AND
  46.         A.process_parameter_key = 'datetime';
  47.    
  48.     -- Mengurangi saldo koin di balance yang sebelum nya di tambah saat membuat data penjualan dengan
  49.     -- informasi promo, sub promo, dan launching lama
  50.     WITH data_for_update_balance_coin AS (
  51.         SELECT A.tenant_id, A.partner_id, A.promo_id, -1*SUM(A.coin_promo) AS coin_promo, -1*SUM(A.coin_sub_promo) AS coin_sub_promo, -1*SUM(A.coin_launching) AS coin_launching
  52.         FROM sl_log_coin_promo_balance A
  53.         INNER JOIN sl_mapping_invoice_promo_coin_item B ON A.so_id = B.so_id
  54.         WHERE B.mapping_invoice_promo_coin_id = vMappingInvoiceId
  55.         GROUP BY A.tenant_id, A.partner_id, A.promo_id
  56.     )
  57.     UPDATE sl_coin_promo_balance A SET
  58.         coin_promo = A.coin_promo + B.coin_promo ,
  59.         coin_sub_promo = A.coin_sub_promo + B.coin_sub_promo ,
  60.         coin_launching = A.coin_launching + B.coin_launching ,
  61.         coin_total = (A.coin_promo + B.coin_promo) + (A.coin_sub_promo + B.coin_sub_promo) + (A.coin_launching + B.coin_launching) + coin_adjustment + coin_periodic_adjustment,
  62.         update_datetime = vDatetime,
  63.         update_user_id = vUserId,
  64.         version = version + 1
  65.     FROM data_for_update_balance_coin B
  66.     WHERE A.tenant_id = B.tenant_id
  67.     AND A.partner_id = B.partner_id
  68.     AND A.promo_id = B.promo_id;
  69.        
  70.     -- Membuat log saldo koin pengurangan koin di balance yang sebelum nya di tambah saat membuat data penjualan dengan
  71.     -- informasi promo, sub promo, dan launching lama
  72.     INSERT INTO sl_log_coin_promo_balance(
  73.             tenant_id, partner_id, so_id, ref_id,
  74.             ref_doc_type_id, promo_id, flg_promo_coin, sub_promo_id, flg_sub_promo_coin,
  75.             product_launching_id, flg_launching_coin, brand_id, group_brand,
  76.             salesman_id, qty, coin_promo, coin_sub_promo, coin_launching,
  77.             coin_adjustment, coin_periodic_adjustment, create_datetime, create_user_id,
  78.             update_datetime, update_user_id, version)
  79.     SELECT A.tenant_id, A.partner_id, A.so_id, vMappingInvoiceId,
  80.             vDocTypeMappingInvoiceToPromoCoin, B.promo_id, B.flg_promo_coin, B.sub_promo_id, B.flg_sub_promo_coin,
  81.             B.product_launching_id, B.flg_launching_coin, vRefNullValue, vEmptyValue,
  82.             A.salesman_id, vNolValue, -1*SUM(A.coin_promo) AS coin_promo, -1*SUM(A.coin_sub_promo) AS coin_sub_promo, -1*SUM(A.coin_launching) AS coin_launching,
  83.             vNolValue, vNolValue, vDatetime, vUserId,
  84.             vDatetime, vUserId, vZeroValue
  85.     FROM sl_log_coin_promo_balance A
  86.     INNER JOIN sl_mapping_invoice_promo_coin_item B ON A.so_id = B.so_id
  87.     WHERE B.mapping_invoice_promo_coin_id = vMappingInvoiceId
  88.     GROUP BY A.tenant_id, A.partner_id, A.so_id, B.promo_id, B.flg_promo_coin,
  89.     B.sub_promo_id, B.flg_sub_promo_coin, B.product_launching_id, B.flg_launching_coin, A.salesman_id;
  90.    
  91.    
  92.     -- Menambah saldo koin dengan promo, sub promo, dan launching baru.
  93.     /**
  94.      * Selalu mendapat koin dari promo jika :
  95.      * 1. jika memilih launching => launching coin L dan promo coin Y atau launching coin P
  96.      * 2. jika memilih sub promo => sub promo coin S dan promo coin Y atau sub promo coin P
  97.      * 3. jika tidak memilih launching dan sub promo => promo coin Y
  98.      *
  99.      * Hanya mendapat koin dari sub promo jika :
  100.      * 1. jika memilih sub promo => sub promo coin S, dan promo coin N
  101.      *
  102.      * Hanya mendapat koin dari Launching jika :
  103.      * 1. jika memilih launching => launching coin L, dan promo coin N
  104.      *
  105.      */
  106.     WITH data_so_with_qty_brand AS (
  107.         SELECT A.mapping_invoice_promo_coin_id, A.so_id,
  108.         f_get_brand_by_product_id(B.product_id) brand_id, SUM(C.qty_dlv_int - C.qty_return_int - C.qty_cancel_int + C.qty_add_int) qty_brand
  109.         FROM sl_mapping_invoice_promo_coin_item A
  110.         INNER JOIN sl_so_item B ON A.so_id = B.so_id
  111.         INNER JOIN sl_so_balance_item C ON B.so_item_id = C.so_item_id
  112.         WHERE A.mapping_invoice_promo_coin_id = vMappingInvoiceId
  113.         GROUP BY A.mapping_invoice_promo_coin_id, A.so_id, brand_id
  114.     ), data_for_update_balance_coin AS (
  115.         SELECT B.tenant_id, A.partner_id, B.promo_id,
  116.         SUM(CASE WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgBonusCoin AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  117.             WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgPromoCoin) THEN C.qty_brand * D.coin
  118.             WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgSubPromoCoin AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  119.             WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgPromoCoin) THEN C.qty_brand * D.coin
  120.             WHEN (B.product_launching_id = vRefNullValue AND B.sub_promo_id = vRefNullValue AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  121.             ELSE 0
  122.         END)AS coin_promo,
  123.         SUM(CASE WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgSubPromoCoin) THEN C.qty_brand * E.coin
  124.             ELSE 0
  125.         END) AS coin_sub_promo,
  126.         SUM(CASE WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgPromoCoin) THEN C.qty_brand * F.coin
  127.             ELSE 0
  128.         END) AS coin_launching
  129.         FROM sl_mapping_invoice_promo_coin_item A
  130.         INNER JOIN sl_mapping_invoice_promo_coin B ON A.mapping_invoice_promo_coin_id = B.mapping_invoice_promo_coin_id
  131.         INNER JOIN sl_so BX ON A.so_id = BX.so_id
  132.         INNER JOIN data_so_with_qty_brand C ON A.mapping_invoice_promo_coin_id = C.mapping_invoice_promo_coin_id AND A.so_id = C.so_id
  133.         INNER JOIN m_brand_ext CX ON C.brand_id = CX.brand_id
  134.         INNER JOIN m_promo_item D ON B.promo_id = D.promo_id AND C.brand_id = D.brand_id
  135.         LEFT JOIN m_sub_promo_item E ON B.sub_promo_id = E.sub_promo_id AND C.brand_id = E.brand_id
  136.         LEFT JOIN m_promo_item F ON B.product_launching_id = D.promo_id AND C.brand_id = F.brand_id
  137.         GROUP BY B.tenant_id, A.partner_id, B.promo_id
  138.     )
  139.     UPDATE sl_coin_promo_balance A SET
  140.         coin_promo = A.coin_promo + B.coin_promo ,
  141.         coin_sub_promo = A.coin_sub_promo + B.coin_sub_promo ,
  142.         coin_launching = A.coin_launching + B.coin_launching ,
  143.         coin_total = (A.coin_promo + B.coin_promo) + (A.coin_sub_promo + B.coin_sub_promo) + (A.coin_launching + B.coin_launching) + coin_adjustment + coin_periodic_adjustment,
  144.         update_datetime = vDatetime,
  145.         update_user_id = vUserId,
  146.         version = version + 1
  147.     FROM data_for_update_balance_coin B
  148.     WHERE A.tenant_id = B.tenant_id
  149.     AND A.partner_id = B.partner_id
  150.     AND A.promo_id = B.promo_id;
  151.    
  152.     -- Membuat log saldo koin dengan promo, sub promo, dan launching baru.
  153.     WITH data_so_with_qty_brand AS (
  154.         SELECT A.mapping_invoice_promo_coin_id, A.so_id,
  155.             f_get_brand_by_product_id(B.product_id) brand_id, SUM(C.qty_dlv_int - C.qty_return_int - C.qty_cancel_int + C.qty_add_int) qty_brand
  156.         FROM sl_mapping_invoice_promo_coin_item A
  157.         INNER JOIN sl_so_item B ON A.so_id = B.so_id
  158.         INNER JOIN sl_so_balance_item C ON B.so_item_id = C.so_item_id
  159.         WHERE A.mapping_invoice_promo_coin_id = vMappingInvoiceId
  160.         GROUP BY A.mapping_invoice_promo_coin_id, A.so_id, brand_id
  161.     )
  162.     INSERT INTO sl_log_coin_promo_balance(
  163.         tenant_id, partner_id, so_id, ref_id,
  164.         ref_doc_type_id, promo_id, flg_promo_coin, sub_promo_id, flg_sub_promo_coin,
  165.         product_launching_id, flg_launching_coin, brand_id, group_brand,
  166.         salesman_id, qty, coin_promo, coin_sub_promo, coin_launching,
  167.         coin_adjustment, coin_periodic_adjustment, create_datetime, create_user_id,
  168.         update_datetime, update_user_id, version)
  169.    
  170.     SELECT B.tenant_id, A.partner_id, A.so_id, vMappingInvoiceId,
  171.             vDocTypeMappingInvoiceToPromoCoin, B.promo_id, B.flg_promo_coin, B.sub_promo_id, B.flg_sub_promo_coin,
  172.             B.product_launching_id, B.flg_launching_coin, C.brand_id, CX.group_brand,
  173.             BX.salesman_id, C.qty_brand,
  174.             CASE WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgBonusCoin AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  175.                 WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgPromoCoin) THEN C.qty_brand * D.coin
  176.                 WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgSubPromoCoin AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  177.                 WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgPromoCoin) THEN C.qty_brand * D.coin
  178.                 WHEN (B.product_launching_id = vRefNullValue AND B.sub_promo_id = vRefNullValue AND B.flg_promo_coin = vYes) THEN C.qty_brand * D.coin
  179.                 ELSE 0
  180.             END AS coin_promo,
  181.             CASE WHEN (B.sub_promo_id != vRefNullValue AND B.flg_sub_promo_coin =vFlgSubPromoCoin) THEN C.qty_brand * E.coin
  182.                 ELSE 0
  183.             END AS coin_sub_promo,
  184.             CASE WHEN (B.product_launching_id != vRefNullValue AND B.flg_launching_coin =vFlgPromoCoin) THEN C.qty_brand * F.coin
  185.                 ELSE 0
  186.             END AS coin_launching,
  187.             vNolValue, vNolValue, vDatetime, vUserId,
  188.             vDatetime, vUserId, vZeroValue
  189.     FROM sl_mapping_invoice_promo_coin_item A
  190.     INNER JOIN sl_mapping_invoice_promo_coin B ON A.mapping_invoice_promo_coin_id = B.mapping_invoice_promo_coin_id
  191.     INNER JOIN sl_so BX ON A.so_id = BX.so_id
  192.     INNER JOIN data_so_with_qty_brand C ON A.mapping_invoice_promo_coin_id = C.mapping_invoice_promo_coin_id AND A.so_id = C.so_id
  193.     INNER JOIN m_brand_ext CX ON C.brand_id = CX.brand_id
  194.     INNER JOIN m_promo_item D ON B.promo_id = D.promo_id AND C.brand_id = D.brand_id
  195.     LEFT JOIN m_sub_promo_item E ON B.sub_promo_id = E.sub_promo_id AND C.brand_id = E.brand_id
  196.     LEFT JOIN m_promo_item F ON B.product_launching_id = D.promo_id AND C.brand_id = F.brand_id;   
  197.    
  198.     -- Update status item balance menjadi R, sebelumnya di ubah menjadi M saat add dokumen
  199.     -- Update juga informasi promo, sub promo dan launching
  200.     UPDATE sl_invoice_balance_promo_coin A SET
  201.         promo_id = B.promo_id,
  202.         flg_promo_coin = B.flg_promo_coin,
  203.         sub_promo_id = B.sub_promo_id,
  204.         flg_sub_promo_coin = B.flg_sub_promo_coin,
  205.         product_launching_id = B.product_launching_id,
  206.         flg_launching_coin = B.flg_launching_coin,
  207.         status_item = vStatusRelease,
  208.         update_datetime = vDatetime,
  209.         update_user_id = vUserId,
  210.         version = A.version + 1
  211.     FROM sl_mapping_invoice_promo_coin B
  212.     INNER JOIN sl_mapping_invoice_promo_coin_item C ON B.mapping_invoice_promo_coin_id = C.mapping_invoice_promo_coin_id
  213.     WHERE A.invoice_id = C.ref_id
  214.     AND A.invoice_doc_type_id = C.ref_doc_type_id
  215.     AND B.mapping_invoice_promo_coin_id = vMappingInvoiceId;
  216.    
  217.     -- Update sl_so_info
  218.     UPDATE sl_so_info A SET
  219.         promo_id = B.promo_id,
  220.         flg_promo_coin = B.flg_promo_coin,
  221.         sub_promo_id = B.sub_promo_id,
  222.         flg_sub_promo_coin = B.flg_sub_promo_coin,
  223.         product_launching_id = B.product_launching_id,
  224.         flg_launching_coin = B.flg_launching_coin,
  225.         update_datetime = vDatetime,
  226.         update_user_id = vUserId,
  227.         version = A.version + 1
  228.     FROM sl_mapping_invoice_promo_coin B
  229.     INNER JOIN sl_mapping_invoice_promo_coin_item C ON B.mapping_invoice_promo_coin_id = C.mapping_invoice_promo_coin_id
  230.     WHERE A.so_id = C.so_id
  231.     AND B.mapping_invoice_promo_coin_id = vMappingInvoiceId;
  232.            
  233.     -- Update status doc dokumen menjadi R
  234.     UPDATE sl_mapping_invoice_promo_coin A SET
  235.         status_doc = vStatusRelease,
  236.         update_datetime = vDatetime,
  237.         update_user_id = vUserId,
  238.         version = A.version + 1
  239.     WHERE A.mapping_invoice_promo_coin_id = vMappingInvoiceId;
  240.    
  241. END
  242. $BODY$
  243.   LANGUAGE plpgsql VOLATILE
  244.   COST 100;
  245. /
Advertisement
Add Comment
Please, Sign In to add comment