-
Notifications
You must be signed in to change notification settings - Fork 2
/
multiimporthelper.cpp
182 lines (151 loc) · 5.92 KB
/
multiimporthelper.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
#include "multiimporthelper.h"
#include "BLL/DatabaseHelper/databasehelper.h"
#include <QMap>
namespace ikoOSKAR {
namespace BLL {
MultiImportHelper::MultiImportHelper(const QString& xlsFilePath)
: dal(new ikoOSKAR::DAL::MultiImport)
, xlsFilePath(xlsFilePath)
{
}
void MultiImportHelper::run()
{
auto result = parseXls();
emit parsingFinished(result);
}
bool MultiImportHelper::matchesHeaderRow(const QStringList& line)
{
const QStringList headerRow = { "S.No", "Öğrenci No", "Adı", "Soyadı", "Cinsiyeti" };
if (line.size() < headerRow.size()) {
return false;
}
for (int i = 0; i < headerRow.size(); i++) {
if (line[i] != headerRow[i]) {
return false;
}
}
return true;
}
bool MultiImportHelper::matchesSectionFooter(const QStringList& line)
{
return line.at(0).contains("Öğrenci Sayısı");
}
bool MultiImportHelper::matchesFileFooter(const QList<QStringList>& lines)
{
// There must be at least 3 rows (1 header row, 1 section footer row and 1 (or 2) file footer row(s))
// and the last row must have 3 non-empty cells
const int& nLines = lines.size();
return nLines >= 3 and (lines.at(nLines - 1).size() == 3 or lines.at(nLines - 2).size() == 3);
}
QList<Student*>* MultiImportHelper::parseXls()
{
bool isFileReadable = dal->importXlsFile(xlsFilePath);
if (!isFileReadable) {
emit error("Hata: Excel dosyası okunamadı! Dosya yok ya da okuma izni yok.");
return nullptr;
}
const auto& lines = dal->getTrimmedLines();
if (lines == nullptr) {
emit error("Hata: Excel dosyası okunamadı! Dosya arızalı.");
return nullptr;
}
const int& nLines = lines->size();
if (nLines < 2) {
// The first row is treated as headers row,
// so we will ignore it
emit error("Hata: Excel dosyası boş!");
return nullptr;
}
int startingLine = 0;
for (int i = 0; i < lines->count(); i++) {
if (matchesHeaderRow(lines->at(i))) {
startingLine = i;
break;
}
}
int endingLine = nLines - 1;
for (int i = nLines - 1; i > 0; i--) {
if (matchesSectionFooter(lines->at(i))) {
endingLine = i;
break;
}
}
auto students = QMap<int, Student*>();
bool isStandardFormat = matchesHeaderRow(lines->at(startingLine))
&& matchesSectionFooter(lines->at(endingLine))
&& matchesFileFooter(*lines);
if (isStandardFormat) {
startingLine++;
}
for (int i = startingLine; i <= endingLine; i++) {
const auto& line = lines->at(i);
if (line.size() == 0) {
// Ignore empty rows
continue;
}
if (isStandardFormat) {
if (matchesSectionFooter(line)) {
if (i == endingLine) {
// Hit the end of the file
break;
} else {
// Found another section footer, meaning there are multiple sections
emit error("Hata: Excel dosyası birden fazla sınıf/şube içeriyor. Tek seferde birden fazla sınıf/şube eklenemez!");
return nullptr;
}
}
}
QString errorMsg = QString("Excel dosyasındaki %1. satırda hata oluştu: ").arg(i + 1);
if (line.size() < 4) {
// When not processing any header or footer row, there must be at least 4 cells each row
errorMsg += "Öğrenci bilgisi içeren her satırda en az 4 sütun bulunmalıdır! (Sınıf sıra no, okul no, ad, soyad, ...)";
emit error(errorMsg);
return nullptr;
}
// The first cell of each row is discarded
bool success = false;
Student* s = new Student();
s->id = line.at(1).toInt(&success);
s->firstName = line.at(2);
s->lastName = line.at(3);
// Check for student id being a number
if (!success) {
errorMsg += "Öğrenci numarası bir sayı olmalıdır!";
emit error(errorMsg);
return nullptr;
}
// Check for first name being empty
if (s->firstName.isEmpty()) {
errorMsg += "Öğrenci adı boş olamaz!";
emit error(errorMsg);
return nullptr;
}
// Check for last name being empty
if (s->lastName.isEmpty()) {
errorMsg += "Öğrenci soyadı boş olamaz!";
emit error(errorMsg);
return nullptr;
}
// Check for duplicate student IDs in the file itself
if (students.contains(s->id)) {
errorMsg += QString("Bu Excel dosyasında aynı öğrenci no'ya (%1) sahip birden fazla öğrenci var!").arg(s->id);
emit error(errorMsg);
return nullptr;
}
// Check for duplicate student IDs between the file and the database
const auto db = BLL::DatabaseHelper::getInstance();
if (db->IdExists(s->id)) {
errorMsg += QString("Sisteme kayıtlı öğrenciler arasında aynı okul no'ya (%1) sahip başka bir öğrenci daha var!").arg(s->id);
emit error(errorMsg);
return nullptr;
}
students[s->id] = s;
}
return new QList(students.values());
}
MultiImportHelper::~MultiImportHelper()
{
delete this->dal;
}
} // namespace BLL
} // namespace ikoOSKAR