@design.estate/dees-document 1.0.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_bundle/bundle.js +865 -0
- package/dist_bundle/bundle.js.map +7 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.pdfservice.d.ts +23 -0
- package/dist_ts/classes.pdfservice.js +39 -0
- package/dist_ts/helpers.d.ts +1 -0
- package/dist_ts/helpers.js +6 -0
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -0
- package/dist_ts/paths.d.ts +4 -0
- package/dist_ts/paths.js +7 -0
- package/dist_ts/plugins.d.ts +9 -0
- package/dist_ts/plugins.js +13 -0
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/elements/contentinvoice.d.ts +34 -0
- package/dist_ts_web/elements/contentinvoice.js +335 -0
- package/dist_ts_web/elements/document.d.ts +20 -0
- package/dist_ts_web/elements/document.js +157 -0
- package/dist_ts_web/elements/index.d.ts +8 -0
- package/dist_ts_web/elements/index.js +9 -0
- package/dist_ts_web/elements/letterheader.d.ts +16 -0
- package/dist_ts_web/elements/letterheader.js +123 -0
- package/dist_ts_web/elements/page.d.ts +19 -0
- package/dist_ts_web/elements/page.js +144 -0
- package/dist_ts_web/elements/pagecontainer.d.ts +14 -0
- package/dist_ts_web/elements/pagecontainer.js +66 -0
- package/dist_ts_web/elements/pagecontent.d.ts +18 -0
- package/dist_ts_web/elements/pagecontent.js +144 -0
- package/dist_ts_web/elements/pagefooter.d.ts +16 -0
- package/dist_ts_web/elements/pagefooter.js +130 -0
- package/dist_ts_web/elements/pageheader.d.ts +16 -0
- package/dist_ts_web/elements/pageheader.js +95 -0
- package/dist_ts_web/elements/shared/demoletter.d.ts +2 -0
- package/dist_ts_web/elements/shared/demoletter.js +117 -0
- package/dist_ts_web/elements/shared/index.d.ts +5 -0
- package/dist_ts_web/elements/shared/index.js +6 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +2 -0
- package/dist_ts_web/pages/index.d.ts +2 -0
- package/dist_ts_web/pages/index.js +3 -0
- package/dist_ts_web/pages/page1.d.ts +1 -0
- package/dist_ts_web/pages/page1.js +18 -0
- package/dist_ts_web/pages/page2.d.ts +1 -0
- package/dist_ts_web/pages/page2.js +5 -0
- package/dist_ts_web/plugins.d.ts +7 -0
- package/dist_ts_web/plugins.js +11 -0
- package/dist_watch/bundle.js +21871 -0
- package/dist_watch/bundle.js.map +7 -0
- package/dist_watch/index.html +28 -0
- package/license +19 -0
- package/npmextra.json +20 -0
- package/package.json +65 -0
- package/readme.md +7 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.pdfservice.ts +51 -0
- package/ts/helpers.ts +6 -0
- package/ts/index.ts +2 -0
- package/ts/paths.ts +9 -0
- package/ts/plugins.ts +26 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/elements/contentinvoice.ts +385 -0
- package/ts_web/elements/document.ts +168 -0
- package/ts_web/elements/index.ts +8 -0
- package/ts_web/elements/letterheader.ts +125 -0
- package/ts_web/elements/page.ts +142 -0
- package/ts_web/elements/pagecontainer.ts +69 -0
- package/ts_web/elements/pagecontent.ts +147 -0
- package/ts_web/elements/pagefooter.ts +132 -0
- package/ts_web/elements/pageheader.ts +96 -0
- package/ts_web/elements/shared/demoletter.ts +121 -0
- package/ts_web/elements/shared/index.ts +6 -0
- package/ts_web/index.ts +1 -0
- package/ts_web/pages/index.ts +2 -0
- package/ts_web/pages/page1.ts +18 -0
- package/ts_web/pages/page2.ts +5 -0
- package/ts_web/plugins.ts +15 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<!--gitzone element-->
|
|
2
|
+
<!-- made by Task Venture Capital GmbH -->
|
|
3
|
+
<!-- checkout https://maintainedby.lossless.com for awesome OpenSource projects -->
|
|
4
|
+
<html lang="en">
|
|
5
|
+
<head>
|
|
6
|
+
<!--Lets set some basic meta tags-->
|
|
7
|
+
<meta
|
|
8
|
+
name="viewport"
|
|
9
|
+
content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height"
|
|
10
|
+
/>
|
|
11
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
12
|
+
|
|
13
|
+
<!--Lets load standard fonts-->
|
|
14
|
+
<link rel="preconnect" href="https://assetbroker.lossless.one/" crossorigin>
|
|
15
|
+
<link rel="stylesheet" href="https://assetbroker.lossless.one/fonts/fonts.css">
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
body {
|
|
19
|
+
margin: 0px;
|
|
20
|
+
background: #222222;
|
|
21
|
+
}
|
|
22
|
+
</style>
|
|
23
|
+
|
|
24
|
+
<script type="module" src="/bundle.js"></script>
|
|
25
|
+
</head>
|
|
26
|
+
<body>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
package/license
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright (c) 2022 Lossless GmbH (hello@lossless.com)
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
package/npmextra.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"gitzone": {
|
|
3
|
+
"projectType": "wcc",
|
|
4
|
+
"module": {
|
|
5
|
+
"githost": "gitlab.com",
|
|
6
|
+
"gitscope": "designestate/private",
|
|
7
|
+
"gitrepo": "dedocument-catalog",
|
|
8
|
+
"description": "a catalog for creating documents like invoices",
|
|
9
|
+
"npmPackagename": "@designestate_private/dedocument-catalog",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"projectDomain": "design.estate",
|
|
12
|
+
"shortDescription": "undefined variable"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"npmci": {
|
|
16
|
+
"npmGlobalTools": [],
|
|
17
|
+
"npmAccessLevel": "private",
|
|
18
|
+
"npmRegistryUrl": "verdaccio2.lossless.one"
|
|
19
|
+
}
|
|
20
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@design.estate/dees-document",
|
|
3
|
+
"version": "1.0.91",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "a catalog for creating documents like invoices",
|
|
6
|
+
"main": "dist_ts_web/index.js",
|
|
7
|
+
"typings": "dist_ts_web/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
"./ts": "./dist_ts/index.js",
|
|
10
|
+
"./ts_web": "./dist_ts_web/index.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"test": "npm run build && tstest test/",
|
|
14
|
+
"build": "tsbuild --allowimplicitany && tsbuild element --allowimplicitany && tsbundle element --production",
|
|
15
|
+
"watch": "tswatch element"
|
|
16
|
+
},
|
|
17
|
+
"author": "Lossless GmbH",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@design.estate/dees-domtools": "^2.0.34",
|
|
21
|
+
"@design.estate/dees-element": "^2.0.23",
|
|
22
|
+
"@design.estate/dees-wcctools": "^1.0.76",
|
|
23
|
+
"@git.zone/tsrun": "^1.2.44",
|
|
24
|
+
"@push.rocks/smartfile": "^10.0.26",
|
|
25
|
+
"@push.rocks/smartjson": "^5.0.10",
|
|
26
|
+
"@push.rocks/smartpath": "^5.0.5",
|
|
27
|
+
"@push.rocks/smartpdf": "^3.0.16",
|
|
28
|
+
"@push.rocks/smarttime": "^4.0.1",
|
|
29
|
+
"@tsclass/tsclass": "^4.0.46",
|
|
30
|
+
"@types/qrcode": "^1.5.2",
|
|
31
|
+
"qrcode": "^1.5.3"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@git.zone/tsbuild": "^2.1.66",
|
|
35
|
+
"@git.zone/tsbundle": "^2.0.8",
|
|
36
|
+
"@git.zone/tstest": "^1.0.77",
|
|
37
|
+
"@git.zone/tswatch": "^2.0.7",
|
|
38
|
+
"@push.rocks/projectinfo": "^5.0.1",
|
|
39
|
+
"@push.rocks/tapbundle": "^5.0.8"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"ts/**/*",
|
|
43
|
+
"ts_web/**/*",
|
|
44
|
+
"dist/**/*",
|
|
45
|
+
"dist_*/**/*",
|
|
46
|
+
"dist_ts/**/*",
|
|
47
|
+
"dist_ts_web/**/*",
|
|
48
|
+
"assets/**/*",
|
|
49
|
+
"cli.js",
|
|
50
|
+
"npmextra.json",
|
|
51
|
+
"readme.md"
|
|
52
|
+
],
|
|
53
|
+
"browserslist": [
|
|
54
|
+
"last 1 Chrome versions"
|
|
55
|
+
],
|
|
56
|
+
"type": "module",
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "git+https://gitlab.com/designestate/private/dedocument-catalog.git"
|
|
60
|
+
},
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://gitlab.com/designestate/private/dedocument-catalog/issues"
|
|
63
|
+
},
|
|
64
|
+
"homepage": "https://gitlab.com/designestate/private/dedocument-catalog#readme"
|
|
65
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as paths from './paths.js';
|
|
3
|
+
import * as helpers from './helpers.js';
|
|
4
|
+
|
|
5
|
+
export interface IPdfServiceConstructorOptions {
|
|
6
|
+
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* a pdf service for generating pdfs
|
|
11
|
+
*/
|
|
12
|
+
export class PdfService {
|
|
13
|
+
// INSTANCE
|
|
14
|
+
options: IPdfServiceConstructorOptions;
|
|
15
|
+
|
|
16
|
+
public smartpdfInstance: plugins.smartpdf.SmartPdf;
|
|
17
|
+
|
|
18
|
+
constructor(optionsArg: IPdfServiceConstructorOptions) {
|
|
19
|
+
this.options = optionsArg;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* starts the PdfService
|
|
24
|
+
*/
|
|
25
|
+
public async start() {
|
|
26
|
+
this.smartpdfInstance = new plugins.smartpdf.SmartPdf();
|
|
27
|
+
await this.smartpdfInstance.start();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* stops the PdfService
|
|
32
|
+
*/
|
|
33
|
+
public async stop() {
|
|
34
|
+
await this.smartpdfInstance.stop();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* creates an letter
|
|
39
|
+
*/
|
|
40
|
+
public async createPdfFromLetterObject(letterDataArg: plugins.tsclass.business.ILetter) {
|
|
41
|
+
const html = `
|
|
42
|
+
<script type="module">
|
|
43
|
+
${await helpers.getBundleAsString()}
|
|
44
|
+
</script>
|
|
45
|
+
<dedocument-dedocument printMode letterData="${plugins.smartjson.stringifyBase64(letterDataArg)}"></dedocument-dedocument>
|
|
46
|
+
`;
|
|
47
|
+
// console.log(html);
|
|
48
|
+
const pdfResult = await this.smartpdfInstance.getA4PdfResultForHtmlString(html);
|
|
49
|
+
return pdfResult;
|
|
50
|
+
}
|
|
51
|
+
}
|
package/ts/helpers.ts
ADDED
package/ts/index.ts
ADDED
package/ts/paths.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
|
|
3
|
+
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
4
|
+
|
|
5
|
+
export const nogitDir = plugins.path.join(packageDir, '.nogit/');
|
|
6
|
+
plugins.smartfile.fs.ensureDirSync(nogitDir);
|
|
7
|
+
|
|
8
|
+
export const bundleDir = plugins.path.join(packageDir, './dist_bundle');
|
|
9
|
+
export const bundleFile = plugins.path.join(bundleDir, './bundle.js');
|
package/ts/plugins.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// node native
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
export {
|
|
5
|
+
path
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// @push.rocks/scope
|
|
9
|
+
import * as smartfile from '@push.rocks/smartfile';
|
|
10
|
+
import * as smartjson from '@push.rocks/smartjson';
|
|
11
|
+
import * as smartpath from '@push.rocks/smartpath';
|
|
12
|
+
import * as smartpdf from '@push.rocks/smartpdf';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
smartfile,
|
|
16
|
+
smartpath,
|
|
17
|
+
smartjson,
|
|
18
|
+
smartpdf,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// @tsclass scope
|
|
22
|
+
import * as tsclass from '@tsclass/tsclass';
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
tsclass,
|
|
26
|
+
}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* content for invoices
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
DeesElement,
|
|
7
|
+
property,
|
|
8
|
+
html,
|
|
9
|
+
customElement,
|
|
10
|
+
type TemplateResult,
|
|
11
|
+
css,
|
|
12
|
+
cssManager,
|
|
13
|
+
unsafeCSS,
|
|
14
|
+
render,
|
|
15
|
+
} from '@design.estate/dees-element';
|
|
16
|
+
import * as domtools from '@design.estate/dees-domtools';
|
|
17
|
+
|
|
18
|
+
import * as plugins from '../plugins.js';
|
|
19
|
+
|
|
20
|
+
import * as shared from './shared/index.js';
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
declare global {
|
|
24
|
+
interface HTMLElementTagNameMap {
|
|
25
|
+
'dedocument-contentinvoice': DeContentInvoice;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@customElement('dedocument-contentinvoice')
|
|
30
|
+
export class DeContentInvoice extends DeesElement {
|
|
31
|
+
public static demo = () => html`
|
|
32
|
+
<style>
|
|
33
|
+
.demoContainer {
|
|
34
|
+
background: white;
|
|
35
|
+
padding: 50px;
|
|
36
|
+
}
|
|
37
|
+
</style>
|
|
38
|
+
<div class="demoContainer">
|
|
39
|
+
<dedocument-contentinvoice></dedocument-contentinvoice>
|
|
40
|
+
</div>
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
@property({
|
|
44
|
+
type: Object,
|
|
45
|
+
reflect: true,
|
|
46
|
+
})
|
|
47
|
+
public letterData: plugins.tsclass.business.ILetter;
|
|
48
|
+
|
|
49
|
+
constructor() {
|
|
50
|
+
super();
|
|
51
|
+
domtools.DomTools.setupDomTools();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public static styles = [
|
|
55
|
+
domtools.elementBasic.staticStyles,
|
|
56
|
+
css`
|
|
57
|
+
:host {
|
|
58
|
+
color: #333;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.trimmedContent {
|
|
62
|
+
display: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.repeatedContent {
|
|
66
|
+
}
|
|
67
|
+
`,
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
public render(): TemplateResult {
|
|
71
|
+
return html`
|
|
72
|
+
<div class="trimmedContent"></div>
|
|
73
|
+
<div class="repeatedContent"></div>
|
|
74
|
+
<div class="currentContent"></div>
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public getTotalNet = (): number => {
|
|
79
|
+
let totalNet = 0;
|
|
80
|
+
|
|
81
|
+
if (!this.letterData) {
|
|
82
|
+
return totalNet;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const item of this.letterData.content.invoiceData.items) {
|
|
86
|
+
totalNet += item.unitNetPrice * item.unitQuantity;
|
|
87
|
+
}
|
|
88
|
+
return totalNet;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
public getTotalGross = (): number => {
|
|
92
|
+
let totalVat = 0;
|
|
93
|
+
|
|
94
|
+
if (!this.letterData) {
|
|
95
|
+
return totalVat;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for (const taxgroup of this.getVatGroups()) {
|
|
99
|
+
totalVat += taxgroup.vatAmountSum;
|
|
100
|
+
}
|
|
101
|
+
return this.getTotalNet() + totalVat;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
public getVatGroups = () => {
|
|
105
|
+
const vatGroups: {
|
|
106
|
+
vatPercentage: number;
|
|
107
|
+
items: plugins.tsclass.finance.IInvoice['items'];
|
|
108
|
+
vatAmountSum: number;
|
|
109
|
+
}[] = [];
|
|
110
|
+
|
|
111
|
+
if (!this.letterData) {
|
|
112
|
+
return vatGroups;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const taxAmounts: number[] = [];
|
|
116
|
+
for (const item of this.letterData.content.invoiceData.items) {
|
|
117
|
+
taxAmounts.includes(item.vatPercentage) ? null : taxAmounts.push(item.vatPercentage);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (const taxAmount of taxAmounts) {
|
|
121
|
+
const matchingItems = this.letterData.content.invoiceData.items.filter(
|
|
122
|
+
(itemArg) => itemArg.vatPercentage === taxAmount
|
|
123
|
+
);
|
|
124
|
+
let sum = 0;
|
|
125
|
+
for (const matchingItem of matchingItems) {
|
|
126
|
+
sum += matchingItem.unitNetPrice * matchingItem.unitQuantity * (taxAmount / 100);
|
|
127
|
+
}
|
|
128
|
+
vatGroups.push({
|
|
129
|
+
items: matchingItems,
|
|
130
|
+
vatPercentage: taxAmount,
|
|
131
|
+
vatAmountSum: Math.round(sum * 100) / 100,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return vatGroups;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
public async getContentNodes() {
|
|
138
|
+
await this.elementDomReady;
|
|
139
|
+
return {
|
|
140
|
+
currentContent: this.shadowRoot.querySelector('.currentContent') as HTMLElement,
|
|
141
|
+
trimmedContent: this.shadowRoot.querySelector('.trimmedContent') as HTMLElement,
|
|
142
|
+
repeatedContent: this.shadowRoot.querySelector('.repeatedContent') as HTMLElement,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public async getContentLength() {
|
|
147
|
+
await this.elementDomReady;
|
|
148
|
+
return (await this.getContentNodes()).currentContent.children.length;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public async trimEndByOne() {
|
|
152
|
+
await this.elementDomReady;
|
|
153
|
+
this.shadowRoot
|
|
154
|
+
.querySelector('.trimmedContent')
|
|
155
|
+
.append(
|
|
156
|
+
(await this.getContentNodes()).currentContent.children.item(
|
|
157
|
+
(await this.getContentNodes()).currentContent.children.length - 1
|
|
158
|
+
)
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public async trimStartToOffset(contentOffsetArg: number) {
|
|
163
|
+
await this.elementDomReady;
|
|
164
|
+
const beginningLength = (await this.getContentNodes()).currentContent.children.length;
|
|
165
|
+
while (
|
|
166
|
+
(await this.getContentNodes()).currentContent.children.length !==
|
|
167
|
+
beginningLength - contentOffsetArg
|
|
168
|
+
) {
|
|
169
|
+
(await this.getContentNodes()).trimmedContent.append(
|
|
170
|
+
(await this.getContentNodes()).currentContent.children.item(0)
|
|
171
|
+
);
|
|
172
|
+
console.log('hey' + this.shadowRoot.children.length);
|
|
173
|
+
}
|
|
174
|
+
if (
|
|
175
|
+
(await this.getContentNodes()).currentContent.children
|
|
176
|
+
.item(0)
|
|
177
|
+
.classList.contains('needsDataHeader')
|
|
178
|
+
) {
|
|
179
|
+
const trimmedContent = (await this.getContentNodes()).trimmedContent;
|
|
180
|
+
let startPoint = trimmedContent.children.length;
|
|
181
|
+
while (startPoint > 0) {
|
|
182
|
+
const element = trimmedContent.children.item(startPoint - 1);
|
|
183
|
+
if (element.classList.contains('dataHeader')) {
|
|
184
|
+
(await this.getContentNodes()).repeatedContent.append(element);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
startPoint--;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public async firstUpdated(_changedProperties: Map<string | number | symbol, unknown>) {
|
|
193
|
+
super.firstUpdated(_changedProperties);
|
|
194
|
+
this.attachInvoiceDom();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public async attachInvoiceDom() {
|
|
198
|
+
const contentNodes = await this.getContentNodes();
|
|
199
|
+
render(
|
|
200
|
+
html`
|
|
201
|
+
<style>
|
|
202
|
+
.grid {
|
|
203
|
+
display: grid;
|
|
204
|
+
grid-template-columns: 40px auto 80px 80px 90px 90px;
|
|
205
|
+
}
|
|
206
|
+
.topLine {
|
|
207
|
+
margin-top: 5px;
|
|
208
|
+
background: #e7e7e7;
|
|
209
|
+
font-weight: bold;
|
|
210
|
+
}
|
|
211
|
+
.lineItem {
|
|
212
|
+
font-size: 12px;
|
|
213
|
+
padding: 5px;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.invoiceLine {
|
|
217
|
+
border-bottom: 1px dotted #ccc;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.sums {
|
|
221
|
+
margin-top: 5px;
|
|
222
|
+
font-size: 12px;
|
|
223
|
+
padding-left: 50%;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.sums .sumline {
|
|
227
|
+
margin-top: 3px;
|
|
228
|
+
display: grid;
|
|
229
|
+
grid-template-columns: auto 90px;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.sums .sumline .label {
|
|
233
|
+
padding: 2px 5px;
|
|
234
|
+
border-right: 1px solid #ccc;
|
|
235
|
+
text-align: right;
|
|
236
|
+
font-weight: bold;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.sums .sumline .value {
|
|
240
|
+
padding: 2px 5px;
|
|
241
|
+
font-weight: bold;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.divider {
|
|
245
|
+
margin-top: 8px;
|
|
246
|
+
border-top: 1px dotted #ccc;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.taxNote {
|
|
250
|
+
font-size: 12px;
|
|
251
|
+
padding: 4px;
|
|
252
|
+
background: #eeeeeb;
|
|
253
|
+
text-align: center;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.infoBox {
|
|
257
|
+
border-radius: 7px;
|
|
258
|
+
border: 1px solid #ddd;
|
|
259
|
+
border-left: 3px solid #c5e1a5;
|
|
260
|
+
padding: 8px;
|
|
261
|
+
margin-top: 16px;
|
|
262
|
+
line-height: 1.4em;
|
|
263
|
+
font-size: 16px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.infoBox .label {
|
|
267
|
+
padding-bottom: 2px;
|
|
268
|
+
font-size: 12px;
|
|
269
|
+
font-weight: bold;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.paymentCode {
|
|
273
|
+
text-align: center;
|
|
274
|
+
border-left: 2px solid #666;
|
|
275
|
+
}
|
|
276
|
+
</style>
|
|
277
|
+
<div>We hereby invoice products and services provided to you by Lossless GmbH:</div>
|
|
278
|
+
<div class="grid topLine dataHeader">
|
|
279
|
+
<div class="lineItem">Item Pos.</div>
|
|
280
|
+
<div class="lineItem">Description</div>
|
|
281
|
+
<div class="lineItem">Quantity</div>
|
|
282
|
+
<div class="lineItem">Unit Type</div>
|
|
283
|
+
<div class="lineItem">Unit Net Price</div>
|
|
284
|
+
<div class="lineItem">Total Net Price</div>
|
|
285
|
+
</div>
|
|
286
|
+
${(() => {
|
|
287
|
+
let counter = 1;
|
|
288
|
+
return this.letterData?.content.invoiceData?.items?.map(
|
|
289
|
+
(invoiceItem) => html`
|
|
290
|
+
<div class="grid invoiceLine needsDataHeader">
|
|
291
|
+
<div class="lineItem">${counter++}</div>
|
|
292
|
+
<div class="lineItem">${invoiceItem.name}</div>
|
|
293
|
+
<div class="lineItem">${invoiceItem.unitQuantity}</div>
|
|
294
|
+
<div class="lineItem">${invoiceItem.unitType}</div>
|
|
295
|
+
<div class="lineItem">${invoiceItem.unitNetPrice} ${invoiceItem.currency}</div>
|
|
296
|
+
<div class="lineItem">
|
|
297
|
+
${invoiceItem.unitQuantity * invoiceItem.unitNetPrice} ${invoiceItem.currency}
|
|
298
|
+
</div>
|
|
299
|
+
</div>
|
|
300
|
+
`
|
|
301
|
+
);
|
|
302
|
+
})()}
|
|
303
|
+
<div class="sums">
|
|
304
|
+
<div class="sumline">
|
|
305
|
+
<div class="label">Total net</div>
|
|
306
|
+
<div class="value">${this.getTotalNet()} EUR</div>
|
|
307
|
+
</div>
|
|
308
|
+
${this.getVatGroups().map((vatGroupArg) => {
|
|
309
|
+
let itemNumbers = '';
|
|
310
|
+
for (const item of vatGroupArg.items) {
|
|
311
|
+
const itemIndex = this.letterData.content.invoiceData.items.indexOf(item);
|
|
312
|
+
itemNumbers += ` ${itemIndex + 1},`;
|
|
313
|
+
}
|
|
314
|
+
return html`
|
|
315
|
+
<div class="sumline">
|
|
316
|
+
<div class="label">
|
|
317
|
+
Vat ${vatGroupArg.vatPercentage}%<br />
|
|
318
|
+
<span style="font-weight: normal">(on item positions: ${itemNumbers})</span>
|
|
319
|
+
</div>
|
|
320
|
+
<div class="value">${vatGroupArg.vatAmountSum} EUR</div>
|
|
321
|
+
</div>
|
|
322
|
+
`;
|
|
323
|
+
})}
|
|
324
|
+
<div class="sumline">
|
|
325
|
+
<div class="label">Total gross</div>
|
|
326
|
+
<div class="value">${this.getTotalGross()} EUR</div>
|
|
327
|
+
</div>
|
|
328
|
+
</div>
|
|
329
|
+
<div class="divider"></div>
|
|
330
|
+
${this.letterData?.content.invoiceData.reverseCharge
|
|
331
|
+
? html`
|
|
332
|
+
<div class="taxNote">
|
|
333
|
+
VAT arises on a reverse charge basis and is payable by the customer.
|
|
334
|
+
</div>
|
|
335
|
+
`
|
|
336
|
+
: ``}
|
|
337
|
+
<div class="infoBox">
|
|
338
|
+
<div class="label">Payment Terms:</div>
|
|
339
|
+
Payment is due within 30 days starting from the reception of this invoice. Please use the
|
|
340
|
+
following SEPA details:
|
|
341
|
+
<br /><br />
|
|
342
|
+
Beneficiary: ${this.letterData?.from.name}<br />
|
|
343
|
+
IBAN: ${this.letterData?.from?.sepaConnection?.iban}<br />
|
|
344
|
+
BIC: ${this.letterData?.from?.sepaConnection?.bic}<br />
|
|
345
|
+
Description: ${this.letterData?.content.invoiceData?.id}<br />
|
|
346
|
+
Amount: ${this.getTotalGross()} ${this.letterData?.content.invoiceData.items[0].currency}
|
|
347
|
+
</div>
|
|
348
|
+
${this.letterData?.content?.contractData?.contractDate
|
|
349
|
+
? html`
|
|
350
|
+
<div class="infoBox">
|
|
351
|
+
<div class="label">Referenced contract:</div>
|
|
352
|
+
This invoice is adhering to agreements made by contract between the parties on
|
|
353
|
+
${plugins.smarttime.ExtendedDate.fromMillis(this.letterData?.content.contractData.contractDate).format('MMMM D, YYYY')}.
|
|
354
|
+
</div>
|
|
355
|
+
`
|
|
356
|
+
: html``}
|
|
357
|
+
<div class="infoBox paymentCode">
|
|
358
|
+
<div class="label">Sepa Payment Code:</div>
|
|
359
|
+
</div>
|
|
360
|
+
`,
|
|
361
|
+
contentNodes.currentContent
|
|
362
|
+
);
|
|
363
|
+
const canvas = document.createElement('canvas');
|
|
364
|
+
plugins.qrcode.toCanvas(
|
|
365
|
+
canvas,
|
|
366
|
+
`BCD
|
|
367
|
+
001
|
|
368
|
+
1
|
|
369
|
+
SCT
|
|
370
|
+
${this.letterData.content.invoiceData.billedBy.sepaConnection.bic}
|
|
371
|
+
${this.letterData.content.invoiceData.billedBy.name}
|
|
372
|
+
${this.letterData.content.invoiceData.billedBy.sepaConnection.iban}
|
|
373
|
+
EUR${this.getTotalGross()}
|
|
374
|
+
CHAR
|
|
375
|
+
${this.letterData.content.invoiceData.id}
|
|
376
|
+
${this.letterData.content.invoiceData.id}
|
|
377
|
+
EPC QR Code`,
|
|
378
|
+
(error) => {
|
|
379
|
+
if (error) console.error(error);
|
|
380
|
+
console.log('success!');
|
|
381
|
+
}
|
|
382
|
+
);
|
|
383
|
+
contentNodes.currentContent.querySelector('.paymentCode').append(canvas);
|
|
384
|
+
}
|
|
385
|
+
}
|