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/src/worker.mts CHANGED
@@ -1,13 +1,13 @@
1
1
 
2
2
  import assert from 'assert'
3
3
  import clonedeep from 'lodash.clonedeep'
4
- import makeDir from 'make-dir'
5
4
  import fs from 'fs'
6
5
  import path from 'path'
6
+ import { makeDirectorySync } from 'make-dir'
7
7
  import { Worker, Client } from 'cry-ebus2'
8
8
  import { Mongo } from 'cry-db'
9
9
  import { Log, serialize, sleep } from 'cry-helpers'
10
- import { Blagajna, Blagovnica, Cepljenje, Narocen, Nastavitve, Poslovalnica, PostavkaRacuna, Racun, Skladisce, VrstaPoslovnegaDogodka, VrstaRazknjizbeZdravila, 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, Obravnava, ArtikelKarkoli, zapisiPoraboZaObravnavo, zapisiPorabeZaObravnave, zapisiPorabeZaDobavnice, } from 'cry-klikvet-logic'
10
+ import { Blagajna, Blagovnica, Cepljenje, Narocen, Nastavitve, Poslovalnica, PostavkaRacuna, Racun, Skladisce, VrstaPoslovnegaDogodka, VrstaRazknjizbeZdravila, 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, Obravnava, ArtikelKarkoli, zapisiPoraboZaObravnavo, zapisiPorabeZaObravnave, zapisiPorabeZaDobavnice, pmzUpdateAllForYear } from 'cry-klikvet-logic'
11
11
  import { OsemenitevGoveda, StatusOsemenitve } from 'cry-klikvet-logic/dist/types/teren.mjs'
12
12
  import { RacunZaKnjizbo } from 'cry-klikvet-logic/dist/spremeniZalogo.mjs'
13
13
  import { Dobavnica } from 'cry-klikvet-logic/dist/types/Dobavnica.mjs'
@@ -26,7 +26,8 @@ export type KlikvetClientRequest = "ping"
26
26
  | { operation: "promet-exec-pipeline", tenant: string, pipeline?: Obj, spec?: Obj }
27
27
  | { operation: "racuni-isci-exec-pipeline", tenant: string, pipeline: Obj, spec?: Obj }
28
28
  | { operation: "porocilo-racunovodji", tenant: string, odDne: Date, doDne: Date, racuniPravnim?: boolean, racuniOdlozeno?: boolean, lokacija?: string, lokacije?: string[], skladisca?: string[] }
29
- | { operation: "zakljucek-blagajne", tenant: string, odDne: Date, doDne: Date, rounding: number, stevilka?: string, vsiRacuni?: boolean, TRRRacuni?: boolean }
29
+ | { operation: "zakljucek-blagajne", tenant: string, odDne: Date, doDne: Date, rounding: number, stevilka?: string, vsiRacuni?: boolean, TRRRacuni?: boolean, racuniPravnim?: boolean }
30
+ | { operation: "gotovinski-racuni", tenant: string, odDne: Date, doDne: Date, rounding: number, stevilka?: string, }
30
31
  | { operation: "moj-promet", tenant: string, username: string, odDne: Date, doDne: Date }
31
32
  | { operation: "prodano", tenant: string, username: string, odDne: Date, doDne: Date }
32
33
  | { operation: "prodano-porabljeno", tenant: string; poArtiklih: boolean; poSkladiscih: boolean; poVrstah: boolean; poDst: boolean; timeQuery?: string; skladisca?: string[]; vrste?: VrstaPoslovnegaDogodka[]; }
@@ -78,6 +79,7 @@ export type KlikvetClientRequest = "ping"
78
79
  | { operation: "razknjizi-dobavnico", tenant: string, _id: string }
79
80
  | { operation: "zdruzi-stranke", tenant: string, v: string, iz: string[] }
80
81
  | { operation: "zdruzi-paciente", tenant: string, v: string, iz: string[] }
82
+ | { operation: "pmz-update", tenant: string, year: number }
81
83
  ;
82
84
 
83
85
 
@@ -115,11 +117,11 @@ export class KlikvetLogicWorker extends Worker {
115
117
  async porabaZaObravnavo(mongo: Mongo, data: { tenant: string, id: string, username: string }) {
116
118
  console.log('porabaZaObravnavo',data);
117
119
 
118
- let nastavitve = await this.dbNastavitve(data.tenant);
119
- let obravnava = await this.dbFindById<Obravnava>(data.tenant, "obravnave", data.id);
120
+ let nastavitve = await this.dbNastavitve(data.tenant, mongo);
121
+ let obravnava = await this.dbFindById<Obravnava>(data.tenant, "obravnave", data.id, mongo);
120
122
  if (!obravnava) throw new Error("porabaZaObravnavo: ni obravnave " + data?.id);
121
123
  let artikel_ids = obravnava.koraki.map(k => (k.postavke || []).map(p => p.artikel_id)).flat(2).filter(a => !!a);
122
- let artikli = await this.dbFind<ArtikelKarkoli>(data.tenant, "artikli", { _id: { $in: artikel_ids } });
124
+ let artikli = await this.dbFind<ArtikelKarkoli>(data.tenant, "artikli", { _id: { $in: artikel_ids } }, {}, mongo);
123
125
  let poraba = await zapisiPoraboZaObravnavo({ tenant: data.tenant, mongo, obravnava, nastavitve, username: data.username, artikli });
124
126
 
125
127
  console.log('poraba',poraba);
@@ -142,14 +144,34 @@ export class KlikvetLogicWorker extends Worker {
142
144
  }
143
145
  }
144
146
 
147
+ private configureMongoInstance(mongo: Mongo) {
148
+ mongo.useSoftDelete(true)
149
+ mongo.useRevisions(true)
150
+ mongo.useAuditing(true)
151
+ mongo.emitPublishEvents(true)
152
+ mongo.on('publish', this.publishMsg.bind(this))
153
+ return mongo
154
+ }
155
+
156
+ private async withNewMongo<T>(fn: (mongo: Mongo) => Promise<T>): Promise<T> {
157
+ const mongo = this.configureMongoInstance(new Mongo())
158
+ try {
159
+ return await fn(mongo)
160
+ } catch (err) {
161
+ console.error('withNewMongo error', err)
162
+ throw err
163
+ } finally {
164
+ try {
165
+ await mongo.close()
166
+ } catch (closeErr) {
167
+ console.error('withNewMongo close error', closeErr)
168
+ }
169
+ }
170
+ }
171
+
145
172
  async resetMongo() {
146
173
  if (this.mongo) await this.mongo.close()
147
- this.mongo = new Mongo()
148
- this.mongo.useSoftDelete(true)
149
- this.mongo.useRevisions(true)
150
- this.mongo.useAuditing(true)
151
- this.mongo.emitPublishEvents(true)
152
- this.mongo.on('publish', this.publishMsg.bind(this))
174
+ this.mongo = this.configureMongoInstance(new Mongo())
153
175
  }
154
176
 
155
177
  async closeMongo() {
@@ -237,9 +259,9 @@ export class KlikvetLogicWorker extends Worker {
237
259
  }
238
260
 
239
261
  if (data.operation === 'porocilo-racunovodji') {
240
- assert(data.tenant, 'must tenant')
241
- assert(data.odDne, 'must odDne')
242
- assert(data.doDne, 'must doDne')
262
+ assert(data.tenant, 'porocilo-racunovodji must tenant')
263
+ assert(data.odDne, 'porocilo-racunovodji must odDne')
264
+ assert(data.doDne, 'porocilo-racunovodji must doDne')
243
265
 
244
266
  let pipeline = await racunovodji.createAggregationPipeline(data)
245
267
  let podatki = await racunovodji.execPipeline(pipeline.pipeline, data.tenant)
@@ -276,13 +298,22 @@ export class KlikvetLogicWorker extends Worker {
276
298
  if (data.TRRRacuni) {
277
299
  ret.TRRRacuni = await zakljucekBlagajne.TRRRacuni(pipeline.match, data.tenant);
278
300
  }
301
+ if (data.racuniPravnim) {
302
+ ret.racuniPravnim = await racunovodji.getTaxBills(data.tenant, pipeline.match);
303
+ }
304
+ return ret;
305
+ }
306
+
307
+ if (data.operation === 'gotovinski-racuni') {
308
+ let pipeline = zakljucekBlagajne.createAggregationPipeline(data);
309
+ let ret = await racunovodji.getCashBills(data.tenant, pipeline.match);
279
310
  return ret;
280
311
  }
281
312
 
282
313
  if (data.operation === 'moj-promet') {
283
- assert(data.username, 'must specify username')
284
- assert(data.odDne, 'must specify odDne')
285
- assert(data.doDne, 'must specify doDne')
314
+ assert(data.username, 'moj-promet must specify username')
315
+ assert(data.odDne, 'moj-promet must specify odDne')
316
+ assert(data.doDne, 'moj-promet must specify doDne')
286
317
 
287
318
  let pipeline = mojPromet.createAggregationPipeline(data)
288
319
  let podatki = await mojPromet.execPipeline(pipeline.pipeline, data.tenant)
@@ -290,9 +321,9 @@ export class KlikvetLogicWorker extends Worker {
290
321
  }
291
322
 
292
323
  if (data.operation === 'prodano') {
293
- assert(data.tenant, 'must specify tenant')
294
- assert(data.odDne, 'must specify odDne')
295
- assert(data.doDne, 'must specify doDne')
324
+ assert(data.tenant, 'prodano must specify tenant')
325
+ assert(data.odDne, 'prodano must specify odDne')
326
+ assert(data.doDne, 'prodano must specify doDne')
296
327
 
297
328
  let pipeline = prodano.createAggregationPipeline(data)
298
329
  let podatki = await prodano.execPipeline(pipeline.pipeline, data.tenant)
@@ -300,7 +331,7 @@ export class KlikvetLogicWorker extends Worker {
300
331
  }
301
332
 
302
333
  if (data.operation === 'prodano-porabljeno') {
303
- assert(data.tenant, 'must specify tenant')
334
+ assert(data.tenant, 'prodano-porabljeno must specify tenant')
304
335
  let podatki = await prodanoInPorabljeno(data)
305
336
  return podatki;
306
337
  }
@@ -536,10 +567,14 @@ export class KlikvetLogicWorker extends Worker {
536
567
  if (data.operation === "furs-register-invoice") {
537
568
  let res = await this.registerInvoice(data);
538
569
  setTimeout(async () => {
539
- await this.resetMongo();
540
- await this.registerAllInvoices(data);
541
- await this.razknjiziRacune(data);
542
- await this.closeMongo();
570
+ try {
571
+ await this.withNewMongo(async mongo => {
572
+ await this.registerAllInvoices(data, mongo);
573
+ await this.razknjiziRacune(data, mongo);
574
+ });
575
+ } catch (err) {
576
+ console.error('delayed registerAllInvoices failed', err);
577
+ }
543
578
  }, 2000);
544
579
  return res
545
580
  };
@@ -547,9 +582,13 @@ export class KlikvetLogicWorker extends Worker {
547
582
  if (data.operation === "furs-register-all-invoices") {
548
583
  let all = await this.registerAllInvoices(data);
549
584
  setTimeout(async () => {
550
- await this.resetMongo();
551
- await this.razknjiziRacune(data);
552
- await this.closeMongo();
585
+ try {
586
+ await this.withNewMongo(async mongo => {
587
+ await this.razknjiziRacune(data, mongo);
588
+ });
589
+ } catch (err) {
590
+ console.error('delayed razknjiziRacune failed', err);
591
+ }
553
592
  }, 4000)
554
593
  return all
555
594
  };
@@ -605,9 +644,13 @@ export class KlikvetLogicWorker extends Worker {
605
644
  await this.razknjiziDobavnico(data._id, data.tenant)
606
645
 
607
646
  setImmediate(async () => {
608
- await this.resetMongo();
609
- await this.razknjiziDobavnice(data);
610
- await this.closeMongo();
647
+ try {
648
+ await this.withNewMongo(async mongo => {
649
+ await this.razknjiziDobavnice(data, mongo);
650
+ });
651
+ } catch (err) {
652
+ console.error('delayed razknjiziDobavnice failed', err);
653
+ }
611
654
  });
612
655
 
613
656
  return { ok: true }
@@ -619,9 +662,13 @@ export class KlikvetLogicWorker extends Worker {
619
662
  await this.razknjiziBlagovnico(data._id, data.tenant)
620
663
 
621
664
  setImmediate(async () => {
622
- await this.resetMongo();
623
- await this.razknjiziBlagovnice(data);
624
- await this.closeMongo();
665
+ try {
666
+ await this.withNewMongo(async mongo => {
667
+ await this.razknjiziBlagovnice(data, mongo);
668
+ });
669
+ } catch (err) {
670
+ console.error('delayed razknjiziBlagovnice failed', err);
671
+ }
625
672
  });
626
673
 
627
674
  return { ok: true }
@@ -875,6 +922,13 @@ export class KlikvetLogicWorker extends Worker {
875
922
  return await this.zdruziPaciente(data);
876
923
  };
877
924
 
925
+ if (data.operation === "pmz-update") {
926
+ assert(data.tenant, "must specify tenant")
927
+ assert(data.year, "must specify year");
928
+
929
+ return await pmzUpdateAllForYear({tenant: data.tenant, year: parseInt(data.year?.toString()), writeToDb: true});
930
+ };
931
+
878
932
  assert(false, 'unsupported operation ' + (data as { operation: string }).operation)
879
933
  }
880
934
 
@@ -882,29 +936,39 @@ export class KlikvetLogicWorker extends Worker {
882
936
  /** PRIVATE */
883
937
 
884
938
 
885
- async dbNastavitve(tenant: string) {
886
- this.mongo!.setDb(tenant)
887
- return (await this.mongo!.findOne("nastavitve", {})) as Nastavitve;
939
+ async dbNastavitve(tenant: string, mongo?: Mongo) {
940
+ const db = mongo ?? this.mongo
941
+ assert(db, 'missing Mongo instance')
942
+ db.setDb(tenant)
943
+ return (await db.findOne("nastavitve", {})) as Nastavitve;
888
944
  }
889
945
 
890
- async dbFindById<T>(db: string, collection: string, _id: string) {
891
- this.mongo!.setDb(db)
892
- return await this.mongo!.findById(collection, _id) as T
946
+ async dbFindById<T>(db: string, collection: string, _id: string, mongo?: Mongo) {
947
+ const m = mongo ?? this.mongo
948
+ assert(m, 'missing Mongo instance')
949
+ m.setDb(db)
950
+ return await m.findById(collection, _id) as T
893
951
  }
894
952
 
895
- async dbFind<T>(db: string, collection: string, query: Obj, opts?: Obj) {
896
- this.mongo!.setDb(db)
897
- return await this.mongo!.find(collection, query, opts) as T[]
953
+ async dbFind<T>(db: string, collection: string, query: Obj, opts: Obj = {}, mongo?: Mongo) {
954
+ const m = mongo ?? this.mongo
955
+ assert(m, 'missing Mongo instance')
956
+ m.setDb(db)
957
+ return await m.find(collection, query, opts) as T[]
898
958
  }
899
959
 
900
- async dbUpdateById(db: string, collection: string, _id: string, update: Obj) {
901
- this.mongo!.setDb(db)
902
- return await this.mongo!.updateOne(collection, { _id }, update)
960
+ async dbUpdateById(db: string, collection: string, _id: string, update: Obj, mongo?: Mongo) {
961
+ const m = mongo ?? this.mongo
962
+ assert(m, 'missing Mongo instance')
963
+ m.setDb(db)
964
+ return await m.updateOne(collection, { _id }, update)
903
965
  }
904
966
 
905
- async dbUpsert(db: string, collection: string, _id: string, update: Obj) {
906
- this.mongo!.setDb(db)
907
- return await this.mongo!.upsert(collection, { _id }, update)
967
+ async dbUpsert(db: string, collection: string, _id: string, update: Obj, mongo?: Mongo) {
968
+ const m = mongo ?? this.mongo
969
+ assert(m, 'missing Mongo instance')
970
+ m.setDb(db)
971
+ return await m.upsert(collection, { _id }, update)
908
972
  }
909
973
 
910
974
  async posljiSmsNarocenemu(data: Obj, n: { smsText: string, posiljatelj: string, narocen: Narocen, zaKdaj: Date }, gsm: string) {
@@ -1001,12 +1065,12 @@ export class KlikvetLogicWorker extends Worker {
1001
1065
  this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacun" })
1002
1066
  await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo as any)
1003
1067
  await this.pobrisiZalogoNaDan(data.tenant, [racun.datum])
1004
- this.razknjizujem = false;
1005
1068
  return { ok: true }
1006
1069
  } catch (err) {
1007
1070
  console.error("razknjiziRacun", data.tenant, err?.message || err)
1008
- this.razknjizujem = false;
1009
1071
  return { ok: false, error: err?.message || err }
1072
+ } finally {
1073
+ this.razknjizujem = false;
1010
1074
  }
1011
1075
  }
1012
1076
 
@@ -1030,33 +1094,34 @@ export class KlikvetLogicWorker extends Worker {
1030
1094
  return await zdruziPaciente(data.iz, data.v, this.mongo!);
1031
1095
  }
1032
1096
 
1033
- async razknjiziRacune(data: { tenant: string }) {
1097
+ async razknjiziRacune(data: { tenant: string }, mongo?: Mongo) {
1034
1098
  console.log('razkljižni račune');
1035
1099
 
1036
1100
  if (this.razknjizujem) return { ok: false, error: "worker že razknjižuje" };
1037
1101
  this.razknjizujem = true;
1038
1102
  try {
1039
- this.mongo!.setDb(data.tenant)
1040
- this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacune" })
1103
+ const m = mongo ?? this.mongo
1104
+ assert(m, 'missing Mongo instance')
1105
+ m.setDb(data.tenant)
1106
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziRacune" })
1041
1107
 
1042
1108
  let dni = 6 * 30 * 24 * 60 * 60 * 1000; // 180 dni
1043
- console.log('dni',dni);
1044
1109
 
1045
1110
  let od = new Date(new Date().valueOf() - dni);
1046
- let racuni = await this.mongo!.find("racuni", {
1111
+ let racuni = await m.find("racuni", {
1047
1112
  datum: { $gte: od },
1048
- razknjizen: { $not: { $type: "date" } },
1113
+ razknjizen: { $exist: false },
1049
1114
  razknjizbaPreskocena: { $exists: false },
1050
1115
  }, {}) as RacunZaKnjizbo[] | undefined;
1051
1116
 
1052
- let nastavitve = await this.dbNastavitve(data.tenant);
1117
+ let nastavitve = await this.dbNastavitve(data.tenant, m);
1053
1118
  let datumi = []
1054
1119
  for await (let racun of racuni || []) {
1055
1120
  datumi.push(racun.datum)
1056
- await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, this.mongo as any)
1121
+ await spremeniZalogoNaPodlagiRacuna(racun, nastavitve, m as any)
1057
1122
  console.log('z zamikom razknjižen račun št. ', racun.stevilka);
1058
1123
  }
1059
- await this.pobrisiZalogoNaDan(data.tenant, datumi)
1124
+ await this.pobrisiZalogoNaDan(data.tenant, datumi, m)
1060
1125
  this.razknjizujem = false;
1061
1126
  return { ok: true, racuni }
1062
1127
 
@@ -1067,16 +1132,18 @@ export class KlikvetLogicWorker extends Worker {
1067
1132
  }
1068
1133
  }
1069
1134
 
1070
- async pobrisiZalogoNaDan(db: string, datumi: Date[]) {
1135
+ async pobrisiZalogoNaDan(db: string, datumi: Date[], mongo?: Mongo) {
1071
1136
  try {
1072
1137
  if (!datumi) return;
1073
1138
  if (!Array.isArray(datumi)) datumi = []
1074
1139
  if (!datumi.length) return;
1075
1140
  let od = new Date(Math.min(...datumi.map(d => d.valueOf())) - 24 * 60 * 60 * 1000);
1076
- this.mongo!.setDb(db)
1077
- this.mongo!.setAudit({ tenant: db, app: "klikvet/pobrisiZalogoNaDan" })
1141
+ const m = mongo ?? this.mongo
1142
+ assert(m, 'missing Mongo instance')
1143
+ m.setDb(db)
1144
+ m.setAudit({ tenant: db, app: "klikvet/pobrisiZalogoNaDan" })
1078
1145
 
1079
- if (od.valueOf() > 0) await this.mongo!.hardDelete("zalogaNaDan", { datum: { $gte: od } });
1146
+ if (od.valueOf() > 0) await m.hardDelete("zalogaNaDan", { datum: { $gte: od } });
1080
1147
  else console.log("pobrisiZalogoNaDan napačni datumi", datumi)
1081
1148
  } catch (err) {
1082
1149
  console.log("pobrisiZalogoNaDan error", err);
@@ -1103,52 +1170,70 @@ export class KlikvetLogicWorker extends Worker {
1103
1170
 
1104
1171
  }
1105
1172
 
1106
- async razknjiziBlagovnice(data: { tenant: string }) {
1107
- this.mongo!.emitPublishEvents(false);
1108
- this.mongo!.useAuditing(false)
1109
- this.mongo!.setDb(data.tenant);
1110
- this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziBlagovnice" });
1173
+ async razknjiziBlagovnice(data: { tenant: string }, mongo?: Mongo) {
1174
+ if (this.razknjizujem) {
1175
+ return { ok: false, vse: 0, razknjizene: 0, napake: ["Razknjiževanje že poteka."] };
1176
+ }
1177
+ const m = mongo ?? this.mongo
1178
+ assert(m, 'missing Mongo instance')
1179
+ m.emitPublishEvents(false);
1180
+ m.useAuditing(false)
1181
+ m.setDb(data.tenant);
1182
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziBlagovnice" });
1111
1183
 
1112
1184
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
1113
1185
 
1114
1186
  // poišči tiste, ki bi morale že biti razknjižene, pa niso
1115
1187
  {
1116
- let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000);
1117
- let vpisane = await this.dbFind<Blagovnica>(data.tenant, "blagovnice", { datum: { $gte: od } }, { project: { _id: 1, status: 1 } });
1118
- let idjiVpisanih = vpisane.map(b => b._id.toString());
1188
+ let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000); // zadnji trije meseci
1189
+ let vpisane = await this.dbFind<Blagovnica>(data.tenant, "blagovnice", {
1190
+ datum: { $gte: od },
1191
+ razknjizena: { $exists: false },
1192
+ razknjizbaPreskocena: { $exists: false },
1119
1193
 
1120
- let zaPovrnit = await this.dbFind<Blagovnica>(data.tenant, "odprteBlagovnice", { _deleted: { $ne: "hack" }, status: "zaključena", datum: { $gte: od }, _id: { $nin: idjiVpisanih } }, { project: { status: 1, dokumentDobavitelja: 1, vrsta: 1 } });
1194
+ }, { project: { _id: 1, status: 1,razknjizena:1, razknjizbaPreskocena:1 } }, m);
1195
+ let idjiVpisanih = vpisane.filter(b => !b.razknjizena && !b.razknjizbaPreskocena).map(b => b._id.toString());
1196
+
1197
+ let zaPovrnit = await this.dbFind<Blagovnica>(data.tenant, "odprteBlagovnice", {
1198
+ _deleted: { $ne: "hack" },
1199
+ status: "zaključena",
1200
+ datum: { $gte: od },
1201
+ _id: { $in: idjiVpisanih }
1202
+ }, { project: { postavke: 0} }, m);
1121
1203
 
1122
1204
  for await (let b of zaPovrnit) {
1123
1205
  console.log("vračam blagovnico v razkljižno", data.tenant, b)
1124
- await this.dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() });
1206
+ await this.dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() }, m);
1125
1207
  }
1126
1208
  }
1127
1209
 
1128
1210
  let nerazknijzene = await this.dbFind<Dobavnica>(data.tenant, "odprteBlagovnice",
1129
- { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false } },
1130
- { sort: { datum: 1 } }
1211
+ { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false }, razknjizbaPreskocena: { $exists: false } },
1212
+ { sort: { datum: 1 } },
1213
+ m
1131
1214
  );
1132
1215
  let vse = 0, razknjizene = 0
1133
1216
  let napake = []
1134
- for await (let dobavnica of nerazknijzene) {
1217
+ for await (let blagovnica of nerazknijzene) {
1135
1218
  try {
1136
1219
  vse++
1137
- await this.razknjiziBlagovnico(dobavnica._id.toString(), data.tenant)
1220
+ await this.razknjiziBlagovnico(blagovnica._id.toString(), data.tenant, m)
1138
1221
  razknjizene++
1139
1222
  } catch (err) {
1140
- napake.push(err)
1223
+ napake.push(err instanceof Error ? err.message : String(err))
1141
1224
  }
1142
1225
  }
1143
1226
  return { ok: vse === razknjizene, vse, razknjizene, napake }
1144
1227
  }
1145
1228
 
1146
- async razknjiziDobavnice(data: { tenant: string }) {
1229
+ async razknjiziDobavnice(data: { tenant: string }, mongo?: Mongo) {
1147
1230
 
1148
- this.mongo!.emitPublishEvents(false)
1149
- this.mongo!.useAuditing(false)
1150
- this.mongo!.setDb(data.tenant)
1151
- this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziDobavnice" })
1231
+ const m = mongo ?? this.mongo
1232
+ assert(m, 'missing Mongo instance')
1233
+ m.emitPublishEvents(false)
1234
+ m.useAuditing(false)
1235
+ m.setDb(data.tenant)
1236
+ m.setAudit({ tenant: data.tenant, app: "klikvet/razknjiziDobavnice" })
1152
1237
 
1153
1238
  let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000)
1154
1239
  let nerazknijzene = await this.dbFind<Dobavnica>(data.tenant, "dobavnice",
@@ -1157,17 +1242,18 @@ export class KlikvetLogicWorker extends Worker {
1157
1242
  razknjizena: { $not: { $type: "date" } },
1158
1243
  razknjizbaPreskocena: { $exists: false },
1159
1244
  },
1160
- { sort: { datum: 1 } }
1245
+ { sort: { datum: 1 } },
1246
+ m
1161
1247
  );
1162
1248
  let vse = 0, razknjizene = 0
1163
1249
  let napake = []
1164
1250
  for await (let blagovnica of nerazknijzene) {
1165
1251
  try {
1166
1252
  vse++
1167
- await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant)
1253
+ await this.razknjiziDobavnico(blagovnica._id.toString(), data.tenant, m)
1168
1254
  razknjizene++
1169
1255
  } catch (err) {
1170
- napake.push(err)
1256
+ napake.push(err instanceof Error ? err.message : String(err))
1171
1257
  }
1172
1258
  }
1173
1259
  return { ok: vse === razknjizene, vse, razknjizene, napake }
@@ -1193,47 +1279,56 @@ export class KlikvetLogicWorker extends Worker {
1193
1279
  // await pobrisiZalogoNaDan(tenant, [ blagovnica.datum ]);
1194
1280
  // }
1195
1281
 
1196
- async razknjiziBlagovnico(_id: string, tenant: string) {
1197
-
1198
- if (this.razknjizujem) return;
1282
+ async razknjiziBlagovnico(_id: string, tenant: string, mongo?: Mongo) {
1283
+ if (this.razknjizujem) {
1284
+ throw new Error("worker že razknjižuje");
1285
+ }
1199
1286
  this.razknjizujem = true;
1200
1287
  try {
1201
- this.mongo!.emitPublishEvents(false)
1202
- this.mongo!.useAuditing(false)
1203
- this.mongo!.setDb(tenant)
1204
- this.mongo!.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" })
1205
-
1206
- let blagovnica = await razknjiziBlagovnico(_id, this.mongo as any);
1207
- this.razknjizujem = false;
1208
- return blagovnica
1288
+ const m = mongo ?? this.mongo
1289
+ assert(m, 'missing Mongo instance')
1290
+ m.emitPublishEvents(false)
1291
+ m.useAuditing(false)
1292
+ m.setDb(tenant)
1293
+ m.setAudit({ tenant, app: "klikvet/razknjiziBlagovnico" })
1294
+
1295
+ return await razknjiziBlagovnico(_id, m as any);
1209
1296
  } catch (err) {
1210
- console.error("razknjiziBlagovnico", tenant)
1297
+ const message = err instanceof Error ? err.message : String(err)
1298
+ console.error("razknjiziBlagovnico", tenant, message)
1299
+ throw err instanceof Error ? err : new Error(message)
1300
+ } finally {
1301
+ this.razknjizujem = false;
1211
1302
  }
1212
- this.razknjizujem = false;
1213
- return undefined
1214
1303
  }
1215
1304
 
1216
- async razknjiziDobavnico(_id: string, tenant: string) {
1217
- if (this.razknjizujem) return;
1305
+ async razknjiziDobavnico(_id: string, tenant: string, mongo?: Mongo) {
1306
+ if (this.razknjizujem) {
1307
+ throw new Error("worker že razknjižuje")
1308
+ }
1218
1309
  this.razknjizujem = true;
1219
1310
  try {
1220
- this.mongo!.setDb(tenant)
1221
- this.mongo!.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" })
1222
- let dobavnica = await razknjiziDobavnico(_id, this.mongo as any);
1223
- this.razknjizujem = false;
1224
- return dobavnica
1311
+ const m = mongo ?? this.mongo
1312
+ assert(m, 'missing Mongo instance')
1313
+ m.setDb(tenant)
1314
+ m.setAudit({ tenant, app: "klikvet/razknjiziDobavnico" })
1315
+ return await razknjiziDobavnico(_id, m as any);
1225
1316
  } catch (err) {
1226
- console.error("razknjiziDobavnico", tenant, err?.message || err)
1317
+ const message = err instanceof Error ? err.message : String(err)
1318
+ console.error("razknjiziDobavnico", tenant, message)
1319
+ throw err instanceof Error ? err : new Error(message)
1320
+ } finally {
1321
+ this.razknjizujem = false;
1227
1322
  }
1228
- this.razknjizujem = false;
1229
- return undefined
1230
1323
  }
1231
1324
 
1232
- async registerAllInvoices(data: { tenant: string, env: string, }) {
1325
+ async registerAllInvoices(data: { tenant: string, env: string, }, mongo?: Mongo) {
1233
1326
  if (this.razknjizujem) return { nall: 0, nok: 0, napake: ["worker že razknjižuje"] };
1234
1327
  this.razknjizujem = true;
1235
1328
  try {
1236
1329
  assert(data.tenant, "must specify tenant")
1330
+ const m = mongo ?? this.mongo
1331
+ assert(m, 'missing Mongo instance')
1237
1332
 
1238
1333
  let err = null;
1239
1334
  let napake = new Set()
@@ -1241,19 +1336,19 @@ export class KlikvetLogicWorker extends Worker {
1241
1336
 
1242
1337
  err = "Podsistem db ni dosegljiv."
1243
1338
 
1244
- this.mongo!.setDb(data.tenant)
1245
- this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" })
1339
+ m.setDb(data.tenant)
1340
+ m.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" })
1246
1341
 
1247
1342
  let myquery = { eor: null, negotovinski: { $ne: true }, leto: { $gte: 2022 } };
1248
- let env = data.env || (await this.mongo!.findOne<Nastavitve>("nastavitve", {}))?.okolje || "error"
1343
+ let env = data.env || (await m.findOne<Nastavitve>("nastavitve", {}))?.okolje || "error"
1249
1344
 
1250
- let all = await this.mongo!.find<Racun>("racuni", myquery, { project: { _id: 1 }, limit: 1000, })
1345
+ let all = await m.find<Racun>("racuni", myquery, { project: { _id: 1 }, limit: 1000, })
1251
1346
  err = "Napaka pri potrjevanju računov."
1252
1347
 
1253
1348
  let n = 0;
1254
1349
  try {
1255
1350
  for await (let r of all) {
1256
- let res = await this.registerInvoice({ tenant: data.tenant, env, _id: r._id.toString() }, true);
1351
+ let res = await this.registerInvoice({ tenant: data.tenant, env, _id: r._id.toString() }, true, m);
1257
1352
  if (res instanceof Error || typeof res === "string") {
1258
1353
  console.error("cannot register invoice (1)", data.tenant, r._id, res)
1259
1354
  } else {
@@ -1294,8 +1389,10 @@ export class KlikvetLogicWorker extends Worker {
1294
1389
  return res
1295
1390
  }
1296
1391
 
1297
- async registerInvoice(data: { env: string, tenant: string, _id: string }, kasneje = false) {
1298
- this.mongo!.setAudit({ tenant: data.tenant, app: "klikvet/registerInvoice" })
1392
+ async registerInvoice(data: { env: string, tenant: string, _id: string }, kasneje = false, mongo?: Mongo) {
1393
+ const db = mongo ?? this.mongo
1394
+ assert(db, 'missing Mongo instance')
1395
+ db.setAudit({ tenant: data.tenant, app: "klikvet/registerInvoice" })
1299
1396
 
1300
1397
  assert(data._id, "must specify _id of racun")
1301
1398
  assert(["error", "production", "test"].includes(data.env), "must specify env")
@@ -1305,15 +1402,15 @@ export class KlikvetLogicWorker extends Worker {
1305
1402
  try {
1306
1403
  // poišči račun
1307
1404
  timeoutError = "Db podsistem se ni odzval."
1308
- let racun = await this.dbFindById<Racun>(data.tenant, "racuni", data._id)
1405
+ let racun = await this.dbFindById<Racun>(data.tenant, "racuni", data._id, db)
1309
1406
  if (!racun) return `registerInvoice for ${data.tenant}: ni računa ${data._id}`
1310
1407
  if (racun.negotovinski) return "negotovinski račun ne bo fiskaliziran";
1311
1408
 
1312
- let blagajna = await this.dbFindById<Blagajna>(data.tenant, "blagajne", racun.blagajna_id)
1409
+ let blagajna = await this.dbFindById<Blagajna>(data.tenant, "blagajne", racun.blagajna_id, db)
1313
1410
  if (!blagajna) throw new Error("cannot locate blagajna: " + racun.blagajna_id)
1314
- let poslovalnica = await this.dbFindById<Poslovalnica>(data.tenant, "poslovalnice", blagajna.poslovalnica_id)
1411
+ let poslovalnica = await this.dbFindById<Poslovalnica>(data.tenant, "poslovalnice", blagajna.poslovalnica_id, db)
1315
1412
  if (!blagajna) throw new Error("cannot locate poslovalnica: " + racun.blagajna_id)
1316
- let veterina = await this.dbFindById<Nastavitve>(data.tenant, "nastavitve", poslovalnica.veterina_id)
1413
+ let veterina = await this.dbFindById<Nastavitve>(data.tenant, "nastavitve", poslovalnica.veterina_id, db)
1317
1414
  if (!veterina) throw new Error("cannot locate poslovalnica: " + poslovalnica.veterina_id)
1318
1415
  if (!racun.izdalDs) throw new Error("Uporabnik verjetno nima vpisane davčne številke.")
1319
1416
 
@@ -1325,7 +1422,7 @@ export class KlikvetLogicWorker extends Worker {
1325
1422
  datum: racun.datum,
1326
1423
  stevilka: racun.stevilka,
1327
1424
  }
1328
- })
1425
+ }, db)
1329
1426
  }
1330
1427
 
1331
1428
  let TaxNumber = (veterina.dsCertifikata || veterina.davcnaStevilka)
@@ -1453,11 +1550,11 @@ export class KlikvetLogicWorker extends Worker {
1453
1550
 
1454
1551
  // posodobi račun
1455
1552
  timeoutError = "Napaka pri vpisu davčno potrjenega računa: Db podsistem se ne odziva več."
1456
- let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj);
1553
+ let updated = await this.dbUpdateById(data.tenant, "racuni", data._id, fursObj, db);
1457
1554
 
1458
1555
  try {
1459
1556
  let dir = path.join('./racuni', new Date().getFullYear().toString(), data.tenant)
1460
- !fs.existsSync(dir) && makeDir.sync(dir);
1557
+ !fs.existsSync(dir) && makeDirectorySync(dir);
1461
1558
  fs.writeFileSync(path.join(dir, racun.stevilka), serialize.pack(clonedeep({ ...racun, ...updated }), false));
1462
1559
  } catch (err) {
1463
1560
  console.log("napaka pri zapisu izdanega računa na disk", err)