comparison src/editperson.cpp @ 237:54ab3f3e28c0

Split EditPerson and ViewTransactions to separate source files.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 07 May 2018 19:19:13 +0300
parents
children 43a5e09bb832
comparison
equal deleted inserted replaced
236:2e0fcb3d0b95 237:54ab3f3e28c0
1 //
2 // Syntilista - debt list/management database program
3 // Programmed and designed by Matti Hämäläinen <ccr@tnsp.org>
4 // (C) Copyright 2017-2018 Tecnic Software productions (TNSP)
5 //
6 // Distributed under 3-clause BSD style license, refer to
7 // included file "COPYING" for exact terms.
8 //
9 #include "main.h"
10 #include "ui_editperson.h"
11
12
13 EditPerson::EditPerson(QWidget *parent) :
14 QDialog(parent),
15 ui(new Ui::EditPerson)
16 {
17 ui->setupUi(this);
18
19 slSetCommonStyleSheet(this);
20
21 setModal(true);
22 setAttribute(Qt::WA_DeleteOnClose);
23 show();
24 activateWindow();
25 raise();
26 setFocus();
27
28 model_Transactions = new SLTransactionSQLModel();
29 ui->tableview_Transactions->setModel(model_Transactions);
30 ui->tableview_Transactions->setItemDelegate(new QSqlRelationalDelegate(ui->tableview_Transactions));
31 ui->tableview_Transactions->verticalHeader()->setVisible(false);
32 ui->tableview_Transactions->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
33
34 ui->edit_FirstName->setMaxLength(SQL_LEN_FIRST_NAME);
35 ui->edit_LastName->setMaxLength(SQL_LEN_LAST_NAME);
36
37 connect(
38 ui->textedit_ExtraInfo,
39 SIGNAL(textChanged()),
40 this,
41 SLOT(on_textedit_ExtraInfo_textChanged()));
42
43 validateForm();
44 }
45
46
47 EditPerson::~EditPerson()
48 {
49 delete ui;
50 delete model_Transactions;
51 }
52
53
54 void EditPerson::statusMsg(const QString &msg)
55 {
56 // Pass the status message to main window
57 dynamic_cast<SyntilistaMainWindow *>(parent())->statusMsg(msg);
58 }
59
60
61 bool EditPerson::validateForm()
62 {
63 selPerson.firstName = slCleanupStr(ui->edit_FirstName->text());
64 selPerson.lastName = slCleanupStr(ui->edit_LastName->text());
65 selPerson.extraInfo = ui->textedit_ExtraInfo->document()->toPlainText();
66 bool extraInfoValid = selPerson.extraInfo.length() < SQL_LEN_EXTRA_INFO;
67
68 ui->textedit_ExtraInfo->setStyleSheet(!extraInfoValid ? "background-color: red;" : NULL);
69 ui->edit_FirstName->setStyleSheet(selPerson.firstName == "" ? "background-color: red;" : NULL);
70 ui->edit_LastName->setStyleSheet(selPerson.lastName == "" ? "background-color: red;" : NULL);
71
72 return selPerson.firstName != "" && selPerson.lastName != "" && extraInfoValid;
73 }
74
75
76 void EditPerson::on_button_Cancel_clicked()
77 {
78 close();
79 }
80
81
82 void EditPerson::on_button_OK_clicked()
83 {
84 //
85 // Check form validation
86 //
87 if (!validateForm())
88 {
89 slErrorMsg(
90 tr("Virhe!"),
91 tr("Vaaditut kentät (etunimi, sukunimi) eivät ole täytetty tai lisätietojen pituus on liian suuri."));
92
93 return;
94 }
95
96 if (selPerson.id >= 0)
97 {
98 //
99 // We are in update/edit person mode, thus we check if the
100 // first/last name have changed and if there is someone with
101 // different ID and same names.
102 //
103 QSqlQuery person;
104 person.prepare(QStringLiteral("SELECT * FROM people WHERE id <> ? AND first_name=? AND last_name=?"));
105 person.addBindValue(selPerson.id);
106 person.addBindValue(selPerson.firstName);
107 person.addBindValue(selPerson.lastName);
108 person.exec();
109
110 slCheckAndReportSQLError("SELECT check for existing person by same name (UPDATE)", person.lastError());
111
112 if (person.next())
113 {
114 // There exists another person with that name
115 slErrorMsg(
116 tr("Virhe!"),
117 tr("Ei pysty! Samalla nimellä '%1 %2' on olemassa jo henkilö!").
118 arg(selPerson.firstName).arg(selPerson.lastName));
119 return;
120 }
121
122 // Allest klar, update the person data
123 dynamic_cast<SyntilistaMainWindow *>(parent())->model_People->updatePerson(selPerson);
124 dynamic_cast<SyntilistaMainWindow *>(parent())->setActivePerson(selPerson.id);
125
126 statusMsg(tr("Päivitettiin henkilö '%1 %2' (#%3).").
127 arg(selPerson.firstName).arg(selPerson.lastName).arg(selPerson.id));
128 }
129 else
130 {
131 //
132 // We are in "add new person" mode, check if there exists
133 // someone with same first+last name.
134 //
135 QSqlQuery person;
136 person.prepare("SELECT * FROM people WHERE first_name=? AND last_name=?");
137 person.addBindValue(selPerson.firstName);
138 person.addBindValue(selPerson.lastName);
139 person.exec();
140
141 slCheckAndReportSQLError("SELECT check for existing person by same name (ADD)", person.lastError());
142
143 if (person.next())
144 {
145 // There exists a record with same name
146 slErrorMsg(
147 tr("Virhe!"),
148 tr("Ei pysty! Samalla nimellä '%1 %2' on olemassa jo henkilö!").
149 arg(selPerson.firstName).arg(selPerson.lastName));
150
151 return;
152 }
153
154 // Attempt to add a person
155 qint64 nid = dynamic_cast<SyntilistaMainWindow *>(parent())->model_People->addPerson(selPerson);
156 if (nid < 0)
157 {
158 slErrorMsg(
159 tr("Virhe!"),
160 tr("Tietokannan käsittelyssä tapahtui virhe (#%1).").
161 arg(nid));
162 }
163 else
164 {
165 dynamic_cast<SyntilistaMainWindow *>(parent())->updatePersonList();
166 dynamic_cast<SyntilistaMainWindow *>(parent())->setActivePerson(nid);
167 dynamic_cast<SyntilistaMainWindow *>(parent())->focusDebtEdit();
168
169 statusMsg(tr("Lisättiin uusi henkilö '%1 %2'.").
170 arg(selPerson.firstName).arg(selPerson.lastName));
171 }
172 }
173
174 close();
175 }
176
177
178 void EditPerson::on_edit_FirstName_textChanged(const QString &arg1)
179 {
180 (void) arg1;
181 validateForm();
182 }
183
184
185 void EditPerson::on_edit_LastName_textChanged(const QString &arg1)
186 {
187 (void) arg1;
188 validateForm();
189 }
190
191
192 void EditPerson::on_textedit_ExtraInfo_textChanged()
193 {
194 validateForm();
195 }
196
197
198 void EditPerson::clearForm()
199 {
200 ui->edit_FirstName->clear();
201 ui->edit_LastName->clear();
202 ui->textedit_ExtraInfo->document()->clear();
203 ui->edit_FirstName->setFocus();
204 }
205
206
207 //
208 // Set the person to be edited
209 //
210 void EditPerson::setPerson(qint64 id)
211 {
212 selPerson.id = id;
213
214 if (id >= 0)
215 {
216 SLPersonInfo pinfo;
217 if (!slGetPersonInfo(id, pinfo))
218 {
219 statusMsg(tr("Virhe! Ei henkilöä ID:llä #%1").arg(id));
220 // Intentional fall-through below
221 }
222 else
223 {
224 ui->edit_FirstName->setText(pinfo.firstName);
225 ui->edit_LastName->setText(pinfo.lastName);
226 ui->textedit_ExtraInfo->document()->setPlainText(pinfo.extraInfo);
227 ui->label_AddedValue->setText(slDateTimeToStr(pinfo.added));
228
229 QSqlQuery query;
230 query.prepare(QStringLiteral("SELECT id,value,added FROM transactions WHERE person=? ORDER BY added DESC"));
231 query.addBindValue(pinfo.id);
232 query.exec();
233 slCheckAndReportSQLError("SELECT transactions for tableview_Transactions", query.lastError());
234
235 model_Transactions->setQuery(query);
236
237 model_Transactions->setHeaderData(0, Qt::Horizontal, tr("ID"));
238 model_Transactions->setHeaderData(1, Qt::Horizontal, tr("Summa"));
239 model_Transactions->setHeaderData(2, Qt::Horizontal, tr("Aika"));
240
241 ui->tableview_Transactions->setModel(model_Transactions);
242 ui->tableview_Transactions->setColumnHidden(0, true);
243
244 return; // Ugly
245 }
246 }
247
248 // In case of id < 0 or errors ..
249 clearForm();
250 ui->tableview_Transactions->setModel(NULL);
251 }