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.d.mts +36 -15
- package/dist/worker.d.mts.map +1 -1
- package/dist/worker.mjs +223 -126
- package/dist/worker.mjs.map +1 -1
- package/package.json +12 -12
- package/src/worker.mts +224 -127
- package/test/{worker.test.js → worker.test.mjs} +17 -19
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
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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
|
-
|
|
551
|
-
|
|
552
|
-
|
|
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
|
-
|
|
609
|
-
|
|
610
|
-
|
|
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
|
-
|
|
623
|
-
|
|
624
|
-
|
|
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
|
|
887
|
-
|
|
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
|
|
892
|
-
|
|
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?:
|
|
896
|
-
this.mongo
|
|
897
|
-
|
|
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
|
|
902
|
-
|
|
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
|
|
907
|
-
|
|
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
|
|
1040
|
-
|
|
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
|
|
1111
|
+
let racuni = await m.find("racuni", {
|
|
1047
1112
|
datum: { $gte: od },
|
|
1048
|
-
razknjizen: { $
|
|
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,
|
|
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
|
|
1077
|
-
|
|
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
|
|
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.
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
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", {
|
|
1118
|
-
|
|
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
|
-
|
|
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
|
|
1217
|
+
for await (let blagovnica of nerazknijzene) {
|
|
1135
1218
|
try {
|
|
1136
1219
|
vse++
|
|
1137
|
-
await this.razknjiziBlagovnico(
|
|
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
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
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
|
-
|
|
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
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
return
|
|
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
|
-
|
|
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)
|
|
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
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
1245
|
-
|
|
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
|
|
1343
|
+
let env = data.env || (await m.findOne<Nastavitve>("nastavitve", {}))?.okolje || "error"
|
|
1249
1344
|
|
|
1250
|
-
let all = await
|
|
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
|
-
|
|
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) &&
|
|
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)
|