Advertisement
aadddrr

insert insert

Mar 7th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_sls_commission_for_igs(character varying, bigint, bigint, bigint, character varying, bigint, bigint, bigint, character varying, character varying, bigint, bigint, bigint)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader              REFCURSOR := 'refHeader';
  6.     pRefDetail              REFCURSOR := 'refDetail';
  7.     pSessionId              ALIAS FOR $1;
  8.     pTenantId               ALIAS FOR $2;
  9.     pUserId                 ALIAS FOR $3;
  10.     pRoleId                 ALIAS FOR $4;
  11.     pDatetime               ALIAS FOR $5;
  12.     pOuId                   ALIAS FOR $6;
  13.     pSalesId                ALIAS FOR $7;
  14.     pYear                   ALIAS FOR $8;
  15.     pQuarterCode            ALIAS FOR $9;
  16.     pLineOfBusinessCode     ALIAS FOR $10;
  17.     pBrandId                ALIAS FOR $11;
  18.     pCtgrProductId          ALIAS FOR $12;
  19.     pSubCtgrProductId       ALIAS FOR $13;
  20.    
  21.     result                      RECORD;
  22.     vMonthFrom                  character varying(4);
  23.     vMonthTo                    character varying(4);
  24.     vDateFrom                   character varying(8);
  25.     vDateTo                     character varying(8);
  26.     vMainCoaExtCommission       character varying(10);
  27.     vSubCoaExtCommission        character varying(10);
  28.     vCurrGL                     character varying(5);
  29.     vOneMonthAfterDateTo        character varying(6);
  30.     vOneMonthBeforeDateTo       character varying(6);
  31.     vOneMonthBeforeDateFrom     character varying(6);
  32.     vComboId                    character varying := 'DIGITCURRENCY';
  33.     vCurrCodeUSD                character varying := 'USD';
  34.     vCurrCodeIDR                character varying := 'IDR';
  35.     vRoundingDigitUSD           integer;
  36.     vRoundingDigitIDR           integer;
  37.     vEmptyId                    bigint := -99;
  38.     vNol                        numeric := 0;
  39.     vOne                        numeric := 1;
  40.     vDefault                    character varying := 'DEFAULT';
  41.     vEmptyString                character varying := '';
  42.     vSpace                      character varying := ' ';
  43.    
  44.     vNo                         character varying := 'N';
  45.     vYes                        character varying := 'Y';
  46.     vStatusDocDraft             character varying := 'D';
  47.     vStatusDocRelease           character varying := 'R';
  48.     vGroupSegmentOthers         character varying := 'OTHERS';
  49.     vGroupSegmentSo             character varying := 'SO';
  50.     vTypeExcRateCom             character varying := 'COM';
  51.     vTypeExcRateTax             character varying := 'TAX';
  52.     vDocTypeSalesInvoice        bigint := 321;
  53.     vDocTypeReturnSalesInvoice  bigint := 331;
  54.     vDocTypeRg                  bigint := 111;
  55.     vPrevClosingYearMonth       character varying(6);
  56.    
  57.    
  58.     vCoaIdExtCommission         bigint;
  59.     vTwoMonthsFromDateTo        character varying(6);
  60. BEGIN
  61.     /*
  62.      * ambil nilai date from dan date to
  63.      * ambil nilai pembulatan
  64.      * ambil nilai valuta buku
  65.      * ambil coa id
  66.      * ambil 1 bulan setelah date to dan 1 bulan sebelum date from
  67.      * delete fi_temp_summary_monthly_ar date_year_month des-apr
  68.      * insert dari fi_summary_monthly_ar
  69.      * ambil bulan terakhir tutup bulan
  70.      * menjalankan function tutup bulan sementara
  71.      * ambil data hasil tutup bulan sementara dan join ke tabel so (invoice yg pelunasannya sampe sebulan setelahnya)
  72.      * ambil data yg doc_datenya sebulan sebelum dateFrom dan pelunasannya sebulan sebelum dateTo
  73.      * update nilai price_idr
  74.      * update table temporary for numerator_rate, denominator_rate, price_idr
  75.      * update item_amount menjadi IDR
  76.      * ambil others cost
  77.      * update table cost tr_data_so_sales_for_commission non ext commission
  78.      * update table cost tr_data_so_sales_for_commission ext commission
  79.      */
  80.    
  81.     DELETE FROM tr_data_so_sales_commission_for_igs WHERE session_id = pSessionId;
  82.    
  83.     --ambil nilai dateFrom dan dateTo
  84.     SELECT month_from, month_to
  85.     FROM dt_period_quarter
  86.     WHERE quarter = pQuarterCode INTO result;
  87.     vMonthFrom := result.month_from;
  88.     vMonthTo := result.month_to;
  89.    
  90.     vDateFrom := pYear || vMonthFrom;
  91.     vDateTo := pYear || vMonthTo;
  92.    
  93.     /* ambil nilai pembulatan*/
  94.     vRoundingDigitUSD := CAST(f_get_digit_decimal_currency(vComboId,vCurrCodeUSD) AS integer);
  95.     vRoundingDigitIDR := CAST(f_get_digit_decimal_currency(vComboId,vCurrCodeIDR) AS integer);
  96.    
  97.     /* ambil valuta buku */
  98.     vCurrGL := f_get_value_system_config_by_param_code(pTenantId,'ValutaBuku');
  99.    
  100.     /* ambil coa id */
  101.     vMainCoaExtCommission := f_get_value_system_config_by_param_code(pTenantId,'MainCoaExtCommission');
  102.     vSubCoaExtCommission := f_get_value_system_config_by_param_code(pTenantId,'SubCoaExtCommission');
  103.    
  104.     SELECT coa_id INTO vCoaIdExtCommission
  105.     FROM m_coa
  106.     WHERE main_acc = vMainCoaExtCommission
  107.         AND sub_acc = vSubCoaExtCommission;
  108.        
  109.     /* ambil 1 bulan setelah date to dan 1 bulan sebelum date from*/
  110.     SELECT TO_CHAR(TO_DATE(vDateTo,'YYYYMMDD') + interval '1 Month','YYYYMM') INTO vOneMonthAfterDateTo;
  111.     SELECT TO_CHAR(TO_DATE(vDateTo,'YYYYMMDD') - interval '1 Month','YYYYMM') INTO vOneMonthBeforeDateTo;
  112.     SELECT TO_CHAR(TO_DATE(vDateFrom,'YYYYMMDD') - interval '1 Month','YYYYMM') INTO vOneMonthBeforeDateFrom;
  113.    
  114.     -- delete fi_temp_summary_monthly_ar
  115.     DELETE FROM fi_temp_summary_monthly_ar
  116.     WHERE date_year_month BETWEEN vOneMonthBeforeDateFrom AND vOneMonthAfterDateTo;
  117.    
  118.     --insert dari fi_summary_monthly_ar
  119.     INSERT INTO fi_temp_summary_monthly_ar(date_year_month, tenant_id, ou_id, doc_type_id, invoice_id,
  120.         invoice_amount, balance_amount, payment_amount, curr_code, version,
  121.         create_datetime, create_user_id, update_datetime, update_user_id)
  122.     SELECT A.date_year_month, A.tenant_id, A.ou_id, A.doc_type_id, A.invoice_id,
  123.         A.invoice_amount, A.balance_amount, A.payment_amount, A.curr_code, vNol,
  124.         pDatetime, pUserId, pDatetime, pUserId
  125.     FROM fi_summary_monthly_ar A
  126.     INNER JOIN m_ou_structure B ON A.ou_id = B.ou_id
  127.     WHERE A.date_year_month BETWEEN vOneMonthBeforeDateFrom AND vOneMonthAfterDateTo
  128.     AND B.ou_bu_id = pOuId;
  129.    
  130.     /* ambil bulan terakhir tutup bulan */
  131.     SELECT MAX(date_year_month) INTO vPrevClosingYearMonth
  132.     FROM m_admin_process_ledger
  133.     WHERE ou_id = pOuId
  134.         AND ledger_code = 'FIN.AR'
  135.         AND status_ledger = '1';
  136.        
  137.     /* menjalankan function tutup bulan sementara */
  138.     WHILE vPrevClosingYearMonth < vOneMonthAfterDateTo LOOP
  139.         SELECT TO_CHAR(TO_DATE(vPrevClosingYearMonth,'YYYYMM') + interval '1 Month','YYYYMM') INTO vPrevClosingYearMonth;
  140.         PERFORM fi_temp_summary_ar(pTenantId,pSessionId,pOuId,vPrevClosingYearMonth,pDatetime,pUserId);
  141.     END LOOP;
  142.    
  143.     --ambil data hasil tutup bulan sementara dan join ke tabel so (invoice yg pelunasannya sampe sebulan setelahnya)
  144.     WITH vw_fi_all_invoice_ar_for_commission AS (
  145.         SELECT A.invoice_ar_balance_id AS id, A.doc_type_id, A.invoice_ar_id
  146.         FROM fi_invoice_ar_balance A
  147.         INNER JOIN m_ou_structure C ON A.ou_id = C.ou_id
  148.         WHERE A.tenant_id = pTenantId
  149.         AND C.ou_bu_id = pOuId
  150.        
  151.         UNION ALL
  152.        
  153.         SELECT a.invoice_tax_ar_balance_id AS id, a.doc_type_id, b.invoice_ar_id
  154.         FROM fi_invoice_tax_ar_balance a
  155.         INNER JOIN fi_invoice_ar_balance b on a.invoice_ar_balance_id = b.invoice_ar_balance_id
  156.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  157.         AND A.tenant_id = pTenantId
  158.         AND D.ou_bu_id = pOuId
  159.     )
  160.     --ambil data hasil tutup bulan sementara dan join ke tabel so (invoice yg pelunasannya sampe sebulan setelahnya)
  161.     INSERT INTO tr_data_so_sales_commission_for_igs(
  162.             session_id, tenant_id, date_year_month, invoice_id, doc_type_id,
  163.             inv_curr_code, inv_doc_no, inv_doc_date, ou_id, so_id,
  164.             so_doc_no, so_doc_date, do_id, do_item_id, original_total_amount,
  165.             so_item_id, product_id, qty_dlv_int, base_uom_id, partner_id,
  166.             salesman_id, brand_id, line_of_business, numerator_rate, denominator_rate,
  167.             original_price, total_amount_idr, total_amount_usd, other_costs, other_costs_idr,
  168.             other_costs_usd, other_costs_curr_code, other_cost_ext_commission, warranty_sell_amount)
  169.     SELECT pSessionId, pTenantId, ' ', A.invoice_id, A.doc_type_id,
  170.         A.curr_code, B.doc_no, B.doc_date, A.ou_id, B.ref_id,
  171.         G.doc_no, G.doc_date, C.ref_id, C.ref_item_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN -1 * SUM(C.ref_item_amount) ELSE SUM(C.ref_item_amount) END,
  172.         F.so_item_id, F.product_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN SUM(-1*(F.qty_int * D.qty_dlv_so)/F.qty_so) ELSE SUM((F.qty_int * D.qty_dlv_so)/F.qty_so) END, F.base_uom_id, G.partner_id,
  173.         G.salesman_id, I.brand_id, J.line_of_business, vOne, vOne,
  174.         vNol, vNol, vNol, vNol, vNol,
  175.         vNol, vCurrCodeIdr, vNol, vNol
  176.     FROM fi_temp_summary_monthly_ar A
  177.     INNER JOIN vw_fi_all_invoice_ar_for_commission H ON A.doc_type_id = H.doc_type_id AND A.invoice_id = H.id
  178.     INNER JOIN sl_invoice B ON H.invoice_ar_id = B.invoice_id AND B.doc_type_id = H.doc_type_id
  179.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  180.     INNER JOIN sl_so_balance_invoice D ON B.tenant_id = D.tenant_id AND B.ou_id = D.ou_id AND B.partner_id = D.partner_id
  181.         AND C.ref_doc_type_id = D.ref_doc_type_id AND C.ref_id = D.ref_id AND C.ref_item_id = D.ref_item_id
  182.         AND C.do_receipt_item_id = D.do_receipt_item_id
  183.     INNER JOIN sl_do_item E ON C.ref_item_id = E.do_item_id
  184.     INNER JOIN sl_so_item F ON E.ref_id = F.so_item_id
  185.     INNER JOIN sl_so G ON F.so_id = G.so_id
  186.     INNER JOIN m_product I ON F.product_id = I.product_id
  187.     INNER JOIN m_partner J ON J.partner_id = G.partner_id
  188.     /*LEFT JOIN sl_so_balance_warranty_invoice L ON B.tenant_id = L.tenant_id AND L.ou_id = B.ou_id AND L.partner_id = B.partner_id
  189.         AND L.ref_doc_type_id = C.ref_doc_type_id AND L.ref_id = C.ref_id AND L.ref_item_id = C.ref_item_id
  190.         AND L.do_receipt_item_id = C.do_receipt_item_id*/
  191.     WHERE A.doc_type_id IN (vDocTypeSalesInvoice, vDocTypeReturnSalesInvoice)
  192.         AND A.date_year_month BETWEEN SUBSTRING(vDateFrom, 1, 6) AND vOneMonthAfterDateTo
  193.         AND (pSalesId = vEmptyId OR G.salesman_id = pSalesId)
  194.         AND (pBrandId = vEmptyId OR I.brand_id = pBrandId)
  195.         AND (pCtgrProductId = vEmptyId OR I.ctgr_product_id = pCtgrProductId)
  196.         AND (pSubCtgrProductId = vEmptyId OR I.sub_ctgr_product_id = pSubCtgrProductId)
  197.         AND (pLineOfBusinessCode = vEmptyString OR J.line_of_business = pLineOfBusinessCode)
  198.         AND B.doc_date BETWEEN vDateFrom and vDateTo
  199.         AND F.qty_so > 0
  200.         AND A.date_year_month = (
  201.             SELECT MAX(Z.date_year_month)
  202.             FROM fi_temp_summary_monthly_ar Z
  203.             WHERE A.invoice_id = Z.invoice_id
  204.             AND A.doc_type_id = Z.doc_type_id
  205.             AND A.ou_id = Z.ou_id
  206.             AND A.tenant_id = Z.tenant_id
  207.         )
  208.     GROUP BY A.invoice_id, A.doc_type_id, J.line_of_business, A.ou_id, A.curr_code, B.doc_no, B.doc_date, B.ref_id, C.ref_id, C.ref_item_id,
  209.         F.so_item_id, F.product_id, I.product_code, I.product_name, F.base_uom_id, G.partner_id, I.brand_id, G.salesman_id, G.doc_no, G.doc_date;
  210.    
  211.  
  212.     -- Adrian, Mar 7, 2017, Memisahkan insert untuk sl_so_balance_warranty_invoice
  213.     --ambil data hasil tutup bulan sementara dan join ke tabel so (invoice yg pelunasannya sampe sebulan setelahnya)
  214.     WITH vw_fi_all_invoice_ar_for_commission AS (
  215.         SELECT A.invoice_ar_balance_id AS id, A.doc_type_id, A.invoice_ar_id
  216.         FROM fi_invoice_ar_balance A
  217.         INNER JOIN m_ou_structure C ON A.ou_id = C.ou_id
  218.         WHERE A.tenant_id = pTenantId
  219.         AND C.ou_bu_id = pOuId
  220.        
  221.         UNION ALL
  222.        
  223.         SELECT a.invoice_tax_ar_balance_id AS id, a.doc_type_id, b.invoice_ar_id
  224.         FROM fi_invoice_tax_ar_balance a
  225.         INNER JOIN fi_invoice_ar_balance b on a.invoice_ar_balance_id = b.invoice_ar_balance_id
  226.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  227.         AND A.tenant_id = pTenantId
  228.         AND D.ou_bu_id = pOuId
  229.     )
  230.     --ambil data hasil tutup bulan sementara dan join ke tabel so (invoice yg pelunasannya sampe sebulan setelahnya)
  231.     INSERT INTO tr_data_so_sales_commission_for_igs(
  232.             session_id, tenant_id, date_year_month, invoice_id, doc_type_id,
  233.             inv_curr_code, inv_doc_no, inv_doc_date, ou_id, so_id,
  234.             so_doc_no, so_doc_date, do_id, do_item_id, original_total_amount,
  235.             so_item_id, product_id, qty_dlv_int, base_uom_id, partner_id,
  236.             salesman_id, brand_id, line_of_business, numerator_rate, denominator_rate,
  237.             original_price, total_amount_idr, total_amount_usd, other_costs, other_costs_idr,
  238.             other_costs_usd, other_costs_curr_code, other_cost_ext_commission, warranty_sell_amount)
  239.     SELECT pSessionId, pTenantId, ' ', A.invoice_id, A.doc_type_id,
  240.         A.curr_code, B.doc_no, B.doc_date, A.ou_id, B.ref_id,
  241.         G.doc_no, G.doc_date, C.ref_id, C.ref_item_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN -1 * SUM(L.warranty_sell_amount) ELSE SUM(L.warranty_sell_amount) END,
  242.         F.so_item_id, F.product_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN SUM(-1*(F.qty_int * D.qty_dlv_so)/F.qty_so) ELSE SUM((F.qty_int * D.qty_dlv_so)/F.qty_so) END, F.base_uom_id, G.partner_id,
  243.         G.salesman_id, I.brand_id, J.line_of_business, vOne, vOne,
  244.         vNol, vNol, vNol, vNol, vNol,
  245.         vNol, vCurrCodeIdr, vNol, vNol
  246.     FROM fi_temp_summary_monthly_ar A
  247.     INNER JOIN vw_fi_all_invoice_ar_for_commission H ON A.doc_type_id = H.doc_type_id AND A.invoice_id = H.id
  248.     INNER JOIN sl_invoice B ON H.invoice_ar_id = B.invoice_id AND B.doc_type_id = H.doc_type_id
  249.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  250.     INNER JOIN sl_so_balance_invoice D ON B.tenant_id = D.tenant_id AND B.ou_id = D.ou_id AND B.partner_id = D.partner_id
  251.         AND C.ref_doc_type_id = D.ref_doc_type_id AND C.ref_id = D.ref_id AND C.ref_item_id = D.ref_item_id
  252.         AND C.do_receipt_item_id = D.do_receipt_item_id
  253.     INNER JOIN sl_do_item E ON C.ref_item_id = E.do_item_id
  254.     INNER JOIN sl_so_item F ON E.ref_id = F.so_item_id
  255.     INNER JOIN sl_so G ON F.so_id = G.so_id
  256.     INNER JOIN m_product I ON F.product_id = I.product_id
  257.     INNER JOIN m_partner J ON J.partner_id = G.partner_id
  258.     INNER JOIN sl_so_balance_warranty_invoice L ON B.tenant_id = L.tenant_id AND L.ou_id = B.ou_id AND L.partner_id = B.partner_id
  259.         AND L.ref_doc_type_id = C.ref_doc_type_id AND L.ref_id = C.ref_id AND L.ref_item_id = C.ref_item_id
  260.         AND L.do_receipt_item_id = C.do_receipt_item_id
  261.     WHERE A.doc_type_id IN (vDocTypeSalesInvoice, vDocTypeReturnSalesInvoice)
  262.         AND A.date_year_month BETWEEN SUBSTRING(vDateFrom, 1, 6) AND vOneMonthAfterDateTo
  263.         AND (pSalesId = vEmptyId OR G.salesman_id = pSalesId)
  264.         AND (pBrandId = vEmptyId OR I.brand_id = pBrandId)
  265.         AND (pCtgrProductId = vEmptyId OR I.ctgr_product_id = pCtgrProductId)
  266.         AND (pSubCtgrProductId = vEmptyId OR I.sub_ctgr_product_id = pSubCtgrProductId)
  267.         AND (pLineOfBusinessCode = vEmptyString OR J.line_of_business = pLineOfBusinessCode)
  268.         AND B.doc_date BETWEEN vDateFrom and vDateTo
  269.         AND F.qty_so > 0
  270.         AND A.date_year_month = (
  271.             SELECT MAX(Z.date_year_month)
  272.             FROM fi_temp_summary_monthly_ar Z
  273.             WHERE A.invoice_id = Z.invoice_id
  274.             AND A.doc_type_id = Z.doc_type_id
  275.             AND A.ou_id = Z.ou_id
  276.             AND A.tenant_id = Z.tenant_id
  277.         )
  278.     GROUP BY A.invoice_id, A.doc_type_id, J.line_of_business, A.ou_id, A.curr_code, B.doc_no, B.doc_date, B.ref_id, C.ref_id, C.ref_item_id,
  279.         F.so_item_id, F.product_id, I.product_code, I.product_name, F.base_uom_id, G.partner_id, I.brand_id, G.salesman_id, G.doc_no, G.doc_date;  
  280.        
  281.        
  282.     WITH vw_fi_all_invoice_ar_for_commission AS (
  283.         SELECT A.invoice_ar_balance_id AS id, A.doc_type_id, A.invoice_ar_id
  284.         FROM fi_invoice_ar_balance A
  285.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  286.         WHERE A.tenant_id = pTenantId
  287.         AND D.ou_bu_id = pOuId
  288.        
  289.         UNION ALL
  290.        
  291.         SELECT a.invoice_tax_ar_balance_id AS id, a.doc_type_id, b.invoice_ar_id
  292.         FROM fi_invoice_tax_ar_balance a
  293.         INNER JOIN fi_invoice_ar_balance b on a.invoice_ar_balance_id = b.invoice_ar_balance_id
  294.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  295.         AND A.tenant_id = pTenantId
  296.         AND D.ou_bu_id = pOuId
  297.     )
  298.    
  299.     --ambil data yg doc_datenya sebulan sebelum dateFrom dan pelunasannya satu bulan sebelum date to
  300.     INSERT INTO tr_data_so_sales_commission_for_igs(
  301.             session_id, tenant_id, date_year_month, invoice_id, doc_type_id,
  302.             inv_curr_code, inv_doc_no, inv_doc_date, ou_id, so_id,
  303.             so_doc_no, so_doc_date, do_id, do_item_id, original_total_amount,
  304.             so_item_id, product_id, qty_dlv_int, base_uom_id, partner_id,
  305.             salesman_id, brand_id, line_of_business, numerator_rate, denominator_rate,
  306.             original_price, total_amount_idr, total_amount_usd, other_costs, other_costs_idr,
  307.             other_costs_usd, other_costs_curr_code,other_cost_ext_commission, warranty_sell_amount)
  308.     SELECT pSessionId, pTenantId, ' ', A.invoice_id, A.doc_type_id,
  309.         A.curr_code, B.doc_no, B.doc_date, A.ou_id, B.ref_id,
  310.         G.doc_no, G.doc_date, C.ref_id, C.ref_item_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN -1 * SUM(C.ref_item_amount) ELSE SUM(C.ref_item_amount) END,
  311.         F.so_item_id, F.product_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN SUM(-1*(F.qty_int * D.qty_dlv_so)/F.qty_so) ELSE SUM((F.qty_int * D.qty_dlv_so)/F.qty_so) END, F.base_uom_id, G.partner_id,
  312.         G.salesman_id, I.brand_id, J.line_of_business, vOne, vOne,
  313.         vNol, vNol, vNol, vNol, vNol,
  314.         vNol, vCurrCodeIdr, vNol, vNol
  315.     FROM fi_temp_summary_monthly_ar A
  316.     INNER JOIN vw_fi_all_invoice_ar_for_commission H ON A.doc_type_id = H.doc_type_id AND A.invoice_id = H.id
  317.     INNER JOIN sl_invoice B ON H.invoice_ar_id = B.invoice_id AND B.doc_type_id = H.doc_type_id
  318.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  319.     INNER JOIN sl_so_balance_invoice D ON B.tenant_id = D.tenant_id AND B.ou_id = D.ou_id AND B.partner_id = D.partner_id
  320.         AND C.ref_doc_type_id = D.ref_doc_type_id AND C.ref_id = D.ref_id AND C.ref_item_id = D.ref_item_id
  321.         AND C.do_receipt_item_id = D.do_receipt_item_id
  322.     INNER JOIN sl_do_item E ON C.ref_item_id = E.do_item_id
  323.     INNER JOIN sl_so_item F ON E.ref_id = F.so_item_id
  324.     INNER JOIN sl_so G ON F.so_id = G.so_id
  325.     INNER JOIN m_product I ON F.product_id = I.product_id
  326.     INNER JOIN m_partner J ON J.partner_id = G.partner_id
  327.     /*LEFT JOIN sl_so_balance_warranty_invoice L ON B.tenant_id = L.tenant_id AND L.ou_id = B.ou_id AND L.partner_id = B.partner_id
  328.         AND L.ref_doc_type_id = C.ref_doc_type_id AND L.ref_id = C.ref_id AND L.ref_item_id = C.ref_item_id
  329.         AND L.do_receipt_item_id = C.do_receipt_item_id*/
  330.     WHERE A.doc_type_id IN (vDocTypeSalesInvoice, vDocTypeReturnSalesInvoice)
  331.         AND A.date_year_month = vOneMonthBeforeDateTo
  332.         AND (pSalesId = vEmptyId OR G.salesman_id = pSalesId)
  333.         AND (pBrandId = vEmptyId OR I.brand_id = pBrandId)
  334.         AND (pCtgrProductId = vEmptyId OR I.ctgr_product_id = pCtgrProductId)
  335.         AND (pSubCtgrProductId = vEmptyId OR I.sub_ctgr_product_id = pSubCtgrProductId)
  336.         AND (pLineOfBusinessCode = vEmptyString OR J.line_of_business = pLineOfBusinessCode)
  337.         AND SUBSTRING(B.doc_date, 1, 6) = vOneMonthBeforeDateFrom
  338.         AND F.qty_so > 0
  339.         AND A.date_year_month = (
  340.             SELECT MAX(Z.date_year_month)
  341.             FROM fi_temp_summary_monthly_ar Z
  342.             WHERE A.invoice_id = Z.invoice_id
  343.             AND A.doc_type_id = Z.doc_type_id
  344.             AND A.ou_id = Z.ou_id
  345.             AND A.tenant_id = Z.tenant_id
  346.         )
  347.     GROUP BY A.invoice_id, A.doc_type_id, J.line_of_business, A.ou_id, A.curr_code, B.doc_no, B.doc_date, B.ref_id, C.ref_id, C.ref_item_id,
  348.         F.so_item_id, F.product_id, I.product_code, I.product_name, F.base_uom_id, G.partner_id, I.brand_id, G.salesman_id, G.doc_no, G.doc_date;
  349.        
  350.        
  351.     WITH vw_fi_all_invoice_ar_for_commission AS (
  352.         SELECT A.invoice_ar_balance_id AS id, A.doc_type_id, A.invoice_ar_id
  353.         FROM fi_invoice_ar_balance A
  354.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  355.         WHERE A.tenant_id = pTenantId
  356.         AND D.ou_bu_id = pOuId
  357.        
  358.         UNION ALL
  359.        
  360.         SELECT a.invoice_tax_ar_balance_id AS id, a.doc_type_id, b.invoice_ar_id
  361.         FROM fi_invoice_tax_ar_balance a
  362.         INNER JOIN fi_invoice_ar_balance b on a.invoice_ar_balance_id = b.invoice_ar_balance_id
  363.         INNER JOIN m_ou_structure D ON A.ou_id = D.ou_id
  364.         AND A.tenant_id = pTenantId
  365.         AND D.ou_bu_id = pOuId
  366.     )
  367.    
  368.     --ambil data yg doc_datenya sebulan sebelum dateFrom dan pelunasannya satu bulan sebelum date to
  369.     INSERT INTO tr_data_so_sales_commission_for_igs(
  370.             session_id, tenant_id, date_year_month, invoice_id, doc_type_id,
  371.             inv_curr_code, inv_doc_no, inv_doc_date, ou_id, so_id,
  372.             so_doc_no, so_doc_date, do_id, do_item_id, original_total_amount,
  373.             so_item_id, product_id, qty_dlv_int, base_uom_id, partner_id,
  374.             salesman_id, brand_id, line_of_business, numerator_rate, denominator_rate,
  375.             original_price, total_amount_idr, total_amount_usd, other_costs, other_costs_idr,
  376.             other_costs_usd, other_costs_curr_code,other_cost_ext_commission, warranty_sell_amount)
  377.     SELECT pSessionId, pTenantId, ' ', A.invoice_id, A.doc_type_id,
  378.         A.curr_code, B.doc_no, B.doc_date, A.ou_id, B.ref_id,
  379.         G.doc_no, G.doc_date, C.ref_id, C.ref_item_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN -1 * SUM(L.warranty_sell_amount) ELSE SUM(L.warranty_sell_amount) END,
  380.         F.so_item_id, F.product_id, CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice THEN SUM(-1*(F.qty_int * D.qty_dlv_so)/F.qty_so) ELSE SUM((F.qty_int * D.qty_dlv_so)/F.qty_so) END, F.base_uom_id, G.partner_id,
  381.         G.salesman_id, I.brand_id, J.line_of_business, vOne, vOne,
  382.         vNol, vNol, vNol, vNol, vNol,
  383.         vNol, vCurrCodeIdr, vNol, vNol
  384.     FROM fi_temp_summary_monthly_ar A
  385.     INNER JOIN vw_fi_all_invoice_ar_for_commission H ON A.doc_type_id = H.doc_type_id AND A.invoice_id = H.id
  386.     INNER JOIN sl_invoice B ON H.invoice_ar_id = B.invoice_id AND B.doc_type_id = H.doc_type_id
  387.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  388.     INNER JOIN sl_so_balance_invoice D ON B.tenant_id = D.tenant_id AND B.ou_id = D.ou_id AND B.partner_id = D.partner_id
  389.         AND C.ref_doc_type_id = D.ref_doc_type_id AND C.ref_id = D.ref_id AND C.ref_item_id = D.ref_item_id
  390.         AND C.do_receipt_item_id = D.do_receipt_item_id
  391.     INNER JOIN sl_do_item E ON C.ref_item_id = E.do_item_id
  392.     INNER JOIN sl_so_item F ON E.ref_id = F.so_item_id
  393.     INNER JOIN sl_so G ON F.so_id = G.so_id
  394.     INNER JOIN m_product I ON F.product_id = I.product_id
  395.     INNER JOIN m_partner J ON J.partner_id = G.partner_id
  396.     INNER JOIN sl_so_balance_warranty_invoice L ON B.tenant_id = L.tenant_id AND L.ou_id = B.ou_id AND L.partner_id = B.partner_id
  397.         AND L.ref_doc_type_id = C.ref_doc_type_id AND L.ref_id = C.ref_id AND L.ref_item_id = C.ref_item_id
  398.         AND L.do_receipt_item_id = C.do_receipt_item_id
  399.     WHERE A.doc_type_id IN (vDocTypeSalesInvoice, vDocTypeReturnSalesInvoice)
  400.         AND A.date_year_month = vOneMonthBeforeDateTo
  401.         AND (pSalesId = vEmptyId OR G.salesman_id = pSalesId)
  402.         AND (pBrandId = vEmptyId OR I.brand_id = pBrandId)
  403.         AND (pCtgrProductId = vEmptyId OR I.ctgr_product_id = pCtgrProductId)
  404.         AND (pSubCtgrProductId = vEmptyId OR I.sub_ctgr_product_id = pSubCtgrProductId)
  405.         AND (pLineOfBusinessCode = vEmptyString OR J.line_of_business = pLineOfBusinessCode)
  406.         AND SUBSTRING(B.doc_date, 1, 6) = vOneMonthBeforeDateFrom
  407.         AND F.qty_so > 0
  408.         AND A.date_year_month = (
  409.             SELECT MAX(Z.date_year_month)
  410.             FROM fi_temp_summary_monthly_ar Z
  411.             WHERE A.invoice_id = Z.invoice_id
  412.             AND A.doc_type_id = Z.doc_type_id
  413.             AND A.ou_id = Z.ou_id
  414.             AND A.tenant_id = Z.tenant_id
  415.         )
  416.     GROUP BY A.invoice_id, A.doc_type_id, J.line_of_business, A.ou_id, A.curr_code, B.doc_no, B.doc_date, B.ref_id, C.ref_id, C.ref_item_id,
  417.         F.so_item_id, F.product_id, I.product_code, I.product_name, F.base_uom_id, G.partner_id, I.brand_id, G.salesman_id, G.doc_no, G.doc_date;
  418.  
  419.        
  420.     /*
  421.      * Adrian, Mar 7 2017
  422.      * Mennganti LEFT JOIN ke sl_so_balance_warranty_invoice menjadi update
  423.      */
  424.     /*WITH vw_warranty_sell_amount AS (
  425.         SELECT A.invoice_id, B.do_item_id,  
  426.             CASE WHEN A.doc_type_id = vDocTypeReturnSalesInvoice
  427.                 THEN -1 * SUM(L.warranty_sell_amount)  
  428.             ELSE
  429.                 SUM(L.warranty_sell_amount)
  430.             END AS sum_warranty_sell_amount
  431.         FROM tr_data_so_sales_commission_for_igs A
  432.         INNER JOIN sl_do_item B ON B.do_item_id = A.do_item_id
  433.         INNER JOIN sl_invoice_item C ON C.ref_item_id = B.do_item_id
  434.         INNER JOIN sl_invoice D ON D.invoice_id = C.invoice_id
  435.         INNER JOIN sl_so_balance_warranty_invoice L ON L.ou_id = D.ou_id AND L.partner_id = D.partner_id
  436.             AND L.ref_doc_type_id = C.ref_doc_type_id AND L.ref_id = C.ref_id AND L.ref_item_id = C.ref_item_id
  437.             AND L.do_receipt_item_id = C.do_receipt_item_id
  438.         WHERE A.session_id = pSessionId
  439.         GROUP BY A.invoice_id, A.doc_type_id, B.do_item_id
  440.     )
  441.     UPDATE tr_data_so_sales_commission_for_igs A
  442.     SET warranty_sell_amount = B.sum_warranty_sell_amount
  443.     FROM vw_warranty_sell_amount B
  444.     WHERE A.session_id = pSessionId
  445.         AND A.invoice_id = B.invoice_id
  446.         AND A.do_item_id = B.do_item_id;*/
  447.    
  448.        
  449.        
  450.     /* update nilai original_price and original total_amount */
  451.     UPDATE tr_data_so_sales_commission_for_igs A
  452.     SET original_price = A.original_total_amount / A.qty_dlv_int
  453.     WHERE A.qty_dlv_int <> 0;
  454.        
  455.     /* update table temporary for numerator_rate, denominator_rate */
  456.     UPDATE tr_data_so_sales_commission_for_igs A
  457.     SET numerator_rate = B.amount_to,
  458.         denominator_rate = B.amount_from
  459.     FROM m_exchange_rate B
  460.     WHERE A.session_id = pSessionId
  461.         AND A.inv_doc_date = B.date_from
  462.         AND B.type_exchange_rate = vTypeExcRateCom;
  463.        
  464.     /* others cost */
  465.     INSERT INTO tr_data_costs_sales_commission_for_igs(
  466.             session_id, tenant_id, ou_id, segment_id, so_id, gl_curr_code, gl_amount,
  467.             coa_id)
  468.     SELECT pSessionId, pTenantId, A.ou_bu_id, B.segmen_id, D.so_id, B.gl_curr_code, B.gl_amount,
  469.         B.coa_id
  470.     FROM gl_journal_trx A
  471.         INNER JOIN vw_gl_journal_trx_details B ON A.journal_trx_id = B.journal_trx_id
  472.         INNER JOIN m_segment_coa C ON B.segmen_id = C.segment_coa_id
  473.         INNER JOIN tr_data_so_sales_commission_for_igs D ON C.segment_coa_code = D.so_doc_no
  474.     WHERE A.status_doc = vStatusDocRelease
  475.         AND (C.group_segment = vGroupSegmentOthers OR C.group_segment = vGroupSegmentSo)
  476.     GROUP BY  A.ou_bu_id, B.segmen_id, D.so_id, B.gl_curr_code, B.gl_amount, B.coa_id
  477.     UNION ALL
  478.     SELECT pSessionId, pTenantId, A.ou_bu_id, B.segmen_id, D.so_id, B.gl_curr_code, ROUND(B.amount * B.numerator_rate / B.denominator_rate, vRoundingDigitUSD),
  479.         B.coa_id
  480.     FROM gl_journal_trx A
  481.         INNER JOIN vw_gl_journal_trx_details B ON A.journal_trx_id = B.journal_trx_id
  482.         INNER JOIN m_segment_coa C ON B.segmen_id = C.segment_coa_id
  483.         INNER JOIN tr_data_so_sales_commission_for_igs D ON C.segment_coa_code = D.so_doc_no
  484.     WHERE A.status_doc = vStatusDocDraft
  485.         AND (C.group_segment = vGroupSegmentOthers OR C.group_segment = vGroupSegmentSo)
  486.     GROUP BY A.ou_bu_id, B.segmen_id, D.so_id, B.gl_curr_code, B.amount, B.numerator_rate, B.denominator_rate, B.coa_id;
  487.        
  488.    
  489.     /* update table cost tr_data_so_sales_for_commission non ext commission */
  490.     UPDATE tr_data_so_sales_commission_for_igs B
  491.     SET other_costs = (SELECT CASE WHEN B.doc_type_id = vDocTypeReturnSalesInvoice THEN 0 ELSE COALESCE(SUM(A.gl_amount),0) END
  492.     FROM tr_data_costs_sales_commission_for_igs A WHERE A.so_id = B.so_id AND A.coa_id <> vCoaIdExtCommission AND A.session_id = B.session_id)
  493.     WHERE B.session_id = pSessionId
  494.         AND B.so_item_id = (SELECT MIN(K.so_item_id) FROM sl_so_item K WHERE K.so_id = B.so_id AND K.qty_so > 0);
  495.    
  496.     /* update table cost tr_data_so_sales_for_commission ext commission */
  497.     UPDATE tr_data_so_sales_commission_for_igs B
  498.     SET other_cost_ext_commission = (SELECT COALESCE(SUM(A.gl_amount),0) FROM tr_data_costs_sales_commission_for_igs A WHERE A.so_id = B.so_id AND A.coa_id = vCoaIdExtCommission AND A.session_id = B.session_id)
  499.     WHERE B.session_id = pSessionId
  500.         AND B.so_item_id = (SELECT MIN(K.so_item_id) FROM sl_so_item K WHERE K.so_id = B.so_id AND K.qty_so > 0);
  501.  
  502.     --update total_amount_usd
  503.     UPDATE tr_data_so_sales_commission_for_igs
  504.     SET total_amount_usd =
  505.         CASE WHEN inv_curr_code = 'IDR'
  506.                 THEN  (original_total_amount * denominator_rate)/numerator_rate
  507.             WHEN inv_curr_code = 'USD'
  508.                 THEN original_total_amount
  509.             ELSE vNol
  510.         END
  511.     WHERE qty_dlv_int <> 0;
  512.    
  513.     --update total_amount_idr
  514.     UPDATE tr_data_so_sales_commission_for_igs
  515.     SET total_amount_idr = CASE WHEN inv_curr_code = 'USD'
  516.                 THEN (original_total_amount * numerator_rate)/denominator_rate
  517.              WHEN inv_curr_code = 'IDR'
  518.                 THEN original_total_amount
  519.             ELSE vNol
  520.         END
  521.     WHERE qty_dlv_int <> 0;
  522.    
  523.     --update other_costs_usd
  524.     UPDATE tr_data_so_sales_commission_for_igs
  525.     SET other_costs_usd = (other_costs * denominator_rate)/numerator_rate
  526.     WHERE qty_dlv_int <> 0;
  527.    
  528.     -- update line_of_business yang kosong menjadi DEFAULT
  529.     UPDATE tr_data_so_sales_commission_for_igs
  530.     SET line_of_business = vDefault
  531.     WHERE line_of_business IN (vEmptyString,vSpace);
  532.    
  533.     /* update bulan pelunasan */
  534.     UPDATE tr_data_so_sales_commission_for_igs B
  535.     SET date_year_month = A.date_year_month
  536.     FROM fi_temp_summary_monthly_ar A
  537.     WHERE A.balance_amount = A.payment_amount
  538.     AND B.invoice_id = A.invoice_id
  539.     AND B.doc_type_id = A.doc_type_id
  540.     AND B.session_id = pSessionId
  541.     AND B.tenant_id = pTenantId;
  542.    
  543.     Open pRefHeader FOR
  544.     SELECT pOuId AS ou_id, f_get_ou_name(pOuId) AS ou_name, vDateFrom AS date_from, vDateTo AS date_to, pDatetime AS datetime, f_get_username(pUserId) AS username;
  545.     RETURN NEXT pRefHeader;
  546.        
  547.     Open pRefDetail FOR
  548.     SELECT A.line_of_business, f_get_partner_name(A.salesman_id) AS sales_name, f_get_partner_code(A.partner_id) AS partner_code, f_get_partner_name(A.partner_id) AS partner_name,
  549.         A.so_doc_date AS so_date, A.so_doc_no AS so_no, A.doc_type_id, A.inv_doc_date AS inv_date, A.inv_doc_no AS inv_no, f_get_brand_name(A.brand_id) as brand_name, f_get_product_code(A.product_id) AS product_code,
  550.         f_get_product_name(A.product_id) AS product_name, A.qty_dlv_int AS qty, A.inv_curr_code, SUM(A.original_total_amount / A.qty_dlv_int) AS original_price,
  551.         A.denominator_rate/A.numerator_rate AS rate_to_usd, A.numerator_rate AS rate_to_idr, original_total_amount,
  552.         A.total_amount_usd, A.total_amount_idr, A.other_costs_curr_code, A.other_costs, A.other_costs_usd, A.other_costs_idr, A.date_year_month,
  553.         A.warranty_sell_amount
  554.     FROM tr_data_so_sales_commission_for_igs A
  555.     LEFT OUTER JOIN sl_so_external_commission B ON A.so_id = B.so_id AND A.so_item_id = (SELECT MIN(K.so_item_id) FROM sl_so_item K WHERE K.so_id = B.so_id AND K.qty_so > 0)
  556.     WHERE A.session_id = pSessionId
  557.         AND A.qty_dlv_int <> 0
  558.     GROUP BY A.invoice_id, A.do_item_id, A.line_of_business, A.salesman_id,
  559.     ORDER BY line_of_business, sales_name, partner_name, A.so_doc_no, A.doc_type_id, product_code;
  560.     RETURN NEXT pRefDetail;
  561.        
  562.  
  563.     DELETE FROM tr_data_so_sales_commission_for_igs WHERE session_id = pSessionId;
  564. END;
  565. $BODY$
  566.   LANGUAGE plpgsql VOLATILE
  567.   COST 100
  568.   ROWS 1000;
  569. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement