Advertisement
aadddrr

r_achievement_vs_target_20180312

Mar 12th, 2018
85
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)
  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.  
  20.     vPartnerCodeMou                 character varying(50);
  21.     vPartnerNameMou                 character varying(100);
  22.     vDocTypeIdSOByBrand             bigint;
  23.     vStatusReleased                 character varying(1);
  24.     vStatusFinal                    character varying(1);
  25.     vStatusInProgress               character varying(1);
  26.     vStatusDraft                    character varying(1);
  27.     vTagKeyMOU                  character varying(10);
  28.     vDocTypeIdReturnNote                bigint;
  29.     vDocTypeIdSalesInvoice              bigint;
  30.     vDocTypeIdInvoiceTemp               bigint;
  31.     vDocTypeIdConversionOfExchangeIn        bigint;
  32.     vDocTypeIdConversionOfExchangeOut       bigint;
  33.     vDocTypeIdRRS                   bigint;
  34.     vStatusMapping                  character varying(1);
  35.     vStatusApproved                 character varying(1);
  36.     vRaw                        character varying(20);
  37.     vSummary                    character varying(20);
  38.     vEmptyId                    bigint;
  39.     vOne                        integer := 1;
  40.     vEmptyValue                 character varying;
  41.     vParamCodeInsentif          character varying := 'INCENTIVE';
  42.     vActivityGLCodeInsentif     character varying;
  43.     vActivityGLInsentif         bigint;
  44.    
  45.     vFlagYes                    character varying(1) :='Y';
  46.    
  47.     vCurrentDate                character varying;
  48.     vSystemCurrentYear          character varying;
  49.     vLastYear                   character varying;
  50.     vEndDate                    character varying;
  51.     vZero                       numeric;
  52.  
  53. BEGIN
  54.    
  55.     vPartnerCodeMou := ' ';
  56.     vPartnerNameMou := ' ';
  57.     vDocTypeIdSOByBrand := 398;
  58.     vStatusReleased := 'R';
  59.     vStatusFinal := 'F';
  60.     vStatusInProgress := 'I';
  61.     vStatusDraft := 'D';
  62.     vTagKeyMOU := 'MOU';
  63.     vDocTypeIdReturnNote := 502;
  64.     vDocTypeIdSalesInvoice := 321;
  65.     vDocTypeIdReturnSalesInvoice := 380;
  66.     vDocTypeIdInvoiceTemp := 361;
  67.     vDocTypeIdConversionOfExchangeIn := 394;
  68.     vDocTypeIdConversionOfExchangeOut := 395;
  69.     vDocTypeIdRRS :=381;
  70.     vStatusMapping := 'M';
  71.     vStatusApproved := 'A';
  72.     vRaw := 'RAW';
  73.     vSummary := 'SUMMARY';
  74.     vEmptyId := -99;
  75.     vEmptyValue := '';
  76.     vEndDate := '1231';
  77.     vZero := 0;
  78.    
  79.     -- Get data-data activity gl code incentive dari system config value
  80.     SELECT TRIM(REPLACE(f_get_value_system_config_by_param_code(pTenantId, vParamCodeInsentif), ';', ''',''')) INTO vActivityGLCodeInsentif;
  81.    
  82.     SELECT TO_CHAR(current_timestamp, 'YYYY') INTO vSystemCurrentYear;
  83.     SELECT TO_CHAR(TO_DATE(pYear,'YYYY') - INTERVAL '1 Year','YYYY') INTO vLastYear;
  84.    
  85.     IF (pYear = vSystemCurrentYear) THEN
  86.         SELECT TO_CHAR(current_timestamp, 'YYYYMMDD') INTO vDateTo;
  87.     ELSE IF (pYear < vSystemCurrentYear)
  88.         SELECT vLastYear || vEndDate INTO vDateTo;
  89.     END IF;
  90.    
  91.    
  92.     DELETE FROM tt_salesman_from_salesman_hierarchy WHERE session_id = pSessionId;
  93.  
  94.     --Mendapatkan daftar salesman dalam hierarchy periode
  95.     PERFORM f_get_salesman_from_salesman_hierarchy(pSessionId, pTenantId, pSalesmanId, pPeriod);
  96.    
  97.     WITH grouped_salesman AS (
  98.         SELECT DISTINCT A.tenant_id, A.sales_child_id, A.group_brand
  99.         FROM tt_salesman_from_salesman_hierarchy A
  100.         WHERE A.session_id = pSessionId AND
  101.             A.tenant_id = pTenantId AND
  102.             pPeriod BETWEEN A.period_from AND A.period_to
  103.     )
  104.     INSERT INTO tt_salesman_customer_info_for_report_achievement_and_target (
  105.         session_id, customer_id, customer_code, customer_name,
  106.         salesman_id, salesman_code, salesman_name, group_brand,
  107.         target, q1_amount, q2_amount, q3_amount  
  108.     )
  109.     SELECT pSessionId, vEmptyId, vEmptyValue, vEmptyValue,
  110.         A.sales_child_id, C.partner_code, C.partner_name, A.group_brand,
  111.         vZero, vZero, vZero, vZero
  112.     FROM grouped_salesman A
  113.     INNER JOIN m_partner C
  114.         ON A.sales_child_id = C.partner_id
  115.             AND A.tenant_id = C.tenant_id
  116.     WHERE EXISTS (
  117.         SELECT 1
  118.         FROM m_partner_ou D
  119.         INNER JOIN m_ou_structure E
  120.             ON ( E.ou_bu_id = D.ou_id
  121.                 OR E.ou_branch_id = D.ou_id
  122.                 OR E.ou_sub_bu_id = D.ou_id )
  123.         WHERE C.partner_id = D.partner_id
  124.             AND e.ou_id = pOuId
  125.     )
  126.    
  127.     UPDATE tt_salesman_customer_info_for_report_achievement_and_target A
  128.     SET customer_id = A.customer_id,
  129.         customer_code = C.partner_code,
  130.         customer_name = C.partner_name
  131.     FROM m_salesman_to_customer B
  132.     INNER JOIN m_partner C
  133.         ON B.customer_id = C.partner_id
  134.             AND B.tenant_id = C.tenant_id
  135.     INNER JOIN m_ctgr_partner D
  136.         ON D.tenant_id = C.tenant_id
  137.             AND D.ctgr_partner_id = C.ctgr_partner_id
  138.     INNER JOIN t_user_role E
  139.         ON E.user_id = pUserId
  140.             AND E.role_id = pRoleId
  141.     INNER JOIN m_policy_partner F
  142.         ON F.ctgr_partner_id = D.ctgr_partner_id
  143.             AND F.user_role_id = E.user_role_id;
  144.            
  145.     UPDATE tt_salesman_customer_info_for_report_achievement_and_target A
  146.     SET curr_code = B.curr_code,
  147.         target_sales = B.target_sales,
  148.         q1_amount = B.q1_amount,
  149.         q2_amount = B.q2_amount,
  150.         q2_amount = B.q2_amount
  151.     FROM m_customer_target_sales B
  152.     WHERE B.tenant_id = A.tenant_id
  153.         AND A.customer_id = B.customer_id
  154.         AND B.year = pYear;
  155.    
  156.     --Temporary Sales Invoice
  157.     /*INSERT INTO tt_achievement_transaction (
  158.         session_id, tenant_id, ou_id,
  159.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  160.         status_doc, workflow_status,
  161.         tax_amount, total_amount
  162.     )
  163.     SELECT pSessionId, A.tenant_id, D.ou_id,
  164.         D.invoice_temp_id AS doc_id, D.doc_type_id, D.doc_no, D.doc_date, D.partner_id, D.curr_code, D.total_amount AS amount,
  165.         D.status_doc AS status_doc_invoice_temp ,D.workflow_status,
  166.         COALESCE(E.tax_amount, 0) AS tax_amount, (D.total_amount + COALESCE(E.tax_amount, 0)) AS total_amount
  167.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  168.     INNER JOIN sl_invoice_temp D ON A.customer_id = D.partner_id
  169.     LEFT JOIN sl_invoice_temp_tax E ON D.invoice_temp_id = E.invoice_temp_id
  170.     WHERE A.session_id = pSessionId
  171.         AND D.tenant_id = pTenantId
  172.         AND D.ou_id = pOuId
  173.         AND D.doc_type_id = vDocTypeIdInvoiceTemp
  174.         AND D.status_doc = vStatusReleased
  175.         AND SUBSTR(D.doc_date, 1, 4) BETWEEN vLastYear AND pYear
  176.         AND NOT EXISTS (
  177.             SELECT 1
  178.             FROM sl_invoice F
  179.             WHERE F.doc_no = D.inv_doc_no
  180.                 AND F.ref_id = D.ref_id
  181.                 AND F.doc_type_id = vDocTypeIdSalesInvoice
  182.                 AND F.status_doc = vStatusReleased
  183.         );
  184.    
  185.     -- Sales Invoice
  186.     INSERT INTO tt_achievement_transaction (
  187.         session_id, tenant_id, ou_id,
  188.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  189.         status_doc, workflow_status,
  190.         tax_amount, total_amount
  191.     )
  192.     SELECT pSessionId, A.tenant_id, C.ou_id
  193.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, C.curr_code, C.total_amount AS amount,
  194.         C.status_doc AS status_doc_invoice, C.workflow_status,
  195.         COALESCE(D.tax_amount, 0) AS tax_amount, (C.total_amount + COALESCE(D.tax_amount, 0)) AS total_amount
  196.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  197.     INNER JOIN sl_invoice C ON A.customer_id = C.partner_id
  198.     LEFT JOIN sl_invoice_tax D ON C.invoice_id = D.invoice_id
  199.     WHERE A.session_id = pSessionId
  200.         AND C.tenant_id = pTenantId
  201.         AND C.ou_id = pOuId
  202.         AND C.invoice_temp_id = vEmptyId
  203.         AND C.doc_type_id = vDocTypeIdSalesInvoice
  204.         AND C.status_doc = vStatusReleased
  205.         AND SUBSTR(C.doc_date, 1, 4) BETWEEN vLastYear AND pYear;
  206.    
  207.     --Return
  208.     INSERT INTO tt_achievement_transaction (
  209.         session_id, tenant_id, ou_id,
  210.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  211.         status_doc, workflow_status,
  212.         tax_amount, total_amount
  213.     )
  214.     SELECT pSessionId, A.tenant_id, C.ou_id
  215.         C.invoice_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, C.curr_code, -1 * C.total_amount AS amount,
  216.         C.status_doc AS status_doc_invoice, C.workflow_status,
  217.         COALESCE(-1 * D.tax_amount, 0) AS tax_amount, -1 * (C.total_amount + COALESCE(D.tax_amount, 0)) AS total_amount
  218.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  219.     INNER JOIN sl_invoice C ON A.customer_id = C.partner_id
  220.     LEFT JOIN sl_invoice_tax D ON C.invoice_id = D.invoice_id
  221.     WHERE A.session_id = pSessionId
  222.         AND C.tenant_id = pTenantId
  223.         AND C.ou_id = pOuId
  224.         AND C.invoice_temp_id = vEmptyId
  225.         AND C.doc_type_id = vDocTypeIdReturnSalesInvoice
  226.         AND C.status_doc = vStatusReleased
  227.         AND SUBSTR(C.doc_date, 1, 4) BETWEEN vLastYear AND pYear;
  228.    
  229.     --CN AR
  230.     INSERT INTO tt_achievement_transaction (
  231.         session_id, tenant_id, ou_id,
  232.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  233.         status_doc, workflow_status,
  234.         tax_amount, total_amount
  235.     )
  236.     SELECT pSessionId, A.tenant_id, C.ou_id,
  237.         C.invoice_ar_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, C.curr_code, SUM(D.add_amount)*-1 AS amount,
  238.         C.status_doc AS status_doc, C.workflow_status,
  239.         SUM(D.tax_amount)*-1 AS tax_amount, (SUM(D.add_amount) + SUM(D.tax_amount))*-1 AS total_amount
  240.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  241.         INNER JOIN fi_invoice_ar C ON A.customer_id = C.partner_id
  242.         INNER JOIN fi_invoice_ar_cost D ON C.invoice_ar_id = D.invoice_ar_id
  243.     WHERE A.session_id = pSessionId
  244.         AND C.status_doc IN (vStatusReleased,vStatusFinal)
  245.         AND C.doc_type_id = 251
  246.         --AND f_is_invoice_ar_cost_unvalid_by_activity_gl_code(C.invoice_ar_id, vActivityGLCodeInsentif, A.tenant_id) = vFlagYes
  247.     GROUP BY A.tenant_id, A.ou_id,
  248.         C.invoice_ar_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, C.curr_code,
  249.         C.workflow_status, C.status_doc;
  250.        
  251.     --DN AR
  252.     INSERT INTO tt_achievement_transaction (
  253.         session_id, tenant_id, ou_id,
  254.         doc_id, doc_type_id, doc_no, doc_date, partner_id, curr_code, amount,
  255.         status_doc, workflow_status,
  256.         tax_amount, total_amount
  257.     )
  258.     SELECT pSessionId, A.tenant_id, A.ou_id,
  259.         C.invoice_ar_id AS doc_id, C.doc_type_id, C.doc_no, C.doc_date, C.partner_id, C.curr_code, C.total_amount AS amount,
  260.         C.status_doc AS status_doc, C.workflow_status,
  261.         C.tax_amount AS tax_amount, (C.total_amount + C.tax_amount) AS total_amount
  262.     FROM tt_salesman_customer_info_for_report_achievement_and_target A
  263.         INNER JOIN fi_invoice_ar C ON A.customer_id = C.partner_id
  264.     WHERE A.session_id = pSessionId
  265.         AND C.status_doc IN (vStatusReleased,vStatusFinal)
  266.         AND C.doc_type_id = 241;*/
  267.        
  268.     Open pRefHeader FOR
  269.         SELECT f_get_partner_name(pSalesmanId) AS salesman_name, vDateTo AS date_to, SELECT vLastYear AS last_year, pYear AS current_year;
  270.     RETURN NEXT pRefHeader;
  271.    
  272.     INSERT INTO tt_summary_for_report_achievement_and_target (
  273.         session_id, tenant_id, salesman_id,
  274.         target_amount,
  275.         year_to_date_accumulative_amount,
  276.         year_to_date_accumulative_percentage
  277.     )
  278.     SELECT pSessionId, A.tenant_id, B.salesman_id,  
  279.         SUM(B.target) AS target,
  280.         SUM(A.amount) AS year_to_date_accumulative_amount,  
  281.         SUM(A.amount) / SUM(B.target) AS year_to_date_accumulative_percentage;
  282.     FROM tt_achievement_transaction A
  283.     INNER JOIN tt_salesman_customer_info_for_report_achievement_and_target B
  284.         ON A.partner_id = B.customer_id AND
  285.             A.tenant_id = B.tenant_id
  286.     WHERE A.session_id = pSessionId AND
  287.         A.tenant_id = pTenantId AND
  288.         SUBSTR(A.doc_date, 1, 4) = pYear
  289.     GROUP BY B.salesman_id;
  290.    
  291.     PERFORM f_get_total_achievement_from_salesman_hierarchy(pSessionId, pTenantId, A.salesman_id, pYear);
  292.     FROM tt_summary_for_report_achievement_and_target A
  293.     WHERE A.session_id = pSessionId AND
  294.         A.tenant_id = pTenantId;
  295.    
  296.     Open pRefDetailSummary FOR
  297.         SELECT f_get_partner_name(A.salesman_id) AS salesman_name,
  298.             A.target, A.year_to_date_accumulative_amount, A.year_to_date_accumulative_percentage
  299.         FROM tt_summary_for_report_achievement_and_target A
  300.         WHERE A.session_id = pSessionId AND
  301.             A.tenant_id = pTenantId;
  302.     RETURN NEXT pRefDetailSummary;
  303.    
  304.     PERFORM SETVAL('r_achievement_vs_target_line_no_seq', 0);
  305.    
  306.     Open pRefDetail FOR
  307.         SELECT NEXTVAL('r_achievement_vs_target_line_no_seq') AS line_no,
  308.             B.customer_code, B.customer_name, B.city,
  309.             'Septi' AS manager_name, '-' AS supervisor_name, 'Efendi' AS senior_sales_name, 'Hasen' AS junior_sales_name,
  310.             SUM(
  311.                 CASE WHEN C.year_date = vLastYear THEN
  312.                     A.amount
  313.                 ELSE
  314.                     0
  315.                 END
  316.             ) AS last_year_achievement_amount,
  317.             B.target_sales AS current_year_target_amount, B.q1_amount, B.q2_amount, B.q3_amount,
  318.             SUM(
  319.                 CASE WHEN C.year_date = pYear THEN
  320.                     A.amount
  321.                 ELSE
  322.                     0
  323.                 END
  324.             ) AS year_to_date_amount,
  325.             SUM(
  326.                 CASE WHEN C.q_no = 1 THEN
  327.                     A.amount
  328.                 ELSE
  329.                     0
  330.                 END
  331.             ) AS q1_achievement_amount,
  332.             SUM(
  333.                 CASE WHEN C.q_no = 2 THEN
  334.                     A.amount
  335.                 ELSE
  336.                     0
  337.                 END
  338.             ) AS q2_achievement_amount,
  339.             SUM(
  340.                 CASE WHEN C.q_no = 3 THEN
  341.                     A.amount
  342.                 ELSE
  343.                     0
  344.                 END
  345.             ) AS q3_achievement_amount
  346.         FROM tt_achievement_transaction A
  347.         INNER JOIN tt_salesman_customer_info_for_report_achievement_and_target B
  348.             ON A.partner_id = B.customer_id AND
  349.                 A.tenant_id = B.tenant_id
  350.         INNER JOIN dt_date C ON A.doc_date = C.string_date
  351.     RETURN NEXT pRefDetail;
  352.        
  353.     DELETE FROM tt_salesman_from_salesman_hierarchy WHERE session_id = pSessionId;
  354.    
  355. END;
  356. $BODY$
  357.   LANGUAGE plpgsql VOLATILE
  358.   COST 100
  359.   /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement