Advertisement
Guest User

Untitled

a guest
Jul 16th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DROP AGGREGATE IF EXISTS array_cat_agg(anyarray);
  2. CREATE AGGREGATE array_cat_agg(anyarray) (
  3.   SFUNC=array_cat,
  4.   STYPE=anyarray
  5. );
  6. --- Запрос дополняющий аналитику текстовой расшифровкой
  7. WITH data AS (
  8. SELECT
  9.    
  10.     z.*,
  11.     -- Остаток на конец = остаток на начало + обороты
  12.     CASE z.activity_type
  13.       WHEN 2 THEN 0
  14.       ELSE z.summa_begin_debet + z.summa_turn_debet - z.summa_turn_credit
  15.     END AS summa_end_debet,
  16.  
  17.     -- так же по кредиту, остаток на конец = остаток на начало + обороты
  18.     CASE z.activity_type
  19.       WHEN 2 THEN z.summa_begin_credit - z.summa_turn_debet + z.summa_turn_credit
  20.       ELSE 0
  21.     END AS summa_end_credit,
  22.  
  23.     -- Ещё нужны итоговые суммы дебет - кредит
  24.     CASE z.activity_type
  25.         -- Для пассивных счетов кредит
  26.         WHEN 2 THEN z.summa_turn_credit - z.summa_turn_debet
  27.         -- Для активных счетов дебет
  28.         ELSE z.summa_turn_debet - z.summa_turn_credit
  29.     END AS summa_turn,
  30.     CASE z.activity_type
  31.         -- Для пассивных счетов кредит
  32.         WHEN 2 THEN z.summa_begin_credit - z.summa_begin_debet
  33.         -- Для активных счетов дебет
  34.         ELSE z.summa_begin_debet - z.summa_begin_credit
  35.     END AS summa_begin,
  36.  
  37.     CASE z.activity_type
  38.         -- Для пассивных счетов кредит
  39.         WHEN 2 THEN (z.summa_begin_credit - z.summa_turn_debet + z.summa_turn_credit - z.summa_begin_debet)
  40.         -- Для активных счетов дебет
  41.         ELSE (z.summa_begin_debet + z.summa_turn_debet - z.summa_turn_credit - z.summa_begin_credit)
  42.     END AS summa_end
  43.     -- Расшифровка аналитик
  44.    
  45.     ,ava1.dict_id AS analytic1_dict_id
  46.     ,ava1.name AS analytic1_name
  47.     ,ava1.code AS analytic1_code
  48.    
  49.     ,ava2.dict_id AS analytic2_dict_id
  50.     ,ava2.name AS analytic2_name
  51.     ,ava2.code AS analytic2_code
  52.    
  53.  
  54.     -- Расшифровка обязательных аналитик
  55.        ,account_alias.code AS account_name      
  56.    
  57.    
  58.     ,kbk_alias.name AS kbk_name
  59.     ,kbk_alias.code AS kbk_code
  60.     ,kbk_alias.fullname AS kbk_fullname
  61.     ,kbk_alias.kbk_type AS kbk_type
  62.     ,kbk_analitycgroup_alias.type_admission_disposal AS kbk_type_admission_disposal
  63.    
  64.    
  65.        ,kbk_activity_type_alias.code AS kvd_name
  66.      ,kbk_kosgu_alias.code AS kosgu_name      
  67.    
  68.     -- Расшифровка аналитики по КВД
  69.    
  70.    
  71. FROM
  72. (
  73.  
  74. --- Основной запрос по оборотам и остаткам
  75.     SELECT
  76.         '' AS empty,
  77.         bool_or(t.transition) as transition,
  78.            t.account_id,
  79.        
  80.            t.kbk_id,    
  81.        
  82.            t.kvd_id,    
  83.          t.kosgu_id,  
  84.        
  85.           array_to_string(array_agg(
  86.             distinct case when ('2018-04-30 23:59:58' >= t.date
  87.               and '2018-04-01 00:00:00' <= t.date)
  88.               then t.journal
  89.               else null end), ', ') as journal,
  90.           array_to_string(array_agg(distinct t.journal_id), ', ') as journals_ids,
  91.        
  92.  
  93.        
  94.          t.document_type_id,
  95.  
  96.         --- Аналитика по КВД
  97.        
  98.  
  99.         --- Аналитики
  100.        
  101.             t.analytic1,
  102.        
  103.             t.analytic2,
  104.        
  105.  
  106.         -- признак активности счета
  107.         ach.activity_type,
  108.  
  109.         --- Обороты
  110.         SUM( (CASE ('2018-04-30 23:59:58' >= t.date AND '2018-04-01 00:00:00' <= t.date) WHEN true THEN t.summa_turn_debet ELSE 0 END) ) AS summa_turn_debet,
  111.         SUM( (CASE ('2018-04-30 23:59:58' >= t.date AND '2018-04-01 00:00:00' <= t.date) WHEN true THEN t.summa_turn_credit ELSE 0 END) ) AS summa_turn_credit,
  112.  
  113.         --- Остаток на начало
  114.         SUM(
  115.             CASE ('2018-04-01 00:00:00' <= t.date_next AND '2018-04-01 00:00:00' > t.date)
  116.                 WHEN true THEN
  117.                     CASE ach.activity_type
  118.                         -- Для пассивных счетов кредит всегда 0
  119.                         WHEN 2 THEN 0
  120.                         -- Для активных счетов сальдо будет только по дебету
  121.                         ELSE t.summa_total_debet - t.summa_total_credit
  122.                     END
  123.                 ELSE 0
  124.             END
  125.         ) AS summa_begin_debet,
  126.  
  127.         SUM(
  128.             CASE ('2018-04-01 00:00:00' <= t.date_next AND '2018-04-01 00:00:00' > t.date)
  129.                WHEN true THEN
  130.                    CASE ach.activity_type
  131.                        -- Для пассивных сальдо будет только по кредиту
  132.                        WHEN 2 THEN t.summa_total_credit - t.summa_total_debet
  133.                        -- Для активных счетов кредит всегда 0
  134.                        ELSE 0
  135.                    END
  136.                ELSE 0
  137.             END
  138.         ) AS summa_begin_credit,
  139.         -- Количество проводок для оборотов
  140.         SUM( (CASE ('2018-04-30 23:59:58' >= t.date AND '2018-04-01 00:00:00' <= t.date) WHEN true THEN t.count_of_entries ELSE 0 END) ) AS count_of_entries,
  141.         array_cat_agg(sources) as sources
  142.         FROM
  143.             (
  144.                
  145.                 SELECT
  146.                         analytic1 AS analytic1,
  147.                    
  148.                         -1 AS analytic2,
  149.                      a_e_cumreg.kbk_id,
  150.                        a_e_cumreg.kvd_id,  
  151.                      a_e_cumreg.kosgu_id,
  152.                      a_e_cumreg.journal, c_o_j.id as journal_id,
  153.                    
  154.                    
  155.                    
  156.                      a_e_cumreg.document_type_id,
  157.  
  158.                     a_e_cumreg.transition,
  159.                     a_e_cumreg.account_id,
  160.                     a_e_cumreg.date,
  161.                     a_e_cumreg.date_next,
  162.                     -- Если итоги нужны только для одной стороны счета, то противоположная сторона обнуляется
  163.                    
  164.                         a_e_cumreg.summa_turn_debet,
  165.                         a_e_cumreg.summa_turn_credit,
  166.                         a_e_cumreg.summa_total_debet,
  167.                         a_e_cumreg.summa_total_credit,
  168.                    
  169.                    
  170.                    
  171.                     a_e_cumreg.count_of_entries,
  172.                     a_e_cumreg.sources as sources
  173.                 FROM account_entry_cumreg a_e_cumreg
  174.                
  175.                 LEFT JOIN (
  176.                   select config_oper_journal.id, config_oper_journal.number
  177.                   from config_oper_journal) as c_o_j on a_e_cumreg.journal = c_o_j.number
  178.                
  179.                 WHERE
  180.  
  181.                    
  182.  
  183.                     --- Условия по аналитикам
  184.                    
  185.                         a_e_cumreg.analytic1 IN (49347,49936,49973,50658,50659,50660,50656,50363,50654,50754,51008,50564,50663,50753,85098,87383,94526) AND
  186.                    
  187.  
  188.                      
  189.                      a_e_cumreg.kbk_id IN (54147,51268,23939,20406,31530,32331) AND      
  190.                      a_e_cumreg.kvd_id IN (3779) AND      
  191.                      a_e_cumreg.kosgu_id IN (87293,87972,88045,88171,87815,88207,87054) AND
  192.                    
  193.                     --- Условия по аналитике КВД
  194.                    
  195.  
  196.                    
  197.                     a_e_cumreg.account_id in (302942,304042) AND
  198.                     a_e_cumreg.ent_id  =  1453
  199.  
  200.                     AND (
  201.                             ('2018-04-01 00:00:00' <= a_e_cumreg.date_next AND '2018-04-01 00:00:00' > a_e_cumreg.date) or -- остаток на начало
  202.                             (
  203.                                 ('2018-04-30 23:59:58' >= a_e_cumreg.date AND '2018-04-01 00:00:00' <= a_e_cumreg.date)  -- обороты
  204.                                
  205.                                   --- Собираем КОВ без учёта межотчётного периода
  206.                                   AND a_e_cumreg.transition IS FALSE
  207.                                
  208.                                  AND a_e_cumreg.document_type_id IN (56833,56945,57048,57101,57146,57199,57252,57304,51418,56989,72729,57416,69210,77051,100393,71623,58680,58158,69508,105163,98622,53611,63957,54016,54678,69766,98930,56623,70023,71884,60347,58056,57772,56229,57894,104491,59762,56512,59964,60018,52270,65074,65343,51776,52800,65612,52326,56414,56568,56121,107814,107285,58726,58217,59629,53924,59517,59459,59573,58896,57949,87532,58397,75348,105394,53760,79757,53869,102959,54420,62000,53704,51886,64805,51830,55672,57474,55776,61769,72987,56680,67897,55017,55890,57592,63508,57660,57702,68923,58820,56175,78940,58749,57363,105835,107028,80028,51995,97628,67952,68688,68007,68060,73773,92317,52051,80298,52216,65902,62352,85180,54713,68117,59345,84189,78636,82366,81416,77953,52633,101299,61472,85768,104199,85497,88944,59402,81890,58303,73248,58346,58616,58571,58451,58936,66610,66335,107593,106804,67404,106577,51594,56887,84905,78292,60244,60188,59802,59855,72196,68357,52106,80568,102309,58116,67116,80839,52161,100590,103918,103691,102683,53814,56736,57836,73547,58003,53979,53050,81112,56775,51542,70280,55724,68227,68172,67668,60592,56308,56456,106090,57528,55214,51460,59910,60133,51487,55328,70536,59144,63187,61203,53414,88653,56361,58778,54307,84578,68282,52688,53658,87778,60930,79440,66921,55577,79204,70794,72458,51721,99167,62625,74804,75108,62897,71051,71308,99807,100094,99500,104696,104912,94595,59694,101546,74308,75588,101886,74045,74527,51674,54616,53243,53298,51941,54111)
  209.                             )
  210.                         )
  211.                
  212.            
  213.         ) AS t
  214.       INNER JOIN account_chart AS ach ON t.account_id=ach.id
  215.    
  216.     GROUP BY
  217.            t.account_id,
  218.        
  219.            t.kbk_id,    
  220.        
  221.            t.kvd_id,    
  222.          t.kosgu_id,  
  223.  
  224.        
  225.          document_type_id,
  226.  
  227.        
  228.  
  229.         --- Аналитики
  230.        
  231.             t.analytic1,
  232.        
  233.             t.analytic2,
  234.        
  235.  
  236.         ach.activity_type,
  237.  
  238.         -- Чтобы запрос не отваливался с пустой группировкой
  239.         1
  240.  
  241.     ) AS z
  242.  
  243.         -- Расшифровка аналитик
  244.        
  245.             LEFT JOIN account_view_accelerator AS ava1 ON ava1.id = z.analytic1
  246.        
  247.             LEFT JOIN account_view_accelerator AS ava2 ON ava2.id = z.analytic2
  248.        
  249.  
  250.         --- Расшифровка обязательных аналитик
  251.            LEFT JOIN account_chart AS account_alias ON account_alias.id = z.account_id
  252.        
  253.        
  254.             LEFT JOIN kbk AS kbk_alias ON kbk_alias.id = z.kbk_id
  255.             LEFT JOIN kbk_analitycgroup AS kbk_analitycgroup_alias ON (kbk_analitycgroup_alias.id = kbk_alias.analytic_group_id)
  256.        
  257.            LEFT JOIN kbk_activity_type AS kbk_activity_type_alias ON kbk_activity_type_alias.id = z.kvd_id  
  258.          LEFT JOIN kbk_kosgu AS kbk_kosgu_alias ON kbk_kosgu_alias.id = z.kosgu_id                        
  259.        
  260.     )
  261.     SELECT unnest(sources) FROM data
  262.     WHERE
  263.         -- Не выводим строки c нулевыми оборотами или остатками
  264.         (
  265.           summa_begin_debet <> 0 OR
  266.           summa_begin_credit <> 0 OR
  267.  
  268.           summa_end_debet <> 0 OR
  269.           summa_end_credit <> 0 OR
  270.  
  271.           -- Только честные обороты, т.е. когда проводка была -1 +1 включительно
  272.           count_of_entries > 0
  273.         )
  274.  
  275. -- select* from account_entry_cumreg limit 1
  276.  
  277. -- select * from enterprise where
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement