Добавлен: 14.06.2023
Просмотров: 438
Скачиваний: 10
given += ("1000 - " + count.ToString() + ", ");
count1tr = count;
}
int count5sr = sum / 500;
count = GetCountBanknotes("500");
if (count >= count5sr)
{
givenSum += count5sr * 500;
sum -= count5sr * 500; //вычислить остаток, который выдавать другими купюрами
given += ("500 - " + count5sr.ToString() + ", ");
}
else if (count < count5sr)
{
givenSum += count * 500;
sum -= count5sr * 500; //вычислить остаток, который выдавать другими купюрами
given += ("500 - " + count.ToString() + ", ");
count5sr = count;
}
int count1sr = sum / 100;
count = GetCountBanknotes("100");
if (count >= count1sr)
{
givenSum += count1sr * 100;
sum -= count1sr * 100; //вычислить остаток, который выдавать другими купюрами
given += ("100 - " + count1sr.ToString() + ", ");
}
else if (count < count1sr)
{
givenSum += count * 100;
sum -= count1sr * 100; //вычислить остаток
given += ("100 - " + count.ToString() + ", ");
count1sr = count;
}
if (sum != 0) //в итоге остаток должен стать равен 0
{ //если этого не случилось, значит в хранилище нет каких-либо купюр
MessageBox.Show("Невозможно выдать требумую сумму"); //в достаточном количестве
lPin.Visible = false;
btYes.Visible = false;
btNo.Visible = false;
}
else
{
UpdateBanknotes("5000", count5tr);
UpdateBanknotes("1000", count1tr);
UpdateBanknotes("500", count5sr);
UpdateBanknotes("100", count1sr);
server.GetCash(numAccount, givenSum);
server.InsertToHistory("", dateTransact, -givenSum, "", "getCash");
MessageBox.Show(given); //отобразить сообщение, какими купюрами в каком количестве
} //выдана данная сумма
}
else // если на балансе нет трубуемой суммы
{
lPin.Visible = true;
lPin.Text = "Недостаточно денег";
}
}
int GetCountBanknotes(string denomination)
{
int count = 0;
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlFindCard = "SELECT Banknotes.countBanknotes FROM Banknotes WHERE denomination=@denomination";
OleDbCommand cmd = new OleDbCommand(sqlFindCard, conn);
OleDbParameter[] prms = new OleDbParameter[1];
prms[0] = new OleDbParameter("@denomination", OleDbType.VarChar);
prms[0].Value = denomination;
cmd.Parameters.AddRange(prms);
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read()) count = Convert.ToInt32(dr.GetValue(0));
return count;
}
void UpdateBanknotes(string denomination, int count)
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlUpdateBalance = "UPDATE Banknotes SET countBanknotes=(countBanknotes-@count) WHERE denomination=@denomination";
OleDbCommand cmd = new OleDbCommand(sqlUpdateBalance, conn);
OleDbParameter[] prms = new OleDbParameter[2];
prms[0] = new OleDbParameter("@count", OleDbType.Integer);
prms[0].Value = count;
prms[1] = new OleDbParameter("@denomination", OleDbType.VarChar);
prms[1].Value = denomination;
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
private void bt100r_Click(object sender, EventArgs e)
{
GetCash(100);
}
private void bt200r_Click(object sender, EventArgs e)
{
GetCash(200);
}
private void bt500r_Click(object sender, EventArgs e)
{
GetCash(500);
}
private void bt1tr_Click(object sender, EventArgs e)
{
GetCash(1000);
}
private void bt5tr_Click(object sender, EventArgs e)
{
GetCash(5000);
}
private void bt10tr_Click(object sender, EventArgs e)
{
GetCash(10000);
}
private void bt20tr_Click(object sender, EventArgs e)
{
GetCash(20000);
}
private void bt50tr_Click(object sender, EventArgs e)
{
GetCash(50000);
}
private void btYes_Click(object sender, EventArgs e) //печать чека
{
string date = DateTime.Now.ToString();
string numCard = "********" + numAccount.Substring(8); //номер карты, где отображены только последние 4 цифры
string print = "Время оперции: " + date +
"\n\nНомер счета: " + numCard + //распечать номер счета
"\nВыдано: "+givenSum+ //выданную сумму
"\nОстаток: "+server.GetBalance(numAccount).ToString(); //и остаток по карте
MessageBox.Show(print);
btNo_Click(sender, e); //отобразить элементы для выполнения новой операции
}
private void btNo_Click(object sender, EventArgs e) //не печатать чек
{
lAction.Text = "Выберите действие";
lPin.Visible = false;
gbSum.Visible = false;
btNo.Visible = false;
btYes.Visible = false;
pWireTransfer.Visible = false;
gbSum.Visible = false;
}
private void btExit_Click(object sender, EventArgs e) //выход, прекращение обслуживания
{ //отображение первоначальной формы
lAction.Text = "Вставьте карту";
lPin.Visible = false;
attempt = 3;
gbButtons.Visible = false;
pTransact.Visible = false;
pWireTransfer.Visible = false;
tbCard.Clear();
tbCardTansact.Clear();
tbSum.Clear();
mtbMobile.Clear();
pin = "";
gbDisplay.Text = "";
}
string transact = ""; //переменная для определения типа перевода
private void btTransact_Click(object sender, EventArgs e) //денежный перевод
{
lAction.Text="Денежный перевод";
lPin.Visible = false;
gbSum.Visible = false;
//отобразить панель для ввода номера карты и суммы для перевода
pTransact.Visible = true;
mtbMobile.Visible = false;
tbCardTansact.Visible = true;
lNum.Text = "Номер карты";
transact="card";
}
//выполнить перевод
private void btRunTransact_Click(object sender, EventArgs e)
{
//денежный перевод на карту
if(transact=="card")
{
string numCard = tbCardTansact.Text; //номер карты
double sum = Convert.ToDouble(tbSum.Text); //сумма
dateTransact = DateTime.Now;
access = server.CheckCard(numCard); //проверка указанной карты
if (access == true) //если карта найдена
{
if(sum<=server.GetBalance(numAccount))
{
server.GetCash(numAccount, sum);
server.Transact(numCard, sum); //зачисление средств на указанный счет
server.InsertToHistory(numAccount, dateTransact, -sum, "", "transact");
double s = server.GetBalance(numCard);
server.InsertToHistory(numCard, dateTransact, sum, "", "transact");
MessageBox.Show("Перевод успешно выполнен");
pTransact.Visible = false;
lAction.Text = "Выберите действие";
}
else
{
MessageBox.Show("Недостаточно денег на счете");
}
}
else MessageBox.Show("Номер карты не найден");
}
//оплата сотовой связи
if(transact=="tel")
{
string tel=mtbMobile.Text; //номер телефона
double sum = Convert.ToDouble(tbSum.Text); //сумма пополнения
if (sum <= server.GetBalance(numAccount))
{
server.GetCash(numAccount, sum);
server.InsertToHistory(tel, dateTransact, -sum, "", "tel");
MessageBox.Show("Пополнение счета "+tel+" успешно выполнено");
pTransact.Visible = false;
lAction.Text = "Выберите действие";
}
else
{
MessageBox.Show("Недостаточно денег на счете");
}
}
}
//оплата сотовой связи
private void btMobile_Click(object sender, EventArgs e)
{
lAction.Text = "Оплата сотовой связи";
lPin.Visible = false;
gbSum.Visible = false;
//отобразить панель для ввода номера телефона и суммы для пополнения
pTransact.Visible = true;
mtbMobile.Visible = true;
tbCardTansact.Visible = false;
lNum.Text = "Номер телефона";
transact = "tel";
}
private void btWireTransfer_Click(object sender, EventArgs e)
{
lAction.Text = "Выберите вид перевода";
lPin.Visible = false;
gbSum.Visible = false;
pWireTransfer.Visible = true;
}
private void btCommunal_Click(object sender, EventArgs e)
{
FormCommunalPaid fcp = new FormCommunalPaid();
fcp.typeTransact = "communal";
fcp.numAccount = numAccount;
fcp.Show();
}
private void button1_Click(object sender, EventArgs e)
{
FormCommunalPaid fcp = new FormCommunalPaid();
fcp.typeTransact = "energy";
fcp.numAccount = numAccount;
fcp.Show();
}
private void btHistory_Click(object sender, EventArgs e)
{
lPin.Visible = false;
gbSum.Visible = false;
pWireTransfer.Visible = false;
FormHistory fh = new FormHistory();
fh.numAccount = numAccount;
fh.Show();
}
}
}
Листинг кода класса «Сервер банка»
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data.OleDb;
using System.Windows.Forms;
namespace Банкомат
{
class ClassBankServer
{
OleDbDataReader dr;
int idAccount;
OleDbDataReader SqlSelectCard(string numCard) //получение информации по карте
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlFindCard = "SELECT Accounts.idAccount, Clients.nameClient, Accounts.pin, Accounts.balance " +
"FROM Accounts INNER JOIN Clients ON Accounts.idClient = Clients.idClient WHERE Accounts.numAccount=@numCard";
OleDbCommand cmd = new OleDbCommand(sqlFindCard, conn);
OleDbParameter[] prms = new OleDbParameter[1];
prms[0] = new OleDbParameter("@numCard", OleDbType.VarChar);
prms[0].Value = numCard;
cmd.Parameters.AddRange(prms);
dr = cmd.ExecuteReader();
return dr;
}
public bool CheckCard(string numCard) //проверка карты
{
bool access = false;
dr = SqlSelectCard(numCard);
while (dr.Read()) access = true;
return access;
}
public bool CheckPin(string numCard, string pin) //проверка пин-кода
{
bool access = false;
dr = SqlSelectCard(numCard);
while (dr.Read())
{
if(pin==dr.GetValue(2).ToString()) access = true;
}
return access;
}
public double GetBalance(string numCard) //проверка баланса
{
double balance=0;
dr = SqlSelectCard(numCard);
while (dr.Read())
{
balance = Convert.ToDouble(dr.GetValue(3));
idAccount = Convert.ToInt32(dr.GetValue(0));
}
return balance;
}
public void GetCash(string numCard, double sum) //выдача денег - изменение баланса по карте
{
//перезаписать данные о счете,
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlUpdateBalance = "UPDATE Accounts SET balance=(balance-@sum) WHERE numAccount=@numCard";
OleDbCommand cmd = new OleDbCommand(sqlUpdateBalance, conn);
OleDbParameter[] prms = new OleDbParameter[2];
prms[0] = new OleDbParameter("@sum", OleDbType.Double);
prms[0].Value = sum;
prms[1] = new OleDbParameter("@numCard", OleDbType.VarChar);
prms[1].Value = numCard;
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
public void Transact(string numCard, double sum) //зачисление средств на счет при денежном переводе другому клиенту
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlUpdateBalance = "UPDATE Accounts SET balance=(balance+@sum) WHERE numAccount=@numCard";
OleDbCommand cmd = new OleDbCommand(sqlUpdateBalance, conn);
OleDbParameter[] prms = new OleDbParameter[2];
prms[0] = new OleDbParameter("@sum", OleDbType.Double);
prms[0].Value = sum;
prms[1] = new OleDbParameter("@numCard", OleDbType.VarChar);
prms[1].Value = numCard;
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
public void InsertToHistory(string transactAccount, DateTime dateTransact, double sumTransact, string personalAccount, string typeTransact) //добавить запись об операции в историю
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlInsertHistory = "INSERT INTO History(idAccount, transactAccount, dateTransact, sumTransact, personalAccount, typeTransact) " +
"VALUES (@idAccount, @transactAccount, @dateTransact, @sumTransact, @personalAccount, @typeTransact) ";
OleDbCommand cmd = new OleDbCommand(sqlInsertHistory, conn);
OleDbParameter[] prms = new OleDbParameter[6];
prms[0] = new OleDbParameter("@idAccount", OleDbType.Integer);
prms[0].Value = idAccount;
prms[1] = new OleDbParameter("@transactAccount", OleDbType.VarChar);
prms[1].Value = transactAccount;
prms[2] = new OleDbParameter("@dateTransact", OleDbType.Date);
prms[2].Value = dateTransact;
prms[3] = new OleDbParameter("@sumTransact", OleDbType.Double);
prms[3].Value = sumTransact;
prms[4] = new OleDbParameter("@personalAccount", OleDbType.VarChar);
prms[4].Value = personalAccount;
prms[5] = new OleDbParameter("@typeTransact", OleDbType.VarChar);
prms[5].Value = typeTransact;
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
public OleDbDataReader History(DateTime dateStart, DateTime dateEnd) //получение истории операций по карте
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlSelectHistory = "SELECT History.dateTransact, History.transactAccount, History.sumTransact, History.typeTransact " +
"FROM History WHERE History.idAccount=@idAccount AND History.dateTransact>=@dateStart AND History.dateTransact<=@dateEnd";
OleDbCommand cmd = new OleDbCommand(sqlSelectHistory, conn);
OleDbParameter[] prms = new OleDbParameter[3];
prms[0] = new OleDbParameter("@idAccount", OleDbType.VarChar);
prms[0].Value = idAccount;
prms[1] = new OleDbParameter("@dateStart", OleDbType.Date);
prms[1].Value = dateStart;
prms[2] = new OleDbParameter("@dateEnd", OleDbType.Date);
prms[2].Value = dateEnd;
cmd.Parameters.AddRange(prms);
dr = cmd.ExecuteReader();
return dr;
}
public string GetName(string typeTransact, string transactAccount) //получение наименования владельца счета для перевода средств
{
string name = "";
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + Application.StartupPath.ToString() + "\\bank.accdb;Persist Security Info=False;");
conn.Open();
string sqlSelectName = "";
if (typeTransact == "transact") //денежные переводы другому клиенту банка
{
sqlSelectName = "SELECT Clients.nameClient FROM Accounts INNER JOIN Clients ON Accounts.idClient = Clients.idClient WHERE Accounts.numAccount=@transactAccount";
}
if (typeTransact == "communal" || typeTransact == "energy") //коммунальные услуги
{
sqlSelectName = "SELECT nameProvider FROM Providers WHERE accountProvider=@transactAccount";
}
OleDbCommand cmd = new OleDbCommand(sqlSelectName, conn);
OleDbParameter[] prms = new OleDbParameter[1];
prms[0] = new OleDbParameter("@transactAccount", OleDbType.VarChar);
prms[0].Value = transactAccount;
cmd.Parameters.AddRange(prms);
try
{
dr = cmd.ExecuteReader();
while (dr.Read()) name = dr.GetValue(0).ToString();
}
catch { name = "Мобильная связь"; }
return name;
}
}
}
Листинг кода формы «Коммунальные платежи»
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace Банкомат
{
public partial class FormCommunalPaid : Form
{
public FormCommunalPaid()
{
InitializeComponent();
}
public string typeTransact, numAccount; //номера текущего счета и счета для перевода
ClassProviders provider;
ClassBankServer server;
string accountProvider, personalAccount; //номер счета поставщика и лицевой счет
int idProvider;
private void FormCommunalPaid_Load(object sender, EventArgs e)
{
if (typeTransact == "communal") //при оплате коммунальныъ платежей
{
this.Text = "Оплата коммунальных услуг";
}
if (typeTransact == "energy") //при оплате электроэнергии
{
this.Text = "Оплата электроэнергии";
}
provider = new ClassProviders();
OleDbDataReader dr = provider.FillProviders(typeTransact); //получение списка поставщиков по типу предоставляемых услуг
DataTable prov = new DataTable(); //создание таблицы для связывания с ней элементов выпадащего списка
prov.Columns.Add("id"); //колонка код поставщика
prov.Columns.Add("name"); //колонка наименование
while (dr.Read())
{
prov.Rows.Add(Convert.ToInt32(dr.GetValue(0)), dr.GetValue(1).ToString()); //заполнение таблицы
}
cbProvider.DisplayMember = "name"; //отображаемые члены - наименование
cbProvider.ValueMember = "id"; //члены значений - код
cbProvider.DataSource = prov; //связывание таблицы с элементами списка
}
private void cbProvider_SelectedIndexChanged(object sender, EventArgs e) //при смене поставщика
{
idProvider = Convert.ToInt32(cbProvider.SelectedValue); //получаем код поставщика
accountProvider = provider.FindAccountProvider(idProvider); //получаем номер банковского счета этого поставщика
lAccount.Text = accountProvider; //выводим номер на фому
}
private void btCheck_Click(object sender, EventArgs e) //проверить лицевой счет клиента
{
lClient.Text = ""; //очитска полей ФИО и адреса клиента
lAddress.Text = "";
personalAccount = tbPersonalAccount.Text;
OleDbDataReader dr = provider.CheckPersonalAccount(personalAccount); //вызов метода проверки лицевого счета
while (dr.Read())
{
lClient.Text = dr.GetValue(0).ToString(); //заполнение полей ФИО и адреса клиента
lAddress.Text = dr.GetValue(1).ToString();
}
if (lClient.Text == "") MessageBox.Show("Указанный лицевой счет не найден");