js-klikvet-logic-worker 2.3.29 → 2.3.31

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/dist/worker.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  import assert from 'assert';
2
2
  import clonedeep from 'lodash.clonedeep';
3
- import makeDir from 'make-dir';
4
3
  import fs from 'fs';
5
4
  import path from 'path';
5
+ import { makeDirectorySync } from 'make-dir';
6
6
  import { Worker, Client } from 'cry-ebus2';
7
7
  import { Mongo } from 'cry-db';
8
8
  import { Log, serialize, sleep } from 'cry-helpers';
9
- import { VsotaDobavZaObdobje, anonimizirajPodatke, certs, createMongoForAnonimizacija, dobavaZdravil, ensureIndexes, karticaArtikla, koledarVeterinarja, mojPromet, pobrisiNeuporabljeno, podatkiRejca, poisciBlagovnice, poisciNeuporabljeno, porabaInProdajaZdravil, prodajaZdravil, prodano, prodanoInPorabljeno, promet, racuni, racunovodji, razknjiziBlagovnico, razknjiziDobavnico, smsCepljen, smsCepljenjaNaDan, smsNarocen, smsNaroceniNaDan, spremembaZalogeZaObdobje, spremeniZalogoNaPodlagiRacuna, stranke, updateOpombeRejca, updatePotrditevBrejosti, updatePresusitve, updateStatusOsemenitve, zakljucekBlagajne, zakljucekPolneInventureSestaviInZapisi, zalogaNaDan, zalogaPoDnevih, zaracunajDobavnice, zdruziStranke, zdruziPaciente, zapisiPoraboZaObravnavo, zapisiPorabeZaObravnave, zapisiPorabeZaDobavnice, } from 'cry-klikvet-logic';
9
+ import { VsotaDobavZaObdobje, anonimizirajPodatke, certs, createMongoForAnonimizacija, dobavaZdravil, ensureIndexes, karticaArtikla, koledarVeterinarja, mojPromet, pobrisiNeuporabljeno, podatkiRejca, poisciBlagovnice, poisciNeuporabljeno, porabaInProdajaZdravil, prodajaZdravil, prodano, prodanoInPorabljeno, promet, racuni, racunovodji, razknjiziBlagovnico, razknjiziDobavnico, smsCepljen, smsCepljenjaNaDan, smsNarocen, smsNaroceniNaDan, spremembaZalogeZaObdobje, spremeniZalogoNaPodlagiRacuna, stranke, updateOpombeRejca, updatePotrditevBrejosti, updatePresusitve, updateStatusOsemenitve, zakljucekBlagajne, zakljucekPolneInventureSestaviInZapisi, zalogaNaDan, zalogaPoDnevih, zaracunajDobavnice, zdruziStranke, zdruziPaciente, zapisiPoraboZaObravnavo, zapisiPorabeZaObravnave, zapisiPorabeZaDobavnice, pmzUpdateAllForYear } from 'cry-klikvet-logic';
10
10
  const DEFAULT_SERVICE_NAME = 'klikvet';
11
11
  let log = new Log(['KLIKVET']);
12
12
  function round(num, dec = 2) {
@@ -30,12 +30,12 @@ export class KlikvetLogicWorker extends Worker {
30
30
  }
31
31
  async porabaZaObravnavo(mongo, data) {
32
32
  console.log('porabaZaObravnavo', data);
33
- let nastavitve = await this.dbNastavitve(data.tenant);
34
- let obravnava = await this.dbFindById(data.tenant, "obravnave", data.id);
33
+ let nastavitve = await this.dbNastavitve(data.tenant, mongo);
34
+ let obravnava = await this.dbFindById(data.tenant, "obravnave", data.id, mongo);
35
35
  if (!obravnava)
36
36
  throw new Error("porabaZaObravnavo: ni obravnave " + (data === null || data === void 0 ? void 0 : data.id));
37
37
  let artikel_ids = obravnava.koraki.map(k => (k.postavke || []).map(p => p.artikel_id)).flat(2).filter(a => !!a);
38
- let artikli = await this.dbFind(data.tenant, "artikli", { _id: { $in: artikel_ids } });
38
+ let artikli = await this.dbFind(data.tenant, "artikli", { _id: { $in: artikel_ids } }, {}, mongo);
39
39
  let poraba = await zapisiPoraboZaObravnavo({ tenant: data.tenant, mongo, obravnava, nastavitve, username: data.username, artikli });
40
40
  console.log('poraba', poraba);
41
41
  return poraba;
@@ -53,15 +53,36 @@ export class KlikvetLogicWorker extends Worker {
53
53
  console.log('publish failed, continue working', err.message);
54
54
  }
55
55
  }
56
+ configureMongoInstance(mongo) {
57
+ mongo.useSoftDelete(true);
58
+ mongo.useRevisions(true);
59
+ mongo.useAuditing(true);
60
+ mongo.emitPublishEvents(true);
61
+ mongo.on('publish', this.publishMsg.bind(this));
62
+ return mongo;
63
+ }
64
+ async withNewMongo(fn) {
65
+ const mongo = this.configureMongoInstance(new Mongo());
66
+ try {
67
+ return await fn(mongo);
68
+ }
69
+ catch (err) {
70
+ console.error('withNewMongo error', err);
71
+ throw err;
72
+ }
73
+ finally {
74
+ try {
75
+ await mongo.close();
76
+ }
77
+ catch (closeErr) {
78
+ console.error('withNewMongo close error', closeErr);
79
+ }
80
+ }
81
+ }
56
82
  async resetMongo() {
57
83
  if (this.mongo)
58
84
  await this.mongo.close();
59
- this.mongo = new Mongo();
60
- this.mongo.useSoftDelete(true);
61
- this.mongo.useRevisions(true);
62
- this.mongo.useAuditing(true);
63
- this.mongo.emitPublishEvents(true);
64
- this.mongo.on('publish', this.publishMsg.bind(this));
85
+ this.mongo = this.configureMongoInstance(new Mongo());
65
86
  }
66
87
  async closeMongo() {
67
88
  if (this.mongo)
@@ -88,7 +109,7 @@ export class KlikvetLogicWorker extends Worker {
88
109
  return ret;
89
110
  }
90
111
  async processLogic(data) {
91
- var _a, _b, _c;
112
+ var _a, _b, _c, _d;
92
113
  log.debug(`klikvet worker request of type ${typeof data}`, data);
93
114
  // console.log('data', data);
94
115
  if (data === 'ping') {
@@ -136,9 +157,9 @@ export class KlikvetLogicWorker extends Worker {
136
157
  return res;
137
158
  }
138
159
  if (data.operation === 'porocilo-racunovodji') {
139
- assert(data.tenant, 'must tenant');
140
- assert(data.odDne, 'must odDne');
141
- assert(data.doDne, 'must doDne');
160
+ assert(data.tenant, 'porocilo-racunovodji must tenant');
161
+ assert(data.odDne, 'porocilo-racunovodji must odDne');
162
+ assert(data.doDne, 'porocilo-racunovodji must doDne');
142
163
  let pipeline = await racunovodji.createAggregationPipeline(data);
143
164
  let podatki = await racunovodji.execPipeline(pipeline.pipeline, data.tenant);
144
165
  let prviZadnji = await racunovodji.getFirstLastBills(data.tenant, pipeline.match);
@@ -172,26 +193,34 @@ export class KlikvetLogicWorker extends Worker {
172
193
  if (data.TRRRacuni) {
173
194
  ret.TRRRacuni = await zakljucekBlagajne.TRRRacuni(pipeline.match, data.tenant);
174
195
  }
196
+ if (data.racuniPravnim) {
197
+ ret.racuniPravnim = await racunovodji.getTaxBills(data.tenant, pipeline.match);
198
+ }
199
+ return ret;
200
+ }
201
+ if (data.operation === 'gotovinski-racuni') {
202
+ let pipeline = zakljucekBlagajne.createAggregationPipeline(data);
203
+ let ret = await racunovodji.getCashBills(data.tenant, pipeline.match);
175
204
  return ret;
176
205
  }
177
206
  if (data.operation === 'moj-promet') {
178
- assert(data.username, 'must specify username');
179
- assert(data.odDne, 'must specify odDne');
180
- assert(data.doDne, 'must specify doDne');
207
+ assert(data.username, 'moj-promet must specify username');
208
+ assert(data.odDne, 'moj-promet must specify odDne');
209
+ assert(data.doDne, 'moj-promet must specify doDne');
181
210
  let pipeline = mojPromet.createAggregationPipeline(data);
182
211
  let podatki = await mojPromet.execPipeline(pipeline.pipeline, data.tenant);
183
212
  return podatki;
184
213
  }
185
214
  if (data.operation === 'prodano') {
186
- assert(data.tenant, 'must specify tenant');
187
- assert(data.odDne, 'must specify odDne');
188
- assert(data.doDne, 'must specify doDne');
215
+ assert(data.tenant, 'prodano must specify tenant');
216
+ assert(data.odDne, 'prodano must specify odDne');
217
+ assert(data.doDne, 'prodano must specify doDne');
189
218
  let pipeline = prodano.createAggregationPipeline(data);
190
219
  let podatki = await prodano.execPipeline(pipeline.pipeline, data.tenant);
191
220
  return podatki;
192
221
  }
193
222
  if (data.operation === 'prodano-porabljeno') {
194
- assert(data.tenant, 'must specify tenant');
223
+ assert(data.tenant, 'prodano-porabljeno must specify tenant');
195
224
  let podatki = await prodanoInPorabljeno(data);
196
225
  return podatki;
197
226
  }
@@ -397,10 +426,15 @@ export class KlikvetLogicWorker extends Worker {
397
426
  if (data.operation === "furs-register-invoice") {
398
427
  let res = await this.registerInvoice(data);
399
428
  setTimeout(async () => {
400
- await this.resetMongo();
401
- await this.registerAllInvoices(data);
402
- await this.razknjiziRacune(data);
403
- await this.closeMongo();
429
+ try {
430
+ await this.withNewMongo(async (mongo) => {
431
+ await this.registerAllInvoices(data, mongo);
432
+ await this.razknjiziRacune(data, mongo);
433
+ });
434
+ }
435
+ catch (err) {
436
+ console.error('delayed registerAllInvoices failed', err);
437
+ }
404
438
  }, 2000);
405
439
  return res;
406
440
  }
@@ -408,9 +442,14 @@ export class KlikvetLogicWorker extends Worker {
408
442
  if (data.operation === "furs-register-all-invoices") {
409
443
  let all = await this.registerAllInvoices(data);
410
444
  setTimeout(async () => {
411
- await this.resetMongo();
412
- await this.razknjiziRacune(data);
413
- await this.closeMongo();
445
+ try {
446
+ await this.withNewMongo(async (mongo) => {
447
+ await this.razknjiziRacune(data, mongo);
448
+ });
449
+ }
450
+ catch (err) {
451
+ console.error('delayed razknjiziRacune failed', err);
452
+ }
414
453
  }, 4000);
415
454
  return all;
416
455
  }
@@ -465,9 +504,14 @@ export class KlikvetLogicWorker extends Worker {
465
504
  assert(data.tenant, "must specify tenant");
466
505
  await this.razknjiziDobavnico(data._id, data.tenant);
467
506
  setImmediate(async () => {
468
- await this.resetMongo();
469
- await this.razknjiziDobavnice(data);
470
- await this.closeMongo();
507
+ try {
508
+ await this.withNewMongo(async (mongo) => {
509
+ await this.razknjiziDobavnice(data, mongo);
510
+ });
511
+ }
512
+ catch (err) {
513
+ console.error('delayed razknjiziDobavnice failed', err);
514
+ }
471
515
  });
472
516
  return { ok: true };
473
517
  }
@@ -477,9 +521,14 @@ export class KlikvetLogicWorker extends Worker {
477
521
  assert(data.tenant, "must specify tenant");
478
522
  await this.razknjiziBlagovnico(data._id, data.tenant);
479
523
  setImmediate(async () => {
480
- await this.resetMongo();
481
- await this.razknjiziBlagovnice(data);
482
- await this.closeMongo();
524
+ try {
525
+ await this.withNewMongo(async (mongo) => {
526
+ await this.razknjiziBlagovnice(data, mongo);
527
+ });
528
+ }
529
+ catch (err) {
530
+ console.error('delayed razknjiziBlagovnice failed', err);
531
+ }
483
532
  });
484
533
  return { ok: true };
485
534
  }
@@ -736,31 +785,41 @@ export class KlikvetLogicWorker extends Worker {
736
785
  if (data.operation === "pmz-update") {
737
786
  assert(data.tenant, "must specify tenant");
738
787
  assert(data.year, "must specify year");
739
- return { status: "PMZ update", year: data.year };
788
+ return await pmzUpdateAllForYear({ tenant: data.tenant, year: parseInt((_d = data.year) === null || _d === void 0 ? void 0 : _d.toString()), writeToDb: true });
740
789
  }
741
790
  ;
742
791
  assert(false, 'unsupported operation ' + data.operation);
743
792
  }
744
793
  /** PRIVATE */
745
- async dbNastavitve(tenant) {
746
- this.mongo.setDb(tenant);
747
- return (await this.mongo.findOne("nastavitve", {}));
794
+ async dbNastavitve(tenant, mongo) {
795
+ const db = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
796
+ assert(db, 'missing Mongo instance');
797
+ db.setDb(tenant);
798
+ return (await db.findOne("nastavitve", {}));
748
799
  }
749
- async dbFindById(db, collection, _id) {
750
- this.mongo.setDb(db);
751
- return await this.mongo.findById(collection, _id);
800
+ async dbFindById(db, collection, _id, mongo) {
801
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
802
+ assert(m, 'missing Mongo instance');
803
+ m.setDb(db);
804
+ return await m.findById(collection, _id);
752
805
  }
753
- async dbFind(db, collection, query, opts) {
754
- this.mongo.setDb(db);
755
- return await this.mongo.find(collection, query, opts);
806
+ async dbFind(db, collection, query, opts = {}, mongo) {
807
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
808
+ assert(m, 'missing Mongo instance');
809
+ m.setDb(db);
810
+ return await m.find(collection, query, opts);
756
811
  }
757
- async dbUpdateById(db, collection, _id, update) {
758
- this.mongo.setDb(db);
759
- return await this.mongo.updateOne(collection, { _id }, update);
812
+ async dbUpdateById(db, collection, _id, update, mongo) {
813
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
814
+ assert(m, 'missing Mongo instance');
815
+ m.setDb(db);
816
+ return await m.updateOne(collection, { _id }, update);
760
817
  }
761
- async dbUpsert(db, collection, _id, update) {
762
- this.mongo.setDb(db);
763
- return await this.mongo.upsert(collection, { _id }, update);
818
+ async dbUpsert(db, collection, _id, update, mongo) {
819
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
820
+ assert(m, 'missing Mongo instance');
821
+ m.setDb(db);
822
+ return await m.upsert(collection, { _id }, update);
764
823
  }
765
824
  async posljiSmsNarocenemu(data, n, gsm) {
766
825
  var _a, _b, _c, _d, _e, _f;
@@ -859,14 +918,15 @@ export class KlikvetLogicWorker extends Worker {
859
918
  this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacun" });
860
919
  await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo);
861
920
  await this.pobrisiZalogoNaDan(data.tenant, [racun.datum]);
862
- this.razknjizujem = false;
863
921
  return { ok: true };
864
922
  }
865
923
  catch (err) {
866
924
  console.error("razknjiziRacun", data.tenant, (err === null || err === void 0 ? void 0 : err.message) || err);
867
- this.razknjizujem = false;
868
925
  return { ok: false, error: (err === null || err === void 0 ? void 0 : err.message) || err };
869
926
  }
927
+ finally {
928
+ this.razknjizujem = false;
929
+ }
870
930
  }
871
931
  async zdruziStranke(data) {
872
932
  this.mongo.setDb(data.tenant);
@@ -878,30 +938,31 @@ export class KlikvetLogicWorker extends Worker {
878
938
  this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/zdruziPaciente" });
879
939
  return await zdruziPaciente(data.iz, data.v, this.mongo);
880
940
  }
881
- async razknjiziRacune(data) {
941
+ async razknjiziRacune(data, mongo) {
882
942
  console.log('razkljižni račune');
883
943
  if (this.razknjizujem)
884
944
  return { ok: false, error: "worker že razknjižuje" };
885
945
  this.razknjizujem = true;
886
946
  try {
887
- this.mongo.setDb(data.tenant);
888
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacune" });
947
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
948
+ assert(m, 'missing Mongo instance');
949
+ m.setDb(data.tenant);
950
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacune" });
889
951
  let dni = 6 * 30 * 24 * 60 * 60 * 1000; // 180 dni
890
- console.log('dni', dni);
891
952
  let od = new Date(new Date().valueOf() - dni);
892
- let racuni = await this.mongo.find("racuni", {
953
+ let racuni = await m.find("racuni", {
893
954
  datum: { $gte: od },
894
- razknjizen: { $not: { $type: "date" } },
955
+ razknjizen: { $exists: false },
895
956
  razknjizbaPreskocena: { $exists: false },
896
957
  }, {});
897
- let nastavitve = await this.dbNastavitve(data.tenant);
958
+ let nastavitve = await this.dbNastavitve(data.tenant, m);
898
959
  let datumi = [];
899
960
  for await (let racun of racuni || []) {
900
961
  datumi.push(racun.datum);
901
- await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo);
962
+ await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, m);
902
963
  console.log('z zamikom razknjižen račun št. ', racun.stevilka);
903
964
  }
904
- await this.pobrisiZalogoNaDan(data.tenant, datumi);
965
+ await this.pobrisiZalogoNaDan(data.tenant, datumi, m);
905
966
  this.razknjizujem = false;
906
967
  return { ok: true, racuni };
907
968
  }
@@ -911,7 +972,7 @@ export class KlikvetLogicWorker extends Worker {
911
972
  return { ok: false, error: (err === null || err === void 0 ? void 0 : err.message) || err, racuni: [] };
912
973
  }
913
974
  }
914
- async pobrisiZalogoNaDan(db, datumi) {
975
+ async pobrisiZalogoNaDan(db, datumi, mongo) {
915
976
  try {
916
977
  if (!datumi)
917
978
  return;
@@ -920,10 +981,12 @@ export class KlikvetLogicWorker extends Worker {
920
981
  if (!datumi.length)
921
982
  return;
922
983
  let od = new Date(Math.min(...datumi.map(d => d.valueOf())) - 24 * 60 * 60 * 1000);
923
- this.mongo.setDb(db);
924
- this.mongo.setAudit({ tenant: db, app: "klikvet/pobrisiZalogoNaDan" });
984
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
985
+ assert(m, 'missing Mongo instance');
986
+ m.setDb(db);
987
+ m.setAudit({ tenant: db, app: "klikvet/pobrisiZalogoNaDan" });
925
988
  if (od.valueOf() > 0)
926
- await this.mongo.hardDelete("zalogaNaDan", { datum: { $gte: od } });
989
+ await m.hardDelete("zalogaNaDan", { datum: { $gte: od } });
927
990
  else
928
991
  console.log("pobrisiZalogoNaDan napačni datumi", datumi);
929
992
  }
@@ -950,59 +1013,75 @@ export class KlikvetLogicWorker extends Worker {
950
1013
  });
951
1014
  return ret;
952
1015
  }
953
- async razknjiziBlagovnice(data) {
954
- this.mongo.emitPublishEvents(false);
955
- this.mongo.useAuditing(false);
956
- this.mongo.setDb(data.tenant);
957
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziBlagovnice" });
1016
+ async razknjiziBlagovnice(data, mongo) {
1017
+ if (this.razknjizujem) {
1018
+ return { ok: false, vse: 0, razknjizene: 0, napake: ["Razknjiževanje že poteka."] };
1019
+ }
1020
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1021
+ assert(m, 'missing Mongo instance');
1022
+ m.emitPublishEvents(false);
1023
+ m.useAuditing(false);
1024
+ m.setDb(data.tenant);
1025
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziBlagovnice" });
958
1026
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
959
1027
  // poišči tiste, ki bi morale že biti razknjižene, pa niso
960
1028
  {
961
- let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000);
962
- let vpisane = await this.dbFind(data.tenant, "blagovnice", { datum: { $gte: od } }, { project: { _id: 1, status: 1 } });
963
- let idjiVpisanih = vpisane.map(b => b._id.toString());
964
- 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 } });
1029
+ let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000); // zadnji trije meseci
1030
+ let vpisane = await this.dbFind(data.tenant, "blagovnice", {
1031
+ datum: { $gte: od },
1032
+ razknjizena: { $exists: false },
1033
+ razknjizbaPreskocena: { $exists: false },
1034
+ }, { project: { _id: 1, status: 1, razknjizena: 1, razknjizbaPreskocena: 1 } }, m);
1035
+ let idjiVpisanih = vpisane.filter(b => !b.razknjizena && !b.razknjizbaPreskocena).map(b => b._id.toString());
1036
+ let zaPovrnit = await this.dbFind(data.tenant, "odprteBlagovnice", {
1037
+ _deleted: { $ne: "hack" },
1038
+ status: "zaključena",
1039
+ datum: { $gte: od },
1040
+ _id: { $in: idjiVpisanih }
1041
+ }, { project: { postavke: 0 } }, m);
965
1042
  for await (let b of zaPovrnit) {
966
1043
  console.log("vračam blagovnico v razkljižno", data.tenant, b);
967
- await this.dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() });
1044
+ await this.dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() }, m);
968
1045
  }
969
1046
  }
970
- let nerazknijzene = await this.dbFind(data.tenant, "odprteBlagovnice", { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false } }, { sort: { datum: 1 } });
1047
+ let nerazknijzene = await this.dbFind(data.tenant, "odprteBlagovnice", { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false }, razknjizbaPreskocena: { $exists: false } }, { sort: { datum: 1 } }, m);
971
1048
  let vse = 0, razknjizene = 0;
972
1049
  let napake = [];
973
- for await (let dobavnica of nerazknijzene) {
1050
+ for await (let blagovnica of nerazknijzene) {
974
1051
  try {
975
1052
  vse++;
976
- await this.razknjiziBlagovnico(dobavnica._id.toString(), data.tenant);
1053
+ await this.razknjiziBlagovnico(blagovnica._id.toString(), data.tenant, m);
977
1054
  razknjizene++;
978
1055
  }
979
1056
  catch (err) {
980
- napake.push(err);
1057
+ napake.push(err instanceof Error ? err.message : String(err));
981
1058
  }
982
1059
  }
983
1060
  return { ok: vse === razknjizene, vse, razknjizene, napake };
984
1061
  }
985
- async razknjiziDobavnice(data) {
986
- this.mongo.emitPublishEvents(false);
987
- this.mongo.useAuditing(false);
988
- this.mongo.setDb(data.tenant);
989
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziDobavnice" });
1062
+ async razknjiziDobavnice(data, mongo) {
1063
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1064
+ assert(m, 'missing Mongo instance');
1065
+ m.emitPublishEvents(false);
1066
+ m.useAuditing(false);
1067
+ m.setDb(data.tenant);
1068
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziDobavnice" });
990
1069
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
991
1070
  let nerazknijzene = await this.dbFind(data.tenant, "dobavnice", {
992
1071
  datum: { $gte: od }, status: "izdana",
993
1072
  razknjizena: { $not: { $type: "date" } },
994
1073
  razknjizbaPreskocena: { $exists: false },
995
- }, { sort: { datum: 1 } });
1074
+ }, { sort: { datum: 1 } }, m);
996
1075
  let vse = 0, razknjizene = 0;
997
1076
  let napake = [];
998
1077
  for await (let blagovnica of nerazknijzene) {
999
1078
  try {
1000
1079
  vse++;
1001
- await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant);
1080
+ await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant, m);
1002
1081
  razknjizene++;
1003
1082
  }
1004
1083
  catch (err) {
1005
- napake.push(err);
1084
+ napake.push(err instanceof Error ? err.message : String(err));
1006
1085
  }
1007
1086
  }
1008
1087
  return { ok: vse === razknjizene, vse, razknjizene, napake };
@@ -1021,63 +1100,73 @@ export class KlikvetLogicWorker extends Worker {
1021
1100
  // await logic.spremeniZalogoNaPodlagiBlagovnice(blagovnica, nastavitve, this.mongo);
1022
1101
  // await pobrisiZalogoNaDan(tenant, [ blagovnica.datum ]);
1023
1102
  // }
1024
- async razknjiziBlagovnico(_id, tenant) {
1025
- if (this.razknjizujem)
1026
- return;
1103
+ async razknjiziBlagovnico(_id, tenant, mongo) {
1104
+ if (this.razknjizujem) {
1105
+ throw new Error("worker že razknjižuje");
1106
+ }
1027
1107
  this.razknjizujem = true;
1028
1108
  try {
1029
- this.mongo.emitPublishEvents(false);
1030
- this.mongo.useAuditing(false);
1031
- this.mongo.setDb(tenant);
1032
- this.mongo.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" });
1033
- let blagovnica = await razknjiziBlagovnico(_id, this.mongo);
1034
- this.razknjizujem = false;
1035
- return blagovnica;
1109
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1110
+ assert(m, 'missing Mongo instance');
1111
+ m.emitPublishEvents(false);
1112
+ m.useAuditing(false);
1113
+ m.setDb(tenant);
1114
+ m.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" });
1115
+ return await razknjiziBlagovnico(_id, m);
1036
1116
  }
1037
1117
  catch (err) {
1038
- console.error("razknjiziBlagovnico", tenant);
1118
+ const message = err instanceof Error ? err.message : String(err);
1119
+ console.error("razknjiziBlagovnico", tenant, message);
1120
+ throw err instanceof Error ? err : new Error(message);
1121
+ }
1122
+ finally {
1123
+ this.razknjizujem = false;
1039
1124
  }
1040
- this.razknjizujem = false;
1041
- return undefined;
1042
1125
  }
1043
- async razknjiziDobavnico(_id, tenant) {
1044
- if (this.razknjizujem)
1045
- return;
1126
+ async razknjiziDobavnico(_id, tenant, mongo) {
1127
+ if (this.razknjizujem) {
1128
+ throw new Error("worker že razknjižuje");
1129
+ }
1046
1130
  this.razknjizujem = true;
1047
1131
  try {
1048
- this.mongo.setDb(tenant);
1049
- this.mongo.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" });
1050
- let dobavnica = await razknjiziDobavnico(_id, this.mongo);
1051
- this.razknjizujem = false;
1052
- return dobavnica;
1132
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1133
+ assert(m, 'missing Mongo instance');
1134
+ m.setDb(tenant);
1135
+ m.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" });
1136
+ return await razknjiziDobavnico(_id, m);
1053
1137
  }
1054
1138
  catch (err) {
1055
- console.error("razknjiziDobavnico", tenant, (err === null || err === void 0 ? void 0 : err.message) || err);
1139
+ const message = err instanceof Error ? err.message : String(err);
1140
+ console.error("razknjiziDobavnico", tenant, message);
1141
+ throw err instanceof Error ? err : new Error(message);
1142
+ }
1143
+ finally {
1144
+ this.razknjizujem = false;
1056
1145
  }
1057
- this.razknjizujem = false;
1058
- return undefined;
1059
1146
  }
1060
- async registerAllInvoices(data) {
1147
+ async registerAllInvoices(data, mongo) {
1061
1148
  var _a;
1062
1149
  if (this.razknjizujem)
1063
1150
  return { nall: 0, nok: 0, napake: ["worker že razknjižuje"] };
1064
1151
  this.razknjizujem = true;
1065
1152
  try {
1066
1153
  assert(data.tenant, "must specify tenant");
1154
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1155
+ assert(m, 'missing Mongo instance');
1067
1156
  let err = null;
1068
1157
  let napake = new Set();
1069
1158
  try {
1070
1159
  err = "Podsistem db ni dosegljiv.";
1071
- this.mongo.setDb(data.tenant);
1072
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" });
1160
+ m.setDb(data.tenant);
1161
+ m.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" });
1073
1162
  let myquery = { eor: null, negotovinski: { $ne: true }, leto: { $gte: 2022 } };
1074
- let env = data.env || ((_a = (await this.mongo.findOne("nastavitve", {}))) === null || _a === void 0 ? void 0 : _a.okolje) || "error";
1075
- let all = await this.mongo.find("racuni", myquery, { project: { _id: 1 }, limit: 1000, });
1163
+ let env = data.env || ((_a = (await m.findOne("nastavitve", {}))) === null || _a === void 0 ? void 0 : _a.okolje) || "error";
1164
+ let all = await m.find("racuni", myquery, { project: { _id: 1 }, limit: 1000, });
1076
1165
  err = "Napaka pri potrjevanju računov.";
1077
1166
  let n = 0;
1078
1167
  try {
1079
1168
  for await (let r of all) {
1080
- let res = await this.registerInvoice({ tenant: data.tenant, env, _id: r._id.toString() }, true);
1169
+ let res = await this.registerInvoice({ tenant: data.tenant, env, _id: r._id.toString() }, true, m);
1081
1170
  if (res instanceof Error || typeof res === "string") {
1082
1171
  console.error("cannot register invoice (1)", data.tenant, r._id, res);
1083
1172
  }
@@ -1120,9 +1209,11 @@ export class KlikvetLogicWorker extends Worker {
1120
1209
  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 })));
1121
1210
  return res;
1122
1211
  }
1123
- async registerInvoice(data, kasneje = false) {
1212
+ async registerInvoice(data, kasneje = false, mongo) {
1124
1213
  var _a, _b, _c, _d, _e, _f, _g, _h;
1125
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerInvoice" });
1214
+ const db = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1215
+ assert(db, 'missing Mongo instance');
1216
+ db.setAudit({ tenant: data.tenant, app: "klikvet/registerInvoice" });
1126
1217
  assert(data._id, "must specify _id of racun");
1127
1218
  assert(["error", "production", "test"].includes(data.env), "must specify env");
1128
1219
  assert(data.tenant, "must specify tenant");
@@ -1130,18 +1221,18 @@ export class KlikvetLogicWorker extends Worker {
1130
1221
  try {
1131
1222
  // poišči račun
1132
1223
  timeoutError = "Db podsistem se ni odzval.";
1133
- let racun = await this.dbFindById(data.tenant, "racuni", data._id);
1224
+ let racun = await this.dbFindById(data.tenant, "racuni", data._id, db);
1134
1225
  if (!racun)
1135
1226
  return `registerInvoice for ${data.tenant}: ni računa ${data._id}`;
1136
1227
  if (racun.negotovinski)
1137
1228
  return "negotovinski račun ne bo fiskaliziran";
1138
- let blagajna = await this.dbFindById(data.tenant, "blagajne", racun.blagajna_id);
1229
+ let blagajna = await this.dbFindById(data.tenant, "blagajne", racun.blagajna_id, db);
1139
1230
  if (!blagajna)
1140
1231
  throw new Error("cannot locate blagajna: " + racun.blagajna_id);
1141
- let poslovalnica = await this.dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id);
1232
+ let poslovalnica = await this.dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id, db);
1142
1233
  if (!blagajna)
1143
1234
  throw new Error("cannot locate poslovalnica: " + racun.blagajna_id);
1144
- let veterina = await this.dbFindById(data.tenant, "nastavitve", poslovalnica.veterina_id);
1235
+ let veterina = await this.dbFindById(data.tenant, "nastavitve", poslovalnica.veterina_id, db);
1145
1236
  if (!veterina)
1146
1237
  throw new Error("cannot locate poslovalnica: " + poslovalnica.veterina_id);
1147
1238
  if (!racun.izdalDs)
@@ -1154,7 +1245,7 @@ export class KlikvetLogicWorker extends Worker {
1154
1245
  datum: racun.datum,
1155
1246
  stevilka: racun.stevilka,
1156
1247
  }
1157
- });
1248
+ }, db);
1158
1249
  }
1159
1250
  let TaxNumber = (veterina.dsCertifikata || veterina.davcnaStevilka);
1160
1251
  TaxNumber = parseInt(((_a = TaxNumber.toString().match(/\d+/)) === null || _a === void 0 ? void 0 : _a.toString()) || "0");
@@ -1273,10 +1364,10 @@ export class KlikvetLogicWorker extends Worker {
1273
1364
  };
1274
1365
  // posodobi račun
1275
1366
  timeoutError = "Napaka pri vpisu davčno potrjenega računa: Db podsistem se ne odziva več.";
1276
- let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj);
1367
+ let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj, db);
1277
1368
  try {
1278
1369
  let dir = path.join('./racuni', new Date().getFullYear().toString(), data.tenant);
1279
- !fs.existsSync(dir) && makeDir.sync(dir);
1370
+ !fs.existsSync(dir) && makeDirectorySync(dir);
1280
1371
  fs.writeFileSync(path.join(dir, racun.stevilka), serialize.pack(clonedeep({ ...racun, ...updated }), false));
1281
1372
  }
1282
1373
  catch (err) {