1221 lines
57 KiB
JavaScript
1221 lines
57 KiB
JavaScript
|
|
$inv.cInv = function (ev) {
|
|
let tr = $(this).closest('tr');
|
|
ev.stopPropagation();
|
|
if (tr.is('.selected') === false) {
|
|
return;
|
|
} else if ($fis.isAuth('fds_inv', 2) === false) {
|
|
return;
|
|
}
|
|
$inv.cInv2({ id: ev.data.id });
|
|
};
|
|
$inv.rMn = (o) => {
|
|
let m = [{ lbl: $ict.req, itm: [] }];
|
|
if (bool(o, false) === true && $fis.isAuth('fds_inv', 2) === true) {
|
|
Array.prototype.push.apply(m[0].itm, [
|
|
{ lbl: $rct.crI, fnc: $inv.ccInv, data: { typ: 'r' } }
|
|
, { lbl: $rct.crII, fnc: $inv.ccInv, data: { typ: 'i' } }
|
|
]);
|
|
}
|
|
m.push({ lbl: $ict.rel, fnc: $inv.rReload });
|
|
return $('#topbar').ocmsmenu(m);
|
|
};
|
|
$inv.iMnr = (ix) => {
|
|
let f = booln(ix.isFinal, true), id = ix.Id, fds = booln(ix.fds, false);
|
|
let m = [
|
|
{ glyph: 'glyphicon-menu-left', fnc: () => { $fis.frm_edit().remove(); } },
|
|
{ lbl: $ict.inv, itm: [] }, { lbl: $ict.rem, itm: [] }
|
|
];
|
|
if (f === false && $fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.ced, fnc: $inv.clCntInv });
|
|
} else if ($fis.isAuth('fds_inv', 1) === true) {
|
|
m[1].itm.push({ lbl: $ict.dsp, fnc: () => $inv.disp(id, 'inv') })
|
|
}
|
|
if (fds === true && f === true && $fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.storno, fnc: () => $inv.storno(id, fds) });
|
|
m[1].itm.push({ lbl: $ict.credit, fnc: () => $inv.credit(id, fds) });
|
|
}
|
|
if (f === true && $fis.isAuth('fds_reminder', 2) === true) {
|
|
m[2].itm.push({ lbl: $ict.remd, fnc: () => $inv.ccRem(id, ix.InvoiceId) });
|
|
m[2].itm.push({ lbl: $ict.remlst, fnc: () => $inv.dspRem(id) });
|
|
}
|
|
if (f === true && $fis.isAuth('fds_reminder', 2) === true && booln(ix.IsSent, false) === false) {
|
|
m[2].itm.push({ lbl: $ict.srs, fnc: () => $inv.srs(id) });
|
|
}
|
|
m.push({ lbl: $ict.rel, fnc: $inv.rReload });
|
|
return $('#topbar').ocmsmenu(m);
|
|
};
|
|
$inv.iMn = (ix) => {
|
|
let f = booln(ix.isFinal, true), id = ix.Id, fds = booln(ix.fds, false);
|
|
let m = [{ glyph: 'glyphicon-menu-left', fnc: () => { $fis.frm_edit().remove(); } },
|
|
{ lbl: $ict.inv, itm: [] }, { lbl: $ict.rem, itm: [] }
|
|
];
|
|
if (f === false && $fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.ced, fnc: () => { $inv.cntInv({ id: id }); } });
|
|
} else if ( $fis.isAuth('fds_inv', 1) === true) {
|
|
m[1].itm.push({ lbl: $ict.dsp, fnc: () => $inv.disp(id, 'inv') })
|
|
}
|
|
if ($fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.storno, fnc: () => $inv.storno(id, fds) })
|
|
m[1].itm.push({ lbl: $ict.credit, fnc: () => $inv.credit(id, fds) });
|
|
}
|
|
if (f === true && booln(ix.IsPayed, false) === false) {
|
|
if ($fis.isAuth('fds_reminder', 2) === true) {
|
|
m[2].itm.push({ lbl: $ict.remd, fnc: () => $inv.ccRem(id, ix.InvoiceId) });
|
|
}
|
|
if ($fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.setpyd, fnc: () => $inv.setPyd(id) });
|
|
}
|
|
} else if (f === true && booln(ix.IsPayed, false) === true && (ix.PaymentStatus || '') === 'm') {
|
|
if ($fis.isAuth('fds_inv', 2) === true) {
|
|
m[1].itm.push({ lbl: $ict.setupd, fnc: () => $inv.setUpd(id) });
|
|
}
|
|
}
|
|
if ($fis.isAuth('fds_reminder', 2) === true) {
|
|
m[2].itm.push({ lbl: $ict.remlst, fnc: () => $inv.dspRem(id) });
|
|
}
|
|
if (f === true && $fis.isAuth('fds_inv', 2) === true && booln(ix.IsSent, false) === false) {
|
|
m[1].itm.push({ lbl: $ict.sis, fnc: () => $inv.sis(id) });
|
|
}
|
|
if (fds === false) {
|
|
m[1].itm.push({ lbl: $ict.mfr, fnc: () => $inv.mfrrel(id) });
|
|
}
|
|
return $('#topbar').ocmsmenu(m);
|
|
}
|
|
$inv.eM = (r, re, opt) => {
|
|
let m = [];
|
|
if (booln(r, false) === true || booln(re, false) === true) {
|
|
m.push({ glyph: 'glyphicon-menu-left', fnc: () => { $fis.lf(true); $fis.frm_edit().remove(); } });
|
|
}
|
|
if ((opt || '').split(',').includes('iss') === true) {
|
|
m.push({ lbl: $ict.iss, fnc: $inv.ssave });
|
|
}
|
|
if ((opt || '').split(',').includes('ctp') === true) {
|
|
m.push({ lbl: $ict.ctp, fnc: $inv.sctp });
|
|
}
|
|
if ((opt || '').split(',').includes('p13b') === true) {
|
|
m.push({ lbl: $ict.p13b, fnc: $inv.sp13b });
|
|
}
|
|
if (booln(r, false) === true) {
|
|
m.push({ lbl: $ict.rel, fnc: $inv.rReload });
|
|
}
|
|
return $('#topbar').ocmsmenu(m); /* empty Array => empty menu */
|
|
};
|
|
$inv.cInv2 = function (data) {
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
if (o) { o.ft.rwText($rct.rq1); }
|
|
let mainfnc = () => {
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/get'), timeout: 60, data: { id: data.id, mode: 'r' }, success: (response) => {
|
|
//console.debug(response);
|
|
response.admin = response.admin || {};
|
|
let lf = $fis.lf(true).aC('fix').rC('hd');
|
|
$fis.frm_edit().IN();
|
|
$inv.eM(true, true);
|
|
if ((response.requests || []).length < 1) {
|
|
lf.aC('fix').text($rct.nd);
|
|
} else {
|
|
|
|
$$.dc('lh', lf, $rct.mdl);
|
|
let iv = $$.d(), rq = $$.ul({ class: 'rql' }).data({ search: data.id, parent: response.admin.parent }).appendTo(lf), rqa = {}, cl = $rcol.req.lbl();
|
|
$.each(response.requests || [], function (ri, rx) {
|
|
let rli = $$.li({ class: 'cli rli' }).data($.extend({}, rx)).appendTo(rq);
|
|
let lihd = $$.dc('lihd', rli).addClass(rx.state);
|
|
if (booln(rx.open, false) === true) {
|
|
lihd.append($$.sc('cbox').click(() => {
|
|
rli.tC('checked');
|
|
iv.find('li').rC('checked');
|
|
if (rli.is('.checked') === true) {
|
|
$inv.rMn(rx.open);
|
|
} else {
|
|
$inv.eM(true);
|
|
}
|
|
}));
|
|
}
|
|
lihd.append([$$.sc('eid', rx.ExternalId), $$.sc('nme', rx.Name)]);
|
|
$$.dc('lidt', rli).append([$$.dc('rqs').append([$$.s(cl.State + ': '), $$.s($rct.sts[rx.State || '-'])]), $$.dc('ivn').append([$$.s(cl.InvoiceId + ': '), $$.s(rx.InvoiceId || '- -')]), $$.dc('wda').append([$$.s(cl.WorkDoneAt + ': '), $$.s(fdt(rx.WorkDoneAt, 'dd.MM.yyyy'))])]);
|
|
rqa[rx.Id] = rli;
|
|
});
|
|
if ((response.inv || []).length > 0) {
|
|
$$.dc('lh', lf, $rct.invs);
|
|
iv = $$.ul({ class: 'ivl' }).appendTo(lf); /* first assignment to iv is fake, just to prevent issues */
|
|
$.each(response.inv || [], (ii, ix) => {
|
|
let ili = $$.li({ class: 'cli ili' }).data($.extend({}, ix)).appendTo(iv);
|
|
let lihd = $$.dc('lihd', ili).addClass(ix.invstatus);
|
|
if (booln(ix.isFinal, true) === false) {
|
|
lihd.append($$.sc('cbox').click(() => {
|
|
if ((ix.Id || '') !== '') {
|
|
ili.tC('checked').siblings().rC('checked'); rq.find('li').rC('checked');
|
|
if (ili.is('.checked') === true) {
|
|
$inv.iMnr(ix);
|
|
} else {
|
|
$inv.eM(true); /* empty menu */
|
|
}
|
|
}
|
|
}));
|
|
} else if (['', 'dft'].indexOf(ix.invstatus) < 0) {
|
|
lihd.append($$.sc('dli').click(function () { $inv.disp(ix.Id, 'inv'); }));
|
|
}
|
|
lihd.append($$.sc('nme', ix.DocumentName || ix.Id));
|
|
$$.dc('lidt', ili).append([$$.dc('wda').append([$$.s(fdt(ix.DateCreated, 'dd.MM.yyyy'))]), $$.d().text($ict.iSt[ix.invstatus] || ix.invstatus)]);
|
|
});
|
|
}
|
|
|
|
}
|
|
}, complete: () => {
|
|
if (o) { o.c.trigger('modal_close'); }
|
|
}
|
|
});
|
|
};
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/pget'), timeout: 90, data: { id: data.id }, success: (r1) => {
|
|
if (o) { o.ft.rwText($rct.rq2); }
|
|
mainfnc();
|
|
}, error: () => {
|
|
if (confirm($rct.rq1f)) {
|
|
if (o) { o.ft.rwText($rct.rq2); }
|
|
mainfnc();
|
|
} else {
|
|
if (o) { o.c.trigger('modal_close'); }
|
|
}
|
|
}
|
|
});
|
|
};
|
|
$inv.ccInv = function (ev) { //normale rechnung
|
|
let data = ev.data || {}, typ = data.typ || 'r';
|
|
let lf = $fis.lf(), rql = lf.children('ul.rql'), parent = rql.data('parent');
|
|
let selli = [];
|
|
rql.find('li.rli.checked').each(function () {
|
|
selli.push($(this).data('Id'));
|
|
});
|
|
if (selli.length < 1) { // abort if none selected
|
|
alert($rct.dnS);
|
|
return;
|
|
}else if (typ === 'i' && selli.length > 1) { // abort if intermediate invoice and several selected
|
|
alert($rct.dII);
|
|
return;
|
|
}
|
|
let edf = $fis.frm_edit(), frm = $$.dc('invoice_layout', edf).append($$.dc('btn sprev').click($inv.sprev));
|
|
let ww = $fis.cf().width() > (frm.width() + lf.width() + 20);
|
|
lf.tC('fix', ww).tC('hd', !ww);
|
|
$inv.eM(false, true);
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
o.ft.rwText($rct.rq2);
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/iget'), timeout: 60, data: { id: parent, mode: 'ful', typ: typ, sel: selli.join(',') }, success: (response) => {
|
|
//console.debug(response);
|
|
|
|
let rq = $$.dc('srq', frm);
|
|
let rif = $$.tblset({ class: 'invi' }, rq);
|
|
rif.bdy.remove();
|
|
rif.ft = $$[0]('tfoot');
|
|
response.admin = response.admin || {};
|
|
response.admin.p13b = bool(response.admin.p13b || '', (((response.inv || {}).InvoiceOptions || '').split(',').includes('§13b') === true));
|
|
rif.tbl.data($.extend({ new: {}, sms: {}, itm: {} }, { admin: response.admin, companies: response.companies, locations: response.locations }));
|
|
let thr = $$.tr(rif.hd).aC('shd').append([$$.th().aC('aux')]); /* header row for items */
|
|
$rct.invHR.forEach(h => $$.th(thr, h));
|
|
rif.tbl.on('fds.inv', $inv.invSumUpdate);
|
|
$.each(response.requests || [], function (ri, rx) {
|
|
let srqid = rx.Id || 0;
|
|
if (srqid !== 0) {
|
|
let worknotes = $inv.worknotes(rx);
|
|
rx.text = response.admin.type === 'i' ? ($rct.req + (jine([rx.ExternalId, rx.Name], ': ').eine(' ', ''))) : (jine([jine([fdt(rx.WorkDoneAt, 'dd.MM.yy'), rx.ExternalId], ' - ' + $rct.req + ' '), worknotes.ne(rx.Name)], ': \n'));
|
|
let bdy = $$.tbody(rif.tbl).data($.extend({}, rx));
|
|
$inv.rendersrq.call(bdy);
|
|
}
|
|
});
|
|
|
|
/* add an empty */
|
|
let atr = $$.tr($$.tbody(rif.tbl), { class: 'placeholder' }).data({ net_val: 0, vat_val: 0, svcnet_val: 0, svcvat_val: 0, net: 0 });
|
|
$inv.rrw.call(atr);
|
|
|
|
rif.ft.appendTo(rif.tbl);
|
|
|
|
|
|
let admin = response.admin || {}, fm = (cls, txt, nme, hd, dta) => {
|
|
let fr = $$.dc('inpfrm', frm).aC(cls).append(typeof hd === 'string' ? $$.dc('ahd', hd) : (hd > 0 ? $$.dc('ahd', $rct.frm[nme]) : null)), fc = $$.dc('content', fr).rwText(txt);
|
|
$$.dc('axf', fr).append($$.dc('ibtn edit').data('dialog', $rct.frm[nme]).append(gi('pencil')).click($.extend({ t: fc, nme: nme, change: (nv) => { rif.tbl.data('new')[nme] = nv; } }, dta), $inv.eHtml));
|
|
rif.tbl.data('new')[nme] = txt;
|
|
};
|
|
fm('tfrm', admin.invoicetitle, 'invoicetitle', 0, null);
|
|
fm('adrfrm', admin.invoiceaddress, 'invoiceaddress', 0, null);
|
|
fm('locfrm', '', 'loc', 1, { list: deepCopy(response.locations), lbl: 'ref', property: 'address' });
|
|
fm('emailfrm', admin.invoiceemail, 'invoiceemail', 0, null);
|
|
$$.dc('sndfrm', frm).append($$.dc('content').text(admin.sender));
|
|
|
|
let admtxt, admlbl;
|
|
if (admin.provisionend) {
|
|
admlbl = admin.provisionstart ? $rct.provP : $rct.provD;
|
|
admtxt = admin.provisionstart ? (fdt(admin.provisionstart, 'dd.MM.yyyy') + ' - ' + fdt(admin.provisionend, 'dd.MM.yyyy')) : fdt(admin.provisionend, 'dd.MM.yyyy');
|
|
}
|
|
fm('admfrm', admtxt, 'provisionperiod', admlbl, 1, null);
|
|
rif.tbl.data('new').CustomValues = admin.CustomValues || '';
|
|
$$.dc('inpfrm ctpfrm', frm).text(jObj(admin.CustomValues, 'contactName'));
|
|
//adm = $$.dc('admfrm', frm), admc = $$.dc('content', adm),
|
|
|
|
rif.tbl.children('tbody').each($inv.bdysort);
|
|
rif.tbl.trigger('fds.inv'); /* trigger calculations */
|
|
|
|
$inv.eM(false, true, 'iss,p13b,ctp');
|
|
}, complete: () => {
|
|
o.c.trigger('modal_close');
|
|
}
|
|
});
|
|
};
|
|
$inv.ccStInv = function (ev) { // Stornorechnung
|
|
let data = ev.data || {};
|
|
let lf = $fis.lf(), oldinv = data.id;
|
|
|
|
let frm = $$.dc('invoice_layout', $fis.frm_edit()).append($$.dc('btn sprev').click($inv.sprev));
|
|
let ww = $fis.cf().width() > (frm.width() + lf.width() + 20);
|
|
lf.tC('fix', ww).tC('hd', !ww);
|
|
$inv.eM(false, true);
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
o.ft.rwText($ict.iq1);
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/pget'), timeout: 90, data: { id: data.id }, success: (response) => {
|
|
if (o) { o.ft.rwText($ict.iq2); }
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/icget'), timeout: 60, data: { id: oldinv }, success: (response) => {
|
|
//console.debug(response);
|
|
|
|
let rq = $$.dc('srq', frm);
|
|
let rif = $$.tblset({ class: 'invi' }, rq);
|
|
rif.bdy.remove();
|
|
rif.ft = $$[0]('tfoot');
|
|
response.admin = response.admin || {};
|
|
response.admin.p13b = bool(response.admin.p13b || '', (((response.inv || {}).InvoiceOptions || '').split(',').includes('§13b') === true));
|
|
rif.tbl.data($.extend({ new: {}, sms: {}, itm: {} }, { admin: response.admin, companies: response.companies, locations: response.locations }));
|
|
let thr = $$.tr(rif.hd).aC('shd').append([$$.th().aC('aux')]); /* header row for items */
|
|
$rct.invHR.forEach(h => $$.th(thr, h));
|
|
rif.tbl.on('fds.inv', $inv.invSumUpdate);
|
|
$.each(response.requests || [], function (ri, rx) {
|
|
let srqid = rx.Id || 0;
|
|
if (srqid !== 0) {
|
|
let worknotes = $inv.worknotes(rx);
|
|
rx.text = response.admin.type === 'i' ? ($rct.req + (jine([rx.ExternalId, rx.Name], ': ').eine(' ', ''))) : (jine([fdt(rx.WorkDoneAt, 'dd.MM.yy') + worknotes.ne(rx.Name)], ': '));
|
|
let bdy = $$.tbody(rif.tbl).data($.extend({}, rx));
|
|
$inv.rendersrq.call(bdy);
|
|
}
|
|
});
|
|
|
|
/* add an empty */
|
|
let atr = $$.tr($$.tbody(rif.tbl), { class: 'placeholder' }).data({ net_val: 0, vat_val: 0, svcnet_val: 0, svcvat_val: 0, net: 0 });
|
|
$inv.rrw.call(atr);
|
|
|
|
rif.ft.appendTo(rif.tbl);
|
|
|
|
|
|
let admin = response.admin || {}, fm = (cls, txt, nme, hd, dta) => {
|
|
let fr = $$.dc('inpfrm', frm).aC(cls).append(typeof hd === 'string' ? $$.dc('ahd', hd) : (hd > 0 ? $$.dc('ahd', $rct.frm[nme]) : null)), fc = $$.dc('content', fr).rwText(txt);
|
|
$$.dc('axf', fr).append($$.dc('ibtn edit').data('dialog', $rct.frm[nme]).append(gi('pencil')).click($.extend({ t: fc, nme: nme, change: (nv) => { rif.tbl.data('new')[nme] = nv; } }, dta), $inv.eHtml));
|
|
rif.tbl.data('new')[nme] = txt;
|
|
};
|
|
fm('tfrm', admin.invoicetitle, 'invoicetitle', 0, null);
|
|
fm('adrfrm', admin.invoiceaddress, 'invoiceaddress', 0, null);
|
|
fm('locfrm', admin.provisionlocation, 'loc', 1, { list: deepCopy(response.locations), lbl: 'ref', property: 'address' });
|
|
fm('emailfrm', admin.invoiceemail, 'invoiceemail', 0, null);
|
|
$$.dc('sndfrm', frm).append($$.dc('content').text(admin.sender));
|
|
|
|
let admtxt, admlbl;
|
|
if (admin.provisionend) {
|
|
admlbl = admin.provisionstart ? $rct.provP : $rct.provD;
|
|
admtxt = admin.provisionstart ? (fdt(admin.provisionstart, 'dd.MM.yyyy') + ' - ' + fdt(admin.provisionend, 'dd.MM.yyyy')) : fdt(admin.provisionend, 'dd.MM.yyyy');
|
|
}
|
|
fm('admfrm', admtxt, 'provisionperiod', admlbl, 1, null);
|
|
rif.tbl.data('new').CustomValues = admin.CustomValues || '';
|
|
$$.dc('inpfrm ctpfrm', frm).text(jObj(admin.CustomValues, 'contactName'));
|
|
//adm = $$.dc('admfrm', frm), admc = $$.dc('content', adm),
|
|
|
|
rif.tbl.children('tbody').each($inv.bdysort);
|
|
rif.tbl.trigger('fds.inv'); /* trigger calculations */
|
|
|
|
}, complete: () => {
|
|
o.c.trigger('modal_close');
|
|
}
|
|
});
|
|
|
|
}, error: () => {
|
|
if (o) { o.c.trigger('modal_close'); }
|
|
}
|
|
});
|
|
};
|
|
$inv.clCntInv = function (ev) { // click-handler for invoice continuation
|
|
let lf = $fis.lf(false), selli = [];
|
|
lf.find('li.ili.checked').each(function () {
|
|
selli.push($(this).data('Id'));
|
|
});
|
|
if (selli.length === 1) {
|
|
//$('#contentframe').empty();
|
|
$inv.cntInv({ id: selli[0] });
|
|
}
|
|
};
|
|
$inv.cntInv = function (data) { //invoice continuation
|
|
data = data || {};
|
|
let lf = $fis.lf(false).rC('fix').aC('hd'), frm = $$.dc('invoice_layout', $fis.frm_edit()).append($$.dc('btn sprev').click($inv.sedit));
|
|
$inv.eM(false, true);
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
o.ft.rwText($rct.rq2);
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/get'), timeout: 60, data: { id: data.id }, success: (response) => {
|
|
//console.debug(response);
|
|
response.admin = response.admin || {};
|
|
let inv = response.inv || {};
|
|
let rq = $$.dc('srq', frm);
|
|
let rif = $$.tblset({ class: 'invi' }, rq);
|
|
rif.bdy.remove();
|
|
rif.ft = $$[0]('tfoot');
|
|
rif.tbl.data($.extend({ invid: inv.Id, new: {}, sms: { }, itm: {}, bai: [] }, response));
|
|
let thr = $$.tr(rif.hd).aC('shd').append([$$.th().aC('aux')]); /* header row for items */
|
|
$rct.invHR.forEach(h => $$.th(thr, h));
|
|
rif.tbl.on('fds.inv', $inv.invSumUpdate);
|
|
$.each(response.req || [], function (ri, rx) {
|
|
let bdy = $$.tbody(rif.tbl).data($.extend({}, rx));
|
|
$inv.rendersrq.call(bdy);
|
|
});
|
|
|
|
/* add an empty */
|
|
let atr = $$.tr($$.tbody(rif.tbl), { class: 'placeholder' }).data({ net_val: 0, vat_val: 0, svcnet_val: 0, svcvat_val: 0, net: 0 });
|
|
$inv.rrw.call(atr);
|
|
|
|
rif.ft.appendTo(rif.tbl);
|
|
|
|
|
|
let fm = (cls, txt, nme, hd, dta) => {
|
|
let fr = $$.dc('inpfrm', frm).aC(cls).append(typeof hd === 'string' ? $$.dc('ahd', hd) : (hd > 0 ? $$.dc('ahd', $rct.frm[nme]) : null)), fc = $$.dc('content', fr).rwText(txt);
|
|
$$.dc('axf', fr).append($$.dc('ibtn edit').data('dialog', $rct.frm[nme]).append(gi('pencil')).click($.extend({ t: fc, nme: nme, change: (nv) => { rif.tbl.data('new')[nme] = nv; } }, dta), $inv.eHtml));
|
|
rif.tbl.data('new')[nme] = txt;
|
|
};
|
|
fm('tfrm', inv.InvoiceTitle, 'invoicetitle', 0, null);
|
|
fm('adrfrm', inv.SendToAddress, 'invoiceaddress', 0, null);
|
|
fm('locfrm', inv.ProvisionLocation, 'loc', 1, null);
|
|
fm('emailfrm', inv.SendToEmail, 'invoiceemail', 0, null);
|
|
$$.dc('sndfrm', frm).append($$.dc('content').text(response.admin.sender));
|
|
|
|
fm('admfrm', inv.ProvisionPeriod, 'provisionperiod', ((inv.ProvisionPeriod || '').includes('-') === true ? $rct.provP : $rct.provD), 1, null);
|
|
rif.tbl.data('new').CustomValues = inv.CustomValues || '';
|
|
$$.dc('inpfrm ctpfrm', frm).text(jObj(inv.CustomValues, 'contactName'));
|
|
//adm = $$.dc('admfrm', frm), admc = $$.dc('content', adm),
|
|
|
|
rif.tbl.children('tbody').each($inv.bdysort);
|
|
rif.tbl.trigger('fds.inv'); /* trigger calculations */
|
|
$inv.eM(false, true, 'iss,p13b,ctp');
|
|
}, complete: () => {
|
|
o.c.trigger('modal_close');
|
|
}
|
|
});
|
|
};
|
|
$inv.cSt = function (data) {
|
|
data = data || {};
|
|
let lf = $fis.lf(), frm = $$.dc('invoice_layout', $fis.frm_edit()).append($$.dc('btn sprev').click($inv.sedit));
|
|
let ww = $fis.cf().width() > (frm.width() + lf.width() + 20);
|
|
lf.tC('fix', ww).tC('hd', !ww);
|
|
$inv.eM(false, true);
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
o.ft.rwText($ict.iq1);
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/pget'), data: { id: data.id }, success: (response) => {
|
|
if (o) { o.ft.rwText($ict.iq2); }
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/storno'), data: { id: data.id, mode: data.mode }, success: (response) => {
|
|
//console.debug(response);
|
|
response.admin = response.admin || {};
|
|
response.admin.p13b = bool(response.admin.p13b || '', (((response.inv || {}).InvoiceOptions || '').split(',').includes('§13b') === true));
|
|
let inv = response.inv || {};
|
|
let rq = $$.dc('srq', frm);
|
|
let rif = $$.tblset({ class: 'invi' }, rq);
|
|
rif.bdy.remove();
|
|
rif.ft = $$[0]('tfoot');
|
|
rif.tbl.data($.extend({ invid: inv.Id, new: {}, sms: {}, itm: {}, bai: [] }, response));
|
|
let thr = $$.tr(rif.hd).aC('shd').append([$$.th().aC('aux')]); /* header row for items */
|
|
$rct.invHR.forEach(h => $$.th(thr, h));
|
|
rif.tbl.on('fds.inv', $inv.invSumUpdate);
|
|
$.each(response.req || [], function (ri, rx) {
|
|
let bdy = $$.tbody(rif.tbl).data($.extend({}, rx));
|
|
$inv.rendersrq.call(bdy);
|
|
});
|
|
|
|
/* add an empty */
|
|
let atr = $$.tr($$.tbody(rif.tbl), { class: 'placeholder' }).data({ net_val: 0, vat_val: 0, svcnet_val: 0, svcvat_val: 0, net: 0 });
|
|
$inv.rrw.call(atr);
|
|
|
|
rif.ft.appendTo(rif.tbl);
|
|
|
|
|
|
let fm = (cls, txt, nme, hd, dta) => {
|
|
let fr = $$.dc('inpfrm', frm).aC(cls).append(typeof hd === 'string' ? $$.dc('ahd', hd) : (hd > 0 ? $$.dc('ahd', $rct.frm[nme]) : null)), fc = $$.dc('content', fr).rwText(txt);
|
|
$$.dc('axf', fr).append($$.dc('ibtn edit').data('dialog', $rct.frm[nme]).append(gi('pencil')).click($.extend({ t: fc, nme: nme, change: (nv) => { rif.tbl.data('new')[nme] = nv; } }, dta), $inv.eHtml));
|
|
rif.tbl.data('new')[nme] = txt;
|
|
};
|
|
fm('tfrm', inv.InvoiceTitle, 'invoicetitle', 0, null);
|
|
fm('adrfrm', inv.SendToAddress, 'invoiceaddress', 0, null);
|
|
fm('locfrm', inv.ProvisionLocation, 'loc', 1, null);
|
|
fm('emailfrm', inv.SendToEmail, 'invoiceemail', 0, null);
|
|
$$.dc('sndfrm', frm).append($$.dc('content').text(response.admin.sender));
|
|
|
|
fm('admfrm', inv.ProvisionPeriod, 'provisionperiod', ((inv.ProvisionPeriod || '').includes('-') === true ? $rct.provP : $rct.provD), 1, null);
|
|
rif.tbl.data('new').CustomValues = inv.CustomValues || '';
|
|
$$.dc('inpfrm ctpfrm', frm).text(jObj(inv.CustomValues,'contactName'));
|
|
//adm = $$.dc('admfrm', frm), admc = $$.dc('content', adm),
|
|
|
|
rif.tbl.children('tbody').each($inv.bdysort);
|
|
rif.tbl.trigger('fds.inv'); /* trigger calculations */
|
|
|
|
}, complete: () => {
|
|
o.c.trigger('modal_close');
|
|
}
|
|
});
|
|
|
|
}, error: () => {
|
|
if (o) { o.c.trigger('modal_close'); }
|
|
}
|
|
});
|
|
};
|
|
$inv.eHtml = function (ev) {
|
|
let t = $(this), frmct = ev.data instanceof jQuery ? ev.data : ev.data.t, flds = [
|
|
{ name: 'txt', label: 'Text', type: 'html', value: frmct.html(), tinymce: true, attr: { style: 'height: 300px' } }
|
|
];
|
|
let change = ev.data.change || null;
|
|
let sets = {
|
|
title: t.data('dialog') || '',
|
|
success: function (response) {
|
|
frmct.html(response.txt);
|
|
if (typeof change === 'function') {
|
|
change(response.txt);
|
|
}
|
|
},
|
|
tinymce: { valid_elements: 'br', hidemenu: true, hidetoolbar: true }
|
|
}
|
|
if (Array.isArray(ev.data.list)) {
|
|
let optf = $$.dc('lstfrm');
|
|
$.each(ev.data.list, (ii, lx) => {
|
|
let li = $$.dc('li', optf).append((ev.data.lbl || '') !== '' ? $$.dc('lbl').rwText(lx[ev.data.lbl]) : null);
|
|
$$.dc('adr', li).rwText(lx[ev.data.property]).data('val', lx[ev.data.property]).click(function () {
|
|
let t = $(this), tgt = t.closest('.modal-body').find(':input[name="txt"]');
|
|
if (tgt.is('.tinymce')) {
|
|
tinymce.get(tgt.attr('id')).setContent($$.s().rwText(t.data('val')).html());
|
|
} else if (tgt.prop('tagName') === 'TEXTAREA') {
|
|
tgt.val(t.data('val')).change();
|
|
} else {
|
|
tgt.rwText(t.data('val'));
|
|
}
|
|
});
|
|
});
|
|
sets.addcontent = optf;
|
|
}
|
|
$ocms.dlgform(flds, sets);
|
|
};
|
|
$inv.setVat = function (ev) {
|
|
let t = $(this), thisrow = ev.data;
|
|
let vat = prompt($rct.rqV);
|
|
if (vat) {
|
|
vat = parseFloat(vat.replace('%', ''));
|
|
if (vat > 1) {
|
|
vat = vat * 0.01;
|
|
}
|
|
if (isNaN(vat) === false) {
|
|
thisrow.siblings('.itm').each(function () {
|
|
let rwi = $(this), dta = rwi.data();
|
|
dta.vat = fnum(vat, { style: 'percent' }).replace(' ', '');
|
|
if ((dta.net_val || 0) > 0) {
|
|
dta.vat_val = dta.net_val * vat;
|
|
}
|
|
if ((dta.svcnet_val || 0) > 0) {
|
|
dta.svcvat_val = dta.svcnet_val * vat;
|
|
}
|
|
});
|
|
$inv.t_fds_inv();
|
|
}
|
|
}
|
|
};
|
|
$inv.inRow = function (ev) {
|
|
let t = $(this), thisrow = ev.data, dta = {}, flds = $rcol.itm.clone(['SortOrder', 'NameOrNumber', 'Type', 'quantityhours', 'UnitString', 'net', 'svcnet_val', 'svcvat_val', 'net_val', 'vat_val', 'vat', 'Note']); /* fields without values */
|
|
let nid = 'N' + (((1 + Math.random()) * 0x10000) || 0).toString(16).substr(6), newrow = $$.tr({ id: 'itm_' + nid.toString(), class: 'itm' });
|
|
$ocms.dlgform(flds, {
|
|
title: t.data('dialog') || '',
|
|
success: function (response) {
|
|
newrow.data($.extend({ Id: nid }, dta, response));
|
|
$inv.rrw.call(newrow);
|
|
newrow.insertAfter(thisrow);
|
|
$inv.t_fds_inv();
|
|
}, typedvalues: true
|
|
});
|
|
};
|
|
$inv.eRow = function (ev) {
|
|
let t = $(this), row = ev.data, dta = row.data() || {}, fnme = ['SortOrder', 'NameOrNumber', 'Type', 'quantityhours', 'UnitString', 'net', 'svcnet_val', 'svcvat_val', 'net_val', 'vat_val', 'vat', 'Note'];
|
|
if (!dta.id && (dta.Type || '') === '') {
|
|
fnme.unshift('Type');
|
|
}
|
|
let flds = $rcol.itm.clone(fnme).applyValues(dta);
|
|
flds.set('Type', 'hidden', 'type');
|
|
$inv.eRw.call(t, row, dta, flds);
|
|
};
|
|
$inv.eRw = function(row, dta, flds) {
|
|
let t = $(this);
|
|
$ocms.dlgform(flds, {
|
|
title: t.data('dialog') || '',
|
|
success: function (res) {
|
|
let d = {}
|
|
if ((dta.Id || '') === '') {
|
|
d.Id = 'N' + (((1 + Math.random()) * 0x10000) || 0).toString(16).substr(6);
|
|
row.attr('id', 'itm_' + d.Id.toString());
|
|
}
|
|
d.quantity = ((res.quantityhours ||'').toString() + ' ' + (res.UnitString || '').toString()).trimEnd();
|
|
row.data($.extend({}, dta, res, d));
|
|
console.debug('eRw success %o', row.data());
|
|
$inv.rrw.call(row);
|
|
$inv.t_fds_inv();
|
|
}, typedvalues: true
|
|
});
|
|
};
|
|
$inv.bdysort = (i, e) => { $(e).Sortable({ dragItem: false, dragHandleClass: 'ico', parentident: 'tr', swapdone: (p1, p2, i1, i2) => { $inv.t_fds_inv(); } }) }
|
|
$inv.rrw = function () {
|
|
let rw = $(this), dta = rw.data(), co = {}, ph = rw.is('.placeholder'), hn = rw.is('.hidenote');
|
|
let oHtml = (e) => $$.d().append(e).html();
|
|
let bc = [
|
|
$$.dc('ibtn insb', { title: $rct.iRb }).append(gi('indent-left')).click(rw, $inv.inRow)
|
|
];
|
|
if (ph === false) {
|
|
bc.unshift($$.dc('ibtn edit', { title: $rct.cP }).append(gi('pencil')).click(rw, $inv.eRow));
|
|
bc.push($$.dc('ibtn del', { title: $rct.dR }).append(gi('trash')).click(function (e) { if (confirm($rct.cD)) { rw.remove(); $inv.t_fds_inv(); } }));
|
|
}
|
|
let axf = $$.dc('axf').append(bc);
|
|
if (ph === true) {
|
|
co = { id: '', typ: 'placeholder' };
|
|
} else if (rw.is('.itm.osum') === true) {
|
|
co = { invrqid: dta.InvRqId, id: 'osum' + rw.index(), typ: 'osum', p: '', q: null, t: oHtml(dta.tbl.tbl), tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: false };
|
|
} else {
|
|
co = { invrqid: dta.InvRqId, id: dta.Id || '', typ: dta.Type || 'other', p: '', q: null, t: '', tt: null, v: null, vt: dta.net_val, vs: dta.svcnet_val, vat: dta.vat, vv: dta.vat_val, vsv: dta.svcvat_val, det: (dta.Note || '') !== '' && hn === false };
|
|
$$.dc('ibtn ico move', axf, { title: $rct.mR }); /* should be the last added */
|
|
|
|
co.p = dta.position || (dta.SortOrder || '');
|
|
if (co.id === '') {
|
|
co.t = '';
|
|
} else if (['Text', 'Title'].includes(co.typ) && (dta.net_val || 0) === 0) {
|
|
co.t = dta.htmltext || (((dta.NameOrNumber || '').substr(0, 1) !== '#' ? oHtml($$[0]('p').text(dta.NameOrNumber)) : '') + (dta.Note || ''));
|
|
} else {
|
|
co.tt = co.det ? '' : $$.s(dta.Note || '').text();
|
|
co.q = dta.quantity || (fnum(dta.quantityhours) + ' ' + (dta.UnitString || ''));
|
|
co.t = dta.htmltext ||(co.det ? (oHtml($$.s(dta.NameOrNumber || '')) + oHtml($$.dc('desc').html(dta.Note))) : oHtml($$.s(dta.NameOrNumber || '')));
|
|
co.v = dta.net
|
|
co.vt = dta.net_val
|
|
}
|
|
}
|
|
if ((dta.Note || '') !== '') {
|
|
$$.dc('ibtn add', axf).append(gi('object-align-left')).click(function (e) {
|
|
$inv.rrw.call(rw.tC('hidenote'));
|
|
});
|
|
}
|
|
let tda = [
|
|
$$.tdc('aux').append(axf),
|
|
$$.tdc('keep').text(co.p)
|
|
];
|
|
if (co.id === '') {
|
|
tda.push($$.td(rw, { colspan: 4 }).append(co.t));
|
|
} else {
|
|
Array.prototype.push.apply(tda, co.q ? [$$.tdc('keep').text(co.q)] : []);
|
|
Array.prototype.push.apply(tda, [
|
|
$$.tdc('txt', { colspan: !co.q ? 2 : 1, title: co.tt }).append(co.t),
|
|
$$.tdc('currency').text(fnum(co.v, $rct.cst)),
|
|
$$.tdc('currency inetval').text(fnum(co.vt, $rct.cst)).attr('title', $rct.svcPart + ': ' + fnum(co.vs, $rct.cst))
|
|
]);
|
|
}
|
|
rw.empty().attr('class', ph ? 'placeholder' : 'itm').aC(co.Typ).tC('hidenote', hn).append(tda);
|
|
dta.co = co;
|
|
};
|
|
$inv.invSumUpdate = function () {
|
|
let tbl = $(this), ft = tbl.children('tfoot').empty(), p13b = bool((tbl.data().admin || {}).p13b || '', false);
|
|
tbl.nextAll('.fnote').remove();
|
|
let sms = { ttn: 0, ttb: 0, ttvat: 0, tscn: 0, tscvat: 0, vat: {}, itmnet: {} }, ba = [];
|
|
let rwcy = (lbl, val, cls) => $$.tdc('currency', $$.tr(ft, { class: cls || 'tsum' }).append([$$.tdc('aux'), $$.td({ colspan: 4 }).text(lbl)]), fnum(val, $rct.cst)), fn = (t) => $$.dc('fnote').insertAfter(tbl).rwText(t);
|
|
let csms = function (rrx, sms, sid) {
|
|
sms.tscn += (rrx.svcnet_val || 0);
|
|
sms.tscvat += (rrx.svcvat_val || 0);
|
|
sms.ttn += (rrx.net_val || 0);
|
|
sms.ttvat += (rrx.vat_val || 0);
|
|
sms.ttb += ((rrx.net_val || 0) + (rrx.vat_val || 0));
|
|
if ((rrx.vat || '') !== '') {
|
|
sms.vat[rrx.vat] = (sms.vat[rrx.vat] || 0) + (rrx.vat_val || 0);
|
|
}
|
|
//sms.itmnet[sid] = (sms.itmnet[sid] || 0) + (rrx.net_val || 0);
|
|
};
|
|
let bds = tbl.children('tbody');
|
|
bds.each((bi, bdy) => {
|
|
let b = $(bdy), rx = b.data() || {}, i = [], bnet = 0, itm = b.find('tr.itm'), iso = 0, ipos = 0;
|
|
b.tC('empty', itm.length < 1);
|
|
itm.each((ti, tx) => {
|
|
|
|
let rrx = $(tx).data() || {}; csms(rrx, sms, rx.Id); bnet += (rrx.net_val || 0); i.push(rrx.co);
|
|
//console.debug('rrx %o', rrx);
|
|
if (((typeof rrx.SortOrder === 'undefined' || rrx.SortOrder === null) ? -1 : rrx.SortOrder) > -1) {
|
|
if (['text', 'title'].includes((rrx.Type || 'other').toLowerCase()) === false) { ipos++; }
|
|
rrx.SortOrder = iso;
|
|
rrx.position = ipos;
|
|
$inv.rrw.call(tx);
|
|
}
|
|
});
|
|
//console.debug('%o', {
|
|
// f: b.find('tr.isum > td.isumval'), t: fnum(bnet, $rct.cst), n: bnet
|
|
//});
|
|
b.find('tr.isum > td.isumval').text(fnum(bnet, $rct.cst));
|
|
ba.push({ Id: rx.Id, nme: rx.Name, text: rx.text, itm: i, netval: bnet });
|
|
});
|
|
let nonempty = tbl.find('tbody:not(.empty)').length;
|
|
bds.find('tr.isum').tC('hidden', nonempty < 2);
|
|
//let fnet = $$.tdc('currency', $$.tr(ft, { class: 'tsum' }).append([$$.tdc('aux'), $$.td({ colspan: 4 }).text('Netto')]), fnum(sms.ttn, $rct.cst));
|
|
rwcy('Netto', sms.ttn);
|
|
if (p13b === false) {
|
|
$.each(sms.vat, (vi, vx) => {
|
|
//$$.tdc('currency vat', $$.tr(ft, { class: 'tvat' }).append([$$.tdc('aux'), $$.td({ colspan: 4 }).text('Umsatzsteuer ' + vi)]), fnum(vx, $rct.cst));
|
|
rwcy($rct.vat + ' ' + vi, vx, 'tvat');
|
|
});
|
|
} else {
|
|
sms.ttb = sms.ttn;
|
|
}
|
|
//let fsum = $$.tdc('currency', $$.tr(ft, { class: 'tsum' }).append([$$.tdc('aux'), $$.td({ colspan: 4 }).text('Summe')]), fnum(sms.ttb, $rct.cst));
|
|
rwcy('Summe', sms.ttb);
|
|
let itype = tbl.data().admin.type;
|
|
if (itype === 'i') {
|
|
fn($rct.note2);
|
|
fn($rct.note4);
|
|
} else if (itype === 'c') {
|
|
fn($rct.note2);
|
|
} else {
|
|
fn(string($rct.note3, [fnum((sms.tscn + sms.tscvat) * (tbl.data().admin.tax_servicerefund || 0), $rct.cst)])).aC('ntax');
|
|
fn($rct.note2);
|
|
fn(string($rct.note1, [fnum(sms.tscn + sms.tscvat, $rct.cst), fnum(sms.tscn, $rct.cst), fnum(sms.tscvat, $rct.cst)]));
|
|
}
|
|
if (p13b === true) {
|
|
fn($rct.note13b);
|
|
}
|
|
tbl.data('sms', sms);
|
|
tbl.data('bai', ba);
|
|
};
|
|
$inv.worknotes = function (rx) {
|
|
let wn = '';
|
|
rx.steps.forEach((s, si) => {
|
|
let flds;
|
|
try {
|
|
flds = JSON.parse(s.Data || {}).fields || [];
|
|
} catch (e) {
|
|
console.debug(e);
|
|
flds = [];
|
|
}
|
|
if (Array.isArray(flds || '') !== true) {
|
|
if (typeof flds === 'object' && Array.isArray(flds.field || '') === true) {
|
|
flds = flds.field;
|
|
} else {
|
|
flds = [];
|
|
}
|
|
}
|
|
flds.forEach((v, si) => {
|
|
if (v.name === 'Ausgeführte Arbeiten') {
|
|
wn = v.result || '';
|
|
}
|
|
});
|
|
});
|
|
return wn;
|
|
};
|
|
$inv.rendersrq = function () {
|
|
let bdy = $(this).empty(), onesum = bdy.is('.onesum');
|
|
let rx = bdy.data();
|
|
//if (ri > 0) {
|
|
// $$.tr(bdy).aC('sep nosort').append($$.td({ colspan: 6 }));
|
|
//}
|
|
let rtr = $$.tr(bdy, { id: 'srq' + rx.Id }).aC('title nosort'), cl = $rcol.itm.lbl();
|
|
let aux = $$.dc('axf').appendTo($$.tdc('aux', rtr));
|
|
$$.dc('ibtn osum', aux, { title: $rct.combP }).append(gi('euro')).click(function (e) {
|
|
bdy.tC('onesum');
|
|
$inv.rendersrq.call(bdy);
|
|
$inv.t_fds_inv();
|
|
});
|
|
$$.dc('ibtn setvat', aux, { title: $rct.sV }).append(gi('gbp')).click(rtr, $inv.setVat);
|
|
$$.dc('ibtn insb', aux, { title: $rct.iRb }).append(gi('indent-left')).click(rtr, $inv.inRow);
|
|
let stxt = $$.sc('text', rx.text);
|
|
let nme = $$.td(rtr, { colspan: onesum ? 4 : 5 }).append(stxt), oidta, numkeys = ['net_val', 'vat_val', 'svcnet_val', 'svcvat_val', 'net'];
|
|
$$.dc('ibtn edit', aux).data('dialog', $rcol.req.lbl().Name).append(gi('pencil')).click({ t: stxt, change: (nv) => { rx.text = nv; $inv.t_fds_inv(); } }, $inv.eHtml)
|
|
if (onesum) {
|
|
$$.tdc('currency isumval', rtr);
|
|
oidta = { Id: rx.Id.toString() + '_osum', net_val: 0, vat_val: 0, svcnet_val: 0, svcvat_val: 0, net: 0 };
|
|
oidta.tbl = $$.tblset({ class: 'stbl' });
|
|
}
|
|
$.each(rx.items || [], (ii, ix) => {
|
|
let itr, idta = { Id: ix.Id, net_val: ix.net_val || 0, vat_val: ix.vat_val || 0, svcnet_val: 0, svcvat_val: 0, net: ix.net || 0, Note: ix.Note || '' };
|
|
switch (ix.Type.toLowerCase()) {
|
|
case 'service':
|
|
idta.svcnet_val = ix.net_val || 0;
|
|
idta.svcvat_val = ix.vat_val || 0;
|
|
}
|
|
if (onesum) {
|
|
itr = $$.tr(oidta.tbl.bdy, { id: 'itm' + ix.Id, class: 'sitm' }).aC(ix.Type);
|
|
if (ix.Type === 'Text' || ix.Type === 'Title') {
|
|
$$.td(itr, { colspan: 2 }).html(ix.htmltext || ix.Note);
|
|
} else {
|
|
$$.tdc('keep', itr).text(ix.quantity || ((ix.quantityhours || 0) > 0 ? fnum(ix.quantityhours) + (ix.UnitString || '').eine(' ','') : ''));
|
|
if (ix.htmltext) {
|
|
$$.tdc('txt', itr).html(ix.htmltext);
|
|
} else {
|
|
$$.tdc('txt', itr).text(ix.NameOrNumber).attr('title', ix.Note);
|
|
}
|
|
}
|
|
$.each(numkeys, (k, ky) => { oidta[ky] += idta[ky]; });
|
|
itr.data(idta);
|
|
} else {
|
|
$.extend(idta, ix);
|
|
itr = $$.tr(bdy, { id: 'itm' + ix.Id, class: 'itm' });
|
|
itr.data(idta);
|
|
$inv.rrw.call(itr);
|
|
}
|
|
});
|
|
if (onesum) {
|
|
let oi = $$.tr(bdy, { id: 'itmsq' + rx.Id, class: 'itm osum' }).data(oidta);
|
|
$inv.rrw.call(oi);
|
|
} else {
|
|
let istr = $$.tr(bdy).aC('isum nosort');
|
|
$$.tdc('aux', istr);
|
|
$$.td(istr, { colspan: 4 }).text($rct.iSum);
|
|
$$.tdc('currency isumval', istr);
|
|
}
|
|
};
|
|
$inv.t_fds_inv = () => { $('div.invoice_layout table.invi').trigger('fds.inv'); };
|
|
$inv.sedit = () => {
|
|
$inv.sprev(true);
|
|
};
|
|
$inv.jdisp = function (ev) {
|
|
ev.stopPropagation();
|
|
if (ev.data.id) {
|
|
$inv.disp(ev.data.id, (ev.data.typ ||''));
|
|
}
|
|
}
|
|
$inv.disp = (id, typ) => {
|
|
let u = '';
|
|
switch (typ) {
|
|
case 'inv':
|
|
u = 'inv/rdoc';
|
|
break;
|
|
case 'rem':
|
|
u = 'rem/rdoc';
|
|
break;
|
|
}
|
|
if (u !== '') {
|
|
$ocms.postXT({
|
|
url: $ocms.url(u), data: { id: id || '', typ: 'img' }, success: (response) => {
|
|
let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), invid = response.id;
|
|
$.each(response.img || [], function (ii, img) {
|
|
$$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px'));
|
|
});
|
|
$ocms.dlg(c, {
|
|
size: [vhr, Math.round(vw() * 0.88)], zindex_min: 50, form: false, exclusive:false
|
|
});
|
|
}
|
|
});
|
|
}
|
|
};
|
|
$inv.jdbn = function (ev) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/rdocn'), data: { name: ev.data.id || '', typ: 'img' }, success: (response) => {
|
|
let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), invid = response.id;
|
|
$.each(response.img || [], function (ii, img) {
|
|
$$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px'));
|
|
});
|
|
$ocms.dlg(c, {
|
|
size: [vhr, Math.round(vw() * 0.88)], zindex: 50, form: false
|
|
});
|
|
}
|
|
});
|
|
};
|
|
$inv.sp13b = () => {
|
|
var l = $('div.invoice_layout'), tbl = l.find('table.invi'), d = tbl.data();
|
|
d.admin.p13b = true;
|
|
if ((d.inv.InvoiceOptions || '').split(',').includes('§13b') === false) {
|
|
d.inv.InvoiceOptions += ',§13b';
|
|
} else {
|
|
}
|
|
tbl.trigger('fds.inv');
|
|
};
|
|
$inv.sctp = () => {
|
|
let flds = $invcol.ctp;
|
|
$ocms.dlgform(flds, {
|
|
title: $ict.ctp,
|
|
success: function (response) {
|
|
|
|
var l = $('div.invoice_layout'), tbl = l.find('table.invi'), d = tbl.data();
|
|
let cvo = {};
|
|
if (typeof d.new !== 'undefined' && (d.new.CustomValues || '').substr(0, 1) === '{') {
|
|
cvo = JSON.parse(d.inv.CustomValues);
|
|
}
|
|
cvo.contactName = response.name;
|
|
cvo.contactEmail = response.email;
|
|
d.new.CustomValues = JSON.stringify(cvo); //Assign it to new Values so that this is submitted also
|
|
l.find('.ctpfrm').text(ne(response.name, response.email));
|
|
|
|
}, typedvalues: true
|
|
});
|
|
};
|
|
$inv.ssave = () => {
|
|
var l = $('div.invoice_layout'), d = l.find('table.invi').data();
|
|
$inv.t_fds_inv();
|
|
l.aC('freeze');
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/save'), data: { invc: JSON.stringify({ admin: d.admin, req: d.bai, sms: d.sms, new: d.new }), id: d.invid || '' }, success: (response) => {
|
|
$inv.cntInv({ id: response.id });
|
|
}, error: () => {
|
|
alert($ict.eis);
|
|
}, complete: () => {
|
|
l.rC('freeze');
|
|
}
|
|
});
|
|
};
|
|
$inv.sprev = (change) => {
|
|
var l = $('div.invoice_layout'), d = l.find('table.invi').data();
|
|
change = bool(change, false);
|
|
$inv.t_fds_inv();
|
|
l.aC('freeze');
|
|
//console.debug({ admin: d.admin, req: d.bai, sms: d.sms, new: d.new });
|
|
if ($fis.ValidateEmail(d.new.invoiceemail || '') === false) {
|
|
if (bool(confirm($ict.ivE + $ict.ivEc),false) === false) {
|
|
l.rC('freeze');
|
|
return;
|
|
}
|
|
}
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/' + (change === true ?'sedit':'sprep')), data: { invc: JSON.stringify({ admin: d.admin, req: d.bai, sms: d.sms, new: d.new }), id: d.invid ||'' }, success: (response) => {
|
|
l.rC('freeze');
|
|
let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), invid = response.id, invtp = response.total;
|
|
if (invtp > 10) {
|
|
$$.dc('note warn', c).text($ict.tpe);
|
|
}
|
|
$.each(response.img || [], function (ii, img) {
|
|
$$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px'));
|
|
});
|
|
for (let ic = (response.img || []).length + 1; ic <= invtp; ic++) {
|
|
$$.dc('pdfp ph', c).append($$.dc('note', $ict.pna));
|
|
}
|
|
$ocms.dlg(c, {
|
|
size: [vhr, Math.round(vw() * 0.88)], zindex: 50, form: false, button: $rct.crI, confirm: function (e) {
|
|
let ct = $(this);
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/sconf'), data: { id: invid }, success: () => {
|
|
ct.trigger('modal_close');
|
|
window.open($ocms.url('req/idoc') + '?id=' + invid, '_blank'); /* open pdf in new tab */
|
|
$ocms.init('req'); /* go back to request list */
|
|
$inv.rReload();
|
|
}, error: () => {
|
|
alert($t.f1);
|
|
ct.trigger('modal_close');
|
|
}
|
|
});
|
|
}, cancel: function (e) {
|
|
let ct = $(this);
|
|
if (confirm($ict.cdI)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('req/sdel'), data: {
|
|
id: invid
|
|
}
|
|
});
|
|
}
|
|
$inv.rReload();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
};
|
|
$inv.rReload = () => {
|
|
try {
|
|
let s = $('#listframe ul.rql:first').data();
|
|
$inv.cInv2({ id: s.search });
|
|
} catch (e) { }
|
|
};
|
|
$inv.quantChange = function (i) {
|
|
//console.debug({ t: this, i: i });
|
|
let t = $(this), f = t.closest('form'), fi = {}, pf = (i) => parseFloat(i.toString().replace('%', '').replace(',', '.')), rtp = (num) => num.toFixed(2);
|
|
f.find(':input').each((i, e) => { fi[$(e).attr('name')] = $(e); });
|
|
let qv = parseInt(fi.quantityhours.val() || '0'), nv = pf(fi.net.val() || '0'), vat = pf(fi.vat.val()) * 0.01;
|
|
if (qv > 0 && nv > 0) {
|
|
fi.net_val.val(rtp(qv * nv));
|
|
fi.vat_val.val(rtp(qv * nv * vat));
|
|
if (['Service'].includes(fi.Type.val())) {
|
|
fi.svcnet_val.val(rtp(qv * nv));
|
|
fi.svcvat_val.val(rtp(qv * nv * vat));
|
|
}
|
|
}
|
|
};
|
|
$inv.storno = function (id, fds) {
|
|
let o, fr = $$.dc('choicefrm').append([
|
|
$$.dc('btn', 'Storno ohne Details').click({ id: id, mode: 'simple' }, (ev) => { o.c.trigger('modal_close'); $inv.cSt(ev.data); })
|
|
, $$.dc('btn', 'Storno mit neuer Rechnung').click({ id: id }, (ev) => { o.c.trigger('modal_close'); $inv.ccStInv(ev); })
|
|
, $$.dc('btn', 'Storno mit best. Rechnung').tC('inactive', bool(fds, false) === false).click({ id: id, mode: 'copy' }, (ev) => { if (bool(fds, false) === true) { o.c.trigger('modal_close'); $inv.cSt(ev.data); }})
|
|
]);
|
|
o = $ocms.dlg(fr, { width: 1000 });
|
|
};
|
|
$inv.credit = function (id, fds) {
|
|
let o, fr = $$.dc('choicefrm').append([
|
|
$$.dc('btn', 'Gutschrift').click({ id: id, mode: 'credit' }, (ev) => { o.c.trigger('modal_close'); $inv.cSt(ev.data); })
|
|
]);
|
|
o = $ocms.dlg(fr, { width: 1000 });
|
|
};
|
|
$inv.setPyd = function (id) { // set invoice payed
|
|
if (confirm($ict.cpyd)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/setpyd'), timeout: 60, data: { id: id }, success: (response) => {
|
|
alert($ict.relm);
|
|
}, error: () => {
|
|
alert($t.f1);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
$inv.setUpd = function (id) { // set invoice payed
|
|
if (confirm($ict.cupd)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/setupd'), timeout: 60, data: { id: id }, success: (response) => {
|
|
alert($ict.relm);
|
|
}, error: () => {
|
|
alert($t.f1);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
$inv.resendRem = function (ev) {
|
|
ev.stopPropagation();
|
|
if (ev.data.id && confirm(string($ict.remresc, [ev.data.name]))) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/resend'), timeout: 60, data: { id: ev.data.id }, success: (response) => {
|
|
alert(string($ict.remresr, [ev.data.name]));
|
|
}, error: () => {
|
|
alert($t.f1);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
$inv.dspRem = function (id) { //reminder creation
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
let o = $ocms.dlg(fr, { width: 1000 });
|
|
o.ft.rwText($rct.rq2);
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/getrem'), timeout: 60, data: { id: id, drafts: false }, success: (response) => {
|
|
o.ft.empty();
|
|
let ts = $$.tblset({ class: 'invtbl'}, fr.empty()), fd = $invcol.rem2;
|
|
let thr = $$.tr(ts.hd), haux = $$.th(thr);
|
|
$.each(fd.fields || [], (ci, cx) => {
|
|
$$.th(thr).text(cx.label);
|
|
});
|
|
let cst = false;
|
|
$.each(response, (ri, rw) => {
|
|
cst = !cst;
|
|
let tr = $$.tr(ts.bdy).tC('alt', cst), raux = $$.td(tr);
|
|
tr.click(function () {
|
|
tr.tC('selected').siblings().rC('selected');
|
|
});
|
|
if (bool(rw.hasFile, false)=== true) {
|
|
$$.dc('idl ilbtn', raux, { title: $ict.dl + '\n' + rw.DocumentName }).append(gi('save-file', 'ico')).click({ id: rw.Id }, $inv.downloadrem);
|
|
$$.dc('idl ilbtn', raux, { title: $ict.remdsp + '\n' + rw.DocumentName }).append(gi('eye-open', 'ico')).click({ id: rw.Id, typ: 'rem' }, $inv.jdisp);
|
|
$$.dc('idl ilbtn', raux, { title: $ict.remres + '\n' + rw.DocumentName }).append(gi('refresh', 'ico')).click({ id: rw.Id, typ: 'rem', name: rw.DocumentName }, $inv.resendRem);
|
|
}
|
|
$.each(fd.fields || [], (ci, cx) => {
|
|
let td = $$.td(tr).aC(cx.dtype), val = rw[cx.name];
|
|
if (typeof cx.dfnc === 'function') {
|
|
cx.dfnc.call(td, val, rw);
|
|
} else {
|
|
switch (cx.type || '') {
|
|
case 'date':
|
|
td.text(fdt(rw[cx.name], 'dd.MM.yy'));
|
|
break;
|
|
case 'datetime':
|
|
td.text(fdt(rw[cx.name]));
|
|
break;
|
|
case 'html':
|
|
td.append($$.dc('ctw').html(val));
|
|
td.append($$.dc('ttip').html(val));
|
|
break;
|
|
default:
|
|
td.text(rw[cx.name]);
|
|
}
|
|
}
|
|
switch (cx.name || '') {
|
|
case 'InvoiceId':
|
|
td.aC('keep');
|
|
break;
|
|
}
|
|
switch (typeof cx.title) {
|
|
case 'function':
|
|
cx.title.call(td, rw);
|
|
break;
|
|
case 'string':
|
|
td.attr('title', cs.title);
|
|
}
|
|
});
|
|
});
|
|
}, error: () => {
|
|
fr.empty();
|
|
o.ft.rwText($t.f1);
|
|
}, complete: () => {
|
|
fr.ldng(0);
|
|
}
|
|
});
|
|
};
|
|
$inv.ccRem = function (id, InvoiceId) { //reminder creation
|
|
let t = $(this);
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/lrem'), timeout: 60, data: { id: id }, success: (response) => {
|
|
let flds = $invcol.rid.clone(); /* fields without values */
|
|
flds.applyValues(response.ov);
|
|
let ac = $$.dc('ac'), tbl = $$.tblset({class: 'fullgrid fullwidth'}, ac);
|
|
if ((response.lst || []).length > 0) {
|
|
$$.d({ 'style': 'margin: 1.5rem 0 1rem 0;font-size: 110%;text-decoration: underline;'}).prependTo(ac).text($ict.rovlh);
|
|
let trh = $$.tr(tbl.hd);
|
|
$ict.rovl.forEach((f, n) => $$.th(trh, f));
|
|
$.each(response.lst, (ri, rw) => {
|
|
let tr = $$.tr(tbl.bdy);
|
|
tr.append([$$.tdc('keep', rw.subject), $$.tdc('currency', fnum(rw.amount, $rct.cst)), $$.tdc('currency', fnum(rw.amount_payed, $rct.cst)), $$.tdc('keep', fdt(rw.DateFinalized, 'dd.MM.yy'))]);
|
|
});
|
|
} else {
|
|
$$.td($$.tr(tbl.bdy), $ict.nd);
|
|
}
|
|
$ocms.dlgform(flds, {
|
|
addcontent: ac,
|
|
title: string($ict.remdt, [InvoiceId || '?']),
|
|
success: function (sets) {
|
|
$inv.ccRem_s2(id, sets);
|
|
}, typedvalues: true
|
|
});
|
|
}
|
|
});
|
|
};
|
|
$inv.rRemRw = function (dta) {
|
|
let tr = $(this), rem = dta.rm || {};
|
|
tr.empty().data({ invoiceid: rem.invoiceid, invoicedate: rem.invoicedate, amount: rem.amount, amount_payed: rem.amount_payed });
|
|
let axf = $$.dc('axf').append($$.dc('ibtn edit', { title: $rct.cP }).append(gi('pencil')).click(tr, $inv.eRowR));
|
|
tr.append([$$.tdc('aux').append(axf), $$.tdc('keep', rem.invoiceid), $$.tdc('keep', fdt(rem.invoicedate, 'dd.MM.yy')), $$.tdc('currency', fnum(rem.amount, $rct.cst)), $$.tdc('currency', fnum(rem.amount_payed, $rct.cst)), $$.tdc('currency', fnum(rem.amount - rem.amount_payed, $rct.cst))]);
|
|
};
|
|
$inv.eRowR = function (ev) {
|
|
let t = $(this), row = ev.data, dta = row.data() || {};
|
|
let flds = $invcol.rem.clone().applyValues(dta);
|
|
$ocms.dlgform(flds, {
|
|
title: t.data('dialog') || '',
|
|
success: function (res) {
|
|
let tbl = t.closest('table'), tdta = tbl.data();
|
|
$.extend(tdta.rm, res);
|
|
tbl.data(tdta);
|
|
$inv.rRemRw.call(row, tdta);
|
|
}, typedvalues: true
|
|
});
|
|
};
|
|
$inv.ccRem_s2 = function (id, sets) { //reminder creation
|
|
let lf = $fis.lf(false).rC('fix').aC('hd'), frm = $$.dc('invoice_layout', $fis.frm_edit()).append($$.dc('btn sprev').click($inv.rprev));
|
|
$inv.eM(false, true);
|
|
let fr = $$.dc('rfrm').ldng(1);
|
|
//let o = $ocms.dlg(fr, { width: 1000 });
|
|
//o.ft.rwText($rct.rq2);
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/get'), timeout: 60, data: $.extend({ id: id }, sets), success: (response) => {
|
|
//console.debug(response);
|
|
let rem = response.rm || {};
|
|
let rq = $$.dc('srq', frm);
|
|
$ict.remt[rem.type].forEach(r => $$[0]('p').rwText(r).appendTo(rq));
|
|
let rif = $$.tblset({ class: 'invi' }, rq);
|
|
rif.ft = $$[0]('tfoot');
|
|
rif.tbl.data($.extend({ invid: rem.invid, new: {} }, response));
|
|
let thr = $$.tr(rif.hd).aC('shd').append([$$.th().aC('aux')]); /* header row for items */
|
|
$ict.remHR.forEach(h => $$.th(thr, h));
|
|
$inv.rRemRw.call($$.tr(rif.bdy), rif.tbl.data());
|
|
rif.ft.appendTo(rif.tbl);
|
|
$ict.remt2[rem.type].forEach(r => $$[0]('p').rwText(r).appendTo(rq));
|
|
|
|
let fm = (cls, txt, nme, hd, dta) => {
|
|
let fr = $$.dc('inpfrm', frm).aC(cls).append(typeof hd === 'string' ? $$.dc('ahd', hd) : (hd > 0 ? $$.dc('ahd', $rct.frm[nme]) : null)), fc = $$.dc('content', fr).rwText(txt);
|
|
$$.dc('axf', fr).append($$.dc('ibtn edit').data('dialog', $rct.frm[nme]).append(gi('pencil')).click($.extend({ t: fc, nme: nme, change: (nv) => { rif.tbl.data('new')[nme] = nv; } }, dta), $inv.eHtml));
|
|
rif.tbl.data('new')[nme] = txt;
|
|
};
|
|
fm('tfrm', rem.subject, 'subject', 0, null);
|
|
fm('adrfrm', rem.invoiceaddress, 'invoiceaddress', 0, null);
|
|
// fm('locfrm', rem.ProvisionLocation, 'loc', 1, null);
|
|
fm('emailfrm', rem.invoiceemail, 'invoiceemail', 0, null);
|
|
$$.dc('sndfrm', frm).append($$.dc('content').text(rem.sender));
|
|
|
|
//adm = $$.dc('admfrm', frm), admc = $$.dc('content', adm),
|
|
|
|
rif.tbl.children('tbody').each($inv.bdysort);
|
|
rif.tbl.trigger('fds.inv'); /* trigger calculations */
|
|
|
|
}, complete: () => {
|
|
//o.c.trigger('modal_close');
|
|
}
|
|
});
|
|
};
|
|
$inv.rprev = () => {
|
|
var l = $('div.invoice_layout'), tbl = l.find('table.invi'), d = tbl.data();
|
|
$.extend(d.new, tbl.find('tbody > tr:first').data());
|
|
l.aC('freeze');
|
|
//console.debug({ rem: d.rm, new: d.new });
|
|
if ($fis.ValidateEmail(d.new.invoiceemail || '') === false) {
|
|
if (bool(confirm($ict.ivE + $ict.ivEc), false) === false) {
|
|
l.rC('freeze');
|
|
return;
|
|
}
|
|
}
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/prep'), data: { remc: JSON.stringify({ rem: d.rm, new: d.new }), id: d.invid || '' }, success: (response) => {
|
|
l.rC('freeze');
|
|
let c = $$.dc('imagecollection pdfpreview'), vhr = Math.round(vh() * 0.88), remid = response.id;
|
|
$.each(response.img || [], function (ii, img) {
|
|
$$.dc('pdfp', c).append($$.img(img).css('max-height', (vhr - rpx(6)).toString() + 'px'));
|
|
});
|
|
$ocms.dlg(c, {
|
|
size: [vhr, Math.round(vw() * 0.88)], zindex: 50, form: false, button: $ict.remd, confirm: function (e) {
|
|
let ct = $(this);
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/conf'), data: { id: remid }, success: () => {
|
|
ct.trigger('modal_close');
|
|
window.open($ocms.url('rem/idoc') + '?id=' + remid, '_blank'); /* open pdf in new tab */
|
|
$ocms.init('req'); /* go back to request list */
|
|
$inv.rReload();
|
|
}, error: () => {
|
|
alert($t.f1);
|
|
ct.trigger('modal_close');
|
|
}
|
|
});
|
|
}, cancel: function (e) {
|
|
let ct = $(this);
|
|
if (confirm($ict.cdI)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/del'), data: {
|
|
id: remid
|
|
}
|
|
});
|
|
}
|
|
$inv.rReload();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
};
|
|
$inv.sis = (id) => {
|
|
if (confirm($ict.sisc)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/sis'), data: { id: id || '' }, success: (response) => { }
|
|
});
|
|
}
|
|
};
|
|
$inv.srs = (id) => {
|
|
if (confirm($ict.srsc)) {
|
|
$ocms.postXT({
|
|
url: $ocms.url('rem/srs'), data: { id: id || '' }, success: (response) => { }
|
|
});
|
|
}
|
|
};
|
|
|
|
$inv.mfrrel = (id) => {
|
|
$('#contentframe').ldng();
|
|
$ocms.postXT({
|
|
url: $ocms.url('inv/mfrrel'), data: { id: id || '' }, success: (response) => { $inv.rerenderinv(); }, complete: () => {
|
|
$('#contentframe').ldng(0);
|
|
}
|
|
});
|
|
};
|