@platform-modules/foreign-ministry 1.3.277 → 1.3.290
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/.env +10 -5
- package/dist/data-source.js +8 -4
- package/dist/helpers/employee-evaluation-request.utils.d.ts +30 -0
- package/dist/helpers/employee-evaluation-request.utils.js +139 -0
- package/dist/helpers/evaluation-eligibility.utils.d.ts +10 -0
- package/dist/helpers/evaluation-eligibility.utils.js +39 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +20 -5
- package/dist/models/EmployeeEvaluationAnswerModel.d.ts +5 -6
- package/dist/models/EmployeeEvaluationAnswerModel.js +18 -16
- package/dist/models/EmployeeEvaluationApprovalModel.d.ts +1 -1
- package/dist/models/EmployeeEvaluationApprovalModel.js +2 -2
- package/dist/models/EmployeeEvaluationPersonScoreModel.d.ts +9 -0
- package/dist/models/EmployeeEvaluationPersonScoreModel.js +45 -0
- package/dist/models/EmployeeEvaluationRequestModel.d.ts +6 -1
- package/dist/models/EmployeeEvaluationRequestModel.js +18 -2
- package/dist/models/EvaluationEligibilitySettingModel.d.ts +8 -3
- package/dist/models/EvaluationEligibilitySettingModel.js +11 -3
- package/dist/models/EvaluationFormModel.d.ts +17 -0
- package/dist/models/EvaluationFormModel.js +64 -0
- package/dist/models/EvaluationFormQuestionModel.d.ts +22 -0
- package/dist/models/EvaluationFormQuestionModel.js +78 -0
- package/dist/models/EvaluationFormSectionModel.d.ts +12 -0
- package/dist/models/EvaluationFormSectionModel.js +54 -0
- package/dist/models/EvaluationMastersModel.d.ts +16 -0
- package/dist/models/EvaluationMastersModel.js +67 -0
- package/dist/models/EvaluationWorkflowModel.d.ts +60 -0
- package/dist/models/EvaluationWorkflowModel.js +215 -0
- package/dist/models/IneligibleForEvaluationModel.d.ts +8 -0
- package/dist/models/IneligibleForEvaluationModel.js +44 -0
- package/dist/models/MissionTravelClassConfigModel.d.ts +10 -0
- package/dist/models/MissionTravelClassConfigModel.js +50 -0
- package/dist/models/MissionTravelPerdiemModel.d.ts +10 -0
- package/dist/models/MissionTravelPerdiemModel.js +54 -0
- package/dist/models/UuidAuditModel.d.ts +9 -0
- package/dist/models/UuidAuditModel.js +41 -0
- package/package.json +24 -24
- package/scripts/migration-employee-evaluation-approval-role-null.sql +11 -0
- package/scripts/migration-employee-evaluation-request-v2.sql +63 -0
- package/scripts/migration-evaluation-max-employees-per-request.sql +2 -0
- package/src/data-source.ts +614 -610
- package/src/helpers/employee-evaluation-request.utils.ts +181 -0
- package/src/helpers/evaluation-eligibility.utils.ts +36 -0
- package/src/index.ts +480 -456
- package/src/models/AnnualTravelTicketPriceConfigurationItemModel.ts +36 -36
- package/src/models/AnnualTravelTicketPriceConfigurationModel.ts +35 -35
- package/src/models/AnnualTravelTicketRequestModel.ts +42 -42
- package/src/models/DiplomaticAcademyRequestModel.ts +80 -80
- package/src/models/DocumentationFileModel.ts +40 -40
- package/src/models/EmployeeEvaluationAnswerModel.ts +26 -26
- package/src/models/EmployeeEvaluationApprovalModel.ts +2 -2
- package/src/models/EmployeeEvaluationPersonScoreModel.ts +25 -0
- package/src/models/EmployeeEvaluationRequestModel.ts +90 -77
- package/src/models/EvaluationEligibilitySettingModel.ts +51 -42
- package/src/models/EvaluationFormModel.ts +40 -0
- package/src/models/EvaluationFormQuestionModel.ts +52 -0
- package/src/models/EvaluationFormSectionModel.ts +33 -0
- package/src/models/FinancialWorkFlowModel.ts +15 -15
- package/src/models/GatePassVisitorsModel.ts +7 -7
- package/src/models/LMSExternalEntityTrainedPersonModel.ts +45 -45
- package/src/models/LanguageCourseRequestModel.ts +67 -67
- package/src/models/LeaveConfigModel.ts +71 -71
- package/src/models/MissionTravelApprovalModel.ts +101 -101
- package/src/models/MissionTravelAttachmentModel.ts +56 -56
- package/src/models/MissionTravelChatModel.ts +52 -52
- package/src/models/MissionTravelPersonModel.ts +105 -105
- package/src/models/MissionTravelWorkflowModel.ts +54 -54
- package/src/models/PollOptionsModel.ts +26 -26
- package/src/models/PollVotesModel.ts +37 -37
- package/src/models/PollsModel.ts +49 -49
- package/src/models/ProjectContactsModel.ts +51 -51
- package/src/models/ProjectFaqModel.ts +36 -36
- package/src/models/ProjectInvoicesModel.ts +41 -41
- package/src/models/ProjectModel.ts +75 -75
- package/src/models/ProjectTasksModel.ts +75 -75
- package/src/models/ResignationTerminationApprovalModel.ts +9 -9
- package/src/models/ResignationTerminationRequestModel.ts +17 -17
- package/src/models/SectionModel.ts +35 -35
- package/src/models/ServicesNotificationConfigsModel.ts +55 -55
- package/src/models/TelephoneDirectoryModel.ts +20 -20
- package/dist/models/EmbassyMasterModel.d.ts +0 -16
- package/dist/models/EmbassyMasterModel.js +0 -75
- package/dist/models/UserDependentsModel.d.ts +0 -18
- package/dist/models/UserDependentsModel.js +0 -94
- package/src/models/EvaluationQuestionMasterModel.ts +0 -23
- package/src/models/EvaluationSectionMasterModel.ts +0 -17
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MissionTravelClassConfig = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
const BaseModel_1 = require("./BaseModel");
|
|
15
|
+
const MissionTravelPersonModel_1 = require("./MissionTravelPersonModel");
|
|
16
|
+
let MissionTravelClassConfig = class MissionTravelClassConfig extends BaseModel_1.BaseModel {
|
|
17
|
+
constructor(grade, position, travel_class, description) {
|
|
18
|
+
super();
|
|
19
|
+
this.grade = grade;
|
|
20
|
+
this.position = position;
|
|
21
|
+
this.travel_class = travel_class;
|
|
22
|
+
this.description = description;
|
|
23
|
+
this.is_active = true;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.MissionTravelClassConfig = MissionTravelClassConfig;
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, typeorm_1.Column)({ type: 'int', nullable: true }),
|
|
29
|
+
__metadata("design:type", Object)
|
|
30
|
+
], MissionTravelClassConfig.prototype, "grade", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, typeorm_1.Column)({ type: 'varchar', length: 255, nullable: true }),
|
|
33
|
+
__metadata("design:type", Object)
|
|
34
|
+
], MissionTravelClassConfig.prototype, "position", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, typeorm_1.Column)({ type: 'enum', enum: MissionTravelPersonModel_1.TravelClass, nullable: false }),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], MissionTravelClassConfig.prototype, "travel_class", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, typeorm_1.Column)({ type: 'boolean', default: true }),
|
|
41
|
+
__metadata("design:type", Boolean)
|
|
42
|
+
], MissionTravelClassConfig.prototype, "is_active", void 0);
|
|
43
|
+
__decorate([
|
|
44
|
+
(0, typeorm_1.Column)({ type: 'text', nullable: true }),
|
|
45
|
+
__metadata("design:type", Object)
|
|
46
|
+
], MissionTravelClassConfig.prototype, "description", void 0);
|
|
47
|
+
exports.MissionTravelClassConfig = MissionTravelClassConfig = __decorate([
|
|
48
|
+
(0, typeorm_1.Entity)({ name: 'mission_travel_class_config' }),
|
|
49
|
+
__metadata("design:paramtypes", [Object, Object, String, Object])
|
|
50
|
+
], MissionTravelClassConfig);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseModel } from './BaseModel';
|
|
2
|
+
export declare class MissionTravelPerdiem extends BaseModel {
|
|
3
|
+
grade: number;
|
|
4
|
+
perdiem_amount: number;
|
|
5
|
+
currency: string | null;
|
|
6
|
+
effective_from: Date | null;
|
|
7
|
+
effective_to: Date | null;
|
|
8
|
+
is_active: boolean;
|
|
9
|
+
constructor(grade: number, perdiem_amount: number, currency: string | null, effective_from: Date | null, effective_to: Date | null);
|
|
10
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MissionTravelPerdiem = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
const BaseModel_1 = require("./BaseModel");
|
|
15
|
+
let MissionTravelPerdiem = class MissionTravelPerdiem extends BaseModel_1.BaseModel {
|
|
16
|
+
constructor(grade, perdiem_amount, currency, effective_from, effective_to) {
|
|
17
|
+
super();
|
|
18
|
+
this.grade = grade;
|
|
19
|
+
this.perdiem_amount = perdiem_amount;
|
|
20
|
+
this.currency = currency;
|
|
21
|
+
this.effective_from = effective_from;
|
|
22
|
+
this.effective_to = effective_to;
|
|
23
|
+
this.is_active = true;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.MissionTravelPerdiem = MissionTravelPerdiem;
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, typeorm_1.Column)({ type: 'int', nullable: false }),
|
|
29
|
+
__metadata("design:type", Number)
|
|
30
|
+
], MissionTravelPerdiem.prototype, "grade", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, typeorm_1.Column)({ type: 'decimal', precision: 10, scale: 2, nullable: false }),
|
|
33
|
+
__metadata("design:type", Number)
|
|
34
|
+
], MissionTravelPerdiem.prototype, "perdiem_amount", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, typeorm_1.Column)({ type: 'varchar', length: 50, nullable: true }),
|
|
37
|
+
__metadata("design:type", Object)
|
|
38
|
+
], MissionTravelPerdiem.prototype, "currency", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, typeorm_1.Column)({ type: 'date', nullable: true }),
|
|
41
|
+
__metadata("design:type", Object)
|
|
42
|
+
], MissionTravelPerdiem.prototype, "effective_from", void 0);
|
|
43
|
+
__decorate([
|
|
44
|
+
(0, typeorm_1.Column)({ type: 'date', nullable: true }),
|
|
45
|
+
__metadata("design:type", Object)
|
|
46
|
+
], MissionTravelPerdiem.prototype, "effective_to", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, typeorm_1.Column)({ type: 'boolean', default: true }),
|
|
49
|
+
__metadata("design:type", Boolean)
|
|
50
|
+
], MissionTravelPerdiem.prototype, "is_active", void 0);
|
|
51
|
+
exports.MissionTravelPerdiem = MissionTravelPerdiem = __decorate([
|
|
52
|
+
(0, typeorm_1.Entity)({ name: 'mission_travel_perdiem' }),
|
|
53
|
+
__metadata("design:paramtypes", [Number, Number, Object, Object, Object])
|
|
54
|
+
], MissionTravelPerdiem);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UuidAuditModel = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
/** UUID primary key + audit columns + soft delete via deleted_at. */
|
|
15
|
+
class UuidAuditModel {
|
|
16
|
+
}
|
|
17
|
+
exports.UuidAuditModel = UuidAuditModel;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
20
|
+
__metadata("design:type", String)
|
|
21
|
+
], UuidAuditModel.prototype, "id", void 0);
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, typeorm_1.Column)({ type: 'varchar', length: 128, nullable: false, default: '' }),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], UuidAuditModel.prototype, "created_by", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, typeorm_1.CreateDateColumn)({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }),
|
|
28
|
+
__metadata("design:type", Date)
|
|
29
|
+
], UuidAuditModel.prototype, "created_at", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, typeorm_1.Column)({ type: 'varchar', length: 128, nullable: true }),
|
|
32
|
+
__metadata("design:type", Object)
|
|
33
|
+
], UuidAuditModel.prototype, "updated_by", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, typeorm_1.UpdateDateColumn)({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }),
|
|
36
|
+
__metadata("design:type", Date)
|
|
37
|
+
], UuidAuditModel.prototype, "updated_at", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, typeorm_1.DeleteDateColumn)({ type: 'timestamptz', nullable: true }),
|
|
40
|
+
__metadata("design:type", Object)
|
|
41
|
+
], UuidAuditModel.prototype, "deleted_at", void 0);
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@platform-modules/foreign-ministry",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"main": "dist/index.js",
|
|
5
|
-
"types": "dist/index.d.ts",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"build": "tsc",
|
|
8
|
-
"dev": "ts-node src/scripts.ts"
|
|
9
|
-
},
|
|
10
|
-
"publishConfig": {
|
|
11
|
-
"access": "public"
|
|
12
|
-
},
|
|
13
|
-
"dependencies": {
|
|
14
|
-
"moment-timezone": "^0.6.0",
|
|
15
|
-
"pg": "^8.16.0",
|
|
16
|
-
"typeorm": "^0.3.17"
|
|
17
|
-
},
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@types/moment-timezone": "^0.5.30",
|
|
20
|
-
"dotenv": "^16.5.0",
|
|
21
|
-
"ts-node": "^10.9.2",
|
|
22
|
-
"typescript": "^5.2.0"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@platform-modules/foreign-ministry",
|
|
3
|
+
"version": "1.3.290",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"dev": "ts-node src/scripts.ts"
|
|
9
|
+
},
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"moment-timezone": "^0.6.0",
|
|
15
|
+
"pg": "^8.16.0",
|
|
16
|
+
"typeorm": "^0.3.17"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/moment-timezone": "^0.5.30",
|
|
20
|
+
"dotenv": "^16.5.0",
|
|
21
|
+
"ts-node": "^10.9.2",
|
|
22
|
+
"typescript": "^5.2.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Treat missing approver role as NULL (not 0)
|
|
2
|
+
ALTER TABLE employee_evaluation_approvals
|
|
3
|
+
ALTER COLUMN approver_role_id DROP NOT NULL;
|
|
4
|
+
|
|
5
|
+
UPDATE employee_evaluation_approvals
|
|
6
|
+
SET approver_role_id = NULL
|
|
7
|
+
WHERE approver_role_id = 0;
|
|
8
|
+
|
|
9
|
+
UPDATE employee_evaluation_workflows
|
|
10
|
+
SET role_id = NULL
|
|
11
|
+
WHERE role_id = 0;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
-- Employee evaluation request v2: request aggregates, person scores, answers by request/user/form
|
|
2
|
+
|
|
3
|
+
-- Request: evaluation_year as string + aggregates + form snapshot on request
|
|
4
|
+
ALTER TABLE employee_evaluation_requests
|
|
5
|
+
ALTER COLUMN evaluation_year TYPE varchar(10) USING evaluation_year::text;
|
|
6
|
+
|
|
7
|
+
ALTER TABLE employee_evaluation_requests
|
|
8
|
+
ADD COLUMN IF NOT EXISTS total_score double precision,
|
|
9
|
+
ADD COLUMN IF NOT EXISTS average_score double precision,
|
|
10
|
+
ADD COLUMN IF NOT EXISTS employee_count integer NOT NULL DEFAULT 0,
|
|
11
|
+
ADD COLUMN IF NOT EXISTS dynamic_evaluation_form jsonb;
|
|
12
|
+
|
|
13
|
+
-- Person scores (per employee in a request)
|
|
14
|
+
CREATE TABLE IF NOT EXISTS employee_evaluation_person_scores (
|
|
15
|
+
id serial PRIMARY KEY,
|
|
16
|
+
request_id integer NOT NULL REFERENCES employee_evaluation_requests(id) ON DELETE CASCADE,
|
|
17
|
+
user_id integer NOT NULL,
|
|
18
|
+
us_feedback varchar(32),
|
|
19
|
+
is_rca boolean NOT NULL DEFAULT false,
|
|
20
|
+
total_score double precision,
|
|
21
|
+
created_by varchar(255),
|
|
22
|
+
updated_by varchar(255),
|
|
23
|
+
created_at timestamptz DEFAULT now(),
|
|
24
|
+
updated_at timestamptz DEFAULT now(),
|
|
25
|
+
is_deleted boolean NOT NULL DEFAULT false,
|
|
26
|
+
UNIQUE (request_id, user_id)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- Answers: migrate from employee_evaluation_id to request_id / user_id / form_id
|
|
30
|
+
ALTER TABLE employee_evaluation_answers
|
|
31
|
+
ADD COLUMN IF NOT EXISTS request_id integer,
|
|
32
|
+
ADD COLUMN IF NOT EXISTS user_id integer,
|
|
33
|
+
ADD COLUMN IF NOT EXISTS form_id integer,
|
|
34
|
+
ADD COLUMN IF NOT EXISTS section_id integer,
|
|
35
|
+
ADD COLUMN IF NOT EXISTS question_id integer;
|
|
36
|
+
|
|
37
|
+
UPDATE employee_evaluation_answers a
|
|
38
|
+
SET
|
|
39
|
+
request_id = ev.evaluation_request_id,
|
|
40
|
+
user_id = ev.user_id,
|
|
41
|
+
section_id = a.evaluation_section_id,
|
|
42
|
+
question_id = a.evaluation_question_id,
|
|
43
|
+
form_id = fs.form_id
|
|
44
|
+
FROM employee_evaluations ev
|
|
45
|
+
LEFT JOIN evaluation_form_sections fs ON fs.id = a.evaluation_section_id
|
|
46
|
+
WHERE a.employee_evaluation_id = ev.id
|
|
47
|
+
AND a.request_id IS NULL;
|
|
48
|
+
|
|
49
|
+
-- Backfill form_id from questions if section join missed
|
|
50
|
+
UPDATE employee_evaluation_answers a
|
|
51
|
+
SET form_id = fq.form_section_id
|
|
52
|
+
FROM evaluation_form_questions fq
|
|
53
|
+
WHERE a.form_id IS NULL AND a.question_id = fq.id;
|
|
54
|
+
|
|
55
|
+
UPDATE employee_evaluation_answers a
|
|
56
|
+
SET form_id = fs.form_id
|
|
57
|
+
FROM evaluation_form_sections fs
|
|
58
|
+
WHERE a.form_id IS NULL AND a.section_id = fs.id;
|
|
59
|
+
|
|
60
|
+
-- Drop legacy FK columns when safe (optional — run after app deploy)
|
|
61
|
+
-- ALTER TABLE employee_evaluation_answers DROP COLUMN IF EXISTS employee_evaluation_id;
|
|
62
|
+
-- ALTER TABLE employee_evaluation_answers DROP COLUMN IF EXISTS evaluation_section_id;
|
|
63
|
+
-- ALTER TABLE employee_evaluation_answers DROP COLUMN IF EXISTS evaluation_question_id;
|