Warning, file /office/skrooge/skgbasegui/skgperiodedit.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /***************************************************************************
0002  * SPDX-FileCopyrightText: 2022 S. MANKOWSKI stephane@mankowski.fr
0003  * SPDX-FileCopyrightText: 2022 G. DE BURE support@mankowski.fr
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  ***************************************************************************/
0006 /** @file
0007  * A period editor.
0008  *
0009  * @author Stephane MANKOWSKI / Guillaume DE BURE
0010  */
0011 #include "skgperiodedit.h"
0012 #include "skgmainpanel.h"
0013 
0014 #include <qdom.h>
0015 
0016 #include "skgservices.h"
0017 #include "skgtraces.h"
0018 
0019 SKGPeriodEdit::SKGPeriodEdit(QWidget* iParent, bool iModeEnabled)
0020     : QWidget(iParent), m_modeEnable(iModeEnabled), m_count(0)
0021 {
0022     ui.setupUi(this);
0023     this->setFocusProxy(ui.kPeriod);
0024 
0025     ui.kPeriod->addItem(i18nc("Period mode", "All Dates"), static_cast<int>(SKGPeriodEdit::ALL));
0026     ui.kPeriod->addItem(i18nc("Period mode", "Current…"), static_cast<int>(SKGPeriodEdit::CURRENT));
0027     ui.kPeriod->addItem(i18nc("Period mode", "Previous…"), static_cast<int>(SKGPeriodEdit::PREVIOUS));
0028     ui.kPeriod->addItem(i18nc("Period mode", "Last…"), static_cast<int>(SKGPeriodEdit::LAST));
0029     ui.kPeriod->addItem(i18nc("Period mode", "Custom…"), static_cast<int>(SKGPeriodEdit::CUSTOM));
0030     ui.kPeriod->addItem(i18nc("Period mode", "Timeline…"), static_cast<int>(SKGPeriodEdit::TIMELINE));
0031 
0032     ui.kInterval->addItem(i18nc("Period interval", "day(s)"), 0);
0033     ui.kInterval->addItem(i18nc("Period interval", "week(s)"), 1);
0034     ui.kInterval->addItem(i18nc("Period interval", "month(s)"), 2);
0035     ui.kInterval->addItem(i18nc("Period interval", "quarter(s)"), 4);
0036     ui.kInterval->addItem(i18nc("Period interval", "semester(s)"), 5);
0037     ui.kInterval->addItem(i18nc("Period interval", "year(s)"), 3);
0038 
0039     ui.kPeriod->setCurrentIndex(1);
0040     ui.kInterval->setCurrentIndex(2);
0041 
0042     connect(ui.kPeriod, static_cast<void (SKGComboBox::*)(const QString&)>(&SKGComboBox::currentTextChanged), this, &SKGPeriodEdit::refresh);
0043     connect(ui.kInterval, static_cast<void (SKGComboBox::*)(const QString&)>(&SKGComboBox::currentTextChanged), this, &SKGPeriodEdit::refresh);
0044     connect(ui.kDateBegin, &SKGDateEdit::dateEntered, this, &SKGPeriodEdit::refresh);
0045     connect(ui.kDateEnd, &SKGDateEdit::dateEntered, this, &SKGPeriodEdit::refresh);
0046     connect(ui.kNbIntervals, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &SKGPeriodEdit::refresh);
0047     connect(ui.kTimeline, &QSlider::valueChanged, this, &SKGPeriodEdit::refresh);
0048     connect(ui.kFuture, &QCheckBox::stateChanged, this, &SKGPeriodEdit::refresh);
0049 }
0050 
0051 SKGPeriodEdit::~SKGPeriodEdit()
0052     = default;
0053 
0054 QString SKGPeriodEdit::getState()
0055 {
0056     SKGTRACEINFUNC(10)
0057     QDomDocument doc(QStringLiteral("SKGML"));
0058     QDomElement root = doc.createElement(QStringLiteral("parameters"));
0059     doc.appendChild(root);
0060 
0061     root.setAttribute(QStringLiteral("period"), SKGServices::intToString(mode()));
0062     if (mode() == CUSTOM) {
0063         root.setAttribute(QStringLiteral("date_begin"), SKGServices::intToString(ui.kDateBegin->date().toJulianDay()));
0064         root.setAttribute(QStringLiteral("date_end"), SKGServices::intToString(ui.kDateEnd->date().toJulianDay()));
0065     }
0066     root.setAttribute(QStringLiteral("interval"), SKGServices::intToString(ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt()));
0067     root.setAttribute(QStringLiteral("nb_intervals"), SKGServices::intToString(ui.kNbIntervals->value()));
0068     root.setAttribute(QStringLiteral("timeline"), SKGServices::intToString(ui.kTimeline->value()));
0069     root.setAttribute(QStringLiteral("future"), ui.kFuture->isChecked() ? QStringLiteral("Y") : QStringLiteral("N"));
0070 
0071     return doc.toString();
0072 }
0073 
0074 void SKGPeriodEdit::setState(const QString& iState)
0075 {
0076     SKGTRACEINFUNC(10)
0077 
0078     QDomDocument doc(QStringLiteral("SKGML"));
0079     doc.setContent(iState);
0080     QDomElement root = doc.documentElement();
0081 
0082     QString period = root.attribute(QStringLiteral("period"));
0083     QString interval = root.attribute(QStringLiteral("interval"));
0084     QString nb_interval = root.attribute(QStringLiteral("nb_intervals"));
0085     QString timeline = root.attribute(QStringLiteral("timeline"));
0086     QString date_begin = root.attribute(QStringLiteral("date_begin"));
0087     QString date_end = root.attribute(QStringLiteral("date_end"));
0088     QString future = root.attribute(QStringLiteral("future"));
0089 
0090     // Default values
0091     if (period.isEmpty()) {
0092         period = '1';
0093     }
0094     if (interval.isEmpty()) {
0095         interval = '2';
0096     }
0097     if (nb_interval.isEmpty()) {
0098         nb_interval = '1';
0099     }
0100     if (timeline.isEmpty()) {
0101         timeline = '1';
0102     }
0103     ui.kPeriod->setCurrentIndex(ui.kPeriod->findData(SKGServices::stringToInt(period)));
0104     ui.kInterval->setCurrentIndex(ui.kInterval->findData(SKGServices::stringToInt(interval)));
0105     ui.kTimeline->setValue(SKGServices::stringToInt(timeline));
0106     ui.kNbIntervals->setValue(SKGServices::stringToInt(nb_interval));
0107     ui.kFuture->setChecked(future == QStringLiteral("Y"));
0108     if (!date_begin.isEmpty()) {
0109         ui.kDateBegin->setDate(QDate::fromJulianDay(SKGServices::stringToInt(date_begin)));
0110     }
0111     if (!date_end.isEmpty()) {
0112         ui.kDateEnd->setDate(QDate::fromJulianDay(SKGServices::stringToInt(date_end)));
0113     }
0114 
0115     refresh();
0116 }
0117 
0118 QString SKGPeriodEdit::text() const
0119 {
0120     QString during = ui.kPeriod->text().remove(QStringLiteral("…"));
0121 
0122     SKGPeriodEdit::PeriodMode m = mode();
0123     if (m == CUSTOM || m == TIMELINE) {
0124         during = i18nc("A period", "From %1 to %2", SKGMainPanel::dateToString(ui.kDateBegin->date()), SKGMainPanel::dateToString(ui.kDateEnd->date()));
0125     } else if (m != ALL) {
0126         if (m == PREVIOUS) {
0127             switch (ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt()) {
0128             case 0:
0129                 during = i18ncp("A period", "Previous day", "%1 previous days", ui.kNbIntervals->value());
0130                 break;
0131             case 1:
0132                 during = i18ncp("A period", "Previous week", "%1 previous weeks", ui.kNbIntervals->value());
0133                 break;
0134             case 2:
0135                 during = i18ncp("A period", "Previous month", "%1 previous months", ui.kNbIntervals->value());
0136                 break;
0137             case 3:
0138                 during = i18ncp("A period", "Previous year", "%1 previous years", ui.kNbIntervals->value());
0139                 break;
0140             case 4:
0141                 during = i18ncp("A period", "Previous quarter", "%1 previous quarters", ui.kNbIntervals->value());
0142                 break;
0143             case 5:
0144             default:
0145                 during = i18ncp("A period", "Previous semester", "%1 previous semesters", ui.kNbIntervals->value());
0146                 break;
0147             }
0148         } else if (m == LAST) {
0149             switch (ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt()) {
0150             case 0:
0151                 during = i18ncp("A period", "Last day", "%1 last days", ui.kNbIntervals->value());
0152                 break;
0153             case 1:
0154                 during = i18ncp("A period", "Last week", "%1 last weeks", ui.kNbIntervals->value());
0155                 break;
0156             case 2:
0157                 during = i18ncp("A period", "Last month", "%1 last months", ui.kNbIntervals->value());
0158                 break;
0159             case 3:
0160                 during = i18ncp("A period", "Last year", "%1 last years", ui.kNbIntervals->value());
0161                 break;
0162             case 4:
0163                 during = i18ncp("A period", "Last quarter", "%1 last quarters", ui.kNbIntervals->value());
0164                 break;
0165             case 5:
0166             default:
0167                 during = i18ncp("A period", "Last semester", "%1 last semesters", ui.kNbIntervals->value());
0168                 break;
0169             }
0170         } else if (m == CURRENT) {
0171             switch (ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt()) {
0172             case 0:
0173                 during = i18nc("A period", "Current day");
0174                 break;
0175             case 1:
0176                 during = i18nc("A period", "Current week");
0177                 break;
0178             case 2:
0179                 during = i18nc("A period", "Current month");
0180                 break;
0181             case 3:
0182                 during = i18nc("A period", "Current year");
0183                 break;
0184             case 4:
0185                 during = i18nc("A period", "Current quarter");
0186                 break;
0187             case 5:
0188             default:
0189                 during = i18nc("A period", "Current semester");
0190                 break;
0191             }
0192         }
0193     }
0194     return during;
0195 }
0196 
0197 
0198 SKGPeriodEdit::PeriodMode SKGPeriodEdit::mode() const
0199 {
0200     return static_cast<PeriodMode>(ui.kPeriod->itemData(ui.kPeriod->currentIndex()).toInt());
0201 }
0202 
0203 void SKGPeriodEdit::getDates(SKGPeriodEdit::PeriodMode iPeriod, SKGPeriodEdit::PeriodInterval iInterval, int iValue, QDate& oBeginDate, QDate& oEndDate, QDate iDate)
0204 {
0205     QDate a = iDate;
0206     QDate b = a;
0207     int val = iValue;
0208 
0209     switch (iInterval) {
0210     case DAY:
0211         // Interval is in days
0212         break;
0213     case WEEK:
0214         // Interval is in weeks
0215         val *= 7;
0216         break;
0217     case MONTH:
0218     default:
0219         // Interval is in months
0220         break;
0221     case QUARTER:
0222         // Interval is in quarter
0223         val *= 3;
0224         break;
0225     case SEMESTER:
0226         // Interval is in semester
0227         val *= 6;
0228         break;
0229     case YEAR:
0230         // Interval is in years
0231         break;
0232     }
0233 
0234     switch (iPeriod) {
0235     case CURRENT:
0236         // Current Interval
0237         switch (iInterval) {
0238         case DAY:
0239             // Interval is in days
0240             break;
0241         case WEEK:
0242             // Interval is in weeks
0243             a = a.addDays(1 - a.dayOfWeek());
0244             b = a.addDays(7 - 1);
0245             break;
0246         case MONTH:
0247         default:
0248             // Interval is in months
0249             a = a.addDays(1 - a.day());
0250             b = a.addMonths(1).addDays(-1);
0251             break;
0252         case YEAR:
0253             // Interval is in years
0254             a = a.addDays(1 - a.day()).addMonths(1 - a.month());
0255             b = a.addYears(1).addDays(-1);
0256             break;
0257         case QUARTER:
0258             // Interval is in quarter
0259             a = a.addDays(1 - a.day()).addMonths(1 - ((a.month() - 1) % 4));
0260             b = a.addMonths(3).addDays(-1);
0261             break;
0262         case SEMESTER:
0263             // Interval is in semester
0264             a = a.addDays(1 - a.day()).addMonths(- ((a.month() - 1) % 6));
0265             b = a.addMonths(6).addDays(-1);
0266             break;
0267         }
0268         break;
0269     case PREVIOUS:
0270         // Previous Interval
0271         switch (iInterval) {
0272         case DAY:
0273             // Interval is in days
0274             b = b.addDays(-1);
0275             a = b.addDays(-val + 1);
0276             break;
0277         case WEEK:
0278             // Interval is in weeks
0279             b = b.addDays(-a.dayOfWeek());
0280             a = b.addDays(-val + 1);
0281             break;
0282         case MONTH:
0283         default:
0284             // Interval is in months
0285             b = b.addDays(-b.day());
0286             a = b.addDays(1).addMonths(-val);
0287             break;
0288         case YEAR:
0289             // Interval is in years
0290             b = b.addMonths(1 - b.month()).addDays(-b.day());
0291             a = b.addDays(1).addYears(-val);
0292             break;
0293         case QUARTER:
0294             // Interval is in quarter
0295             b = b.addMonths(1 - ((b.month() - 1) % 4)).addDays(-b.day());
0296             a = b.addDays(1).addMonths(-val);
0297             break;
0298         case SEMESTER:
0299             // Interval is in semester
0300             b = b.addMonths(- ((b.month() - 1) % 6)).addDays(-b.day());
0301             a = b.addDays(1).addMonths(-val);
0302             break;
0303         }
0304         break;
0305     case LAST:
0306         // Last Interval
0307         switch (iInterval) {
0308         case DAY:
0309             // Interval is in days
0310             a = a.addDays(-val);
0311             break;
0312         case WEEK:
0313             // Interval is in weeks
0314             a = a.addDays(-val);
0315             break;
0316         case MONTH:
0317         default:
0318             // Interval is in months
0319             a = a.addMonths(-val);
0320             break;
0321         case YEAR:
0322             // Interval is in years
0323             a = a.addYears(-val);
0324             break;
0325         case QUARTER:
0326             // Interval is in quarter
0327             a = a.addMonths(-val);
0328             break;
0329         case SEMESTER:
0330             // Interval is in semester
0331             a = a.addMonths(-val);
0332             break;
0333         }
0334         a = a.addDays(1);
0335         break;
0336     case TIMELINE:
0337         // Timeline
0338         switch (iInterval) {
0339         case DAY:
0340             // Interval is in days
0341             a = a.addDays(iValue - 12);
0342             b = a;
0343             break;
0344         case WEEK:
0345             // Interval is in weeks
0346             a = a.addDays(1 - a.dayOfWeek()).addDays((iValue - 12) * 7);
0347             b = a.addDays(7 - 1);
0348             break;
0349         case MONTH:
0350         default:
0351             // Interval is in months
0352             a = a.addDays(1 - a.day()).addMonths(iValue - 12);
0353             b = a.addMonths(1).addDays(-1);
0354             break;
0355         case YEAR:
0356             // Interval is in years
0357             a = a.addDays(1 - a.day()).addMonths(1 - a.month()).addYears(iValue - 12);
0358             b = a.addYears(1).addDays(-1);
0359             break;
0360         case QUARTER:
0361             // Interval is in quarter
0362             a = a.addDays(1 - a.day()).addMonths(1 - ((a.month() - 1) % 4)).addMonths(3 * (iValue - 12));
0363             b = a.addMonths(3).addDays(-1);
0364             break;
0365         case SEMESTER:
0366             // Interval is in semester
0367             a = a.addDays(1 - a.day()).addMonths(- ((a.month() - 1) % 6)).addMonths(6 * (iValue - 12));
0368             b = a.addMonths(6).addDays(-1);
0369             break;
0370         }
0371         break;
0372     default:
0373         // Take all dates
0374         a = a.addYears(-1);
0375         break;
0376     }
0377 
0378     oBeginDate = a;
0379     oEndDate = b;
0380 }
0381 
0382 void SKGPeriodEdit::getDates(QDate& oBeginDate, QDate& oEndDate)
0383 {
0384     SKGPeriodEdit::PeriodInterval interval = static_cast<SKGPeriodEdit::PeriodInterval>(ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt());
0385     int val = ui.kNbIntervals->value();
0386 
0387     getDates(mode(), interval, mode() == TIMELINE ? ui.kTimeline->value() : val, oBeginDate, oEndDate);
0388 }
0389 
0390 QString SKGPeriodEdit::getWhereClause(bool iForecast, QString* oWhereClausForPreviousData, QString*  oWhereClausForForecastData) const
0391 {
0392     // Build where clause
0393     QString wc;
0394 
0395     SKGPeriodEdit::PeriodInterval interval = static_cast<SKGPeriodEdit::PeriodInterval>(ui.kInterval->itemData(ui.kInterval->currentIndex()).toInt());
0396     QString strfFormat;
0397     QString sqlInterval;
0398     QString sqlAttribute;
0399     int val = ui.kNbIntervals->value();
0400     int one = 1;
0401     QDate a;
0402     QDate b;
0403 
0404     getDates(mode(), interval, mode() == TIMELINE ? ui.kTimeline->value() : val, a, b);
0405 
0406     switch (interval) {
0407     case DAY:
0408         // Interval is in days
0409         sqlAttribute = QStringLiteral("d_date");
0410         strfFormat = QStringLiteral("'D'");
0411         sqlInterval = QStringLiteral("DAY");
0412         break;
0413     case WEEK:
0414         // Interval is in weeks
0415         sqlAttribute = QStringLiteral("d_DATEWEEK");
0416         strfFormat = QStringLiteral("'W'");
0417         sqlInterval = QStringLiteral("DAY");
0418         val *= 7;
0419         one *= 7;
0420         break;
0421     case MONTH:
0422     default:
0423         // Interval is in months
0424         sqlAttribute = QStringLiteral("d_DATEMONTH");
0425         strfFormat = QStringLiteral("'M'");
0426         sqlInterval = QStringLiteral("MONTH");
0427         break;
0428     case QUARTER:
0429         // Interval is in quarter
0430         sqlAttribute = QStringLiteral("d_DATEQUARTER");
0431         strfFormat = QStringLiteral("'Q'");
0432         sqlInterval = QStringLiteral("MONTH");
0433         val *= 3;
0434         one *= 3;
0435         break;
0436     case SEMESTER:
0437         // Interval is in quarter
0438         sqlAttribute = QStringLiteral("d_DATESEMESTER");
0439         strfFormat = QStringLiteral("'S'");
0440         sqlInterval = QStringLiteral("MONTH");
0441         val *= 6;
0442         one *= 6;
0443         break;
0444     case YEAR:
0445         // Interval is in years
0446         sqlAttribute = QStringLiteral("d_DATEYEAR");
0447         strfFormat = QStringLiteral("'Y'");
0448         sqlInterval = QStringLiteral("YEAR");
0449         break;
0450     }
0451 
0452     switch (mode()) {
0453     case CURRENT:
0454         if (ui.kFuture->isChecked()) {
0455             b = QDate(2099, 12, 31);
0456         }
0457 
0458         ui.kDateBegin->setDate(a);
0459         ui.kDateEnd->setDate(b);
0460         wc = sqlAttribute % " = (SELECT period(date('now', 'localtime'), " % strfFormat % "))";
0461         if (ui.kFuture->isChecked()) {
0462             wc +=  QStringLiteral(" OR d_date > (SELECT date('now', 'localtime'))");
0463         }
0464         if (oWhereClausForPreviousData != nullptr) {
0465             *oWhereClausForPreviousData = sqlAttribute % " < (SELECT period(date('now', 'localtime'), " % strfFormat % "))";
0466         }
0467         if (oWhereClausForForecastData != nullptr) {
0468             *oWhereClausForForecastData = QStringLiteral("d_date > (SELECT date('now', 'localtime'))");
0469         }
0470         break;
0471     case PREVIOUS:
0472         ui.kDateBegin->setDate(a);
0473         ui.kDateEnd->setDate(b);
0474         wc = sqlAttribute % ">=(SELECT period(date('now', 'localtime','start of month', '-" % SKGServices::intToString(val) % ' ' % sqlInterval % "')," % strfFormat % "))";
0475         if (iForecast) {
0476             wc += " AND period(d_date, " % strfFormat % ")<=(SELECT period(date('now', 'localtime','start of month', '-" % SKGServices::intToString(one) % ' ' % sqlInterval % "')," % strfFormat % "))";    // For forecast based on scheduled transactions
0477 
0478             if (oWhereClausForPreviousData != nullptr) {
0479                 *oWhereClausForPreviousData = sqlAttribute % " < (SELECT period(date('now', 'localtime','start of month', '-" % SKGServices::intToString(val) % ' ' % sqlInterval % "')," % strfFormat % "))";
0480             }
0481             if (oWhereClausForForecastData != nullptr) {
0482                 *oWhereClausForForecastData = sqlAttribute % " > (SELECT period(date('now', 'localtime','start of month', '-" % SKGServices::intToString(one) % ' ' % sqlInterval % "')," % strfFormat % "))";
0483             }
0484         }
0485         break;
0486     case LAST:
0487         if (ui.kFuture->isChecked()) {
0488             b = QDate(2099, 12, 31);
0489         }
0490 
0491         ui.kDateBegin->setDate(a);
0492         ui.kDateEnd->setDate(b);
0493 
0494         wc = "d_date > (SELECT date('now', 'localtime','-" % SKGServices::intToString(val) % ' ' % sqlInterval % "'))";
0495         if (iForecast) {
0496             wc += QStringLiteral(" AND d_date<=(SELECT date('now', 'localtime'))");    // For forecast based on scheduled transactions
0497         }
0498 
0499         if (ui.kFuture->isChecked()) {
0500             wc += QStringLiteral(" OR d_date > (SELECT date('now', 'localtime'))");
0501         }
0502         if (oWhereClausForPreviousData != nullptr) {
0503             *oWhereClausForPreviousData = "d_date <= (SELECT date('now', 'localtime','-" % SKGServices::intToString(val) % ' ' % sqlInterval % "'))";
0504         }
0505         if (oWhereClausForForecastData != nullptr) {
0506             *oWhereClausForForecastData = QStringLiteral("d_date > (SELECT date('now', 'localtime'))");
0507         }
0508         break;
0509     case CUSTOM:
0510         // Custom Date
0511         wc = "d_date>='" % SKGServices::dateToSqlString(ui.kDateBegin->date()) % '\'';
0512         if (iForecast) {
0513             wc += "AND d_date<='" % SKGServices::dateToSqlString(ui.kDateEnd->date()) % '\'';    // For forecast based on scheduled transactions
0514         }
0515         if (oWhereClausForPreviousData != nullptr) {
0516             *oWhereClausForPreviousData = "d_date<'" % SKGServices::dateToSqlString(ui.kDateBegin->date()) % '\'';
0517         }
0518         if (oWhereClausForForecastData != nullptr) {
0519             *oWhereClausForForecastData = QStringLiteral("d_date > (SELECT date('now', 'localtime'))");
0520         }
0521         break;
0522     case TIMELINE:
0523         // Timeline
0524         ui.kDateBegin->setDate(a);
0525         ui.kDateEnd->setDate(b);
0526         wc = "d_date>='" % SKGServices::dateToSqlString(ui.kDateBegin->date()) % '\'';
0527         if (iForecast) {
0528             wc += "AND d_date<='" % SKGServices::dateToSqlString(ui.kDateEnd->date()) % '\'';    // For forecast based on scheduled transactions
0529         }
0530         if (oWhereClausForPreviousData != nullptr) {
0531             *oWhereClausForPreviousData = "d_date<'" % SKGServices::dateToSqlString(ui.kDateBegin->date()) % '\'';
0532         }
0533         if (oWhereClausForForecastData != nullptr) {
0534             *oWhereClausForForecastData = "d_date>'" % SKGServices::dateToSqlString(ui.kDateEnd->date()) % '\'';
0535         }
0536         break;
0537     default:
0538         // Take all dates
0539         a = a.addYears(-1);
0540         ui.kDateBegin->setDate(a);
0541         ui.kDateEnd->setDate(b);
0542         wc = QStringLiteral("1=1");
0543         if (oWhereClausForPreviousData != nullptr) {
0544             *oWhereClausForPreviousData = QStringLiteral("1=0");
0545         }
0546         if (oWhereClausForForecastData != nullptr) {
0547             *oWhereClausForForecastData = QStringLiteral("d_date > (SELECT date('now', 'localtime'))");
0548         }
0549         break;
0550     }
0551 
0552     wc = "((" % wc % ") OR d_date='0000') AND d_date!='0000-00-00'";
0553     if (oWhereClausForPreviousData != nullptr) {
0554         *oWhereClausForPreviousData = "((" % *oWhereClausForPreviousData % ") OR d_date='0000-00-00')";
0555     }
0556 
0557     return wc;
0558 }
0559 
0560 void SKGPeriodEdit::refresh()
0561 {
0562     int p = ui.kPeriod->currentIndex();
0563 
0564     // Check dates
0565     QDate d1 = ui.kDateBegin->date();
0566     QDate d2 = ui.kDateEnd->date();
0567     if (d1 > d2) {
0568         ui.kDateBegin->setDate(d2);
0569         ui.kDateEnd->setDate(d1);
0570     }
0571 
0572     ++m_count;
0573     if (m_count == 5) {
0574         m_modeEnable = false;
0575     }
0576 
0577     ui.kDateSelect->setEnabled(p != ALL);
0578     ui.kTimeline->setEnabled(p == TIMELINE);
0579     ui.kFuture->setEnabled(p == CURRENT || p == LAST);
0580     ui.kInterval->setEnabled(p == CURRENT || p == PREVIOUS || p == LAST || p == TIMELINE);
0581     ui.kNbIntervals->setEnabled(p == PREVIOUS || p == LAST);
0582 
0583     if (!m_modeEnable) {
0584         ui.kDateSelect->setVisible(p != ALL);
0585         ui.kTimeline->setVisible(p == TIMELINE);
0586         ui.kFuture->setVisible(p == CURRENT || p == LAST);
0587         ui.kInterval->setVisible(p == CURRENT || p == PREVIOUS || p == LAST || p == TIMELINE);
0588         ui.kNbIntervals->setVisible(p == PREVIOUS || p == LAST);
0589     }
0590 
0591     ui.kDateSelect->setEnabled(p == CUSTOM);
0592 
0593     // Needed to refresh dates
0594     getWhereClause();
0595 
0596     emit changed();
0597 }