-
Notifications
You must be signed in to change notification settings - Fork 0
/
UcitavanjeRacuna.cpp
254 lines (222 loc) · 5.99 KB
/
UcitavanjeRacuna.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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include "FunkcijeZaObraduRacuna.h"
#include "UcitavanjeRacuna.h"
#include <cmath>
vector<string> imena_fajlova_u_folderu(string folder) {
vector<string> names;
/*
Algoritam koji sve fajlove u jednom folderu smijesta u vektor
stringova i njega vraca. Ulazni parametar je direktorijum foldera
(relativni ili direktni)
*/
string search_path = folder + "/*.*";
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(search_path.c_str(), &fd);
if (hFind != INVALID_HANDLE_VALUE) {
do {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
names.push_back(fd.cFileName);
}
} while (::FindNextFile(hFind, &fd));
::FindClose(hFind);
}
return names;
}
int tip_racuna(const char* naziv) {
/*
Funkcija odredjuje tip racuna tako sto uporedjuje prvo
slovo 4 linije fajla sa svim mogucim slovima koji se mogu naci.
U slucaju da je to slovo razlicito od mogucih u datim formatima
odnosno u slucaju da format racuna nije ispravan,
vraca se -1.Ulazni parametar je naziv racuna
*/
string direktorijum = "racuni/";
string puniNaziv = direktorijum;
puniNaziv += naziv;
ifstream fajl(puniNaziv.c_str());
//cout <<endl<<"naziv: "<< puniNaziv.c_str() << endl;
if (!fajl.is_open()) {
std::cout << "Greska pri otvaranju fajla" << std::endl;
return -2;
}
char buffer[100];
fajl.getline(buffer, 100);
fajl.getline(buffer, 100);
fajl.getline(buffer, 100);
fajl >> buffer;
if (buffer[0] == 'R') {
fajl.close();
return 1;
}
if (buffer[0] == 'M') {
fajl.close();
return 2;
}
if (buffer[0] == 'D') {
fajl.close();
return 3;
}
if (buffer[0] == 'e') {
fajl.close();
return 4;
}
std::cout << "Neispravan format racuna!" << std::endl;
fajl.close();
return -1;
}
void obradi_racun(const char* naziv) {
/*
NAPOMENA: Komentari se odnose za dio koda iznad njih!
*/
int tipNovogRacuna = tip_racuna(naziv);
if (tipNovogRacuna == -1) {
std::cout << "GRESKA! Pogresan tip(format) racuna)" << std::endl;
/*
ovde mozda da stavimo neku f-ju koja ce prebaciti taj racun u error folder?!
*/
return;
}
std::fstream brfajl("obradjeni racuni/broj racuna.txt", ios::in);
if (!brfajl.is_open()) {
std::cout << "Greska pri otvaranju fajla koji sadrzi broj fajlova!" << std::endl;
return;
}
char buffer[100];
brfajl.getline(buffer, 100);
int ukupan_broj_racuna = strtol(buffer, NULL, 10);
ukupan_broj_racuna++;
brfajl.close();
brfajl.open("obradjeni racuni/broj racuna.txt", ios::out);
brfajl << ukupan_broj_racuna << "\n";
brfajl.close();
/*
Otvaramo fajl "broj racuna" koji se nalazi u folderu "obradjeni racuni"
i iz njega citamo trenutni broj racuna, uvecavamo ga za jedan i pisemo ga u isti fajl.
*/
std::string nazivBrojRacuna = std::to_string(ukupan_broj_racuna);
std::string direktorijum = "obradjeni racuni/";
std::string ekstenzija = ".txt";
std::string puniNaziv = direktorijum;
puniNaziv += nazivBrojRacuna;
puniNaziv += ekstenzija;
/*
Kreiramo i otvaramo novi racun u folderu obradjeni racuni
u koji cemo upisati racun iz foldera racuni.
*/
std::string direktorijum2 = "racuni/";
std::string puniNaziv2 = direktorijum2;
puniNaziv2 += naziv;
switch (tipNovogRacuna) {
case 1:
obradi_racun1(puniNaziv2, puniNaziv);
break;
case 2:
obradi_racun2(puniNaziv2, puniNaziv);
break;
case 3:
obradi_racun3(puniNaziv2, puniNaziv);
break;
case 4:
obradi_racun4(puniNaziv2, puniNaziv);
break;
}
remove(puniNaziv2.c_str());
provjeraRacuna(puniNaziv);
}
void ucitavanje_racuna() {
vector<string> niz = imena_fajlova_u_folderu("./racuni");
for (string v : niz) {
obradi_racun(v.c_str());
}
}
inline bool ispravniPodaci(double cijena, double kolicina, double ukupno)
{
return (ukupno == cijena*kolicina) ? true : false;
}
//Ovdje se provjerava da li je racun ispravan
void provjeraRacuna(std::string imeRacuna)
{
bool ispravan = true;
std::ifstream racunProvjera(imeRacuna.c_str());
char buffer[100];
racunProvjera.getline(buffer, 100);
racunProvjera.getline(buffer, 100);
double ukupno, pdv, saPdv;
racunProvjera >> ukupno;
racunProvjera >> pdv;
racunProvjera >> saPdv;
if (ukupno + pdv != saPdv)
{
ispravan = false;
if (abs((ukupno + pdv) - saPdv) < 0.001)
ispravan = true;
//Zbog Floating point preciznosti
}
//Provjera konzistentnosti
std::string artikal;
if (!racunProvjera.is_open())
{
std::cout << "Greska pri provjeri racuna";
return;
}
double kolicina = 0, cijena = 0, ukupno1 = 0;
std::getline(racunProvjera, artikal, '-');
while (artikal != "\n" && ispravan==true)
{
racunProvjera >> kolicina;
racunProvjera >> cijena;
racunProvjera >> ukupno1;
cijena = -cijena; //Jer se dobiju negativne vrijednosti
ukupno1 = -ukupno1;
if (!ispravniPodaci(cijena, kolicina, ukupno1))
{
ispravan = false;
if (abs((cijena*kolicina) - ukupno1) < 0.001)
ispravan = true;
}//Zbog double preciznosti
std::getline(racunProvjera, artikal, '-');
}
racunProvjera.close();
if (!ispravan)
{
std::ifstream brRac("Racuni sa greskom/brRac.txt");
if (!brRac.is_open()) {
std::cout << "Greska pri otvaranju fajla koji sadrzi broj racuna!" << std::endl;
return;
}
//Povecanje broja racuna sa greskom
int broj;
brRac >> broj;
broj++;
brRac.close();
std::ofstream brRacuna("Racuni sa greskom/brRac.txt");
brRacuna << broj;
brRacuna.close();
//Upisivanje racuna u fajl za greske
std::string novoImeRacuna = "Racuni sa greskom/";
novoImeRacuna += std::to_string(broj);
novoImeRacuna += "_error.txt";
if (rename(imeRacuna.c_str(), novoImeRacuna.c_str()) != 0)
{
std::cout << "Greska pri prebacivanju fajla";
return;
}
// Premjestanje racuna
std::ifstream brRac2("obradjeni racuni/broj racuna.txt");
if (!brRac2.is_open()) {
std::cout << "Greska pri otvaranju fajla koji sadrzi broj racuna!" << std::endl;
return;
}
// Smanjivanje broja obradjenih racuna
int broj2;
brRac2 >> broj2;
broj2--;
brRac2.close();
std::ofstream brRacuna2("obradjeni racuni/broj racuna.txt");
brRacuna2 << broj2;
brRacuna2.close();
}
}