Автоматизированная информационная система учета кредитов физических лиц в коммерческом банке
Создание программы предназначенной для автоматизации деятельности кредитного сотрудника банка. Анализ рынка автоматизации кредитования физических лиц. Выбор СУБД и языка программирования. Инфологическое проектирование и разработка интерфейса АИС.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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