Mercurial > hg > syntilista
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/editperson.cpp Mon May 07 19:19:13 2018 +0300 @@ -0,0 +1,251 @@ +// +// Syntilista - debt list/management database program +// Programmed and designed by Matti Hämäläinen <ccr@tnsp.org> +// (C) Copyright 2017-2018 Tecnic Software productions (TNSP) +// +// Distributed under 3-clause BSD style license, refer to +// included file "COPYING" for exact terms. +// +#include "main.h" +#include "ui_editperson.h" + + +EditPerson::EditPerson(QWidget *parent) : + QDialog(parent), + ui(new Ui::EditPerson) +{ + ui->setupUi(this); + + slSetCommonStyleSheet(this); + + setModal(true); + setAttribute(Qt::WA_DeleteOnClose); + show(); + activateWindow(); + raise(); + setFocus(); + + model_Transactions = new SLTransactionSQLModel(); + ui->tableview_Transactions->setModel(model_Transactions); + ui->tableview_Transactions->setItemDelegate(new QSqlRelationalDelegate(ui->tableview_Transactions)); + ui->tableview_Transactions->verticalHeader()->setVisible(false); + ui->tableview_Transactions->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->edit_FirstName->setMaxLength(SQL_LEN_FIRST_NAME); + ui->edit_LastName->setMaxLength(SQL_LEN_LAST_NAME); + + connect( + ui->textedit_ExtraInfo, + SIGNAL(textChanged()), + this, + SLOT(on_textedit_ExtraInfo_textChanged())); + + validateForm(); +} + + +EditPerson::~EditPerson() +{ + delete ui; + delete model_Transactions; +} + + +void EditPerson::statusMsg(const QString &msg) +{ + // Pass the status message to main window + dynamic_cast<SyntilistaMainWindow *>(parent())->statusMsg(msg); +} + + +bool EditPerson::validateForm() +{ + selPerson.firstName = slCleanupStr(ui->edit_FirstName->text()); + selPerson.lastName = slCleanupStr(ui->edit_LastName->text()); + selPerson.extraInfo = ui->textedit_ExtraInfo->document()->toPlainText(); + bool extraInfoValid = selPerson.extraInfo.length() < SQL_LEN_EXTRA_INFO; + + ui->textedit_ExtraInfo->setStyleSheet(!extraInfoValid ? "background-color: red;" : NULL); + ui->edit_FirstName->setStyleSheet(selPerson.firstName == "" ? "background-color: red;" : NULL); + ui->edit_LastName->setStyleSheet(selPerson.lastName == "" ? "background-color: red;" : NULL); + + return selPerson.firstName != "" && selPerson.lastName != "" && extraInfoValid; +} + + +void EditPerson::on_button_Cancel_clicked() +{ + close(); +} + + +void EditPerson::on_button_OK_clicked() +{ + // + // Check form validation + // + if (!validateForm()) + { + slErrorMsg( + tr("Virhe!"), + tr("Vaaditut kentät (etunimi, sukunimi) eivät ole täytetty tai lisätietojen pituus on liian suuri.")); + + return; + } + + if (selPerson.id >= 0) + { + // + // We are in update/edit person mode, thus we check if the + // first/last name have changed and if there is someone with + // different ID and same names. + // + QSqlQuery person; + person.prepare(QStringLiteral("SELECT * FROM people WHERE id <> ? AND first_name=? AND last_name=?")); + person.addBindValue(selPerson.id); + person.addBindValue(selPerson.firstName); + person.addBindValue(selPerson.lastName); + person.exec(); + + slCheckAndReportSQLError("SELECT check for existing person by same name (UPDATE)", person.lastError()); + + if (person.next()) + { + // There exists another person with that name + slErrorMsg( + tr("Virhe!"), + tr("Ei pysty! Samalla nimellä '%1 %2' on olemassa jo henkilö!"). + arg(selPerson.firstName).arg(selPerson.lastName)); + return; + } + + // Allest klar, update the person data + dynamic_cast<SyntilistaMainWindow *>(parent())->model_People->updatePerson(selPerson); + dynamic_cast<SyntilistaMainWindow *>(parent())->setActivePerson(selPerson.id); + + statusMsg(tr("Päivitettiin henkilö '%1 %2' (#%3)."). + arg(selPerson.firstName).arg(selPerson.lastName).arg(selPerson.id)); + } + else + { + // + // We are in "add new person" mode, check if there exists + // someone with same first+last name. + // + QSqlQuery person; + person.prepare("SELECT * FROM people WHERE first_name=? AND last_name=?"); + person.addBindValue(selPerson.firstName); + person.addBindValue(selPerson.lastName); + person.exec(); + + slCheckAndReportSQLError("SELECT check for existing person by same name (ADD)", person.lastError()); + + if (person.next()) + { + // There exists a record with same name + slErrorMsg( + tr("Virhe!"), + tr("Ei pysty! Samalla nimellä '%1 %2' on olemassa jo henkilö!"). + arg(selPerson.firstName).arg(selPerson.lastName)); + + return; + } + + // Attempt to add a person + qint64 nid = dynamic_cast<SyntilistaMainWindow *>(parent())->model_People->addPerson(selPerson); + if (nid < 0) + { + slErrorMsg( + tr("Virhe!"), + tr("Tietokannan käsittelyssä tapahtui virhe (#%1)."). + arg(nid)); + } + else + { + dynamic_cast<SyntilistaMainWindow *>(parent())->updatePersonList(); + dynamic_cast<SyntilistaMainWindow *>(parent())->setActivePerson(nid); + dynamic_cast<SyntilistaMainWindow *>(parent())->focusDebtEdit(); + + statusMsg(tr("Lisättiin uusi henkilö '%1 %2'."). + arg(selPerson.firstName).arg(selPerson.lastName)); + } + } + + close(); +} + + +void EditPerson::on_edit_FirstName_textChanged(const QString &arg1) +{ + (void) arg1; + validateForm(); +} + + +void EditPerson::on_edit_LastName_textChanged(const QString &arg1) +{ + (void) arg1; + validateForm(); +} + + +void EditPerson::on_textedit_ExtraInfo_textChanged() +{ + validateForm(); +} + + +void EditPerson::clearForm() +{ + ui->edit_FirstName->clear(); + ui->edit_LastName->clear(); + ui->textedit_ExtraInfo->document()->clear(); + ui->edit_FirstName->setFocus(); +} + + +// +// Set the person to be edited +// +void EditPerson::setPerson(qint64 id) +{ + selPerson.id = id; + + if (id >= 0) + { + SLPersonInfo pinfo; + if (!slGetPersonInfo(id, pinfo)) + { + statusMsg(tr("Virhe! Ei henkilöä ID:llä #%1").arg(id)); + // Intentional fall-through below + } + else + { + ui->edit_FirstName->setText(pinfo.firstName); + ui->edit_LastName->setText(pinfo.lastName); + ui->textedit_ExtraInfo->document()->setPlainText(pinfo.extraInfo); + ui->label_AddedValue->setText(slDateTimeToStr(pinfo.added)); + + QSqlQuery query; + query.prepare(QStringLiteral("SELECT id,value,added FROM transactions WHERE person=? ORDER BY added DESC")); + query.addBindValue(pinfo.id); + query.exec(); + slCheckAndReportSQLError("SELECT transactions for tableview_Transactions", query.lastError()); + + model_Transactions->setQuery(query); + + model_Transactions->setHeaderData(0, Qt::Horizontal, tr("ID")); + model_Transactions->setHeaderData(1, Qt::Horizontal, tr("Summa")); + model_Transactions->setHeaderData(2, Qt::Horizontal, tr("Aika")); + + ui->tableview_Transactions->setModel(model_Transactions); + ui->tableview_Transactions->setColumnHidden(0, true); + + return; // Ugly + } + } + + // In case of id < 0 or errors .. + clearForm(); + ui->tableview_Transactions->setModel(NULL); +}