Автоматизированная информационная система учета кредитов физических лиц в коммерческом банке

Создание программы предназначенной для автоматизации деятельности кредитного сотрудника банка. Анализ рынка автоматизации кредитования физических лиц. Выбор СУБД и языка программирования. Инфологическое проектирование и разработка интерфейса АИС.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.12.2013
Размер файла 3,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Требования к организации и оборудованию рабочих мест с ПЭВМ для пользователей

1. Высота рабочей поверхности стола для взрослых пользователей должна регулироваться в пределах 680 - 800 мм; при отсутствии такой возможности высота рабочей поверхности стола должна составлять 725 мм.

2. Модульными размерами рабочей поверхности стола для ПЭВМ, на основании которых должны рассчитываться конструктивные размеры, следует считать: ширину 800, 1000, 1200 и 1400 мм, глубину 80U и 1000 мм при нерегулируемой его высоте, равной 725 мм.

3. Рабочий стол должен иметь пространство для ног высотой не менее 600 мм, шириной - не менее 500 мм, глубиной на уровне колен - не менее 450 мм и на уровне вытянутых ног - не менее 650 мм.

4. Конструкция рабочего стула должна обеспечивать:

- ширину и глубину поверхности сиденья не менее 400 мм;

- поверхность сиденья с закругленным передним краем;

- регулировку высоты поверхности сиденья в пределах 400 - 550 мм и углам наклона вперед до 15 град, и назад до 5 град.;

- высоту опорной поверхности синяки 300 +/- 20 мм, ширину - не менее 380 мм и радиус кривизны горизонтальной плоскости -400 мм;

- угол наклона спинки в вертикальной плоскости в пределах +/- 30 градусов;

- регулировку расстояния спинки от переднего края сиденья в пределах 260 - 400 мм;

- стационарные или съемные подлокотники длиной не менее 250 Мм и шириной - 50 - 70 мм;

- регулировку подлокотников по высоте над сиденьем в пределах 230 +/-30 мм и внутреннего расстояния между подлокотниками в пределах 350 - 500 мм.

5. Рабочее место пользователя ПЭВМ следует оборудовать подставкой для ног, имеющей ширину не менее 300 мм, глубину не менее 400 мм, регулировку по высоте в пределах до 150 мм и по углу наклона опорной поверхности подставки до 20 град. Поверхность подставки должна быть рифленой и иметь по переднему краю бортик высотой 10 мм.

6. Клавиатуру следует располагать на поверхности стола на расстоянии 100 - 300 мм от края, обращенного к пользователю, или на специальной, регулируемой по высоте рабочей поверхности, отделенной от основной столешницы.

Требования к организации медицинского обслуживания пользователей ПЭВМ

1. Лица, работающие с ПЭВМ более 50% рабочего времени (профессионально связанные с эксплуатацией ПЭВМ), должны проходить обязательные предварительные при поступлении на работу и периодические медицинские осмотры в установленном порядке.

2. Женщины со времени установления беременности переводятся на работы, не связанные с использованием ПЭВМ, или для них ограничивается время работы с ПЭВМ (не более 3-х часов за рабочую смену) при условии соблюдения гигиенических требований, установленных настоящими Санитарными правилами. Трудоустройство беременных женщин следует осуществлять в соответствии с законодательством Российской Федерации.

Требования к проведению государственного санитарно-эпидемиологического надзора и производственного контроля

Государственный санитарно-эпидемиологический надзор за производством и эксплуатацией ПЭВМ осуществляется в соответствии с настоящими Санитарными правилами.

Не допускается реализация и эксплуатация на территории Российской Федерации типов ПЭВМ, не имеющих санитарно-эпидемиологического заключения.

3. Инструментальный контроль за соблюдением требований настоящих Санитарных правил осуществляется в соответствии с действующей нормативной документацией.

4. Производственный контроль за соблюдением санитарных правил осуществляется производителем и поставщиком ПЭВМ, а также предприятиями и организациями, эксплуатирующими ПЭВМ в установленном порядке, в соответствии с действующими санитарными правилами и другими нормативными документами.

5.3 Инструкция по охране труда для сотрудника одела телекоммуникационных технологий

1. Общие требования безопасности

1.1. К работам с ПЭВМ и ВДТ допускаются лица:

- не моложе 18 лет, прошедшие обязательный предварительные при приеме на работу и ежегодные медицинские осмотры в порядке и сроки, установленные Минздравмедпромом России и Госкомсанэпиднадзором России, и не имеющие медицинских противопоказаний для работы с ПЭВМ и ВДТ;

- прошедшие курс обучения принципам работы с вычислительной техникой и специальное обучение работе на ПЭВМ с использованием конкретного программного обеспечения;

- прошедшие вводный инструктаж по электробезопасности с присвоением 1-й квалификационной группы;

- ознакомленные с инструкциями по эксплуатации на используемые на рабочем месте средства оргтехники (собственно ПЭВМ и ВДТ, принтеры, сканеры, источники бесперебойного питания и т.п.).

1.2. К работе с ПЭВМ и ВДТ не допускаются женщины со времени установления беременности и в период кормления ребенка грудью.

2. Требования безопасности перед началом работы

2.1. До включения используемого на рабочем месте оборудования сотрудник обязан:

2.1.1. Осмотреть и привести в порядок рабочее место, убрать с рабочего места все посторонние предметы, которые могут отвлекать внимание и затруднять работу.

2.1.2. Проверить правильность установки стола, стула, подставки под ноги, пюпитра, угол наклона экрана монитора, положение клавиатуры и..

2.1.3. Проверить правильность и надежность заземления оборудования:

2.1.4. Проверить правильность расположения оборудования:

2.1.5. Проверить надежность подключения к системному блоку разъемов периферийного оборудования.

2.1.6. Убедиться в отсутствии засветок, отражений и бликов на экране монитора. Убедиться в отсутствии ярко освещенных предметов в поле зрения при переносе взгляда с экрана монитора на документ. Убедиться, что освещенность документов достаточна для четкого различения их содержания. При возможности, отрегулировать освещение и принять меры к исключению бликов и засветок на экране и в поле зрения.

2.1.7. Убедиться в отсутствии пыли на экране монитора и клавиатуре, при необходимости, протереть их специальной салфеткой.

2.2. Включить оборудование рабочего места в последовательности, установленной инструкциями по эксплуатации на оборудование с учетом характера выполняемых на рабочем месте работ.

2.3. После включения оборудования и запуска используемой программы сотрудник обязан:

- убедиться в отсутствии дрожания и мерцания изображения на экране монитора;

- установить яркость, контрастность, цвет и размер символов, фон экрана, обеспечивающие наиболее комфортное и четкое восприятие изображения.

3. Требования безопасности при выполнении работ

3.1. Сотруднику во время работы запрещается:

- прикасаться к задней панели системного блока при включенном питании;

- переключать разъемы интерфейсных кабелей периферийных устройств при включенном питании;

- закрывать оборудование бумагами и посторонними предметами;

- допускать скапливание бумаг на рабочем месте;

- производить отключение питания во время выполнения активной задачи;

- снимать защитный фильтр с экрана монитора;

- допускать попадание влаги на поверхности устройств;

- производить самостоятельно вскрытие и ремонт оборудования;

- производить вскрытие или заправку на рабочем месте картриджей лазерных принтеров и копировальной техники;

- прикасаться к нагретым элементам принтеров и копировальной техники;

- работать со снятыми кожухами оборудования, являющегося источниками лазерного и ультрафиолетового излучения;

- располагаться при работе на расстоянии менее 50 см. от экрана монитора.

3.2. Режимы труда и отдыха при работе с ПЭВМ и ВДТ должны организовываться в соответствии с требованиями СанПиН в зависимости от вида и категории трудовой деятельности. Виды трудовой деятельности разделяются на 3 группы : группа А - работа по считыванию информации с экрана ВДТ или ПЭВМ с предварительным запросом, группа Б - работа по вводу информации группа, В - творческая информация в режиме диалога с ЭВМ.

3.3. При наличии ионизаторов, их использование допускается только во время перерывов в работе и при отсутствии людей и помещении.

4. Требования безопасности в аварийных ситуациях

4.1. Обо всех неисправностях в работе оборудования и аварийных ситуациях сообщать непосредственному руководителю.

4.2. При обнаружении обрыва проводов питания или нарушения целости их изоляции, неисправности заземления и других повреждений электрооборудования, появления запаха гари, посторонних звуков в работе оборудования и тестовых сигналов, индицирующих о его неисправности, немедленно прекратить работу и отключить питание.

4.3. При поражении работника электрическим током принять меры по его освобождению от действия тока путем отключения электропитания и до прибытия врача оказать потерпевшему первую медицинскую помощь.

4.4. В случае возгорания оборудования отключить питание, сообщить в пожарную охрану и руководителю, после чего приступить к тушению пожара имеющимися средствами.

5. Требования безопасности по окончании работы

5.1. По окончании работы сотрудник обязан соблюдать следующую последовательность отключения оборудования:

- произвести закрытие всех выполняемых на ПЭВМ задач;

- отключить питание в последовательности, установленной инструкциями по эксплуатации на оборудование с учетом характера выполняемых работ.

5.2. Убрать со стола рабочие материалы и привести в порядок рабочее место.

6. Ответственность за невыполнение инструкций

Лица, допустившие невыполнение или нарушение инструкции по охране труда, привлекаются к дисциплинарной ответственности в соответствии с правилами внутреннего трудового распорядка и, при необходимости, подвергаются внеочередной проверке знаний норм и правил охраны труда.

Заключение

В ходе выполнения ВКР был проведен анализ деятельности кредитного специалиста ОАО АКБ «Новация», рассмотрены основные этапы выдачи кредитного продукта.

В ходе работы были разработаны, созданы и отлажены все компоненты системы и проведена следующая работа:

описана существующая система обработки информации в Отделе кредитования физических лиц Банка;

выявлены недостатки в текущей системе учета кредитов;

обоснована необходимость создания АИС учета кредитов физических лиц;

определены цели, задачи учета кредитов физических лиц, а также функциональные возможности разрабатываемой АИС;

представлены обоснование выбора обеспечивающих технологий и проектных решений по программному и информационному обеспечению;

продуман пользовательский интерфейс, обозначены возможные пути расширения системы;

разработана информационная модель и представлено ее описание.

В результате была разработана и отлажена АИС учета кредитов физических лиц.

АИС учета кредитов физических лиц обеспечивает выполнение следующих основных функций:

учет клиентов банка физических лиц;

ведение справочника видов кредитов (потребительский кредит, ипотека, автокредит, кредитная карта и т.д.)

учет кредитов, выданных физическим лицам;

учет поручителей и залогодателей по кредиту;

построение графика погашения кредита (равными платежами, аннуитет, в конце срока);

выполнение операций с кредитами: открытие, плановое гашение, досрочное гашение, вынос на просрочку, закрытие;

формирование выходных документов:

кредитный портфель на заданную дату;

график гашения кредита;

список клиентов Банка;

список страховых компаний;

выборка кредитных договоров по заданным критериям;

журнал операций по кредитам;

формирование статистических диаграмм:

структура кредитного портфеля по состоянию на дату;

суммы выдач кредитов по месяцам за период;

суммы выдач по видам кредитных продуктов за период.

Также произведена оценка экономической эффективности разработки АИС учета кредитов физических лиц.

В рамках дальнейшего развития проекта можно определить автоматизацию других подразделений в рамках единой информационной системы Банка.

АИС учета кредитов физических лиц находится на стадии тестирования с последующим внедрением в ОАО АКБ «Новация».

Список использованных источников

1. Исследование СNews Analytics: Системы автоматизации банковской деятельности

2. Смирнова Г.Н. Проектирование экономических информационных систем: Учеб. для вузов / Г.Н. Смирнова, А.А. Сорокин, Ю.Ф. Тельнов; Под ред. Ю.Ф. Тельнова. -М. : Финансы и статистика, 2002. - 512 с. : ил.

3. Грекул В.И., Денищенко Г.Н., Коровкина Н.Л. Проектирование информационных систем. М.: Интернет-университет информационных технологий ИНТУИТ.ру, 2005.

4. Состав решения

5. Интегрированная банковская система БИСКВИТ

6. RS-Bank v. 5.5

7. Гарсиа-Молина Г., Ульман Дж., Уидом Дж. Системы баз данных. Полный курс. М.: Вильямс, 2003. 1088 с.

8. Кузнецов С.Д. Основы баз данных. 2-е изд. М.: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2007. 484 с.

9. Лори Ульрих Фуллер, Кен Кук, Джон Кауфельд. Microsoft Office Access 2007 для «чайников»: Пер. с англ. М.: «Диалектика», 2007. 384 стр. с ил.

10. Вальвачев А.Н., Сурков К.А., Сурков Д.А., Четырько Ю.М. Программирование на языке Delphi. Учебное пособие. 2005.

11. Вендров А.М. CASEтехнологии. Современные методы и средства проектирования информационных систем. М.: Финансы и статистика, 2000.

12. Коннолли Т., Бегг К. Базы данных. Проектирование, реализация и сопровождение. Теория и практика = Database Systems: A Practical Approach to Design, Implementation, and Management. -- 3-е изд. -- М.: Вильямс, 2003. -- 1436 с.

13. Григорьев Ю.А., Ревунков Г.И. Банки данных. М.: Издательство МГТУ имени Н.Э. Баумана, 2002.

14. Гагарина Л.Г., Кокорева Е.В., Виснадул Б.Д. Технология разработки программного обеспечения. М.: ИД «ФОРУМ»; ИНФРА-М, 2008. С. 400.

15. Соммервилл Иан. Инженерия программного обеспечения / Пер. с англ. 6-е издание. М.: Вильямс, 2002. 624 с.

16. Хотяшов Э.Н. Проектирование машинной обработки экономической информации. М.:Финансы и статистика, 2001.-246 с.

17. СанПиН 2.2.2/2.4.1340-03. Санитарно-эпидемиологические правила и нормативы. Гигиенические требования к персональным электронно-вычислительным машинам и организации работы. - М: Издательство стандартов, 2003.

Приложение А

Исходный текст программы

Программный модуль Loan.dpr

program Loan;

uses

Forms,

uMain in 'uMain.pas' {fmMain},

uDM in 'uDM.pas' {DM: TDataModule},

uCreditType in 'uCreditType.pas' {fmCreditType},

uInsurance in 'uInsurance.pas' {fmInsurance},

uGarantObject in 'uGarantObject.pas' {fmGarantObject},

uLoans in 'uLoans.pas' {fmLoans},

uLoanCard in 'uLoanCard.pas' {fmLoanCard},

uRep in 'uRep.pas',

uClients in 'uClients.pas' {fmClients},

uClientCard in 'uClientCard.pas' {fmClientCard},

uPay in 'uPay.pas' {fmPay},

uJournal in 'uJournal.pas' {fmJournal},

uStat in 'uStat.pas' {fmStat},

uGetDate in 'uGetDate.pas' {fmGetDate};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TfmMain, fmMain);

Application.CreateForm(TDM, DM);

Application.CreateForm(TfmCreditType, fmCreditType);

Application.CreateForm(TfmInsurance, fmInsurance);

Application.CreateForm(TfmGarantObject, fmGarantObject);

Application.CreateForm(TfmLoans, fmLoans);

Application.CreateForm(TfmLoanCard, fmLoanCard);

Application.CreateForm(TfmClients, fmClients);

Application.CreateForm(TfmClientCard, fmClientCard);

Application.CreateForm(TfmPay, fmPay);

Application.CreateForm(TfmJournal, fmJournal);

Application.CreateForm(TfmStat, fmStat);

Application.CreateForm(TfmGetDate, fmGetDate);

Application.Run;

end.

Программный модуль uClientCard.pas

unit uClientCard;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, StdCtrls, Mask, ExtDlgs, Buttons;

type

TfmClientCard = class(TForm)

Label1: TLabel;

DBEdit1: TDBEdit;

Label2: TLabel;

DBEdit2: TDBEdit;

Label3: TLabel;

DBEdit3: TDBEdit;

Label4: TLabel;

DBEdit4: TDBEdit;

Label5: TLabel;

DBEdit5: TDBEdit;

Label6: TLabel;

Label8: TLabel;

DBEdit8: TDBEdit;

Label9: TLabel;

DBEdit9: TDBEdit;

Label10: TLabel;

DBEdit10: TDBEdit;

Label11: TLabel;

DBEdit11: TDBEdit;

Label12: TLabel;

DBEdit12: TDBEdit;

Label13: TLabel;

DBEdit13: TDBEdit;

Label14: TLabel;

DBEdit14: TDBEdit;

Label15: TLabel;

DBEdit15: TDBEdit;

Label16: TLabel;

DBImage1: TDBImage;

DBLookupComboBox1: TDBLookupComboBox;

Label18: TLabel;

DBLookupComboBox2: TDBLookupComboBox;

DBComboBox1: TDBComboBox;

OpenPictureDialog1: TOpenPictureDialog;

Label7: TLabel;

bbtCancel: TBitBtn;

bbtOK: TBitBtn;

bbtPhoto: TBitBtn;

procedure bbtOKClick(Sender: TObject);

procedure bbtCancelClick(Sender: TObject);

procedure bbtPhotoClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmClientCard: TfmClientCard;

implementation

uses uDM, DB;

{$R *.dfm}

procedure TfmClientCard.bbtOKClick(Sender: TObject);

begin

if DM.dstClient.State in [dsInsert, dsEdit] then

DM.dstClient.Post;

end;

procedure TfmClientCard.bbtCancelClick(Sender: TObject);

begin

if DM.dstClient.State in [dsInsert, dsEdit] then

DM.dstClient.Cancel;

end;

procedure TfmClientCard.bbtPhotoClick(Sender: TObject);

begin

if OpenPictureDialog1.Execute then

DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

end.

Программный модуль uClients.pas

unit uClients;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, DBCtrls, ExtCtrls, Grids, DBGrids;

type

TfmClients = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

bbtExit: TBitBtn;

bbtCard: TBitBtn;

bbtPrint: TBitBtn;

GroupBox1: TGroupBox;

Label1: TLabel;

edFIO: TEdit;

Label2: TLabel;

edPassport: TEdit;

procedure FormShow(Sender: TObject);

procedure DBGrid1TitleClick(Column: TColumn);

procedure bbtCardClick(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

procedure edFIOChange(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmClients: TfmClients;

implementation

uses uDM, uClientCard, uRep, ADODB, DB;

{$R *.dfm}

procedure TfmClients.FormShow(Sender: TObject);

begin

DM.dstClient.Open;

DM.dstClient.Sort := 'ФИО';

end;

//Сортировка данных в таблице по выбранному столбцу:

procedure TfmClients.DBGrid1TitleClick(Column: TColumn);

begin

try

(DBGrid1.DataSource.DataSet as TADODataSet).Sort := Column.FieldName;

except

Application.MessageBox('Сортировка по данному полю невозможна', 'Информация', MB_ICONINFORMATION);

end;

end;

procedure TfmClients.bbtCardClick(Sender: TObject);

begin

fmClientCard.ShowModal;

end;

procedure TfmClients.bbtPrintClick(Sender: TObject);

begin

Text_Universal(DBGrid1, 16, 'Клиенты');

end;

//Поиск клиента по ФИО и паспорту:

procedure TfmClients.edFIOChange(Sender: TObject);

begin

if (edFIO.Text <> '') and (edPassport.Text <> '') then

DM.dstClient.Locate('ФИО;Паспорт', VarArrayOf(['%' + Trim(edFIO.Text), '%' + Trim(edPassport.Text)]),

[loCaseInsensitive, loPartialKey])

else if edFIO.Text <> '' then

DM.dstClient.Locate('ФИО', '%' + Trim(edFIO.Text), [loCaseInsensitive, loPartialKey])

else if edPassport.Text <> '' then

DM.dstClient.Locate('Паспорт', '%' + Trim(edPassport.Text), [loCaseInsensitive, loPartialKey]);

end;

end.

Программный модуль uCreditType.pas

unit uCreditType;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;

type

TfmCreditType = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

BitBtn1: TBitBtn;

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmCreditType: TfmCreditType;

implementation

uses uDM;

{$R *.dfm}

procedure TfmCreditType.FormShow(Sender: TObject);

begin

DM.dstCreditType.Open;

end;

procedure TfmCreditType.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//Набор данных закрывается, если он не используется в других формах:

// if not fmDepAndStaff.Showing then

DM.dstCreditType.Close;

end;

end.

Программный модуль uDiapason.pas

unit uDiapason;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, Buttons, ExtCtrls;

type

TfmDiapason = class(TForm)

Label1: TLabel;

Label2: TLabel;

dtpDateFrom: TDateTimePicker;

dtpDateTo: TDateTimePicker;

bbtCancel: TBitBtn;

bbtOK: TBitBtn;

Bevel1: TBevel;

private

{ Private declarations }

public

{ Public declarations }

end;

function GetDiapason(var DateFrom, DateTo: TDate): Boolean;

var

fmDiapason: TfmDiapason;

implementation

{$R *.dfm}

//Функция возвращает диапазон дат, заданный пользователем:

function GetDiapason(var DateFrom, DateTo: TDate): Boolean;

begin

fmDiapason.dtpDateFrom.Date := DateFrom;

fmDiapason.dtpDateTo.Date := DateTo;

if fmDiapason.ShowModal = mrOK then begin

DateFrom := fmDiapason.dtpDateFrom.Date;

DateTo := fmDiapason.dtpDateTo.Date;

Result := True;

end

else

Result := False;

end;

end.

Программный модуль uDM.pas

unit uDM;

interface

uses

SysUtils, Classes, DB, ADODB;

type

TDM = class(TDataModule)

ADOConnection1: TADOConnection;

dstEducation: TADODataSet;

dsEducation: TDataSource;

dstPayObject: TADODataSet;

dsPayObject: TDataSource;

dstGarantObject: TADODataSet;

dsGarantObject: TDataSource;

dstMarStatus: TADODataSet;

dsMarStatus: TDataSource;

dstLoanStatus: TADODataSet;

dsLoanStatus: TDataSource;

dstInsurance: TADODataSet;

dsInsurance: TDataSource;

dstGraphType: TADODataSet;

dsGraphType: TDataSource;

dstCreditType: TADODataSet;

dsCreditType: TDataSource;

dstOperType: TADODataSet;

dsOperType: TDataSource;

dstClient: TADODataSet;

dsClient: TDataSource;

dstClientID: TAutoIncField;

dstClientDSDesigner: TWideStringField;

dstClientDSDesigner2: TBooleanField;

dstClientDSDesigner3: TDateTimeField;

dstClientDSDesigner4: TWideStringField;

dstClientDSDesigner5: TWideStringField;

dstClientDSDesigner22: TWideStringField;

dstClientID2: TIntegerField;

dstClientID3: TIntegerField;

dstClientDSDesigner6: TWideStringField;

dstClientDSDesigner7: TWideStringField;

dstClientDSDesigner8: TBCDField;

dstClientDSDesigner9: TWideStringField;

dstClientDSDesigner10: TWideStringField;

dstClientDSDesigner11: TWideStringField;

dstClientDSDesigner12: TWideStringField;

dstClientDSDesigner13: TWideStringField;

dstClientDSDesigner14: TBlobField;

dstClientIntegerField: TStringField;

dstClientIntegerField2: TStringField;

dstLoan: TADODataSet;

dsLoan: TDataSource;

dstLoanID: TAutoIncField;

dstLoanID2: TIntegerField;

dstLoanID3: TIntegerField;

dstLoanID4: TIntegerField;

dstLoanN: TWideStringField;

dstLoanDSDesigner: TDateTimeField;

dstLoanDSDesigner2: TDateTimeField;

dstLoanDSDesigner3: TDateTimeField;

dstLoanDSDesigner4: TBCDField;

dstLoanDSDesigner5: TFloatField;

dstLoanID5: TIntegerField;

dstLoanField: TStringField;

dstLoanField2: TStringField;

dstLoanField3: TStringField;

dstLoanField4: TStringField;

dstSurety: TADODataSet;

dsSurety: TDataSource;

dstSuretyID: TIntegerField;

dstSuretyDSDesigner1ID: TIntegerField;

dstSuretyDSDesigner2ID: TIntegerField;

dstSuretyN: TWideStringField;

dstSuretyDSDesigner: TDateTimeField;

dstSuretyDSDesigner2: TWideStringField;

dstSuretyField: TStringField;

dstSuretyField2: TStringField;

dstLoanDSDesigner2ID: TIntegerField;

dstLoanField5: TStringField;

dstLoanDSDesigner6: TWideStringField;

dstBail: TADODataSet;

dsBail: TDataSource;

dstBailID: TIntegerField;

dstBailDSDesigner1ID: TIntegerField;

dstBailDSDesigner2ID: TIntegerField;

dstBailID2: TIntegerField;

dstBailN: TWideStringField;

dstBailDSDesigner: TDateTimeField;

dstBailDSDesigner2: TBCDField;

dstBailDSDesigner3: TWideStringField;

dstBailDSDesigner4: TBooleanField;

dstBailID3: TIntegerField;

dstBailField: TStringField;

dstBailField2: TStringField;

dstBailField3: TStringField;

dstBailIntegerField: TStringField;

dstGraphic: TADODataSet;

dsGraphic: TDataSource;

dstGraphicID: TIntegerField;

dstGraphicDSDesigner: TDateTimeField;

dstGraphicID2: TIntegerField;

dstGraphicDSDesigner2: TBCDField;

dstGraphicDSDesigner3: TBCDField;

dstGraphicField: TStringField;

dstJournal: TADODataSet;

dsJournal: TDataSource;

dstJournalID: TAutoIncField;

dstJournalID2: TIntegerField;

dstJournalDSDesigner: TDateTimeField;

dstJournalID3: TIntegerField;

dstJournalDSDesigner2: TBCDField;

dstJournalField: TStringField;

qrClearGraph: TADOQuery;

dstJournalN: TStringField;

dstSum: TADODataSet;

dstStatKP: TADODataSet;

dstStatKPDSDesigner2: TBCDField;

dstStatKPField: TStringField;

dstStatSumByCat: TADODataSet;

dstStatSumByCatDSDesigner2: TBCDField;

dstStatSumByCatField: TStringField;

dstStatSumByMonths: TADODataSet;

BCDField1: TBCDField;

dstStatSumByMonthsField: TStringField;

dstKP: TADODataSet;

dstKPN: TWideStringField;

dstKPDSDesigner: TDateTimeField;

dstKPDSDesigner2: TWideStringField;

dstKPDSDesigner3: TDateTimeField;

dstKPDSDesigner4: TDateTimeField;

dstKPDSDesigner5: TBCDField;

dstKPDSDesigner6: TFloatField;

dstKPDSDesigner7: TBCDField;

dstKPDSDesigner8: TBCDField;

dstKPDSDesigner9: TWideStringField;

dstGraphicDSDesigner4: TDateTimeField;

procedure DataModuleDestroy(Sender: TObject);

procedure dstSuretyBeforeInsert(DataSet: TDataSet);

procedure dstLoanNewRecord(DataSet: TDataSet);

private

{ Private declarations }

public

{ Public declarations }

end;

var

DM: TDM;

implementation

{$R *.dfm}

procedure TDM.DataModuleDestroy(Sender: TObject);

begin

ADOConnection1.Close;

end;

//Перед добавлением графика гашения кредита, поручительства или залога новый

//кредитный договор сохраняется:

procedure TDM.dstSuretyBeforeInsert(DataSet: TDataSet);

begin

if DM.dstLoan.State = dsInsert then

DM.dstLoan.Post;

end;

procedure TDM.dstLoanNewRecord(DataSet: TDataSet);

begin

DataSet.FieldByName('СтатусID').AsInteger := 1;

end;

end.

Программный модуль uGarantObject.pas

unit uGarantObject;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;

type

TfmGarantObject = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

BitBtn1: TBitBtn;

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmGarantObject: TfmGarantObject;

implementation

uses uDM;

{$R *.dfm}

procedure TfmGarantObject.FormShow(Sender: TObject);

begin

DM.dstGarantObject.Open;

DM.dstGarantObject.Sort := 'ПредметЗал';

end;

procedure TfmGarantObject.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//Набор данных закрывается, если он не используется в других формах:

// if not fmDepAndStaff.Showing then

DM.dstGarantObject.Close;

end;

end.

Программный модуль uGetDate.pas

unit uGetDate;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, Buttons, ExtCtrls;

type

TfmGetDate = class(TForm)

Label1: TLabel;

dtpDate: TDateTimePicker;

bbtCancel: TBitBtn;

bbtOK: TBitBtn;

Bevel1: TBevel;

private

{ Private declarations }

public

{ Public declarations }

end;

function GetDate(var PDate: TDate): Boolean;

var

fmGetDate: TfmGetDate;

implementation

{$R *.dfm}

//Функция возвращает дату, заданную пользователем:

function GetDate(var PDate: TDate): Boolean;

begin

fmGetDate.dtpDate.Date := PDate;

if fmGetDate.ShowModal = mrOK then

begin

PDate := fmGetDate.dtpDate.Date;

Result := True;

end

else

Result := False;

end;

end.

Программный модуль uInsurance.pas

unit uInsurance;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Grids, DBGrids, DBCtrls, StdCtrls, Buttons;

type

TfmInsurance = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

BitBtn1: TBitBtn;

bbtPrint: TBitBtn;

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure bbtPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmInsurance: TfmInsurance;

implementation

uses uDM, uRep;

{$R *.dfm}

procedure TfmInsurance.FormShow(Sender: TObject);

begin

DM.dstInsurance.Open;

DM.dstInsurance.Sort := 'СтрахКомпания';

end;

procedure TfmInsurance.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//Набор данных закрывается, если он не используется в других формах:

// if not fmDepAndStaff.Showing then

DM.dstInsurance.Close;

end;

procedure TfmInsurance.bbtPrintClick(Sender: TObject);

begin

Text_Universal(DBGrid1, 1, 'Страховые компании');

end;

end.

Программный модуль uJournal.pas

unit uJournal;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ComCtrls, DBCtrls, StdCtrls, Buttons, ExtCtrls, Grids, DBGrids;

type

TfmJournal = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

bbtExit: TBitBtn;

bbtPrint: TBitBtn;

GroupBox2: TGroupBox;

Label2: TLabel;

chbOperType: TCheckBox;

dblcbOperType: TDBLookupComboBox;

chbLoan: TCheckBox;

dblcbLoan: TDBLookupComboBox;

chbDate1: TCheckBox;

dtpDate1: TDateTimePicker;

dtpDate2: TDateTimePicker;

chbDate2: TCheckBox;

DBNavigator1: TDBNavigator;

procedure chbLoanClick(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure bbtPrintClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

fmJournal: TfmJournal;

implementation

uses uDM, uRep;

{$R *.dfm}

//Отбор операций по заданным критериям:

procedure TfmJournal.chbLoanClick(Sender: TObject);

var

Filter: string;

begin

Filter := '';

if chbLoan.Checked and (dblcbLoan.KeyValue <> Null) then

begin

if Filter <> '' then

Filter := Filter + ' and ';

Filter := Filter + 'КредитID = ' + IntToStr(dblcbLoan.KeyValue);

end;

if chbOperType.Checked and (dblcbOperType.KeyValue <> Null) then

begin

if Filter <> '' then

Filter := Filter + ' and ';

Filter := Filter + 'ТипОперацииID = ' + IntToStr(dblcbOperType.KeyValue);

end;

if chbDate1.Checked then

begin

if Filter <> '' then

Filter := Filter + ' and ';

Filter := Filter + 'Дата >= ' + QuotedStr(DateToStr(dtpDate1.Date));

end;

if chbDate2.Checked then

begin

if Filter <> '' then

Filter := Filter + ' and ';

Filter := Filter + 'Дата <= ' + QuotedStr(DateToStr(dtpDate2.Date));

end;

if Filter <> '' then

begin

DM.dstJournal.Filter := Filter;

DM.dstJournal.Filtered := True;

end

else

DM.dstJournal.Filtered := False;

end;

procedure TfmJournal.FormShow(Sender: TObject);

begin

DM.dstJournal.Open;

end;

procedure TfmJournal.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DM.dstJournal.Close;

end;

//Печать набора данных, видимого на форме в таблице:

procedure TfmJournal.bbtPrintClick(Sender: TObject);

var

Caption: string;

begin

Caption := 'Журнал операций';

if chbOperType.Checked and (dblcbOperType.KeyValue <> Null) then

Caption := Caption + ' "' + dblcbOperType.Text + '"';

if chbLoan.Checked and (dblcbLoan.KeyValue <> Null) then

Caption := Caption + ' по Кредитному договору №' + dblcbLoan.Text;

if chbDate1.Checked then

begin

Caption := Caption + ' за период с ' + DateToStr(dtpDate1.Date);

if chbDate2.Checked then

Caption := Caption + ' по ' + DateToStr(dtpDate2.Date);

end

else

if chbDate2.Checked then

Caption := Caption + ' за период по ' + DateToStr(dtpDate2.Date);

Text_Universal(DBGrid1, 4, Caption);

end;

end.

Программный модуль uLoanCard.pas

unit uLoanCard;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBCtrls, StdCtrls, Mask, ExtDlgs, Buttons, ExtCtrls, Grids,

DBGrids;

type

TfmLoanCard = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

bbtExit: TBitBtn;

DBGrid2: TDBGrid;

Label1: TLabel;

DBEdit1: TDBEdit;

Label2: TLabel;

DBEdit2: TDBEdit;

Label3: TLabel;

DBEdit3: TDBEdit;

Label4: TLabel;

DBEdit4: TDBEdit;

Label5: TLabel;

DBEdit5: TDBEdit;

Label6: TLabel;

DBEdit6: TDBEdit;

Label7: TLabel;

DBLookupComboBox1: TDBLookupComboBox;

Label8: TLabel;

DBLookupComboBox2: TDBLookupComboBox;

Label9: TLabel;

DBLookupComboBox3: TDBLookupComboBox;

Label10: TLabel;

DBLookupComboBox4: TDBLookupComboBox;

Label11: TLabel;

DBLookupComboBox5: TDBLookupComboBox;

Label12: TLabel;

DBEdit7: TDBEdit;

Label13: TLabel;

Label14: TLabel;

Panel2: TPanel;

Label15: TLabel;

DBGrid3: TDBGrid;

bbtSetGraphic: TBitBtn;

bbtOpen: TBitBtn;

bbtPlanPay: TBitBtn;

bbtDelay: TBitBtn;

bbtNonPlanPay: TBitBtn;

bbtClose: TBitBtn;

bbtPrint: TBitBtn;

bbtPrintPay: TBitBtn;

procedure DBGrid1Enter(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure bbtSetGraphicClick(Sender: TObject);

procedure bbtOpenClick(Sender: TObject);

procedure bbtPlanPayClick(Sender: TObject);

procedure bbtDelayClick(Sender: TObject);

procedure DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;

DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure bbtCloseClick(Sender: TObject);

procedure bbtNonPlanPayClick(Sender: TObject);

procedure bbtPrintClick(Sender: TObject);

procedure bbtPrintPayClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

function GetSumOfPay(var Date1: TDate): Currency;

function GetPercentValue(Sum: Currency; Percent: Double; Date1, Date2: TDate): Currency;

end;

var

fmLoanCard: TfmLoanCard;

implementation

uses uDM, ADODB, DateUtils, Math, uPay, DB, uRep;

{$R *.dfm}

//Навигатор привязывается к сетке данных, выбранной пользователем:

procedure TfmLoanCard.DBGrid1Enter(Sender: TObject);

begin

DBNavigator1.DataSource := (Sender as TDBGrid).DataSource;

end;

procedure TfmLoanCard.FormShow(Sender: TObject);

begin

DM.dstSurety.Open;

DM.dstBail.Open;

DM.dstGraphic.Open;

end;

procedure TfmLoanCard.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if DM.dstLoan.State in [dsInsert, dsEdit] then

DM.dstLoan.Post;

if DM.dstSurety.State in [dsInsert, dsEdit] then

DM.dstSurety.Post;

if DM.dstBail.State in [dsInsert, dsEdit] then

DM.dstBail.Post;

if DM.dstGraphic.State in [dsInsert, dsEdit] then

DM.dstGraphic.Post;

DM.dstSurety.Close;

DM.dstBail.Close;

DM.dstGraphic.Close;

end;

//Функция возвращает сумму %% на ОД Sum по ставке Percent за период Date1 - Date2:

function TfmLoanCard.GetPercentValue(Sum: Currency; Percent: Double; Date1, Date2: TDate): Currency;

begin

//Разный алгоритм расчета %% связан с различным кол-вом дней в году (обычном, високосном):

if YearOf(Date1) = YearOf(Date2) then

//Если заданный период находится в одном календарном году, т.е. не включает 31 декабря:

Result := RoundTo(Sum * Percent / DaysInYear(Date1) * DaysBetween(Date1, Date2), -2)

else

//Если заданный период находится в двух разных годах, т.е. включает 31 декабря:

Result := RoundTo(Sum * Percent / DaysInYear(Date1) * DaysBetween(Date1, StrToDate('31.12.' + IntToStr(YearOf(Date1)))) +

Sum * Percent / DaysInYear(Date2) * DaysBetween(StrToDate('31.12.' + IntToStr(YearOf(Date1))), Date2), -2);

end;

//Функция возвращает сумму уплаченного ОД и дату последней уплаты %%:

function TfmLoanCard.GetSumOfPay(var Date1: TDate): Currency;

begin

with DM do

begin

Result := dstLoan.FieldByName('Сумма').AsCurrency;

//Определяется последняя дата гашения %%:

Date1 := dstLoan.FieldByName('ДатаВыдачи').AsDateTime;

dstGraphic.Last;

while not dstGraphic.Bof do

begin

//Если есть исполненные суммы %% (график удален не полностью), то в качестве

//даты начала расчета берется дата последнего гашения %%:

if (Date1 = dstLoan.FieldByName('ДатаВыдачи').AsDateTime) and

(dstGraphic.FieldByName('ПредметГашID').AsInteger = 2) and

(dstGraphic.FieldByName('СуммаИсп').AsCurrency > 0) then

Date1 := dstGraphic.FieldByName('Дата').AsDateTime;

//Уменьшение суммы кредита на сумму выплаты:

if dstGraphic.FieldByName('ПредметГашID').AsInteger = 1 then

Result := Result - dstGraphic.FieldByName('СуммаИсп').AsCurrency;

dstGraphic.Prior;

end;

end;

end;

procedure TfmLoanCard.bbtSetGraphicClick(Sender: TObject);

var

PayValue, Sum: Currency;

Date1, Date2, PrevDate: TDate;

Percent: Double;

Message: string;

//Процедура добавляет в график выбранного кредита очередной платеж по ОД или %%:

procedure AddPay(PDate: TDate; Subject: Integer; Sum: Currency);

begin

with DM do

begin

dstGraphic.Insert;

dstGraphic.FieldByName('Дата').AsDateTime := PDate;

dstGraphic.FieldByName('ПредметГашID').AsInteger := Subject;

dstGraphic.FieldByName('СуммаНач').AsCurrency := Sum;

dstGraphic.FieldByName('СуммаИсп').AsCurrency := 0;

dstGraphic.Post;

end;

end;

begin

//В зависимости от типа графика выводятся разные сообщения:

if DM.dstLoan.FieldByName('ТипГрафикаID').AsInteger = 3 then

Message := 'Старый график гашения процентов будет удален!' + Chr(13) +

'Сформировать график заново?'

else

Message := 'Старый график будет удален! Сформировать график заново?';

if Application.MessageBox(PChar(Message), 'Предупреждение', MB_ICONEXCLAMATION + MB_YESNO) = IDYES then

with DM do

begin

//Удаление старых данных по непогашенным суммам %% индивидуального графика:

if dstLoan.FieldByName('ТипГрафикаID').AsInteger = 3 then

begin

qrClearGraph.Parameters.ParamByName('pLoanID').Value := dstLoan.FieldByName('ID').AsInteger;

qrClearGraph.Parameters.ParamByName('pPayObjectID').Value := 2;

qrClearGraph.ExecSQL;

end

else

begin

//Удаление старых данных по непогашенным суммам ОД и %% любого другого графика:

qrClearGraph.Parameters.ParamByName('pLoanID').Value := dstLoan.FieldByName('ID').AsInteger;

qrClearGraph.Parameters.ParamByName('pPayObjectID').Value := 1;

qrClearGraph.ExecSQL;

qrClearGraph.Parameters.ParamByName('pPayObjectID').Value := 2;

qrClearGraph.ExecSQL;

end;

dstGraphic.Close;

dstGraphic.Open;

//Данные для расчета ОД и %%:

Percent := dstLoan.FieldByName('Ставка').AsFloat / 100;

Sum := GetSumOfPay(Date1);

Date2 := dstLoan.FieldByName('ДатаЗакрыт').AsDateTime;

//В зависимости от выбранного типа строится соответствующий график:

case dstLoan.FieldByName('ТипГрафикаID').AsInteger of

1: //Аннуитет

begin

//Расчет суммы ежемесячного равного платежа (ОД + %%):

PayValue := RoundTo(Sum / (12/Percent - 1/(Percent/12 * Power(1 + Percent/12,

Round(MonthSpan(Date1, Date2))))), -2);

//В цикле формируются строки: дата гашения - сумма ОД, дата гашения - сумма %%:

while Date1 < Date2 do

begin

Date1 := IncMonth(Date1);

//Если до даты закрытия кредита осталось меньше 0,5 мес., то последний

//платеж устанавливается в дату закрытия кредита:

if (MonthSpan(Date1, Date2) < 0.5) then

begin

//Последний платеж ОД + %% не совпадает с остальными равными платежами:

AddPay(Date2, 1, Sum);

//Платеж по %%:

AddPay(Date2, 2, GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date2));

Date1 := Date2;

end

else

begin

//Платеж по ОД:

AddPay(Date1, 1, PayValue - GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date1));

//Платеж по %%:

AddPay(Date1, 2, GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date1));

end;

//Остаток ОД:

Sum := Sum - (PayValue - GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date1));

end; //while Date1 < Date2}

end; //case 1

2: //Гашение ОД равными долями

begin

//Ежемесячный платеж по ОД, округляется до сотых (т.е. до 1 копейки):

PayValue := RoundTo(Sum / (Round(MonthSpan(Date1, Date2))), -2);

//В цикле формируются строки: дата гашения - сумма ОД, дата гашения - сумма %%:

while Date1 < Date2 do

begin

Date1 := IncMonth(Date1);

//Если до даты закрытия кредита осталось меньше 0,4 мес., то последний

//платеж устанавливается в дату закрытия кредита:

if (MonthSpan(Date1, Date2) < 0.4) then

begin

//Последний платеж по ОД может не совпадать с остальными из-за округления:

AddPay(Date2, 1, dstLoan.FieldByName('Сумма').AsCurrency - PayValue *

(Round(MonthSpan(dstLoan.FieldByName('ДатаВыдачи').AsDateTime, Date2))-1));

//Платеж по %%:

AddPay(Date2, 2, GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date2));

Date1 := Date2;

end

else

begin

//Платеж по ОД:

AddPay(Date1, 1, PayValue);

//Платеж по %%:

AddPay(Date1, 2, GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date1));

end;

Sum := Sum - PayValue; //Остаток ОД

end; //while Date1 < Date2

end; //case 2

3: //Индивидуальный график

begin

dstGraphic.First;

//Цикл по графику гашения ОД:

while not dstGraphic.Eof do

begin

//Цикл по графику гашения %%: формируются строки: дата гашения - сумма %%:

while IncMonth(Date1) < dstGraphic.FieldByName('Дата').AsDateTime do

begin

//Платеж по %% выполняется ежемесячно в одну дату, пока не достигает

//очередного планового гашения ОД:

AddPay(IncMonth(Date1), 2, GetPercentValue(Sum, Percent, Date1, IncMonth(Date1)));

Date1 := IncMonth(Date1);

dstGraphic.Next;

end; //while IncMonth(Date1) < dstGraphic.FieldByName('Дата').AsDateTime

PrevDate := Date1;

Date1 := dstGraphic.FieldByName('Дата').AsDateTime;

PayValue := dstGraphic.FieldByName('СуммаНач').AsCurrency;

//При достижении очередной даты планового гашения ОД в эту же дату гасятся %%:

AddPay(Date1, 2, GetPercentValue(Sum, Percent, PrevDate, Date1));

Sum := Sum - PayValue; //Остаток ОД

//Переход к следующей записи о гашении ОД:

dstGraphic.Next;

end; //while not dstGraphic.Eof

end; //case 3

4: //Гашение в конце срока

begin

//В цикле формируется строка: дата гашения - сумма %%:

while Date1 < Date2 do

begin

Date1 := IncMonth(Date1);

//Если до даты закрытия кредита осталось меньше 0,5 мес., то последний

//платеж устанавливается в дату закрытия кредита:

if (MonthSpan(Date1, Date2) < 0.5) then

Date1 := Date2;

AddPay(Date1, 2, GetPercentValue(Sum, Percent, IncMonth(Date1,-1), Date1));

end; //while Date1 < Date2

AddPay(dstLoan.FieldByName('ДатаЗакрыт').AsDateTime, 1, dstLoan.FieldByName('Сумма').AsCurrency);

end; //case 4

end; //case

end;

end;

//Выделение цветом ячеек в графике гашения:

procedure TfmLoanCard.DBGrid3DrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

begin

if DM.dstGraphic.FieldByName('Дата').AsDateTime < Date then

if DM.dstGraphic.FieldByName('СуммаНач').Value <= DM.dstGraphic.FieldByName('СуммаИсп').Value then

//Исполненные платежи выделяются голубым:

DBGrid3.Canvas.Brush.Color := clSkyBlue

else

//Просроченные платежи выделяются розовым:

DBGrid3.Canvas.Brush.Color := clFuchsia;

DBGrid3.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

//Запись операции в журнал операций:

procedure AddOperToJournal(LoanID, OperTypeID: Integer; OperDate: TDate; Sum: Currency);

begin

DM.dstJournal.Open;

DM.dstJournal.Insert;

DM.dstJournal.FieldByName('КредитID').AsInteger := LoanID;

DM.dstJournal.FieldByName('Дата').AsDateTime := OperDate;

DM.dstJournal.FieldByName('ТипОперацииID').AsInteger := OperTypeID;

DM.dstJournal.FieldByName('Сумма').AsCurrency := Sum;

DM.dstJournal.Post;

DM.dstJournal.Close;

end;

//Открытие договора (выдача кредита):

procedure TfmLoanCard.bbtOpenClick(Sender: TObject);

begin

if DM.dstLoan.FieldByName('СтатусID').AsInteger <> 1 then

Application.MessageBox('Операция выдачи уже была проведена!', 'Информация', MB_ICONINFORMATION)

else

if Application.MessageBox('Провести операцию выдачи?', 'Вопрос',

MB_ICONQUESTION + MB_YESNO) = IDYES then

begin

//В рамках одной транзакции изменяется статус кредита и производится

//запись в журнал операций:

DM.ADOConnection1.BeginTrans;

try

//Изменение статуса кредита:

if not (DM.dstLoan.State in [dsInsert, dsEdit]) then

DM.dstLoan.Edit;

DM.dstLoan.FieldByName('СтатусID').AsInteger := 2; //Статус "Открыт"

DM.dstLoan.Post;

AddOperToJournal(DM.dstLoan.FieldByName('ID').AsInteger, 1, Date,

DM.dstLoan.FieldByName('Сумма').AsCurrency);

DM.ADOConnection1.CommitTrans;

Application.MessageBox('Операция выдачи успешно проведена!', 'Информация', MB_ICONINFORMATION);

except

DM.ADOConnection1.RollbackTrans;

Application.MessageBox('Произошла ошибка при выполнении операции!', 'Ошибка', MB_ICONERROR);

end;

end;

end;

//Плановое гашения ОД или %%:

procedure TfmLoanCard.bbtPlanPayClick(Sender: TObject);

var

Oper: Integer;

begin

if not (DM.dstLoan.FieldByName('СтатусID').AsInteger in [2, 3]) then

Application.MessageBox('Кредит не выдан или закрыт!', 'Информация', MB_ICONINFORMATION)

else

if DM.dstGraphic.FieldByName('СуммаНач').Value = DM.dstGraphic.FieldByName('СуммаИсп').Value then

Application.MessageBox('Выбранное в графике плановое гашение уже исполнено!', 'Информация', MB_ICONINFORMATION)

else

begin

fmPay.pnPlan.Visible := True;

fmPay.lbPercent.Visible := False;

fmPay.edPercent.Visible := False;

if DM.dstGraphic.FieldByName('ПредметГашID').AsInteger = 1 then

fmPay.lbOper.Caption := 'Плановое гашение основного долга'

else

fmPay.lbOper.Caption := 'Плановое гашение процентов';

if fmPay.ShowModal = mrOk then

begin

//В рамках одной транзакции производятся гашение и запись в журнал операций:

DM.ADOConnection1.BeginTrans;

try

if not (DM.dstGraphic.State in [dsInsert, dsEdit]) then

DM.dstGraphic.Edit;

DM.dstGraphic.FieldByName('СуммаИсп').AsCurrency := StrToCurr(fmPay.edSum.Text);

DM.dstGraphic.FieldByName('ДатаИсп').AsDateTime := fmPay.dtpDate.Date;

DM.dstGraphic.Post;

if DM.dstGraphic.FieldByName('ПредметГашID').AsInteger = 1 then

if DM.dstGraphic.FieldByName('Дата').AsDateTime = fmPay.dtpDate.Date then

Oper := 2 //Плановое гашение ОД

else

Oper := 5 //Плановое гашение %%

else

//Запись о гашении %%:

if DM.dstGraphic.FieldByName('Дата').AsDateTime = fmPay.dtpDate.Date then

Oper := 3 //Гашение просроченного ОД

else

Oper := 6;//Гашение просроченных %%

AddOperToJournal(DM.dstLoan.FieldByName('ID').AsInteger, Oper, fmPay.dtpDate.Date,

StrToCurr(fmPay.edSum.Text));

DM.ADOConnection1.CommitTrans;

Application.MessageBox('Операция планового гашения успешно проведена!', 'Информация', MB_ICONINFORMATION);

except

DM.ADOConnection1.RollbackTrans;

Application.MessageBox('Произошла ошибка при выполнении операции!', 'Ошибка', MB_ICONERROR);

end;

end; //if fmPay.ShowModal = mrOk

end; //else if DM.dstGraphic.FieldByName('СуммаНач').Value = ...

end;

//Досрочное гашения ОД:

procedure TfmLoanCard.bbtNonPlanPayClick(Sender: TObject);

begin

if not (DM.dstLoan.FieldByName('СтатусID').AsInteger in [2, 3]) then

Application.MessageBox('Кредит не выдан или закрыт!', 'Информация', MB_ICONINFORMATION)

else

begin

fmPay.pnPlan.Visible := False;

fmPay.lbOper.Caption := 'Досрочное гашение основного долга';

fmPay.lbPercent.Visible := True;

fmPay.edPercent.Visible := True;

if fmPay.ShowModal = mrOk then

begin

//В рамках одной транзакции производятся гашение и запись в журнал операций:

DM.ADOConnection1.BeginTrans;

try

//Если в дату досрочного гашения уже есть плановая дата гашения ОД, то

//в эту дату записывается факт:

if DM.dstGraphic.Locate('КредитID;Дата;ПредметГашID',

VarArrayOf([DM.dstLoan.FieldByName('ID').AsInteger, TDateTime(fmPay.dtpDate.Date), 1]), []) then

begin

DM.dstGraphic.Edit;

DM.dstGraphic.FieldByName('СуммаИсп').AsCurrency := StrToCurr(fmPay.edSum.Text);

DM.dstGraphic.Post;

end

//Если в дату досрочного гашения плановое гашения ОД незапланировано, то

//в эту дату добавляется фактическое гашение:

else

begin

DM.dstGraphic.Insert;

DM.dstGraphic.FieldByName('Дата').AsDateTime := fmPay.dtpDate.Date;

DM.dstGraphic.FieldByName('ПредметГашID').AsInteger := 1;

DM.dstGraphic.FieldByName('СуммаНач').AsCurrency := 0;

DM.dstGraphic.FieldByName('СуммаИсп').AsCurrency := StrToCurr(fmPay.edSum.Text);

DM.dstGraphic.Post;

end;

//Если в дату досрочного гашения уже есть плановая дата гашения %%, то

//в эту дату записывается новый план и факт:

if DM.dstGraphic.Locate('КредитID;Дата;ПредметГашID',

VarArrayOf([DM.dstLoan.FieldByName('ID').AsInteger, TDateTime(fmPay.dtpDate.Date), 2

]), []) then

begin

DM.dstGraphic.Edit;

DM.dstGraphic.FieldByName('СуммаНач').AsCurrency := StrToCurr(fmPay.edPercent.Text);

DM.dstGraphic.FieldByName('СуммаИсп').AsCurrency := StrToCurr(fmPay.edPercent.Text);

DM.dstGraphic.Post;

end

//Если в дату досрочного гашения плановое гашения ОД незапланировано, то

//в эту дату добавляется фактическое гашение:

else

begin

DM.dstGraphic.Insert;

DM.dstGraphic.FieldByName('Дата').AsDateTime := fmPay.dtpDate.Date;

DM.dstGraphic.FieldByName('ПредметГашID').AsInteger := 2;

DM.dstGraphic.FieldByName('СуммаНач').AsCurrency := StrToCurr(fmPay.edPercent.Text);

DM.dstGraphic.FieldByName('СуммаИсп').AsCurrency := StrToCurr(fmPay.edPercent.Text);

DM.dstGraphic.Post;

end;

AddOperToJournal(DM.dstLoan.FieldByName('ID').AsInteger, 8, fmPay.dtpDate.Date,

StrToCurr(fmPay.edSum.Text));

DM.ADOConnection1.CommitTrans;

Application.MessageBox(PChar('Операция досрочного гашения успешно проведена!' + Chr(13) +

'Не забудьте заново построить график гашения!'), 'Информация', MB_ICONINFORMATION);

except

DM.ADOConnection1.RollbackTrans;

Application.MessageBox('Произошла ошибка при выполнении операции!', 'Ошибка', MB_ICONERROR);

end;

end; //if fmPay.ShowModal = mrOk

end; //else if if not (DM.dstLoan.FieldByName('СтатусID').AsInteger in ...

end;

//Вынесение кредита на просрочку:

procedure TfmLoanCard.bbtDelayClick(Sender: TObject);

begin

if DM.dstLoan.FieldByName('СтатусID').AsInteger <> 2 then

Application.MessageBox('Кредит не находится в статусе "Открыт"!', 'Информация', MB_ICONINFORMATION)

else

if Application.MessageBox('Вынести кредит на просрочку?', 'Вопрос',

MB_ICONQUESTION + MB_YESNO) = IDYES then

begin

//В рамках одной транзакции изменяется статус кредита и производится

//запись в журнал операций:

DM.ADOConnection1.BeginTrans;

try

//Изменение статуса кредита:

if not (DM.dstLoan.State in [dsInsert, dsEdit]) then

DM.dstLoan.Edit;

DM.dstLoan.FieldByName('СтатусID').AsInteger := 3; //Статус "На просрочке"

DM.dstLoan.Post;

AddOperToJournal(DM.dstLoan.FieldByName('ID').AsInteger, 4, Date, 0);

DM.ADOConnection1.CommitTrans;

Application.MessageBox('Операция вынесение на просрочку проведена!', 'Информация', MB_ICONINFORMATION);

except

DM.ADOConnection1.RollbackTrans;

Application.MessageBox('Произошла ошибка при выполнении операции!', 'Ошибка', MB_ICONERROR);

end;

end;

end;

//Закрытие договора:

procedure TfmLoanCard.bbtCloseClick(Sender: TObject);

begin

if DM.dstLoan.FieldByName('СтатусID').AsInteger <> 2 then

Application.MessageBox('Закрыть договор можно, только когда кредит находится в статусе "Открыт"!',

'Информация', MB_ICONINFORMATION)

else

begin

DM.dstSum.Parameters.ParamByName('pLoanID').Value := DM.dstLoan.FieldByName('ID').AsInteger;

DM.dstSum.Open;

if DM.dstSum.FieldByName('Исполнено').AsCurrency > 0 then

Application.MessageBox('Нельзя закрыть договор, пока по нему имеется задолженность!',

'Информация', MB_ICONINFORMATION)

else

if Application.MessageBox('Закрыть кредит?', 'Вопрос',

MB_ICONQUESTION + MB_YESNO) = IDYES then

begin

//В рамках одной транзакции изменяется статус кредита и производится

//запись в журнал операций:

DM.ADOConnection1.BeginTrans;

try

//Изменение статуса кредита:

if not (DM.dstLoan.State in [dsInsert, dsEdit]) then

DM.dstLoan.Edit;

DM.dstLoan.FieldByName('СтатусID').AsInteger := 4; //Статус "Закрыт"

DM.dstLoan.Post;

AddOperToJournal(DM.dstLoan.FieldByName('ID').AsInteger, 4, Date, 0);

DM.ADOConnection1.CommitTrans;

Application.MessageBox('Операция закрытия договора проведена!', 'Информация', MB_ICONINFORMATION);

except

DM.ADOConnection1.RollbackTrans;

Application.MessageBox('Произошла ошибка при выполнении операции!', 'Ошибка', MB_ICONERROR);

end;

end;

DM.dstSum.Close;

end;

end;

procedure TfmLoanCard.bbtPrintClick(Sender: TObject);

begin

Text_BuildGraphic;

end;

procedure TfmLoanCard.bbtPrintPayClick(Sender: TObject);

begin

Text_BuildEarlyPays;

end;

end.

Программный модуль uLoans.pas

unit uLoans;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, DBCtrls, ExtCtrls, Grids, DBGrids, ComCtrls;

type

TfmLoans = class(TForm)

DBGrid1: TDBGrid;

Panel1: TPanel;

DBNavigator1: TDBNavigator;

bbtExit: TBitBtn;

bbtCard: TBitBtn;

bbtPrint: TBitBtn;

GroupBox1: TGroupBox;

Label1: TLabel;

edContract: TEdit;

GroupBox2: TGroupBox;

chbCreditType: TCheckBox;

dblcbCreditType: TDBLookupComboBox;

chbDebtor: TCheckBox;

dblcbDebtor: TDBLookupComboBox;

chbGraphType: TCheckBox;

dblcbGraphType: TDBLookupComboBox;

chbStatus: TCheckBox;

dblcbStatus: TDBLookupComboBox;

Label2: TLabel;

chbDate1: TCheckBox;

dtpDate1: TDateTimePicker;

dtpDate2: TDateTimePicker;


Подобные документы

  • Комплексная система автоматизации кредитной деятельности банка RS-LOANS. Построение схемы бизнес-процессов кредитования. Оценка платежеспособности заемщика и поручителя. Разработка интерфейса пользователя, алгоритмов функций, экранных форм и отчетов.

    дипломная работа [3,0 M], добавлен 20.07.2014

  • Этапы разработки программы, предназначенной для автоматизации складского учета в фармацевтических организациях: выбор языка программирования, характеристика входной и результатной информации, составление схемы взаимосвязи программных модулей и файлов.

    курсовая работа [148,4 K], добавлен 12.05.2013

  • Интерфейсные средства СУБД MS Access 2003. Проектирование схемы данных. Создание составного отчёта, содержащего диаграмму. Группировка и сортировка в отчётах. Использование языка программирования VBА, создание макросов. Разработка программы и функций.

    курсовая работа [5,2 M], добавлен 20.06.2010

  • Создание программного продукта, автоматизирующего деятельность сотрудника учебного заведения, занимающегося учетом проведения научно-практических конференций. Выбор языка, среды программирования, разработка алгоритмов, проектирование интерфейса программы.

    курсовая работа [1,5 M], добавлен 06.12.2012

  • Реализация программной системы "Магазин" для автоматизации деятельности и обеспечения хранения, накопления и предоставления информации. Логическая и физическая структуры базы данных. Разработка пользовательского интерфейса. Создание таблиц, представлений.

    контрольная работа [3,9 M], добавлен 31.03.2014

  • Технико-экономическая характеристика Ивановского филиала Фонда обязательного медицинского страхования (ФОМС). Проект отдельной информационной подсистемы ФОМС, предназначенной для учета физических лиц и лечебных учреждений г. Иванова и Ивановской области.

    курсовая работа [57,2 K], добавлен 15.11.2009

  • Разработка программного комплекса автоматизации складского учета, предназначенного для розничных предприятий ЗАО "Белгородский бройлер": логическое, физическое проектирование, создание интерфейса пользователя на языке Delphi, расчет экономических затрат.

    дипломная работа [3,2 M], добавлен 02.03.2010

  • Автоматизация работы кредитного отдела банка, решений бизнес-процесса выдачи кредитов и карт. Определения методологии и языка IDEF0, программа Dreamweaver. Правильно построенные и действительные документы XML. Создание отчётов с помощью JasperReports.

    дипломная работа [1,9 M], добавлен 22.06.2013

  • Анализ задач бухгалтерского учета в рамках программного комплекса "1С: Бухгалтерия". Доработка типовой конфигурации программы для автоматизации расчёта услуг телефонии в РУП "Белтелеком". Создание справочника "Абоненты" и "Услуги РУП "Белтелеком".

    курсовая работа [1,0 M], добавлен 14.03.2012

  • Разработка информационной системы по автоматизации расчетов экономических показателей финансово-хозяйственной деятельности, процесса подготовки отчетов. Создание структуры базы данных, интерфейса системы с использованием среды программирования Делфи.

    курсовая работа [4,1 M], добавлен 28.10.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.