Advertisement
Valik888

Untitled

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