1 /***************************************************************************
2  * SPDX-FileCopyrightText: 2021 S. MANKOWSKI stephane@mankowski.fr
3  * SPDX-FileCopyrightText: 2021 G. DE BURE support@mankowski.fr
4  * SPDX-License-Identifier: GPL-3.0-or-later
5  ***************************************************************************/
6 /** @file
7  * The grantlee's filter to get items of a document table.
8  *
9  * @author Stephane MANKOWSKI
10  */
11 #include "skgdocumentfilter.h"
12 
13 #include <grantlee/util.h>
14 
15 #include "skgdocument.h"
16 #include "skgmainpanel.h"
17 #include "skgtraces.h"
18 #include "skgreport.h"
19 
20 #include <QMetaProperty>
21 
22 #include <KFormat>
23 
fixSQL(SKGReport * report,const QString & iSql)24 QString fixSQL(SKGReport* report, const QString& iSql)
25 {
26     auto sql = iSql;
27     sql = sql.replace(QStringLiteral("##PERIOD##"), SKGServices::getPeriodWhereClause(report->getPeriod()));
28     sql = sql.replace(QStringLiteral("##<PERIOD##"), SKGServices::getPeriodWhereClause(report->getPeriod(), QStringLiteral("d_date"), QStringLiteral("<")));
29     sql = sql.replace(QStringLiteral("##>PERIOD##"), SKGServices::getPeriodWhereClause(report->getPeriod(), QStringLiteral("d_date"), QStringLiteral(">")));
30     sql = sql.replace(QStringLiteral("##<=PERIOD##"), SKGServices::getPeriodWhereClause(report->getPeriod(), QStringLiteral("d_date"), QStringLiteral("<=")));
31     sql = sql.replace(QStringLiteral("##>=PERIOD##"), SKGServices::getPeriodWhereClause(report->getPeriod(), QStringLiteral("d_date"), QStringLiteral(">=")));
32 
33     sql = sql.replace(QStringLiteral("##PREVIOUS_PERIOD##"), SKGServices::getPeriodWhereClause(report->getPreviousPeriod()));
34     sql = sql.replace(QStringLiteral("##<PREVIOUS_PERIOD##"), SKGServices::getPeriodWhereClause(report->getPreviousPeriod(), QStringLiteral("d_date"), QStringLiteral("<")));
35     sql = sql.replace(QStringLiteral("##>PREVIOUS_PERIOD##"), SKGServices::getPeriodWhereClause(report->getPreviousPeriod(), QStringLiteral("d_date"), QStringLiteral(">")));
36     sql = sql.replace(QStringLiteral("##<=PREVIOUS_PERIOD##"), SKGServices::getPeriodWhereClause(report->getPreviousPeriod(), QStringLiteral("d_date"), QStringLiteral("<=")));
37     sql = sql.replace(QStringLiteral("##>=PREVIOUS_PERIOD##"), SKGServices::getPeriodWhereClause(report->getPreviousPeriod(), QStringLiteral("d_date"), QStringLiteral(">=")));
38     return sql;
39 }
40 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const41 QVariant SKGDocumentTableFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
42 {
43     Q_UNUSED(autoescape)
44     SKGReport* report = nullptr;
45     auto* doc = qobject_cast< SKGDocument* >(input.value<QObject*>());
46     if (doc == nullptr) {
47         report = qobject_cast< SKGReport* >(input.value<QObject*>());
48         doc = report->getDocument();
49     }
50     if ((doc != nullptr) && argument.isValid()) {
51         SKGObjectBase::SKGListSKGObjectBase objects;
52         QString table = Grantlee::getSafeString(argument);
53         QString wc;
54         int pos = table.indexOf(QStringLiteral(","));
55         if (pos != -1) {
56             if(table.at(table.count()-1)==QStringLiteral(",")) {
57                 table = table.left(table.count()-1);
58             } else {
59                 wc = table.right(table.count() - pos - 1);
60                 table = table.left(pos);
61            }
62         }
63         if (report != nullptr) {
64             table = fixSQL(report, table);
65             wc = fixSQL(report, wc);
66         }
67 
68         doc->getObjects(table, wc, objects);
69         return QVariant::fromValue(objects);
70     }
71 
72     return QVariant();
73 }
74 
isSafe() const75 bool SKGDocumentTableFilter::isSafe() const
76 {
77     return true;
78 }
79 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const80 QVariant SKGDocumentQueryFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
81 {
82     Q_UNUSED(autoescape)
83     SKGReport* report = nullptr;
84     auto* doc = qobject_cast< SKGDocument* >(input.value<QObject*>());
85     if (doc == nullptr) {
86         report = qobject_cast< SKGReport* >(input.value<QObject*>());
87         doc = report->getDocument();
88     }
89     if ((doc != nullptr) && argument.isValid()) {
90         QString sql = Grantlee::getSafeString(argument);
91         if (report != nullptr) {
92             sql = fixSQL(report, sql);
93         }
94         SKGStringListList result;
95         doc->executeSelectSqliteOrder(sql, result);
96         return QVariant::fromValue(result);
97     }
98 
99     return QVariant();
100 }
101 
isSafe() const102 bool SKGDocumentQueryFilter::isSafe() const
103 {
104     return true;
105 }
106 
107 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const108 QVariant SKGDocumentDisplayFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
109 {
110     Q_UNUSED(autoescape)
111     auto* doc = qobject_cast< SKGDocument* >(input.value<QObject*>());
112     if (doc != nullptr) {
113         return doc->getDisplay(Grantlee::getSafeString(argument));
114     }
115 
116     return QVariant();
117 }
118 
isSafe() const119 bool SKGDocumentDisplayFilter::isSafe() const
120 {
121     return true;
122 }
123 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const124 QVariant SKGPercentFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
125 {
126     Q_UNUSED(autoescape)
127     Q_UNUSED(argument)
128     SKGMainPanel* mainPanel = SKGMainPanel::getMainPanel();
129     SKGDocument* doc = nullptr;
130     if (mainPanel != nullptr) {
131         doc = mainPanel->getDocument();
132     }
133     if (doc != nullptr) {
134         QString s = Grantlee::getSafeString(input);
135         return QVariant(doc->formatPercentage(SKGServices::stringToDouble(s)));
136     }
137     return QVariant();
138 }
139 
isSafe() const140 bool SKGPercentFilter::isSafe() const
141 {
142     return true;
143 }
144 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const145 QVariant SKGFileSizeFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
146 {
147     Q_UNUSED(autoescape)
148     Q_UNUSED(argument)
149 
150     auto size = SKGServices::stringToInt(Grantlee::getSafeString(input));
151     return QVariant(KFormat().formatByteSize(size));
152 }
153 
isSafe() const154 bool SKGFileSizeFilter::isSafe() const
155 {
156     return true;
157 }
158 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const159 QVariant SKGDumpFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
160 {
161     Q_UNUSED(autoescape)
162     Q_UNUSED(argument)
163 
164     if (input.isValid()) {
165         auto* obj = input.value<QObject*>();
166         if (obj != nullptr) {
167             const QMetaObject* metaObject = obj->metaObject();
168             QString table = QStringLiteral("<table class=\"table table-striped table-condensed \">");
169             int nb = metaObject->propertyCount();
170             for (int i = 0; i < nb; ++i) {
171                 QVariant val = SKGDumpFilter::doFilter(obj->property(metaObject->property(i).name()), QVariant(), autoescape);
172                 table += QStringLiteral("<tr><td>") % metaObject->property(i).name() % "</td><td>" % val.toString() % "</td></tr>";
173             }
174             table += QStringLiteral("</table>");
175             return QVariant(table);
176         }
177         if (input.canConvert<SKGObjectBase>()) {
178             SKGObjectBase objectBase = input.value<SKGObjectBase>();
179             SKGQStringQStringMap att = objectBase.getAttributes();
180             QStringList keys = att.keys();
181             QString table = QStringLiteral("<table class=\"table table-striped table-condensed \">");
182             int nb = keys.count();
183             for (int i = 0; i < nb; ++i) {
184                 table += QStringLiteral("<tr><td>") % keys.at(i) % "</td><td>" % att[keys.at(i)] % "</td></tr>";
185             }
186             table += QStringLiteral("</table>");
187             return QVariant(table);
188         }
189         if (input.canConvert(QVariant::List)) {
190             QVariantList l = input.toList();
191             int nb = l.count();
192             QString table = QStringLiteral("<table class=\"table table-striped table-condensed \">");
193             for (int i = 0; i < nb; ++i) {
194                 QVariant val = SKGDumpFilter::doFilter(l.at(i), QVariant(), autoescape);
195                 table += QStringLiteral("<tr><td>") % SKGServices::intToString(i) % "</td><td>" % val.toString() % "</td></tr>";
196             }
197             table += QStringLiteral("</table>");
198             return QVariant(table);
199         }
200         if (input.canConvert<SKGObjectBase::SKGListSKGObjectBase>()) {
201             SKGObjectBase::SKGListSKGObjectBase l = input.value<SKGObjectBase::SKGListSKGObjectBase>();
202             int nb = l.count();
203             QString table;
204             if (nb != 0) {
205                 table = QStringLiteral("<table class=\"table table-striped table-condensed \"><tr><th>#</th>");
206                 for (int i = 0; i < nb; ++i) {
207                     const SKGObjectBase& objectBase = l.at(i);
208                     SKGQStringQStringMap att = objectBase.getAttributes();
209                     QStringList keys = att.keys();
210                     QString line = QStringLiteral("<tr><td>") % SKGServices::intToString(i) % "</td>";
211                     int nbc = keys.count();
212                     for (int j = 0; j < nbc; ++j) {
213                         if (i == 0) {
214                             table += QStringLiteral("<th>") % keys.at(j) % "</th>";
215                         }
216                         line += QStringLiteral("<td>") % att[keys.at(j)] % "</td>";
217                     }
218                     if (i == 0) {
219                         table += QStringLiteral("</tr>");
220                     }
221                     line += QStringLiteral("</tr>");
222 
223                     table += line;
224                 }
225                 table += QStringLiteral("</table>");
226             }
227             return QVariant(table);
228         }
229         return QVariant(input.toString());
230     }
231 
232     return QVariant();
233 }
234 
isSafe() const235 bool SKGDumpFilter::isSafe() const
236 {
237     return true;
238 }
239 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const240 QVariant SKGMoneyFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
241 {
242     Q_UNUSED(autoescape)
243     QString arg = Grantlee::getSafeString(argument);
244     SKGMainPanel* mainPanel = SKGMainPanel::getMainPanel();
245     SKGDocument* doc = nullptr;
246     if (mainPanel != nullptr) {
247         doc = mainPanel->getDocument();
248     }
249     if (doc != nullptr) {
250         QStringList args = SKGServices::splitCSVLine(arg);
251         SKGServices::SKGUnitInfo unit = doc->getUnit(args.contains(QStringLiteral("2")) ? QStringLiteral("secondary") : QStringLiteral("primary"));
252         if (args.contains(QStringLiteral("nodecimal"))) {
253             unit.NbDecimal = 0;
254         }
255         return QVariant(doc->formatMoney(SKGServices::stringToDouble(Grantlee::getSafeString(input)), unit, !args.contains(QStringLiteral("nocolor"))));
256     }
257     return QVariant();
258 }
259 
isSafe() const260 bool SKGMoneyFilter::isSafe() const
261 {
262     return true;
263 }
264 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const265 QVariant SKGUrlEncodeFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
266 {
267     Q_UNUSED(autoescape)
268     Q_UNUSED(argument)
269     return QVariant(SKGServices::encodeForUrl(Grantlee::getSafeString(input)));
270 }
271 
isSafe() const272 bool SKGUrlEncodeFilter::isSafe() const
273 {
274     return true;
275 }
276 
doFilter(const QVariant & input,const QVariant & argument,bool autoescape) const277 QVariant SKGReplaceFilter::doFilter(const QVariant& input, const QVariant& argument, bool autoescape) const
278 {
279     Q_UNUSED(autoescape)
280     QString arg = Grantlee::getSafeString(argument);
281     QStringList args = SKGServices::splitCSVLine(arg, QLatin1Char(';'), false);
282     QString output = Grantlee::getSafeString(input);
283     if (args.count() == 2) {
284         output = output.replace(args.at(0), args.at(1));
285     }
286     return QVariant(output);
287 }
288 
isSafe() const289 bool SKGReplaceFilter::isSafe() const
290 {
291     return true;
292 }
293