From 15bef4617a339c2e8ba6fab696d8b9895482c937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helge=20Nordg=C3=A5rd?= Date: Sat, 2 Oct 2021 23:02:29 +0200 Subject: [PATCH] =?UTF-8?q?Utl=C3=B8psdatoer=20vindu=20implementert=20(#10?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Saeterprosjekt.pro.user | 2 +- src/core/mainwindow.cpp | 84 ++++++++++++++- src/core/mainwindow.h | 8 ++ src/mainwidgets/kundewidget.cpp | 4 +- src/mainwidgets/mainwidgets.pri | 9 +- src/mainwidgets/prosjektwidget.cpp | 28 ++++- src/mainwidgets/prosjektwidget.h | 4 +- src/mainwidgets/utlopwidget.cpp | 116 ++++++++++++++++++++ src/mainwidgets/utlopwidget.h | 40 +++++++ src/mainwidgets/utlopwidget.ui | 166 +++++++++++++++++++++++++++++ 10 files changed, 449 insertions(+), 12 deletions(-) create mode 100644 src/mainwidgets/utlopwidget.cpp create mode 100644 src/mainwidgets/utlopwidget.h create mode 100644 src/mainwidgets/utlopwidget.ui diff --git a/Saeterprosjekt.pro.user b/Saeterprosjekt.pro.user index 907b1c4..f1f2ea2 100644 --- a/Saeterprosjekt.pro.user +++ b/Saeterprosjekt.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 81be444..2975e30 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -507,7 +507,8 @@ void MainWindow::on_commandCustomers_clicked() { delete prosjektW; pListe = false; } else if (utlop) { - + delete utlopW; + utlop = false; } kundeW = new KundeWidget(this); @@ -536,6 +537,9 @@ void MainWindow::on_commandProsjekter_clicked() { if (kListe) { delete kundeW; kListe = false; + } else if (utlop) { + delete utlopW; + utlop = false; } prosjektW = new ProsjektWidget(this); @@ -554,6 +558,83 @@ void MainWindow::on_commandProsjekter_clicked() { } } +/* on_commandDeadlines_clicked(): + * ------------------------------- + * + * Setter inn listen over fremtidige prosjekter widgeten inn i hoved dialogboksen. + */ + +void MainWindow::on_commandDeadlines_clicked() { + if (!utlop) { + if (kListe) { + delete kundeW; + kListe = false; + } else if (pListe) { + delete prosjektW; + pListe = false; + } + } else { + delete utlopW; + utlop = false; + } + + utlopW = new UtlopWidget(this); + + connect(utlopW, SIGNAL(prosjektListeStarter()), this, SLOT(prosjektOppstartsListe())); + connect(utlopW, SIGNAL(prosjektListeAvslutter()), this, SLOT(prosjektAvslutterListe())); + connect(utlopW, SIGNAL(visProsjekt(int)), this, SLOT(hoppTilProsjekt(int))); + + ui->hovedLayout->insertWidget(0, utlopW); + utlopW->tegnUtlopsDatoer(prosjektKart); + utlopW->show(); + utlop = true; +} + + +/* prosjektOppstartsListe(): + * ------------------------------- + * + * Tegner utløpsdato tabellen på ny for å vise når prosjekter starter + */ + +void MainWindow::prosjektOppstartsListe() { + utlopW->tegnOppstartsDatoer(prosjektKart); +} + +/* prosjektAvslutterListe(): + * ------------------------------- + * + * Tegner utløpsdato tabellen på ny for å vise når prosjekter slutter + */ + +void MainWindow::prosjektAvslutterListe() { + utlopW->tegnUtlopsDatoer(prosjektKart); +} + +/* hoppTilProsjekt(): + * ------------------------------- + * + * Hopper fra utløpsdato til prosjekt widget og viser prosjektet brukeren dobbelklikket på + */ + +void MainWindow::hoppTilProsjekt(int prosjektId) { + prosjektW = new ProsjektWidget(this); + + connect(prosjektW, SIGNAL(opprettProsjekt()), this, SLOT(visNyttProsjektDlg())); + connect(prosjektW, SIGNAL(hentProsjektFil(int)), this, SLOT(sendProsjektFil(int))); + connect(prosjektW, SIGNAL(redigerProsjekt(int)), this, SLOT(visRedigerProsjektDialog(int))); + connect(prosjektW, SIGNAL(slettProsjekt(int)), this, SLOT(slettProsjekt(int))); + connect(prosjektW, SIGNAL(settAktiv(int)), this, SLOT(settAktivInaktiv(int))); + connect(prosjektW, SIGNAL(fjernKunde(int,int)), this, SLOT(fjernKundeFraProsjekt(int,int))); + + ui->hovedLayout->insertWidget(0, prosjektW); + prosjektW->oppdaterProsjektListe(prosjektKart, bindinger, kundeKart, prosjektId); + prosjektW->show(); + pListe = true; + delete utlopW; + utlop = false; +} + /* visNyttProsjektDlg(): * ------------------------------- * @@ -940,3 +1021,4 @@ void MainWindow::on_actionOm_triggered() { this->hide(); om->show(); } + diff --git a/src/core/mainwindow.h b/src/core/mainwindow.h index 5045446..c12a5c2 100644 --- a/src/core/mainwindow.h +++ b/src/core/mainwindow.h @@ -10,6 +10,7 @@ #include "kundewidget.h" #include "prosjektwidget.h" +#include "utlopwidget.h" #include "datahandler.h" #include "nykundedialog.h" #include "redigerkundedialog.h" @@ -67,6 +68,12 @@ private slots: void settAktivInaktiv(int kartotekPlassering); void fjernKundeFraProsjekt(int prosjektKartotekPosisjon, int kundeID); + /* Ultøpslots */ + void on_commandDeadlines_clicked(); + void prosjektOppstartsListe(); + void prosjektAvslutterListe(); + void hoppTilProsjekt(int prosjektId); + /* Arbeidshest slots */ void varsle(ProsjektFil prosjekt, AlertConditions kondisjon); @@ -74,6 +81,7 @@ private: Ui::MainWindow *ui; KundeWidget *kundeW; ProsjektWidget *prosjektW; + UtlopWidget *utlopW; DataHandler *ioHandler; NyKundeDialog *nyKdlg; RedigerKundeDialog *redigerKdlg; diff --git a/src/mainwidgets/kundewidget.cpp b/src/mainwidgets/kundewidget.cpp index d4f5c43..7a8295c 100644 --- a/src/mainwidgets/kundewidget.cpp +++ b/src/mainwidgets/kundewidget.cpp @@ -25,7 +25,7 @@ void KundeWidget::lagKundeTabell(KundeKartotek &kundeKart) { } QStringList overskrifter; - overskrifter << "Kundenummer" << tr("Fornavn") << tr("Etternavn") << tr("Firmanavn") << tr("Telefonnr") << tr("Epostadresse"); + overskrifter << tr("Kundenummer") << tr("Fornavn") << tr("Etternavn") << tr("Firmanavn") << tr("Telefonnr") << tr("Epostadresse"); ui->kundeTabell->setRowCount(aktivKartotek.size()); ui->kundeTabell->setColumnCount(6); ui->kundeTabell->setHorizontalHeaderLabels(overskrifter); @@ -62,6 +62,8 @@ void KundeWidget::lagKundeTabell(KundeKartotek &kundeKart) { ui->kundeTabell->setItem(i, 4, telefon); ui->kundeTabell->setItem(i, 5, epost); } + + ui->kundeTabell->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); } void KundeWidget::on_pushNyKunde_clicked() { diff --git a/src/mainwidgets/mainwidgets.pri b/src/mainwidgets/mainwidgets.pri index cbfcf8d..0f019e7 100644 --- a/src/mainwidgets/mainwidgets.pri +++ b/src/mainwidgets/mainwidgets.pri @@ -7,15 +7,18 @@ DEPENDPATH += \ SOURCES += \ $$PWD/kundewidget.cpp \ - $$PWD/prosjektwidget.cpp + $$PWD/prosjektwidget.cpp \ + $$PWD/utlopwidget.cpp HEADERS += \ $$PWD/kundewidget.h \ - $$PWD/prosjektwidget.h + $$PWD/prosjektwidget.h \ + $$PWD/utlopwidget.h FORMS += \ $$PWD/kundewidget.ui \ - $$PWD/prosjektwidget.ui + $$PWD/prosjektwidget.ui \ + $$PWD/utlopwidget.ui RESOURCES += \ $$PWD/../../resources.qrc diff --git a/src/mainwidgets/prosjektwidget.cpp b/src/mainwidgets/prosjektwidget.cpp index 69c2cdf..24f479d 100644 --- a/src/mainwidgets/prosjektwidget.cpp +++ b/src/mainwidgets/prosjektwidget.cpp @@ -11,7 +11,8 @@ ProsjektWidget::~ProsjektWidget() { delete ui; } -void ProsjektWidget::oppdaterProsjektListe(ProsjektKartotek &kartotek, ProsjektBindinger &bindinger, KundeKartotek &kundeKart) { +void ProsjektWidget::oppdaterProsjektListe(ProsjektKartotek &kartotek, ProsjektBindinger &bindinger, KundeKartotek &kundeKart, int prosjekt) { + lokaltKartotek = kartotek; ui->prosjektTre->clear(); ui->prosjektTre->setColumnCount(1); @@ -58,12 +59,19 @@ void ProsjektWidget::oppdaterProsjektListe(ProsjektKartotek &kartotek, ProsjektB prosjektGjenstand->addChildren(kundeGjenstander); } - prosjektGjenstand->setData(0, Qt::UserRole, i); + prosjektGjenstand->setData(0, Qt::UserRole, kartotek.at(i).value("ordrenummer").toInt()); prosjektListe.append(prosjektGjenstand); } } ui->prosjektTre->addTopLevelItems(prosjektListe); + + for (int i = 0; i < prosjektListe.size(); ++i) { + if (prosjekt > 0 && prosjekt == prosjektListe.at(i)->data(0, Qt::UserRole).toInt()) { + prosjektListe.at(i)->setSelected(true); + gjenstandKlikk(prosjektListe.at(i), 0); + } + } } void ProsjektWidget::settGjeldendeProsjekt(ProsjektFil prosjekt) { @@ -76,8 +84,8 @@ void ProsjektWidget::on_pushNy_clicked() { void ProsjektWidget::gjenstandKlikk(QTreeWidgetItem *gjenstand, int kolonne) { if (gjenstand->type() == QTreeWidgetItem::Type) { - emit hentProsjektFil(gjenstand->data(kolonne, Qt::UserRole).toInt()); - kartotekPosisjon = gjenstand->data(kolonne, Qt::UserRole).toInt(); + emit hentProsjektFil(hentKartotekPosisjon(gjenstand->data(kolonne, Qt::UserRole).toInt())); + kartotekPosisjon = hentKartotekPosisjon(gjenstand->data(kolonne, Qt::UserRole).toInt()); ui->labelProsjektNavn->setText(valgtProsjekt.value("prosjektnavn").toString()); ui->labelOrdrenrValue->setText(valgtProsjekt.value("ordrenummer").toString()); @@ -93,7 +101,7 @@ void ProsjektWidget::gjenstandKlikk(QTreeWidgetItem *gjenstand, int kolonne) { prosjektUI(); } else { QTreeWidgetItem *forelder = gjenstand->parent(); - kartotekPosisjon = forelder->data(kolonne, Qt::UserRole).toInt(); + kartotekPosisjon = hentKartotekPosisjon(forelder->data(kolonne, Qt::UserRole).toInt()); kundeID = gjenstand->data(kolonne, Qt::UserRole).toInt(); ui->labelProsjektNavn->setText("Ingen prosjekt valgt"); ui->labelOrdrenrValue->setText("-"); @@ -119,6 +127,16 @@ void ProsjektWidget::kundeUI() { ui->pushMerkFerdig->setEnabled(false); } +int ProsjektWidget::hentKartotekPosisjon(int prosjektId) { + int posisjon = 0; + for (int i = 0; i < lokaltKartotek.size(); ++i) { + if (lokaltKartotek.at(i).value("ordrenummer").toInt() == prosjektId) + posisjon = i; + } + + return posisjon; +} + void ProsjektWidget::on_pushRediger_clicked() { emit redigerProsjekt(kartotekPosisjon); diff --git a/src/mainwidgets/prosjektwidget.h b/src/mainwidgets/prosjektwidget.h index 2327bc6..bb06295 100644 --- a/src/mainwidgets/prosjektwidget.h +++ b/src/mainwidgets/prosjektwidget.h @@ -17,7 +17,7 @@ public: explicit ProsjektWidget(QWidget *parent = nullptr); ~ProsjektWidget(); - void oppdaterProsjektListe(ProsjektKartotek &kartotek, ProsjektBindinger &bindinger, KundeKartotek &kundeKart); + void oppdaterProsjektListe(ProsjektKartotek &kartotek, ProsjektBindinger &bindinger, KundeKartotek &kundeKart, int prosjekt = 0); void settGjeldendeProsjekt(ProsjektFil prosjekt); signals: @@ -39,9 +39,11 @@ private slots: private: Ui::ProsjektWidget *ui; ProsjektFil valgtProsjekt; + ProsjektKartotek lokaltKartotek; void prosjektUI(); void kundeUI(); + int hentKartotekPosisjon(int prosjektId); int kartotekPosisjon, kundeID; }; diff --git a/src/mainwidgets/utlopwidget.cpp b/src/mainwidgets/utlopwidget.cpp new file mode 100644 index 0000000..1d393aa --- /dev/null +++ b/src/mainwidgets/utlopwidget.cpp @@ -0,0 +1,116 @@ +#include "utlopwidget.h" +#include "ui_utlopwidget.h" + +UtlopWidget::UtlopWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::UtlopWidget) { + ui->setupUi(this); +} + +UtlopWidget::~UtlopWidget() { + delete ui; +} + +void UtlopWidget::tegnUtlopsDatoer(ProsjektKartotek &kartotek) { + ui->prosjektTable->clear(); + ProsjektKartotek gyldigKartotek = fjernUgyldigeProsjekter(kartotek); + + QStringList overskrifter; + overskrifter << tr("Prosjektnavn") << tr("Antall dager til prosjektet slutter"); + ui->prosjektTable->setRowCount(gyldigKartotek.size()); + ui->prosjektTable->setColumnCount(2); + ui->prosjektTable->setHorizontalHeaderLabels(overskrifter); + + for (int i = 0; i < gyldigKartotek.size(); ++i) { + QDateTime iDag = QDateTime::currentDateTime(); + quint64 iDagEpoch = iDag.toMSecsSinceEpoch(); + quint64 utlop = gyldigKartotek.at(i).value("prosjektslutt").toULongLong() - iDagEpoch; + int antallDagerUtlop = utlop / 24 / 60 / 60 / 1000; + + QTableWidgetItem *prosjektNavn = new QTableWidgetItem(); + prosjektNavn->setFlags(prosjektNavn->flags() ^ Qt::ItemIsEditable); + prosjektNavn->setData(Qt::EditRole, gyldigKartotek.at(i).value("prosjektnavn").toString()); + prosjektNavn->setData(Qt::UserRole, gyldigKartotek.at(i).value("ordrenummer").toInt()); + + QTableWidgetItem *utloper = new QTableWidgetItem(); + utloper->setFlags(utloper->flags() ^ Qt::ItemIsEditable); + if (antallDagerUtlop < 0) + utloper->setData(Qt::EditRole, tr("Utløpt")); + else if (antallDagerUtlop == 0) + utloper->setData(Qt::EditRole, tr("I dag")); + else + utloper->setData(Qt::EditRole, antallDagerUtlop); + utloper->setData(Qt::UserRole, gyldigKartotek.at(i).value("ordrenummer").toInt()); + + ui->prosjektTable->setItem(i, 0, prosjektNavn); + ui->prosjektTable->setItem(i, 1, utloper); + } + + ui->prosjektTable->sortItems(1); + ui->prosjektTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +} + +void UtlopWidget::tegnOppstartsDatoer(ProsjektKartotek &kartotek) { + ui->prosjektTable->clear(); + ProsjektKartotek gyldigKartotek = fjernUgyldigeProsjekter(kartotek); + + QStringList overskrifter; + overskrifter << tr("Prosjektnavn") << tr("Antall dager til prosjektet starter"); + ui->prosjektTable->setRowCount(gyldigKartotek.size()); + ui->prosjektTable->setColumnCount(2); + ui->prosjektTable->setHorizontalHeaderLabels(overskrifter); + + for (int i = 0; i < gyldigKartotek.size(); ++i) { + QDateTime iDag = QDateTime::currentDateTime(); + quint64 iDagEpoch = iDag.toMSecsSinceEpoch(); + quint64 utlop = gyldigKartotek.at(i).value("prosjektstart").toULongLong() - iDagEpoch; + int antallDagerUtlop = utlop / 24 / 60 / 60 / 1000; + + QTableWidgetItem *prosjektNavn = new QTableWidgetItem(); + prosjektNavn->setFlags(prosjektNavn->flags() ^ Qt::ItemIsEditable); + prosjektNavn->setData(Qt::EditRole, gyldigKartotek.at(i).value("prosjektnavn").toString()); + prosjektNavn->setData(Qt::UserRole, gyldigKartotek.at(i).value("ordrenummer").toInt()); + + QTableWidgetItem *utloper = new QTableWidgetItem(); + utloper->setFlags(utloper->flags() ^ Qt::ItemIsEditable); + if (antallDagerUtlop < 0) + utloper->setData(Qt::EditRole, tr("Startet")); + else if (antallDagerUtlop == 0) + utloper->setData(Qt::EditRole, tr("I dag")); + else + utloper->setData(Qt::EditRole, antallDagerUtlop); + utloper->setData(Qt::UserRole, gyldigKartotek.at(i).value("ordrenummer").toInt()); + + ui->prosjektTable->setItem(i, 0, prosjektNavn); + ui->prosjektTable->setItem(i, 1, utloper); + } + + ui->prosjektTable->sortItems(1); + ui->prosjektTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +} + +void UtlopWidget::on_radioVisAvslutt_clicked() { + emit prosjektListeAvslutter(); +} + + +void UtlopWidget::on_radioVisBegynner_clicked() { + emit prosjektListeStarter(); +} + +ProsjektKartotek UtlopWidget::fjernUgyldigeProsjekter(ProsjektKartotek kartotek) { + ProsjektKartotek gyldige; + + for (int i = 0; i < kartotek.size(); ++i) { + if (kartotek.at(i).value("active").toBool() && !kartotek.at(i).value("ferdig").toBool()) + gyldige << kartotek.at(i); + + } + + return gyldige; +} + + +void UtlopWidget::on_prosjektTable_itemDoubleClicked(QTableWidgetItem *item) { + emit visProsjekt(item->data(Qt::UserRole).toInt()); +} diff --git a/src/mainwidgets/utlopwidget.h b/src/mainwidgets/utlopwidget.h new file mode 100644 index 0000000..32b655e --- /dev/null +++ b/src/mainwidgets/utlopwidget.h @@ -0,0 +1,40 @@ +#ifndef UTLOPWIDGET_H +#define UTLOPWIDGET_H + +#include +#include +#include +#include "datatypes.h" + +namespace Ui { +class UtlopWidget; +} + +class UtlopWidget : public QWidget +{ + Q_OBJECT + +public: + explicit UtlopWidget(QWidget *parent = nullptr); + ~UtlopWidget(); + + void tegnUtlopsDatoer(ProsjektKartotek &kartotek); + void tegnOppstartsDatoer(ProsjektKartotek &kartotek); + + +signals: + void prosjektListeAvslutter(); + void prosjektListeStarter(); + void visProsjekt(int prosjektId); + +private slots: + void on_radioVisAvslutt_clicked(); + void on_radioVisBegynner_clicked(); + void on_prosjektTable_itemDoubleClicked(QTableWidgetItem *item); + +private: + Ui::UtlopWidget *ui; + ProsjektKartotek fjernUgyldigeProsjekter(ProsjektKartotek kartotek); +}; + +#endif // UTLOPWIDGET_H diff --git a/src/mainwidgets/utlopwidget.ui b/src/mainwidgets/utlopwidget.ui new file mode 100644 index 0000000..b0f1227 --- /dev/null +++ b/src/mainwidgets/utlopwidget.ui @@ -0,0 +1,166 @@ + + + UtlopWidget + + + + 0 + 0 + 764 + 542 + + + + Form + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 12 + 75 + true + + + + Utløpsdatoer + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 10 + 50 + false + + + + Viser alle prosjekter med utløpsdatoer i synkende rekkefølge + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + true + + + false + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Vis når prosjekter slutter + + + true + + + + + + + Vis når prosjekter begynner + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + +