js-klikvet-logic-worker 2.1.5 → 2.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/worker.mjs ADDED
@@ -0,0 +1,1353 @@
1
+ //@ts-check
2
+
3
+ const DEFAULT_SERVICE_NAME = 'klikvet'
4
+
5
+ /** @type {any} */
6
+ import assert from 'assert'
7
+ import * as logic from 'cry-klikvet-logic'
8
+ import clonedeep from 'lodash.clonedeep'
9
+ import packageJson from './package.json' assert { type: "json" }
10
+ import makeDir from 'make-dir'
11
+ import fs from 'fs'
12
+ import path from 'path'
13
+ import { Worker, Client } from 'cry-ebus2'
14
+ import { Mongo } from 'cry-db'
15
+ import { arrayToObject, dedup, Log, serialize } from 'cry-helpers'
16
+
17
+ let client = null
18
+
19
+ let log = new Log(['KLIKVET'])
20
+ let mongo = undefined
21
+
22
+ /** @typedef {import('cry-klikvet-logic').Blagovnica} Blagovnica */
23
+ /** @typedef {import('cry-klikvet-logic').Nastavitve} Nastavitve */
24
+ /** @typedef {import('cry-klikvet-logic').ZalogaDbAccessor} ZalogaDbAccessor */
25
+ /** @typedef {import('cry-klikvet-logic').Racun} Racun */
26
+
27
+ function round(num, dec = 2)
28
+ {
29
+ return Number(num.toFixed(dec))
30
+ };
31
+
32
+ /**
33
+ *
34
+ * @param {string} tenant
35
+ * @returns {Promise<Nastavitve>}
36
+ */
37
+ async function dbNastavitve(tenant) {
38
+ mongo.setDb(tenant)
39
+ return (/** @type {Nastavitve} */ (await mongo.findOne("nastavitve",{})))
40
+ }
41
+
42
+ async function dbFindById(db, collection, _id)
43
+ {
44
+ mongo.setDb(db)
45
+ return await mongo.findById(collection,_id)
46
+ }
47
+
48
+ async function dbFind(db, collection, query, opts) {
49
+ mongo.setDb(db)
50
+ return await mongo.find(collection,query, opts)
51
+ }
52
+
53
+ async function dbUpdateById(db, collection, _id, update) {
54
+ mongo.setDb(db)
55
+ return await mongo.updateOne(collection, { _id },update)
56
+ }
57
+
58
+ async function dbUpsert(db, collection, _id, update) {
59
+ mongo.setDb(db)
60
+ return await mongo.upsert(collection, { _id }, update)
61
+ }
62
+
63
+ async function posljiSmsNarocenemu(data, n, gsm) {
64
+
65
+ let res = (await client.requestPromise('sms', {
66
+ operation: 'send',
67
+ text: n.smsText,
68
+ sender: n.posiljatelj,
69
+ gsm: gsm || n.narocen.opomnikStevilka,
70
+ }, null, 2000));
71
+
72
+ let smsRes = res?.data?.res;
73
+ let sentOk = smsRes?.Packet.Body?.Item?.Content === "Message sent";
74
+ let napaka = !sentOk ? smsRes?.Packet.Body?.Item?.Content : undefined;;
75
+ let _id = smsRes?.Packet.Header?.ID;
76
+ console.dir(smsRes, { depth: 20 });
77
+
78
+ if (_id) {
79
+ mongo.setDb(data.tenant)
80
+ await mongo.upsert("smsOddaje", { _id }, {
81
+ besedilo: n.smsText,
82
+ datum: new Date(),
83
+ status: sentOk ? "oddano" : "napaka",
84
+ napaka,
85
+ nacin: data.nacin,
86
+ kdo: data.kdo,
87
+ gsm,
88
+ narocen_id: n.narocen._id,
89
+ pacient_id: n.narocen.pacient_id,
90
+ stranka_id: n.narocen.stranka_id,
91
+ zaKdaj: n.zaKdaj,
92
+ })
93
+ if (data.nacin === "samodejno") {
94
+ await mongo.upsert("naroceni", { _id: n.narocen._id },
95
+ napaka ? { smsOddaja_napaka: { _id, napaka, } } : { smsOddaja_id: _id, }
96
+ );
97
+ }
98
+ }
99
+ return smsRes;
100
+ }
101
+ async function posljiSmsNCepljenjemu(data, n, gsm) {
102
+ let res = (await client.requestPromise('sms', {
103
+ operation: 'send',
104
+ text: n.smsText,
105
+ sender: n.posiljatelj,
106
+ gsm: gsm || n.cepljenje.opomnikStevilka,
107
+ }, null, 2000));
108
+
109
+ let smsRes = res?.data?.res;
110
+ let sentOk = smsRes?.Packet.Body?.Item?.Content === "Message sent";
111
+ let napaka = !sentOk ? smsRes?.Packet.Body?.Item?.Content : undefined;;
112
+ let _id = smsRes?.Packet.Header?.ID;
113
+ console.dir(smsRes, { depth: 20 });
114
+
115
+ if (_id) {
116
+ mongo.setDb(data.tenant)
117
+ await mongo.upsert("smsOddaje", { _id }, {
118
+ besedilo: n.smsText,
119
+ datum: new Date(),
120
+ status: sentOk ? "oddano" : "napaka",
121
+ napaka,
122
+ nacin: data.nacin,
123
+ kdo: data.kdo,
124
+ gsm,
125
+ cepljenje_id: n.cepljenje._id,
126
+ pacient_id: n.pacient._id,
127
+ stranka_id: n.pacient.stranka_id,
128
+ zaKdaj: n.zaKdaj,
129
+ })
130
+ if (data.nacin === "samodejno" && !napaka) {
131
+ if (!napaka) n.pacient.cepljenja[n.cepljenje._id].smsOddaja_id = _id;
132
+ else n.pacient.cepljenja[n.cepljenje._id].smsOddaja_napaka = { napaka, _id };
133
+ await mongo.upsert("pacienti", { _id: n.pacient._id }, {
134
+ cepljenja: n.pacient.cepljenja
135
+ })
136
+ }
137
+ }
138
+ return smsRes;
139
+ }
140
+
141
+ async function razknjiziRacun(data)
142
+ {
143
+ let racun = await dbFindById(data.tenant, "racuni", data._id);
144
+ let nastavitve = await dbNastavitve(data.tenant);
145
+ mongo.setDb(data.tenant)
146
+ mongo.setAudit({ tenant: data.tenat, app: "klikvet/razknjiziRacun" })
147
+ await logic.spremeniZalogoNaPodlagiRacuna(racun, nastavitve, mongo)
148
+ await pobrisiZalogoNaDan(data.tenant, [racun.datum])
149
+ return { ok: true }
150
+ }
151
+
152
+ async function razknjiziRacune(data)
153
+ {
154
+ mongo.setDb(data.tenant)
155
+ mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacune" })
156
+
157
+ let dni = 14 * 24 * 60 * 60 * 1000; // 14 dni
158
+ let od = new Date(new Date().valueOf() - dni);
159
+ let racuni = await mongo.find("racuni", { datum: { $gte: od },razknjizen: false } , {});
160
+ let nastavitve = await dbNastavitve(data.tenant);
161
+ let datumi = []
162
+ for await (let racun of racuni) {
163
+ datumi.push(racun.datum)
164
+ await logic.spremeniZalogoNaPodlagiRacuna(racun, nastavitve, mongo)
165
+ console.log('z zamikom razknjižen račun št. ',racun.stevilka);
166
+ }
167
+ await pobrisiZalogoNaDan( data.tenant, datumi )
168
+ return { ok: true, racuni }
169
+ }
170
+
171
+ async function pobrisiZalogoNaDan(db, datumi) {
172
+ try {
173
+ if (!datumi) return;
174
+ if (!Array.isArray(datumi)) datumi = []
175
+ if (!datumi.length) return;
176
+ let od = new Date(Math.min(...datumi.map(d => d.valueOf())) - 24 * 60 * 60 * 1000);
177
+ mongo.setDb(db)
178
+ mongo.setAudit({ tenant: db, app: "klikvet/pobrisiZalogoNaDan" })
179
+
180
+ if (od.valueOf() > 0) await mongo.hardDelete("zalogaNaDan", { datum: { $gte: od } });
181
+ else console.log("pobrisiZalogoNaDan napačni datumi", datumi)
182
+ } catch (err) {
183
+ console.log("pobrisiZalogoNaDan error", err);
184
+ }
185
+ }
186
+
187
+ async function skladisceLokacije(lokacija_id, tenant) {
188
+ let vsa = await dbFind(tenant, "skladisca", { _deleted: { $exists: false }});
189
+ let moje = vsa.filter(s => s.lokacija_id.toString() === lokacija_id);
190
+ if (moje.length === 0) moje = vsa;
191
+ if (moje.length == 0) console.error("Ni skladišča za lokacijo", lokacija_id);
192
+ if (moje.length > 1) console.error("Več skladišč za lokacijo", lokacija_id);
193
+ return moje?.[0]
194
+ }
195
+
196
+ async function porabeZaDobavnice(data) {
197
+
198
+ let nastavitve = await dbNastavitve(data.tenant);
199
+ let od = new Date(new Date().valueOf() - 365 * 24 * 60 * 60 * 1000);
200
+
201
+ let nerazknijzene = await dbFind(data.tenant, "dobavnice",
202
+ { datumDokumenta: { $gte: od },
203
+ status: { $in: ["izdana","zaračunana"] }, poraba_id: { $exists: false }, _deleted: { $exists: false } },
204
+ { sort: { datumDokumenta: 1 } }
205
+ );
206
+
207
+ let artikel_ids = dedup(nerazknijzene.map(d => d.postavke.map(p => p.artikel_id?.toString())).flat());
208
+
209
+ let artikli = await dbFind(data.tenant, "artikli", {
210
+ _id: { $in: artikel_ids }
211
+ })
212
+ console.log('artikli',artikli);
213
+
214
+ let vse = 0, razknjizene = 0
215
+ let napake = []
216
+ for await (let dobavnica of nerazknijzene) {
217
+ if (!dobavnica.lokacija_id) console.error("dobavnica nima lokacije", dobavnica._id, dobavnica.stevilka)
218
+ try {
219
+ let skladisce_id = dobavnica.skladisce_id || (await skladisceLokacije(dobavnica.lokacija_id, data.tenant));
220
+ vse++
221
+ let poraba = await logic.porabaZaDobavnico({
222
+ dobavnica,
223
+ nastavitve,
224
+ skladisce_id,
225
+ lokacija_id: dobavnica.lokacija_id,
226
+ username: data.username,
227
+ artikli: arrayToObject(artikli, "_id"),
228
+ });
229
+
230
+ if (poraba) {
231
+ poraba.status = "zaključena"
232
+ let p = await dbUpsert(data.tenant, "odprteBlagovnice", poraba._id, poraba);
233
+ console.log('p',p);
234
+
235
+ await dbUpsert(data.tenant, "dobavnice", dobavnica._id, { poraba_id: p._id, poraba_sestavljena: new Date() });
236
+ }
237
+ if (poraba === null) {
238
+ await dbUpsert(data.tenant, "dobavnice", dobavnica._id, { poraba_id: null, poraba_preskocena: new Date() });
239
+ }
240
+ razknjizene++
241
+ } catch (err) {
242
+ napake.push(err)
243
+ }
244
+ }
245
+ return { ok: vse === razknjizene, vse, razknjizene, napake }
246
+ }
247
+
248
+ async function razknjiziBlagovnice(data)
249
+ {
250
+ let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
251
+
252
+ // poišči tiste, ki bi morale že biti razknjižene, pa niso
253
+ {
254
+ let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000);
255
+ let vpisane = await dbFind(data.tenant, "blagovnice", { datum: { $gte: od} }, { project: { _id: 1, status: 1 } });
256
+ let idjiVpisanih = vpisane.map(b => b._id.toString());
257
+
258
+ let zaPovrnit = await dbFind(data.tenant, "odprteBlagovnice", { _deleted: { $ne:"hack"}, status: "zaključena", datum: { $gte: od }, _id: { $nin: idjiVpisanih } }, { project: { status: 1, dokumentDobavitelja: 1, vrsta: 1 }});
259
+
260
+ for await (let b of zaPovrnit) {
261
+ console.log("vračam blagovnico v razkljižno",data.tenant,b)
262
+ await dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() });
263
+ }
264
+ }
265
+
266
+ let nerazknijzene = await dbFind(data.tenant, "odprteBlagovnice",
267
+ { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false } },
268
+ { sort: { datum: 1 } }
269
+ );
270
+ let vse = 0, razknjizene = 0
271
+ let napake = []
272
+ for await (let dobavnica of nerazknijzene) {
273
+ try {
274
+ vse++
275
+ await razknjiziBlagovnico(dobavnica._id.toString(), data.tenant)
276
+ razknjizene++
277
+ } catch (err) {
278
+ napake.push(err)
279
+ }
280
+ }
281
+ return { ok: vse === razknjizene, vse, razknjizene, napake }
282
+ }
283
+
284
+ async function razknjiziDobavnice(data) {
285
+ let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000)
286
+ let nerazknijzene = await dbFind(data.tenant, "dobavnice",
287
+ { datum: { $gte: od }, status: "izdana", razknjizena: { $exists: false } },
288
+ { sort: { datum: 1 } }
289
+ );
290
+ let vse = 0, razknjizene = 0
291
+ let napake = []
292
+ for await (let blagovnica of nerazknijzene) {
293
+ try {
294
+ vse++
295
+ await razknjiziDobavnico(blagovnica._id.toString(), data.tenant)
296
+ razknjizene++
297
+ } catch (err) {
298
+ napake.push(err)
299
+ }
300
+ }
301
+ return { ok: vse === razknjizene, vse, razknjizene, napake }
302
+ }
303
+
304
+ // async function razknjiziBlagovnico(_id, tenant)
305
+ // {
306
+ // let nastavitve = await dbNastavitve(tenant);
307
+ // mongo.setDb(tenant)
308
+ // mongo.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico/1" })
309
+
310
+ // await logic.zakljuciBlagovnico(_id, mongo);
311
+
312
+ // /** @type {Blagovnica}} */
313
+ // let blagovnica = (/** @type {Blagovnica} */ await dbFindById(tenant, "blagovnice", _id))
314
+ // if (!blagovnica) throw new Error(`ne morem razknjižiti blagovnice, ki je ni: ${_id}, tenant ${tenant}`)
315
+
316
+ // mongo.setDb(tenant)
317
+ // mongo.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico/2" })
318
+
319
+ // await logic.spremeniZalogoNaPodlagiBlagovnice(blagovnica, nastavitve, mongo);
320
+ // await pobrisiZalogoNaDan(tenant, [ blagovnica.datum ]);
321
+ // }
322
+
323
+ async function razknjiziBlagovnico(_id, tenant) {
324
+ mongo.setDb(tenant)
325
+ mongo.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" })
326
+
327
+ let blagovnica = await logic.razknjiziBlagovnico(_id, mongo);
328
+ return blagovnica
329
+ }
330
+
331
+ async function razknjiziDobavnico(_id, tenant) {
332
+ mongo.setDb(tenant)
333
+ mongo.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" })
334
+ let dobavnica = await logic.razknjiziDobavnico(_id, mongo);
335
+ return dobavnica
336
+ }
337
+
338
+ async function registerAllInvoices(data)
339
+ {
340
+ assert(data.tenant, "must specify tenant")
341
+
342
+ let err = null;
343
+ let napake = new Set()
344
+ try {
345
+
346
+ err = "Podsistem db ni dosegljiv."
347
+
348
+ mongo.setDb(data.tenant)
349
+ mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" })
350
+
351
+ let myquery = { eor: null, negotovinski: { $ne: true}, leto: { $gte: 2022 } };
352
+ let env = data.env || (await mongo.findOne("nastavitve", {})).okolje
353
+
354
+ let all = await mongo.find("racuni", myquery, { project: { _id: 1 }, limit: 1000, })
355
+ err = "Napaka pri potrjevanju računov."
356
+
357
+ let n = 0;
358
+ try {
359
+ for await (let r of all) {
360
+ let res = await registerInvoice({ tenant: data.tenant, env, _id: r._id.toString() }, true);
361
+ if (res.eor) n++;
362
+ if (res.fursError) napake.add(res.fursError)
363
+ }
364
+ } catch (e) {
365
+ err = e.message;
366
+ console.log('err',err);
367
+ throw new Error()
368
+ }
369
+
370
+ return { nall: all.length, nok: n, napake: [...napake] };
371
+
372
+ } catch {
373
+ console.error('registerAllInvoices', err);
374
+ throw new Error(err);
375
+ }
376
+ }
377
+
378
+ async function registerCert(db,davcnaStevilka)
379
+ {
380
+ let cert = (await client.requestPromise('db', {
381
+ operation: 'findOne',
382
+ db,
383
+ collection: "certifikati",
384
+ query: { davcnaStevilka }
385
+ }, null, 2000)).data;
386
+
387
+ let res = (await client.requestPromise('durs', { operation: 'add cert', data: { cert: cert.certBase64, password: cert.certPass } }, null, 2000)).data;
388
+ console.log('res',res);
389
+ }
390
+
391
+ async function registerInvoice(data, kasneje=false)
392
+ {
393
+ mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerInvoice"})
394
+
395
+ assert(data._id, "must specify _id of racun")
396
+ assert(["error","production","test"].includes(data.env), "must specify env")
397
+ assert(data.tenant, "must specify tenant")
398
+
399
+ let timeoutError = "";
400
+ try {
401
+ // poišči račun
402
+ timeoutError = "Db podsistem se ni odzval."
403
+ let racun = await dbFindById(data.tenant,"racuni",data._id)
404
+ if (racun.negotovinski) return "negotovinski račun ne bo fiskaliziran";
405
+
406
+ let blagajna = await dbFindById(data.tenant, "blagajne", racun.blagajna_id)
407
+ if (!blagajna) throw new Error("cannot locate blagajna: "+racun.blagajna_id)
408
+ let poslovalnica = await dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id)
409
+ if (!blagajna) throw new Error("cannot locate poslovalnica: "+racun.blagajna_id)
410
+ let veterina = await dbFindById(data.tenant, "nastavitve", poslovalnica.veterina_id)
411
+ if (!veterina) throw new Error("cannot locate poslovalnica: " + poslovalnica.veterina_id)
412
+ if (!racun.izdalDs) throw new Error("Uporabnik verjetno nima vpisane davčne številke.")
413
+
414
+ // če gre za popravek računa, poveži izvorni račun na ta popravek
415
+ if (racun.predhodniRacun && racun.predhodniRacun._id) {
416
+ dbUpdateById(data.tenant, "racuni", racun.predhodniRacun._id.toString(), {
417
+ naslednjiRacun: {
418
+ _id: data._id.toString(),
419
+ datum: racun.datum,
420
+ stevilka: racun.stevilka,
421
+ }
422
+ })
423
+ }
424
+
425
+ let TaxNumber = (veterina.dsCertifikata || veterina.davcnaStevilka)
426
+ TaxNumber = parseInt(TaxNumber.toString().match(/\d+/));
427
+
428
+ let Invoice = {
429
+ TaxNumber,
430
+ IssueDateTime: new Date(racun.datum),
431
+ NumberingStructure: "B",
432
+ InvoiceIdentifier: {
433
+ BusinessPremiseID: poslovalnica.koda,
434
+ ElectronicDeviceID: blagajna.nazivZaIzpis,
435
+ InvoiceNumber: racun.stRacuna.toString(),
436
+ },
437
+ InvoiceAmount: round(racun.mpc),
438
+ PaymentAmount: round(racun.mpc),
439
+ TaxesPerSeller: [{
440
+ VAT: racun.davki.map(d => {
441
+ return {
442
+ TaxRate: round(d.dst * 100),
443
+ TaxableAmount: round(d.osnova),
444
+ TaxAmount: round(d.davek),
445
+ }
446
+ })
447
+ }],
448
+ OperatorTaxNumber: Number(racun.izdalDs),
449
+ //ProtectedID: null,
450
+ SubsequentSubmit: kasneje,
451
+ // ReferenceInvoice: [{
452
+ // ReferenceInvoiceIdentifier: {
453
+ // BusinessPremiseID: "36CF",
454
+ // ElectronicDeviceID: "BLAG2",
455
+ // InvoiceNumber: "144"
456
+ // },
457
+ // ReferenceInvoiceIssueDateTime: new Date()
458
+ // }],
459
+ };
460
+ if (racun.predhodniRacun) {
461
+ let s = racun.predhodniRacun.stevilka.split("-");
462
+ Invoice.ReferenceInvoice = [{
463
+ ReferenceInvoiceIdentifier: {
464
+ BusinessPremiseID: s[2],
465
+ ElectronicDeviceID: s[1],
466
+ InvoiceNumber: s[0],
467
+ },
468
+ ReferenceInvoiceIssueDateTime: racun.predhodniRacun.datum,
469
+ }];
470
+ }
471
+ let DursEnv = veterina.okolje;
472
+ if (DursEnv !== data.env) throw new Error(`data.env (${data.env}) !== veterina.okolje (${veterina.okolje})`);
473
+
474
+ // console.dir(Invoice, {depth:10});
475
+
476
+ // davčno potrdi račun
477
+ let furs={}, napaka=""
478
+ try {
479
+
480
+ timeoutError = "FURS podsistem se ni odzval."
481
+
482
+ furs = (await client.requestPromise('durs', {
483
+ operation: 'register invoice',
484
+ data: { Invoice, DursEnv, tenant: data.tenant }
485
+ }, null, 4000)).data?.Durs;
486
+
487
+ try {
488
+ console.log(data.tenant, Invoice.TaxNumber, `${Invoice?.InvoiceIdentifier?.BusinessPremiseID}-${Invoice?.InvoiceIdentifier?.ElectronicDeviceID}-${Invoice?.InvoiceIdentifier?.InvoiceNumber}`, Invoice.InvoiceAmount, furs.EOR);
489
+ } catch (err) {
490
+ console.error(`err logging furs response`);
491
+ }
492
+
493
+ if (furs?.error && furs.error.match(/no such file/g)) {
494
+ console.warn("no certificate, register it");
495
+ // register cert
496
+ timeoutError = "Samodejna registracija digitalnega potrdila furs spodletela."
497
+
498
+ await registerCert(data.tenant, Invoice.TaxNumber);
499
+ // re-submit invoice
500
+ furs = (await client.requestPromise('durs', {
501
+ operation: 'register invoice',
502
+ data: { Invoice, DursEnv, tenant: data.tenant }
503
+ }, null, 4000)).data.Durs;
504
+ }
505
+ if (furs?.error && furs.error.match(/SSL alert number 40/gi)) {
506
+ console.warn("certifikat potekel");
507
+ timeoutError = "Je digitalno potrdilo FURS pretečeno?"
508
+ throw new Error(furs.error)
509
+ }
510
+ if (furs?.error && furs.error.match(/no such file/g)) {
511
+ console.warn("no certificate, register it");
512
+ // register cert
513
+ timeoutError = "Samodejna registracija digitalnega potrdila furs spodletela."
514
+
515
+ await registerCert(data.tenant, Invoice.TaxNumber);
516
+ // re-submit invoice
517
+ furs = (await client.requestPromise('durs', {
518
+ operation: 'register invoice',
519
+ data: { Invoice, DursEnv, tenant: data.tenant }
520
+ }, null, 4000)).data.Durs;
521
+ }
522
+
523
+ } catch (err) {
524
+ console.error("Err calling durs register.invoice", err)
525
+ napaka = `${timeoutError} (${err&&err.data&&err.data.message})`
526
+ }
527
+
528
+ napaka = napaka || furs?.error;
529
+ if (!napaka && (!furs?.EOR || !furs?.ZOI)) napaka = "furs sistem ni vrnil EOR ali ZOI"
530
+ let fursObj = napaka ? {
531
+ zoi: furs?.ZOI,
532
+ eor: furs?.EOR,
533
+ qr: furs?.QR,
534
+ fursError: `furs/račun: ${napaka}`,
535
+ davcnoSpodletloPrvic: racun.davcnoSpodletloPrvic || new Date(),
536
+ davcnoSpodletloZadnjic: new Date(),
537
+ davcnoSpodletloPoskusov: (racun.davcnoSpodletloPoskusov||0)+1
538
+ } : {
539
+ zoi: furs.ZOI,
540
+ eor: furs.EOR,
541
+ qr: furs.QR,
542
+ davcnoPotrjeno: new Date(),
543
+ }
544
+
545
+ // posodobi račun
546
+ timeoutError = "Napaka pri vpisu davčno potrjenega računa: Db podsistem se ne odziva več."
547
+ let updated = await dbUpdateById(data.tenant, "racuni", data._id, fursObj);
548
+
549
+ try {
550
+ let dir = path.join('./racuni', new Date().getFullYear().toString(), data.tenant)
551
+ !fs.existsSync(dir) && makeDir.sync(dir);
552
+ fs.writeFileSync(path.join(dir, racun.stevilka), serialize.pack(clonedeep({ ...racun, ...updated}), false));
553
+ } catch (err) {
554
+ console.log("napaka pri zapisu izdanega računa na disk",err)
555
+ }
556
+
557
+ return updated;
558
+
559
+ } catch (err) {
560
+
561
+ return {
562
+ fursError: `furs/račun: ${err.message||err}`,
563
+ }
564
+ }
565
+ };
566
+
567
+ /**
568
+ * Stornira račun" tako, da kreira nov odprtRacun z negativnimi postavkami.
569
+ * @param {string} db
570
+ * @param {string} id
571
+ */
572
+ async function storno(db,id)
573
+ {
574
+ // poglej, če morda storno že poteka
575
+
576
+ mongo.setDb(db)
577
+ mongo.setAudit({ tenant: db, app: "klikvet/storno/1" })
578
+
579
+ let obstojeci = await mongo.findOne("odprtiRacuni", { "predhodniRacun._id": id })
580
+
581
+ // (await client.requestPromise('db', {
582
+ // operation: 'findOne',
583
+ // db,
584
+ // collection: 'odprtiRacuni',
585
+ // query: { "predhodniRacun._id": id }
586
+ // }, null, 2000)).data;
587
+
588
+ if (obstojeci) return obstojeci;
589
+
590
+ let racun = clonedeep(await dbFindById(db, "racuni", id) );
591
+
592
+ if (!racun) throw new Error(`storno: ni računa ${id}`)
593
+
594
+
595
+ // povezi racuna
596
+ racun.predhodniRacun = {
597
+ _id: racun._id,
598
+ stevilka: racun.stevilka,
599
+ datum: racun.datum
600
+ };
601
+
602
+ // ustvari negativne postavke
603
+ racun.postavke.forEach(postavka => {
604
+ ['kolicina', 'tpop', 'tnbc', 'tdav', 'tprc', 'tmpc'].forEach(f => {
605
+ postavka[f] = -postavka[f]
606
+ })
607
+ });
608
+
609
+ // ustvari negativne vsote
610
+ ['mpc', 'prc', 'dav', 'pop', 'nbc'].forEach(f => {
611
+ racun[f] = -racun[f]
612
+ });
613
+ // zbrisi polja, ki jih ne sme biti na novem računu
614
+
615
+ // odstrani polja, ki so odvec
616
+
617
+ [ "zapSt", "stRacuna", "pripis", "izdal", "opis", "zoi", "eor", "stKopij", "stevilka",
618
+ "idIzdanegaRacuna", "valuta", "izdalDs", "razknjizen", "statusIzdaje",
619
+ "odprt", "odprtIz", "naprava_id", "izPredracuna_id", "izPredracuna_st",
620
+ "izDobavnice_id", "izDobavnice_st", "datum", "zbirnik",
621
+ "opomba", "fursError", "davcnoPotrjeno", "davcnoSpodletloPrvic",
622
+ "davcnoSpodletloZadnjic", "davcnoSpodletloPoskusov", "stKopij", "datumiKopij",
623
+ "navodiloStranki", "kontrola", "vCrpDatum", "vCrpKdo", "vCrp",
624
+
625
+ ].forEach(f => {
626
+ delete racun[f]
627
+ });
628
+
629
+ racun.datum = new Date();
630
+ // tole nastavi GUI
631
+ racun.placila = []
632
+ racun.davki = []
633
+
634
+ delete racun._id;
635
+
636
+ mongo.setDb(db)
637
+ mongo.setAudit({ tenant: db, app: "klikvet/storno/2" })
638
+
639
+ let odprtiRacun = await mongo.insert("odprtiRacuni",racun)
640
+
641
+ // (await client.requestPromise('db', {
642
+ // operation: 'insert',
643
+ // db,
644
+ // collection: "odprtiRacuni",
645
+ // insert: racun,
646
+ // }, null, 2000)).data;
647
+
648
+ return odprtiRacun;
649
+ };
650
+
651
+
652
+ export class KlikvetLogicWorker extends Worker {
653
+
654
+ constructor({ veterine, gsm }, opts) {
655
+ super(DEFAULT_SERVICE_NAME, opts)
656
+ assert(veterine.length)
657
+ client = new Client({ clientChecksBrokerWithHeartbeat: false });
658
+ this.veterine = veterine;
659
+ this.gsm = gsm;
660
+ console.log('this.gsm',this.gsm);
661
+
662
+ }
663
+
664
+ /**
665
+ * @param {import("cry-db").Types.PublishSpec} what
666
+ */
667
+ async publishMsg(what) {
668
+ try {
669
+ await super.publish(what.channel, what.payload)
670
+ } catch (err) {
671
+ console.log('publish failed, continue working',err.message);
672
+
673
+ }
674
+ }
675
+
676
+ async resetMongo() {
677
+ if (mongo) await mongo.close()
678
+ mongo = new Mongo(null)
679
+ mongo.useSoftDelete(true)
680
+ mongo.useRevisions(true)
681
+ mongo.useAuditing(true)
682
+ mongo.emitPublishEvents(true)
683
+ mongo.on('publish', this.publishMsg.bind(this))
684
+ }
685
+
686
+ async closeMongo() {
687
+ if (mongo) await mongo.close()
688
+ mongo = undefined;
689
+ }
690
+
691
+ async onError(err, req, opts) {
692
+ console.error("klikvet logic error: follow err, req, opts");
693
+ console.dir(err, { depth: 10 });
694
+ console.dir(req, { depth: 10 });
695
+ console.dir(opts, { depth: 10 });
696
+ }
697
+
698
+ async process(data) {
699
+ let ret
700
+ try {
701
+ await this.resetMongo()
702
+ ret = await this.processLogic(data);
703
+ } catch (err) {
704
+ console.log('klikvet/process error',err);
705
+ throw err
706
+ }
707
+
708
+ await this.closeMongo()
709
+
710
+ return ret;
711
+ }
712
+
713
+ async processLogic(data) {
714
+
715
+ console.log(data.tenant,data.operation);
716
+
717
+ log.debug(`klikvet worker request of type ${typeof data}`,data)
718
+
719
+ if (data === 'ping') {
720
+ return 'pong';
721
+ }
722
+
723
+ if (data === 'ver') {
724
+ return packageJson.version
725
+ }
726
+
727
+ if (data.operation === 'ping') {
728
+ return { ping: 'pong' }
729
+ }
730
+
731
+ if (data.operation === 'help') {
732
+ return {
733
+ 'promet': 'run aggregation for promet',
734
+ }
735
+ }
736
+ assert(data.operation, 'must specify operation')
737
+
738
+ if (data.operation === 'promet-get-config') {
739
+ return logic.promet;
740
+ }
741
+
742
+ if (data.operation === 'promet-create-pipeline') {
743
+ assert(data.spec, 'must specify data.spec')
744
+ return logic.promet.createAggregationPipeline(data.spec)
745
+ }
746
+
747
+ if (data.operation === 'racuni-isci-create-pipeline') {
748
+ assert(data.spec, 'must specify data.spec')
749
+ return logic.racuni.isci.createAggregationPipeline(data.spec)
750
+ }
751
+
752
+
753
+ assert(data.tenant, 'must specify tenant')
754
+
755
+ if (data.operation === 'promet-exec-pipeline') {
756
+ assert(data.pipeline || data.spec, 'must specify data.spec or data.pipeline')
757
+ if (!data.pipeline) data.pipeline = await logic.promet.createAggregationPipeline(data.spec)
758
+ let res = await logic.promet.execPipeline(data.pipeline.pipeline || data.pipeline, data.tenant)
759
+ // res.pipeline = data.pipeline;
760
+ return res;
761
+ }
762
+
763
+ if (data.operation === 'racuni-isci-exec-pipeline') {
764
+ assert(data.pipeline || data.spec, 'must specify data.spec or data.pipeline')
765
+ if (!data.pipeline) data.pipeline = await logic.racuni.isci.createAggregationPipeline(data.spec)
766
+ let res = await logic.racuni.isci.execPipeline(data.tenant, data.pipeline.pipeline || data.pipeline)
767
+ //res.pipeline = data.pipeline;
768
+ return res;
769
+ }
770
+
771
+ if (data.operation === 'porocilo-racunovodji') {
772
+ assert(data.tenant, 'must tenant')
773
+ assert(data.odDne, 'must odDne')
774
+ assert(data.doDne, 'must doDne')
775
+
776
+ let pipeline = logic.racunovodji.createAggregationPipeline(data)
777
+ let podatki = await logic.racunovodji.execPipeline(pipeline.pipeline, data.tenant)
778
+ let prviZadnji = await logic.racunovodji.getFirstLastBills(data.tenant, pipeline.match)
779
+ let kategorije = await logic.racunovodji.getCategories(data.tenant, pipeline.match)
780
+ let racuniPravnim = data.racuniPravnim ? await logic.racunovodji.getTaxBills(data.tenant, pipeline.match) : []
781
+ let racuniOdlozeno = data.racuniOdlozeno ? await logic.racunovodji.getTrrBills(data.tenant, pipeline.match) : []
782
+ let stornirani = await logic.zakljucekBlagajne.storniraniRacuni(pipeline.match, data.tenant)
783
+ let placila = await logic.zakljucekBlagajne.sestevekPlacil(data.tenant, data)
784
+ let pred = await logic.zalogaNaDan({ datum: new Date(new Date(data.odDne).valueOf()-24*60*60*1000), tenant:data.tenant})
785
+ let po = await logic.zalogaNaDan({ datum: new Date(data.doDne), tenant: data.tenant })
786
+ let predKonsignacija = await logic.zalogaNaDan({ datum: new Date(new Date(data.odDne).valueOf() - 24 * 60 * 60 * 1000), tenant: data.tenant, samoKonsignacija: true })
787
+ let poKonsignacija = await logic.zalogaNaDan({ datum: new Date(data.doDne), tenant: data.tenant, samoKonsignacija: true })
788
+ let spremembaZaloge = await logic.spremembaZalogeZaObdobje({ ...data, poVrstah: true })
789
+ let spremembaKonsignacije = await logic.spremembaZalogeZaObdobje({ ...data, poVrstah: true, samoKonsignacija: true })
790
+ let vsotaDobav = await logic.VsotaDobavZaObdobje({ ...data })
791
+
792
+ return { podatki, racuniOdlozeno, racuniPravnim, kategorije, stornirani, placila, zaloga: { pred, po }, konsignacija: { pred: predKonsignacija, po: poKonsignacija }, spremembaZaloge, spremembaKonsignacije, vsotaDobav, prviZadnji };
793
+ }
794
+
795
+ if (data.operation === 'zakljucek-blagajne') {
796
+ let pipeline = logic.zakljucekBlagajne.createAggregationPipeline(data)
797
+ let zakljucek = await logic.zakljucekBlagajne.execPipeline(pipeline.pipeline, data.tenant)
798
+ let stornirani = await logic.zakljucekBlagajne.storniraniRacuni(pipeline.match, data.tenant)
799
+ return { zakljucek, stornirani };
800
+ }
801
+
802
+ if (data.operation === 'moj-promet') {
803
+ assert(data.username, 'must specify username')
804
+ assert(data.odDne, 'must specify odDne')
805
+ assert(data.doDne, 'must specify doDne')
806
+
807
+ let pipeline = logic.mojPromet.createAggregationPipeline(data)
808
+ let podatki = await logic.mojPromet.execPipeline(pipeline.pipeline, data.tenant)
809
+ return podatki;
810
+ }
811
+
812
+ if (data.operation === 'prodano') {
813
+ assert(data.tenant, 'must specify tenant')
814
+ assert(data.odDne, 'must specify odDne')
815
+ assert(data.doDne, 'must specify doDne')
816
+
817
+ let pipeline = logic.prodano.createAggregationPipeline(data)
818
+ let podatki = await logic.prodano.execPipeline(pipeline.pipeline, data.tenant)
819
+ return podatki;
820
+ }
821
+
822
+ if (data.operation === 'prodano-porabljeno') {
823
+ assert(data.tenant, 'must specify tenant')
824
+ let podatki = await logic.prodanoInPorabljeno(data)
825
+ return podatki;
826
+ }
827
+
828
+ if (data.operation === 'skupine-izdelkov') {
829
+ let res = await dbFind(data.tenant, "skupineArtiklov", {}, { sort: { skupina:1 }})
830
+ return res;
831
+ }
832
+
833
+ if (data.operation === 'skupine-strank') {
834
+ let res = await dbFind(data.tenant, "skupineStrank", {}, { sort: { skupina: 1 } })
835
+ return res;
836
+ }
837
+
838
+ if (data.operation === 'stranka-info') {
839
+ let res = await logic.stranke.infoStranke(data.tenant, data._id || data)
840
+ return res;
841
+ }
842
+
843
+ if (data.operation === 'get-certs') {
844
+ let res = await logic.certs.getAll(data.tenant)
845
+ return res;
846
+ }
847
+
848
+ if (data.operation === 'get-certs-valid') {
849
+ let res = await logic.certs.getValid(data.tenant, data.query)
850
+ return res;
851
+ }
852
+
853
+ if (data.operation === 'furs-register-cert') {
854
+ assert(data.certBase64, "must specify certBase64")
855
+ assert(data.certPass, "must specify certPass")
856
+ let timeoutError = ""
857
+
858
+ try {
859
+ timeoutError = "furs/cert: FURS podsistem se ni odzval."
860
+ let res = (await client.requestPromise('durs', { operation: 'add cert', data: { cert: data.certBase64, password: data.certPass } }, null, 2000)).data;
861
+ log.debug('furs-reg-cert: durs add cert returned“', res);
862
+
863
+ timeoutError = "furs/cert: spodletelo je pisanje v bazo."
864
+
865
+ await client.requestPromise('db', {
866
+ operation: 'hardDeleteOne',
867
+ collection: 'certifikati',
868
+ db: data.tenant,
869
+ query: { serijskaStevilka: res.certSerial }
870
+ });
871
+
872
+ let cert = (await client.requestPromise('db', {
873
+ operation: 'upsert',
874
+ collection: 'certifikati',
875
+ db: data.tenant,
876
+ query: { serijskaStevilka: res.certSerial },
877
+ update: {
878
+ certOk: true,
879
+ davcnaStevilka: res.certTaxNo,
880
+ podjetje: res.certName,
881
+ serijskaStevilka: res.certSerial,
882
+ veljaDo: res.certValidUntil,
883
+ izdajatelj: res.certIssuer,
884
+ certBase64: data.certBase64,
885
+ certPass: data.certPass,
886
+ }
887
+ }, null, 2000)).data;
888
+ log.debug('furs-reg-cert: cert saved to db', cert);
889
+
890
+ if (!cert) return {
891
+ certMessage: "Pisanje v bazo je spodletelo. Ponovno dodajte potrdilo.",
892
+ certOk: false,
893
+ }
894
+
895
+ let ret = {
896
+ certOk: true,
897
+ certMessage: "digitalno potrdilo sprejeto",
898
+ cert,
899
+ tenant: data.tenant,
900
+ };
901
+
902
+ log.info("furs-reg-cert returns", ret)
903
+
904
+ return ret;
905
+
906
+ } catch (err) {
907
+
908
+ // console.log('err',err);
909
+
910
+ if (err.reason === "reject" && err.data.message && /Invalid password/gi.test(err.data.message)) {
911
+ return {
912
+ certMessage: "Napačno geslo.",
913
+ certOk: false,
914
+ }
915
+ } else if (err.reason === "timeout") {
916
+ return {
917
+ certMessage: timeoutError,
918
+ certOk: false,
919
+ }
920
+ } else {
921
+ log.error("furs-reg-cert", err.message)
922
+ return {
923
+ certMessage: "furs/cert: " + (err.reason),
924
+ certOk: false,
925
+ }
926
+ }
927
+ }
928
+
929
+ }
930
+
931
+ if (data.operation === 'furs-remove-cert') {
932
+
933
+
934
+ assert(data.certId, "must specify certId")
935
+ assert(data.taxNo, "must specify taxNo")
936
+
937
+ log.debug('removing cert', data);
938
+
939
+ let result = await client.requestPromise('durs',
940
+ { operation: 'remove cert', data: { taxNo: data.taxNo, } }, null, 500);
941
+
942
+ log.trace('cert removed', result);
943
+
944
+ return {
945
+ ok: true,
946
+ result: result.data
947
+ };
948
+
949
+ }
950
+
951
+ if (data.operation === "furs-register-premise") {
952
+
953
+ assert(data.poslovniProstor, "must specify poslovniProstor (its _id)")
954
+ assert(data.Premise, "must specify Premise")
955
+ assert(data.DursEnv, "must specify DursEnv")
956
+ assert(data.tenant, "must specify tenant")
957
+ assert(data.taxNo, "must specify taxNo")
958
+ let timeoutError = ""
959
+
960
+ try {
961
+ timeoutError = "furs/pp: FURS podsistem se ni odzval."
962
+ let res = (await client.requestPromise('durs', {
963
+ operation: 'register premise',
964
+ data: { Premise: data.Premise, DursEnv: data.DursEnv, tenant: data.tenant, }
965
+ }, null, 2000)).data;
966
+ log.debug('furs-register-premise: durs register premise returned', res);
967
+
968
+ if (res.success === false && /ENOENT\: no such file or directory/.test(res.error)) {
969
+ // no cert, try to register it
970
+ let certData = (await client.requestPromise('db', {
971
+ operation: 'findOne',
972
+ collection: 'certifikati',
973
+ db: data.tenant,
974
+ query: { davcnaStevilka: Number(data.taxNo) }
975
+ })).data;
976
+ if (!certData) return {
977
+ success: false,
978
+ message: `Digitalno potrdilo za ${data.taxNo} ni registrirano niti ga ni v bazi.`
979
+ }
980
+ let certRes = (await client.requestPromise('durs', { operation: 'add cert', data: { cert: certData.certBase64, password: certData.certPass } }, null, 2000)).data;
981
+ log.trace("... certRes", certRes)
982
+ if (!certRes || !certRes.certSerial) return {
983
+ success: false,
984
+ message: `Ponovna namestitev digitalnega potrdila ${data.taxNo} je spodletela.`
985
+ }
986
+
987
+ res = (await client.requestPromise('durs', {
988
+ operation: 'register premise',
989
+ data: { Premise: data.Premise, DursEnv: data.DursEnv }
990
+ }, null, 2000)).data;
991
+ log.debug('furs-register-premise: durs register premise RETRY returned', res);
992
+ }
993
+
994
+ if (!res.success) return res;
995
+
996
+ timeoutError = "furs/pp: spodletelo je pisanje v bazo."
997
+
998
+ let dbres = (await client.requestPromise('db', {
999
+ operation: 'upsert',
1000
+ collection: 'poslovalnice',
1001
+ db: data.tenant,
1002
+ query: { _id: data.poslovniProstor },
1003
+ update: {
1004
+ potrditevFurs: JSON.stringify(res.result)
1005
+ }
1006
+ }, null, 2000)).data;
1007
+ log.debug('furs-register-premise: premise saved to db', dbres);
1008
+
1009
+ if (!dbres) return {
1010
+ message: "Pisanje v bazo je spodletelo. Ponovno prijavite poslovni prostor.",
1011
+ success: false,
1012
+ }
1013
+
1014
+ let ret = {
1015
+ success: true,
1016
+ message: "poslovni prostor je prijavljen FURS",
1017
+ poslovalnica: dbres
1018
+ };
1019
+
1020
+ log.info("furs-registger-premise returns", ret)
1021
+
1022
+ return ret;
1023
+
1024
+ } catch (err) {
1025
+
1026
+ // console.log('err', err);
1027
+
1028
+ if (err.reason === "reject" && err.data.message && /Invalid password/gi.test(err.data.message)) {
1029
+ return {
1030
+ message: "Napačno geslo.",
1031
+ success: false,
1032
+ }
1033
+ } else if (err.reason === "timeout") {
1034
+ return {
1035
+ message: timeoutError,
1036
+ success: false,
1037
+ }
1038
+ } else {
1039
+ log.error("furs-register-premise", err.message)
1040
+ return {
1041
+ message: "furs/pp: " + (err.message || err.data && err.data.message),
1042
+ success: false,
1043
+ }
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ if (data.operation === "furs-register-invoice") {
1049
+ let res = await registerInvoice(data);
1050
+ setTimeout( async () => {
1051
+ await this.resetMongo();
1052
+ await registerAllInvoices(data);
1053
+ await razknjiziRacune(data);
1054
+ await this.closeMongo();
1055
+ },2000);
1056
+ return res
1057
+ };
1058
+
1059
+ if (data.operation === "furs-register-all-invoices") {
1060
+ let all = await registerAllInvoices(data);
1061
+ setTimeout(async () => {
1062
+ await this.resetMongo();
1063
+ await razknjiziRacune(data);
1064
+ await this.closeMongo();
1065
+ },4000)
1066
+ return all
1067
+ };
1068
+
1069
+ if (data.operation === "racun-storno") {
1070
+ assert(data.tenant, "must specify tenant")
1071
+ assert(data, "must specify data")
1072
+ assert(data._id, "must specify _id of the invoice")
1073
+ return await storno(data.tenant, data.id || data._id)
1074
+ };
1075
+
1076
+ if (data.operation === "razknjizi-racun") {
1077
+ assert(data.tenant, "must specify tenant")
1078
+ assert(data._id, "must specify _id of the invoice")
1079
+ return await razknjiziRacun(data);
1080
+ };
1081
+
1082
+ if (data.operation === "razknjizi-racune") {
1083
+ assert(data.tenant, "must specify tenant")
1084
+ return await razknjiziRacune(data);
1085
+ };
1086
+
1087
+ if (data.operation === "razknjizi-blagovnice") {
1088
+ assert(data.tenant, "must specify tenant")
1089
+ return await razknjiziBlagovnice(data);
1090
+ };
1091
+
1092
+ if (data.operation === "porabe-za-dobavnice") {
1093
+ assert(data.tenant, "must specify tenant")
1094
+ let ret = await porabeZaDobavnice(data);
1095
+ await razknjiziBlagovnice(data);
1096
+ return ret;
1097
+ };
1098
+
1099
+ if (data.operation === "razknjizi-dobavnico") {
1100
+ assert(data._id, "must specify _id of Dobavnica")
1101
+ assert(data.tenant, "must specify tenant")
1102
+ await razknjiziDobavnico(data._id, data.tenant)
1103
+
1104
+ setImmediate(async () => {
1105
+ await this.resetMongo();
1106
+ await razknjiziDobavnice(data);
1107
+ await this.closeMongo();
1108
+ });
1109
+
1110
+ return { ok: true }
1111
+ };
1112
+
1113
+ if (data.operation === "razknjizi-blagovnico") {
1114
+ assert(data._id, "must specify _id of the Blagovnica")
1115
+ assert(data.tenant, "must specify tenant")
1116
+ await razknjiziBlagovnico(data._id, data.tenant)
1117
+
1118
+ setImmediate(async () => {
1119
+ await this.resetMongo();
1120
+ await razknjiziBlagovnice(data);
1121
+ await this.closeMongo();
1122
+ });
1123
+
1124
+ return { ok: true }
1125
+ };
1126
+
1127
+ if (data.operation === "kartica") {
1128
+ assert(data.tenant, "must specify tenant")
1129
+ assert(data._id, "must specify _id of Artikel")
1130
+ assert(data.razknjizba, "must specify razknjizba")
1131
+
1132
+ return await logic.karticaArtikla(data._id, data.tenant, data.razknjizba, data.skladisca_ids)
1133
+ };
1134
+
1135
+ if (data.operation === "blagovnice") {
1136
+ assert(data.tenant, "must specify tenant")
1137
+ return await logic.poisciBlagovnice(data)
1138
+ };
1139
+
1140
+ if (data.operation === "dobava-zdravil") {
1141
+ assert(data.tenant, "must specify tenant")
1142
+ return await logic.dobavaZdravil(data)
1143
+ };
1144
+
1145
+ if (data.operation === "poraba-prodaja-zdravil") {
1146
+ assert(data.tenant, "must specify tenant")
1147
+ return await logic.porabaInProdajaZdravil(data)
1148
+ };
1149
+
1150
+ if (data.operation === "prodaja-zdravil") {
1151
+ assert(data.tenant, "must specify tenant")
1152
+ return await logic.prodajaZdravil(data)
1153
+ };
1154
+
1155
+ if (data.operation === "ensure-indexes") {
1156
+ assert(data.tenant, "must specify tenant")
1157
+ return await logic.ensureIndexes(data.tenant)
1158
+ };
1159
+
1160
+ if (data.operation === "zaloga-na-dan") {
1161
+ assert(data.tenant, "must specify tenant")
1162
+ console.log('data',data);
1163
+
1164
+ return await logic.zalogaNaDan(data)
1165
+ };
1166
+
1167
+ if (data.operation === "zaloga-po-dnevih") {
1168
+ assert(data.tenant, "must specify tenant")
1169
+ return await logic.zalogaPoDnevih(data)
1170
+ };
1171
+
1172
+ if (data.operation === "neuporabljeno-poisci") {
1173
+ assert(data.tenant, "must specify tenant")
1174
+ assert(data.od, "must specify od")
1175
+ return await logic.poisciNeuporabljeno(data)
1176
+ };
1177
+
1178
+ if (data.operation === "neuporabljeno-pobrisi") {
1179
+ assert(data.tenant, "must specify tenant")
1180
+ assert(data.od, "must specify od")
1181
+ return await logic.pobrisiNeuporabljeno(data)
1182
+ };
1183
+
1184
+ if (data.operation === "sprememba-zaloge-za-obdobje") {
1185
+ assert(data.tenant, "must specify tenant")
1186
+ assert(data.odDne, "must specify odDne")
1187
+ assert(data.doDne, "must specify doDne")
1188
+ return await logic.spremembaZalogeZaObdobje(data)
1189
+ };
1190
+
1191
+ if (data.operation === "polna-inventura") {
1192
+ assert(data.tenant, "must specify tenant")
1193
+ assert(data.od, "must specify od")
1194
+ assert(data.razknjizba, "must specify razknjizba")
1195
+ assert(data.skladisce_id, "must specify skladisce_id")
1196
+ assert(data.izvedel, "must specify izvedel")
1197
+ assert(data.izlociTisteBrezZaloge, "must specify izlociTisteBrezZaloge")
1198
+ return await logic.zakljucekPolneInventureSestaviInZapisi(data);
1199
+ };
1200
+
1201
+ if (data.operation === "moj-koledar") {
1202
+ assert(data.tenant, "must specify tenant")
1203
+ assert(data.id, "must specify id")
1204
+ return await logic.koledarVeterinarja(data.tenant,data.id);
1205
+ };
1206
+
1207
+ if (data.operation === "sms-narocen") {
1208
+ assert(data.tenant, "must specify tenant")
1209
+ assert(data.id, "must specify id")
1210
+ return await logic.smsNarocen({ tenant: data.tenant, id: data.id });
1211
+ };
1212
+
1213
+ if (data.operation === "poslji-sms-narocenemu") {
1214
+ assert(data.tenant, "must specify tenant")
1215
+ assert(data.id || data.narocen, "must specify id or narocen")
1216
+ assert(data.nacin, "must specify nacin")
1217
+ let n = await logic.smsNarocen({ tenant: data.tenant, id: data.id, narocen: data.narocen });
1218
+ if (!n) return undefined;
1219
+ return await posljiSmsNarocenemu(data, n, this.gsm);
1220
+ };
1221
+
1222
+ if (data.operation === "poslji-smse-narocenim") {
1223
+ assert(data.tenant, "must specify tenant")
1224
+ assert(data.nacin, "must specify nacin")
1225
+ let naroceni = await logic.smsNaroceniNaDan({ tenant: data.tenant, dan: data.dan || new Date() });;
1226
+ if (!naroceni?.length) return undefined;
1227
+ let res = []
1228
+ for await (let n of naroceni) {
1229
+ try {
1230
+ res.push(await posljiSmsNarocenemu(data, n, this.gsm));
1231
+ } catch (e) {
1232
+ console.error("poslji-smse-narocenim resuming",e);
1233
+ }
1234
+ }
1235
+ return res;
1236
+ };
1237
+
1238
+ if (data.operation === "poslji-sms-cepljenja") {
1239
+ assert(data.tenant, "must specify tenant")
1240
+ assert(data.cepljenje_id || data.cepljenje, "must specify cepljenje_id or cepljenje")
1241
+ assert(data.pacient_id, "must specify pacient_id")
1242
+ assert(data.nacin, "must specify nacin")
1243
+ let n = await logic.smsCepljen({ tenant: data.tenant, cepljenje_id: data.cepljenje_id, pacient_id: data.pacient_id, cepljenje: data.cepljenje });
1244
+ if (!n) return undefined;
1245
+ return await posljiSmsNCepljenjemu(data, n, this.gsm);
1246
+ };
1247
+
1248
+ if (data.operation === "poslji-smse-cepljenim") {
1249
+ assert(data.tenant, "must specify tenant")
1250
+ assert(data.nacin, "must specify nacin")
1251
+ let cepiti = await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date(), dniPrej: data.dniPrej });;
1252
+ if (!cepiti?.length) return undefined;
1253
+ let res = []
1254
+ for await (let n of cepiti) {
1255
+ try {
1256
+ res.push(await posljiSmsNCepljenjemu(data, n, this.gsm));
1257
+ } catch (e) {
1258
+ console.error("poslji-smse-narocenim resuming", e);
1259
+ }
1260
+ }
1261
+ return res;
1262
+ };
1263
+
1264
+ if (data.operation === "seznam-cepljenj-za-sms") {
1265
+ assert(data.tenant, "must specify tenant")
1266
+ return await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date(), dniPrej: data.dniPrej });;
1267
+ };
1268
+
1269
+
1270
+ if (data.operation === "seznam-narocenih-za-sms") {
1271
+ assert(data.tenant, "must specify tenant")
1272
+ return await logic.smsNaroceniNaDan({ tenant: data.tenant, dan: data.dan || new Date() });;
1273
+ };
1274
+
1275
+ if (data.operation === "potrditev-brejosti") {
1276
+ assert(data.tenant, "must specify tenant")
1277
+ assert(data._id, "must specify _id")
1278
+ assert(data.kdo, "must specify kdo")
1279
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1280
+ if (osemenitevGoveda) {
1281
+ let update = logic.updatePotrditevBrejosti(osemenitevGoveda, data.breja, data.kdo);
1282
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1283
+ }
1284
+ return undefined
1285
+ }
1286
+
1287
+ if (data.operation === "v-presusitev") {
1288
+ assert(data.tenant, "must specify tenant")
1289
+ assert(data._id, "must specify _id")
1290
+ assert(data.kdo, "must specify kdo")
1291
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1292
+ if (osemenitevGoveda) {
1293
+ let update = logic.updatePresusitve(osemenitevGoveda, data.presusitev, data.kdo);
1294
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1295
+ }
1296
+ return undefined
1297
+ }
1298
+
1299
+ if (data.operation === "status-osemenitve") {
1300
+ assert(data.tenant, "must specify tenant")
1301
+ assert(data._id, "must specify _id")
1302
+ assert(data.kdo, "must specify kdo")
1303
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1304
+ if (osemenitevGoveda) {
1305
+ let update = logic.updateStatusOsemenitve(osemenitevGoveda, data.status, data.kdo);
1306
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1307
+ }
1308
+ return undefined
1309
+ }
1310
+
1311
+ if (data.operation === "opomba-rejca-osemenitve") {
1312
+ assert(data.tenant, "must specify tenant")
1313
+ assert(data._id, "must specify _id")
1314
+ assert(data.kdo, "must specify kdo")
1315
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1316
+ if (osemenitevGoveda) {
1317
+ let update = logic.updateOpombeRejca(osemenitevGoveda, data.opomba, data.kdo);
1318
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1319
+ }
1320
+ return undefined
1321
+ }
1322
+
1323
+ if (data.operation === "podatki-rejca") {
1324
+ assert(data.tenant, "must specify tenant")
1325
+ assert(data.rejciGeslo, "must specify rejciGeslo")
1326
+ assert(data.rejciKoda, "must specify rejciKoda")
1327
+ return await logic.podatkiRejca(data);
1328
+ };
1329
+
1330
+ if (data.operation === "zaracunaj-dobavnice") {
1331
+ assert(data.tenant, "must specify tenant")
1332
+ assert(data.dobavnice_ids, "must specify dobavnice_ids");
1333
+ assert(data.lokacija_id, "must specify lokacija_id");
1334
+ assert(data.naprava_id, "must specify naprava_id");
1335
+ assert(data.izdal, "must specify izdal");
1336
+ return await logic.zaracunajDobavnice(data);
1337
+ };
1338
+
1339
+ if (data.operation === "anonimiziraj-podatke") {
1340
+ assert(data.tenant, "must specify tenant")
1341
+ assert(["demo", "demo2","dev","test"].includes(data.tenant), "cnly valid for demo, dev, test");
1342
+ assert(data.letNazaj, "must specify letNazaj");
1343
+
1344
+ return await logic.anonimizirajPodatke(logic.createMongoForAnonimizacija(data.tenant), parseInt(data.letNazaj.toString()||"1"));
1345
+ };
1346
+
1347
+ assert(false, 'unsupported operation ' + data.operation)
1348
+ }
1349
+
1350
+ }
1351
+
1352
+
1353
+