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