@platform-modules/civil-aviation-authority 2.3.329 → 2.3.331

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 (26) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +3 -0
  3. package/dist/models/AnnualTrainingPlanDepartmentPlanDecisionModel.d.ts +10 -0
  4. package/dist/models/AnnualTrainingPlanDepartmentPlanDecisionModel.js +51 -0
  5. package/dist/models/AnnualTrainingPlanDepartmentPlanModel.d.ts +13 -0
  6. package/dist/models/AnnualTrainingPlanDepartmentPlanModel.js +50 -0
  7. package/dist/models/AnnualTrainingPlanItemModel.d.ts +22 -0
  8. package/dist/models/AnnualTrainingPlanItemModel.js +101 -0
  9. package/dist/models/AnnualTrainingPlanRequestModel.d.ts +20 -12
  10. package/dist/models/AnnualTrainingPlanRequestModel.js +70 -60
  11. package/dist/models/TrainingRoomBookingRequestModel.d.ts +1 -0
  12. package/dist/models/TrainingRoomBookingRequestModel.js +5 -0
  13. package/dist/models/TrainingRoomBookingWorkflowModel.d.ts +3 -0
  14. package/dist/models/TrainingRoomBookingWorkflowModel.js +9 -0
  15. package/package.json +1 -1
  16. package/sql/add_training_room_booking_records_reference.sql +19 -0
  17. package/sql/annual_training_plan_bulk_upload.sql +140 -0
  18. package/sql/annual_training_plan_department_plans.sql +80 -0
  19. package/src/index.ts +518 -515
  20. package/src/models/AnnualTrainingPlanDepartmentPlanDecisionModel.ts +33 -0
  21. package/src/models/AnnualTrainingPlanDepartmentPlanModel.ts +31 -0
  22. package/src/models/AnnualTrainingPlanItemModel.ts +71 -0
  23. package/src/models/AnnualTrainingPlanRequestModel.ts +59 -60
  24. package/src/models/TrainingRoomBookingRequestModel.ts +4 -0
  25. package/src/models/TrainingRoomBookingWorkflowModel.ts +81 -74
  26. package/src/scripts.ts +20 -10
@@ -0,0 +1,33 @@
1
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
2
+ import { BaseModel } from "./BaseModel";
3
+ import {
4
+ AnnualTrainingPlanDepartmentPlan,
5
+ AnnualTrainingPlanDepartmentPlanStatus
6
+ } from "./AnnualTrainingPlanDepartmentPlanModel";
7
+
8
+ @Entity({ name: "annual_training_plan_department_plan_decisions" })
9
+ @Index(["department_plan_id", "approval_level"])
10
+ export class AnnualTrainingPlanDepartmentPlanDecision extends BaseModel {
11
+ @Column({ type: "integer", nullable: false })
12
+ department_plan_id: number;
13
+
14
+ @Column({ type: "integer", nullable: false })
15
+ approval_level: number;
16
+
17
+ @Column({
18
+ type: "enum",
19
+ enum: AnnualTrainingPlanDepartmentPlanStatus,
20
+ nullable: false
21
+ })
22
+ status: AnnualTrainingPlanDepartmentPlanStatus;
23
+
24
+ @Column({ type: "text", nullable: true })
25
+ comment: string | null;
26
+
27
+ @Column({ type: "integer", nullable: true })
28
+ decided_by: number | null;
29
+
30
+ @ManyToOne(() => AnnualTrainingPlanDepartmentPlan, { onDelete: "CASCADE" })
31
+ @JoinColumn({ name: "department_plan_id" })
32
+ department_plan: AnnualTrainingPlanDepartmentPlan;
33
+ }
@@ -0,0 +1,31 @@
1
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
2
+ import { BaseModel } from "./BaseModel";
3
+ import { AnnualTrainingPlanRequest } from "./AnnualTrainingPlanRequestModel";
4
+
5
+ export enum AnnualTrainingPlanDepartmentPlanStatus {
6
+ PENDING = "Pending",
7
+ APPROVED = "Approved",
8
+ REJECTED = "Rejected"
9
+ }
10
+
11
+ @Entity({ name: "annual_training_plan_department_plans" })
12
+ @Index(["request_id"])
13
+ export class AnnualTrainingPlanDepartmentPlan extends BaseModel {
14
+ @Column({ type: "integer", nullable: false })
15
+ request_id: number;
16
+
17
+ @Column({ type: "integer", nullable: false })
18
+ department_id: number;
19
+
20
+ @Column({
21
+ type: "enum",
22
+ enum: AnnualTrainingPlanDepartmentPlanStatus,
23
+ default: AnnualTrainingPlanDepartmentPlanStatus.PENDING,
24
+ nullable: false
25
+ })
26
+ status: AnnualTrainingPlanDepartmentPlanStatus;
27
+
28
+ @ManyToOne(() => AnnualTrainingPlanRequest, { onDelete: "CASCADE" })
29
+ @JoinColumn({ name: "request_id" })
30
+ request: AnnualTrainingPlanRequest;
31
+ }
@@ -0,0 +1,71 @@
1
+ import { Column, Entity, Index, JoinColumn, ManyToOne, Unique } from "typeorm";
2
+ import { BaseModel } from "./BaseModel";
3
+ import {
4
+ AnnualTrainingPlanPlace,
5
+ AnnualTrainingPlanRequest
6
+ } from "./AnnualTrainingPlanRequestModel";
7
+
8
+ @Entity({ name: "annual_training_plan_items" })
9
+ @Unique(["request_id", "row_number"])
10
+ @Index(["request_id"])
11
+ @Index(["department_id"])
12
+ export class AnnualTrainingPlanItem extends BaseModel {
13
+ @Column({ type: "integer", nullable: false })
14
+ request_id: number;
15
+
16
+ @Column({ type: "integer", nullable: true })
17
+ department_plan_id: number | null;
18
+
19
+ @Column({ type: "integer", nullable: false })
20
+ row_number: number;
21
+
22
+ @Column({ type: "integer", nullable: false })
23
+ department_id: number;
24
+
25
+ @Column({ type: "integer", nullable: true })
26
+ section_id: number | null;
27
+
28
+ @Column({ type: "varchar", length: 255, nullable: false })
29
+ course_name: string;
30
+
31
+ @Column({ type: "integer", nullable: false })
32
+ no_of_participants: number;
33
+
34
+ @Column({ type: "decimal", precision: 10, scale: 2, nullable: false })
35
+ course_cost: number;
36
+
37
+ @Column({ type: "decimal", precision: 14, scale: 2, nullable: false })
38
+ total_cost: number;
39
+
40
+ @Column({ type: "varchar", length: 500, nullable: false })
41
+ proposed_implementation_date: string;
42
+
43
+ @Column({ type: "text", nullable: false })
44
+ description: string;
45
+
46
+ @Column({ type: "text", nullable: false })
47
+ reason: string;
48
+
49
+ @Column({ type: "varchar", length: 255, nullable: true })
50
+ job_competency: string | null;
51
+
52
+ @Column({
53
+ type: "enum",
54
+ enum: AnnualTrainingPlanPlace,
55
+ nullable: true
56
+ })
57
+ place: AnnualTrainingPlanPlace | null;
58
+
59
+ @Column({ type: "varchar", length: 255, nullable: true })
60
+ location: string | null;
61
+
62
+ @Column({ type: "jsonb", nullable: true })
63
+ name_of_participants: string[] | null;
64
+
65
+ @Column({ type: "jsonb", nullable: true })
66
+ employee_list: any[] | null;
67
+
68
+ @ManyToOne(() => AnnualTrainingPlanRequest, { onDelete: "CASCADE" })
69
+ @JoinColumn({ name: "request_id" })
70
+ request: AnnualTrainingPlanRequest;
71
+ }
@@ -14,6 +14,17 @@ export enum AnnualTrainingPlanPlace {
14
14
  OUTSIDE = "Outside"
15
15
  }
16
16
 
17
+ export enum AnnualTrainingPlanImportStatus {
18
+ VALIDATED = "Validated",
19
+ IMPORTED = "Imported",
20
+ FAILED = "Failed"
21
+ }
22
+
23
+ export enum AnnualTrainingPlanSubmissionSource {
24
+ EXCEL = "Excel",
25
+ DIRECT = "Direct"
26
+ }
27
+
17
28
  @Entity({ name: "annual_training_plan_requests" })
18
29
  export class AnnualTrainingPlanRequest extends BaseModel {
19
30
  @Column({ type: "integer", nullable: true })
@@ -34,40 +45,9 @@ export class AnnualTrainingPlanRequest extends BaseModel {
34
45
  @Column({ type: "integer", nullable: false })
35
46
  user_id: number;
36
47
 
37
- @Column({ type: "varchar", length: 255, nullable: false })
38
- course_name: string;
39
-
40
- @Column({ type: "integer", nullable: false })
41
- no_of_participants: number;
42
-
43
- @Column({ type: "decimal", precision: 10, scale: 2, nullable: false })
44
- course_cost: number;
45
-
46
- @Column({ type: "decimal", precision: 10, scale: 2, nullable: false })
48
+ @Column({ type: "decimal", precision: 14, scale: 2, nullable: false, default: 0 })
47
49
  total_cost: number;
48
50
 
49
- @Column({ type: "varchar", length: 500, nullable: false, default: "" })
50
- proposed_implementation_date: string;
51
-
52
- @Column({ type: "text", nullable: false })
53
- description: string;
54
-
55
- @Column({
56
- type: "enum",
57
- enum: AnnualTrainingPlanPlace,
58
- nullable: true
59
- })
60
- place: AnnualTrainingPlanPlace | null;
61
-
62
- @Column({ type: "varchar", length: 255, nullable: true })
63
- location: string | null;
64
-
65
- @Column({ type: "text", nullable: false })
66
- reason: string;
67
-
68
- @Column({ type: "jsonb", nullable: true })
69
- employee_list: any[] | null; // List of employees for training attendance
70
-
71
51
  @Column({
72
52
  type: "enum",
73
53
  enum: AnnualTrainingPlanRequestStatus,
@@ -89,65 +69,84 @@ export class AnnualTrainingPlanRequest extends BaseModel {
89
69
  workflow_execution_id: string | null;
90
70
 
91
71
  @Column({ type: "varchar", length: 255, nullable: true })
92
- job_competency: string | null;
72
+ directarate: string | null;
93
73
 
94
- @Column({ type: "jsonb", nullable: true })
95
- name_of_participants: string[] | null;
74
+ @Column({ type: "varchar", length: 255, nullable: true })
75
+ plan_name: string | null;
76
+
77
+ @Column({ type: "varchar", length: 30, nullable: true, unique: true })
78
+ plan_number: string | null;
79
+
80
+ @Column({ type: "integer", nullable: true })
81
+ plan_year: number | null;
82
+
83
+ @Column({ type: "varchar", length: 1000, nullable: true })
84
+ source_file_url: string | null;
96
85
 
97
86
  @Column({ type: "varchar", length: 255, nullable: true })
98
- directarate: string | null;
87
+ source_file_name: string | null;
88
+
89
+ @Column({ type: "integer", nullable: false, default: 0 })
90
+ total_departments: number;
91
+
92
+ @Column({ type: "integer", nullable: false, default: 0 })
93
+ total_courses: number;
94
+
95
+ @Column({ type: "integer", nullable: false, default: 0 })
96
+ total_participants: number;
97
+
98
+ @Column({
99
+ type: "enum",
100
+ enum: AnnualTrainingPlanImportStatus,
101
+ nullable: true
102
+ })
103
+ import_status: AnnualTrainingPlanImportStatus | null;
104
+
105
+ @Column({
106
+ type: "enum",
107
+ enum: AnnualTrainingPlanSubmissionSource,
108
+ nullable: true
109
+ })
110
+ submission_source: AnnualTrainingPlanSubmissionSource | null;
99
111
 
100
112
  constructor(
101
113
  user_id: number,
102
- course_name: string,
103
- no_of_participants: number,
104
- course_cost: number,
105
- total_cost: number,
106
- proposed_implementation_date: string,
107
- description: string,
108
- place: AnnualTrainingPlanPlace | null,
109
- reason: string,
110
114
  status: AnnualTrainingPlanRequestStatus = AnnualTrainingPlanRequestStatus.PENDING,
111
115
  service_id?: number | null,
112
116
  sub_service_id?: number | null,
113
117
  req_user_department_id?: number | null,
114
118
  req_user_section_id?: number | null,
115
119
  req_user_position_id?: number | null,
116
- location?: string | null,
117
- employee_list?: any[] | null,
118
120
  reviewer_user_id?: number | null,
119
121
  assigned_to_user_id?: number | null,
120
122
  assigned_at?: Date | null,
121
123
  workflow_execution_id?: string | null,
122
- job_competency?: string | null,
123
- name_of_participants?: string[] | null,
124
124
  directarate?: string | null
125
125
  ) {
126
126
  super();
127
127
  this.user_id = user_id;
128
- this.course_name = course_name;
129
- this.no_of_participants = no_of_participants;
130
- this.course_cost = course_cost;
131
- this.total_cost = total_cost;
132
- this.proposed_implementation_date = proposed_implementation_date;
133
- this.description = description;
134
- this.place = place;
135
- this.reason = reason;
128
+ this.total_cost = 0;
136
129
  this.status = status;
137
130
  this.service_id = service_id || null;
138
131
  this.sub_service_id = sub_service_id || null;
139
132
  this.req_user_department_id = req_user_department_id || null;
140
133
  this.req_user_section_id = req_user_section_id || null;
141
134
  this.req_user_position_id = req_user_position_id || null;
142
- this.location = location || null;
143
- this.employee_list = employee_list || null;
144
135
  this.reviewer_user_id = reviewer_user_id || null;
145
136
  this.assigned_to_user_id = assigned_to_user_id || null;
146
137
  this.assigned_at = assigned_at || null;
147
138
  this.workflow_execution_id = workflow_execution_id || null;
148
- this.job_competency = job_competency ?? null;
149
- this.name_of_participants = name_of_participants ?? null;
150
139
  this.directarate = directarate ?? null;
140
+ this.plan_name = null;
141
+ this.plan_number = null;
142
+ this.plan_year = null;
143
+ this.source_file_url = null;
144
+ this.source_file_name = null;
145
+ this.total_departments = 0;
146
+ this.total_courses = 0;
147
+ this.total_participants = 0;
148
+ this.import_status = null;
149
+ this.submission_source = null;
151
150
  }
152
151
  }
153
152
 
@@ -120,6 +120,9 @@ export class TrainingRoomBookingRequest extends BaseModel {
120
120
  @Column({ type: "varchar", length: 255, nullable: true })
121
121
  workflow_execution_id: string | null;
122
122
 
123
+ @Column({ type: "varchar", length: 20, nullable: true })
124
+ reference_number: string | null;
125
+
123
126
  constructor(
124
127
  user_id: number,
125
128
  purpose_of_training: string,
@@ -169,6 +172,7 @@ export class TrainingRoomBookingRequest extends BaseModel {
169
172
  this.assigned_to_user_id = assigned_to_user_id || null;
170
173
  this.assigned_at = assigned_at || null;
171
174
  this.workflow_execution_id = workflow_execution_id || null;
175
+ this.reference_number = null;
172
176
  }
173
177
  }
174
178
 
@@ -1,74 +1,81 @@
1
- import { Column, Entity } from "typeorm";
2
- import { BaseModel } from "./BaseModel";
3
-
4
- export enum TrainingRoomBookingWorkFlowStatus {
5
- COMPLETED = "Completed",
6
- NOT_YET_STARTED = "Not Yet Started",
7
- PENDING = "Pending",
8
- REJECTED = "Rejected"
9
- }
10
-
11
- @Entity({ name: "training_room_booking_workflows" })
12
- export class TrainingRoomBookingWorkFlow extends BaseModel {
13
- @Column({ type: "int", nullable: false })
14
- request_id: number;
15
-
16
- @Column({ type: "integer", nullable: true })
17
- service_id: number | null;
18
-
19
- @Column({ type: "integer", nullable: true })
20
- sub_service_id: number | null;
21
-
22
- @Column({ type: "int", nullable: true })
23
- order: number | null;
24
-
25
- @Column({ type: "varchar", length: 255, nullable: false })
26
- content: string;
27
- @Column({ type: "varchar", length: 500, nullable: true })
28
- content_ar: string | null;
29
-
30
-
31
- @Column({ type: "integer", nullable: true })
32
- approver_role_id: number | null;
33
-
34
- @Column({ type: "integer", nullable: true })
35
- approver_user_id: number | null;
36
-
37
- @Column({ type: "integer", nullable: true })
38
- approved_by: number | null;
39
-
40
- @Column({
41
- type: "enum",
42
- enum: TrainingRoomBookingWorkFlowStatus,
43
- default: TrainingRoomBookingWorkFlowStatus.PENDING,
44
- nullable: false
45
- })
46
- status: TrainingRoomBookingWorkFlowStatus;
47
- @Column({ type: "varchar", length: 100, nullable: true })
48
- status_ar: string | null;
49
-
50
-
51
- constructor(
52
- request_id: number,
53
- content: string,
54
- status: TrainingRoomBookingWorkFlowStatus,
55
- service_id?: number | null,
56
- sub_service_id?: number | null,
57
- order?: number,
58
- approver_role_id?: number | null,
59
- approver_user_id?: number | null,
60
- approved_by?: number | null
61
- ) {
62
- super();
63
- this.request_id = request_id;
64
- this.service_id = service_id || null;
65
- this.sub_service_id = sub_service_id || null;
66
- this.content = content;
67
- this.status = status;
68
- this.order = order || null;
69
- this.approver_role_id = approver_role_id || null;
70
- this.approver_user_id = approver_user_id || null;
71
- this.approved_by = approved_by || null;
72
- }
73
- }
74
-
1
+ import { Column, Entity } from "typeorm";
2
+ import { BaseModel } from "./BaseModel";
3
+
4
+ export enum TrainingRoomBookingWorkFlowStatus {
5
+ COMPLETED = "Completed",
6
+ NOT_YET_STARTED = "Not Yet Started",
7
+ PENDING = "Pending",
8
+ IN_PROGRESS = "In Progress",
9
+ REJECTED = "Rejected"
10
+ }
11
+
12
+ @Entity({ name: "training_room_booking_workflows" })
13
+ export class TrainingRoomBookingWorkFlow extends BaseModel {
14
+ @Column({ type: "int", nullable: false })
15
+ request_id: number;
16
+
17
+ @Column({ type: "integer", nullable: true })
18
+ service_id: number | null;
19
+
20
+ @Column({ type: "integer", nullable: true })
21
+ sub_service_id: number | null;
22
+
23
+ @Column({ type: "int", nullable: true })
24
+ order: number | null;
25
+
26
+ @Column({ type: "varchar", length: 255, nullable: false })
27
+ content: string;
28
+ @Column({ type: "varchar", length: 500, nullable: true })
29
+ content_ar: string | null;
30
+
31
+
32
+ @Column({ type: "integer", nullable: true })
33
+ approver_role_id: number | null;
34
+
35
+ @Column({ type: "integer", nullable: true })
36
+ approver_user_id: number | null;
37
+
38
+ @Column({ type: "integer", nullable: true })
39
+ approved_by: number | null;
40
+
41
+ @Column({ type: "integer", nullable: true })
42
+ department_id: number | null;
43
+
44
+ @Column({ type: "integer", nullable: true })
45
+ section_id: number | null;
46
+
47
+ @Column({
48
+ type: "enum",
49
+ enum: TrainingRoomBookingWorkFlowStatus,
50
+ default: TrainingRoomBookingWorkFlowStatus.PENDING,
51
+ nullable: false
52
+ })
53
+ status: TrainingRoomBookingWorkFlowStatus;
54
+ @Column({ type: "varchar", length: 100, nullable: true })
55
+ status_ar: string | null;
56
+
57
+
58
+ constructor(
59
+ request_id: number,
60
+ content: string,
61
+ status: TrainingRoomBookingWorkFlowStatus,
62
+ service_id?: number | null,
63
+ sub_service_id?: number | null,
64
+ order?: number,
65
+ approver_role_id?: number | null,
66
+ approver_user_id?: number | null,
67
+ approved_by?: number | null
68
+ ) {
69
+ super();
70
+ this.request_id = request_id;
71
+ this.service_id = service_id || null;
72
+ this.sub_service_id = sub_service_id || null;
73
+ this.content = content;
74
+ this.status = status;
75
+ this.order = order || null;
76
+ this.approver_role_id = approver_role_id || null;
77
+ this.approver_user_id = approver_user_id || null;
78
+ this.approved_by = approved_by || null;
79
+ }
80
+ }
81
+
package/src/scripts.ts CHANGED
@@ -1,10 +1,20 @@
1
- import { AppDataSource } from './data-source';
2
-
3
- AppDataSource.initialize()
4
- .then(() => {
5
- console.log('✅ Database schema synchronized successfully.');
6
- })
7
- .catch((error: any) => {
8
- console.error('❌ Error during schema synchronization:', error);
9
- process.exit(1);
10
- });
1
+ import { AppDataSource } from './data-source';
2
+
3
+
4
+
5
+ AppDataSource.initialize()
6
+
7
+ .then(() => {
8
+
9
+ console.log('✅ Database schema synchronized successfully.');
10
+
11
+ })
12
+
13
+ .catch((error: any) => {
14
+
15
+ console.error('❌ Error during schema synchronization:', error);
16
+
17
+ process.exit(1);
18
+
19
+ });
20
+