Advertisement
Valik888

Untitled

Jan 15th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.22 KB | None | 0 0
  1. CREATE OR REPLACE PROCEDURE ten_percent_sale(
  2.  given_id    VARCHAR2,
  3.  given_month DATE
  4. )
  5. AS
  6.     CURSOR  service_cur IS
  7.         SELECT  *
  8.         FROM    n_accountservice
  9.         WHERE   account_id = given_id
  10.             AND service_id BETWEEN 101 AND 126;
  11.     services_t service_cur%ROWTYPE;
  12.     TYPE service_ntt IS TABLE OF services_t%TYPE;
  13.     l_services service_ntt;
  14.    
  15.     subsidiy      NUMBER;
  16.     tmp           NUMBER;
  17.     first_clause  BOOLEAN := FALSE;
  18.     second_clause BOOLEAN := FALSE;
  19.     third_clause  BOOLEAN := FALSE;
  20.     fourth_clause BOOLEAN := FALSE;
  21.     isRestruct    BOOLEAN := FALSE;
  22.     factsaldo     NUMBER; -- фактическое сальдо из n_balances
  23.     calcsaldo     NUMBER; -- сальдо из n_restructuring_service_list
  24.     saldo         NUMBER;
  25.     payment       NUMBER;
  26.    
  27. BEGIN
  28.     DBMS_OUTPUT.put_line('ID Account ' || given_id || ' дата: ' || given_month);
  29.     -- FIRST
  30.     SELECT COUNT(*)
  31.         INTO tmp
  32.         FROM n_accountservice na
  33.         WHERE na.account_id = given_id
  34.             AND na.service_id BETWEEN 101 AND 126;
  35.     IF tmp > 0 THEN
  36.         DBMS_OUTPUT.put_line('[ok]eсть 101..126 услуга, идём дальше');
  37.         first_clause := TRUE;
  38.     ELSE
  39.         DBMS_OUTPUT.put_line('[BREAK]нет 101..126 услуг');
  40.     END IF;
  41.  
  42.     -- SECOND если хоть одна 100я услуга по даному аккаунту имеет вид 2 - юзер имеет субсидию
  43.    
  44.     SELECT COUNT(*)
  45.     INTO tmp
  46.     FROM n_payments p
  47.     WHERE
  48.         p.account_id = given_id  AND vid = 2;
  49.    
  50.     IF tmp > 0 THEN
  51.         DBMS_OUTPUT.put_line('[BREAK]хотя бы одна 100я услуга по даному аккаунту имеет вид 2');
  52.     ELSE
  53.         DBMS_OUTPUT.put_line('[ok]ни одна 100я услуга по даному аккаунту не имеет вида 2');
  54.         second_clause := TRUE;
  55.     END IF;
  56.    
  57.     -- THIRD                       n_accountservice
  58.     FOR service_ IN (SELECT * FROM n_balances        n WHERE n.account_id = given_id ) LOOP
  59.         IF service_.service_id = 901 OR service_.service_id = 902 THEN
  60.             isRestruct := TRUE;
  61. --          SELECT
  62. --          b.summ INTO factsaldo
  63. --          FROM
  64. --          n_balances b
  65. --          WHERE b.account_id = given_id
  66. --              AND   b.DATA = trunc(given_month,'mm')
  67. --              and   service_id = 100;
  68.            
  69.             SELECT
  70.             SUM(b.summ) INTO factsaldo
  71.             FROM
  72.             n_balances b
  73.             WHERE b.account_id = given_id
  74.                 AND   b.DATA = ADD_MONTHS(TRUNC(given_month,'mm'), 0)
  75.                 AND   --(service_id = 901 or service_id = 902);
  76.                       service_id BETWEEN 101 AND 126;
  77.             BEGIN
  78.                 SELECT
  79.                 NVL(RSlist.summa_pay, 0) INTO calcSaldo
  80.                 FROM
  81.                 n_restructuring_service_list RSlist
  82.                 JOIN n_restructuring_service rs ON rs.ID = rslist.n_restructuring_service_id
  83.                 WHERE rs.account_id = given_id
  84.                 AND   rslist.DATA = ADD_MONTHS(TRUNC(given_month,'mm'), 0)
  85.                 AND   rs.service_id_out = 100; 
  86.             EXCEPTION WHEN NO_DATA_FOUND THEN
  87.                 calcsaldo := 0;
  88.                 DBMS_OUTPUT.put_line('Нет данных в табилце n_restructuring_service_list по аккаунту '||given_id||' и дате '||ADD_MONTHS(TRUNC(given_month,'mm'), -1));
  89.                
  90.             END;
  91.         END IF;
  92.     END LOOP;
  93.    
  94.     IF isRestruct = FALSE THEN
  95.         DBMS_OUTPUT.put_line('[ok]никакой реструкторизации');
  96.         third_clause := TRUE;
  97.     ELSE
  98.         IF calcsaldo <= factsaldo THEN
  99.             DBMS_OUTPUT.put_line('[ok]реструктуризация, n_balances <= factsaldo '||calcsaldo||' <= '||factsaldo);
  100.             third_clause := TRUE;
  101.         ELSE
  102.             DBMS_OUTPUT.put_line('[BREAK]реструктуризация, calcsaldo > factsaldo '||calcsaldo||' > '||factsaldo);
  103.             third_clause := FALSE;
  104.         END IF;
  105.     END IF;
  106.    
  107.    
  108.     -- FOUR Проверяем оплату до 20 числа прошлого месяца
  109.         SELECT NVL(SUM(p.summ),0) INTO saldo FROM n_payments p
  110.         WHERE   p.account_id = given_id
  111.             AND p.service_id  =100
  112.             AND (p.vid = 1 OR p.vid = 9)
  113.             AND TRUNC(p.DATA, 'mm') = TRUNC(given_month, 'mm')  -- текущий -1 месяц
  114.             AND EXTRACT(DAY FROM  p.DATA) <= 20;                -- берём отплаты до 20го числа включительно
  115.            
  116.         SELECT NVL(SUM(nb.summ), 0) INTO payment FROM n_balances nb
  117.         WHERE   nb.account_id = given_id
  118.             AND nb.service_id BETWEEN 101 AND 126
  119.             AND TRUNC(nb.DATA,'mm') = ADD_MONTHS(TRUNC(given_month,'mm'), -1); 
  120.            
  121.         SELECT NVL(SUM(na.summ), 0) INTO tmp FROM n_accruals na
  122.         WHERE   na.account_id = given_id
  123.             AND TRUNC(na.DATA,'mm') = TRUNC(given_month,'mm')
  124.             AND na.service_id = 100
  125.             AND na.summ <= 0;
  126.        
  127.         IF ((payment+tmp) - saldo) <= 0 THEN
  128.             DBMS_OUTPUT.put_line('[ok]разница платежа и сальдо <= 0! ('||payment||'+('||tmp||') - '||saldo||'='||((payment+tmp) - saldo)||')');
  129.             fourth_clause := TRUE;
  130.         ELSE
  131.             DBMS_OUTPUT.put_line('[BREAK]разница платежа и сальдо > 0! ('||payment||'+('||tmp||') - '||saldo||'='||((payment+tmp) - saldo)||')');
  132.         END IF;
  133.    
  134.     IF      first_clause  = TRUE
  135.         AND second_clause = TRUE  
  136.         AND third_clause  = TRUE
  137.         AND fourth_clause = TRUE
  138.     THEN
  139.         DBMS_OUTPUT.put_line('[SUCCESS]');
  140.     ELSE
  141.         DBMS_OUTPUT.put_line('[FAIL]');
  142.     END IF;
  143.     DBMS_OUTPUT.put_line(' '||boolean_to_char(first_clause)
  144.         ||' '||boolean_to_char(second_clause)
  145.         ||' '||boolean_to_char(third_clause)
  146.         ||' '||boolean_to_char(fourth_clause)
  147.     );
  148. END ten_percent_sale;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement