@seniorsistemas/hcm-clocking-event-rule-nodejs 0.35.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 (128) hide show
  1. package/.github/copilot-instructions.md +11 -0
  2. package/.github/workflows/release.yaml +10 -0
  3. package/.gitlab-ci.yml +68 -0
  4. package/CHANGELOG.md +274 -0
  5. package/README.doc.md +658 -0
  6. package/README.md +117 -0
  7. package/assets/favicon.ico +0 -0
  8. package/catalog-info.yaml +19 -0
  9. package/jest.config.js +17 -0
  10. package/package.json +48 -0
  11. package/prompt.md +15 -0
  12. package/run_build_win.bat +1 -0
  13. package/run_link.bat +3 -0
  14. package/run_test.bat +1 -0
  15. package/sonar-project.properties +21 -0
  16. package/src/data/changes/changes.ts +92 -0
  17. package/src/data/context/context.ts +251 -0
  18. package/src/data/context/contextReference.ts +376 -0
  19. package/src/data/contract/contract.ts +272 -0
  20. package/src/data/dataset/database.ts +130 -0
  21. package/src/data/dataset/dataset.ts +275 -0
  22. package/src/data/definition/timeEvaluationSituationDefinitionHistory.ts +1425 -0
  23. package/src/data/employee/employee.ts +434 -0
  24. package/src/data/foundation/companyBranch.ts +66 -0
  25. package/src/data/foundation/costCenter.ts +47 -0
  26. package/src/data/foundation/employer.ts +35 -0
  27. package/src/data/foundation/employmentRelationship.ts +63 -0
  28. package/src/data/foundation/holiday.ts +84 -0
  29. package/src/data/foundation/holidayGroup.ts +47 -0
  30. package/src/data/foundation/jobPosition.ts +73 -0
  31. package/src/data/foundation/person.ts +35 -0
  32. package/src/data/foundation/situation.ts +301 -0
  33. package/src/data/foundation/syndicate.ts +244 -0
  34. package/src/data/foundation/workschedule.ts +688 -0
  35. package/src/data/foundation/workshift.ts +647 -0
  36. package/src/data/foundation/workshiftBase.ts +113 -0
  37. package/src/data/histories/companyBranchHistory.ts +128 -0
  38. package/src/data/histories/costCenterHistory.ts +114 -0
  39. package/src/data/histories/employmentRelationshipHistory.ts +116 -0
  40. package/src/data/histories/histories.ts +419 -0
  41. package/src/data/histories/jobPositionHistory.ts +117 -0
  42. package/src/data/histories/leaveHistory.ts +227 -0
  43. package/src/data/histories/timeEvaluationHistory.ts +191 -0
  44. package/src/data/histories/workshiftHistory.ts +66 -0
  45. package/src/data/hourBank/hourBank.ts +43 -0
  46. package/src/data/hourBank/hourBankAccount.ts +77 -0
  47. package/src/data/log/log.ts +38 -0
  48. package/src/data/schedules/bridge.ts +84 -0
  49. package/src/data/schedules/compensation.ts +332 -0
  50. package/src/data/schedules/overtimeAuthorization.ts +174 -0
  51. package/src/data/schedules/readiness.ts +150 -0
  52. package/src/data/schedules/schedules.ts +398 -0
  53. package/src/data/schedules/workscheduleChange.ts +91 -0
  54. package/src/data/schedules/workshiftChange.ts +76 -0
  55. package/src/data/timeEvaluation/adjustmentReason.ts +46 -0
  56. package/src/data/timeEvaluation/clockingEvent.ts +198 -0
  57. package/src/data/timeEvaluation/estimatedHours.ts +245 -0
  58. package/src/data/timeEvaluation/interval.ts +568 -0
  59. package/src/data/timeEvaluation/separatedHours.ts +134 -0
  60. package/src/data/timeEvaluation/timeEvaluation.ts +1540 -0
  61. package/src/data/timeEvaluation/timeEvaluationSituation.ts +154 -0
  62. package/src/data/user/user.ts +44 -0
  63. package/src/index.ts +60 -0
  64. package/src/test/builder/bridgeBuilder.builder.ts +28 -0
  65. package/src/test/builder/clockingEvent.builder.ts +49 -0
  66. package/src/test/builder/companyBranchHistoryBuilder.ts +29 -0
  67. package/src/test/builder/compensation.builder.ts +84 -0
  68. package/src/test/builder/contextReference.builder.ts +69 -0
  69. package/src/test/builder/costCenterHistoryBuilder.ts +29 -0
  70. package/src/test/builder/database.builder.ts +21 -0
  71. package/src/test/builder/datasetBuilder.ts +111 -0
  72. package/src/test/builder/dateIntervalBuilder.ts +25 -0
  73. package/src/test/builder/employee.builder.ts +91 -0
  74. package/src/test/builder/employmentRelationshipBuilder.ts +35 -0
  75. package/src/test/builder/employmentRelationshipHistoryBuilder.ts +29 -0
  76. package/src/test/builder/historiesBuilder.ts +56 -0
  77. package/src/test/builder/holiday.builder.ts +44 -0
  78. package/src/test/builder/hourBankAccountBuilder.ts +77 -0
  79. package/src/test/builder/hourBankBuilder.ts +32 -0
  80. package/src/test/builder/interval.builder.ts +113 -0
  81. package/src/test/builder/jobPositionHistoryBuilder.ts +29 -0
  82. package/src/test/builder/overtimeAuthorization.builder.ts +42 -0
  83. package/src/test/builder/readinessBuilder.builder.ts +57 -0
  84. package/src/test/builder/schedules.builder.ts +126 -0
  85. package/src/test/builder/situation.builder.ts +59 -0
  86. package/src/test/builder/syndicate.builder.ts +96 -0
  87. package/src/test/builder/syndicateHistoryBuilder.ts +33 -0
  88. package/src/test/builder/timeEvaluation.builder.ts +138 -0
  89. package/src/test/builder/timeEvaluationHistory.builder.ts +49 -0
  90. package/src/test/builder/timeEvaluationSituation.builder.ts +34 -0
  91. package/src/test/builder/workschedule.builder.ts +96 -0
  92. package/src/test/builder/workshift.builder.ts +179 -0
  93. package/src/test/builder/workshiftBuilder.ts +55 -0
  94. package/src/test/data/clockingEvent.spec.ts +56 -0
  95. package/src/test/data/context.spec.ts +176 -0
  96. package/src/test/data/currentUser.spec.ts +11 -0
  97. package/src/test/data/dataset.spec.ts +144 -0
  98. package/src/test/data/employee/employee.spec.ts +20 -0
  99. package/src/test/data/employmentRelationship/employmentRelationship.spec.ts +48 -0
  100. package/src/test/data/estimatedHours/estimatedHours.spec.ts +96 -0
  101. package/src/test/data/histories/costCenterHistory.spec.ts +32 -0
  102. package/src/test/data/histories/histories.spec.ts +306 -0
  103. package/src/test/data/holyday.spec.ts +89 -0
  104. package/src/test/data/hourBank/hourBank.spec.ts +48 -0
  105. package/src/test/data/hourBank/hourBankAccount.spec.ts +32 -0
  106. package/src/test/data/schedules/bridge.spec.ts +13 -0
  107. package/src/test/data/schedules/compesation.spect.ts +89 -0
  108. package/src/test/data/schedules/overtimeAuthorization.spec.ts +52 -0
  109. package/src/test/data/schedules/readiness.spec.ts +64 -0
  110. package/src/test/data/schedules/schedules.spec.ts +134 -0
  111. package/src/test/data/schedules/workscheduleChange.spec.ts +21 -0
  112. package/src/test/data/syndicate/syndicate.spec.ts +51 -0
  113. package/src/test/data/timeEvaluation.spec.ts +1057 -0
  114. package/src/test/data/timeEvaluationDefinition.spec.ts +144 -0
  115. package/src/test/data/workschedule/workschedule.spec.ts +194 -0
  116. package/src/test/data/workshift/workshift.spec.ts +79 -0
  117. package/src/test/utils/date.utils.spec.ts +198 -0
  118. package/src/test/utils/dateIntervalUtils.spec.ts +210 -0
  119. package/src/test/utils/object.utils.spec.ts +83 -0
  120. package/src/utils/dateIntervalUtils.ts +284 -0
  121. package/src/utils/dateUtils.ts +456 -0
  122. package/src/utils/decompressGzipLambda.ts +15 -0
  123. package/src/utils/object.utils.ts +156 -0
  124. package/trivy/vulnerabilities_scan.json +1160 -0
  125. package/tsconfig.json +32 -0
  126. package/tsconfig.spec.json +21 -0
  127. package/tslint.json +92 -0
  128. package/typedoc.json +22 -0
@@ -0,0 +1,150 @@
1
+ import { ObjectUtils } from "src/utils/object.utils";
2
+ import { Situation } from "../foundation/situation";
3
+ import { ContextReference } from '../context/contextReference';
4
+
5
+ /**
6
+ * @hidden
7
+ * Parâmetros para criar uma programação de Readiness.
8
+ * @param originDate Data de origem do sobreaviso.
9
+ * @param destinationDate Data de destino do sobreaviso.
10
+ * @typedef {Object} ReadinessParams
11
+ */
12
+ export interface ReadinessParams {
13
+ /** Data inicial do sobreaviso. */
14
+ startDate: Date;
15
+ /** Data final do sobreaviso. */
16
+ endDate: Date;
17
+ /** Hora inicial do sobreaviso. */
18
+ startTime: number;
19
+ /** Hora final do sobreaviso. */
20
+ endTime: number;
21
+ /** Indica se o sobreaviso é contínuo. */
22
+ continuous: boolean;
23
+ /** Identificador da situação do sobreaviso. */
24
+ situationId: string;
25
+ }
26
+
27
+ /**
28
+ * Representa uma programação de sobreaviso.
29
+ * A programação de sobreaviso é utilizada para informar o período no qual o colaborador estará de sobreaviso ou prontidão a serviço da empresa.
30
+ */
31
+ export class Readiness {
32
+
33
+ /**
34
+ * Data inicial do sobreaviso.
35
+ * @param startDate Data inicial do sobreaviso.
36
+ */
37
+ private readonly _startDate: Date;
38
+
39
+ /**
40
+ * Data final do sobreaviso.
41
+ * @param endDate Data final do sobreaviso.
42
+ */
43
+ private readonly _endDate: Date;
44
+
45
+ /**
46
+ * Hora inicial do sobreaviso.
47
+ * @param startTime Hora inicial do sobreaviso.
48
+ */
49
+ private readonly _startTime: number;
50
+
51
+ /**
52
+ * Hora final do sobreaviso.
53
+ * @param endTime Hora final do sobreaviso.
54
+ */
55
+ private readonly _endTime: number;
56
+
57
+ /**
58
+ * Indica se o sobreaviso é contínuo.
59
+ * @param continuous Indica se o sobreaviso é contínuo.
60
+ */
61
+ private readonly _continuous: boolean;
62
+
63
+ /**
64
+ * Identificador da situação do sobreaviso.
65
+ * @param situationId Identificador da situação do sobreaviso.
66
+ */
67
+ private readonly _situationId: string;
68
+
69
+ constructor(params: ReadinessParams) {
70
+ this._startDate = ObjectUtils.toDateOrThrow(params.startDate, "readiness.startDate");
71
+ this._endDate = ObjectUtils.toDateOrThrow(params.endDate, "readiness.endDate");
72
+ this._startTime = params.startTime;
73
+ this._endTime = params.endTime;
74
+ this._continuous = params.continuous;
75
+ this._situationId = params.situationId;
76
+ }
77
+
78
+ /**
79
+ * Data inicial do sobreaviso.
80
+ * @returns Data inicial do sobreaviso.
81
+ */
82
+ get startDate(): Date {
83
+ return this._startDate;
84
+ }
85
+
86
+ /**
87
+ * Data final do sobreaviso.
88
+ * @returns Data final do sobreaviso.
89
+ */
90
+ get endDate(): Date {
91
+ return this._endDate;
92
+ }
93
+
94
+ /**
95
+ * Hora inicial do sobreaviso.
96
+ * @returns Hora inicial do sobreaviso.
97
+ */
98
+ get startTime(): number {
99
+ return this._startTime;
100
+ }
101
+
102
+ /**
103
+ * Hora final do sobreaviso.
104
+ * @returns Hora final do sobreaviso.
105
+ */
106
+ get endTime(): number {
107
+ return this._endTime;
108
+ }
109
+
110
+ /**
111
+ * Indica se o sobreaviso é contínuo.
112
+ * @returns Indica se o sobreaviso é contínuo.
113
+ */
114
+ get continuous(): boolean {
115
+ return this._continuous;
116
+ }
117
+
118
+ /**
119
+ * Identificador da situação do sobreaviso.
120
+ * @returns Identificador da situação do sobreaviso.
121
+ */
122
+ private get situationId(): string {
123
+ return this._situationId;
124
+ }
125
+
126
+ /**
127
+ * Obtém a situação associada ao sobreaviso.
128
+ * @returns Situação associada ao sobreaviso.
129
+ * @throws Se a situação não for encontrada no contexto.
130
+ */
131
+ get situation(): Situation {
132
+ const situation = ContextReference.getGlobalInstance().getSituationById(this._situationId);
133
+ if (!situation) {
134
+ throw new Error(`Situação com ID ${this._situationId} não encontrada no contexto.`);
135
+ }
136
+ return situation;
137
+ }
138
+
139
+ public static clone(readiness: Readiness): Readiness {
140
+ return new Readiness({
141
+ startDate: readiness.startDate,
142
+ endDate: readiness.endDate,
143
+ startTime: readiness.startTime,
144
+ endTime: readiness.endTime,
145
+ continuous: readiness.continuous,
146
+ situationId: readiness.situationId
147
+ });
148
+ }
149
+
150
+ }
@@ -0,0 +1,398 @@
1
+ import { DateUtils } from "../../utils/dateUtils";
2
+ import { Bridge } from "./bridge";
3
+ import { Readiness } from "./readiness";
4
+ import { Compensation } from "./compensation";
5
+ import { WorkscheduleChange } from "./workscheduleChange";
6
+ import { WorkshiftChange } from "./workshiftChange";
7
+ import { OvertimeAuthorization } from "./overtimeAuthorization";
8
+ import { TimeEvaluation } from "../timeEvaluation/timeEvaluation";
9
+
10
+ /**
11
+ * @hidden
12
+ * Parâmetros para a classe Schedules.
13
+ * @param bridges Lista de pontes.
14
+ * @param workscheduleChanges Lista de trocas de horário de trabalho.
15
+ * @param workshiftChanges Lista de trocas de escala.
16
+ * @param readinesses Lista de sobreavisos.
17
+ * @param overtimeAuthorizations Lista de autorizações de horas extras.
18
+ * @param compensations Lista de compensações.
19
+ *
20
+ */
21
+ export interface SchedulesParams {
22
+ bridges: Bridge[];
23
+ workscheduleChanges: WorkscheduleChange[];
24
+ workshiftChanges: WorkshiftChange[];
25
+ readinesses: Readiness[];
26
+ overtimeAuthorizations: OvertimeAuthorization[];
27
+ compensations: Compensation[];
28
+ }
29
+
30
+ /**
31
+ * Representa as programações do colaborador no período calculado, como: autorização de horas extras, compensação, sobreaviso/prontidão, ponte e trocas de horário e escala.
32
+ * Aqui serão apresentadas todas as programações do perído calculado, no objeto apuração ({@link TimeEvaluation}), as programações já estão no contexto do dia, exibindo apenas as programações do dia.
33
+ *
34
+ * - O período calculado considera, no mínimo, o período de apuração do cálculo da competência mais 5 dias anteriores e 4 dias posteriores conforme configurado em "Retornar dias" na definição de apuração.
35
+ *
36
+ * ```
37
+ * Demontração do período calculado
38
+ *
39
+ * Período de apuração do cálculo = 24/03/2025 a 23/04/2025
40
+ * Data inicial = data início do cálculo - 4 dias extras - valor parametrizado em `Retornar dias` (se for nulo assume 1 dia)
41
+ * Data final = data fim do cálculo + 4 dias extras
42
+ * Período calculado = 19/03/2025 a 27/04/2025
43
+ * ```
44
+ * @example
45
+ * ```typescript
46
+ * schedules.bridges; // Retorna as pontes do colaborador no período calculado.
47
+ * schedules.workscheduleChanges; // Retorna as trocas de horário de trabalho do colaborador no período calculado.
48
+ * schedules.workshiftChanges; // Retorna as trocas de escala do colaborador no período calculado.
49
+ * schedules.compensations; // Retorna as compensações de horas do colaborador no período calculado.
50
+ * schedules.overtimeAuthorizations; // Retorna as autorizações de horas extras do colaborador no período calculado.
51
+ * schedules.readinesses; // Retorna os sobreavisos/prontidão do colaborador no período calculado.
52
+ * ```
53
+ * @see {@link bridges}
54
+ * @see {@link workshiftChanges}
55
+ * @see {@link workscheduleChanges}
56
+ * @see {@link compensations}
57
+ * @see {@link overtimeAuthorizations}
58
+ * @see {@link readinesses}
59
+ * ```
60
+ *
61
+ */
62
+ export class Schedules {
63
+ private readonly _bridges: Bridge[];
64
+ private readonly _worksheduleChanges: WorkscheduleChange[];
65
+ private readonly _workshiftChanges: WorkshiftChange[];
66
+ private readonly _readinesses: Readiness[];
67
+ private readonly _overtimeAuthorizations: OvertimeAuthorization[];
68
+ private readonly _compensations: Compensation[];
69
+
70
+ /**
71
+ * @hidden
72
+ * @param params Parâmetros necessários para criar uma instância de Schedules.
73
+ */
74
+ constructor(params: SchedulesParams) {
75
+ this._bridges = [];
76
+ this._worksheduleChanges = [];
77
+ this._workshiftChanges = [];
78
+ this._readinesses = [];
79
+ this._overtimeAuthorizations = [];
80
+ this._compensations = [];
81
+
82
+ this.mapBridges(params);
83
+ this.mapWorkscheduleChanges(params);
84
+ this.mapWorkshiftChange(params);
85
+ this.mapReadiness(params);
86
+ this.mapOvertimeAuthorizations(params);
87
+ this.mapCompensation(params);
88
+ }
89
+
90
+ private mapWorkscheduleChanges(params: SchedulesParams) {
91
+ if (Array.isArray(params.workscheduleChanges)) {
92
+ for (const workshiftChange of params.workscheduleChanges) {
93
+ this._worksheduleChanges.push(WorkscheduleChange.clone(workshiftChange));
94
+ }
95
+ }
96
+ }
97
+
98
+ private mapBridges(params: SchedulesParams) {
99
+ if (Array.isArray(params.bridges)) {
100
+ for (const bridge of params.bridges) {
101
+ this._bridges.push(Bridge.clone(bridge));
102
+ }
103
+ }
104
+ }
105
+
106
+ private mapWorkshiftChange(params: SchedulesParams) {
107
+ if (Array.isArray(params.workshiftChanges)) {
108
+ for (const workshiftChange of params.workshiftChanges) {
109
+ this._workshiftChanges.push(WorkshiftChange.clone(workshiftChange));
110
+ }
111
+ }
112
+ }
113
+
114
+ private mapReadiness(params: SchedulesParams) {
115
+ if (Array.isArray(params.readinesses)) {
116
+ for (const readiness of params.readinesses) {
117
+ this._readinesses.push(Readiness.clone(readiness));
118
+ }
119
+ }
120
+ }
121
+
122
+ private mapOvertimeAuthorizations(params: SchedulesParams) {
123
+ if (Array.isArray(params.overtimeAuthorizations)) {
124
+ for (const overtimeAuthorization of params.overtimeAuthorizations) {
125
+ this._overtimeAuthorizations.push(OvertimeAuthorization.clone(overtimeAuthorization));
126
+ }
127
+ }
128
+ }
129
+
130
+ private mapCompensation(params: SchedulesParams) {
131
+ if (Array.isArray(params.compensations)) {
132
+ for (const compensation of params.compensations) {
133
+ this._compensations.push(Compensation.clone(compensation));
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * @hidden
140
+ * Cria uma nova instância de Schedules vazia.
141
+ */
142
+ static default(): Schedules {
143
+ return new Schedules({ bridges: [], workscheduleChanges: [], workshiftChanges: [], readinesses: [], overtimeAuthorizations: [], compensations: [] });
144
+ }
145
+
146
+ /**
147
+ * Retorna as pontes do colaborador no período calculado.
148
+ * Usa o método {@link findBridgeByDate} para buscar de um dia específico.
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * const bridges = schedules.bridges; // Retorna todas as pontes do colaborador no período calculado.
153
+ * bridges.forEach(bridge => {
154
+ * console.log(`Ponte de ${bridge.originDate} até ${bridge.destinationDate
155
+ * }`);
156
+ * ```
157
+ *
158
+ * @returns Lista de pontes do colaborador no período calculado.
159
+ *
160
+ * @see {@link Bridge}
161
+ */
162
+ get bridges(): Bridge[] {
163
+ return this._bridges;
164
+ }
165
+
166
+ /**
167
+ * Retorna as trocas de horário de trabalho do colaborador no período calculado.
168
+ * Usa o método {@link findWorkscheduleChangeByDate} para buscar de um dia específico.
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const workscheduleChanges = schedules.workscheduleChanges; // Retorna todas as trocas de horário de trabalho do colaborador no período calculado.
173
+ * workscheduleChanges.forEach(change => {
174
+ * console.log(`Troca de horário em ${change.date}: ${change.workschedule.code}`);
175
+ * });
176
+ * ```
177
+ *
178
+ * @returns Lista de trocas de horário de trabalho do colaborador no período calculado.
179
+ *
180
+ * @see {@link WorkscheduleChange}
181
+ * @see {@link Workschedule}
182
+ */
183
+ get workscheduleChanges(): WorkscheduleChange[] {
184
+ return this._worksheduleChanges;
185
+ }
186
+
187
+ /**
188
+ * Retorna as trocas de escala do colaborador no período calculado.
189
+ * Usa o método {@link findWorkshiftChangeByDate} para buscar de um dia específico.
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * const workshiftChanges = schedules.workshiftChanges; // Retorna todas as trocas de escala do colaborador no período calculado.
194
+ * workshiftChanges.forEach(change => {
195
+ * console.log(`Troca de escala de ${change.startDate} até ${change.endDate}: ${change.workshift.code}`);
196
+ * });
197
+ * ```
198
+ *
199
+ * @returns Lista de trocas de escala do colaborador no período calculado.
200
+ *
201
+ * @see {@link WorkshiftChange}
202
+ * @see {@link Workshift}
203
+ */
204
+ get workshiftChanges(): WorkshiftChange[] {
205
+ return this._workshiftChanges;
206
+ }
207
+
208
+ /**
209
+ * Retorna os sobreavisos do colaborador no período calculado.
210
+ * Usa o método {@link findReadinessByDate} para buscar de um dia específico.
211
+ *
212
+ * @example
213
+ * ```typescript
214
+ * const readinesses = schedules.readinesses; // Retorna os sobreavisos do colaborador no período calculado.
215
+ * readinesses.forEach(readiness => {
216
+ * console.log(`Programação de sobreaviso de ${readiness.startDate} até ${readiness.endDate}`);
217
+ * });
218
+ * ```
219
+ *
220
+ * @returns Lista de sobreavisos do colaborador no período calculado.
221
+ *
222
+ * @see {@link Readiness}
223
+ */
224
+ get readinesses(): Readiness[] {
225
+ return this._readinesses;
226
+ }
227
+
228
+ /**
229
+ * Retorna as autorizações de horas extras do colaborador no período calculado.
230
+ * Usa o método {@link findOvertimeAuthorizationByDate} para buscar de um dia específico.
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * const overtimeAuthorizations = schedules.overtimeAuthorizations; // Retorna as autorizações de horas extras do colaborador no período calculado.
235
+ * overtimeAuthorizations.forEach(auth => {
236
+ * console.log(`Autorização de horas extras de ${auth.startDate} até ${auth.endDate}`);
237
+ * });
238
+ * ```
239
+ *
240
+ * @returns Lista de autorizações de horas extras do colaborador no período calculado.
241
+ *
242
+ * @see {@link OvertimeAuthorization}
243
+ */
244
+ get overtimeAuthorizations(): OvertimeAuthorization[] {
245
+ return this._overtimeAuthorizations;
246
+ }
247
+
248
+ /**
249
+ * Retorna as compensações de horas do colaborador no período calculado.
250
+ * Usa o método {@link findCompensationByDate} para buscar de um dia específico.
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * const compensations = schedules.compensation; // Retorna as compensações de horas do colaborador no período calculado.
255
+ * compensations.forEach(compensation => {
256
+ * console.log(`Compensação de ${compensation.startDate} até ${compensation.endDate}: ${compensation.numberOfHours} horas`);
257
+ * });
258
+ * ```
259
+ *
260
+ * @returns Lista de compensações de horas do colaborador no período calculado.
261
+ *
262
+ * @see {@link Compensation}
263
+ */
264
+ get compensations(): Compensation[] {
265
+ return this._compensations;
266
+ }
267
+
268
+ /**
269
+ * Busca a ponte de um dia específico verificando se a data é igual a originDate ou destinationDate.
270
+ * @example
271
+ * ```typescript
272
+ * const bridge = findBridgeByDate(new Date("2024-02-02"));
273
+ * if(bridge) {
274
+ * ...
275
+ * }
276
+ * ```
277
+ *
278
+ * @param date Data a ser usada no filtro.
279
+ * @returns A ponte que corresponde ao critério ou undefined se não encontrar.
280
+ */
281
+ findBridgeByDate(date: Date): Bridge | undefined {
282
+ return this._bridges.find((bridge) => {
283
+ return DateUtils.equals(bridge.originDate, date) || DateUtils.equals(bridge.destinationDate, date);
284
+ });
285
+ }
286
+
287
+ /**
288
+ * Busca a troca de horário de um dia específico verificando se a data é igual a date.
289
+ * @example
290
+ * ```typescript
291
+ * const workscheduleChange = findWorkscheduleByDate(new Date("2024-02-02"));
292
+ * if(workscheduleChange) {
293
+ * ...
294
+ * }
295
+ * ```
296
+ * @param date Data a ser usada no filtro
297
+ * @returns A troca de horário que corresponde ao critério ou undefined se não encontrar.
298
+ */
299
+ findWorkscheduleChangeByDate(date: Date): WorkscheduleChange | undefined {
300
+ return this._worksheduleChanges.find((workscheduleChange) => {
301
+ return DateUtils.equals(workscheduleChange.date, date);
302
+ });
303
+ }
304
+
305
+ /**
306
+ * Busca a troca de escala de um dia específico verificando se a data está entre startDate e endDate.
307
+ * @example
308
+ * ```typescript
309
+ * const workshiftChange = findWorkshiftChangeByDate(new Date("2024-02-02"));
310
+ * if(workshiftChange) {
311
+ * ...
312
+ * }
313
+ * ```
314
+ *
315
+ * @param date Data a ser usada no filtro.
316
+ * @returns A troca de escala que corresponde ao critério ou undefined se não encontrar.
317
+ */
318
+ findWorkshiftChangeByDate(date: Date): WorkshiftChange | undefined {
319
+ return this._workshiftChanges.find((workshiftChange) => {
320
+ return DateUtils.between(date, workshiftChange.startDate, workshiftChange.endDate);
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Busca o sobreaviso de um dia específico verificando se a data está entre startDate e endDate.
326
+ * @example
327
+ * ```typescript
328
+ * const readiness = findReadinessByDate(new Date("2024-02-02"));
329
+ * if(readiness) {
330
+ * ...
331
+ * }
332
+ * ```
333
+ *
334
+ * @param date Data a ser usada no filtro.
335
+ * @returns O sobreaviso que corresponde ao critério ou undefined se não encontrar.
336
+ */
337
+ findReadinessByDate(date: Date): Readiness[] {
338
+ return this._readinesses.filter((readiness) => {
339
+ return DateUtils.between(date, readiness.startDate, readiness.endDate);
340
+ });
341
+ }
342
+
343
+ /**
344
+ * Busca a autorização de horas extras de um dia específico verificando se a data está entre startDate e endDate.
345
+ * @example
346
+ * ```typescript
347
+ * const overtimeAuthorization = findOvertimeAuthorizationByDate(new Date("2024-02-02"));
348
+ * if(overtimeAuthorization) {
349
+ * ...
350
+ * }
351
+ * ```
352
+ *
353
+ * @param date Data a ser usada no filtro.
354
+ * @returns A autorização de horas extras que corresponde ao critério ou undefined se não encontrar.
355
+ */
356
+ findOvertimeAuthorizationByDate(date: Date): OvertimeAuthorization[] {
357
+ return this._overtimeAuthorizations.filter((overtimeAuthorization) => {
358
+ return DateUtils.between(date, overtimeAuthorization.startDate, overtimeAuthorization.endDate);
359
+ });
360
+ }
361
+
362
+ /**
363
+ * Busca a compensação de um dia específico verificando se a data está entre startDate e endDate.
364
+ * @example
365
+ * ```typescript
366
+ * const compensations = findCompensationByDate(new Date("2024-02-02"));
367
+ * if(compensations.length > 0) {
368
+ * ...
369
+ * }
370
+ * ```
371
+ *
372
+ * @param date Data a ser usada no filtro.
373
+ * @returns A compensação que corresponde ao critério ou uma lista vazia se não encontrar.
374
+ */
375
+ findCompensationByDate(date: Date): Compensation[] {
376
+ return this._compensations.filter((compensation) => {
377
+ return DateUtils.between(date, compensation.startDate, compensation.endDate);
378
+ });
379
+ }
380
+
381
+ /**
382
+ * Clona a instância de Schedules.
383
+ *
384
+ * @returns Uma nova instância de Schedules com os mesmos parâmetros.
385
+ */
386
+ public static clone(schedules: Schedules): Schedules {
387
+ return new Schedules({
388
+ bridges: schedules.bridges?.map(bridge => Bridge.clone(bridge)) || [],
389
+ workscheduleChanges: schedules.workscheduleChanges?.map(change => WorkscheduleChange.clone(change)) || [],
390
+ workshiftChanges: schedules.workshiftChanges?.map(change => WorkshiftChange.clone(change)) || [],
391
+ readinesses: schedules.readinesses?.map(readiness => Readiness.clone(readiness)) || [],
392
+ overtimeAuthorizations: schedules.overtimeAuthorizations?.map(auth => OvertimeAuthorization.clone(auth)) || [],
393
+ compensations: schedules.compensations?.map(compensation => Compensation.clone(compensation)) || []
394
+ });
395
+ }
396
+
397
+
398
+ }
@@ -0,0 +1,91 @@
1
+ import { ObjectUtils } from "src/utils/object.utils";
2
+ import { ContextReference } from "../context/contextReference";
3
+ import { Workschedule } from "../foundation/workschedule";
4
+
5
+ /**
6
+ * Parâmetros para criar uma troca de horário.
7
+ * @param date Data da troca do horário.
8
+ * @param workscheduleId Identificador do horário de trabalho.
9
+ * @param contextRef Referência do contexto onde a troca de horário está inserida.
10
+ */
11
+ export interface WorkscheduleParams {
12
+ date: Date;
13
+ workscheduleId: string;
14
+ }
15
+
16
+ /**
17
+ * Representa uma programação de troca de horário de trabalho.
18
+ * Uma troca de horário é uma alteração no horário de trabalho de um colaborador em uma data específica.
19
+ * A troca de horário é utilizada para registrar alterações no horário de trabalho, como trocas de turnos ou ajustes de horários.
20
+ */
21
+ export class WorkscheduleChange {
22
+ /**
23
+ * Data da troca do horário.
24
+ */
25
+ private readonly _date: Date;
26
+ /**
27
+ * Identificador do horário de trabalho.
28
+ */
29
+ private readonly _workscheduleId: string;
30
+
31
+ /**
32
+ * @hidden
33
+ * @param params Parâmetros necessários para criar uma instância de WorkscheduleChange.
34
+ */
35
+ constructor(params: WorkscheduleParams) {
36
+ this._date = ObjectUtils.toDateOrThrow(params.date, "WorkscheduleChange.date");
37
+ this._workscheduleId = params.workscheduleId;
38
+ }
39
+
40
+ /**
41
+ * Data da troca do horário.
42
+ * @example
43
+ * ```typescript
44
+ * let date = workscheduleChange.date; // Retorna a data da troca do horário.
45
+ * ```
46
+ * @returns Data da troca do horário.
47
+ */
48
+ get date(): Date {
49
+ return this._date;
50
+ }
51
+
52
+ /**
53
+ * @hidden
54
+ * Identificador do horário de trabalho.
55
+ */
56
+ private get workscheduleId(): string {
57
+ return this._workscheduleId;
58
+ }
59
+
60
+ /**
61
+ * Horário de trabalho associado a esta troca.
62
+ * @example
63
+ * ```typescript
64
+ * let workschedule = workscheduleChange.workschedule; // Retorna o Horário de trabalho associado a esta troca.
65
+ * workschedule.code; // Retorna o código do Horário de trabalho associado a esta troca.
66
+ * ```
67
+ * @returns O Horário de trabalho associado a esta troca de horário.
68
+ *
69
+ */
70
+ get workschedule(): Workschedule {
71
+ const workschedule = ContextReference.getGlobalInstance().getWorkschedule(this._workscheduleId);
72
+ if (!workschedule) {
73
+ throw new Error(`Workschedule with id ${this._workscheduleId} not found in context.`);
74
+ }
75
+
76
+ return workschedule;
77
+ }
78
+
79
+ /**
80
+ * Clona a instância de WorkscheduleChange.
81
+ * @returns Uma nova instância de WorkscheduleChange com os mesmos valores.
82
+ */
83
+ public static clone(object: WorkscheduleChange): WorkscheduleChange {
84
+ return new WorkscheduleChange({
85
+ date: object.date,
86
+ workscheduleId: object.workscheduleId,
87
+ });
88
+ }
89
+
90
+ }
91
+