d9e5a92d

Банки, зарегистрированные в клиринговой палате



-- Таблица банков, зарегистрированных в клиринговой палате
CREATE TABLE Banks
(
BankID Number(8) -- Индентификационный № банка
CONSTRAINT bankno_pk PRIMARY KEY,
BankName VARCHAR2(100) NOT NULL -- Наименование банка
CONSTRAINT bankname UNIQUE,
UserName VARCHAR(20) NOT NULL -- Имя пользователя для входа
CONSTRAINT username UNIQUE
);

-----------------------------------------------
-- Модуль BankState
-- Таблица состояния банков-участников в текущем сеансе
-----------------------------------------------

PROMPT Creating table BankState...

CREATE TABLE BankState
(
BankID NUMBER(8) -- Идентификатор банка
CONSTRAINT sessionbankid_fk REFERENCES Banks ON DELETE CASCADE,
BankStatus NUMBER(3) NOT NULL -- Статус банка в текущем сеансе
);

-----------------------------------------------
-- Пакет ClientUtils
-- Интерфейс модуля "АРМ оператора банка"
-----------------------------------------------

PROMPT Creating package ClientUtils...

CREATE OR REPLACE PACKAGE ClientUtils
AS

-- Возвращает флаг состояния текущей сессии
FUNCTION GetSessionStatus RETURN INT;


-- Процедура начала клирингового сеанса для банка-участника
FUNCTION StartBankSession(aBankID IN INT) RETURN INT;


-- Процедура завершения клирингового сеанса для банка-участника
PROCEDURE StopBankSession(aBankID IN INT);


-- Возвращает уникальный номер вызвавшего банка
FUNCTION GetOurID RETURN INT;


-- Возвращает окончательног сальдо банка
FUNCTION GetFinalSaldo(aBankID IN INT) RETURN INT;

-- Процедура отсылки в клиринговую палату платежа в "электронном" виде
PROCEDURE SendMessage(aSourceBankID IN INT,
aDebitBankID IN INT,
aCreditBankID IN INT,
aAmount IN INT);

END ClientUtils;

/
SHOW ERROR;

-----------------------------------------------
-- Пакет процедур для работы банков-клиентов клиринговой палаты
-----------------------------------------------

PROMPT Creating package body ClientUtils...

CREATE OR REPLACE PACKAGE BODY ClientUtils
AS

-- Функция возвращает флаг состояния текущей сессии

FUNCTION GetSessionStatus RETURN INT
IS
BEGIN

RETURN ServerUtils.SessionState;

END GetSessionStatus;


-- Процедура подключения банка к очередной сессии клиринговой палаты
-- Выполняется каждый рабочий день в определенное время после выполнения
-- на сервере КП процедуры инициализации клирингового сеанса

FUNCTION StartBankSession(aBankID IN INT) RETURN INT
IS
BEGIN

IF ServerUtils.SessionState = GlobalConst.cSessionActive THEN

UPDATE BankState
SET BankStatus = GlobalConst.cBankWork
WHERE BankID = aBankID;

END IF;

RETURN ServerUtils.SessionState;

END StartBankSession;


-- Процедура выхода банка из текущего клирингового сеанса
-- Выполняется кажый день в определенное время до закрытия сеанса
-- на сервере КП

PROCEDURE StopBankSession(aBankID IN INT)
IS
BEGIN

UPDATE BankState
SET BankStatus = GlobalConst.cBankStopWork
WHERE BankId = aBankID;

END StopBankSession;


-- Функция возвращает уникальный номер вызывающего банка

FUNCTION GetOurID RETURN INT
IS

Res INT;

BEGIN

SELECT BankID INTO Res FROM Banks
WHERE UserName = USER;

END GetOurID;


-- Функция возвращает чистую позицию банка по окончанию сеанса

FUNCTION GetFinalSaldo(aBankID IN INT) RETURN INT
IS

aSaldo INT;

BEGIN

BEGIN

SELECT DebitPos-CreditPos INTO aSaldo FROM Results
WHERE BankID = aBankID;

EXCEPTION

WHEN No_Data_Found THEN aSaldo := NULL;

END;

RETURN aSaldo;

END GetFinalSaldo;


-- Процедура отсылки на сервер КП "электронного" платежа

PROCEDURE SendMessage(aSourceBankID IN INT,
aDebitBankID IN INT,
aCreditBankID IN INT,
aAmount IN INT)
IS

aMsgID INT;

BEGIN

SELECT Msg_Seq.NextVal INTO aMsgID FROM Dual;

INSERT INTO Messages
VALUES (aMsgID, aSourceBankID, aDebitBankID,
aCreditBankID, aAmount, GlobalConst.cMsgNotProcessed);

END SendMessage;

END ClientUtils;

/
SHOW ERROR;

-----------------------------------------------
-- Пакет CommonUtils
-- Интерфейс общих подпрограмм
-----------------------------------------------

PROMPT Creating package CommonUtils...

CREATE OR REPLACE PACKAGE CommonUtils
AS

-- Возвращает уникальный номер банка по его имени
FUNCTION GetBankID(aBankName IN VARCHAR2) RETURN INT;


-- Возвращает текущее дебетовое сальдо
FUNCTION GetCurrentDebitSaldo(aBankID IN INT) RETURN INT;




-- Возвращает текущее кредитовое сальдо
FUNCTION GetCurrentCreditSaldo(aBankID IN INT) RETURN INT;

END CommonUtils;

/
SHOW ERROR;

-----------------------------------------------
-- Процедуры и функции общего пользования
-----------------------------------------------

PROMPT Creating package CommonUtils...

CREATE OR REPLACE PACKAGE BODY CommonUtils
AS


-- Возвращает уникальный идентификатор банка-участника по его имени

FUNCTION GetBankID(aBankName IN VARCHAR2) RETURN INT
IS

Res INT;

BEGIN

BEGIN

SELECT BankID INTO Res FROM Banks
WHERE BankName = aBankName;

EXCEPTION

WHEN No_Data_Found THEN Res := NULL;

END;

RETURN Res;

END GetBankID;


-- Возвращает текущее дебетовое сальдо банка-участника

FUNCTION GetCurrentDebitSaldo(aBankID IN INT) RETURN INT
IS

Res INT;

BEGIN

BEGIN

SELECT DebitPos INTO Res FROM TmpRes
WHERE BankID = aBankID;

EXCEPTION

WHEN No_Data_Found THEN
Res := 0;

END;

RETURN Res;

END GetCurrentDebitSaldo;


-- Возвращает текущее кредитовое сальдо банка-участника

FUNCTION GetCurrentCreditSaldo(aBankID IN INT) RETURN INT
IS

Res INT;

BEGIN

BEGIN

SELECT CreditPos INTO Res FROM TmpRes
WHERE BankID = aBankID;

EXCEPTION

WHEN No_Data_Found THEN
Res := 0;

END;

RETURN Res;

END GetCurrentCreditSaldo;

END CommonUtils;

/
SHOW ERROR;

--------------------------------------------------------
-- Модуль содержит глобальные константы
--------------------------------------------------------

PROMPT Creating package GlobalConst

CREATE OR REPLACE PACKAGE GlobalConst
AS

cStatusClass CONSTANT INT := -1;

cBankWork CONSTANT INT := 1;
cBankStopWork CONSTANT INT := 2;
cBankNotWork CONSTANT INT := 3;

cMsgNotProcessed CONSTANT INT := 1;
cMsgAccepted CONSTANT INT := 2;
cMsgSourceError CONSTANT INT := 3;
cMsgDebitError CONSTANT INT := 4;
cMsgCreditError CONSTANT INT := 5;
cMsgProcessed CONSTANT INT := 6;

cSessionUnActive CONSTANT INT := 1;
cSessionActive CONSTANT INT := 2;

END GlobalConst;

/
SHOW ERROR;

------------------------------------------------------
-- Модуль инициализации системы в СУБД Oracle 7.3.3
------------------------------------------------------

CONNECT INTERNAL

SPOOL createdb.log

SET ECHO ON

CREATE TABLESPACE "CLEARING" DATAFILE 'C:\ORAWIN95\DATABASE\clearing.dbf'
SIZE 5M REUSE DEFAULT STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 1
MAXEXTENTS 120 PCTINCREASE 0);

CREATE USER "ALEX" IDENTIFIED BY "ALEX"
DEFAULT TABLESPACE "CLEARING";

GRANT "DBA" TO "ALEX" WITH ADMIN OPTION;
GRANT UNLIMITED TABLESPACE to "ALEX" WITH ADMIN OPTION;
GRANT SELECT ANY TABLE to "ALEX" WITH ADMIN OPTION;
GRANT GRANT ANY ROLE to "ALEX" WITH ADMIN OPTION;
GRANT CREATE ANY SYNONYM to "ALEX" WITH ADMIN OPTION;
GRANT DROP ANY SYNONYM to "ALEX" WITH ADMIN OPTION;
GRANT EXECUTE ANY PROCEDURE to "ALEX";
GRANT CREATE USER to "ALEX";
GRANT ALTER USER to "ALEX";
GRANT DROP USER to "ALEX";
GRANT GRANT ANY PRIVILEGE to "ALEX";

SPOOL OFF

EXIT

--------------------------------------------------
-- Начальное создание объектов системы
--------------------------------------------------

PROMPT Creating databases and sequences...

@@consts.pkg
@@banks
@@messages
@@status
@@statinit
@@bnkstate
@@results
@@tmpres
@@statist

PROMPT Creating packages...

@@srvrutil.pkg
@@srvrutil.bdy

@@clntutil.pkg
@@clntutil.bdy

@@commutil.pkg
@@commutil.bdy

-------------------------------------------------------------
-- Таблица и последовательность для обработки сообщений
-------------------------------------------------------------

PROMPT Creating sequence Msg_Seq...

CREATE SEQUENCE Msg_Seq
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999
MINVALUE 1
NOCACHE
CYCLE;

PROMPT Creating table Messages...

CREATE TABLE Messages
(
MessageID NUMBER(8) -- Номер сообщения
CONSTRAINT message_pk PRIMARY KEY,
SourceBankID NUMBER(8) -- Банк-источник сообщения
CONSTRAINT sourcebank_fk REFERENCES Banks ON DELETE CASCADE,
DebitBankID NUMBER(8) -- Банк-получатель
CONSTRAINT debitbank_fk REFERENCES Banks ON DELETE CASCADE,
CreditBankID NUMBER(8) -- Банк-плательщик
CONSTRAINT creditbank_fk REFERENCES Banks ON DELETE CASCADE,
Amount INT NOT NULL, -- Сумма
MsgStatus INT NOT NULL -- Статус сообщения
);

--------------------------------------------------------------
-- Таблица окончательных результатов клирингового сеанса
--------------------------------------------------------------

PROMPT Creating table Results...

CREATE TABLE RESULTS
(
BankID NUMBER(8)
CONSTRAINT resultbankid_fk REFERENCES Banks ON DELETE CASCADE,
DebitPos INT,
CreditPos INT
);

-------------------------------------------------------



Содержание раздела