@things-factory/tax-invoice 8.0.0-beta.8 → 8.0.0

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.
Files changed (51) hide show
  1. package/client/bootstrap.ts +1 -0
  2. package/client/index.ts +0 -0
  3. package/client/pages/main.ts +25 -0
  4. package/client/pages/tax-audit-result/tax-audit-result-importer.ts +87 -0
  5. package/client/pages/tax-audit-result/tax-audit-result-list-page.ts +331 -0
  6. package/client/pages/tax-invoice/tax-invoice-detail-popup.ts +454 -0
  7. package/client/pages/tax-invoice/tax-invoice-list-page.ts +525 -0
  8. package/client/pages/tax-invoice-api/tax-invoice-api-page.ts +418 -0
  9. package/client/pages/tax-invoice-company/tax-invoice-company-list-page.ts +447 -0
  10. package/client/pages/tax-invoice-send/company-list-popup.ts +188 -0
  11. package/client/pages/tax-invoice-send/tax-invoice-send-page.ts +196 -0
  12. package/client/pages/tax-invoice-send/tax-invoice-send.ts +1181 -0
  13. package/client/route.ts +23 -0
  14. package/client/tsconfig.json +11 -0
  15. package/dist-client/tsconfig.tsbuildinfo +1 -1
  16. package/dist-server/tsconfig.tsbuildinfo +1 -1
  17. package/package.json +8 -8
  18. package/server/index.ts +2 -0
  19. package/server/routes.ts +28 -0
  20. package/server/service/index.ts +37 -0
  21. package/server/service/tax-audit-result/event-subscriber.ts +17 -0
  22. package/server/service/tax-audit-result/index.ts +9 -0
  23. package/server/service/tax-audit-result/tax-audit-result-history.ts +120 -0
  24. package/server/service/tax-audit-result/tax-audit-result-mutation.ts +198 -0
  25. package/server/service/tax-audit-result/tax-audit-result-query.ts +65 -0
  26. package/server/service/tax-audit-result/tax-audit-result-type.ts +61 -0
  27. package/server/service/tax-audit-result/tax-audit-result.ts +99 -0
  28. package/server/service/tax-invoice/index.ts +6 -0
  29. package/server/service/tax-invoice/tax-invoice-mutation.ts +138 -0
  30. package/server/service/tax-invoice/tax-invoice-query.ts +99 -0
  31. package/server/service/tax-invoice/tax-invoice-type.ts +236 -0
  32. package/server/service/tax-invoice/tax-invoice-util.ts +224 -0
  33. package/server/service/tax-invoice/tax-invoice.ts +393 -0
  34. package/server/service/tax-invoice-api/index.ts +6 -0
  35. package/server/service/tax-invoice-api/tax-invoice-api-mutation.ts +275 -0
  36. package/server/service/tax-invoice-api/tax-invoice-api-query.ts +40 -0
  37. package/server/service/tax-invoice-api/tax-invoice-api-type.ts +83 -0
  38. package/server/service/tax-invoice-api/tax-invoice-api.ts +128 -0
  39. package/server/service/tax-invoice-company/index.ts +6 -0
  40. package/server/service/tax-invoice-company/tax-invoice-company-mutation.ts +84 -0
  41. package/server/service/tax-invoice-company/tax-invoice-company-query.ts +86 -0
  42. package/server/service/tax-invoice-company/tax-invoice-company-type.ts +105 -0
  43. package/server/service/tax-invoice-company/tax-invoice-company.ts +128 -0
  44. package/server/service/tax-invoice-item/index.ts +6 -0
  45. package/server/service/tax-invoice-item/tax-invoice-item-mutation.ts +128 -0
  46. package/server/service/tax-invoice-item/tax-invoice-item-query.ts +60 -0
  47. package/server/service/tax-invoice-item/tax-invoice-item-type.ts +77 -0
  48. package/server/service/tax-invoice-item/tax-invoice-item.ts +95 -0
  49. package/server/service/unipost-api/tax-invoice-inquiry.ts +99 -0
  50. package/server/service/unipost-api/tax-invoice-send.ts +32 -0
  51. package/server/tsconfig.json +10 -0
@@ -0,0 +1 @@
1
+ export default function bootstrap() {}
File without changes
@@ -0,0 +1,25 @@
1
+ import { html } from 'lit'
2
+ import { customElement, property } from 'lit/decorators.js'
3
+ import { connect } from 'pwa-helpers/connect-mixin.js'
4
+ import { store, PageView } from '@operato/shell'
5
+
6
+ const logo = new URL('/assets/images/hatiolab-logo.png', import.meta.url).href
7
+
8
+ @customElement('tax-invoice-main')
9
+ class TaxInvoiceMain extends connect(store)(PageView) {
10
+ @property({ type: String }) taxInvoice?: string
11
+
12
+ render() {
13
+ return html`
14
+ <section>
15
+ <h2>TaxInvoice</h2>
16
+ <img src=${logo}>
17
+ </section>
18
+ `
19
+ }
20
+
21
+ stateChanged(state) {
22
+ this.taxInvoice = state.taxInvoice.state_main
23
+ }
24
+ }
25
+
@@ -0,0 +1,87 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html, LitElement } from 'lit'
6
+ import { property } from 'lit/decorators.js'
7
+
8
+ import { client } from '@operato/graphql'
9
+ import { i18next } from '@operato/i18n'
10
+ import { isMobileDevice } from '@operato/utils'
11
+ import { CommonHeaderStyles } from '@operato/styles'
12
+
13
+ export class TaxAuditResultImporter extends LitElement {
14
+ static styles = [
15
+ CommonHeaderStyles,
16
+ css`
17
+ :host {
18
+ display: flex;
19
+ flex-direction: column;
20
+
21
+ background-color: var(--md-sys-color-surface);
22
+ }
23
+
24
+ ox-grist {
25
+ flex: 1;
26
+ }
27
+ `
28
+ ]
29
+
30
+ @property({ type: Array }) taxAuditResults: any[] = []
31
+ @property({ type: Object }) columns = {
32
+ list: { fields: ['name', 'description'] },
33
+ pagination: { infinite: true },
34
+ columns: [
35
+ {
36
+ type: 'string',
37
+ name: 'name',
38
+ header: i18next.t('field.name'),
39
+ width: 150
40
+ },
41
+ {
42
+ type: 'string',
43
+ name: 'description',
44
+ header: i18next.t('field.description'),
45
+ width: 200
46
+ },
47
+ {
48
+ type: 'checkbox',
49
+ name: 'active',
50
+ header: i18next.t('field.active'),
51
+ width: 60
52
+ }
53
+ ]
54
+ }
55
+
56
+ render() {
57
+ return html`
58
+ <ox-grist
59
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
60
+ .config=${this.columns}
61
+ .data=${{
62
+ records: this.taxAuditResults
63
+ }}
64
+ ></ox-grist>
65
+
66
+ <div class="footer">
67
+ <div filler></div>
68
+ <button @click=${this.save.bind(this)} done><md-icon>save</md-icon>${i18next.t('button.save')}</button>
69
+ </div>
70
+ `
71
+ }
72
+
73
+ async save() {
74
+ const response = await client.mutate({
75
+ mutation: gql`
76
+ mutation importTaxAuditResults($taxAuditResults: [TaxAuditResultPatch!]!) {
77
+ importTaxAuditResults(taxAuditResults: $taxAuditResults)
78
+ }
79
+ `,
80
+ variables: { taxAuditResults: this.taxAuditResults }
81
+ })
82
+
83
+ if (response.errors?.length) return
84
+
85
+ this.dispatchEvent(new CustomEvent('imported'))
86
+ }
87
+ }
@@ -0,0 +1,331 @@
1
+ import '@operato/data-grist'
2
+
3
+ import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
4
+ import { PageView, store } from '@operato/shell'
5
+ import { css, html } from 'lit'
6
+ import { customElement, property, query } from 'lit/decorators.js'
7
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
8
+ import { ColumnConfig, DataGrist, FetchOption } from '@operato/data-grist'
9
+ import { client } from '@operato/graphql'
10
+ import { i18next, localize } from '@operato/i18n'
11
+ import { notify, openPopup } from '@operato/layout'
12
+ import { OxPopup, OxPrompt } from '@operato/popup'
13
+ import { isMobileDevice } from '@operato/utils'
14
+
15
+ import { connect } from 'pwa-helpers/connect-mixin'
16
+ import gql from 'graphql-tag'
17
+
18
+ import { TaxAuditResultImporter } from './tax-audit-result-importer'
19
+
20
+ @customElement('tax-audit-result-list-page')
21
+ export class TaxAuditResultListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
22
+ static styles = [
23
+ ScrollbarStyles,
24
+ CommonGristStyles,
25
+ CommonHeaderStyles,
26
+ css`
27
+ :host {
28
+ display: flex;
29
+
30
+ width: 100%;
31
+
32
+ --grid-record-emphasized-background-color: red;
33
+ --grid-record-emphasized-color: yellow;
34
+ }
35
+
36
+ ox-grist {
37
+ overflow-y: auto;
38
+ flex: 1;
39
+ }
40
+
41
+ ox-filters-form {
42
+ flex: 1;
43
+ }
44
+ `
45
+ ]
46
+
47
+ static get scopedElements() {
48
+ return {
49
+ 'tax-audit-result-importer': TaxAuditResultImporter
50
+ }
51
+ }
52
+
53
+ @property({ type: Object }) gristConfig: any
54
+ @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'
55
+
56
+ @query('ox-grist') private grist!: DataGrist
57
+
58
+ get context() {
59
+ return {
60
+ title: i18next.t('title.tax-audit-result list'),
61
+ search: {
62
+ handler: (search: string) => {
63
+ this.grist.searchText = search
64
+ },
65
+ value: this.grist.searchText
66
+ },
67
+ filter: {
68
+ handler: () => {
69
+ this.grist.toggleHeadroom()
70
+ }
71
+ },
72
+ help: 'tax-invoice/tax-audit-result',
73
+ actions: [
74
+ {
75
+ title: i18next.t('button.save'),
76
+ action: this._updateTaxAuditResult.bind(this),
77
+ ...CommonButtonStyles.save
78
+ },
79
+ {
80
+ title: i18next.t('button.delete'),
81
+ action: this._deleteTaxAuditResult.bind(this),
82
+ ...CommonButtonStyles.delete
83
+ }
84
+ ],
85
+ exportable: {
86
+ name: i18next.t('title.tax-audit-result list'),
87
+ data: this.exportHandler.bind(this)
88
+ },
89
+ importable: {
90
+ handler: this.importHandler.bind(this)
91
+ }
92
+ }
93
+ }
94
+
95
+ render() {
96
+ const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
97
+
98
+ return html`
99
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
100
+ <div slot="headroom" class="header">
101
+ <div class="filters">
102
+ <ox-filters-form autofocus></ox-filters-form>
103
+
104
+ <div id="modes">
105
+ <md-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</md-icon>
106
+ <md-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</md-icon>
107
+ <md-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</md-icon>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </ox-grist>
112
+ `
113
+ }
114
+
115
+ async pageInitialized(lifecycle: any) {
116
+ this.gristConfig = {
117
+ list: {
118
+ fields: ['name', 'description'],
119
+ details: ['active', 'updatedAt']
120
+ },
121
+ columns: [
122
+ { type: 'gutter', gutterName: 'sequence' },
123
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
124
+ {
125
+ type: 'string',
126
+ name: 'name',
127
+ header: i18next.t('field.name'),
128
+ record: {
129
+ editable: true
130
+ },
131
+ filter: 'search',
132
+ sortable: true,
133
+ width: 150
134
+ },
135
+ {
136
+ type: 'string',
137
+ name: 'description',
138
+ header: i18next.t('field.description'),
139
+ record: {
140
+ editable: true
141
+ },
142
+ filter: 'search',
143
+ width: 200
144
+ },
145
+ {
146
+ type: 'checkbox',
147
+ name: 'active',
148
+ label: true,
149
+ header: i18next.t('field.active'),
150
+ record: {
151
+ editable: true
152
+ },
153
+ filter: true,
154
+ sortable: true,
155
+ width: 60
156
+ },
157
+ {
158
+ type: 'resource-object',
159
+ name: 'updater',
160
+ header: i18next.t('field.updater'),
161
+ record: {
162
+ editable: false
163
+ },
164
+ sortable: true,
165
+ width: 120
166
+ },
167
+ {
168
+ type: 'datetime',
169
+ name: 'updatedAt',
170
+ header: i18next.t('field.updated_at'),
171
+ record: {
172
+ editable: false
173
+ },
174
+ sortable: true,
175
+ width: 180
176
+ }
177
+ ],
178
+ rows: {
179
+ selectable: {
180
+ multiple: true
181
+ }
182
+ },
183
+ sorters: [
184
+ {
185
+ name: 'name'
186
+ }
187
+ ]
188
+ }
189
+ }
190
+
191
+ async pageUpdated(changes: any, lifecycle: any) {
192
+ if (this.active) {
193
+ // do something here when this page just became as active
194
+ }
195
+ }
196
+
197
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {
198
+ const response = await client.query({
199
+ query: gql`
200
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
201
+ responses: taxAuditResults(filters: $filters, pagination: $pagination, sortings: $sortings) {
202
+ items {
203
+ id
204
+ name
205
+ description
206
+ active
207
+ updater {
208
+ id
209
+ name
210
+ }
211
+ updatedAt
212
+ }
213
+ total
214
+ }
215
+ }
216
+ `,
217
+ variables: {
218
+ filters,
219
+ pagination: { page, limit },
220
+ sortings
221
+ }
222
+ })
223
+
224
+ return {
225
+ total: response.data.responses.total || 0,
226
+ records: response.data.responses.items || []
227
+ }
228
+ }
229
+
230
+ async _deleteTaxAuditResult() {
231
+ if (
232
+ await OxPrompt.open({
233
+ title: i18next.t('text.are_you_sure'),
234
+ text: i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }),
235
+ confirmButton: { text: i18next.t('button.confirm') },
236
+ cancelButton: { text: i18next.t('button.cancel') }
237
+ })
238
+ ) {
239
+ const ids = this.grist.selected.map(record => record.id)
240
+ if (ids && ids.length > 0) {
241
+ const response = await client.mutate({
242
+ mutation: gql`
243
+ mutation ($ids: [String!]!) {
244
+ deleteTaxAuditResults(ids: $ids)
245
+ }
246
+ `,
247
+ variables: {
248
+ ids
249
+ }
250
+ })
251
+
252
+ if (!response.errors) {
253
+ this.grist.fetch()
254
+ notify({
255
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
256
+ })
257
+ }
258
+ }
259
+ }
260
+ }
261
+
262
+ async _updateTaxAuditResult() {
263
+ let patches = this.grist.dirtyRecords
264
+ if (patches && patches.length) {
265
+ patches = patches.map(patch => {
266
+ let patchField: any = patch.id ? { id: patch.id } : {}
267
+ const dirtyFields = patch.__dirtyfields__
268
+ for (let key in dirtyFields) {
269
+ patchField[key] = dirtyFields[key].after
270
+ }
271
+ patchField.cuFlag = patch.__dirty__
272
+
273
+ return patchField
274
+ })
275
+
276
+ const response = await client.mutate({
277
+ mutation: gql`
278
+ mutation ($patches: [TaxAuditResultPatch!]!) {
279
+ updateMultipleTaxAuditResult(patches: $patches) {
280
+ name
281
+ }
282
+ }
283
+ `,
284
+ variables: {
285
+ patches
286
+ }
287
+ })
288
+
289
+ if (!response.errors) {
290
+ this.grist.fetch()
291
+ }
292
+ }
293
+ }
294
+
295
+ async exportHandler() {
296
+ const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
297
+ const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
298
+
299
+ return exportTargets.map(taxAuditResult => {
300
+ let tempObj = {}
301
+ for (const field of targetFieldSet) {
302
+ tempObj[field] = taxAuditResult[field]
303
+ }
304
+
305
+ return tempObj
306
+ })
307
+ }
308
+
309
+ async importHandler(records) {
310
+ const popup = openPopup(
311
+ html`
312
+ <tax-audit-result-importer
313
+ .taxAuditResults=${records}
314
+ @imported=${() => {
315
+ history.back()
316
+ this.grist.fetch()
317
+ }}
318
+ ></tax-audit-result-importer>
319
+ `,
320
+ {
321
+ backdrop: true,
322
+ size: 'large',
323
+ title: i18next.t('title.import tax-audit-result')
324
+ }
325
+ )
326
+
327
+ popup.onclosed = () => {
328
+ this.grist.fetch()
329
+ }
330
+ }
331
+ }