Advertisement
aadddrr

r_achievement_vs_target_20180424

Apr 24th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_achievement_vs_target(character varying, bigint, bigint, bigint, character varying, bigint, bigint, bigint, character varying, character varying, character varying)
  2.   RETURNS SETOF refcursor AS
  3. $BODY$
  4. DECLARE
  5.     pRefHeader                  REFCURSOR := 'refHeader';
  6.     pRefDetailSummary           REFCURSOR := 'refDetailSummary';
  7.     pRefDetail                  REFCURSOR := 'refDetail';
  8.     pSessionId                  ALIAS FOR $1;
  9.     pTenantId                   ALIAS FOR $2;
  10.     pUserId                     ALIAS FOR $3;
  11.     pRoleId                     ALIAS FOR $4;
  12.     pDatetime                   ALIAS FOR $5;
  13.    
  14.     pOuId                       ALIAS FOR $6;
  15.     pSalesmanId                 ALIAS FOR $7;
  16.     pCustomerId                 ALIAS FOR $8;
  17.     pYear                       ALIAS FOR $9;
  18.     pPeriod                     ALIAS FOR $10;
  19.     pGroupBrand                 ALIAS FOR $11;
  20.  
  21.     vPartnerCodeMou                 character varying(50);
  22.     vPartnerNameMou                 character varying(100);
  23.     vDocTypeIdSOByBrand             bigint;
  24.     vStatusReleased                 character varying(1);
  25.     vStatusFinal                    character varying(1);
  26.     vStatusInProgress               character varying(1);
  27.     vStatusDraft                    character varying(1);
  28.     vDocTypeIdReturnNote                bigint;
  29.     vDocTypeIdSalesInvoice              bigint;
  30.     vDocTypeIdInvoiceTemp               bigint;
  31.     vDocTypeIdRRS                   bigint;
  32.     vStatusMapping                  character varying(1);
  33.     vStatusApproved                 character varying(1);
  34.     vRaw                        character varying(20);
  35.     vSummary                    character varying(20);
  36.     vEmptyId                    bigint;
  37.     vOne                        integer := 1;
  38.     vEmptyValue                 character varying;
  39.    
  40.     vFlagYes                    character varying(1) :='Y';
  41.     vFlagNo                     character varying(1) :='N';
  42.    
  43.     vCurrentDate                character varying;
  44.     vSystemCurrentYear          character varying;
  45.     vLastYear                   character varying;
  46.     vEndDate                    character varying;
  47.     vDateTo                     character varying;
  48.     vFlgTypeSOReg               character varying;
  49.     vZero                       numeric;
  50.     vDocTypeIdSOB               bigint;
  51.     vComboGroupBrand            character varying;
  52.     vArraySeparator             character varying;
  53.     vQuote                      character varying;
  54.     vDocTypeIdReturnInvoice     bigint;
  55.     vDocTypeIdCNAR              bigint;
  56.     vDocTypeIdDNAR              bigint;
  57.     i                           bigint;
  58.     vFilterCustomer             character varying;
  59.     vDecimalNo                  int;
  60.     vFilterGroupBrand           character varying;
  61.     vConfigSeparator            character varying;
  62.     vConfigPrefix               character varying;
  63.     vSalesmanLevel              bigint;
  64.     vFilterSalesman             character varying;
  65.     vSpaceValue                 character varying;
  66.     vDash                       character varying;
  67.     vPositionLevelManager       bigint;
  68.     vSalesmanHeaderId           bigint;
  69.     vSalesmanLevelHeader        bigint;
  70.     vFilterSalesmanHeader       character varying;
  71.    
  72. BEGIN
  73.    
  74.     vPartnerCodeMou := ' ';
  75.     vPartnerNameMou := ' ';
  76.     vDocTypeIdSOByBrand := 398;
  77.     vStatusReleased := 'R';
  78.     vStatusFinal := 'F';
  79.     vStatusInProgress := 'I';
  80.     vStatusDraft := 'D';
  81.     vDocTypeIdReturnNote := 502;
  82.     vDocTypeIdSalesInvoice := 321;
  83.     vDocTypeIdInvoiceTemp := 361;
  84.     vDocTypeIdRRS :=381;
  85.     vStatusMapping := 'M';
  86.     vStatusApproved := 'A';
  87.     vRaw := 'RAW';
  88.     vSummary := 'SUMMARY';
  89.     vEmptyId := -99;
  90.     vEmptyValue := '';
  91.     vEndDate := '1231';
  92.     vFlgTypeSOReg := 'REG';
  93.     vZero := 0;
  94.     vDocTypeIdSOB := 398;
  95.     vComboGroupBrand := 'GROUPBRANDPARENT';
  96.     vArraySeparator := ', ';
  97.     vQuote := '''';
  98.     vDocTypeIdReturnInvoice := 380;
  99.     vDocTypeIdCNAR := 251;
  100.     vDocTypeIdDNAR := 241;
  101.     i := 5; --Level salesman senior
  102.     vFilterCustomer := '';
  103.     vDecimalNo := 2;
  104.     vFilterGroupBrand := '';
  105.     vConfigSeparator := ';';
  106.     vConfigPrefix := 'ACTIVITY_GL_GROUP_BRAND_';
  107.     vSalesmanLevel := -99;
  108.     vFilterSalesman := '';
  109.     vSpaceValue := ' ';
  110.     vDash := '-';
  111.     vPositionLevelManager := 3;
  112.    
  113.     -- Ambil salesman dari user login (sebagai salesman leader)
  114.     -- karena customer dan salesman yang akan dimunculkan hanya
  115.     -- customer dan salesman dari hierarchy salesman yang sedang login,
  116.     -- bukan dari salesman id yang dikirim.
  117.     -- Salesman id yang dikirim, digunakan untuk memfilter
  118.     -- salesman dari hierarchy salesman yang sedang login
  119.     SELECT A.salesman_id
  120.     INTO vSalesmanHeaderId
  121.     FROM m_user_salesman_mapping A
  122.     WHERE A.user_id = pUserId;
  123.    
  124.     -- Ambil level salesman, untuk menentukan filter pengambilan data hierarchy
  125.     -- Note : jika hasilnya -99, artinya salesman belum diset jabatanya
  126.     SELECT f_get_salesman_level(vSalesmanHeaderId) INTO vSalesmanLevelHeader;
  127.    
  128.     -- Tentukan filter berdasarkan salesman yang sedang login
  129.     IF(vSalesmanLevelHeader = 1) THEN
  130.         vFilterSalesmanHeader := ' AND A.bod_id = '||vSalesmanHeaderId||' ';
  131.     ELSIF (vSalesmanLevelHeader = 2) THEN
  132.         vFilterSalesmanHeader := ' AND A.saso_id = '||vSalesmanHeaderId||' ';
  133.     ELSIF (vSalesmanLevelHeader = 3) THEN
  134.         vFilterSalesmanHeader := ' AND A.sales_manager_id = '||vSalesmanHeaderId||' ';
  135.     ELSIF (vSalesmanLevelHeader = 4) THEN
  136.         vFilterSalesmanHeader := ' AND A.sales_supervisor_id = '||vSalesmanHeaderId||' ';
  137.     ELSIF (vSalesmanLevelHeader = 5) THEN
  138.         vFilterSalesmanHeader := ' AND A.salesman_id = '||vSalesmanHeaderId||' ';
  139.     ELSIF (vSalesmanLevelHeader = 6) THEN
  140.         vFilterSalesmanHeader := ' AND A.salesman_junior_id = '||vSalesmanHeaderId||' ';
  141.     ELSE
  142.         vFilterSalesmanHeader := ' AND FALSE ';
  143.     END IF;
  144.    
  145.     -- Ambil tahun sekarang (sistem) dan tahun lalu dari filter tahun
  146.     SELECT TO_CHAR(current_timestamp, 'YYYY') INTO vSystemCurrentYear;
  147.     SELECT TO_CHAR(TO_DATE(pYear,'YYYY') - INTERVAL '1 Year','YYYY') INTO vLastYear;
  148.    
  149.     -- Jika filter tahun >= tahun sistem, data adalah data sampai tanggal sistem
  150.     -- Jika tidak, data adalah data sampai tanggal akhir dari filter tahun
  151.     IF (pYear >= vSystemCurrentYear) THEN
  152.         SELECT TO_CHAR(current_timestamp, 'YYYYMMDD') INTO vDateTo;
  153.     ELSIF (pYear < vSystemCurrentYear) THEN
  154.         SELECT pYear || vEndDate INTO vDateTo;
  155.     END IF;
  156.    
  157.     -- Ambil level salesman dari filter salesman
  158.     SELECT f_get_salesman_level(pSalesmanId) INTO vSalesmanLevel;
  159.    
  160.     -- Tentukan filter berdasarkan filter salesman
  161.     IF(vSalesmanLevel = 1) THEN
  162.         vFilterSalesman := ' AND A.bod_id = '||pSalesmanId||' ';
  163.     ELSIF (vSalesmanLevel = 2) THEN
  164.         vFilterSalesman := ' AND A.saso_id = '||pSalesmanId||' ';
  165.     ELSIF (vSalesmanLevel = 3) THEN
  166.         vFilterSalesman := ' AND A.sales_manager_id = '||pSalesmanId||' ';
  167.     ELSIF (vSalesmanLevel = 4) THEN
  168.         vFilterSalesman := ' AND A.sales_supervisor_id = '||pSalesmanId||' ';
  169.     ELSIF (vSalesmanLevel = 5) THEN
  170.         vFilterSalesman := ' AND A.salesman_id = '||pSalesmanId||' ';
  171.     ELSIF (vSalesmanLevel = 6) THEN
  172.         vFilterSalesman := ' AND A.salesman_junior_id = '||pSalesmanId||' ';
  173.     END IF;
  174.    
  175.     -- Tentukan filter customer berdasarkan filter
  176.     IF (pCustomerId <> vEmptyId) THEN
  177.         vFilterCustomer := ' AND A.customer_id = '|| pCustomerId ||' ';
  178.     END IF;
  179.    
  180.     -- Tentukan filter group brand berdasarkan filter
  181.     IF (pGroupBrand <> vEmptyValue) THEN
  182.         vFilterGroupBrand := ' AND A.group_brand = '''|| pGroupBrand ||''' ';
  183.     END IF;
  184.    
  185.     -- Hapus isi table temporary
  186.     DELETE FROM tt_salesman_customer_info_for_report_achievement_and_target WHERE session_id = pSessionId;
  187.     DELETE FROM tt_achievement_transaction_for_report_achievement_and_target WHERE session_id = pSessionId;
  188.     DELETE FROM tt_summary_for_report_achievement_and_target WHERE session_id = pSessionId;
  189.    
  190.     -- Ambil data salesman dan customer dari hierarchy berdasarkan filter
  191.     -- Salesman yang meng-handle customer adalah salesman dengan level terendah dalam hierarchy tersebut
  192.     EXECUTE
  193.         'WITH tt_salesman_customer AS(
  194.             SELECT A.tenant_id, A.customer_id, B.partner_code AS customer_code,
  195.                 B.partner_name AS customer_name, G.city AS customer_city,
  196.                 A.salesman_junior_id, A.salesman_id, A.sales_supervisor_id,
  197.                 A.sales_manager_id, A.saso_id, A.bod_id,
  198.                 CASE WHEN (salesman_junior_id <> $4) THEN
  199.                     salesman_junior_id
  200.                 WHEN (salesman_id <> $4) THEN
  201.                     salesman_id
  202.                 WHEN (sales_supervisor_id <> $4) THEN
  203.                     sales_supervisor_id
  204.                 WHEN (sales_manager_id <> $4) THEN
  205.                     sales_manager_id
  206.                 WHEN (saso_id <> $4) THEN
  207.                     saso_id
  208.                 ELSE
  209.                     bod_id
  210.                 END AS salesman_handle_id, A.group_brand,
  211.                 $6, $6, $6, $6, $11
  212.             FROM m_mapping_salesman_hierarchy_customer A
  213.             INNER JOIN m_partner B ON A.customer_id = B.partner_id
  214.             INNER JOIN m_ctgr_partner C ON A.tenant_id = C.tenant_id AND B.ctgr_partner_id = C.ctgr_partner_id
  215.             INNER JOIN t_user_role D ON D.user_id = $7 AND D.role_id = $8
  216.             INNER JOIN m_policy_partner E ON B.ctgr_partner_id = E.ctgr_partner_id AND D.user_role_id = E.user_role_id
  217.             INNER JOIN m_partner_address G ON A.tenant_id = G.tenant_id AND A.customer_id = G.partner_id AND G.flg_default = $9
  218.             WHERE A.tenant_id = 10
  219.                 AND $3 BETWEEN A.date_from AND A.date_to
  220.                 AND $12 <> $4 '
  221.                 || vFilterSalesmanHeader
  222.                 || vFilterSalesman
  223.                 || vFilterCustomer
  224.                 || vFilterGroupBrand ||
  225.         ')
  226.         INSERT INTO tt_salesman_customer_info_for_report_achievement_and_target(
  227.            session_id, tenant_id, customer_id, customer_code, customer_name,
  228.            customer_city, salesman_junior_id, salesman_id, sales_supervisor_id,
  229.            sales_manager_id, saso_id, bod_id, salesman_handle_id, salesman_handle_code,
  230.            salesman_handle_name, salesman_handle_level, group_brand, curr_code,
  231.            target_sales, q1_amount, q2_amount, q3_amount, flg_target
  232.         )
  233.         SELECT $1, A.tenant_id, A.customer_id, A.customer_code, A.customer_name,
  234.            A.customer_city, A.salesman_junior_id, A.salesman_id, A.sales_supervisor_id,
  235.            A.sales_manager_id, A.saso_id, A.bod_id, A.salesman_handle_id, f_get_partner_code(A.salesman_handle_id) AS salesman_handle_code,
  236.            f_get_partner_name(A.salesman_handle_id) AS salesman_handle_name, f_get_salesman_level(A.salesman_handle_id) AS salesman_handle_level, A.group_brand, $4,
  237.            $6, $6, $6, $6, $11
  238.         FROM tt_salesman_customer A
  239.         WHERE EXISTS (
  240.             SELECT 1
  241.             FROM m_partner_ou D
  242.             INNER JOIN m_ou_structure E
  243.                 ON ( E.ou_bu_id = D.ou_id
  244.                     OR E.ou_branch_id = D.ou_id
  245.                     OR E.ou_sub_bu_id = D.ou_id )
  246.             WHERE A.salesman_handle_id = D.partner_id
  247.                 AND e.ou_id = $10
  248.         ) AND f_get_salesman_level(A.salesman_handle_id) >= $13'
  249.     USING pSessionId, pTenantId, pPeriod, vEmptyId, vEmptyValue, vZero, pUserId, pRoleId, vFlagYes, pOuId, vFlagNo, vSalesmanLevel, vPositionLevelManager;
  250.    
  251.     -- Update target dari tiap customer
  252.     -- Jika tidak memiliki target, tidak ditampilkan
  253.     UPDATE tt_salesman_customer_info_for_report_achievement_and_target A
  254.     SET curr_code = B.curr_code,
  255.         target_sales = B.target_sales,
  256.         q1_amount = B.q1_amount,
  257.         q2_amount = B.q2_amount,
  258.         q3_amount = B.q3_amount,
  259.         flg_target = vFlagYes
  260.     FROM m_customer_target_sales B
  261.     WHERE B.tenant_id = A.tenant_id
  262.         AND A.customer_id = B.customer_id
  263.         AND B.year = pYear
  264.         AND B.group_brand = A.group_brand;
  265.        
  266.     --Temporary Sales Invoice
  267.     EXECUTE
  268.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  269.         session_id, tenant_id, ou_id,
  270.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  271.         status_doc, workflow_status,
  272.         group_brand_parent_code
  273.     )
  274.     SELECT DISTINCT ON (D.so_id) $1, A.tenant_id, C.ou_id,
  275.         C.invoice_temp_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  276.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  277.         G.code
  278.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  279.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  280.     INNER JOIN sl_invoice_temp C ON C.invoice_temp_id = B.invoice_ar_id
  281.     INNER JOIN sl_so_info D ON D.so_id = C.ref_id
  282.     INNER JOIN sl_so_brand_item E ON E.so_id = D.so_id
  283.     INNER JOIN m_brand_ext F ON F.brand_id = E.brand_id
  284.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  285.     WHERE A.session_id = $1 AND
  286.         C.tenant_id = $2 AND
  287.         C.ou_id = $3 AND
  288.         B.doc_type_id = $4 AND
  289.         C.ref_doc_type_id = $5 AND
  290.         D.flg_type_so = $6 AND
  291.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  292.         G.combo_id = $9 AND
  293.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  294.     USING pSessionId, pTenantId, pOuId, vDocTypeIdInvoiceTemp, vDocTypeIdSOB, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  295.        
  296.     --Sales Invoice
  297.     EXECUTE
  298.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  299.         session_id, tenant_id, ou_id,
  300.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  301.         status_doc, workflow_status,
  302.         group_brand_parent_code
  303.     )
  304.     SELECT DISTINCT ON (D.so_id) $1, A.tenant_id, C.ou_id,
  305.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  306.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  307.         G.code
  308.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  309.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  310.     INNER JOIN sl_invoice C ON C.invoice_id = B.invoice_ar_id
  311.     INNER JOIN sl_so_info D ON D.so_id = C.ref_id
  312.     INNER JOIN sl_so_brand_item E ON E.so_id = D.so_id
  313.     INNER JOIN m_brand_ext F ON F.brand_id = E.brand_id
  314.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  315.     WHERE A.session_id = $1 AND
  316.         C.tenant_id = $2 AND
  317.         C.ou_id = $3 AND
  318.         B.doc_type_id = $4 AND
  319.         C.ref_doc_type_id = $5 AND
  320.         D.flg_type_so = $6 AND
  321.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  322.         G.combo_id = $9 AND
  323.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  324.     USING pSessionId, pTenantId, pOuId, vDocTypeIdSalesInvoice, vDocTypeIdSOB, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  325.    
  326.     --Return
  327.     EXECUTE
  328.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  329.         session_id, tenant_id, ou_id,
  330.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  331.         status_doc, workflow_status,
  332.         group_brand_parent_code
  333.     )
  334.     SELECT DISTINCT ON (D.request_return_sales_id) $1, A.tenant_id, C.ou_id,
  335.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  336.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  337.         G.code
  338.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  339.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  340.     INNER JOIN sl_invoice C ON C.invoice_id = B.invoice_ar_id
  341.     INNER JOIN sl_request_return_sales_brand_item D ON D.request_return_sales_id = C.ref_id
  342.     INNER JOIN m_brand_ext F ON F.brand_id = D.brand_id
  343.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  344.     WHERE A.session_id = $1 AND
  345.         C.tenant_id = $2 AND
  346.         C.ou_id = $3 AND
  347.         B.doc_type_id = $4 AND
  348.         C.ref_doc_type_id = $5 AND
  349.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  350.         G.combo_id = $9 AND
  351.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  352.     USING pSessionId, pTenantId, pOuId, vDocTypeIdReturnInvoice, vDocTypeIdRRS, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  353.    
  354.     --CN AR
  355.     EXECUTE
  356.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  357.         session_id, tenant_id, ou_id,
  358.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  359.         status_doc, workflow_status,
  360.         group_brand_parent_code
  361.     )
  362.     SELECT $1, A.tenant_id, C.ou_id,
  363.         C.invoice_ar_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  364.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  365.         G.code
  366.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  367.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  368.     INNER JOIN fi_invoice_ar C ON C.invoice_ar_id = B.invoice_ar_id
  369.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  370.     WHERE A.session_id = $1 AND
  371.         C.tenant_id = $2 AND
  372.         C.ou_id = $3 AND
  373.         B.doc_type_id = $4 AND
  374.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  375.         G.combo_id = $9 AND
  376.         EXISTS(
  377.             SELECT 1
  378.             FROM fi_invoice_ar_cost D
  379.             WHERE D.invoice_ar_id = C.invoice_ar_id AND
  380.                 f_get_activity_gl_code(D.activity_gl_id) = ANY (string_to_array (f_get_value_system_config_by_param_code($2, $13 || G.code), $12))
  381.         )'
  382.     USING pSessionId, pTenantId, pOuId, vDocTypeIdCNAR, vDocTypeIdCNAR, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote, vConfigSeparator, vConfigPrefix;
  383.    
  384.     --DN AR
  385.     EXECUTE
  386.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  387.         session_id, tenant_id, ou_id,
  388.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  389.         status_doc, workflow_status,
  390.         group_brand_parent_code
  391.     )
  392.     SELECT $1, A.tenant_id, C.ou_id,
  393.         C.invoice_ar_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  394.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  395.         G.code
  396.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  397.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  398.     INNER JOIN fi_invoice_ar C ON C.invoice_ar_id = B.invoice_ar_id
  399.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  400.     WHERE A.session_id = $1 AND
  401.         C.tenant_id = $2 AND
  402.         C.ou_id = $3 AND
  403.         B.doc_type_id = $4 AND
  404.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  405.         G.combo_id = $9 AND
  406.         EXISTS(
  407.             SELECT 1
  408.             FROM fi_invoice_ar_cost D
  409.             WHERE D.invoice_ar_id = C.invoice_ar_id AND
  410.                 f_get_activity_gl_code(D.activity_gl_id) = ANY (string_to_array (f_get_value_system_config_by_param_code($2, $13 || G.code), $12))
  411.         )'
  412.     USING pSessionId, pTenantId, pOuId, vDocTypeIdDNAR, vDocTypeIdDNAR, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote, vConfigSeparator, vConfigPrefix;
  413.    
  414.     -- Header
  415.     Open pRefHeader FOR
  416.         SELECT f_get_partner_name(pSalesmanId) AS salesman_name, vDateTo AS date_to, vLastYear AS last_year, pYear AS current_year;
  417.     RETURN NEXT pRefHeader;
  418.    
  419.     -- Ambil data awal untuk perhitungan summary
  420.     -- Jumlah achievement adalah total tahun ini
  421.     WITH tt_grouped_summary AS (
  422.         SELECT A.tenant_id, A.salesman_handle_id AS salesman_id,  
  423.             A.target_sales AS target,
  424.             SUM(COALESCE(B.amount, 0)) AS year_to_date_accumulative_amount,
  425.             A.salesman_handle_level AS salesman_level,
  426.             A.group_brand AS group_brand_parent_code
  427.         FROM tt_salesman_customer_info_for_report_achievement_and_target A
  428.         LEFT JOIN tt_achievement_transaction_for_report_achievement_and_target B
  429.             ON B.partner_id = A.customer_id AND
  430.                 B.tenant_id = A.tenant_id AND
  431.                 SUBSTR(B.doc_date, 1, 4) = pYear AND
  432.                 B.group_brand_parent_code = A.group_brand AND
  433.                 A.session_id = B.session_id
  434.         WHERE A.session_id = pSessionId AND
  435.             A.tenant_id = pTenantId AND
  436.             A.flg_target = vFlagYes
  437.         GROUP BY A.tenant_id, A.salesman_handle_id, A.target_sales, A.salesman_handle_level, A.group_brand, B.partner_id
  438.     )
  439.     INSERT INTO tt_summary_for_report_achievement_and_target (
  440.         session_id, tenant_id,
  441.         salesman_id,
  442.         original_target_amount,
  443.         target_amount,
  444.         original_year_to_date_accumulative_amount,
  445.         year_to_date_accumulative_amount,
  446.         salesman_level, group_brand_parent_code,
  447.         salesman_handle_id, salesman_handle_level
  448.     )
  449.     SELECT pSessionId, A.tenant_id,
  450.         A.salesman_id,  
  451.         SUM(A.target) AS target,
  452.         SUM(A.target) AS target,
  453.         SUM(A.year_to_date_accumulative_amount) AS year_to_date_accumulative_amount,
  454.         SUM(A.year_to_date_accumulative_amount) AS year_to_date_accumulative_amount,
  455.         A.salesman_level,
  456.         A.group_brand_parent_code,
  457.         A.salesman_id, A.salesman_level
  458.     FROM tt_grouped_summary A
  459.     GROUP BY A.tenant_id, A.salesman_id, A.salesman_level, A.group_brand_parent_code;
  460.    
  461.     --Insert atasan dari salesman_handle yang belum ada pada table
  462.     PERFORM f_insert_leader_summary_for_report_achievment_vs_target(pSessionId, pTenantId, A.salesman_id, A.group_brand_parent_code, vSalesmanLevel)
  463.     FROM tt_summary_for_report_achievement_and_target A
  464.     WHERE A.session_id = pSessionId AND
  465.         A.tenant_id = pTenantId;
  466.    
  467.     -- Jumlahkan summary atasan dengan summary bawahannya
  468.     -- Mulai dari level paling bawah (Salesman Manager)
  469.     WHILE ((i >= vSalesmanLevel)
  470.             AND (i >= vPositionLevelManager))LOOP
  471.         PERFORM f_get_total_achievement_for_report_achievement_vs_target(pSessionId, pTenantId, A.salesman_id, A.salesman_level, A.group_brand_parent_code, A.salesman_handle_id, A.salesman_handle_level)
  472.         FROM tt_summary_for_report_achievement_and_target A
  473.         WHERE A.session_id = pSessionId AND
  474.             A.tenant_id = pTenantId AND
  475.             A.salesman_level = i;
  476.         i := i - 1 ;
  477.     END LOOP ;
  478.    
  479.     --Summary
  480.     Open pRefDetailSummary FOR
  481.         SELECT f_get_partner_name(A.salesman_id) AS salesman_name,
  482.             ROUND(SUM(A.target_amount), vDecimalNo) AS target_amount,
  483.             ROUND(SUM(A.year_to_date_accumulative_amount), vDecimalNo) AS year_to_date_accumulative_amount
  484.         FROM tt_summary_for_report_achievement_and_target A
  485.             WHERE A.session_id = pSessionId AND
  486.                 A.tenant_id = pTenantId AND
  487.                 A.salesman_id <> vEmptyId AND
  488.                 A.salesman_level >= vSalesmanLevel
  489.             GROUP BY A.tenant_id, A.salesman_id, A.salesman_level
  490.         ORDER BY salesman_name;
  491.     RETURN NEXT pRefDetailSummary;
  492.    
  493.     -- Set sequence untuk line no menjadi 0
  494.     PERFORM SETVAL('r_achievement_vs_target_line_no_seq', 0);
  495.    
  496.     -- Detail
  497.     -- Hanya tampilkan nama salesman tiap level (manager, supervisor, salesman senior, salesman junior)
  498.     --  jika levelnya >= level salesman filter
  499.     -- Achievement tiap quarter dikelompokkan berdasarkan doc date
  500.     Open pRefDetail FOR
  501.         WITH tt_ordered_achievement AS (
  502.             SELECT B.customer_code, B.customer_name, B.customer_city,
  503.                 CASE WHEN ((f_get_partner_name(B.sales_manager_id) <> vSpaceValue)
  504.                         AND (vSalesmanLevel <= f_get_salesman_level(B.sales_manager_id))) THEN
  505.                     f_get_partner_name(B.sales_manager_id)
  506.                 ELSE
  507.                     vDash
  508.                 END AS manager_name,
  509.                 CASE WHEN ((f_get_partner_name(B.sales_supervisor_id) <> vSpaceValue)
  510.                         AND (vSalesmanLevel <= f_get_salesman_level(B.sales_supervisor_id))) THEN
  511.                     f_get_partner_name(B.sales_supervisor_id)
  512.                 ELSE
  513.                     vDash
  514.                 END AS supervisor_name,
  515.                 CASE WHEN ((f_get_partner_name(B.salesman_id) <> vSpaceValue)
  516.                         AND (vSalesmanLevel <= f_get_salesman_level(B.salesman_id))) THEN
  517.                     f_get_partner_name(B.salesman_id)
  518.                 ELSE
  519.                     vDash
  520.                 END AS senior_sales_name,
  521.                 CASE WHEN ((f_get_partner_name(B.salesman_junior_id) <> vSpaceValue)
  522.                         AND (vSalesmanLevel <= f_get_salesman_level(B.salesman_junior_id))) THEN
  523.                     f_get_partner_name(B.salesman_junior_id)
  524.                 ELSE
  525.                     vDash
  526.                 END AS junior_sales_name,
  527.                 ROUND(SUM(
  528.                     CASE WHEN C.year_date = vLastYear THEN
  529.                         COALESCE(A.amount, 0)
  530.                     ELSE
  531.                         0
  532.                     END
  533.                 ), vDecimalNo) AS last_year_achievement_amount,
  534.                 ROUND(B.target_sales, vDecimalNo) AS current_year_target_amount, ROUND(B.q1_amount, vDecimalNo) AS q1_amount, ROUND(B.q2_amount, vDecimalNo) AS q2_amount, ROUND(B.q3_amount, vDecimalNo) AS q3_amount,
  535.                 ROUND(SUM(
  536.                     CASE WHEN C.year_date = pYear THEN
  537.                         COALESCE(A.amount, 0)
  538.                     ELSE
  539.                         0
  540.                     END
  541.                 ), vDecimalNo) AS year_to_date_amount,
  542.                 ROUND(SUM(
  543.                     CASE WHEN C.q_no = 1 AND C.year_date = pYear THEN
  544.                         COALESCE(A.amount, 0)
  545.                     ELSE
  546.                         0
  547.                     END
  548.                 ), vDecimalNo) AS q1_achievement_amount,
  549.                 ROUND(SUM(
  550.                     CASE WHEN C.q_no = 2 AND C.year_date = pYear THEN
  551.                         COALESCE(A.amount, 0)
  552.                     ELSE
  553.                         0
  554.                     END
  555.                 ), vDecimalNo) AS q2_achievement_amount,
  556.                 ROUND(SUM(
  557.                     CASE WHEN C.q_no = 3 AND C.year_date = pYear THEN
  558.                         COALESCE(A.amount, 0)
  559.                     ELSE
  560.                         0
  561.                     END
  562.                 ), vDecimalNo) AS q3_achievement_amount
  563.             FROM tt_salesman_customer_info_for_report_achievement_and_target B
  564.             LEFT JOIN tt_achievement_transaction_for_report_achievement_and_target A
  565.                 ON A.partner_id = B.customer_id AND
  566.                     A.tenant_id = B.tenant_id AND
  567.                     A.group_brand_parent_code = B.group_brand AND
  568.                     A.partner_id = B.customer_id AND
  569.                     A.session_id = B.session_id
  570.             LEFT JOIN dt_date C ON A.doc_date = C.string_date
  571.             WHERE B.session_id = pSessionId
  572.                 AND (B.customer_code <> vEmptyValue OR B.customer_name <> vEmptyValue)
  573.                 AND B.flg_target = vFlagYes
  574.             GROUP BY B.customer_code, B.customer_name, B.customer_city,
  575.                 B.sales_manager_id, B.sales_supervisor_id, B.salesman_id, B.salesman_junior_id,
  576.                 B.target_sales, B.q1_amount, B.q2_amount, B.q3_amount, group_brand_parent_code
  577.             ORDER BY manager_name, supervisor_name, senior_sales_name, customer_city, year_to_date_amount DESC
  578.         )
  579.         SELECT NEXTVAL('r_achievement_vs_target_line_no_seq') AS line_no,
  580.             A.customer_code, A.customer_name, A.customer_city,
  581.             A.manager_name, A.supervisor_name, A.senior_sales_name, A.junior_sales_name,
  582.             A.last_year_achievement_amount, A.current_year_target_amount,
  583.             A.q1_amount, A.q2_amount, A.q3_amount,
  584.             A.year_to_date_amount,
  585.             A.q1_achievement_amount, A.q2_achievement_amount, A.q3_achievement_amount
  586.         FROM tt_ordered_achievement A
  587.         ORDER BY line_no;
  588.     RETURN NEXT pRefDetail;
  589.        
  590.     -- Hapus isi table temporary
  591.     DELETE FROM tt_salesman_customer_info_for_report_achievement_and_target WHERE session_id = pSessionId;
  592.     DELETE FROM tt_achievement_transaction_for_report_achievement_and_target WHERE session_id = pSessionId;
  593.     DELETE FROM tt_summary_for_report_achievement_and_target WHERE session_id = pSessionId;
  594.    
  595. END;
  596. $BODY$
  597.   LANGUAGE plpgsql VOLATILE
  598.   COST 100
  599.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement