-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatm.cpp
147 lines (129 loc) · 3.38 KB
/
atm.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "atm.h"
#include "controllers/sessioncontroller.h"
#include <QRandomGenerator>
#include <math.h>
ATM::ATM(ATMMainWindow* ui, int id, const QString &location, QMap<int, int> money, QList<QString> knownCards):
QObject(),
_id(id),
_location(location),
_money(money),
_knownCards(knownCards),
_bank(new Bank("bank_db.sqlite")),
_mediator(new LocalMediator(QSharedPointer<Bank>(_bank))),
_uc(new UIController(ui)),
_sc(new SessionController(_uc, this))
{
_uc->setKnownCards(_knownCards);
_sc->reset(false);
}
bool ATM::cardExists(const QString &card)
{
return _mediator->getAccount(card).status() == OK;
}
bool ATM::isCardBlocked(const QString &card)
{
BankResponse<Account> br = _mediator->getAccount(card);
if (br.status() == OK) {
return br.value().blocked();
} else return false;
}
bool ATM::isCardExpired(const QString &card)
{
BankResponse<Account> br = _mediator->getAccount(card);
if (br.status() == OK) {
return (br.value().expirationDate() < QDateTime::currentDateTime());
} else return false;
}
int ATM::getBalance(const QString &card)
{
BankResponse<Account> br = _mediator->getAccount(card);
if (br.status() == OK) {
return br.value().balance();
} else return 0;
}
bool ATM::checkPIN(const QString &card, const QString &pin)
{
BankResponse<bool> br = _mediator->checkPin(card, pin);
if (br.status() == OK) {
return br.value();
} else return false;
}
QString ATM::changePIN(const QString &card)
{
int rand = QRandomGenerator::global()->bounded(10000);
QString rands = QString::number(rand);
rands = QString("0").repeated(4 - rands.length()) + rands;
_mediator->setPin(card, rands);
return rands;
}
bool ATM::canWithdrawSum(size_t sum)
{
return !sumToBanknotes(sum).empty();
}
QMap<int,int> ATM::sumToBanknotes(size_t sum)
{
size_t rest = sum;
QMap<int,int> res;
QList<int> keys(_money.keys());
std::sort(keys.begin(), keys.end(), std::greater<int>());
for (int i = 0; i < keys.length(); ++i) {
if (rest == 0) return res;
int curkey = keys.at(i);
double divres = floor(rest / curkey);
if (divres >= 1 && _money[curkey] >= divres) {
rest -= divres * curkey;
res[curkey] = divres;
}
}
if (rest == 0) return res;
else return QMap<int,int>();
}
void ATM::withdrawBanknotes(size_t sum)
{
QMap<int,int> res = sumToBanknotes(sum);
for (int i = 0; i < res.keys().length(); ++i)
_money[res.keys().at(i)] = _money[res.keys().at(i)] - res[res.keys().at(i)];
}
void ATM::addBanknotes(QMap<int, int> banknotes)
{
for (int i = 0; i < banknotes.keys().length(); ++i) {
int key = banknotes.keys().at(i);
if (_money.keys().contains(key))
_money[key] = _money[key] + banknotes[key];
else
_money[key] = banknotes[key];
}
}
void ATM::addBalance(size_t sum, const QString &card)
{
_mediator->top_up(card, sum);
}
void ATM::subtractBalance(size_t sum, const QString &card)
{
_mediator->withdraw(card, sum);
}
const QString ATM::createCard(const QString &card)
{
int rand = QRandomGenerator::global()->bounded(10000);
QString rands = QString::number(rand);
rands = QString("0").repeated(4 - rands.length()) + rands;
Account a(card, QDateTime::currentDateTime().addYears(1), rands);
_mediator->createAccount(a);
return rands;
}
void ATM::blockCard(const QString &card)
{
_mediator->block(card);
}
void ATM::unblockCard(const QString &card)
{
_mediator->unblock(card);
}
const QString ATM::getLocation()
{
return _location;
}
int ATM::getId()
{
return _id;
}