$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 ((opt || '').split(',').includes('setm') === true) { m.push({ lbl: $ict.setm, fnc: $inv.ssetmode }); } 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,setm,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,setm,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; /* invoiceemail must stay plain text — using the TinyMCE/html editor here used to wrap the address in
tags, which then got posted and persisted verbatim into SendToEmail. */
let isPlainText = ev.data.nme === 'invoiceemail';
let flds = isPlainText
? [{ name: 'txt', label: 'Text', type: 'text', value: frmct.text() }]
: [{ 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) {
if (isPlainText) {
frmct.text(response.txt || '');
} else {
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 = [], citems = [], cset = null, 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);
/* backend item contract (title/desc/qty/price_net/total_net + set flags), see InvoiceSetPricing.
Set grouping: an item of Type 'set' is a header that claims the following items in this
block as its members until the next set header (mfr__items has no explicit member link). */
let citem = $inv.itemToContract(rrx);
if (citem.type === 'set' && citem.id !== '') { cset = citem.id; }
else if (cset !== null && (citem.id || '') !== '') { citem.setId = cset; }
citems.push(citem);
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, items: citems, 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');
};
/* Maps an item row's data to the backend item contract consumed by InvoiceSetPricing
/ FuchsPdf.ApplyInvoice: { id, type, title (plain), desc (html), qty, price_net,
total_net, vat }. Set membership (type:'set' header + setId on members) is added by
the caller. The invoice total comes from the registration balance, so per-item
totals here are purely presentational. */
$inv.itemToContract = function (rrx) {
rrx = rrx || {};
let oHtml = (e) => $$.d().append(e).html();
let type = (rrx.Type || '').toString().toLowerCase();
let ci = { id: (rrx.Id || '').toString(), type: type, title: '', desc: '', qty: '', price_net: '', total_net: (rrx.net_val || 0), vat: rrx.vat || '' };
if (rrx.co && rrx.co.typ === 'osum') {
/* combined single-sum line — the on-screen "title" is an HTML sub-table; render it as desc */
ci.desc = rrx.co.t || '';
ci.total_net = (rrx.net_val || 0);
} else if (['text', 'title'].includes(type) && (rrx.net_val || 0) === 0) {
/* heading / free-text line, no price */
ci.desc = rrx.htmltext || ((((rrx.NameOrNumber || '').substr(0, 1) !== '#') ? oHtml($$[0]('p').text(rrx.NameOrNumber || '')) : '') + (rrx.Note || ''));
ci.total_net = '';
} else {
/* normal priced item (incl. set headers, which carry their own set price or 0) */
ci.title = rrx.NameOrNumber || '';
ci.desc = rrx.Note || '';
ci.qty = rrx.quantity || ((rrx.quantityhours || 0) !== 0 ? (fnum(rrx.quantityhours) + (rrx.UnitString ? ' ' + rrx.UnitString : '')) : '');
ci.price_net = (rrx.net || 0);
ci.total_net = (rrx.net_val || 0);
}
return ci;
};
/* 3-way set-pricing display switch. Mirrors §13b: writes the choice onto admin.setmode,
which BuildInvoiceParams turns into the "setmode: