Advertisement
aadddrr

r_achievement_vs_target_csv_with_summary_BACKUP

Apr 11th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_achievement_vs_target_csv_with_summary(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.    
  64. BEGIN
  65.    
  66.     vPartnerCodeMou := ' ';
  67.     vPartnerNameMou := ' ';
  68.     vDocTypeIdSOByBrand := 398;
  69.     vStatusReleased := 'R';
  70.     vStatusFinal := 'F';
  71.     vStatusInProgress := 'I';
  72.     vStatusDraft := 'D';
  73.     vDocTypeIdReturnNote := 502;
  74.     vDocTypeIdSalesInvoice := 321;
  75.     vDocTypeIdInvoiceTemp := 361;
  76.     vDocTypeIdRRS :=381;
  77.     vStatusMapping := 'M';
  78.     vStatusApproved := 'A';
  79.     vRaw := 'RAW';
  80.     vSummary := 'SUMMARY';
  81.     vEmptyId := -99;
  82.     vEmptyValue := '';
  83.     vEndDate := '1231';
  84.     vFlgTypeSOReg := 'REG';
  85.     vZero := 0;
  86.     vDocTypeIdSOB := 398;
  87.     vComboGroupBrand := 'GROUPBRANDPARENT';
  88.     vArraySeparator := ', ';
  89.     vQuote := '''';
  90.     vDocTypeIdReturnInvoice := 380;
  91.     vDocTypeIdCNAR := 251;
  92.     vDocTypeIdDNAR := 241;
  93.     i := 0;
  94.     vFilterCustomer := '';
  95.     vDecimalNo := 2;
  96.     vFilterGroupBrand := '';
  97.     vConfigSeparator := ';';
  98.     vConfigPrefix := 'ACTIVITY_GL_GROUP_BRAND_';
  99.    
  100.     SELECT TO_CHAR(current_timestamp, 'YYYY') INTO vSystemCurrentYear;
  101.     SELECT TO_CHAR(TO_DATE(pYear,'YYYY') - INTERVAL '1 Year','YYYY') INTO vLastYear;
  102.    
  103.     IF (pYear >= vSystemCurrentYear) THEN
  104.         SELECT TO_CHAR(current_timestamp, 'YYYYMMDD') INTO vDateTo;
  105.     ELSIF (pYear < vSystemCurrentYear) THEN
  106.         SELECT pYear || vEndDate INTO vDateTo;
  107.     END IF;
  108.    
  109.     IF (pCustomerId <> vEmptyId) THEN
  110.         vFilterCustomer := ' AND D.customer_id = '|| pCustomerId ||' ';
  111.     END IF;
  112.    
  113.     IF (pGroupBrand <> vEmptyValue) THEN
  114.         vFilterGroupBrand := ' AND A.group_brand = '''|| pGroupBrand ||''' ';
  115.     END IF;
  116.    
  117.     DELETE FROM tt_salesman_from_salesman_hierarchy WHERE session_id = pSessionId;
  118.     DELETE FROM tt_salesman_customer_info_for_report_achievement_and_target WHERE session_id = pSessionId;
  119.     DELETE FROM tt_achievement_transaction_for_report_achievement_and_target WHERE session_id = pSessionId;
  120.     DELETE FROM tt_summary_for_report_achievement_and_target WHERE session_id = pSessionId;
  121.  
  122.     --Mendapatkan daftar salesman dalam hierarchy periode
  123.     PERFORM f_get_salesman_from_salesman_hierarchy(pSessionId, pTenantId, pSalesmanId, pPeriod, pUserId);
  124.    
  125.     EXECUTE
  126.         'WITH grouped_salesman AS (
  127.             SELECT DISTINCT A.tenant_id, A.sales_child_id, A.group_brand, A.level
  128.             FROM tt_salesman_from_salesman_hierarchy A
  129.             WHERE A.session_id = $1 AND
  130.                 A.tenant_id = $2 AND
  131.                 $3 BETWEEN A.period_from AND A.period_to
  132.         )
  133.         INSERT INTO tt_salesman_customer_info_for_report_achievement_and_target (
  134.             session_id, tenant_id, customer_id, customer_code, customer_name, customer_city,
  135.             salesman_id, salesman_code, salesman_name, salesman_level, group_brand,
  136.             target_sales, q1_amount, q2_amount, q3_amount, flg_target  
  137.         )
  138.         SELECT DISTINCT $1, A.tenant_id, COALESCE(D.customer_id, $4), COALESCE(E.partner_code, $5), COALESCE(E.partner_name, $5), COALESCE(I.city, $5),
  139.             A.sales_child_id, C.partner_code, C.partner_name, A.level, A.group_brand,
  140.             $6, $6, $6, $6, $11
  141.         FROM grouped_salesman A
  142.         INNER JOIN m_partner C
  143.             ON A.sales_child_id = C.partner_id
  144.                 AND A.tenant_id = C.tenant_id
  145.         LEFT JOIN m_salesman_to_customer D
  146.             ON A.tenant_id = D.tenant_id
  147.                 AND A.sales_child_id = D.salesman_id
  148.                 AND A.group_brand = D.group_brand
  149.                 AND $3 BETWEEN D.period_from AND D.period_to
  150.         LEFT JOIN m_partner E
  151.             ON D.customer_id = E.partner_id
  152.                 AND D.tenant_id = E.tenant_id
  153.         LEFT JOIN m_ctgr_partner F
  154.             ON F.tenant_id = E.tenant_id
  155.                 AND F.ctgr_partner_id = F.ctgr_partner_id
  156.         LEFT JOIN t_user_role G
  157.             ON G.user_id = $7
  158.                 AND G.role_id = $8
  159.         LEFT JOIN m_policy_partner H
  160.             ON H.ctgr_partner_id = F.ctgr_partner_id
  161.                 AND H.user_role_id = G.user_role_id
  162.         LEFT JOIN m_partner_address I
  163.             ON I.tenant_id = E.tenant_id
  164.                 AND I.partner_id = E.partner_id
  165.                 AND I.flg_default = $9
  166.         WHERE EXISTS (
  167.             SELECT 1
  168.             FROM m_partner_ou D
  169.             INNER JOIN m_ou_structure E
  170.                 ON ( E.ou_bu_id = D.ou_id
  171.                     OR E.ou_branch_id = D.ou_id
  172.                     OR E.ou_sub_bu_id = D.ou_id )
  173.             WHERE C.partner_id = D.partner_id
  174.                 AND e.ou_id = $10
  175.         ) ' || vFilterCustomer
  176.         || vFilterGroupBrand
  177.     USING pSessionId, pTenantId, pPeriod, vEmptyId, vEmptyValue, vZero, pUserId, pRoleId, vFlagYes, pOuId, vFlagNo;
  178.                
  179.     UPDATE tt_salesman_customer_info_for_report_achievement_and_target A
  180.     SET curr_code = B.curr_code,
  181.         target_sales = B.target_sales,
  182.         q1_amount = B.q1_amount,
  183.         q2_amount = B.q2_amount,
  184.         q3_amount = B.q3_amount,
  185.         flg_target = vFlagYes
  186.     FROM m_customer_target_sales B
  187.     WHERE B.tenant_id = A.tenant_id
  188.         AND A.customer_id = B.customer_id
  189.         AND B.year = pYear
  190.         AND B.group_brand = A.group_brand;
  191.        
  192.     --Temporary Sales Invoice
  193.     EXECUTE
  194.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  195.         session_id, tenant_id, ou_id,
  196.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  197.         status_doc, workflow_status,
  198.         group_brand_parent_code
  199.     )
  200.     SELECT DISTINCT ON (D.so_id) $1, A.tenant_id, C.ou_id,
  201.         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,
  202.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  203.         G.code
  204.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  205.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  206.     INNER JOIN sl_invoice_temp C ON C.invoice_temp_id = B.invoice_ar_id
  207.     INNER JOIN sl_so_info D ON D.so_id = C.ref_id
  208.     INNER JOIN sl_so_brand_item E ON E.so_id = D.so_id
  209.     INNER JOIN m_brand_ext F ON F.brand_id = E.brand_id
  210.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  211.     WHERE A.session_id = $1 AND
  212.         C.tenant_id = $2 AND
  213.         C.ou_id = $3 AND
  214.         B.doc_type_id = $4 AND
  215.         C.ref_doc_type_id = $5 AND
  216.         D.flg_type_so = $6 AND
  217.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  218.         G.combo_id = $9 AND
  219.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  220.     USING pSessionId, pTenantId, pOuId, vDocTypeIdInvoiceTemp, vDocTypeIdSOB, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  221.        
  222.     --Sales Invoice
  223.     EXECUTE
  224.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  225.         session_id, tenant_id, ou_id,
  226.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  227.         status_doc, workflow_status,
  228.         group_brand_parent_code
  229.     )
  230.     SELECT DISTINCT ON (D.so_id) $1, A.tenant_id, C.ou_id,
  231.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  232.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  233.         G.code
  234.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  235.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  236.     INNER JOIN sl_invoice C ON C.invoice_id = B.invoice_ar_id
  237.     INNER JOIN sl_so_info D ON D.so_id = C.ref_id
  238.     INNER JOIN sl_so_brand_item E ON E.so_id = D.so_id
  239.     INNER JOIN m_brand_ext F ON F.brand_id = E.brand_id
  240.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  241.     WHERE A.session_id = $1 AND
  242.         C.tenant_id = $2 AND
  243.         C.ou_id = $3 AND
  244.         B.doc_type_id = $4 AND
  245.         C.ref_doc_type_id = $5 AND
  246.         D.flg_type_so = $6 AND
  247.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  248.         G.combo_id = $9 AND
  249.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  250.     USING pSessionId, pTenantId, pOuId, vDocTypeIdSalesInvoice, vDocTypeIdSOB, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  251.    
  252.     --Return
  253.     EXECUTE
  254.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  255.         session_id, tenant_id, ou_id,
  256.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  257.         status_doc, workflow_status,
  258.         group_brand_parent_code
  259.     )
  260.     SELECT DISTINCT ON (D.request_return_sales_id) $1, A.tenant_id, C.ou_id,
  261.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, B.curr_code, B.amount,
  262.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  263.         G.code
  264.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  265.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  266.     INNER JOIN sl_invoice C ON C.invoice_id = B.invoice_ar_id
  267.     INNER JOIN sl_request_return_sales_brand_item D ON D.request_return_sales_id = C.ref_id
  268.     INNER JOIN m_brand_ext F ON F.brand_id = D.brand_id
  269.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  270.     WHERE A.session_id = $1 AND
  271.         C.tenant_id = $2 AND
  272.         C.ou_id = $3 AND
  273.         B.doc_type_id = $4 AND
  274.         C.ref_doc_type_id = $5 AND
  275.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  276.         G.combo_id = $9 AND
  277.         $11 || F.group_brand || $11 = ANY (string_to_array (G.prop_key, $10))'
  278.     USING pSessionId, pTenantId, pOuId, vDocTypeIdReturnInvoice, vDocTypeIdRRS, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote;
  279.    
  280.     --CN AR
  281.     EXECUTE
  282.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  283.         session_id, tenant_id, ou_id,
  284.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  285.         status_doc, workflow_status,
  286.         group_brand_parent_code
  287.     )
  288.     SELECT $1, A.tenant_id, C.ou_id,
  289.         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,
  290.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  291.         G.code
  292.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  293.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  294.     INNER JOIN fi_invoice_ar C ON C.invoice_ar_id = B.invoice_ar_id
  295.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  296.     WHERE A.session_id = $1 AND
  297.         C.tenant_id = $2 AND
  298.         C.ou_id = $3 AND
  299.         B.doc_type_id = $4 AND
  300.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  301.         G.combo_id = $9 AND
  302.         EXISTS(
  303.             SELECT 1
  304.             FROM fi_invoice_ar_cost D
  305.             WHERE D.invoice_ar_id = C.invoice_ar_id AND
  306.                 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))
  307.         )'
  308.     USING pSessionId, pTenantId, pOuId, vDocTypeIdCNAR, vDocTypeIdCNAR, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote, vConfigSeparator, vConfigPrefix;
  309.    
  310.     --DN AR
  311.     EXECUTE
  312.     'INSERT INTO tt_achievement_transaction_for_report_achievement_and_target (
  313.         session_id, tenant_id, ou_id,
  314.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  315.         status_doc, workflow_status,
  316.         group_brand_parent_code
  317.     )
  318.     SELECT $1, A.tenant_id, C.ou_id,
  319.         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,
  320.         C.status_doc AS status_doc_invoice_temp, C.workflow_status,
  321.         G.code
  322.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  323.     INNER JOIN fi_invoice_ar_balance B ON B.partner_id = A.customer_id
  324.     INNER JOIN fi_invoice_ar C ON C.invoice_ar_id = B.invoice_ar_id
  325.     INNER JOIN t_combo_value G ON A.group_brand = G.code
  326.     WHERE A.session_id = $1 AND
  327.         C.tenant_id = $2 AND
  328.         C.ou_id = $3 AND
  329.         B.doc_type_id = $4 AND
  330.         SUBSTR(C.doc_date, 1, 4) BETWEEN $7 AND $8 AND
  331.         G.combo_id = $9 AND
  332.         EXISTS(
  333.             SELECT 1
  334.             FROM fi_invoice_ar_cost D
  335.             WHERE D.invoice_ar_id = C.invoice_ar_id AND
  336.                 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))
  337.         )'
  338.     USING pSessionId, pTenantId, pOuId, vDocTypeIdDNAR, vDocTypeIdDNAR, vFlgTypeSOReg, vLastYear, pYear, vComboGroupBrand, vArraySeparator, vQuote, vConfigSeparator, vConfigPrefix;
  339.    
  340.     WITH tt_grouped_summary AS (
  341.         SELECT A.tenant_id, A.salesman_id,  
  342.             A.target_sales AS target,
  343.             SUM(COALESCE(B.amount, 0)) AS year_to_date_accumulative_amount,
  344.             A.salesman_level,
  345.             A.group_brand AS group_brand_parent_code
  346.         FROM tt_salesman_customer_info_for_report_achievement_and_target A
  347.         LEFT JOIN tt_achievement_transaction_for_report_achievement_and_target B
  348.             ON B.partner_id = A.customer_id AND
  349.                 B.tenant_id = A.tenant_id AND
  350.                 SUBSTR(B.doc_date, 1, 4) = pYear AND
  351.                 B.group_brand_parent_code = A.group_brand
  352.         WHERE A.session_id = pSessionId AND
  353.             A.tenant_id = pTenantId AND
  354.             A.flg_target = vFlagYes
  355.         GROUP BY A.tenant_id, A.salesman_id, A.target_sales, A.salesman_level, A.group_brand, B.partner_id
  356.     )
  357.     INSERT INTO tt_summary_for_report_achievement_and_target (
  358.         session_id, tenant_id, salesman_id,
  359.         target_amount,
  360.         year_to_date_accumulative_amount,
  361.         salesman_level, group_brand_parent_code
  362.     )
  363.     SELECT pSessionId, A.tenant_id, A.salesman_id,  
  364.             SUM(A.target) AS target,
  365.             SUM(A.year_to_date_accumulative_amount) AS year_to_date_accumulative_amount,
  366.             A.salesman_level,
  367.             A.group_brand_parent_code
  368.     FROM tt_grouped_summary A
  369.     GROUP BY A.tenant_id, A.salesman_id, A.salesman_level, A.group_brand_parent_code;
  370.    
  371.     --Ambil level terendah dari salesman
  372.     SELECT MAX(A.salesman_level) - 1
  373.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  374.     WHERE A.session_id = pSessionId AND
  375.         A.tenant_id = pTenantId INTO i;
  376.    
  377.     WHILE i >= 1 LOOP
  378.         /*Ambil juga data salesman yang tidak memiliki target,
  379.             tetapi memiliki bawahan yang memiliki target*/
  380.         WITH tt_grouped_summary AS (
  381.             SELECT A.tenant_id, A.salesman_id,  
  382.                 0 AS target,
  383.                 0 AS year_to_date_accumulative_amount,
  384.                 A.salesman_level,
  385.                 A.group_brand AS group_brand_parent_code
  386.             FROM tt_salesman_customer_info_for_report_achievement_and_target A
  387.             INNER JOIN tt_salesman_from_salesman_hierarchy B
  388.                 ON A.session_id = B.session_id AND
  389.                     A.tenant_id = B.tenant_id AND
  390.                     A.salesman_id = B.salesman_id AND
  391.                     A.group_brand = B.group_brand
  392.             INNER JOIN tt_summary_for_report_achievement_and_target C
  393.                 ON B.session_id = C.session_id AND
  394.                     B.tenant_id = C.tenant_id AND
  395.                     B.sales_child_id = C.salesman_id AND
  396.                     B.group_brand = C.group_brand_parent_code
  397.             WHERE A.session_id = pSessionId AND
  398.                 A.tenant_id = pTenantId AND
  399.                 A.flg_target = vFlagNo AND
  400.                 B.sales_child_id <> B.salesman_id AND
  401.                 A.salesman_level = i
  402.             GROUP BY A.tenant_id, A.salesman_id, A.salesman_level, A.group_brand
  403.         )
  404.         INSERT INTO tt_summary_for_report_achievement_and_target (
  405.             session_id, tenant_id, salesman_id,
  406.             target_amount,
  407.             year_to_date_accumulative_amount,
  408.             salesman_level, group_brand_parent_code
  409.         )
  410.         SELECT pSessionId, A.tenant_id, A.salesman_id,  
  411.                 SUM(A.target) AS target,
  412.                 SUM(A.year_to_date_accumulative_amount) AS year_to_date_accumulative_amount,
  413.                 A.salesman_level,
  414.                 A.group_brand_parent_code
  415.         FROM tt_grouped_summary A
  416.         GROUP BY A.tenant_id, A.salesman_id, A.salesman_level, A.group_brand_parent_code;
  417.    
  418.         i := i - 1 ;
  419.     END LOOP ;
  420.        
  421.     SELECT MAX(A.salesman_level) - 1
  422.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  423.     WHERE A.session_id = pSessionId AND
  424.         A.tenant_id = pTenantId INTO i;
  425.    
  426.     WHILE i >= 1 LOOP
  427.         PERFORM f_get_total_achievement_from_salesman_hierarchy(pSessionId, pTenantId, A.salesman_id, pYear, A.group_brand_parent_code)
  428.         FROM tt_summary_for_report_achievement_and_target A
  429.         WHERE A.session_id = pSessionId AND
  430.             A.tenant_id = pTenantId AND
  431.             A.salesman_level = i;
  432.         i := i - 1 ;
  433.     END LOOP ;
  434.    
  435.     Open pRefHeader FOR
  436.         SELECT 21 AS _COUNT,
  437.             'Nama', 'Target', 'YTD Acv', '% YTD Acv', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
  438.             ';' AS _separator;
  439.     RETURN NEXT pRefHeader;
  440.    
  441.     PERFORM SETVAL('r_achievement_vs_target_line_no_seq', 0);
  442.    
  443.     Open pRefDetail FOR
  444.         WITH tt_ordered_achievement AS (
  445.             SELECT B.customer_code, B.customer_name, B.customer_city,
  446.                 'Septi' AS manager_name, '-' AS supervisor_name, 'Efendi' AS senior_sales_name, B.salesman_name AS junior_sales_name,
  447.                 ROUND(SUM(
  448.                     CASE WHEN C.year_date = vLastYear THEN
  449.                         COALESCE(A.amount, 0)
  450.                     ELSE
  451.                         0
  452.                     END
  453.                 ), vDecimalNo) AS last_year_achievement_amount,
  454.                 B.target_sales AS current_year_target_amount, B.q1_amount, B.q2_amount, B.q3_amount,
  455.                 ROUND(SUM(
  456.                     CASE WHEN C.year_date = pYear THEN
  457.                         COALESCE(A.amount, 0)
  458.                     ELSE
  459.                         0
  460.                     END
  461.                 ), vDecimalNo) AS year_to_date_amount,
  462.                 ROUND(SUM(
  463.                     CASE WHEN C.q_no = 1 AND C.year_date = pYear THEN
  464.                         COALESCE(A.amount, 0)
  465.                     ELSE
  466.                         0
  467.                     END
  468.                 ), vDecimalNo) AS q1_achievement_amount,
  469.                 ROUND(SUM(
  470.                     CASE WHEN C.q_no = 2 AND C.year_date = pYear THEN
  471.                         COALESCE(A.amount, 0)
  472.                     ELSE
  473.                         0
  474.                     END
  475.                 ), vDecimalNo) AS q2_achievement_amount,
  476.                 ROUND(SUM(
  477.                     CASE WHEN C.q_no = 3 AND C.year_date = pYear THEN
  478.                         COALESCE(A.amount, 0)
  479.                     ELSE
  480.                         0
  481.                     END
  482.                 ), vDecimalNo) AS q3_achievement_amount
  483.             FROM tt_salesman_customer_info_for_report_achievement_and_target B
  484.             LEFT JOIN tt_achievement_transaction_for_report_achievement_and_target A
  485.                 ON A.partner_id = B.customer_id AND
  486.                     A.tenant_id = B.tenant_id AND
  487.                     A.group_brand_parent_code = B.group_brand AND
  488.                     A.partner_id = B.customer_id AND
  489.                     A.session_id = B.session_id
  490.             LEFT JOIN dt_date C ON A.doc_date = C.string_date
  491.             WHERE B.session_id = pSessionId
  492.                 AND (B.customer_code <> vEmptyValue OR B.customer_name <> vEmptyValue)
  493.                 AND B.flg_target = vFlagYes
  494.             GROUP BY B.customer_code, B.customer_name, B.customer_city,
  495.                 B.salesman_name,
  496.                 B.target_sales, B.q1_amount, B.q2_amount, B.q3_amount, group_brand_parent_code
  497.             ORDER BY manager_name, supervisor_name, senior_sales_name, customer_city, year_to_date_amount
  498.         ), data_detail AS (
  499.        
  500.             SELECT f_get_partner_name(A.salesman_id) AS no, ROUND(SUM(A.target_amount), vDecimalNo)::character varying AS code,
  501.                 ROUND(SUM(A.year_to_date_accumulative_amount), vDecimalNo)::character varying AS cust_name,
  502.                 (CASE WHEN SUM(A.target_amount) > 0 THEN ROUND(SUM(A.year_to_date_accumulative_amount) * 100 / SUM(A.target_amount), vDecimalNo) ELSE 100 END)::character varying AS kota,
  503.                 vEmptyValue AS manager, vEmptyValue AS spv, vEmptyValue AS senior_sales, vEmptyValue AS junior_sales,
  504.                 vEmptyValue AS last_year_achv, vEmptyValue AS target_current_year, vEmptyValue AS target_q1,
  505.                 vEmptyValue AS target_q2, vEmptyValue AS target_q3, vEmptyValue AS achievment_amount_ytd,
  506.                 vEmptyValue AS achievment_ytd_percentage, vEmptyValue AS achievment_amount_q1,
  507.                 vEmptyValue AS achievment_q1_percentage, vEmptyValue AS achievment_amount_q2,
  508.                 vEmptyValue AS achievment_q2_percentage, vEmptyValue AS achievment_amount_q3,
  509.                 vEmptyValue AS achievment_q3_percentage, 1 AS ordial
  510.             FROM tt_summary_for_report_achievement_and_target A
  511.             WHERE A.session_id = pSessionId AND
  512.                 A.tenant_id = pTenantId
  513.             GROUP BY A.tenant_id, A.salesman_id
  514.            
  515.             UNION ALL
  516.            
  517.             SELECT vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,
  518.             vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue,vEmptyValue, 2 AS ordial
  519.            
  520.             UNION ALL
  521.            
  522.             SELECT 'No', 'Code', 'Cust. Name', 'Kota',
  523.                 'Manager', 'SPV', 'Senior Sales', 'Junior Sales',
  524.                 'Last Year Achv ('||vLastYear||')', 'Target '||pYear,
  525.                 'Target Q1 '||pYear, 'Target Q2 '||pYear, 'Target Q3 '||pYear,
  526.                 'ACHIEVEMENT Amount YTD', 'ACHIEVEMENT YTD %',
  527.                 'ACHIEVEMENT Amount Q1', 'ACHIEVEMENT Q1 %', 'ACHIEVEMENT Amount Q2', 'ACHIEVEMENT Q2 %', 'ACHIEVEMENT Amount Q3', 'ACHIEVEMENT Q3 %', 3 AS ordial
  528.            
  529.             UNION ALL
  530.            
  531.             SELECT (row_number() OVER ())::character varying AS no, A.customer_code, A.customer_name, A.customer_city,
  532.                 A.manager_name, A.supervisor_name, A.senior_sales_name, A.junior_sales_name,
  533.                 A.last_year_achievement_amount::character varying, A.current_year_target_amount::character varying,
  534.                 ROUND(A.q1_amount, vDecimalNo)::character varying, ROUND(A.q2_amount, vDecimalNo)::character varying, ROUND(A.q3_amount, vDecimalNo)::character varying,
  535.                 A.year_to_date_amount::character varying, (CASE WHEN A.current_year_target_amount > 0 THEN ROUND(A.year_to_date_amount * 100 / A.current_year_target_amount, vDecimalNo) ELSE 100 END)::character varying,
  536.                 A.q1_achievement_amount::character varying, (CASE WHEN A.q1_amount > 0 THEN ROUND(A.q1_achievement_amount * 100 / A.q1_amount, vDecimalNo) ELSE 100 END)::character varying,
  537.                 A.q2_achievement_amount::character varying, (CASE WHEN A.q2_amount > 0 THEN ROUND(A.q2_achievement_amount * 100 / A.q2_amount, vDecimalNo) ELSE 100 END)::character varying,
  538.                 A.q3_achievement_amount::character varying, (CASE WHEN A.q3_amount > 0 THEN ROUND(A.q3_achievement_amount * 100 / A.q3_amount, vDecimalNo) ELSE 100 END)::character varying,
  539.                 row_number() OVER () + 3 AS ordial
  540.             FROM tt_ordered_achievement A
  541.            
  542.             ORDER BY ordial, no
  543.        
  544.         ), summary_detail AS (
  545.             SELECT ROUND(SUM(A.last_year_achievement_amount), vDecimalNo)::character varying AS last_year_achv,
  546.                     ROUND(SUM(A.current_year_target_amount), vDecimalNo)::character varying AS target_current_year,
  547.                     ROUND(SUM(A.q1_amount), vDecimalNo)::character varying AS target_q1,
  548.                     ROUND(SUM(A.q2_amount), vDecimalNo)::character varying AS target_q2,
  549.                     ROUND(SUM(A.q3_amount), vDecimalNo)::character varying AS target_q3,
  550.                     ROUND(SUM(A.year_to_date_amount), vDecimalNo)::character varying AS achievment_amount_ytd,
  551.                     (CASE WHEN SUM(A.current_year_target_amount) > 0 THEN ROUND(SUM(A.year_to_date_amount) * 100 / SUM(A.current_year_target_amount), vDecimalNo) ELSE 100 END)::character varying AS achievment_ytd_percentage,
  552.                     ROUND(SUM(A.q1_achievement_amount), vDecimalNo)::character varying AS achievment_amount_q1,
  553.                     (CASE WHEN SUM(A.q1_amount) > 0 THEN ROUND(SUM(A.q1_achievement_amount) * 100 / SUM(A.q1_amount), vDecimalNo) ELSE 100 END)::character varying AS achievment_q1_percentage,
  554.                     ROUND(SUM(A.q2_achievement_amount), vDecimalNo)::character varying AS achievment_amount_q2,
  555.                     (CASE WHEN SUM(A.q2_amount) > 0 THEN ROUND(SUM(A.q2_achievement_amount) * 100 / SUM(A.q2_amount), vDecimalNo) ELSE 100 END)::character varying AS achievment_q2_percentage,
  556.                     ROUND(SUM(A.q3_achievement_amount), vDecimalNo)::character varying AS achievment_amount_q3,
  557.                     (CASE WHEN SUM(A.q3_amount) > 0 THEN ROUND(SUM(A.q3_achievement_amount) * 100 / SUM(A.q3_amount), vDecimalNo) ELSE 100 END)::character varying AS achievment_q3_percentage
  558.             FROM tt_ordered_achievement A
  559.         )
  560.        
  561.         SELECT A.no, A.code, A.cust_name, A.kota, A.manager, A.spv, A.senior_sales, A.junior_sales,
  562.             A.last_year_achv, A.target_current_year, A.target_q1, A.target_q2, A.target_q3,
  563.             A.achievment_amount_ytd, A.achievment_ytd_percentage, A.achievment_amount_q1,
  564.             A.achievment_q1_percentage, A.achievment_amount_q2, A.achievment_q2_percentage,
  565.             A.achievment_amount_q3, A.achievment_q3_percentage
  566.         FROM data_detail A
  567.         UNION ALL
  568.         SELECT 'Total', vEmptyValue, vEmptyValue, vEmptyValue, vEmptyValue, vEmptyValue, vEmptyValue, vEmptyValue,
  569.             COALESCE(A.last_year_achv, '0'), COALESCE(A.target_current_year, '0'), COALESCE(A.target_q1, '0'), COALESCE(A.target_q2, '0'), COALESCE(A.target_q3, '0'),
  570.             COALESCE(A.achievment_amount_ytd, '0'),
  571.             CASE WHEN (A.target_current_year IS NULL AND A.achievment_amount_ytd IS NULL) THEN '0' ELSE A.achievment_ytd_percentage END AS achievment_ytd_percentage,
  572.             COALESCE(A.achievment_amount_q1, '0'),
  573.             CASE WHEN (A.target_q1 IS NULL AND A.achievment_amount_q1 IS NULL) THEN '0' ELSE A.achievment_q1_percentage END AS achievment_q1_percentage,
  574.             COALESCE(A.achievment_amount_q2, '0'),
  575.             CASE WHEN (A.target_q2 IS NULL AND A.achievment_amount_q2 IS NULL) THEN '0' ELSE A.achievment_q2_percentage END AS achievment_q2_percentage,
  576.             COALESCE(A.achievment_amount_q3, '0'),
  577.             CASE WHEN (A.target_q3 IS NULL AND A.achievment_amount_q3 IS NULL) THEN '0' ELSE A.achievment_q3_percentage END AS achievment_q3_percentage
  578.         FROM summary_detail A;
  579.        
  580.     RETURN NEXT pRefDetail;
  581.        
  582.     DELETE FROM tt_salesman_from_salesman_hierarchy WHERE session_id = pSessionId;
  583.     DELETE FROM tt_salesman_customer_info_for_report_achievement_and_target WHERE session_id = pSessionId;
  584.     DELETE FROM tt_achievement_transaction_for_report_achievement_and_target WHERE session_id = pSessionId;
  585.     DELETE FROM tt_summary_for_report_achievement_and_target WHERE session_id = pSessionId;
  586.    
  587. END;
  588. $BODY$
  589.   LANGUAGE plpgsql VOLATILE
  590.   COST 100
  591.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement