Advertisement
Guest User

Untitled

a guest
May 17th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION r_analysis_sales_gross_profit_by_invoice_with_monthly_avg_cogs(character varying, bigint, character varying, bigint, character varying, character varying, character varying, bigint, character varying)
  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.     pYearMonthDate          ALIAS FOR $3;
  10.     pUserId                 ALIAS FOR $4;
  11.     pPartnerCodeName        ALIAS FOR $5;
  12.     pTglAwal                ALIAS FOR $6;
  13.     pTglAkhir               ALIAS FOR $7;
  14.     pOuId                   ALIAS FOR $8;
  15.     pDatetime               ALIAS FOR $9;
  16.        
  17.     vAwalTahun              character varying(6) := '';
  18.     vValutaBuku             character varying(5) := '';
  19.     vEmptyValue             character varying(1) := '';
  20.     vFlagYes                character varying(1) := 'Y';
  21.     vRoundingModeUp         character varying(2) := 'RU';
  22.    
  23.     vDocTypeIdSI                bigint := 321;
  24.     vDocTypeIdSIShopInShop      bigint := 341;
  25.     vDocTypeIdRSI               bigint := 331;
  26.     vDocTypeIdCNAR              bigint := 251;
  27.     vDocTypeIdDNAR              bigint := 241;
  28.     vPartnerIdMagento           bigint := -99;
  29.     vZero                       integer := 0;
  30.     vIsFilterTglTrue            integer := 1;
  31.    
  32. BEGIN
  33.    
  34.     vAwalTahun := SUBSTRING(pYearMonthDate, 1, 4) || '01';
  35.    
  36.     SELECT f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku') INTO vValutaBuku;
  37.     SELECT partner_id INTO vPartnerIdMagento FROM m_partner WHERE partner_code = 'MAGENTO';
  38.    
  39.     RAISE NOTICE 'vPartnerIdMagento : %',vPartnerIdMagento;
  40.    
  41.     -- Check filter tanggal
  42.     IF(pTglAwal=vEmptyValue OR pTglAkhir=vEmptyValue) THEN
  43.         vIsFilterTglTrue := 0;
  44.     END IF;
  45.    
  46.     -- RESET Temp folder
  47.     DELETE FROM tt_sales_gross_profit_by_invoice WHERE session_id = pSessionId;
  48.    
  49.     Open pRefHeader FOR
  50.     SELECT A.fullname AS username, B.ou_name AS ou_name, pYearMonthDate AS current_month_year, vAwalTahun AS start_month_year, pYearMonthDate AS end_month_year,
  51.     vValutaBuku AS valuta_buku, pDatetime AS datetime
  52.     FROM t_user A
  53.     INNER JOIN t_ou B ON A.tenant_id = B.tenant_id
  54.     WHERE user_id = pUserId
  55.     AND ou_id = pOuId;
  56.    
  57.     RETURN NEXT pRefHeader;
  58.    
  59.     /*
  60.      * Mengupulkan semua product dengan harga belinya, dari beberapa doc sbb :
  61.      * - SI
  62.      * - SI Shop In Shop
  63.      * - RSI
  64.      */
  65.    
  66.     -- #1. Ambil data sales invoice item untuk period awal tahun sampai period yang terpilih
  67.     INSERT INTO tt_sales_gross_profit_by_invoice(
  68.         session_id, tenant_id, ou_bu_id, partner_id,
  69.         partner_code, partner_name,
  70.         doc_type_id, doc_no, doc_date, year_month_date, product_id, curr_code,
  71.         purch_price)
  72.     SELECT pSessionId, A.tenant_id, E.ou_bu_id, A.partner_id,
  73.             f_get_partner_code(A.partner_id) AS partner_code, f_get_partner_name(A.partner_id) AS partner_name,
  74.             A.doc_type_id, A.doc_no, A.doc_date, F.year_month_date, D.product_id, A.curr_code,
  75.             (CASE WHEN COALESCE(G.qty_total, vZero) = vZero OR COALESCE(G.amount_total, vZero) = vZero
  76.                 THEN vZero
  77.                 ELSE COALESCE(G.amount_total/G.qty_total, vZero)
  78.             END)
  79.     FROM fi_invoice_ar_balance A
  80.     INNER JOIN sl_invoice B ON A.tenant_id = B.tenant_id AND A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  81.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  82.     INNER JOIN sl_do_item D ON C.ref_item_id = D.do_item_id AND C.ref_id = D.do_id
  83.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  84.     INNER JOIN dt_date F ON A.doc_date = F.string_date
  85.     LEFT JOIN in_summary_monthly_cogs G ON A.tenant_id = G.tenant_id AND D.product_id = G.product_id AND F.year_month_date = G.date_year_month AND E.ou_bu_id = G.ou_id
  86.     WHERE A.doc_type_id = vDocTypeIdSI
  87.     AND F.year_month_date BETWEEN vAwalTahun AND pYearMonthDate
  88.     AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  89.     AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  90.         OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  91.         OR pPartnerCodeName = vEmptyValue);
  92.    
  93.     -- #2. Ambil data sales invoice shop in shop item untuk period awal tahun sampai period yang terpilih
  94.     INSERT INTO tt_sales_gross_profit_by_invoice(
  95.         session_id, tenant_id, ou_bu_id, partner_id,
  96.         partner_code, partner_name,
  97.         doc_type_id, doc_no, doc_date, year_month_date, product_id, curr_code,
  98.         purch_price)
  99.     SELECT pSessionId, A.tenant_id, F.ou_bu_id, A.partner_id,
  100.             f_get_partner_code(A.partner_id) AS partner_code, f_get_partner_name(A.partner_id) AS partner_name,
  101.             A.doc_type_id, A.doc_no, A.doc_date, G.year_month_date, E.product_id, A.curr_code,
  102.             (CASE WHEN COALESCE(H.qty_total, vZero) = vZero OR COALESCE(H.amount_total, vZero) = vZero
  103.                 THEN vZero
  104.                 ELSE COALESCE(H.amount_total/H.qty_total, vZero)
  105.             END)
  106.     FROM fi_invoice_ar_balance A
  107.     INNER JOIN sl_invoice_shop_in_shop B ON A.tenant_id = B.tenant_id AND A.invoice_ar_id = B.invoice_shop_in_shop_id AND A.doc_type_id = B.doc_type_id
  108.     INNER JOIN sl_invoice_shop_in_shop_item C ON B.invoice_shop_in_shop_id = C.invoice_shop_in_shop_id
  109.     INNER JOIN sl_pos_balance_invoice D ON C.ref_id = D.pos_balance_invoice_id
  110.     INNER JOIN sl_pos_balance_invoice_item E ON D.pos_balance_invoice_id = E.pos_balance_invoice_id
  111.     INNER JOIN m_ou_structure F ON A.ou_id = F.ou_id
  112.     INNER JOIN dt_date G ON A.doc_date = G.string_date
  113.     LEFT JOIN in_summary_monthly_cogs H ON A.tenant_id = H.tenant_id AND E.product_id = H.product_id AND G.year_month_date = H.date_year_month AND F.ou_bu_id = H.ou_id
  114.     WHERE A.doc_type_id = vDocTypeIdSIShopInShop
  115.     AND G.year_month_date BETWEEN vAwalTahun AND pYearMonthDate
  116.     AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  117.     AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  118.         OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  119.         OR pPartnerCodeName = vEmptyValue);
  120.    
  121.     -- #3. Ambil data retur sales invoice item untuk period awal tahun sampai period yang terpilih
  122.     INSERT INTO tt_sales_gross_profit_by_invoice(
  123.         session_id, tenant_id, ou_bu_id, partner_id,
  124.         partner_code, partner_name,
  125.         doc_type_id, doc_no, doc_date, year_month_date, product_id, curr_code,
  126.         purch_price)
  127.     SELECT pSessionId, A.tenant_id, E.ou_bu_id, A.partner_id,
  128.             f_get_partner_code(A.partner_id) AS partner_code, f_get_partner_name(A.partner_id) AS partner_name,
  129.             A.doc_type_id, A.doc_no, A.doc_date, F.year_month_date, D.product_id, A.curr_code,
  130.             (CASE WHEN COALESCE(G.qty_total, vZero) = vZero OR COALESCE(G.amount_total, vZero) = vZero
  131.                 THEN vZero
  132.                 ELSE COALESCE(G.amount_total/G.qty_total, vZero)
  133.             END)
  134.     FROM fi_invoice_ar_balance A
  135.     INNER JOIN sl_invoice B ON A.tenant_id = B.tenant_id AND A.invoice_ar_id = B.invoice_id AND A.doc_type_id = B.doc_type_id
  136.     INNER JOIN sl_invoice_item C ON B.invoice_id = C.invoice_id
  137.     INNER JOIN in_inventory_item D ON C.ref_item_id = D.ref_item_id AND C.ref_id = D.inventory_id
  138.     INNER JOIN m_ou_structure E ON A.ou_id = E.ou_id
  139.     INNER JOIN dt_date F ON A.doc_date = F.string_date
  140.     LEFT JOIN in_summary_monthly_cogs G ON A.tenant_id = G.tenant_id AND D.product_id = G.product_id AND F.year_month_date = G.date_year_month AND E.ou_bu_id = G.ou_id
  141.     WHERE A.doc_type_id = vDocTypeIdRSI
  142.     AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  143.     AND F.year_month_date BETWEEN vAwalTahun AND pYearMonthDate
  144.     AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  145.         OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  146.         OR pPartnerCodeName = vEmptyValue);
  147.        
  148.     Open pRefDetail FOR
  149.    
  150.         -- Data purch price per partner untuk periode terpilih
  151.         WITH summary_purch_price_per_partner_selected_period AS (
  152.        
  153.             SELECT A.partner_id, A.partner_code, A.partner_name, SUM(A.purch_price) AS purch_price
  154.             FROM tt_sales_gross_profit_by_invoice A
  155.             WHERE A.session_id = pSessionId
  156.             AND A.year_month_date = pYearMonthDate
  157.             GROUP BY A.partner_id, A.partner_code, A.partner_name
  158.        
  159.         ),
  160.         -- Data purch price per partner dari awal tahun (januari) sampai periode terpilih
  161.         summary_purch_price_per_partner_all_period AS (
  162.        
  163.             SELECT A.partner_id, A.partner_code, A.partner_name, SUM(A.purch_price) AS purch_price
  164.             FROM tt_sales_gross_profit_by_invoice A
  165.             WHERE A.session_id = pSessionId
  166.             GROUP BY A.partner_id, A.partner_code, A.partner_name
  167.        
  168.         ),
  169.         -- Data CN DN AR per partner untuk periode terpilih
  170.         data_cn_dn_ar_partner_selected_period AS (
  171.             SELECT A.partner_id,
  172.                     CASE WHEN A.doc_type_id = vDocTypeIdCNAR
  173.                         THEN SUM(D.add_amount*f_commercial_rate(C.tenant_id,C.doc_date,D.curr_code, vValutaBuku)) * -1
  174.                         ELSE SUM(D.add_amount*f_commercial_rate(C.tenant_id,C.doc_date,D.curr_code, vValutaBuku))
  175.                     END AS current_sales
  176.             FROM fi_invoice_ar_balance A
  177.             INNER JOIN dt_date B ON A.doc_date = B.string_date
  178.             INNER JOIN fi_invoice_ar C ON A.invoice_ar_id = C.invoice_ar_id AND A.doc_type_id = C.doc_type_id
  179.             INNER JOIN fi_invoice_ar_cost D ON C.invoice_ar_id = D.invoice_ar_id
  180.             INNER JOIN m_activity_gl E ON D.activity_gl_id = E.activity_gl_id
  181.             INNER JOIN m_coa F ON E.coa_id = F.coa_id
  182.             INNER JOIN m_group_coa G ON F.group_coa_id = G.group_coa_id
  183.             WHERE A.tenant_id = pTenantId
  184.             AND A.doc_type_id IN (vDocTypeIdCNAR, vDocTypeIdDNAR)
  185.             AND G.group_coa_code IN ('PendapatanPenjualan', 'ReturPenjualan')
  186.             AND B.year_month_date = pYearMonthDate
  187.             AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  188.             AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  189.                 OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  190.                 OR pPartnerCodeName = vEmptyValue)
  191.             GROUP BY A.partner_id, A.doc_type_id
  192.         ),
  193.         -- Data CN DN AR per partner dari awal tahun (januari) sampai periode terpilih
  194.         data_cn_dn_ar_partner_all_period AS (
  195.             SELECT A.partner_id,
  196.                     CASE WHEN A.doc_type_id = vDocTypeIdCNAR
  197.                         THEN SUM(D.add_amount*f_commercial_rate(C.tenant_id,C.doc_date,D.curr_code, vValutaBuku)) * -1
  198.                         ELSE SUM(D.add_amount*f_commercial_rate(C.tenant_id,C.doc_date,D.curr_code, vValutaBuku))
  199.                     END AS before_sales
  200.             FROM fi_invoice_ar_balance A
  201.             INNER JOIN dt_date B ON A.doc_date = B.string_date
  202.             INNER JOIN fi_invoice_ar C ON A.invoice_ar_id = C.invoice_ar_id AND A.doc_type_id = C.doc_type_id
  203.             INNER JOIN fi_invoice_ar_cost D ON C.invoice_ar_id = D.invoice_ar_id
  204.             INNER JOIN m_activity_gl E ON D.activity_gl_id = E.activity_gl_id
  205.             INNER JOIN m_coa F ON E.coa_id = F.coa_id
  206.             INNER JOIN m_group_coa G ON F.group_coa_id = G.group_coa_id
  207.             WHERE A.tenant_id = pTenantId
  208.             AND A.doc_type_id IN (vDocTypeIdCNAR, vDocTypeIdDNAR)
  209.             AND G.group_coa_code IN ('PendapatanPenjualan', 'ReturPenjualan')
  210.             AND B.year_month_date BETWEEN vAwalTahun AND pYearMonthDate
  211.             AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  212.             AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  213.                 OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  214.                 OR pPartnerCodeName = vEmptyValue)
  215.             GROUP BY A.partner_id, A.doc_type_id
  216.         ),
  217.         -- Data sales per partner untuk periode terpilih
  218.         data_sales_per_partner_selected_period AS (
  219.             SELECT A.partner_id,
  220.                 SUM(CASE WHEN A.doc_type_id = vDocTypeIdSI AND A.partner_id = vPartnerIdMagento
  221.                     THEN
  222.                         f_get_amount_before_tax(A.amount, vFlagYes, D.tax_percentage, vZero, vRoundingModeUp)*f_commercial_rate(A.tenant_id,A.doc_date,A.curr_code, vValutaBuku)
  223.                     ELSE
  224.                         A.amount*f_commercial_rate(A.tenant_id,A.doc_date,A.curr_code, vValutaBuku)
  225.                 END)+COALESCE(C.current_sales,0) AS current_sales
  226.             FROM fi_invoice_ar_balance A
  227.             INNER JOIN dt_date B ON A.doc_date = B.string_date
  228.             LEFT JOIN data_cn_dn_ar_partner_selected_period C ON A.partner_id = C.partner_id
  229.             LEFT JOIN sl_invoice_tax D ON A.invoice_ar_id = D.invoice_id AND A.doc_type_id = vDocTypeIdSI AND A.partner_id = vPartnerIdMagento
  230.             WHERE A.tenant_id = pTenantId
  231.             AND A.doc_type_id IN (vDocTypeIdSI, vDocTypeIdSIShopInShop, vDocTypeIdRSI)
  232.             AND B.year_month_date = pYearMonthDate
  233.             AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  234.             AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  235.                 OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  236.                 OR pPartnerCodeName = vEmptyValue)
  237.             GROUP BY A.partner_id, C.current_sales
  238.         ),
  239.         -- Data sales per partner dari awal tahun (januari) sampai periode terpilih
  240.         data_sales_per_partner_all_period AS (
  241.             SELECT A.partner_id,
  242.                    SUM(CASE WHEN A.doc_type_id = vDocTypeIdSI AND A.partner_id = vPartnerIdMagento
  243.                         THEN
  244.                             f_get_amount_before_tax(A.amount, vFlagYes, D.tax_percentage, vZero, vRoundingModeUp)*f_commercial_rate(A.tenant_id,A.doc_date,A.curr_code, vValutaBuku)
  245.                         ELSE
  246.                             A.amount*f_commercial_rate(A.tenant_id,A.doc_date,A.curr_code, vValutaBuku)
  247.                         END)+COALESCE(C.before_sales,0) AS before_sales
  248.             FROM fi_invoice_ar_balance A
  249.             INNER JOIN dt_date B ON A.doc_date = B.string_date
  250.             LEFT JOIN data_cn_dn_ar_partner_all_period C ON A.partner_id = C.partner_id
  251.             LEFT JOIN sl_invoice_tax D ON A.invoice_ar_id = D.invoice_id AND A.doc_type_id = vDocTypeIdSI AND A.partner_id = vPartnerIdMagento
  252.             WHERE A.tenant_id = pTenantId
  253.             AND A.doc_type_id IN (vDocTypeIdSI, vDocTypeIdSIShopInShop, vDocTypeIdRSI)
  254.             AND B.year_month_date BETWEEN vAwalTahun AND pYearMonthDate
  255.             AND ((A.doc_date BETWEEN pTglAwal AND pTglAkhir) OR vIsFilterTglTrue = vZero)
  256.             AND (UPPER(f_get_partner_code(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  257.                 OR UPPER(f_get_partner_name(A.partner_id)) LIKE UPPER('%'||pPartnerCodeName||'%')
  258.                 OR pPartnerCodeName = vEmptyValue)
  259.             GROUP BY A.partner_id, C.before_sales
  260.            
  261.         ),
  262.         -- Data profit untuk periode terpilih
  263.         data_profit_selected_period AS(
  264.             SELECT A.partner_id, A.partner_code, A.partner_name, vValutaBuku AS curr_code,
  265.                 B.current_sales, B.current_sales-A.purch_price AS current_gross_profit,
  266.                 CASE WHEN B.current_sales = vZero THEN vZero
  267.                     ELSE COALESCE ((B.current_sales-A.purch_price)/B.current_sales, vZero)
  268.                 END AS current_profit_percentage
  269.             FROM summary_purch_price_per_partner_selected_period A
  270.             INNER JOIN data_sales_per_partner_selected_period B ON A.partner_id = B.partner_id
  271.         ),
  272.         -- Data profit untuk periode terpilih dari awal tahun (januari) sampai periode terpilih
  273.         data_profit_all_period AS(
  274.             SELECT A.partner_id, A.partner_code, A.partner_name, vValutaBuku AS curr_code,
  275.                 B.before_sales, B.before_sales-A.purch_price AS before_gross_profit,
  276.                 CASE WHEN B.before_sales = vZero THEN vZero
  277.                     ELSE COALESCE ((B.before_sales-A.purch_price)/B.before_sales, vZero)
  278.                 END AS before_profit_percentage
  279.             FROM summary_purch_price_per_partner_all_period A
  280.             INNER JOIN data_sales_per_partner_all_period B ON A.partner_id = B.partner_id
  281.         )
  282.        
  283.         SELECT A.partner_id, A.partner_code, A.partner_name, A.curr_code,
  284.                 A.current_sales, A.current_gross_profit, A.current_profit_percentage,
  285.                 B.before_sales, B.before_gross_profit, B.before_profit_percentage
  286.         FROM data_profit_selected_period A
  287.         INNER JOIN data_profit_all_period B ON A.partner_id = B.partner_id
  288.         ORDER BY A.partner_name;
  289.    
  290.     RETURN NEXT pRefDetail;
  291.    
  292.     DELETE FROM tt_sales_gross_profit_by_invoice WHERE session_id = pSessionId;
  293.    
  294. END;
  295. $BODY$
  296.   LANGUAGE plpgsql VOLATILE
  297.   COST 100
  298.   ROWS 1000;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement