js-klikvet-logic-worker 2.3.28 → 2.3.30

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
  }
@@ -733,28 +782,44 @@ export class KlikvetLogicWorker extends Worker {
733
782
  return await this.zdruziPaciente(data);
734
783
  }
735
784
  ;
785
+ if (data.operation === "pmz-update") {
786
+ assert(data.tenant, "must specify tenant");
787
+ assert(data.year, "must specify year");
788
+ return await pmzUpdateAllForYear({ tenant: data.tenant, year: parseInt((_d = data.year) === null || _d === void 0 ? void 0 : _d.toString()), writeToDb: true });
789
+ }
790
+ ;
736
791
  assert(false, 'unsupported operation ' + data.operation);
737
792
  }
738
793
  /** PRIVATE */
739
- async dbNastavitve(tenant) {
740
- this.mongo.setDb(tenant);
741
- 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", {}));
742
799
  }
743
- async dbFindById(db, collection, _id) {
744
- this.mongo.setDb(db);
745
- 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);
746
805
  }
747
- async dbFind(db, collection, query, opts) {
748
- this.mongo.setDb(db);
749
- 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);
750
811
  }
751
- async dbUpdateById(db, collection, _id, update) {
752
- this.mongo.setDb(db);
753
- 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);
754
817
  }
755
- async dbUpsert(db, collection, _id, update) {
756
- this.mongo.setDb(db);
757
- 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);
758
823
  }
759
824
  async posljiSmsNarocenemu(data, n, gsm) {
760
825
  var _a, _b, _c, _d, _e, _f;
@@ -853,14 +918,15 @@ export class KlikvetLogicWorker extends Worker {
853
918
  this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacun" });
854
919
  await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo);
855
920
  await this.pobrisiZalogoNaDan(data.tenant, [racun.datum]);
856
- this.razknjizujem = false;
857
921
  return { ok: true };
858
922
  }
859
923
  catch (err) {
860
924
  console.error("razknjiziRacun", data.tenant, (err === null || err === void 0 ? void 0 : err.message) || err);
861
- this.razknjizujem = false;
862
925
  return { ok: false, error: (err === null || err === void 0 ? void 0 : err.message) || err };
863
926
  }
927
+ finally {
928
+ this.razknjizujem = false;
929
+ }
864
930
  }
865
931
  async zdruziStranke(data) {
866
932
  this.mongo.setDb(data.tenant);
@@ -872,30 +938,31 @@ export class KlikvetLogicWorker extends Worker {
872
938
  this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/zdruziPaciente" });
873
939
  return await zdruziPaciente(data.iz, data.v, this.mongo);
874
940
  }
875
- async razknjiziRacune(data) {
941
+ async razknjiziRacune(data, mongo) {
876
942
  console.log('razkljižni račune');
877
943
  if (this.razknjizujem)
878
944
  return { ok: false, error: "worker že razknjižuje" };
879
945
  this.razknjizujem = true;
880
946
  try {
881
- this.mongo.setDb(data.tenant);
882
- 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" });
883
951
  let dni = 6 * 30 * 24 * 60 * 60 * 1000; // 180 dni
884
- console.log('dni', dni);
885
952
  let od = new Date(new Date().valueOf() - dni);
886
- let racuni = await this.mongo.find("racuni", {
953
+ let racuni = await m.find("racuni", {
887
954
  datum: { $gte: od },
888
- razknjizen: { $not: { $type: "date" } },
955
+ razknjizen: { $exist: false },
889
956
  razknjizbaPreskocena: { $exists: false },
890
957
  }, {});
891
- let nastavitve = await this.dbNastavitve(data.tenant);
958
+ let nastavitve = await this.dbNastavitve(data.tenant, m);
892
959
  let datumi = [];
893
960
  for await (let racun of racuni || []) {
894
961
  datumi.push(racun.datum);
895
- await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo);
962
+ await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, m);
896
963
  console.log('z zamikom razknjižen račun št. ', racun.stevilka);
897
964
  }
898
- await this.pobrisiZalogoNaDan(data.tenant, datumi);
965
+ await this.pobrisiZalogoNaDan(data.tenant, datumi, m);
899
966
  this.razknjizujem = false;
900
967
  return { ok: true, racuni };
901
968
  }
@@ -905,7 +972,7 @@ export class KlikvetLogicWorker extends Worker {
905
972
  return { ok: false, error: (err === null || err === void 0 ? void 0 : err.message) || err, racuni: [] };
906
973
  }
907
974
  }
908
- async pobrisiZalogoNaDan(db, datumi) {
975
+ async pobrisiZalogoNaDan(db, datumi, mongo) {
909
976
  try {
910
977
  if (!datumi)
911
978
  return;
@@ -914,10 +981,12 @@ export class KlikvetLogicWorker extends Worker {
914
981
  if (!datumi.length)
915
982
  return;
916
983
  let od = new Date(Math.min(...datumi.map(d => d.valueOf())) - 24 * 60 * 60 * 1000);
917
- this.mongo.setDb(db);
918
- 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" });
919
988
  if (od.valueOf() > 0)
920
- await this.mongo.hardDelete("zalogaNaDan", { datum: { $gte: od } });
989
+ await m.hardDelete("zalogaNaDan", { datum: { $gte: od } });
921
990
  else
922
991
  console.log("pobrisiZalogoNaDan napačni datumi", datumi);
923
992
  }
@@ -944,59 +1013,75 @@ export class KlikvetLogicWorker extends Worker {
944
1013
  });
945
1014
  return ret;
946
1015
  }
947
- async razknjiziBlagovnice(data) {
948
- this.mongo.emitPublishEvents(false);
949
- this.mongo.useAuditing(false);
950
- this.mongo.setDb(data.tenant);
951
- 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" });
952
1026
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
953
1027
  // poišči tiste, ki bi morale že biti razknjižene, pa niso
954
1028
  {
955
- let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000);
956
- let vpisane = await this.dbFind(data.tenant, "blagovnice", { datum: { $gte: od } }, { project: { _id: 1, status: 1 } });
957
- let idjiVpisanih = vpisane.map(b => b._id.toString());
958
- 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);
959
1042
  for await (let b of zaPovrnit) {
960
1043
  console.log("vračam blagovnico v razkljižno", data.tenant, b);
961
- 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);
962
1045
  }
963
1046
  }
964
- 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);
965
1048
  let vse = 0, razknjizene = 0;
966
1049
  let napake = [];
967
- for await (let dobavnica of nerazknijzene) {
1050
+ for await (let blagovnica of nerazknijzene) {
968
1051
  try {
969
1052
  vse++;
970
- await this.razknjiziBlagovnico(dobavnica._id.toString(), data.tenant);
1053
+ await this.razknjiziBlagovnico(blagovnica._id.toString(), data.tenant, m);
971
1054
  razknjizene++;
972
1055
  }
973
1056
  catch (err) {
974
- napake.push(err);
1057
+ napake.push(err instanceof Error ? err.message : String(err));
975
1058
  }
976
1059
  }
977
1060
  return { ok: vse === razknjizene, vse, razknjizene, napake };
978
1061
  }
979
- async razknjiziDobavnice(data) {
980
- this.mongo.emitPublishEvents(false);
981
- this.mongo.useAuditing(false);
982
- this.mongo.setDb(data.tenant);
983
- 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" });
984
1069
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
985
1070
  let nerazknijzene = await this.dbFind(data.tenant, "dobavnice", {
986
1071
  datum: { $gte: od }, status: "izdana",
987
1072
  razknjizena: { $not: { $type: "date" } },
988
1073
  razknjizbaPreskocena: { $exists: false },
989
- }, { sort: { datum: 1 } });
1074
+ }, { sort: { datum: 1 } }, m);
990
1075
  let vse = 0, razknjizene = 0;
991
1076
  let napake = [];
992
1077
  for await (let blagovnica of nerazknijzene) {
993
1078
  try {
994
1079
  vse++;
995
- await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant);
1080
+ await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant, m);
996
1081
  razknjizene++;
997
1082
  }
998
1083
  catch (err) {
999
- napake.push(err);
1084
+ napake.push(err instanceof Error ? err.message : String(err));
1000
1085
  }
1001
1086
  }
1002
1087
  return { ok: vse === razknjizene, vse, razknjizene, napake };
@@ -1015,63 +1100,73 @@ export class KlikvetLogicWorker extends Worker {
1015
1100
  // await logic.spremeniZalogoNaPodlagiBlagovnice(blagovnica, nastavitve, this.mongo);
1016
1101
  // await pobrisiZalogoNaDan(tenant, [ blagovnica.datum ]);
1017
1102
  // }
1018
- async razknjiziBlagovnico(_id, tenant) {
1019
- if (this.razknjizujem)
1020
- return;
1103
+ async razknjiziBlagovnico(_id, tenant, mongo) {
1104
+ if (this.razknjizujem) {
1105
+ throw new Error("worker že razknjižuje");
1106
+ }
1021
1107
  this.razknjizujem = true;
1022
1108
  try {
1023
- this.mongo.emitPublishEvents(false);
1024
- this.mongo.useAuditing(false);
1025
- this.mongo.setDb(tenant);
1026
- this.mongo.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" });
1027
- let blagovnica = await razknjiziBlagovnico(_id, this.mongo);
1028
- this.razknjizujem = false;
1029
- 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);
1030
1116
  }
1031
1117
  catch (err) {
1032
- 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;
1033
1124
  }
1034
- this.razknjizujem = false;
1035
- return undefined;
1036
1125
  }
1037
- async razknjiziDobavnico(_id, tenant) {
1038
- if (this.razknjizujem)
1039
- return;
1126
+ async razknjiziDobavnico(_id, tenant, mongo) {
1127
+ if (this.razknjizujem) {
1128
+ throw new Error("worker že razknjižuje");
1129
+ }
1040
1130
  this.razknjizujem = true;
1041
1131
  try {
1042
- this.mongo.setDb(tenant);
1043
- this.mongo.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" });
1044
- let dobavnica = await razknjiziDobavnico(_id, this.mongo);
1045
- this.razknjizujem = false;
1046
- 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);
1047
1137
  }
1048
1138
  catch (err) {
1049
- 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;
1050
1145
  }
1051
- this.razknjizujem = false;
1052
- return undefined;
1053
1146
  }
1054
- async registerAllInvoices(data) {
1147
+ async registerAllInvoices(data, mongo) {
1055
1148
  var _a;
1056
1149
  if (this.razknjizujem)
1057
1150
  return { nall: 0, nok: 0, napake: ["worker že razknjižuje"] };
1058
1151
  this.razknjizujem = true;
1059
1152
  try {
1060
1153
  assert(data.tenant, "must specify tenant");
1154
+ const m = mongo !== null && mongo !== void 0 ? mongo : this.mongo;
1155
+ assert(m, 'missing Mongo instance');
1061
1156
  let err = null;
1062
1157
  let napake = new Set();
1063
1158
  try {
1064
1159
  err = "Podsistem db ni dosegljiv.";
1065
- this.mongo.setDb(data.tenant);
1066
- this.mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" });
1160
+ m.setDb(data.tenant);
1161
+ m.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" });
1067
1162
  let myquery = { eor: null, negotovinski: { $ne: true }, leto: { $gte: 2022 } };
1068
- let env = data.env || ((_a = (await this.mongo.findOne("nastavitve", {}))) === null || _a === void 0 ? void 0 : _a.okolje) || "error";
1069
- 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, });
1070
1165
  err = "Napaka pri potrjevanju računov.";
1071
1166
  let n = 0;
1072
1167
  try {
1073
1168
  for await (let r of all) {
1074
- 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);
1075
1170
  if (res instanceof Error || typeof res === "string") {
1076
1171
  console.error("cannot register invoice (1)", data.tenant, r._id, res);
1077
1172
  }
@@ -1114,9 +1209,11 @@ export class KlikvetLogicWorker extends Worker {
1114
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 })));
1115
1210
  return res;
1116
1211
  }
1117
- async registerInvoice(data, kasneje = false) {
1212
+ async registerInvoice(data, kasneje = false, mongo) {
1118
1213
  var _a, _b, _c, _d, _e, _f, _g, _h;
1119
- 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" });
1120
1217
  assert(data._id, "must specify _id of racun");
1121
1218
  assert(["error", "production", "test"].includes(data.env), "must specify env");
1122
1219
  assert(data.tenant, "must specify tenant");
@@ -1124,18 +1221,18 @@ export class KlikvetLogicWorker extends Worker {
1124
1221
  try {
1125
1222
  // poišči račun
1126
1223
  timeoutError = "Db podsistem se ni odzval.";
1127
- let racun = await this.dbFindById(data.tenant, "racuni", data._id);
1224
+ let racun = await this.dbFindById(data.tenant, "racuni", data._id, db);
1128
1225
  if (!racun)
1129
1226
  return `registerInvoice for ${data.tenant}: ni računa ${data._id}`;
1130
1227
  if (racun.negotovinski)
1131
1228
  return "negotovinski račun ne bo fiskaliziran";
1132
- let blagajna = await this.dbFindById(data.tenant, "blagajne", racun.blagajna_id);
1229
+ let blagajna = await this.dbFindById(data.tenant, "blagajne", racun.blagajna_id, db);
1133
1230
  if (!blagajna)
1134
1231
  throw new Error("cannot locate blagajna: " + racun.blagajna_id);
1135
- let poslovalnica = await this.dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id);
1232
+ let poslovalnica = await this.dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id, db);
1136
1233
  if (!blagajna)
1137
1234
  throw new Error("cannot locate poslovalnica: " + racun.blagajna_id);
1138
- let veterina = await this.dbFindById(data.tenant, "nastavitve", poslovalnica.veterina_id);
1235
+ let veterina = await this.dbFindById(data.tenant, "nastavitve", poslovalnica.veterina_id, db);
1139
1236
  if (!veterina)
1140
1237
  throw new Error("cannot locate poslovalnica: " + poslovalnica.veterina_id);
1141
1238
  if (!racun.izdalDs)
@@ -1148,7 +1245,7 @@ export class KlikvetLogicWorker extends Worker {
1148
1245
  datum: racun.datum,
1149
1246
  stevilka: racun.stevilka,
1150
1247
  }
1151
- });
1248
+ }, db);
1152
1249
  }
1153
1250
  let TaxNumber = (veterina.dsCertifikata || veterina.davcnaStevilka);
1154
1251
  TaxNumber = parseInt(((_a = TaxNumber.toString().match(/\d+/)) === null || _a === void 0 ? void 0 : _a.toString()) || "0");
@@ -1267,10 +1364,10 @@ export class KlikvetLogicWorker extends Worker {
1267
1364
  };
1268
1365
  // posodobi račun
1269
1366
  timeoutError = "Napaka pri vpisu davčno potrjenega računa: Db podsistem se ne odziva več.";
1270
- let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj);
1367
+ let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj, db);
1271
1368
  try {
1272
1369
  let dir = path.join('./racuni', new Date().getFullYear().toString(), data.tenant);
1273
- !fs.existsSync(dir) && makeDir.sync(dir);
1370
+ !fs.existsSync(dir) && makeDirectorySync(dir);
1274
1371
  fs.writeFileSync(path.join(dir, racun.stevilka), serialize.pack(clonedeep({ ...racun, ...updated }), false));
1275
1372
  }
1276
1373
  catch (err) {