Vo videu ukazujem ako funguje párovanie platieb a vysvetľujem script.
Krátke vysvetlenie na mojom prípade:
Pri pohyboch na účte máme 2 typy platieb – prichádzajúce(+) a odchádzajúce(-)
-Ak je platba odchádzajúca jedná sa buď o výdavok alebo faktúra kolegovi
-Ak je platba prichádzajúca jedná sa buď o Faktúru od klienta alebo Zálohovú faktúru od klienta
-Odchádzajúce platby sú párované podľa ceny
-Prichádzajúce platby sú párované podľa variabilného symbola
Jedná sa o prepojenie na viacero záznamov teda v scripte je prepojenie = [{data prepojenia1},{data prepojenia2}], miesto klasického prepojenie = {data prepojenia}.
Celá udalosť sa skladá z 2 scriptov : Prvý – Query na DS dokumentov, ktoré chceme párovať
Druhý – Na zaklade dokumentu ktorý nam prvý skript nájde vytvárame prislúchajúce prepojenie v našom dokumente transakcie + meníme stav párovaného dokumentu (uhradené, čiastočne uhradené, prehradené) a uhradenú čiastku.
Screenshot udalosti:


Skript 1:
const data = input.inputDocument.data;
if (data.objem < 0) {
// zaporne / platba
const cena = Math.abs(data.objem);
return {
command: 'query',
payload: {
$or: [
{
documentTypeId: '677f9a994a2bd8092a6ee3b3', // vydavok
'data.cenaSDph': cena,
'data.stav': { $ne: 'uhradene' }
},
{
documentTypeId: '67a851cdaecce84b3cc4ad2b', // FA kolega
'data.spoluSDph': cena,
'data.stav': { $ne: 'uhradene' }
}
]
}
};
} else {
// kladne / prijate peniaze
return {
command: 'query',
payload: {
$or: [
{
documentTypeId: '677aa866f6f7ff319d4383b9', // FA klient
'data.platobneUdaje.variabilnySymbol': data.vs,
'data.stav': { $nin: ['uhradene', 'prehradene'] }
},
{
documentTypeId: '677afa62f6f7ff319d438641', // ZF Klient
'data.platobneUdaje.variabilnySymbol': data.vs,
'data.stav': { $nin: ['uhradene', 'prehradene'] }
}
]
}
};
}
Skript 2:
if (!input.previousCommandOutput || input.previousCommandOutput.length === 0) {
return { command: 'noop' };
}
const dokument = input.previousCommandOutput;
const documentTypeId = dokument[0].documentTypeId;
const data = input.inputDocument.data;
// Kontrola, či dokument nie je starší ako 2 mesiace (60 dní v milisekundách)
const datumPlatby = data.datum;
const dnesnyDatum = Date.now();
const _2mesiaceVMs = 60 * 24 * 60 * 60 * 1000;
const _datum2mesiaceDozadu = dnesnyDatum - _2mesiaceVMs;
if (_datum2mesiaceDozadu > datumPlatby) {
return { command: 'noop' };
}
switch (documentTypeId) {
case '677f9a994a2bd8092a6ee3b3': { // Vydavok
const vydavok = dokument[0];
const prepojenie = {
_uid: vydavok._id,
_id: vydavok.data._id,
polozka: vydavok.data.polozka
};
const vydavokArray = Array.isArray(data.vydavok) ? [...data.vydavok] : [];
vydavokArray.push(prepojenie);
return {
command: 'updateMany',
payload: [
{
filter: { _id: input.inputDocument._id },
update: {
'data.vydavok': vydavokArray,
'data.sparovane': true
}
},
{
filter: { _id: vydavok._id },
update: { 'data.stav': 'uhradene' }
}
]
};
}
case '67a851cdaecce84b3cc4ad2b': { // FA kolega
const kolegaDoc = dokument[0];
const faKolegaData = {
_uid: kolegaDoc._id,
_id: kolegaDoc.data._id
};
const uhradene = Math.abs(data.objem);
const faKolegaArray = Array.isArray(data.faKolega) ? [...data.faKolega] : [];
faKolegaArray.push(faKolegaData);
return {
command: 'updateMany',
payload: [
{
filter: { _id: input.inputDocument._id },
update: {
'data.faKolega': faKolegaArray,
'data.sparovane': true
}
},
{
filter: { _id: kolegaDoc._id },
update: {
'data.stav': 'uhradene',
'data.doterazUhradene': uhradene
}
}
]
};
}
case '677aa866f6f7ff319d4383b9': { // FA klient
const faktura = dokument[0];
const fakturaData = faktura.data;
const faKlientData = {
_uid: faktura._id,
_id: fakturaData._id,
sumar: fakturaData.sumar
};
const suma = Math.abs(data.objem);
const celkovaSuma = fakturaData.sumar?.celkom ?? 0;
const zaplateneDoteraz = fakturaData.sumar?.uhradene ?? 0;
const noveUhradene = zaplateneDoteraz + suma;
const noveZostava = celkovaSuma - noveUhradene;
let stav = 'ciastocneUhradene';
if (noveZostava === 0) stav = 'uhradene';
else if (noveZostava < 0) stav = 'prehradene';
const faKlientArray = Array.isArray(data.faKlient) ? [...data.faKlient] : [];
faKlientArray.push(faKlientData);
return {
command: 'updateMany',
payload: [
{
filter: { _id: input.inputDocument._id },
update: {
'data.faKlient': faKlientArray,
'data.sparovane': true
}
},
{
filter: { _id: faktura._id },
update: {
'data.stav': stav,
'data.sumar.uhradene': noveUhradene,
'data.sumar.zostavaUhradit': noveZostava
}
}
]
};
}
case '677afa62f6f7ff319d438641': { // ZF klient
const zalohova = dokument[0];
const zalohovaData = zalohova.data;
const zfKlientSuma = Math.abs(data.objem);
const zfCelkovaSuma = zalohovaData.sumar?.celkom ?? 0;
const zfZaplateneDoteraz = zalohovaData.sumar?.uhradene ?? 0;
const zfNoveUhradene = zfZaplateneDoteraz + zfKlientSuma;
const zfNoveZostava = zfCelkovaSuma - zfNoveUhradene;
let zfStav = 'ciastocneUhradena';
if (zfNoveZostava === 0) zfStav = 'uhradena';
else if (zfNoveZostava < 0) zfStav = 'prehradene';
const zfKlientData = {
_uid: zalohova._id,
_id: zalohovaData._id,
suma: zfKlientSuma
};
const zfKlientArray = Array.isArray(data.zfKlient) ? [...data.zfKlient] : [];
zfKlientArray.push(zfKlientData);
return {
command: 'updateMany',
payload: [
{
filter: { _id: input.inputDocument._id },
update: {
'data.zfKlient': zfKlientArray,
'data.sparovane': true
}
},
{
filter: { _id: zalohova._id },
update: {
'data.stav': zfStav,
'data.sumar.uhradene': zfNoveUhradene,
'data.sumar.zostavaUhradit': zfNoveZostava
}
}
]
};
}
}