@platform-modules/foreign-ministry 1.3.277 → 1.3.286

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 (71) hide show
  1. package/.env +10 -5
  2. package/dist/data-source.js +6 -4
  3. package/dist/helpers/evaluation-eligibility.utils.d.ts +10 -0
  4. package/dist/helpers/evaluation-eligibility.utils.js +39 -0
  5. package/dist/index.d.ts +4 -2
  6. package/dist/index.js +13 -5
  7. package/dist/models/EmployeeEvaluationAnswerModel.d.ts +6 -4
  8. package/dist/models/EmployeeEvaluationAnswerModel.js +6 -6
  9. package/dist/models/EvaluationEligibilitySettingModel.d.ts +6 -3
  10. package/dist/models/EvaluationEligibilitySettingModel.js +7 -3
  11. package/dist/models/EvaluationFormModel.d.ts +17 -0
  12. package/dist/models/EvaluationFormModel.js +64 -0
  13. package/dist/models/EvaluationFormQuestionModel.d.ts +22 -0
  14. package/dist/models/EvaluationFormQuestionModel.js +78 -0
  15. package/dist/models/EvaluationFormSectionModel.d.ts +12 -0
  16. package/dist/models/EvaluationFormSectionModel.js +54 -0
  17. package/dist/models/EvaluationMastersModel.d.ts +16 -0
  18. package/dist/models/EvaluationMastersModel.js +67 -0
  19. package/dist/models/EvaluationWorkflowModel.d.ts +60 -0
  20. package/dist/models/EvaluationWorkflowModel.js +215 -0
  21. package/dist/models/IneligibleForEvaluationModel.d.ts +8 -0
  22. package/dist/models/IneligibleForEvaluationModel.js +44 -0
  23. package/dist/models/MissionTravelClassConfigModel.d.ts +10 -0
  24. package/dist/models/MissionTravelClassConfigModel.js +50 -0
  25. package/dist/models/MissionTravelPerdiemModel.d.ts +10 -0
  26. package/dist/models/MissionTravelPerdiemModel.js +54 -0
  27. package/dist/models/UuidAuditModel.d.ts +9 -0
  28. package/dist/models/UuidAuditModel.js +41 -0
  29. package/package.json +1 -1
  30. package/src/data-source.ts +6 -4
  31. package/src/helpers/evaluation-eligibility.utils.ts +36 -0
  32. package/src/index.ts +15 -3
  33. package/src/models/AnnualTravelTicketPriceConfigurationItemModel.ts +36 -36
  34. package/src/models/AnnualTravelTicketPriceConfigurationModel.ts +35 -35
  35. package/src/models/AnnualTravelTicketRequestModel.ts +42 -42
  36. package/src/models/DiplomaticAcademyRequestModel.ts +80 -80
  37. package/src/models/DocumentationFileModel.ts +40 -40
  38. package/src/models/EmployeeEvaluationAnswerModel.ts +8 -6
  39. package/src/models/EvaluationEligibilitySettingModel.ts +9 -4
  40. package/src/models/EvaluationFormModel.ts +40 -0
  41. package/src/models/EvaluationFormQuestionModel.ts +52 -0
  42. package/src/models/EvaluationFormSectionModel.ts +33 -0
  43. package/src/models/FinancialWorkFlowModel.ts +15 -15
  44. package/src/models/GatePassVisitorsModel.ts +7 -7
  45. package/src/models/LMSExternalEntityTrainedPersonModel.ts +45 -45
  46. package/src/models/LanguageCourseRequestModel.ts +67 -67
  47. package/src/models/LeaveConfigModel.ts +71 -71
  48. package/src/models/MissionTravelApprovalModel.ts +101 -101
  49. package/src/models/MissionTravelAttachmentModel.ts +56 -56
  50. package/src/models/MissionTravelChatModel.ts +52 -52
  51. package/src/models/MissionTravelPersonModel.ts +105 -105
  52. package/src/models/MissionTravelWorkflowModel.ts +54 -54
  53. package/src/models/PollOptionsModel.ts +26 -26
  54. package/src/models/PollVotesModel.ts +37 -37
  55. package/src/models/PollsModel.ts +49 -49
  56. package/src/models/ProjectContactsModel.ts +51 -51
  57. package/src/models/ProjectFaqModel.ts +36 -36
  58. package/src/models/ProjectInvoicesModel.ts +41 -41
  59. package/src/models/ProjectModel.ts +75 -75
  60. package/src/models/ProjectTasksModel.ts +75 -75
  61. package/src/models/ResignationTerminationApprovalModel.ts +9 -9
  62. package/src/models/ResignationTerminationRequestModel.ts +17 -17
  63. package/src/models/SectionModel.ts +35 -35
  64. package/src/models/ServicesNotificationConfigsModel.ts +55 -55
  65. package/src/models/TelephoneDirectoryModel.ts +20 -20
  66. package/dist/models/EmbassyMasterModel.d.ts +0 -16
  67. package/dist/models/EmbassyMasterModel.js +0 -75
  68. package/dist/models/UserDependentsModel.d.ts +0 -18
  69. package/dist/models/UserDependentsModel.js +0 -94
  70. package/src/models/EvaluationQuestionMasterModel.ts +0 -23
  71. package/src/models/EvaluationSectionMasterModel.ts +0 -17
@@ -1,35 +1,35 @@
1
- import { Column, Entity, OneToMany, Unique } from 'typeorm';
2
- import { BaseModel } from './BaseModel';
3
- import { AnnualTravelTicketPriceConfigurationItem } from './AnnualTravelTicketPriceConfigurationItemModel';
4
-
5
- /**
6
- * Admin configuration for annual travel ticket pricing.
7
- * One record per year (and optional service/sub-service pair), with multiple age slabs.
8
- */
9
- @Entity({ name: 'annual_travel_ticket_price_configurations' })
10
- @Unique(['service_id', 'sub_service_id', 'ticket_year'])
11
- export class AnnualTravelTicketPriceConfiguration extends BaseModel {
12
- @Column({ type: 'int', nullable: true })
13
- service_id: number | null;
14
-
15
- @Column({ type: 'int', nullable: true })
16
- sub_service_id: number | null;
17
-
18
- @Column({ type: 'int', nullable: false })
19
- ticket_year: number;
20
-
21
- @Column({ type: 'varchar', length: 255, nullable: true })
22
- configuration_name: string | null;
23
-
24
- @Column({ type: 'varchar', length: 10, nullable: true, default: 'OMR' })
25
- currency_code: string | null;
26
-
27
- @Column({ type: 'text', nullable: true })
28
- description: string | null;
29
-
30
- @Column({ type: 'boolean', default: true, nullable: false })
31
- is_active: boolean;
32
-
33
- @OneToMany(() => AnnualTravelTicketPriceConfigurationItem, (item) => item.configuration)
34
- price_slabs?: AnnualTravelTicketPriceConfigurationItem[];
35
- }
1
+ import { Column, Entity, OneToMany, Unique } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+ import { AnnualTravelTicketPriceConfigurationItem } from './AnnualTravelTicketPriceConfigurationItemModel';
4
+
5
+ /**
6
+ * Admin configuration for annual travel ticket pricing.
7
+ * One record per year (and optional service/sub-service pair), with multiple age slabs.
8
+ */
9
+ @Entity({ name: 'annual_travel_ticket_price_configurations' })
10
+ @Unique(['service_id', 'sub_service_id', 'ticket_year'])
11
+ export class AnnualTravelTicketPriceConfiguration extends BaseModel {
12
+ @Column({ type: 'int', nullable: true })
13
+ service_id: number | null;
14
+
15
+ @Column({ type: 'int', nullable: true })
16
+ sub_service_id: number | null;
17
+
18
+ @Column({ type: 'int', nullable: false })
19
+ ticket_year: number;
20
+
21
+ @Column({ type: 'varchar', length: 255, nullable: true })
22
+ configuration_name: string | null;
23
+
24
+ @Column({ type: 'varchar', length: 10, nullable: true, default: 'OMR' })
25
+ currency_code: string | null;
26
+
27
+ @Column({ type: 'text', nullable: true })
28
+ description: string | null;
29
+
30
+ @Column({ type: 'boolean', default: true, nullable: false })
31
+ is_active: boolean;
32
+
33
+ @OneToMany(() => AnnualTravelTicketPriceConfigurationItem, (item) => item.configuration)
34
+ price_slabs?: AnnualTravelTicketPriceConfigurationItem[];
35
+ }
@@ -1,23 +1,23 @@
1
- import { Column, Entity } from 'typeorm';
2
- import { BaseModel } from './BaseModel';
3
-
4
- export enum AnnualTravelTicketPermanentResidence {
5
- SALALAH = 'Salalah',
6
- MUSANDAM = 'Musandam',
7
- }
8
-
9
- export interface AnnualTravelTicketFamilyDetail {
10
- person_name: string;
11
- relation: string;
12
- age: number;
13
- age_category: string;
14
- price: number | string;
15
- }
16
-
17
- /** Aligns with mission bank account request lifecycle for shared workflow UI. */
18
- export enum AnnualTravelTicketRequestStatus {
19
- PENDING = 'Pending',
20
- ASSIGNED = 'Assigned',
1
+ import { Column, Entity } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+
4
+ export enum AnnualTravelTicketPermanentResidence {
5
+ SALALAH = 'Salalah',
6
+ MUSANDAM = 'Musandam',
7
+ }
8
+
9
+ export interface AnnualTravelTicketFamilyDetail {
10
+ person_name: string;
11
+ relation: string;
12
+ age: number;
13
+ age_category: string;
14
+ price: number | string;
15
+ }
16
+
17
+ /** Aligns with mission bank account request lifecycle for shared workflow UI. */
18
+ export enum AnnualTravelTicketRequestStatus {
19
+ PENDING = 'Pending',
20
+ ASSIGNED = 'Assigned',
21
21
  IN_PROGRESS = 'In Progress',
22
22
  APPROVED = 'Approved',
23
23
  REJECTED = 'Rejected',
@@ -47,28 +47,28 @@ export class AnnualTravelTicketRequests extends BaseModel {
47
47
  @Column({ type: 'varchar', length: 120, nullable: false })
48
48
  civil_id_or_passport_number: string;
49
49
 
50
- @Column({ type: 'enum', enum: AnnualTravelTicketPermanentResidence, nullable: false })
51
- permanent_residence: AnnualTravelTicketPermanentResidence;
52
-
53
- /** Traveler list with person name, relation, age, age category, and price. */
54
- @Column({ type: 'jsonb', nullable: true })
55
- family_details: AnnualTravelTicketFamilyDetail[] | null;
56
-
57
- @Column({ type: 'varchar', length: 100, nullable: false })
58
- bank_account_number: string;
59
-
60
- @Column({ type: 'varchar', length: 255, nullable: false })
61
- travel_from: string;
62
-
63
- @Column({ type: 'varchar', length: 255, nullable: false })
64
- travel_to: string;
65
-
66
- @Column({ type: 'date', nullable: false })
67
- date_of_travel: string;
68
-
69
- @Column({
70
- type: 'enum',
71
- enum: AnnualTravelTicketRequestStatus,
50
+ @Column({ type: 'enum', enum: AnnualTravelTicketPermanentResidence, nullable: false })
51
+ permanent_residence: AnnualTravelTicketPermanentResidence;
52
+
53
+ /** Traveler list with person name, relation, age, age category, and price. */
54
+ @Column({ type: 'jsonb', nullable: true })
55
+ family_details: AnnualTravelTicketFamilyDetail[] | null;
56
+
57
+ @Column({ type: 'varchar', length: 100, nullable: false })
58
+ bank_account_number: string;
59
+
60
+ @Column({ type: 'varchar', length: 255, nullable: false })
61
+ travel_from: string;
62
+
63
+ @Column({ type: 'varchar', length: 255, nullable: false })
64
+ travel_to: string;
65
+
66
+ @Column({ type: 'date', nullable: false })
67
+ date_of_travel: string;
68
+
69
+ @Column({
70
+ type: 'enum',
71
+ enum: AnnualTravelTicketRequestStatus,
72
72
  default: AnnualTravelTicketRequestStatus.PENDING,
73
73
  nullable: false,
74
74
  })
@@ -1,80 +1,80 @@
1
- import { Column, Entity } from "typeorm";
2
- import { BaseModel } from './BaseModel';
3
-
4
- export enum DiplomaticAcademyStatus {
5
- SUBMITTED = "Submitted",
6
- PENDING = "Pending",
7
- ASSIGNED = "Assigned",
8
- IN_PROGRESS = "In Progress",
9
- APPROVED = "Approved",
10
- REJECTED = "Rejected"
11
- }
12
-
13
- @Entity({ name: 'diplomatic_academy_requests' })
14
- export class DiplomaticAcademyRequests extends BaseModel {
15
-
16
- // Common columns
17
- @Column({ type: 'int', nullable: true })
18
- req_user_department_id: number | null;
19
-
20
- @Column({ type: 'int', nullable: true })
21
- req_user_section_id: number | null;
22
-
23
- @Column({ type: 'int', nullable: true })
24
- service_id: number | null;
25
-
26
- @Column({ type: 'int', nullable: true })
27
- sub_service_id: number | null;
28
-
29
- @Column({ type: 'int', nullable: false })
30
- user_id: number;
31
-
32
- // Diplomatic Academy specific columns
33
- @Column({ type: 'varchar', length: 500, nullable: false })
34
- course_name: string;
35
-
36
- @Column({ type: 'jsonb', nullable: true })
37
- cost_details: {
38
- material_price?: number;
39
- transportation?: number;
40
- accommodation?: number;
41
- allowances?: number;
42
- food?: number;
43
- present?: number;
44
- } | null;
45
-
46
- @Column({ type: 'int', nullable: false })
47
- estimated_participants: number;
48
-
49
- @Column({ type: 'date', nullable: false })
50
- timeline_date_from: Date;
51
-
52
- @Column({ type: 'date', nullable: false })
53
- timeline_date_to: Date;
54
-
55
- @Column({ type: 'time', nullable: true })
56
- timeline_time_from: string | null;
57
-
58
- @Column({ type: 'time', nullable: true })
59
- timeline_time_to: string | null;
60
-
61
- @Column({ type: 'jsonb', nullable: false })
62
- participants_details: Array<{
63
- full_name: string;
64
- passport: string;
65
- age: number;
66
- qualifications: string;
67
- experience: string;
68
- institution: string;
69
- }>;
70
-
71
- @Column({ type: 'enum', enum: DiplomaticAcademyStatus, default: DiplomaticAcademyStatus.PENDING, nullable: false })
72
- status: DiplomaticAcademyStatus;
73
-
74
- @Column({ type: 'int', nullable: true })
75
- course_id: number | null;
76
-
77
- @Column({ type: 'varchar', nullable: true })
78
- workflow_execution_id: string | null;
79
-
80
- }
1
+ import { Column, Entity } from "typeorm";
2
+ import { BaseModel } from './BaseModel';
3
+
4
+ export enum DiplomaticAcademyStatus {
5
+ SUBMITTED = "Submitted",
6
+ PENDING = "Pending",
7
+ ASSIGNED = "Assigned",
8
+ IN_PROGRESS = "In Progress",
9
+ APPROVED = "Approved",
10
+ REJECTED = "Rejected"
11
+ }
12
+
13
+ @Entity({ name: 'diplomatic_academy_requests' })
14
+ export class DiplomaticAcademyRequests extends BaseModel {
15
+
16
+ // Common columns
17
+ @Column({ type: 'int', nullable: true })
18
+ req_user_department_id: number | null;
19
+
20
+ @Column({ type: 'int', nullable: true })
21
+ req_user_section_id: number | null;
22
+
23
+ @Column({ type: 'int', nullable: true })
24
+ service_id: number | null;
25
+
26
+ @Column({ type: 'int', nullable: true })
27
+ sub_service_id: number | null;
28
+
29
+ @Column({ type: 'int', nullable: false })
30
+ user_id: number;
31
+
32
+ // Diplomatic Academy specific columns
33
+ @Column({ type: 'varchar', length: 500, nullable: false })
34
+ course_name: string;
35
+
36
+ @Column({ type: 'jsonb', nullable: true })
37
+ cost_details: {
38
+ material_price?: number;
39
+ transportation?: number;
40
+ accommodation?: number;
41
+ allowances?: number;
42
+ food?: number;
43
+ present?: number;
44
+ } | null;
45
+
46
+ @Column({ type: 'int', nullable: false })
47
+ estimated_participants: number;
48
+
49
+ @Column({ type: 'date', nullable: false })
50
+ timeline_date_from: Date;
51
+
52
+ @Column({ type: 'date', nullable: false })
53
+ timeline_date_to: Date;
54
+
55
+ @Column({ type: 'time', nullable: true })
56
+ timeline_time_from: string | null;
57
+
58
+ @Column({ type: 'time', nullable: true })
59
+ timeline_time_to: string | null;
60
+
61
+ @Column({ type: 'jsonb', nullable: false })
62
+ participants_details: Array<{
63
+ full_name: string;
64
+ passport: string;
65
+ age: number;
66
+ qualifications: string;
67
+ experience: string;
68
+ institution: string;
69
+ }>;
70
+
71
+ @Column({ type: 'enum', enum: DiplomaticAcademyStatus, default: DiplomaticAcademyStatus.PENDING, nullable: false })
72
+ status: DiplomaticAcademyStatus;
73
+
74
+ @Column({ type: 'int', nullable: true })
75
+ course_id: number | null;
76
+
77
+ @Column({ type: 'varchar', nullable: true })
78
+ workflow_execution_id: string | null;
79
+
80
+ }
@@ -1,40 +1,40 @@
1
- import { Column, Entity } from 'typeorm';
2
- import { BaseModel } from './BaseModel';
3
-
4
- @Entity({ name: 'documentation_files' })
5
- export class DocumentationFile extends BaseModel {
6
- @Column({ type: 'int', nullable: true })
7
- project_id: number | null;
8
-
9
- @Column({ type: 'int' })
10
- folder_id: number;
11
-
12
- @Column({ type: 'text', nullable: true })
13
- file_path: string;
14
-
15
- @Column({ type: 'varchar', length: 500, nullable: true })
16
- filename: string;
17
-
18
- @Column({ type: 'bigint', nullable: true })
19
- filesize: number;
20
-
21
- @Column({ type: 'varchar', length: 100, nullable: true })
22
- filetype: string;
23
-
24
- constructor(
25
- project_id?: number | null,
26
- folder_id?: number,
27
- file_path?: string,
28
- filename?: string,
29
- filesize?: number,
30
- filetype?: string
31
- ) {
32
- super();
33
- this.project_id = project_id ?? null;
34
- this.folder_id = folder_id ?? 0;
35
- this.file_path = file_path ?? '';
36
- this.filename = filename ?? '';
37
- this.filesize = filesize ?? 0;
38
- this.filetype = filetype ?? '';
39
- }
40
- }
1
+ import { Column, Entity } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+
4
+ @Entity({ name: 'documentation_files' })
5
+ export class DocumentationFile extends BaseModel {
6
+ @Column({ type: 'int', nullable: true })
7
+ project_id: number | null;
8
+
9
+ @Column({ type: 'int' })
10
+ folder_id: number;
11
+
12
+ @Column({ type: 'text', nullable: true })
13
+ file_path: string;
14
+
15
+ @Column({ type: 'varchar', length: 500, nullable: true })
16
+ filename: string;
17
+
18
+ @Column({ type: 'bigint', nullable: true })
19
+ filesize: number;
20
+
21
+ @Column({ type: 'varchar', length: 100, nullable: true })
22
+ filetype: string;
23
+
24
+ constructor(
25
+ project_id?: number | null,
26
+ folder_id?: number,
27
+ file_path?: string,
28
+ filename?: string,
29
+ filesize?: number,
30
+ filetype?: string
31
+ ) {
32
+ super();
33
+ this.project_id = project_id ?? null;
34
+ this.folder_id = folder_id ?? 0;
35
+ this.file_path = file_path ?? '';
36
+ this.filename = filename ?? '';
37
+ this.filesize = filesize ?? 0;
38
+ this.filetype = filetype ?? '';
39
+ }
40
+ }
@@ -1,7 +1,7 @@
1
1
  import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
2
2
  import { BaseModel } from './BaseModel';
3
- import { EvaluationSectionMaster } from './EvaluationSectionMasterModel';
4
- import { EvaluationQuestionMaster } from './EvaluationQuestionMasterModel';
3
+ import { EvaluationFormSection } from './EvaluationFormSectionModel';
4
+ import { EvaluationFormQuestion } from './EvaluationFormQuestionModel';
5
5
  import { EmployeeEvaluation } from './EmployeeEvaluationModel';
6
6
 
7
7
  @Entity({ name: 'employee_evaluation_answers' })
@@ -10,13 +10,15 @@ export class EmployeeEvaluationAnswers extends BaseModel {
10
10
  @JoinColumn({ name: 'employee_evaluation_id' })
11
11
  employee_evaluation: EmployeeEvaluation;
12
12
 
13
- @ManyToOne(() => EvaluationSectionMaster, { onDelete: 'RESTRICT' })
13
+ /** Form section (replaces legacy evaluation_section_master). */
14
+ @ManyToOne(() => EvaluationFormSection, { onDelete: 'RESTRICT' })
14
15
  @JoinColumn({ name: 'evaluation_section_id' })
15
- evaluation_section: EvaluationSectionMaster;
16
+ evaluation_section: EvaluationFormSection;
16
17
 
17
- @ManyToOne(() => EvaluationQuestionMaster, { onDelete: 'RESTRICT' })
18
+ /** Form question (replaces legacy evaluation_question_master). */
19
+ @ManyToOne(() => EvaluationFormQuestion, { onDelete: 'RESTRICT' })
18
20
  @JoinColumn({ name: 'evaluation_question_id' })
19
- evaluation_question: EvaluationQuestionMaster;
21
+ evaluation_question: EvaluationFormQuestion;
20
22
 
21
23
  @Column({ type: 'int', nullable: false })
22
24
  score: number;
@@ -13,12 +13,17 @@ export class EvaluationEligibilitySetting extends BaseModel {
13
13
  @Column({ type: 'int' })
14
14
  section_id: number;
15
15
 
16
- /** Calendar month 1–12 */
16
+ /** Evaluation window start month (1–12). */
17
17
  @Column({ type: 'int' })
18
- month: number;
18
+ from_month: number;
19
19
 
20
- @Column({ type: 'date' })
21
- evaluation_end_date: Date;
20
+ /** Evaluation window end month (1–12), inclusive. */
21
+ @Column({ type: 'int' })
22
+ to_month: number;
23
+
24
+ /** Last day of the evaluation month (1–31) when submissions close. */
25
+ @Column({ type: 'int' })
26
+ evaluation_end_date: number;
22
27
 
23
28
  @Column({ type: 'boolean', default: true })
24
29
  is_active: boolean;
@@ -0,0 +1,40 @@
1
+ import { Column, Entity, Index, OneToMany } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+ import { EvaluationFormSection } from './EvaluationFormSectionModel';
4
+
5
+ export enum EvaluationFormType {
6
+ EMPLOYEE_EVALUATION = 'employee_evaluation',
7
+ DEPARTMENT = 'department',
8
+ }
9
+
10
+ @Entity({ name: 'evaluation_forms' })
11
+ @Index('uq_evaluation_forms_form_name', ['form_name'], { unique: true, where: '"is_deleted" = false' })
12
+ @Index('uq_evaluation_forms_form_code', ['form_code'], { unique: true, where: '"is_deleted" = false' })
13
+ export class EvaluationForm extends BaseModel {
14
+ @Column({ type: 'varchar', length: 255, nullable: false })
15
+ form_name: string;
16
+
17
+ @Column({ type: 'varchar', length: 64, nullable: false })
18
+ form_code: string;
19
+
20
+ @Column({ type: 'varchar', length: 32, nullable: false })
21
+ form_type: EvaluationFormType;
22
+
23
+ @Column({ type: 'int', nullable: true })
24
+ department_id: number | null;
25
+
26
+ @Column({ type: 'int', nullable: true })
27
+ section_id: number | null;
28
+
29
+ @Column({ type: 'int', default: 0 })
30
+ min_score: number;
31
+
32
+ @Column({ type: 'int', default: 10 })
33
+ max_score: number;
34
+
35
+ @Column({ type: 'boolean', default: true })
36
+ is_active: boolean;
37
+
38
+ @OneToMany(() => EvaluationFormSection, (s) => s.form)
39
+ sections?: EvaluationFormSection[];
40
+ }
@@ -0,0 +1,52 @@
1
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+ import { EvaluationFormSection } from './EvaluationFormSectionModel';
4
+
5
+ export enum EvaluationFormQuestionType {
6
+ RATING = 'rating',
7
+ TEXT = 'text',
8
+ TEXTAREA = 'textarea',
9
+ DROPDOWN = 'dropdown',
10
+ CHECKBOX = 'checkbox',
11
+ }
12
+
13
+ @Entity({ name: 'evaluation_form_questions' })
14
+ @Index('uq_evaluation_form_questions_section_display_order', ['form_section_id', 'display_order'], {
15
+ unique: true,
16
+ where: '"is_deleted" = false',
17
+ })
18
+ export class EvaluationFormQuestion extends BaseModel {
19
+ @Column({ type: 'int', nullable: false })
20
+ form_section_id: number;
21
+
22
+ @ManyToOne(() => EvaluationFormSection, (s) => s.questions, { onDelete: 'CASCADE' })
23
+ @JoinColumn({ name: 'form_section_id' })
24
+ section: EvaluationFormSection;
25
+
26
+ @Column({ type: 'text', nullable: false })
27
+ question_text: string;
28
+
29
+ @Column({ type: 'varchar', length: 32, nullable: false, default: EvaluationFormQuestionType.RATING })
30
+ question_type: EvaluationFormQuestionType;
31
+
32
+ @Column({ type: 'int', default: 0 })
33
+ min_score: number;
34
+
35
+ @Column({ type: 'int', default: 10 })
36
+ max_score: number;
37
+
38
+ @Column({ type: 'boolean', default: false })
39
+ is_required: boolean;
40
+
41
+ @Column({ type: 'int', default: 0 })
42
+ display_order: number;
43
+
44
+ @Column({ type: 'text', nullable: true })
45
+ help_text: string | null;
46
+
47
+ @Column({ type: 'jsonb', nullable: true })
48
+ options_json: string[] | null;
49
+
50
+ @Column({ type: 'boolean', default: true })
51
+ is_active: boolean;
52
+ }
@@ -0,0 +1,33 @@
1
+ import { Column, Entity, Index, JoinColumn, ManyToOne, OneToMany } from 'typeorm';
2
+ import { BaseModel } from './BaseModel';
3
+ import { EvaluationForm } from './EvaluationFormModel';
4
+ import type { EvaluationFormQuestion } from './EvaluationFormQuestionModel';
5
+
6
+ @Entity({ name: 'evaluation_form_sections' })
7
+ @Index('uq_evaluation_form_sections_form_display_order', ['form_id', 'display_order'], {
8
+ unique: true,
9
+ where: '"is_deleted" = false',
10
+ })
11
+ export class EvaluationFormSection extends BaseModel {
12
+ @Column({ type: 'int', nullable: false })
13
+ form_id: number;
14
+
15
+ @ManyToOne(() => EvaluationForm, (f) => f.sections, { onDelete: 'CASCADE' })
16
+ @JoinColumn({ name: 'form_id' })
17
+ form: EvaluationForm;
18
+
19
+ @Column({ type: 'varchar', length: 500, nullable: false })
20
+ section_title: string;
21
+
22
+ @Column({ type: 'text', nullable: true })
23
+ section_description: string | null;
24
+
25
+ @Column({ type: 'int', default: 0 })
26
+ display_order: number;
27
+
28
+ @Column({ type: 'boolean', default: true })
29
+ is_active: boolean;
30
+
31
+ @OneToMany('EvaluationFormQuestion', 'section')
32
+ questions?: EvaluationFormQuestion[];
33
+ }
@@ -33,15 +33,15 @@ export class FinancialWorkFlow extends BaseModel {
33
33
  @Column({ type: 'int', nullable: true })
34
34
  approved_by_role_id: number;
35
35
 
36
- @Column({ type: 'int', nullable: true })
37
- step_order: number;
38
-
39
- @Column({ type: 'varchar', length: 50, nullable: true })
40
- action: string | null;
41
-
42
- @ManyToOne(() => FinancialRequests, fr => fr.workflows)
43
- @JoinColumn({ name: 'financial_request_id' })
44
- financialRequest?: FinancialRequests;
36
+ @Column({ type: 'int', nullable: true })
37
+ step_order: number;
38
+
39
+ @Column({ type: 'varchar', length: 50, nullable: true })
40
+ action: string | null;
41
+
42
+ @ManyToOne(() => FinancialRequests, fr => fr.workflows)
43
+ @JoinColumn({ name: 'financial_request_id' })
44
+ financialRequest?: FinancialRequests;
45
45
 
46
46
  constructor(
47
47
  financial_request_id: number,
@@ -55,10 +55,10 @@ export class FinancialWorkFlow extends BaseModel {
55
55
  this.status = status;
56
56
  this.approved_by_user_id = approved_by_user_id;
57
57
  this.content = content;
58
- this.financial_approval_id = 0;
59
- this.activity_date = new Date();
60
- this.step_order = step_order;
61
- this.action = null;
62
- }
63
- }
58
+ this.financial_approval_id = 0;
59
+ this.activity_date = new Date();
60
+ this.step_order = step_order;
61
+ this.action = null;
62
+ }
63
+ }
64
64
 
@@ -85,10 +85,10 @@ export class GatePassVisitors extends BaseModel {
85
85
  @Column({ type: 'varchar', length: 255, nullable: true })
86
86
  visiting_person_in_department: string | null; // زائر في القسم (Visiting Person in Department)
87
87
 
88
- @Column({ type: 'int', nullable: true, unique: true })
89
- serial_number: number | null;
90
-
91
- // QR Code for Gate Pass
88
+ @Column({ type: 'int', nullable: true, unique: true })
89
+ serial_number: number | null;
90
+
91
+ // QR Code for Gate Pass
92
92
  @Column({ type: 'text', nullable: true })
93
93
  qr_code_url: string | null; // QR code URL for this visitor (data URL can be 6000+ characters)
94
94
 
@@ -134,9 +134,9 @@ export class GatePassVisitors extends BaseModel {
134
134
  this.visitor_email_address = visitor_email_address;
135
135
  this.visitor_mobile_number = visitor_mobile_number;
136
136
  this.visitor_photo_url = visitor_photo_url;
137
- this.visitor_photo_file_name = visitor_photo_file_name;
138
- this.serial_number = null;
139
- this.gate_pass_generated = false;
137
+ this.visitor_photo_file_name = visitor_photo_file_name;
138
+ this.serial_number = null;
139
+ this.gate_pass_generated = false;
140
140
  this.email_sent = false;
141
141
  }
142
142
  }