@seidor-cloud-produtos/tax-core 0.0.9-beta13 → 0.0.9-beta3
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/lib/taxReport/Block.ts +58 -0
- package/lib/taxReport/CounterBlock.ts +14 -0
- package/lib/taxReport/CounterRegister.ts +20 -0
- package/lib/taxReport/Decorators.ts +242 -0
- package/lib/taxReport/Register.ts +42 -0
- package/lib/taxReport/ReportGenerator.ts +178 -0
- package/lib/taxReport/TagCounter.ts +45 -0
- package/lib/taxReport/TaxReport.ts +21 -0
- package/lib/taxReport/implementations/ConsoleOutput.ts +16 -0
- package/lib/taxReport/implementations/MemoryPersist.ts +63 -0
- package/lib/taxReport/implementations/TaxRegisterGenerator.ts +116 -0
- package/lib/taxReport/index.ts +29 -0
- package/lib/taxReport/interfaces/BlocksIterator.ts +3 -0
- package/lib/taxReport/interfaces/OutputWriter.ts +4 -0
- package/lib/taxReport/interfaces/RegisterEventNotifier.ts +30 -0
- package/lib/taxReport/interfaces/RegisterGenerator.ts +6 -0
- package/lib/taxReport/interfaces/RegisterPersist.ts +11 -0
- package/lib/taxReport/interfaces/RegisterSubscriber.ts +5 -0
- package/package.json +7 -12
- package/dist/Decorators-DhoiAspk.d.mts +0 -50
- package/dist/Decorators-DhoiAspk.d.ts +0 -50
- package/dist/Register-DYZa-bHZ.d.mts +0 -37
- package/dist/Register-DYZa-bHZ.d.ts +0 -37
- package/dist/ReportGenerator-DvTuQ4Xj.d.ts +0 -59
- package/dist/ReportGenerator-vfu8wCSF.d.mts +0 -59
- package/dist/index.d.mts +0 -12
- package/dist/index.d.ts +0 -12
- package/dist/index.js +0 -631
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -606
- package/dist/index.mjs.map +0 -1
- package/dist/taxReport/Block.d.mts +0 -19
- package/dist/taxReport/Block.d.ts +0 -19
- package/dist/taxReport/Block.js +0 -78
- package/dist/taxReport/Block.js.map +0 -1
- package/dist/taxReport/Block.mjs +0 -59
- package/dist/taxReport/Block.mjs.map +0 -1
- package/dist/taxReport/CounterBlock.d.mts +0 -10
- package/dist/taxReport/CounterBlock.d.ts +0 -10
- package/dist/taxReport/CounterBlock.js +0 -89
- package/dist/taxReport/CounterBlock.js.map +0 -1
- package/dist/taxReport/CounterBlock.mjs +0 -68
- package/dist/taxReport/CounterBlock.mjs.map +0 -1
- package/dist/taxReport/CounterRegister.d.mts +0 -13
- package/dist/taxReport/CounterRegister.d.ts +0 -13
- package/dist/taxReport/CounterRegister.js +0 -144
- package/dist/taxReport/CounterRegister.js.map +0 -1
- package/dist/taxReport/CounterRegister.mjs +0 -124
- package/dist/taxReport/CounterRegister.mjs.map +0 -1
- package/dist/taxReport/Decorators.d.mts +0 -1
- package/dist/taxReport/Decorators.d.ts +0 -1
- package/dist/taxReport/Decorators.js +0 -150
- package/dist/taxReport/Decorators.js.map +0 -1
- package/dist/taxReport/Decorators.mjs +0 -117
- package/dist/taxReport/Decorators.mjs.map +0 -1
- package/dist/taxReport/Register.d.mts +0 -1
- package/dist/taxReport/Register.d.ts +0 -1
- package/dist/taxReport/Register.js +0 -119
- package/dist/taxReport/Register.js.map +0 -1
- package/dist/taxReport/Register.mjs +0 -95
- package/dist/taxReport/Register.mjs.map +0 -1
- package/dist/taxReport/ReportGenerator.d.mts +0 -7
- package/dist/taxReport/ReportGenerator.d.ts +0 -7
- package/dist/taxReport/ReportGenerator.js +0 -556
- package/dist/taxReport/ReportGenerator.js.map +0 -1
- package/dist/taxReport/ReportGenerator.mjs +0 -529
- package/dist/taxReport/ReportGenerator.mjs.map +0 -1
- package/dist/taxReport/TagCounter.d.mts +0 -11
- package/dist/taxReport/TagCounter.d.ts +0 -11
- package/dist/taxReport/TagCounter.js +0 -64
- package/dist/taxReport/TagCounter.js.map +0 -1
- package/dist/taxReport/TagCounter.mjs +0 -45
- package/dist/taxReport/TagCounter.mjs.map +0 -1
- package/dist/taxReport/TaxReport.d.mts +0 -13
- package/dist/taxReport/TaxReport.d.ts +0 -13
- package/dist/taxReport/TaxReport.js +0 -44
- package/dist/taxReport/TaxReport.js.map +0 -1
- package/dist/taxReport/TaxReport.mjs +0 -25
- package/dist/taxReport/TaxReport.mjs.map +0 -1
- package/dist/taxReport/implementations/ConsoleOutput.d.mts +0 -10
- package/dist/taxReport/implementations/ConsoleOutput.d.ts +0 -10
- package/dist/taxReport/implementations/ConsoleOutput.js +0 -39
- package/dist/taxReport/implementations/ConsoleOutput.js.map +0 -1
- package/dist/taxReport/implementations/ConsoleOutput.mjs +0 -18
- package/dist/taxReport/implementations/ConsoleOutput.mjs.map +0 -1
- package/dist/taxReport/implementations/MemoryPersist.d.mts +0 -19
- package/dist/taxReport/implementations/MemoryPersist.d.ts +0 -19
- package/dist/taxReport/implementations/MemoryPersist.js +0 -77
- package/dist/taxReport/implementations/MemoryPersist.js.map +0 -1
- package/dist/taxReport/implementations/MemoryPersist.mjs +0 -58
- package/dist/taxReport/implementations/MemoryPersist.mjs.map +0 -1
- package/dist/taxReport/implementations/TaxRegisterGenerator.d.mts +0 -24
- package/dist/taxReport/implementations/TaxRegisterGenerator.d.ts +0 -24
- package/dist/taxReport/implementations/TaxRegisterGenerator.js +0 -124
- package/dist/taxReport/implementations/TaxRegisterGenerator.js.map +0 -1
- package/dist/taxReport/implementations/TaxRegisterGenerator.mjs +0 -103
- package/dist/taxReport/implementations/TaxRegisterGenerator.mjs.map +0 -1
- package/dist/taxReport/interfaces/BlocksIterator.d.mts +0 -2
- package/dist/taxReport/interfaces/BlocksIterator.d.ts +0 -2
- package/dist/taxReport/interfaces/BlocksIterator.js +0 -2
- package/dist/taxReport/interfaces/BlocksIterator.js.map +0 -1
- package/dist/taxReport/interfaces/BlocksIterator.mjs +0 -1
- package/dist/taxReport/interfaces/BlocksIterator.mjs.map +0 -1
- package/dist/taxReport/interfaces/OutputWriter.d.mts +0 -6
- package/dist/taxReport/interfaces/OutputWriter.d.ts +0 -6
- package/dist/taxReport/interfaces/OutputWriter.js +0 -19
- package/dist/taxReport/interfaces/OutputWriter.js.map +0 -1
- package/dist/taxReport/interfaces/OutputWriter.mjs +0 -1
- package/dist/taxReport/interfaces/OutputWriter.mjs.map +0 -1
- package/dist/taxReport/interfaces/RegisterEventNotifier.d.mts +0 -1
- package/dist/taxReport/interfaces/RegisterEventNotifier.d.ts +0 -1
- package/dist/taxReport/interfaces/RegisterEventNotifier.js +0 -46
- package/dist/taxReport/interfaces/RegisterEventNotifier.js.map +0 -1
- package/dist/taxReport/interfaces/RegisterEventNotifier.mjs +0 -20
- package/dist/taxReport/interfaces/RegisterEventNotifier.mjs.map +0 -1
- package/dist/taxReport/interfaces/RegisterGenerator.d.mts +0 -8
- package/dist/taxReport/interfaces/RegisterGenerator.d.ts +0 -8
- package/dist/taxReport/interfaces/RegisterGenerator.js +0 -19
- package/dist/taxReport/interfaces/RegisterGenerator.js.map +0 -1
- package/dist/taxReport/interfaces/RegisterGenerator.mjs +0 -1
- package/dist/taxReport/interfaces/RegisterGenerator.mjs.map +0 -1
- package/dist/taxReport/interfaces/RegisterPersist.d.mts +0 -13
- package/dist/taxReport/interfaces/RegisterPersist.d.ts +0 -13
- package/dist/taxReport/interfaces/RegisterPersist.js +0 -19
- package/dist/taxReport/interfaces/RegisterPersist.js.map +0 -1
- package/dist/taxReport/interfaces/RegisterPersist.mjs +0 -1
- package/dist/taxReport/interfaces/RegisterPersist.mjs.map +0 -1
- package/dist/taxReport/interfaces/RegisterSubscriber.d.mts +0 -1
- package/dist/taxReport/interfaces/RegisterSubscriber.d.ts +0 -1
- package/dist/taxReport/interfaces/RegisterSubscriber.js +0 -19
- package/dist/taxReport/interfaces/RegisterSubscriber.js.map +0 -1
- package/dist/taxReport/interfaces/RegisterSubscriber.mjs +0 -1
- package/dist/taxReport/interfaces/RegisterSubscriber.mjs.map +0 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import RegisterPersist from "./interfaces/RegisterPersist";
|
|
3
|
+
import { Register } from "./Register";
|
|
4
|
+
import RegisterSubscriber from "./interfaces/RegisterSubscriber";
|
|
5
|
+
import RegisterEventNotifier, {
|
|
6
|
+
Event,
|
|
7
|
+
newRegisterEventData,
|
|
8
|
+
RegisterEventData,
|
|
9
|
+
} from "./interfaces/RegisterEventNotifier";
|
|
10
|
+
|
|
11
|
+
export default abstract class Block
|
|
12
|
+
implements RegisterEventNotifier, RegisterSubscriber
|
|
13
|
+
{
|
|
14
|
+
private readonly _name: string;
|
|
15
|
+
private eventEmitter: EventEmitter;
|
|
16
|
+
protected registersPersist: RegisterPersist;
|
|
17
|
+
|
|
18
|
+
protected constructor(name: string, regPersist: RegisterPersist) {
|
|
19
|
+
this._name = name;
|
|
20
|
+
this.eventEmitter = new EventEmitter();
|
|
21
|
+
this.registersPersist = regPersist;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
abstract eventHandler(eventData: RegisterEventData): void;
|
|
25
|
+
|
|
26
|
+
public notifyEvent(eventData: RegisterEventData): void {
|
|
27
|
+
this.eventEmitter.emit(eventData.event, eventData);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get name() {
|
|
31
|
+
return this._name;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
get registers() {
|
|
35
|
+
const sortApproach = (a: Register, b: Register) =>
|
|
36
|
+
a.reg.localeCompare(b.reg);
|
|
37
|
+
return this.registersPersist.all().sort(sortApproach);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public addSubscriber(subscriber: RegisterSubscriber) {
|
|
41
|
+
this.eventEmitter.on(Event.REGISTER_CREATED, function (data) {
|
|
42
|
+
return subscriber.eventHandler.call(subscriber, data);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public addRegister<T extends Register>(register: T) {
|
|
47
|
+
this.registersPersist.add(register);
|
|
48
|
+
this.notifyEvent(newRegisterEventData(register));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public hasContent(): boolean {
|
|
52
|
+
return this.registersPersist.hasRegisters();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public getRegisterByKey(registerKey: string): Register {
|
|
56
|
+
return this.registersPersist.getByKey(registerKey)!;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Block from "./Block";
|
|
2
|
+
import RegisterPersist from "./interfaces/RegisterPersist";
|
|
3
|
+
import {RegisterEventData} from "./interfaces/RegisterEventNotifier";
|
|
4
|
+
|
|
5
|
+
export default class CounterBlock extends Block {
|
|
6
|
+
|
|
7
|
+
constructor(regPersist: RegisterPersist, name: string = "9") {
|
|
8
|
+
super(name, regPersist);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
eventHandler(eventData: RegisterEventData) {
|
|
12
|
+
// throw new Error("Method not implemented.");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Register } from "./Register";
|
|
2
|
+
import { Alphanumeric, Key, Numeric } from "./Decorators";
|
|
3
|
+
import RegisterEventNotifier from "./interfaces/RegisterEventNotifier";
|
|
4
|
+
|
|
5
|
+
export default class CounterRegister extends Register {
|
|
6
|
+
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
@Key()
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
@Alphanumeric()
|
|
11
|
+
reg_blc: string = "";
|
|
12
|
+
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
@Numeric()
|
|
15
|
+
qtd_reg_blc: number = 0;
|
|
16
|
+
|
|
17
|
+
constructor(qtd_reg_blc: number = 0, register: string = "9900") {
|
|
18
|
+
super(register, {} as RegisterEventNotifier);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
|
|
3
|
+
export const keyCompositionMetadata = Symbol("key");
|
|
4
|
+
|
|
5
|
+
export const maximumNumericLength = 19;
|
|
6
|
+
export const defaultAlphanumericLength = 255;
|
|
7
|
+
|
|
8
|
+
export enum FieldDataType {
|
|
9
|
+
alphanumeric,
|
|
10
|
+
numeric,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export enum valueProviderType {
|
|
14
|
+
property,
|
|
15
|
+
method,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface FieldFormat {
|
|
19
|
+
required: boolean;
|
|
20
|
+
dataType: FieldDataType;
|
|
21
|
+
maximumLength: number;
|
|
22
|
+
maximumDecimalsLength: number;
|
|
23
|
+
fillEntireLength: boolean;
|
|
24
|
+
valueProvider: valueProviderType;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function numericField(
|
|
28
|
+
required: boolean,
|
|
29
|
+
maximumLength: number,
|
|
30
|
+
valueProvider: valueProviderType,
|
|
31
|
+
fillEntireLength: boolean = false,
|
|
32
|
+
maximumDecimalsLength: number = 0,
|
|
33
|
+
): FieldFormat {
|
|
34
|
+
return {
|
|
35
|
+
required: required,
|
|
36
|
+
dataType: FieldDataType.numeric,
|
|
37
|
+
maximumLength: maximumLength,
|
|
38
|
+
maximumDecimalsLength: maximumDecimalsLength,
|
|
39
|
+
fillEntireLength: fillEntireLength,
|
|
40
|
+
valueProvider: valueProvider,
|
|
41
|
+
} as FieldFormat;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function alphanumericField(
|
|
45
|
+
required: boolean,
|
|
46
|
+
maximumLength: number,
|
|
47
|
+
valueProvider: valueProviderType,
|
|
48
|
+
fillEntireLength: boolean = false,
|
|
49
|
+
maximumDecimalsLength: number = 0,
|
|
50
|
+
): FieldFormat {
|
|
51
|
+
return {
|
|
52
|
+
required: required,
|
|
53
|
+
dataType: FieldDataType.alphanumeric,
|
|
54
|
+
maximumLength: maximumLength,
|
|
55
|
+
maximumDecimalsLength: maximumDecimalsLength,
|
|
56
|
+
fillEntireLength: fillEntireLength,
|
|
57
|
+
valueProvider: valueProvider,
|
|
58
|
+
} as FieldFormat;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function Numeric(
|
|
62
|
+
required: boolean = false,
|
|
63
|
+
fillEntireLength: boolean = false,
|
|
64
|
+
maximumLength: number = maximumNumericLength,
|
|
65
|
+
) {
|
|
66
|
+
return function (target: any, propertyKey: string, other?: any) {
|
|
67
|
+
Reflect.defineMetadata(
|
|
68
|
+
propertyKey,
|
|
69
|
+
numericField(
|
|
70
|
+
required,
|
|
71
|
+
maximumLength,
|
|
72
|
+
other ? valueProviderType.method : valueProviderType.property,
|
|
73
|
+
fillEntireLength,
|
|
74
|
+
),
|
|
75
|
+
target,
|
|
76
|
+
);
|
|
77
|
+
return other;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//export function Numeric(
|
|
82
|
+
// required: boolean = false,
|
|
83
|
+
// fillEntireLength: boolean = false,
|
|
84
|
+
// maximumLength: number = maximumNumericLength,
|
|
85
|
+
//): PropertyDecorator | MethodDecorator {
|
|
86
|
+
// return function (target: any, propertyKey: string, other: any) {
|
|
87
|
+
// Reflect.defineMetadata(
|
|
88
|
+
// propertyKey,
|
|
89
|
+
// numericField(
|
|
90
|
+
// required,
|
|
91
|
+
// maximumLength,
|
|
92
|
+
// other ? valueProviderType.method : valueProviderType.property,
|
|
93
|
+
// fillEntireLength,
|
|
94
|
+
// ),
|
|
95
|
+
// target,
|
|
96
|
+
// );
|
|
97
|
+
// };
|
|
98
|
+
//}
|
|
99
|
+
|
|
100
|
+
export function Decimal(
|
|
101
|
+
required: boolean = false,
|
|
102
|
+
fillEntireLength: boolean = false,
|
|
103
|
+
maximumLength: number = maximumNumericLength,
|
|
104
|
+
maximumDecimalsLength: number = 2,
|
|
105
|
+
) {
|
|
106
|
+
return function (target: any, propertyKey: string, other?: any) {
|
|
107
|
+
Reflect.defineMetadata(
|
|
108
|
+
propertyKey,
|
|
109
|
+
numericField(
|
|
110
|
+
required,
|
|
111
|
+
maximumLength,
|
|
112
|
+
other ? valueProviderType.method : valueProviderType.property,
|
|
113
|
+
fillEntireLength,
|
|
114
|
+
maximumDecimalsLength,
|
|
115
|
+
),
|
|
116
|
+
target,
|
|
117
|
+
);
|
|
118
|
+
return other;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//export function Decimal(
|
|
123
|
+
// required: boolean = false,
|
|
124
|
+
// fillEntireLength: boolean = false,
|
|
125
|
+
// maximumLength: number = maximumNumericLength,
|
|
126
|
+
// maximumDecimalsLength: number = 2,
|
|
127
|
+
//): PropertyDecorator | MethodDecorator {
|
|
128
|
+
// return function (target: any, propertyKey: string, other: any) {
|
|
129
|
+
// Reflect.defineMetadata(
|
|
130
|
+
// propertyKey,
|
|
131
|
+
// numericField(
|
|
132
|
+
// required,
|
|
133
|
+
// maximumLength,
|
|
134
|
+
// other ? valueProviderType.method : valueProviderType.property,
|
|
135
|
+
// fillEntireLength,
|
|
136
|
+
// maximumDecimalsLength,
|
|
137
|
+
// ),
|
|
138
|
+
// target,
|
|
139
|
+
// );
|
|
140
|
+
// };
|
|
141
|
+
//}
|
|
142
|
+
|
|
143
|
+
export function Alphanumeric(
|
|
144
|
+
required: boolean = false,
|
|
145
|
+
fillEntireLength: boolean = false,
|
|
146
|
+
maximumLength: number = defaultAlphanumericLength
|
|
147
|
+
) {
|
|
148
|
+
return function (target: any, propertyKey: string, other?: any) {
|
|
149
|
+
Reflect.defineMetadata(
|
|
150
|
+
propertyKey,
|
|
151
|
+
alphanumericField(
|
|
152
|
+
required,
|
|
153
|
+
maximumLength,
|
|
154
|
+
other ? valueProviderType.method : valueProviderType.property,
|
|
155
|
+
fillEntireLength,
|
|
156
|
+
),
|
|
157
|
+
target,
|
|
158
|
+
);
|
|
159
|
+
return other;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//export function Alphanumeric(
|
|
164
|
+
// required: boolean = false,
|
|
165
|
+
// fillEntireLength: boolean = false,
|
|
166
|
+
// maximumLength: number = defaultAlphanumericLength,
|
|
167
|
+
//): PropertyDecorator | MethodDecorator {
|
|
168
|
+
// return function (target: any, propertyKey: string, other: any) {
|
|
169
|
+
// Reflect.defineMetadata(
|
|
170
|
+
// propertyKey,
|
|
171
|
+
// alphanumericField(
|
|
172
|
+
// required,
|
|
173
|
+
// maximumLength,
|
|
174
|
+
// other ? valueProviderType.method : valueProviderType.property,
|
|
175
|
+
// fillEntireLength,
|
|
176
|
+
// ),
|
|
177
|
+
// target,
|
|
178
|
+
// );
|
|
179
|
+
// };
|
|
180
|
+
//}
|
|
181
|
+
|
|
182
|
+
export interface KeyComposition {
|
|
183
|
+
fields: KeyFieldDefinition[];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface KeyFieldDefinition {
|
|
187
|
+
fieldName: string;
|
|
188
|
+
valueProvider: valueProviderType;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function key() {
|
|
192
|
+
return {
|
|
193
|
+
fields: [],
|
|
194
|
+
} as KeyComposition;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function keyFieldDefinition(
|
|
198
|
+
fieldName: string,
|
|
199
|
+
valueProvider: valueProviderType,
|
|
200
|
+
) {
|
|
201
|
+
return {
|
|
202
|
+
fieldName: fieldName,
|
|
203
|
+
valueProvider: valueProvider,
|
|
204
|
+
} as KeyFieldDefinition;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function Key() {
|
|
208
|
+
return function (target: any, propertyKey: string, other?: any): void {
|
|
209
|
+
let keyComposition: KeyComposition;
|
|
210
|
+
keyComposition = Reflect.getMetadata(keyCompositionMetadata, target);
|
|
211
|
+
if (!keyComposition) {
|
|
212
|
+
keyComposition = key();
|
|
213
|
+
}
|
|
214
|
+
keyComposition.fields.push(
|
|
215
|
+
keyFieldDefinition(
|
|
216
|
+
propertyKey,
|
|
217
|
+
other ? valueProviderType.method : valueProviderType.property,
|
|
218
|
+
),
|
|
219
|
+
);
|
|
220
|
+
Reflect.defineMetadata(keyCompositionMetadata, keyComposition, target);
|
|
221
|
+
return other;
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
//export function Key(): PropertyDecorator | MethodDecorator {
|
|
226
|
+
// return function (target: any, propertyKey: string, other?: any): void {
|
|
227
|
+
// let keyComposition: KeyComposition;
|
|
228
|
+
// keyComposition = Reflect.getMetadata(keyCompositionMetadata, target);
|
|
229
|
+
// if (!keyComposition) {
|
|
230
|
+
// keyComposition = key();
|
|
231
|
+
// }
|
|
232
|
+
// keyComposition.fields.push(
|
|
233
|
+
// keyFieldDefinition(
|
|
234
|
+
// propertyKey,
|
|
235
|
+
// other ? valueProviderType.method : valueProviderType.property,
|
|
236
|
+
// ),
|
|
237
|
+
// );
|
|
238
|
+
// Reflect.defineMetadata(keyCompositionMetadata, keyComposition, target);
|
|
239
|
+
// };
|
|
240
|
+
//}
|
|
241
|
+
|
|
242
|
+
//export {Numeric, Decimal, Alphanumeric, Key}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Key, KeyComposition, keyCompositionMetadata } from "./Decorators";
|
|
2
|
+
import RegisterEventNotifier, {
|
|
3
|
+
newRegisterEventData,
|
|
4
|
+
} from "./interfaces/RegisterEventNotifier";
|
|
5
|
+
|
|
6
|
+
export abstract class Register {
|
|
7
|
+
[key:string]:any;
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
private _registerNotifier: RegisterEventNotifier;
|
|
11
|
+
private readonly _children: Register[];
|
|
12
|
+
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
@Key()
|
|
15
|
+
reg: string = "";
|
|
16
|
+
constructor(registerTag: string, notifier: RegisterEventNotifier) {
|
|
17
|
+
this._children = [];
|
|
18
|
+
this.reg = registerTag;
|
|
19
|
+
this._registerNotifier = notifier;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
protected addChild(child: Register) {
|
|
23
|
+
this._children.push(child);
|
|
24
|
+
this._registerNotifier!!.notifyEvent(newRegisterEventData(child));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public getChildren(): Register[] {
|
|
28
|
+
return this._children;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public getKeyValue(): string {
|
|
32
|
+
const keyComposition: KeyComposition = Reflect.getMetadata(
|
|
33
|
+
keyCompositionMetadata,
|
|
34
|
+
this,
|
|
35
|
+
);
|
|
36
|
+
let result = "";
|
|
37
|
+
for (const keyFieldData of keyComposition.fields) {
|
|
38
|
+
result = result.concat(this[keyFieldData.fieldName]);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import TaxReport from "./TaxReport";
|
|
2
|
+
import Block from "./Block";
|
|
3
|
+
import { Register } from "./Register";
|
|
4
|
+
import { Alphanumeric, Numeric } from "./Decorators";
|
|
5
|
+
import TagCounter from "./TagCounter";
|
|
6
|
+
import CounterBlock from "./CounterBlock";
|
|
7
|
+
import MemoryPersist from "./implementations/MemoryPersist";
|
|
8
|
+
import CounterRegister from "./CounterRegister";
|
|
9
|
+
import RegisterGenerator from "./interfaces/RegisterGenerator";
|
|
10
|
+
import TaxRegisterGenerator from "./implementations/TaxRegisterGenerator";
|
|
11
|
+
import RegisterEventNotifier from "./interfaces/RegisterEventNotifier";
|
|
12
|
+
|
|
13
|
+
const tagCloseFileRegister = "9999";
|
|
14
|
+
const openSuffix = "001";
|
|
15
|
+
const closeSuffix = "990";
|
|
16
|
+
|
|
17
|
+
export interface ReportGenerationOptions {
|
|
18
|
+
openSuffix: string;
|
|
19
|
+
closeSuffix: string;
|
|
20
|
+
openFileRegister: Register;
|
|
21
|
+
registerGenerator: RegisterGenerator;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
enum IndicatorBlockContent {
|
|
25
|
+
hasContent = 0,
|
|
26
|
+
hasNoContent = 1,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class CloseFile extends Register {
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
@Numeric()
|
|
32
|
+
qtd_lin: number = 0;
|
|
33
|
+
|
|
34
|
+
constructor() {
|
|
35
|
+
super(tagCloseFileRegister, {} as RegisterEventNotifier);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class OpenBlock extends Register {
|
|
40
|
+
constructor(tag: string) {
|
|
41
|
+
super(tag, {} as RegisterEventNotifier);
|
|
42
|
+
}
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
@Alphanumeric(1)
|
|
45
|
+
ind_mov: number = IndicatorBlockContent.hasNoContent;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export class CloseBlock extends Register {
|
|
49
|
+
constructor(tag: string) {
|
|
50
|
+
super(tag, {} as RegisterEventNotifier);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
qtd_lin: number = 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default class ReportGenerator {
|
|
57
|
+
protected _options: ReportGenerationOptions;
|
|
58
|
+
protected _counters: TagCounter;
|
|
59
|
+
|
|
60
|
+
private constructor(options: ReportGenerationOptions) {
|
|
61
|
+
this._options = options;
|
|
62
|
+
this._counters = new TagCounter();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static defaultOptions(
|
|
66
|
+
openFileRegister: Register,
|
|
67
|
+
registerGenerator: RegisterGenerator,
|
|
68
|
+
): ReportGenerationOptions {
|
|
69
|
+
return {
|
|
70
|
+
openSuffix: openSuffix,
|
|
71
|
+
closeSuffix: closeSuffix,
|
|
72
|
+
openFileRegister: openFileRegister,
|
|
73
|
+
registerGenerator: registerGenerator,
|
|
74
|
+
} as ReportGenerationOptions;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static newWithDefaultOptions(openFileRegister: Register): ReportGenerator {
|
|
78
|
+
return this.newWithOptions(
|
|
79
|
+
this.defaultOptions(
|
|
80
|
+
openFileRegister,
|
|
81
|
+
TaxRegisterGenerator.newWithDefaultOptions(),
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
static newWithOptions(options: ReportGenerationOptions): ReportGenerator {
|
|
87
|
+
return new ReportGenerator(options);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private beforeGeneration(taxReport: TaxReport) {
|
|
91
|
+
this.addRegister(this._options.openFileRegister);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private generation(taxReport: TaxReport) {
|
|
95
|
+
const blocks = taxReport.Blocks;
|
|
96
|
+
for (const block of blocks) {
|
|
97
|
+
this.addBlock(block);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private afterGeneration(taxReport: TaxReport) {
|
|
102
|
+
const tagCounters = this._counters.getAllTagsCounters();
|
|
103
|
+
const counterBlock = new CounterBlock(MemoryPersist.createInstance());
|
|
104
|
+
const closeFileRegister = new CloseFile();
|
|
105
|
+
tagCounters.forEach((amount, tag) => {
|
|
106
|
+
const counterRegister = new CounterRegister();
|
|
107
|
+
counterRegister.reg_blc = tag;
|
|
108
|
+
counterRegister.qtd_reg_blc = amount;
|
|
109
|
+
closeFileRegister.qtd_lin += amount;
|
|
110
|
+
counterBlock.addRegister(counterRegister);
|
|
111
|
+
});
|
|
112
|
+
this.addBlock(counterBlock);
|
|
113
|
+
//This should register all lines of the taxReport
|
|
114
|
+
// To calculate this, we need to sum:
|
|
115
|
+
// total lines = registers lines (qtd_reg_blc) +
|
|
116
|
+
// lines of counters (tagCounters.size) +
|
|
117
|
+
// counters open and close line (2) +
|
|
118
|
+
// close file line (1)
|
|
119
|
+
closeFileRegister.qtd_lin += tagCounters.size + 3;
|
|
120
|
+
this._options.registerGenerator.generate(closeFileRegister);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
protected beforeBlockGeneration(block: Block): void {
|
|
124
|
+
const openBlock: OpenBlock = new OpenBlock(
|
|
125
|
+
`${block.name}${this._options.openSuffix}`,
|
|
126
|
+
);
|
|
127
|
+
openBlock.ind_mov = block.hasContent()
|
|
128
|
+
? IndicatorBlockContent.hasContent
|
|
129
|
+
: IndicatorBlockContent.hasNoContent;
|
|
130
|
+
this.addRegister(openBlock);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
protected blockGeneration(block: Block): void {
|
|
134
|
+
for (const register of block.registers) {
|
|
135
|
+
this.addRegister(register);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
protected beforeRegisterGeneration(register: Register) {}
|
|
140
|
+
|
|
141
|
+
protected registerGeneration(register: Register) {
|
|
142
|
+
this._options.registerGenerator.generate(register);
|
|
143
|
+
for (const child of register.getChildren()) {
|
|
144
|
+
this.addRegister(child);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
protected afterRegisterGeneration(register: Register) {
|
|
149
|
+
this._counters.countRegister(register);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
protected afterBlockGeneration(block: Block) {
|
|
153
|
+
const closeBlock: CloseBlock = new CloseBlock(
|
|
154
|
+
`${block.name}${this._options.closeSuffix}`,
|
|
155
|
+
);
|
|
156
|
+
closeBlock.qtd_lin = this._counters.getBlockRegistersTotal(block.name) + 1;
|
|
157
|
+
this.addRegister(closeBlock);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private addBlock(block: Block) {
|
|
161
|
+
this.beforeBlockGeneration(block);
|
|
162
|
+
this.blockGeneration(block);
|
|
163
|
+
this.afterBlockGeneration(block);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private addRegister(register: Register) {
|
|
167
|
+
this.beforeRegisterGeneration(register);
|
|
168
|
+
this.registerGeneration(register);
|
|
169
|
+
this.afterRegisterGeneration(register);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
public generateFile(taxReport: TaxReport): void {
|
|
173
|
+
this.beforeGeneration(taxReport);
|
|
174
|
+
this.generation(taxReport);
|
|
175
|
+
this.afterGeneration(taxReport);
|
|
176
|
+
this._options.registerGenerator.save();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {Register} from "./Register";
|
|
2
|
+
|
|
3
|
+
export default class TagCounter {
|
|
4
|
+
private _blocksCounters: Map<string, Map<string, number>>;
|
|
5
|
+
|
|
6
|
+
public constructor() {
|
|
7
|
+
this._blocksCounters = new Map<string, Map<string, number>>();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public countRegister(register: Register) {
|
|
11
|
+
const blockLetter = register.reg[0];
|
|
12
|
+
|
|
13
|
+
let counters: Map<string, number>;
|
|
14
|
+
counters = !this._blocksCounters.has(blockLetter) ? new Map<string, number>() : this._blocksCounters.get(blockLetter)!
|
|
15
|
+
!counters.has(register.reg) ? counters.set(register.reg, 1) : counters.set(register.reg, (counters.get(register.reg)! + 1))
|
|
16
|
+
this._blocksCounters.set(blockLetter, counters);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public getBlockRegistersTotal(blockLetter: string): number {
|
|
20
|
+
let blockRegistersTotal = 0;
|
|
21
|
+
const blocksCounter = this._blocksCounters.get(blockLetter);
|
|
22
|
+
if (!blocksCounter) {
|
|
23
|
+
return blockRegistersTotal;
|
|
24
|
+
}
|
|
25
|
+
for (const value of blocksCounter.values()) {
|
|
26
|
+
blockRegistersTotal += value
|
|
27
|
+
}
|
|
28
|
+
return blockRegistersTotal
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public getAllTagsCounters(): Map<string, number> {
|
|
32
|
+
const all = new Map<string, number>();
|
|
33
|
+
|
|
34
|
+
const blocksKeys = Array.from(this._blocksCounters.keys()).sort((a, b) => a.localeCompare(b));
|
|
35
|
+
blocksKeys.forEach((blockKey) => {
|
|
36
|
+
const block = this._blocksCounters.get(blockKey)!
|
|
37
|
+
const registerKeys = Array.from(block.keys()).sort((a, b) => a.localeCompare(b));
|
|
38
|
+
registerKeys.forEach((tag) => {
|
|
39
|
+
all.set(tag, block.get(tag)!)
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
return all;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Block from "./Block";
|
|
2
|
+
|
|
3
|
+
export default abstract class TaxReport {
|
|
4
|
+
private readonly _blocks: Map<string, Block>;
|
|
5
|
+
protected constructor() {
|
|
6
|
+
this._blocks = new Map<string, Block>();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
protected registerBlock(block: Block): TaxReport {
|
|
10
|
+
this._blocks.set(block.name, block);
|
|
11
|
+
return this
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
protected getBlock(name: string): Block | undefined {
|
|
15
|
+
return this._blocks.get(name)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get Blocks() {
|
|
19
|
+
return Array.from(this._blocks.values())
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OutputWriter } from "../interfaces/OutputWriter";
|
|
2
|
+
|
|
3
|
+
export default class ConsoleOutput implements OutputWriter {
|
|
4
|
+
private constructor() {}
|
|
5
|
+
|
|
6
|
+
static createInstance(): ConsoleOutput {
|
|
7
|
+
return new ConsoleOutput();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
write(content: string): void {
|
|
11
|
+
console.log(content);
|
|
12
|
+
}
|
|
13
|
+
save(): void {
|
|
14
|
+
console.log("Saving content");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Register } from "../Register";
|
|
2
|
+
import RegisterPersist from "../interfaces/RegisterPersist";
|
|
3
|
+
|
|
4
|
+
export default class MemoryPersist implements RegisterPersist {
|
|
5
|
+
private registers: Map<string, Array<Register>>;
|
|
6
|
+
private registersByKey: Map<string, Register>;
|
|
7
|
+
|
|
8
|
+
public static createInstance(): MemoryPersist {
|
|
9
|
+
return new MemoryPersist();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private constructor() {
|
|
13
|
+
this.registers = new Map<string, Array<Register>>();
|
|
14
|
+
this.registersByKey = new Map<string, Register>();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getByKey(registerKey: string): Register | undefined {
|
|
18
|
+
return this.registersByKey.get(registerKey);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
set(regTag: string, registers: Register[]): void {
|
|
22
|
+
this.registers.set(regTag, registers);
|
|
23
|
+
for (const reg of registers) {
|
|
24
|
+
this.addRegisterKey(reg);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
private addRegisterKey(reg: Register) {
|
|
28
|
+
if (this.registersByKey.has(reg.getKeyValue())) {
|
|
29
|
+
throw new Error(`duplicate register key: ${reg.getKeyValue()}`);
|
|
30
|
+
}
|
|
31
|
+
this.registersByKey.set(reg.getKeyValue(), reg);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
hasRegisters(): boolean {
|
|
35
|
+
return this.registers.size !== 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
all(): Register[] {
|
|
39
|
+
//TODO: Check the expected order of registers
|
|
40
|
+
//TODO: Check the performance + memory use of this implementation
|
|
41
|
+
let localRegisters: Register[] = new Array<Register>();
|
|
42
|
+
for (const [_regTag, values] of this.registers) {
|
|
43
|
+
localRegisters = [...localRegisters, ...values];
|
|
44
|
+
}
|
|
45
|
+
return localRegisters;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get(regTag: string) {
|
|
49
|
+
return this.registers.get(regTag);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
has(regTag: string): boolean {
|
|
53
|
+
return this.registers.has(regTag);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
add(register: Register): void {
|
|
57
|
+
if (!this.registers.has(register.reg)) {
|
|
58
|
+
this.registers.set(register.reg, []);
|
|
59
|
+
}
|
|
60
|
+
this.registers.get(register.reg)?.push(register);
|
|
61
|
+
this.addRegisterKey(register);
|
|
62
|
+
}
|
|
63
|
+
}
|