Advertisement
Valik888

Untitled

Jan 12th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.15 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.     first_clause NUMBER;
  17.     second_clause NUMBER;
  18.     factsaldo NUMBER; -- фактическое сальдо из n_balances
  19.     calcsaldo NUMBER; -- сальдо из n_restructuring_service_list
  20.     saldo     NUMBER;
  21.     payment   NUMBER;
  22.     isRestruct BOOLEAN := FALSE;
  23. BEGIN
  24.     -- FIRST
  25.     SELECT COUNT(*)
  26.         INTO first_clause
  27.         FROM n_accountservice na
  28.         WHERE na.account_id = given_id
  29.             AND na.service_id BETWEEN 101 AND 126;
  30.     IF first_clause > 0 THEN
  31.         DBMS_OUTPUT.put_line('[ok]eсть 101..126 услуга, идём дальше');  
  32.     ELSE
  33.         DBMS_OUTPUT.put_line('[BREAK]нет 101..126 услуг');
  34.     END IF;
  35.  
  36.     -- SECOND если хоть одна 100я услуга по даному аккаунту имеет вид 2 - юзер имеет субсидию
  37.     FOR service_ IN service_cur LOOP
  38.         SELECT COUNT(*) INTO second_clause FROM n_payments p WHERE
  39.         p.account_id = given_id AND p.service_id = service_.service_id AND vid = 2;
  40.         IF second_clause > 0 THEN
  41.             DBMS_OUTPUT.put_line('[BREAK]хотя бы одна 100я услуга по даному аккаунту имеет вид 2');
  42.         ELSE
  43.             DBMS_OUTPUT.put_line('[ok]ни одна 100я услуга по даному аккаунту не имеет вида 2');
  44.         END IF;
  45.     END LOOP;  
  46.    
  47.     -- THIRD                       n_accountservice
  48.     FOR service_ IN (SELECT * FROM n_balances        n WHERE n.account_id = given_id ) LOOP
  49.         IF service_.service_id = 901 OR service_.service_id = 902 THEN
  50.             isrestruct := TRUE;
  51.             SELECT
  52.                 NVL(SUM(b.summ), 0) INTO factsaldo
  53.                 FROM
  54.                 n_balances b
  55.                 WHERE b.account_id = given_id
  56.                 AND   b.DATA = ADD_MONTHS(TRUNC(given_month,'mm'),-1);
  57.            
  58. --          SELECT
  59. --              nvl(sum(rlist.summa), 0) INTO calcSaldo
  60. --              FROM
  61. --              n_balances b
  62. --              JOIN n_restructuring_service rservice ON rservice.account_id = b.account_id
  63. --              JOIN  n_restructuring_service_list rlist ON rlist.n_restructuring_service_id = b.service_id
  64. --              WHERE b.account_id = given_id
  65. --                  AND rlist.DATA = add_months(trunc(given_month,'mm'),-1);
  66.             SELECT
  67.                 NVL(SUM(rservice.summa_pay), 0) INTO calcSaldo
  68.                 FROM
  69.                 n_restructuring_service rservice
  70.                 WHERE rservice.account_id = given_id
  71.                     AND rservice.DATE_END >= ADD_MONTHS(TRUNC(given_month,'mm'),-1);
  72.  
  73. --              dbms_output.put_line('factsaldo '||factsaldo||', calcSaldo '||calcSaldo);
  74.         END IF;
  75.     END LOOP;
  76.         IF isrestruct = FALSE THEN
  77.             DBMS_OUTPUT.put_line('[ok]никакой реструкторизации');
  78.         ELSE
  79.             IF calcsaldo <= factsaldo THEN
  80.                 DBMS_OUTPUT.put_line('[ok]реструктуризация, n_balances <= factsaldo '||calcsaldo||' <= '||factsaldo);
  81.             ELSE
  82.                 DBMS_OUTPUT.put_line('[BREAK]реструктуризация, calcsaldo > factsaldo '||calcsaldo||' > '||factsaldo);
  83.             END IF;
  84.         END IF;
  85.    
  86.    
  87.     -- FOUR Проверяем оплату до 20 числа прошлого месяца
  88.         SELECT NVL(SUM(p.summ),0) INTO saldo FROM n_payments p
  89.         WHERE   p.account_id = given_id
  90.             AND p.service_id  =100
  91.             AND (p.vid = 1 OR p.vid = 9)
  92.             AND TRUNC(p.DATA, 'mm') = TRUNC(given_month, 'mm')  -- текущий -1 месяц
  93.             AND EXTRACT(DAY FROM  p.DATA) <= 20;                -- берём отплаты до 20го числа включительно
  94.            
  95.         SELECT NVL(SUM(nb.summ), 0) INTO payment FROM n_balances nb
  96.         WHERE nb.account_id = given_id
  97.             AND nb.service_id BETWEEN 101 AND 126
  98.             AND TRUNC(nb.DATA,'mm') = ADD_MONTHS(TRUNC(given_month,'mm'), -1); 
  99.         IF (payment - saldo) <= 0 THEN
  100.             DBMS_OUTPUT.put_line('[ok]разница платежа и сальдо <= 0! ('||payment||' - '||saldo||'='||(payment-saldo)||')');
  101.         ELSE
  102.             DBMS_OUTPUT.put_line('[BREAK]разница платежа и сальдо > 0! ('||payment||' - '||saldo||'='||(payment-saldo)||')');
  103.         END IF;
  104.  
  105. END ten_percent_sale;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement