js-klikvet-logic-worker 2.3.17 → 2.3.18

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.
@@ -1,7 +1,8 @@
1
1
  //@ts-check
2
- let assert = require('assert');
3
-
4
- require('dotenv').config()
2
+ import assert from 'assert'
3
+ import { KlikvetLogicWorker } from './worker.mjs'
4
+ import dotenv from "dotenv"
5
+ dotenv.config()
5
6
  assert(process.env.VETERINE, "določi veterine v .env")
6
7
 
7
8
  const veterine = process.env.VETERINE.split(',').map(a => a.trim()).filter(a => !!a)
@@ -13,7 +14,7 @@ if (!veterine.length) {
13
14
  }
14
15
 
15
16
  if (gsm) console.log("GSM za SMSe", gsm)
16
- console.log('veterine',veterine);
17
17
 
18
- const { KlikvetLogicWorker } = require('./worker');
19
18
  new KlikvetLogicWorker({ veterine, gsm }).start()
19
+
20
+
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "js-klikvet-logic-worker",
3
- "version": "2.3.17",
3
+ "version": "2.3.18",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "dependencies": {
7
- "cry-db": "^2.1.24",
8
- "cry-ebus2": "^3.0.9",
9
- "cry-helpers": "^2.1.52",
10
- "cry-klikvet-logic": "^0.10.120",
7
+ "cry-db": "^2.2.4",
8
+ "cry-ebus2": "^3.1.23",
9
+ "cry-helpers": "^2.1.103",
10
+ "cry-klikvet-logic": "^0.10.306",
11
11
  "cry-local-query": "^1.0.12",
12
- "dotenv": "^16.0.1",
12
+ "dotenv": "^16.3.1",
13
13
  "lodash.clonedeep": ">=4.5.0",
14
- "make-dir": "^3.1.0"
14
+ "make-dir": "^4.0.0"
15
15
  },
16
16
  "devDependencies": {
17
- "@types/lodash.clonedeep": "^4.5.7",
18
- "chai": "^4.3.6",
19
- "mocha": "^10.0.0"
17
+ "@types/lodash.clonedeep": "^4.5.9",
18
+ "chai": "^4.3.10",
19
+ "mocha": "^10.2.0"
20
20
  },
21
21
  "scripts": {
22
22
  "test": "mocha"
@@ -2,21 +2,21 @@
2
2
 
3
3
  const DEFAULT_SERVICE_NAME = 'klikvet'
4
4
 
5
- const Helpers = require('cry-helpers');
6
- const logic = require('cry-klikvet-logic');
7
- const { Worker, Client } = require('cry-ebus2')
8
5
  /** @type {any} */
9
- const assert = require('assert');
10
- const clonedeep = require('lodash.clonedeep');
11
- const Mongo = require('cry-db').Mongo;
12
- const packageJson = require('./package.json');
13
- const makeDir = require('make-dir');
14
- const fs = require('fs');
15
- const path = require('path');
6
+ import assert from 'assert'
7
+ import * as logic from 'cry-klikvet-logic'
8
+ import clonedeep from 'lodash.clonedeep'
9
+ import packageJson from './package.json' assert { type: "json" }
10
+ import makeDir from 'make-dir'
11
+ import fs from 'fs'
12
+ import path from 'path'
13
+ import { Worker, Client } from 'cry-ebus2'
14
+ import { Mongo } from 'cry-db'
15
+ import { arrayToObject, dedup, Log, serialize } from 'cry-helpers'
16
16
 
17
17
  let client = null
18
18
 
19
- let log = new Helpers.Log(['KLIKVET'])
19
+ let log = new Log(['KLIKVET'])
20
20
  let mongo = undefined
21
21
 
22
22
  /** @typedef {import('cry-klikvet-logic').Blagovnica} Blagovnica */
@@ -55,6 +55,11 @@ async function dbUpdateById(db, collection, _id, update) {
55
55
  return await mongo.updateOne(collection, { _id },update)
56
56
  }
57
57
 
58
+ async function dbUpsert(db, collection, _id, update) {
59
+ mongo.setDb(db)
60
+ return await mongo.upsert(collection, { _id }, update)
61
+ }
62
+
58
63
  async function posljiSmsNarocenemu(data, n, gsm) {
59
64
 
60
65
  let res = (await client.requestPromise('sms', {
@@ -86,9 +91,9 @@ async function posljiSmsNarocenemu(data, n, gsm) {
86
91
  zaKdaj: n.zaKdaj,
87
92
  })
88
93
  if (data.nacin === "samodejno") {
89
- await mongo.upsert("naroceni", { _id: n.narocen._id }, {
90
- smsOddaja_id: _id,
91
- });
94
+ await mongo.upsert("naroceni", { _id: n.narocen._id },
95
+ napaka ? { smsOddaja_napaka: { _id, napaka, } } : { smsOddaja_id: _id, }
96
+ );
92
97
  }
93
98
  }
94
99
  return smsRes;
@@ -122,8 +127,9 @@ async function posljiSmsNCepljenjemu(data, n, gsm) {
122
127
  stranka_id: n.pacient.stranka_id,
123
128
  zaKdaj: n.zaKdaj,
124
129
  })
125
- if (data.nacin === "samodejno") {
126
- n.pacient.cepljenja[n.cepljenje._id].smsOddaja_id = _id;
130
+ if (data.nacin === "samodejno" && !napaka) {
131
+ if (!napaka) n.pacient.cepljenja[n.cepljenje._id].smsOddaja_id = _id;
132
+ else n.pacient.cepljenja[n.cepljenje._id].smsOddaja_napaka = { napaka, _id };
127
133
  await mongo.upsert("pacienti", { _id: n.pacient._id }, {
128
134
  cepljenja: n.pacient.cepljenja
129
135
  })
@@ -178,9 +184,85 @@ async function pobrisiZalogoNaDan(db, datumi) {
178
184
  }
179
185
  }
180
186
 
187
+ async function skladisceLokacije(lokacija_id, tenant) {
188
+ let vsa = await dbFind(tenant, "skladisca", { _deleted: { $exists: false }});
189
+ let moje = vsa.filter(s => s.lokacija_id.toString() === lokacija_id);
190
+ if (moje.length === 0) moje = vsa;
191
+ if (moje.length == 0) console.error("Ni skladišča za lokacijo", lokacija_id);
192
+ if (moje.length > 1) console.error("Več skladišč za lokacijo", lokacija_id);
193
+ return moje?.[0]
194
+ }
195
+
196
+ async function porabeZaDobavnice(data) {
197
+
198
+ let nastavitve = await dbNastavitve(data.tenant);
199
+ let od = new Date(new Date().valueOf() - 365 * 24 * 60 * 60 * 1000);
200
+
201
+ let nerazknijzene = await dbFind(data.tenant, "dobavnice",
202
+ { datumDokumenta: { $gte: od },
203
+ status: { $in: ["izdana","zaračunana"] }, poraba_id: { $exists: false }, _deleted: { $exists: false } },
204
+ { sort: { datumDokumenta: 1 } }
205
+ );
206
+
207
+ let artikel_ids = dedup(nerazknijzene.map(d => d.postavke.map(p => p.artikel_id?.toString())).flat());
208
+
209
+ let artikli = await dbFind(data.tenant, "artikli", {
210
+ _id: { $in: artikel_ids }
211
+ })
212
+ console.log('artikli',artikli);
213
+
214
+ let vse = 0, razknjizene = 0
215
+ let napake = []
216
+ for await (let dobavnica of nerazknijzene) {
217
+ if (!dobavnica.lokacija_id) console.error("dobavnica nima lokacije", dobavnica._id, dobavnica.stevilka)
218
+ try {
219
+ let skladisce_id = dobavnica.skladisce_id || (await skladisceLokacije(dobavnica.lokacija_id, data.tenant));
220
+ vse++
221
+ let poraba = await logic.porabaZaDobavnico({
222
+ dobavnica,
223
+ nastavitve,
224
+ skladisce_id,
225
+ lokacija_id: dobavnica.lokacija_id,
226
+ username: data.username,
227
+ artikli: arrayToObject(artikli, "_id"),
228
+ });
229
+
230
+ if (poraba) {
231
+ poraba.status = "zaključena"
232
+ let p = await dbUpsert(data.tenant, "odprteBlagovnice", poraba._id, poraba);
233
+ console.log('p',p);
234
+
235
+ await dbUpsert(data.tenant, "dobavnice", dobavnica._id, { poraba_id: p._id, poraba_sestavljena: new Date() });
236
+ }
237
+ if (poraba === null) {
238
+ await dbUpsert(data.tenant, "dobavnice", dobavnica._id, { poraba_id: null, poraba_preskocena: new Date() });
239
+ }
240
+ razknjizene++
241
+ } catch (err) {
242
+ napake.push(err)
243
+ }
244
+ }
245
+ return { ok: vse === razknjizene, vse, razknjizene, napake }
246
+ }
247
+
181
248
  async function razknjiziBlagovnice(data)
182
249
  {
183
- let od = new Date(new Date().valueOf() - 60*24*60*60*1000)
250
+ let od = new Date(new Date().valueOf() - 60 * 24 * 60 * 60 * 1000);
251
+
252
+ // poišči tiste, ki bi morale že biti razknjižene, pa niso
253
+ {
254
+ let od = new Date(new Date().valueOf() - 3 * 60 * 24 * 60 * 60 * 1000);
255
+ let vpisane = await dbFind(data.tenant, "blagovnice", { datum: { $gte: od} }, { project: { _id: 1, status: 1 } });
256
+ let idjiVpisanih = vpisane.map(b => b._id.toString());
257
+
258
+ let zaPovrnit = await dbFind(data.tenant, "odprteBlagovnice", { _deleted: { $ne:"hack"}, status: "zaključena", datum: { $gte: od }, _id: { $nin: idjiVpisanih } }, { project: { status: 1, dokumentDobavitelja: 1, vrsta: 1 }});
259
+
260
+ for await (let b of zaPovrnit) {
261
+ console.log("vračam blagovnico v razkljižno",data.tenant,b)
262
+ await dbUpsert(data.tenant, "odprteBlagovnice", b._id, { razknjizena: undefined, _deleted: undefined, _vrnjenoVRazknjizbo: new Date() });
263
+ }
264
+ }
265
+
184
266
  let nerazknijzene = await dbFind(data.tenant, "odprteBlagovnice",
185
267
  { datum: { $gte: od }, status: "zaključena", razknjizena: { $exists: false } },
186
268
  { sort: { datum: 1 } }
@@ -266,7 +348,7 @@ async function registerAllInvoices(data)
266
348
  mongo.setDb(data.tenant)
267
349
  mongo.setAudit({ tenant: data.tenant, app: "klikvet/registerAllInvoices" })
268
350
 
269
- let myquery = { eor: null, leto: { $gte: 2020 } };
351
+ let myquery = { eor: null, negotovinski: { $ne: true}, leto: { $gte: 2022 } };
270
352
  let env = data.env || (await mongo.findOne("nastavitve", {})).okolje
271
353
 
272
354
  let all = await mongo.find("racuni", myquery, { project: { _id: 1 }, limit: 1000, })
@@ -319,6 +401,8 @@ async function registerInvoice(data, kasneje=false)
319
401
  // poišči račun
320
402
  timeoutError = "Db podsistem se ni odzval."
321
403
  let racun = await dbFindById(data.tenant,"racuni",data._id)
404
+ if (racun.negotovinski) return "negotovinski račun ne bo fiskaliziran";
405
+
322
406
  let blagajna = await dbFindById(data.tenant, "blagajne", racun.blagajna_id)
323
407
  if (!blagajna) throw new Error("cannot locate blagajna: "+racun.blagajna_id)
324
408
  let poslovalnica = await dbFindById(data.tenant, "poslovalnice", blagajna.poslovalnica_id)
@@ -463,9 +547,9 @@ async function registerInvoice(data, kasneje=false)
463
547
  let updated = await dbUpdateById(data.tenant, "racuni", data._id, fursObj);
464
548
 
465
549
  try {
466
- let dir = path.join(path.parse(require.main.filename).dir, 'racuni', new Date().getFullYear().toString(), data.tenant)
550
+ let dir = path.join('./racuni', new Date().getFullYear().toString(), data.tenant)
467
551
  !fs.existsSync(dir) && makeDir.sync(dir);
468
- fs.writeFileSync(path.join(dir, racun.stevilka), Helpers.serialize.pack(clonedeep({ ...racun, ...updated}), false));
552
+ fs.writeFileSync(path.join(dir, racun.stevilka), serialize.pack(clonedeep({ ...racun, ...updated}), false));
469
553
  } catch (err) {
470
554
  console.log("napaka pri zapisu izdanega računa na disk",err)
471
555
  }
@@ -565,7 +649,7 @@ async function storno(db,id)
565
649
  };
566
650
 
567
651
 
568
- class KlikvetLogicWorker extends Worker {
652
+ export class KlikvetLogicWorker extends Worker {
569
653
 
570
654
  constructor({ veterine, gsm }, opts) {
571
655
  super(DEFAULT_SERVICE_NAME, opts)
@@ -692,15 +776,20 @@ class KlikvetLogicWorker extends Worker {
692
776
  let pipeline = logic.racunovodji.createAggregationPipeline(data)
693
777
  let podatki = await logic.racunovodji.execPipeline(pipeline.pipeline, data.tenant)
694
778
  let prviZadnji = await logic.racunovodji.getFirstLastBills(data.tenant, pipeline.match)
779
+ let kategorije = await logic.racunovodji.getCategories(data.tenant, pipeline.match)
695
780
  let racuniPravnim = data.racuniPravnim ? await logic.racunovodji.getTaxBills(data.tenant, pipeline.match) : []
696
781
  let racuniOdlozeno = data.racuniOdlozeno ? await logic.racunovodji.getTrrBills(data.tenant, pipeline.match) : []
697
782
  let stornirani = await logic.zakljucekBlagajne.storniraniRacuni(pipeline.match, data.tenant)
698
783
  let placila = await logic.zakljucekBlagajne.sestevekPlacil(data.tenant, data)
699
784
  let pred = await logic.zalogaNaDan({ datum: new Date(new Date(data.odDne).valueOf()-24*60*60*1000), tenant:data.tenant})
700
785
  let po = await logic.zalogaNaDan({ datum: new Date(data.doDne), tenant: data.tenant })
786
+ let predKonsignacija = await logic.zalogaNaDan({ datum: new Date(new Date(data.odDne).valueOf() - 24 * 60 * 60 * 1000), tenant: data.tenant, samoKonsignacija: true })
787
+ let poKonsignacija = await logic.zalogaNaDan({ datum: new Date(data.doDne), tenant: data.tenant, samoKonsignacija: true })
701
788
  let spremembaZaloge = await logic.spremembaZalogeZaObdobje({ ...data, poVrstah: true })
789
+ let spremembaKonsignacije = await logic.spremembaZalogeZaObdobje({ ...data, poVrstah: true, samoKonsignacija: true })
702
790
  let vsotaDobav = await logic.VsotaDobavZaObdobje({ ...data })
703
- return { podatki, racuniOdlozeno, racuniPravnim, stornirani, placila, zaloga: {pred, po}, spremembaZaloge, vsotaDobav, prviZadnji };
791
+
792
+ return { podatki, racuniOdlozeno, racuniPravnim, kategorije, stornirani, placila, zaloga: { pred, po }, konsignacija: { pred: predKonsignacija, po: poKonsignacija }, spremembaZaloge, spremembaKonsignacije, vsotaDobav, prviZadnji };
704
793
  }
705
794
 
706
795
  if (data.operation === 'zakljucek-blagajne') {
@@ -999,6 +1088,13 @@ class KlikvetLogicWorker extends Worker {
999
1088
  assert(data.tenant, "must specify tenant")
1000
1089
  return await razknjiziBlagovnice(data);
1001
1090
  };
1091
+
1092
+ if (data.operation === "porabe-za-dobavnice") {
1093
+ assert(data.tenant, "must specify tenant")
1094
+ let ret = await porabeZaDobavnice(data);
1095
+ await razknjiziBlagovnice(data);
1096
+ return ret;
1097
+ };
1002
1098
 
1003
1099
  if (data.operation === "razknjizi-dobavnico") {
1004
1100
  assert(data._id, "must specify _id of Dobavnica")
@@ -1063,6 +1159,8 @@ class KlikvetLogicWorker extends Worker {
1063
1159
 
1064
1160
  if (data.operation === "zaloga-na-dan") {
1065
1161
  assert(data.tenant, "must specify tenant")
1162
+ console.log('data',data);
1163
+
1066
1164
  return await logic.zalogaNaDan(data)
1067
1165
  };
1068
1166
 
@@ -1150,7 +1248,7 @@ class KlikvetLogicWorker extends Worker {
1150
1248
  if (data.operation === "poslji-smse-cepljenim") {
1151
1249
  assert(data.tenant, "must specify tenant")
1152
1250
  assert(data.nacin, "must specify nacin")
1153
- let cepiti = await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date() });;
1251
+ let cepiti = await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date(), dniPrej: data.dniPrej });;
1154
1252
  if (!cepiti?.length) return undefined;
1155
1253
  let res = []
1156
1254
  for await (let n of cepiti) {
@@ -1165,7 +1263,7 @@ class KlikvetLogicWorker extends Worker {
1165
1263
 
1166
1264
  if (data.operation === "seznam-cepljenj-za-sms") {
1167
1265
  assert(data.tenant, "must specify tenant")
1168
- return await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date() });;
1266
+ return await logic.smsCepljenjaNaDan({ tenant: data.tenant, dan: data.dan || new Date(), dniPrej: data.dniPrej });;
1169
1267
  };
1170
1268
 
1171
1269
 
@@ -1174,11 +1272,82 @@ class KlikvetLogicWorker extends Worker {
1174
1272
  return await logic.smsNaroceniNaDan({ tenant: data.tenant, dan: data.dan || new Date() });;
1175
1273
  };
1176
1274
 
1275
+ if (data.operation === "potrditev-brejosti") {
1276
+ assert(data.tenant, "must specify tenant")
1277
+ assert(data._id, "must specify _id")
1278
+ assert(data.kdo, "must specify kdo")
1279
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1280
+ if (osemenitevGoveda) {
1281
+ let update = logic.updatePotrditevBrejosti(osemenitevGoveda, data.breja, data.kdo);
1282
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1283
+ }
1284
+ return undefined
1285
+ }
1286
+
1287
+ if (data.operation === "v-presusitev") {
1288
+ assert(data.tenant, "must specify tenant")
1289
+ assert(data._id, "must specify _id")
1290
+ assert(data.kdo, "must specify kdo")
1291
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1292
+ if (osemenitevGoveda) {
1293
+ let update = logic.updatePresusitve(osemenitevGoveda, data.presusitev, data.kdo);
1294
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1295
+ }
1296
+ return undefined
1297
+ }
1298
+
1299
+ if (data.operation === "status-osemenitve") {
1300
+ assert(data.tenant, "must specify tenant")
1301
+ assert(data._id, "must specify _id")
1302
+ assert(data.kdo, "must specify kdo")
1303
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1304
+ if (osemenitevGoveda) {
1305
+ let update = logic.updateStatusOsemenitve(osemenitevGoveda, data.status, data.kdo);
1306
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1307
+ }
1308
+ return undefined
1309
+ }
1310
+
1311
+ if (data.operation === "opomba-rejca-osemenitve") {
1312
+ assert(data.tenant, "must specify tenant")
1313
+ assert(data._id, "must specify _id")
1314
+ assert(data.kdo, "must specify kdo")
1315
+ let osemenitevGoveda = await dbFindById(data.tenant || data.db, "osemenitevGoveda", data._id);
1316
+ if (osemenitevGoveda) {
1317
+ let update = logic.updateOpombeRejca(osemenitevGoveda, data.opomba, data.kdo);
1318
+ return await dbUpdateById(data.tenant || data.db, "osemenitevGoveda", data._id, update)
1319
+ }
1320
+ return undefined
1321
+ }
1322
+
1323
+ if (data.operation === "podatki-rejca") {
1324
+ assert(data.tenant, "must specify tenant")
1325
+ assert(data.rejciGeslo, "must specify rejciGeslo")
1326
+ assert(data.rejciKoda, "must specify rejciKoda")
1327
+ return await logic.podatkiRejca(data);
1328
+ };
1329
+
1330
+ if (data.operation === "zaracunaj-dobavnice") {
1331
+ assert(data.tenant, "must specify tenant")
1332
+ assert(data.dobavnice_ids, "must specify dobavnice_ids");
1333
+ assert(data.lokacija_id, "must specify lokacija_id");
1334
+ assert(data.naprava_id, "must specify naprava_id");
1335
+ assert(data.izdal, "must specify izdal");
1336
+ return await logic.zaracunajDobavnice(data);
1337
+ };
1338
+
1339
+ if (data.operation === "anonimiziraj-podatke") {
1340
+ assert(data.tenant, "must specify tenant")
1341
+ assert(["demo", "demo2","dev","test"].includes(data.tenant), "cnly valid for demo, dev, test");
1342
+ assert(data.letNazaj, "must specify letNazaj");
1343
+
1344
+ return await logic.anonimizirajPodatke(logic.createMongoForAnonimizacija(data.tenant), parseInt(data.letNazaj.toString()||"1"));
1345
+ };
1346
+
1177
1347
  assert(false, 'unsupported operation ' + data.operation)
1178
1348
  }
1179
1349
 
1180
1350
  }
1181
1351
 
1182
- module.exports = { KlikvetLogicWorker }
1183
1352
 
1184
1353