js-klikvet-logic-worker 2.3.19 → 2.3.21

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