Click to go home


Package body


CREATE OR REPLACE PACKAGE BODY prc_mb_body IS
	

FUNCTION fn_logon_request
    	(pIN_teller_id       varchar2,
    	 pIN_pass_word       varchar2)
    	RETURN    NUMBER
IS
   	vnbr_authority_level    tellers.authority_level%TYPE;
 
BEGIN
    	SELECT authority_level
    	INTO vnbr_authority_level
    	FROM tellers
   	WHERE teller_id = pIN_teller_id and pass_word = pIN_pass_word;
    	RETURN (vnbr_authority_level);

EXCEPTION
       WHEN others THEN
       RETURN (-1);

END fn_logon_request;


PROCEDURE sp_customer_add
	(pIN_sin varchar2, pIN_last_name varchar2, pIN_first_name varchar2,
         pIN_middle_name varchar2, pIN_address_line1 varchar2, pIN_address_line2 varchar2,
         pIN_city varchar2, pIN_province varchar2, pIN_country varchar2, pIN_postal varchar2,
         pIN_phone varchar2, pIN_pin varchar2, pIN_teller_id varchar2, pOT_newid OUT number,
         pOT_credit_allowed OUT number, pOT_credit_description OUT varchar2)
IS
  	vNBR_auth_level    tellers.authority_level%type;
BEGIN
   	SELECT authority_level
    	INTO vNBR_auth_level
    	FROM tellers
    	WHERE teller_id = pIN_teller_id;
	
   	IF vNBR_auth_level = 0 THEN
	    raise_application_error(-20200,'Unauthorized access!');
    	ELSIF vNBR_auth_level < 0 THEN
	    raise_application_error(-20201,'Invalid Teller ID.');
    	ELSE
	    hq_national.sp_cust_credit(pIN_sin,pOT_credit_allowed,
	    pOT_credit_description);
	    INSERT INTO customers
	    VALUES(seq_customer_id.NEXTVAL,pIN_sin,pIN_last_name,
	    pIN_first_name,pIN_middle_name,pIN_address_line1,
	    pIN_address_line2,pIN_city,pIN_province,pIN_country,
	    pIN_postal,pIN_phone,pIN_pin);
	    SELECT seq_customer_id.CURRVAL
	    INTO pOT_newid
	    FROM dual;
	    COMMIT;
        END IF; 

END sp_customer_add; 

	
PROCEDURE sp_customer_modify
    	(pIN_customer_id number, pIN_last_name varchar2, pIN_first_name varchar2, 
         pIN_middle_name varchar2, pIN_address_line1 varchar2, pIN_address_line2 varchar2,
         pIN_city varchar2, pIN_province varchar2, pIN_country varchar2, pIN_postal varchar2,
         pIN_phone varchar2, pIN_pin varchar2, pIN_teller_id varchar2)
IS
  	vNBR_auth_level    tellers.authority_level%type;
BEGIN
        SELECT authority_level
        INTO vNBR_auth_level
        FROM tellers
        WHERE teller_id = pIN_teller_id;

        IF vNBR_auth_level = 1 THEN
	    UPDATE customers
	    SET last_name = pIN_last_name, first_name = pIN_first_name,
              middle_name = pIN_middle_name, address_line1 = pIN_address_line1,
              address_line2 = pIN_address_line2, city = pIN_city, province = pIN_province,
              country = pIN_country, postal_code = pIN_postal, phone = pIN_phone, pin = pIN_pin
	    WHERE customer_id = pIN_customer_id;
        ElSE
	    raise_application_error(-20210,'Unauthorized access.'); 
        END IF;

END sp_customer_modify;	

	
PROCEDURE sp_customer_delete
    (pIN_customer_id     NUMBER,
     pIN_teller_id       VARCHAR2)
IS
     vnbr_authority_level  tellers.authority_level%TYPE;
     vEXC_invalid_logon    EXCEPTION;
     vEXC_read_only        EXCEPTION;

BEGIN
     SELECT  authority_level
     INTO    vnbr_authority_level
     FROM    tellers
     WHERE   teller_id = pIN_teller_id;

     IF vnbr_authority_level = 1 THEN
        DELETE FROM customers
        WHERE customer_id = pIN_customer_id;
	Commit;
     ELSIF vnbr_authority_level = 0 THEN
        RAISE vEXC_read_only;
     ELSE
        RAISE vEXC_invalid_logon;
     END IF;

EXCEPTION
     WHEN vEXC_read_only THEN
        RAISE_APPLICATION_ERROR (-20196, 'Teller only has read access privalege');
     WHEN vEXC_invalid_logon THEN
        RAISE_APPLICATION_ERROR (-20197, 'Invalid teller');

END sp_customer_delete;


PROCEDURE SP_CUSTOMER_SEARCH
        (pIN_Search_Name varchar2, pOT_Results OUT varchar2)
IS
	Cursor vcur IS
	SELECT Customer_ID, Last_Name, First_Name, Middle_Name
	FROM Customers
	WHERE lower(Last_Name) like lower('pIN_Search_Name%');
BEGIN
	For vrec in vcur LOOP
	pOT_Results:=pOT_Results || to_char(vrec.Customer_ID) || ';' || initcap(vrec.Last_Name)
        || ',' || initcap(vrec.First_Name) || ' ' || initcap(vrec.Middle_Name) || '*';
	END LOOP;

END sp_customer_search;

	
PROCEDURE SP_CUSTOMER_FIND
	(pIN_Customer_ID number, pOT_Result OUT varchar2)
IS
	vrec Customers%ROWTYPE;
BEGIN
	SELECT *
	INTO vrec
	FROM Customers
	WHERE Customer_ID=pIN_Customer_ID;

	pOT_Result:=to_char(vrec.Customer_ID) || ';' || vrec.SIN || ';' || vrec.Last_Name ||
        ';' || vrec.First_Name || ';' || vrec.Middle_Name || ';' || vrec.Address_Line1 || ';'
        || vrec.Address_Line2 || ';' || vrec.City || ';' || vrec.Province || ';' || 
        vrec.Country || ';' || vrec.Postal_Code || ';' || vrec.Phone || ';' || vrec.PIN || ';';

	IF SQL%NOTFOUND THEN
		raise_application_error(-20007, 'No Record Found.');
	END IF;

END sp_customer_find;

	
PROCEDURE SP_CUSTOMER_FIND
	(pIN_First_Name varchar2, pIN_Last_Name varchar2, pIN_Middle_Name varchar2, 
         pOT_Result OUT varchar2)
IS
	vrec	Customers%Rowtype;
BEGIN
	SELECT *
	INTO vrec
	FROM Customers
	WHERE lower(First_Name)=lower(pIN_First_Name)
	AND lower(Last_Name)=lower(pIN_Last_Name)
	AND lower(Middle_Name)=lower(pIN_Middle_Name);

	pOT_Result:=to_char(vrec.Customer_ID) || ';' || vrec.SIN || ';' || vrec.Last_Name ||
        ';' || vrec.First_Name || ';' || vrec.Middle_Name || ';' || vrec.Address_Line1 || ';'
        || vrec.Address_Line2 || ';' || vrec.City || ';' || vrec.Province || ';' || 
        vrec.Country || ';' || vrec.Postal_Code || ';' || vrec.Phone || ';' || vrec.PIN || ';';

	IF SQL%NOTFOUND THEN
		raise_application_error(-20007, 'No Record Found.');
	END IF;

END sp_customer_find;

	
PROCEDURE SP_CUSTOMER_FIND
	(pIN_SIN number, pOT_Result OUT varchar2)
IS
	vrec	Customers%Rowtype;
BEGIN
	SELECT *
	INTO vrec
	FROM Customers
	WHERE SIN = to_char(pIN_SIN);

	pOT_Result:=to_char(vrec.Customer_ID) || ';' || vrec.SIN || ';' || vrec.Last_Name ||
        ';' || vrec.First_Name || ';' || vrec.Middle_Name || ';' || vrec.Address_Line1 || ';'
        || vrec.Address_Line2 || ';' || vrec.City || ';' || vrec.Province || ';' || 
        vrec.Country || ';' || vrec.Postal_Code || ';' || vrec.Phone || ';' || vrec.PIN || ';';

	IF SQL%NOTFOUND THEN
		raise_application_error(-20007, 'No Record Found.');
	END IF;

END sp_customer_find;

	
PROCEDURE sp_trans_add
	    (pIN_type varchar2, pIN_amount number, pIN_from varchar2, 
             pIN_to varchar2, pIN_teller_id varchar2, pOT_trans_ctr OUT number)
IS
    vNBR_auth_level    tellers.authority_level%type;
    vNBR_interest      hq_national.account_types.interest_rate%type;
    vNBR_account_type  customer_accounts.accounttype_id%type;
BEGIN
    SELECT authority_level
    INTO vNBR_auth_level
    FROM tellers
    WHERE teller_id = pIN_teller_id;

    IF vNBR_auth_level = 1 THEN
	IF pIN_type = 'WTH' THEN
	    UPDATE customer_accounts
	    SET balance = balance - pIN_amount
	    WHERE account_id = pIN_from;
	    
	    
	ELSIF pIN_type = 'DEP' THEN
	    UPDATE customer_accounts
	    SET balance = balance + pIN_amount
	    WHERE account_id = pIN_to;
	ELSIF pIN_type = 'PUR' THEN
	    UPDATE customer_accounts
	    SET balance = balance + pIN_amount
	    WHERE account_id = pIN_from;
	    
	    
	ELSIF pIN_type = 'PAY' THEN
	    UPDATE customer_accounts
	    SET balance = balance - pIN_amount
	    WHERE account_id = pIN_to;
	ELSIF pIN_type = 'TFR' THEN
	    UPDATE customer_accounts
	    SET balance = balance - pIN_amount
	    WHERE account_id = pIN_from;
	    
	    	    
	    UPDATE customer_accounts
	    SET balance = balance + pIN_amount
	    WHERE account_id = pIN_to;
	ELSIF pIN_type = 'INT' THEN
	    SELECT accounttype_id
	    INTO vNBR_account_type
	    FROM customer_accounts
	    WHERE account_id = pIN_to;
	    
	    SELECT interest_rate 
	    INTO vNBR_interest
	    FROM hq_national.account_types
	    WHERE accounttype_id = vNBR_account_type;
	    
	    UPDATE customer_accounts
	    set balance = balance + (balance*vNBR_interest)
	    WHERE account_id = pIN_to;

	ELSE
	   raise_application_error(-20302,'Invalid TransactionType.');
	END IF;
    

    	SELECT seq_transaction_ctr.NEXTVAL
    	INTO pOT_trans_ctr
    	from dual;
    
    	INSERT INTO transactions
   	VALUES(pOT_trans_ctr, sysdate, pIN_type, pIN_amount, pIN_from,
		pIN_to, pIN_teller_id);
    	COMMIT; 
        ELSIF vNBR_auth_level = 0 THEN
	    raise_application_error(-20200,'Unauthorized access!');
        ELSE
	    raise_application_error(-20201,'Invalid Teller ID.');
        END IF;

END sp_trans_add;

	 
PROCEDURE SP_ACCOUNT_ADD
	(pIN_Customer_ID number, pIN_Account_Type number, 
	pOT_Account_ID  OUT varchar2, pIN_Teller_ID varchar2)
IS
	vnbr_limit      customer_accounts.limit%type;
	vNBR_auth_level	tellers.authority_level%type;
BEGIN
	SELECT authority_level
	INTO vNBR_auth_level
	FROM tellers
	WHERE teller_ID=pIN_teller_ID;

	IF vNBR_auth_level=1 THEN 
		SELECT Prefix||seq_account_id.NEXTVAL,limit
		INTO pOT_account_id,vnbr_limit
		FROM HQ_NATIONAL.Account_Types
		WHERE AccountType_ID=pIN_Account_Type;

		IF SQL%FOUND THEN
			INSERT INTO Customer_accounts
		        VALUES(pOT_account_id, pIN_Customer_ID, pIN_Account_Type, 
                               'OPN',0,vnbr_limit);
      		ELSE raise_application_error(-20100,'There is no such Account Type');
		END IF;
	
	ELSE raise_application_error(-20004, 'Invalid Teller ID');
	END IF;

END sp_account_add;

	
PROCEDURE sp_apply_interest
   (pIN_teller_id       VARCHAR2)
IS

    vstr_account_id        customer_accounts.account_id%TYPE;
    vnbr_accounttype_id    customer_accounts.accounttype_id%type;
    vnbr_count             NUMBER;
    vnbr_authority_level   tellers.authority_level%TYPE;
    vnbr_interest          NUMBER;
    vnbr_interest_rate     HQ_NATIONAL.account_types.interest_rate%TYPE;
    vEXC_invalid_logon     EXCEPTION;
    vEXC_read_only         EXCEPTION;
    vnbr_trans_ctr         NUMBER;

    CURSOR customer_accounts_cursor IS
    SELECT accounttype_id, account_id, balance
    FROM customer_accounts;

    customer_accounts_rec      customer_accounts_cursor%ROWTYPE;

BEGIN
    SELECT COUNT(account_id)
    INTO vnbr_count
    FROM customer_accounts;

    SELECT authority_level
    INTO  vnbr_authority_level
    FROM  tellers
    WHERE teller_id = pIN_teller_id;

  IF vnbr_authority_level = 1 THEN

    IF NOT customer_accounts_cursor%ISOPEN THEN
      open customer_accounts_cursor;
    ELSE
     close customer_accounts_cursor;
     open customer_accounts_cursor;
    END IF;
 
    FOR i IN 1..vnbr_count LOOP
      FETCH customer_accounts_cursor INTO customer_accounts_rec;
      vnbr_accounttype_id := customer_accounts_rec.accounttype_id;
      vstr_account_id := customer_accounts_rec.account_id;
     
    SELECT interest_rate
    INTO vnbr_interest_rate
    FROM HQ_NATIONAL.account_types
    WHERE accounttype_id = vnbr_accounttype_id;

    vnbr_interest := customer_accounts_rec.balance *
                           vnbr_interest_rate;
   
    sp_trans_add('INT', vnbr_interest, NULL, vstr_account_id, 
                              pIN_teller_id, vnbr_trans_ctr);
    END LOOP;
    close customer_accounts_cursor;

  ELSIF vnbr_authority_level = 0 THEN
     raise vEXC_read_only;
  ELSE
     raise vEXC_invalid_logon;
  END IF;

EXCEPTION

    WHEN vEXC_read_only THEN
        RAISE_APPLICATION_ERROR(20134, 'Teller only has read access');

    WHEN vEXC_invalid_logon THEN
        RAISE_APPLICATION_ERROR(20133, 'Invalid teller');

END sp_apply_interest;

	
PROCEDURE sp_account_list
    (pIN_customer_id      number,
     pOT_results   OUT    varchar2)
IS
     vnbr_accounttype_id   HQ_NATIONAL.account_types.accounttype_id%TYPE;
     vstr_description      HQ_NATIONAL.account_types.description%TYPE;
     vnbr_count            NUMBER;

     
     CURSOR  account_list_cursor IS
     SELECT accounttype_id, account_id, status, balance, limit
     FROM  customer_accounts
     WHERE customer_id = pIN_customer_id;

     account_list_rec       account_list_cursor%ROWTYPE;

    
BEGIN
    SELECT  count(account_id)
    INTO    vnbr_count
    FROM    customer_accounts
    WHERE   customer_id = pIN_customer_id;

    IF not account_list_cursor%ISOPEN THEN
        open account_list_cursor;
    ELSE
        close account_list_cursor;
        open account_list_cursor;
    END IF;
      
    FOR i IN 1..vnbr_count LOOP
        FETCH account_list_cursor INTO account_list_rec;
        vnbr_accounttype_id := account_list_rec.accounttype_id;

        SELECT description
        INTO vstr_description
        FROM  HQ_NATIONAL.account_types
        WHERE accounttype_id = vnbr_accounttype_id;
	
	pOT_results := pOT_results ||account_list_rec.account_id 
             ||'; '|| vstr_description||'; '|| 
             account_list_rec.status
             ||'; '||to_char(account_list_rec.balance)||'; '||
             to_char(account_list_rec.limit)||'*';
    
      END LOOP;   

EXCEPTION

     WHEN others THEN
        RAISE_APPLICATION_ERROR (-20193, 'Please try again');

END sp_account_list;

END prc_mb_body;
/

Back to Package spec

Go to top