@valentine-efagene/qshelter-common 2.0.95 → 2.0.96

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.
@@ -2,21 +2,21 @@
2
2
  * Policy evaluation utilities for scope-based authorization
3
3
  *
4
4
  * Scopes follow a resource:action pattern with wildcard support:
5
- * - "contract:read" - specific action on specific resource
6
- * - "contract:*" - all actions on contracts
5
+ * - "application:read" - specific action on specific resource
6
+ * - "application:*" - all actions on contracts
7
7
  * - "*" - superuser access
8
8
  *
9
9
  * @example
10
10
  * ```typescript
11
11
  * import { hasScope, requireScope } from '@valentine-efagene/qshelter-common';
12
12
  *
13
- * const scopes = ['contract:read', 'payment:*'];
13
+ * const scopes = ['application:read', 'payment:*'];
14
14
  *
15
- * hasScope(scopes, 'contract:read'); // true
15
+ * hasScope(scopes, 'application:read'); // true
16
16
  * hasScope(scopes, 'payment:create'); // true (wildcard match)
17
17
  * hasScope(scopes, 'user:read'); // false
18
18
  *
19
- * requireScope(scopes, 'contract:read'); // passes
19
+ * requireScope(scopes, 'application:read'); // passes
20
20
  * requireScope(scopes, 'user:read'); // throws 403 error
21
21
  * ```
22
22
  */
@@ -2,21 +2,21 @@
2
2
  * Policy evaluation utilities for scope-based authorization
3
3
  *
4
4
  * Scopes follow a resource:action pattern with wildcard support:
5
- * - "contract:read" - specific action on specific resource
6
- * - "contract:*" - all actions on contracts
5
+ * - "application:read" - specific action on specific resource
6
+ * - "application:*" - all actions on contracts
7
7
  * - "*" - superuser access
8
8
  *
9
9
  * @example
10
10
  * ```typescript
11
11
  * import { hasScope, requireScope } from '@valentine-efagene/qshelter-common';
12
12
  *
13
- * const scopes = ['contract:read', 'payment:*'];
13
+ * const scopes = ['application:read', 'payment:*'];
14
14
  *
15
- * hasScope(scopes, 'contract:read'); // true
15
+ * hasScope(scopes, 'application:read'); // true
16
16
  * hasScope(scopes, 'payment:create'); // true (wildcard match)
17
17
  * hasScope(scopes, 'user:read'); // false
18
18
  *
19
- * requireScope(scopes, 'contract:read'); // passes
19
+ * requireScope(scopes, 'application:read'); // passes
20
20
  * requireScope(scopes, 'user:read'); // throws 403 error
21
21
  * ```
22
22
  */
@@ -40,9 +40,9 @@ export function hasScope(scopes, required) {
40
40
  // Exact match
41
41
  if (s === required)
42
42
  return true;
43
- // Wildcard match: "contract:*" matches "contract:read"
43
+ // Wildcard match: "application:*" matches "application:read"
44
44
  if (s.endsWith(':*')) {
45
- const prefix = s.slice(0, -1); // "contract:"
45
+ const prefix = s.slice(0, -1); // "application:"
46
46
  return required.startsWith(prefix);
47
47
  }
48
48
  return false;
@@ -18,11 +18,11 @@ export declare enum NotificationType {
18
18
  PREQUALIFICATION_SUBMITTED = "prequalificationSubmitted",
19
19
  PREQUALIFICATION_APPROVED = "prequalificationApproved",
20
20
  PREQUALIFICATION_REJECTED = "prequalificationRejected",
21
- CONTRACT_CREATED = "contractCreated",
22
- CONTRACT_ACTIVATED = "contractActivated",
23
- CONTRACT_TERMINATION_REQUESTED = "contractTerminationRequested",
24
- CONTRACT_TERMINATION_APPROVED = "contractTerminationApproved",
25
- CONTRACT_TERMINATED = "contractTerminated",
21
+ APPLICATION_CREATED = "applicationCreated",
22
+ APPLICATION_ACTIVATED = "applicationActivated",
23
+ APPLICATION_TERMINATION_REQUESTED = "applicationTerminationRequested",
24
+ APPLICATION_TERMINATION_APPROVED = "applicationTerminationApproved",
25
+ APPLICATION_TERMINATED = "applicationTerminated",
26
26
  OFFER_LETTER_SENT = "offerLetterSent",
27
27
  OFFER_LETTER_SIGNED = "offerLetterSigned",
28
28
  OFFER_LETTER_EXPIRED = "offerLetterExpired",
@@ -24,12 +24,12 @@ export var NotificationType;
24
24
  NotificationType["PREQUALIFICATION_SUBMITTED"] = "prequalificationSubmitted";
25
25
  NotificationType["PREQUALIFICATION_APPROVED"] = "prequalificationApproved";
26
26
  NotificationType["PREQUALIFICATION_REJECTED"] = "prequalificationRejected";
27
- // Contract
28
- NotificationType["CONTRACT_CREATED"] = "contractCreated";
29
- NotificationType["CONTRACT_ACTIVATED"] = "contractActivated";
30
- NotificationType["CONTRACT_TERMINATION_REQUESTED"] = "contractTerminationRequested";
31
- NotificationType["CONTRACT_TERMINATION_APPROVED"] = "contractTerminationApproved";
32
- NotificationType["CONTRACT_TERMINATED"] = "contractTerminated";
27
+ // Application
28
+ NotificationType["APPLICATION_CREATED"] = "applicationCreated";
29
+ NotificationType["APPLICATION_ACTIVATED"] = "applicationActivated";
30
+ NotificationType["APPLICATION_TERMINATION_REQUESTED"] = "applicationTerminationRequested";
31
+ NotificationType["APPLICATION_TERMINATION_APPROVED"] = "applicationTerminationApproved";
32
+ NotificationType["APPLICATION_TERMINATED"] = "applicationTerminated";
33
33
  // Offer Letters
34
34
  NotificationType["OFFER_LETTER_SENT"] = "offerLetterSent";
35
35
  NotificationType["OFFER_LETTER_SIGNED"] = "offerLetterSigned";
@@ -53,8 +53,8 @@ export interface WalletCreditedPayload {
53
53
  export interface AllocateToInstallmentsPayload {
54
54
  userId: string;
55
55
  walletId: string;
56
- /** Optional: limit to specific contract */
57
- contractId?: string;
56
+ /** Optional: limit to specific application */
57
+ applicationId?: string;
58
58
  /** Optional: limit to specific amount */
59
59
  maxAmount?: number;
60
60
  }
@@ -39,7 +39,7 @@ export declare class PaymentEventPublisher {
39
39
  publishAllocateToInstallments(payload: {
40
40
  userId: string;
41
41
  walletId: string;
42
- contractId?: string;
42
+ applicationId?: string;
43
43
  maxAmount?: number;
44
44
  }, meta?: Partial<PaymentEventMeta>): Promise<string>;
45
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valentine-efagene/qshelter-common",
3
- "version": "2.0.95",
3
+ "version": "2.0.96",
4
4
  "description": "Shared database schemas and utilities for QShelter services",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -1,529 +1,293 @@
1
- /*
2
- Warnings:
3
-
4
- - The values [CONTRACT_TERMINATION] on the enum `approval_requests_type` will be removed. If these variants are still used in the database, this will fail.
5
- - The values [CONTRACT_PHASE] on the enum `document_requirement_rules_context` will be removed. If these variants are still used in the database, this will fail.
6
- - You are about to drop the column `contractId` on the `offer_letters` table. All the data in the column will be lost.
7
- - You are about to drop the column `contractId` on the `payment_method_change_requests` table. All the data in the column will be lost.
8
- - You are about to drop the column `sourceContractId` on the `property_transfer_requests` table. All the data in the column will be lost.
9
- - You are about to drop the column `targetContractId` on the `property_transfer_requests` table. All the data in the column will be lost.
10
- - You are about to drop the `contract_documents` table. If the table is not empty, all the data it contains will be lost.
11
- - You are about to drop the `contract_events` table. If the table is not empty, all the data it contains will be lost.
12
- - You are about to drop the `contract_installments` table. If the table is not empty, all the data it contains will be lost.
13
- - You are about to drop the `contract_payments` table. If the table is not empty, all the data it contains will be lost.
14
- - You are about to drop the `contract_phases` table. If the table is not empty, all the data it contains will be lost.
15
- - You are about to drop the `contract_refunds` table. If the table is not empty, all the data it contains will be lost.
16
- - You are about to drop the `contract_terminations` table. If the table is not empty, all the data it contains will be lost.
17
- - You are about to drop the `contracts` table. If the table is not empty, all the data it contains will be lost.
18
- - Added the required column `applicationId` to the `offer_letters` table without a default value. This is not possible if the table is not empty.
19
- - Added the required column `applicationId` to the `payment_method_change_requests` table without a default value. This is not possible if the table is not empty.
20
- - Added the required column `sourceApplicationId` to the `property_transfer_requests` table without a default value. This is not possible if the table is not empty.
21
-
22
- */
23
- -- DropForeignKey
24
- ALTER TABLE `contract_documents` DROP FOREIGN KEY `contract_documents_contractId_fkey`;
25
-
26
- -- DropForeignKey
27
- ALTER TABLE `contract_documents` DROP FOREIGN KEY `contract_documents_uploadedById_fkey`;
1
+ -- Safe Migration: Rename Contract to Application
2
+ -- This migration uses RENAME TABLE and RENAME COLUMN to preserve data
28
3
 
29
- -- DropForeignKey
30
- ALTER TABLE `contract_events` DROP FOREIGN KEY `contract_events_contractId_fkey`;
4
+ -- Step 1: Update enum values in approval_requests
5
+ ALTER TABLE `approval_requests` MODIFY `type` ENUM('PROPERTY_TRANSFER', 'PROPERTY_UPDATE', 'USER_WORKFLOW', 'CREDIT_CHECK', 'CONTRACT_TERMINATION', 'APPLICATION_TERMINATION', 'REFUND_APPROVAL') NOT NULL;
6
+ UPDATE `approval_requests` SET `type` = 'APPLICATION_TERMINATION' WHERE `type` = 'CONTRACT_TERMINATION';
7
+ ALTER TABLE `approval_requests` MODIFY `type` ENUM('PROPERTY_TRANSFER', 'PROPERTY_UPDATE', 'USER_WORKFLOW', 'CREDIT_CHECK', 'APPLICATION_TERMINATION', 'REFUND_APPROVAL') NOT NULL;
31
8
 
32
- -- DropForeignKey
33
- ALTER TABLE `contract_installments` DROP FOREIGN KEY `contract_installments_paymentPhaseId_fkey`;
9
+ -- Step 2: Update enum values in document_requirement_rules
10
+ ALTER TABLE `document_requirement_rules` MODIFY `context` ENUM('CONTRACT_PHASE', 'APPLICATION_PHASE', 'PAYMENT_METHOD_CHANGE') NOT NULL;
11
+ UPDATE `document_requirement_rules` SET `context` = 'APPLICATION_PHASE' WHERE `context` = 'CONTRACT_PHASE';
12
+ ALTER TABLE `document_requirement_rules` MODIFY `context` ENUM('APPLICATION_PHASE', 'PAYMENT_METHOD_CHANGE') NOT NULL;
34
13
 
35
- -- DropForeignKey
36
- ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_contractId_fkey`;
14
+ -- Step 3: Drop existing foreign keys that reference contract tables
15
+ -- contracts table foreign keys
16
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_tenantId_fkey`;
17
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_propertyUnitId_fkey`;
18
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_buyerId_fkey`;
19
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_sellerId_fkey`;
20
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_paymentMethodId_fkey`;
21
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_currentPhaseId_fkey`;
22
+ ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_transferredFromId_fkey`;
37
23
 
38
- -- DropForeignKey
39
- ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_installmentId_fkey`;
24
+ -- contract_phases foreign keys
25
+ ALTER TABLE `contract_phases` DROP FOREIGN KEY `contract_phases_contractId_fkey`;
40
26
 
41
- -- DropForeignKey
42
- ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_payerId_fkey`;
27
+ -- contract_events foreign keys
28
+ ALTER TABLE `contract_events` DROP FOREIGN KEY `contract_events_contractId_fkey`;
43
29
 
44
- -- DropForeignKey
30
+ -- contract_payments foreign keys
31
+ ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_contractId_fkey`;
45
32
  ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_phaseId_fkey`;
33
+ ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_installmentId_fkey`;
34
+ ALTER TABLE `contract_payments` DROP FOREIGN KEY `contract_payments_payerId_fkey`;
46
35
 
47
- -- DropForeignKey
48
- ALTER TABLE `contract_phases` DROP FOREIGN KEY `contract_phases_contractId_fkey`;
49
-
50
- -- DropForeignKey
51
- ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_approvedById_fkey`;
36
+ -- contract_documents foreign keys
37
+ ALTER TABLE `contract_documents` DROP FOREIGN KEY `contract_documents_contractId_fkey`;
38
+ ALTER TABLE `contract_documents` DROP FOREIGN KEY `contract_documents_uploadedById_fkey`;
52
39
 
53
- -- DropForeignKey
40
+ -- contract_refunds foreign keys
41
+ ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_tenantId_fkey`;
54
42
  ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_contractId_fkey`;
55
-
56
- -- DropForeignKey
57
- ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_processedById_fkey`;
58
-
59
- -- DropForeignKey
60
43
  ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_requestedById_fkey`;
44
+ ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_approvedById_fkey`;
45
+ ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_processedById_fkey`;
61
46
 
62
- -- DropForeignKey
63
- ALTER TABLE `contract_refunds` DROP FOREIGN KEY `contract_refunds_tenantId_fkey`;
64
-
65
- -- DropForeignKey
47
+ -- contract_terminations foreign keys
66
48
  ALTER TABLE `contract_terminations` DROP FOREIGN KEY `contract_terminations_contractId_fkey`;
67
-
68
- -- DropForeignKey
49
+ ALTER TABLE `contract_terminations` DROP FOREIGN KEY `contract_terminations_tenantId_fkey`;
69
50
  ALTER TABLE `contract_terminations` DROP FOREIGN KEY `contract_terminations_initiatorId_fkey`;
70
-
71
- -- DropForeignKey
72
51
  ALTER TABLE `contract_terminations` DROP FOREIGN KEY `contract_terminations_reviewedBy_fkey`;
73
52
 
74
- -- DropForeignKey
75
- ALTER TABLE `contract_terminations` DROP FOREIGN KEY `contract_terminations_tenantId_fkey`;
76
-
77
- -- DropForeignKey
78
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_buyerId_fkey`;
79
-
80
- -- DropForeignKey
81
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_currentPhaseId_fkey`;
82
-
83
- -- DropForeignKey
84
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_paymentMethodId_fkey`;
85
-
86
- -- DropForeignKey
87
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_propertyUnitId_fkey`;
88
-
89
- -- DropForeignKey
90
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_sellerId_fkey`;
91
-
92
- -- DropForeignKey
93
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_tenantId_fkey`;
94
-
95
- -- DropForeignKey
96
- ALTER TABLE `contracts` DROP FOREIGN KEY `contracts_transferredFromId_fkey`;
97
-
98
- -- DropForeignKey
99
- ALTER TABLE `documentation_phases` DROP FOREIGN KEY `documentation_phases_phaseId_fkey`;
53
+ -- contract_installments foreign keys
54
+ ALTER TABLE `contract_installments` DROP FOREIGN KEY `contract_installments_paymentPhaseId_fkey`;
100
55
 
101
- -- DropForeignKey
56
+ -- other tables referencing contracts
102
57
  ALTER TABLE `offer_letters` DROP FOREIGN KEY `offer_letters_contractId_fkey`;
103
-
104
- -- DropForeignKey
105
58
  ALTER TABLE `payment_method_change_requests` DROP FOREIGN KEY `payment_method_change_requests_contractId_fkey`;
106
-
107
- -- DropForeignKey
108
- ALTER TABLE `payment_phases` DROP FOREIGN KEY `payment_phases_phaseId_fkey`;
109
-
110
- -- DropForeignKey
111
59
  ALTER TABLE `property_transfer_requests` DROP FOREIGN KEY `property_transfer_requests_sourceContractId_fkey`;
112
-
113
- -- DropForeignKey
114
60
  ALTER TABLE `property_transfer_requests` DROP FOREIGN KEY `property_transfer_requests_targetContractId_fkey`;
115
61
 
116
- -- DropForeignKey
62
+ -- questionnaire_phases, documentation_phases, payment_phases reference contract_phases
117
63
  ALTER TABLE `questionnaire_phases` DROP FOREIGN KEY `questionnaire_phases_phaseId_fkey`;
64
+ ALTER TABLE `documentation_phases` DROP FOREIGN KEY `documentation_phases_phaseId_fkey`;
65
+ ALTER TABLE `payment_phases` DROP FOREIGN KEY `payment_phases_phaseId_fkey`;
118
66
 
119
- -- DropIndex
120
- DROP INDEX `offer_letters_contractId_idx` ON `offer_letters`;
67
+ -- Step 4: Rename tables
68
+ RENAME TABLE `contracts` TO `applications`;
69
+ RENAME TABLE `contract_phases` TO `application_phases`;
70
+ RENAME TABLE `contract_events` TO `application_events`;
71
+ RENAME TABLE `contract_payments` TO `application_payments`;
72
+ RENAME TABLE `contract_documents` TO `application_documents`;
73
+ RENAME TABLE `contract_refunds` TO `application_refunds`;
74
+ RENAME TABLE `contract_terminations` TO `application_terminations`;
75
+ RENAME TABLE `contract_installments` TO `payment_installments`;
76
+
77
+ -- Step 5: Rename columns in applications table
78
+ ALTER TABLE `applications` CHANGE `contractNumber` `applicationNumber` VARCHAR(191) NOT NULL;
79
+ ALTER TABLE `applications` CHANGE `contractType` `applicationType` VARCHAR(191) NOT NULL;
80
+
81
+ -- Step 6: Rename columns in related tables (contractId -> applicationId)
82
+ ALTER TABLE `application_phases` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
83
+ ALTER TABLE `application_events` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
84
+ ALTER TABLE `application_payments` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
85
+ ALTER TABLE `application_documents` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
86
+ ALTER TABLE `application_refunds` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
87
+ ALTER TABLE `application_terminations` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
88
+
89
+ -- Rename columns in other tables that reference contracts
90
+ ALTER TABLE `offer_letters` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
91
+ ALTER TABLE `payment_method_change_requests` CHANGE `contractId` `applicationId` VARCHAR(191) NOT NULL;
92
+ ALTER TABLE `property_transfer_requests` CHANGE `sourceContractId` `sourceApplicationId` VARCHAR(191) NOT NULL;
93
+ ALTER TABLE `property_transfer_requests` CHANGE `targetContractId` `targetApplicationId` VARCHAR(191) NULL;
94
+
95
+ -- Step 7: Update enum for application_events.eventType
96
+ -- First add new values, then update, then remove old values
97
+ ALTER TABLE `application_events` MODIFY `eventType` ENUM(
98
+ 'CONTRACT_CREATED', 'CONTRACT_STATE_CHANGED',
99
+ 'APPLICATION_CREATED', 'APPLICATION_STATE_CHANGED',
100
+ 'PHASE_ACTIVATED', 'PHASE_COMPLETED', 'STEP_COMPLETED', 'STEP_REJECTED',
101
+ 'DOCUMENT_SUBMITTED', 'DOCUMENT_APPROVED', 'DOCUMENT_REJECTED',
102
+ 'PAYMENT_INITIATED', 'PAYMENT_COMPLETED', 'PAYMENT_FAILED', 'INSTALLMENTS_GENERATED',
103
+ 'CONTRACT_SIGNED', 'CONTRACT_TERMINATED', 'CONTRACT_TRANSFERRED',
104
+ 'APPLICATION_SIGNED', 'APPLICATION_TERMINATED', 'APPLICATION_TRANSFERRED',
105
+ 'UNDERWRITING_COMPLETED', 'OFFER_LETTER_GENERATED'
106
+ ) NOT NULL;
107
+
108
+ UPDATE `application_events` SET `eventType` = 'APPLICATION_CREATED' WHERE `eventType` = 'CONTRACT_CREATED';
109
+ UPDATE `application_events` SET `eventType` = 'APPLICATION_STATE_CHANGED' WHERE `eventType` = 'CONTRACT_STATE_CHANGED';
110
+ UPDATE `application_events` SET `eventType` = 'APPLICATION_SIGNED' WHERE `eventType` = 'CONTRACT_SIGNED';
111
+ UPDATE `application_events` SET `eventType` = 'APPLICATION_TERMINATED' WHERE `eventType` = 'CONTRACT_TERMINATED';
112
+ UPDATE `application_events` SET `eventType` = 'APPLICATION_TRANSFERRED' WHERE `eventType` = 'CONTRACT_TRANSFERRED';
113
+
114
+ ALTER TABLE `application_events` MODIFY `eventType` ENUM(
115
+ 'APPLICATION_CREATED', 'APPLICATION_STATE_CHANGED',
116
+ 'PHASE_ACTIVATED', 'PHASE_COMPLETED', 'STEP_COMPLETED', 'STEP_REJECTED',
117
+ 'DOCUMENT_SUBMITTED', 'DOCUMENT_APPROVED', 'DOCUMENT_REJECTED',
118
+ 'PAYMENT_INITIATED', 'PAYMENT_COMPLETED', 'PAYMENT_FAILED', 'INSTALLMENTS_GENERATED',
119
+ 'APPLICATION_SIGNED', 'APPLICATION_TERMINATED', 'APPLICATION_TRANSFERRED',
120
+ 'UNDERWRITING_COMPLETED', 'OFFER_LETTER_GENERATED'
121
+ ) NOT NULL;
122
+
123
+ -- Step 8: Drop old indexes
124
+ DROP INDEX `contracts_contractNumber_key` ON `applications`;
125
+ DROP INDEX `contracts_transferredFromId_key` ON `applications`;
126
+ DROP INDEX `contracts_tenantId_idx` ON `applications`;
127
+ DROP INDEX `contracts_propertyUnitId_idx` ON `applications`;
128
+ DROP INDEX `contracts_buyerId_idx` ON `applications`;
129
+ DROP INDEX `contracts_sellerId_idx` ON `applications`;
130
+ DROP INDEX `contracts_paymentMethodId_idx` ON `applications`;
131
+ DROP INDEX `contracts_status_idx` ON `applications`;
132
+ DROP INDEX `contracts_currentPhaseId_idx` ON `applications`;
133
+
134
+ DROP INDEX `contract_phases_contractId_idx` ON `application_phases`;
135
+ DROP INDEX `contract_phases_phaseCategory_idx` ON `application_phases`;
136
+ DROP INDEX `contract_phases_status_idx` ON `application_phases`;
137
+ DROP INDEX `contract_phases_order_idx` ON `application_phases`;
138
+
139
+ DROP INDEX `contract_events_contractId_idx` ON `application_events`;
140
+ DROP INDEX `contract_events_eventType_idx` ON `application_events`;
141
+ DROP INDEX `contract_events_eventGroup_idx` ON `application_events`;
142
+ DROP INDEX `contract_events_occurredAt_idx` ON `application_events`;
143
+
144
+ DROP INDEX `contract_payments_contractId_idx` ON `application_payments`;
145
+ DROP INDEX `contract_payments_phaseId_idx` ON `application_payments`;
146
+ DROP INDEX `contract_payments_installmentId_idx` ON `application_payments`;
147
+ DROP INDEX `contract_payments_payerId_idx` ON `application_payments`;
148
+ DROP INDEX `contract_payments_status_idx` ON `application_payments`;
149
+ DROP INDEX `contract_payments_reference_key` ON `application_payments`;
150
+ DROP INDEX `contract_payments_reference_idx` ON `application_payments`;
151
+
152
+ DROP INDEX `contract_documents_contractId_idx` ON `application_documents`;
153
+ DROP INDEX `contract_documents_phaseId_idx` ON `application_documents`;
154
+ DROP INDEX `contract_documents_stepId_idx` ON `application_documents`;
155
+ DROP INDEX `contract_documents_type_idx` ON `application_documents`;
156
+ DROP INDEX `contract_documents_status_idx` ON `application_documents`;
157
+
158
+ DROP INDEX `contract_refunds_contractId_idx` ON `application_refunds`;
159
+ DROP INDEX `contract_refunds_status_idx` ON `application_refunds`;
160
+ DROP INDEX `contract_refunds_tenantId_idx` ON `application_refunds`;
161
+ DROP INDEX `contract_refunds_requestedById_idx` ON `application_refunds`;
162
+
163
+ DROP INDEX `contract_terminations_contractId_idx` ON `application_terminations`;
164
+ DROP INDEX `contract_terminations_tenantId_idx` ON `application_terminations`;
165
+ DROP INDEX `contract_terminations_status_idx` ON `application_terminations`;
166
+ DROP INDEX `contract_terminations_type_idx` ON `application_terminations`;
167
+ DROP INDEX `contract_terminations_initiatorId_idx` ON `application_terminations`;
168
+ DROP INDEX `contract_terminations_requestedAt_idx` ON `application_terminations`;
169
+ DROP INDEX `contract_terminations_requestNumber_key` ON `application_terminations`;
170
+ DROP INDEX `contract_terminations_idempotencyKey_key` ON `application_terminations`;
171
+
172
+ DROP INDEX `contract_installments_paymentPhaseId_idx` ON `payment_installments`;
173
+ DROP INDEX `contract_installments_dueDate_idx` ON `payment_installments`;
174
+ DROP INDEX `contract_installments_status_idx` ON `payment_installments`;
121
175
 
122
- -- DropIndex
176
+ DROP INDEX `offer_letters_contractId_idx` ON `offer_letters`;
123
177
  DROP INDEX `payment_method_change_requests_contractId_idx` ON `payment_method_change_requests`;
124
-
125
- -- DropIndex
126
178
  DROP INDEX `property_transfer_requests_sourceContractId_idx` ON `property_transfer_requests`;
127
-
128
- -- DropIndex
129
179
  DROP INDEX `property_transfer_requests_targetContractId_fkey` ON `property_transfer_requests`;
130
180
 
131
- -- AlterTable
132
- ALTER TABLE `approval_requests` MODIFY `type` ENUM('PROPERTY_TRANSFER', 'PROPERTY_UPDATE', 'USER_WORKFLOW', 'CREDIT_CHECK', 'APPLICATION_TERMINATION', 'REFUND_APPROVAL') NOT NULL;
133
-
134
- -- AlterTable
135
- ALTER TABLE `document_requirement_rules` MODIFY `context` ENUM('APPLICATION_PHASE', 'PAYMENT_METHOD_CHANGE') NOT NULL;
181
+ -- Step 9: Create new indexes with new names
182
+ CREATE UNIQUE INDEX `applications_applicationNumber_key` ON `applications`(`applicationNumber`);
183
+ CREATE UNIQUE INDEX `applications_transferredFromId_key` ON `applications`(`transferredFromId`);
184
+ CREATE INDEX `applications_tenantId_idx` ON `applications`(`tenantId`);
185
+ CREATE INDEX `applications_propertyUnitId_idx` ON `applications`(`propertyUnitId`);
186
+ CREATE INDEX `applications_buyerId_idx` ON `applications`(`buyerId`);
187
+ CREATE INDEX `applications_sellerId_idx` ON `applications`(`sellerId`);
188
+ CREATE INDEX `applications_paymentMethodId_idx` ON `applications`(`paymentMethodId`);
189
+ CREATE INDEX `applications_status_idx` ON `applications`(`status`);
190
+ CREATE INDEX `applications_currentPhaseId_idx` ON `applications`(`currentPhaseId`);
191
+
192
+ CREATE INDEX `application_phases_applicationId_idx` ON `application_phases`(`applicationId`);
193
+ CREATE INDEX `application_phases_phaseCategory_idx` ON `application_phases`(`phaseCategory`);
194
+ CREATE INDEX `application_phases_status_idx` ON `application_phases`(`status`);
195
+ CREATE INDEX `application_phases_order_idx` ON `application_phases`(`order`);
196
+
197
+ CREATE INDEX `application_events_applicationId_idx` ON `application_events`(`applicationId`);
198
+ CREATE INDEX `application_events_eventType_idx` ON `application_events`(`eventType`);
199
+ CREATE INDEX `application_events_eventGroup_idx` ON `application_events`(`eventGroup`);
200
+ CREATE INDEX `application_events_occurredAt_idx` ON `application_events`(`occurredAt`);
201
+
202
+ CREATE INDEX `application_payments_applicationId_idx` ON `application_payments`(`applicationId`);
203
+ CREATE INDEX `application_payments_phaseId_idx` ON `application_payments`(`phaseId`);
204
+ CREATE INDEX `application_payments_installmentId_idx` ON `application_payments`(`installmentId`);
205
+ CREATE INDEX `application_payments_payerId_idx` ON `application_payments`(`payerId`);
206
+ CREATE INDEX `application_payments_status_idx` ON `application_payments`(`status`);
207
+ CREATE UNIQUE INDEX `application_payments_reference_key` ON `application_payments`(`reference`);
208
+ CREATE INDEX `application_payments_reference_idx` ON `application_payments`(`reference`);
209
+
210
+ CREATE INDEX `application_documents_applicationId_idx` ON `application_documents`(`applicationId`);
211
+ CREATE INDEX `application_documents_phaseId_idx` ON `application_documents`(`phaseId`);
212
+ CREATE INDEX `application_documents_stepId_idx` ON `application_documents`(`stepId`);
213
+ CREATE INDEX `application_documents_type_idx` ON `application_documents`(`type`);
214
+ CREATE INDEX `application_documents_status_idx` ON `application_documents`(`status`);
215
+
216
+ CREATE INDEX `application_refunds_applicationId_idx` ON `application_refunds`(`applicationId`);
217
+ CREATE INDEX `application_refunds_status_idx` ON `application_refunds`(`status`);
218
+ CREATE INDEX `application_refunds_tenantId_idx` ON `application_refunds`(`tenantId`);
219
+ CREATE INDEX `application_refunds_requestedById_idx` ON `application_refunds`(`requestedById`);
220
+
221
+ CREATE INDEX `application_terminations_applicationId_idx` ON `application_terminations`(`applicationId`);
222
+ CREATE INDEX `application_terminations_tenantId_idx` ON `application_terminations`(`tenantId`);
223
+ CREATE INDEX `application_terminations_status_idx` ON `application_terminations`(`status`);
224
+ CREATE INDEX `application_terminations_type_idx` ON `application_terminations`(`type`);
225
+ CREATE INDEX `application_terminations_initiatorId_idx` ON `application_terminations`(`initiatorId`);
226
+ CREATE INDEX `application_terminations_requestedAt_idx` ON `application_terminations`(`requestedAt`);
227
+ CREATE UNIQUE INDEX `application_terminations_requestNumber_key` ON `application_terminations`(`requestNumber`);
228
+ CREATE UNIQUE INDEX `application_terminations_idempotencyKey_key` ON `application_terminations`(`idempotencyKey`);
229
+
230
+ CREATE INDEX `payment_installments_paymentPhaseId_idx` ON `payment_installments`(`paymentPhaseId`);
231
+ CREATE INDEX `payment_installments_dueDate_idx` ON `payment_installments`(`dueDate`);
232
+ CREATE INDEX `payment_installments_status_idx` ON `payment_installments`(`status`);
136
233
 
137
- -- AlterTable
138
- ALTER TABLE `offer_letters` DROP COLUMN `contractId`,
139
- ADD COLUMN `applicationId` VARCHAR(191) NOT NULL;
140
-
141
- -- AlterTable
142
- ALTER TABLE `payment_method_change_requests` DROP COLUMN `contractId`,
143
- ADD COLUMN `applicationId` VARCHAR(191) NOT NULL;
144
-
145
- -- AlterTable
146
- ALTER TABLE `property_transfer_requests` DROP COLUMN `sourceContractId`,
147
- DROP COLUMN `targetContractId`,
148
- ADD COLUMN `sourceApplicationId` VARCHAR(191) NOT NULL,
149
- ADD COLUMN `targetApplicationId` VARCHAR(191) NULL;
150
-
151
- -- DropTable
152
- DROP TABLE `contract_documents`;
153
-
154
- -- DropTable
155
- DROP TABLE `contract_events`;
156
-
157
- -- DropTable
158
- DROP TABLE `contract_installments`;
159
-
160
- -- DropTable
161
- DROP TABLE `contract_payments`;
162
-
163
- -- DropTable
164
- DROP TABLE `contract_phases`;
165
-
166
- -- DropTable
167
- DROP TABLE `contract_refunds`;
168
-
169
- -- DropTable
170
- DROP TABLE `contract_terminations`;
171
-
172
- -- DropTable
173
- DROP TABLE `contracts`;
174
-
175
- -- CreateTable
176
- CREATE TABLE `applications` (
177
- `id` VARCHAR(191) NOT NULL,
178
- `tenantId` VARCHAR(191) NOT NULL,
179
- `propertyUnitId` VARCHAR(191) NOT NULL,
180
- `buyerId` VARCHAR(191) NOT NULL,
181
- `sellerId` VARCHAR(191) NULL,
182
- `paymentMethodId` VARCHAR(191) NULL,
183
- `applicationNumber` VARCHAR(191) NOT NULL,
184
- `title` VARCHAR(191) NOT NULL,
185
- `description` TEXT NULL,
186
- `applicationType` VARCHAR(191) NOT NULL,
187
- `totalAmount` DOUBLE NOT NULL,
188
- `status` ENUM('DRAFT', 'PENDING', 'ACTIVE', 'COMPLETED', 'CANCELLED', 'TERMINATED', 'TRANSFERRED') NOT NULL DEFAULT 'DRAFT',
189
- `currentPhaseId` VARCHAR(191) NULL,
190
- `nextPaymentDueDate` DATETIME(3) NULL,
191
- `lastReminderSentAt` DATETIME(3) NULL,
192
- `startDate` DATETIME(3) NULL,
193
- `endDate` DATETIME(3) NULL,
194
- `signedAt` DATETIME(3) NULL,
195
- `terminatedAt` DATETIME(3) NULL,
196
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
197
- `updatedAt` DATETIME(3) NOT NULL,
198
- `transferredFromId` VARCHAR(191) NULL,
199
-
200
- UNIQUE INDEX `applications_applicationNumber_key`(`applicationNumber`),
201
- UNIQUE INDEX `applications_transferredFromId_key`(`transferredFromId`),
202
- INDEX `applications_tenantId_idx`(`tenantId`),
203
- INDEX `applications_propertyUnitId_idx`(`propertyUnitId`),
204
- INDEX `applications_buyerId_idx`(`buyerId`),
205
- INDEX `applications_sellerId_idx`(`sellerId`),
206
- INDEX `applications_paymentMethodId_idx`(`paymentMethodId`),
207
- INDEX `applications_status_idx`(`status`),
208
- INDEX `applications_currentPhaseId_idx`(`currentPhaseId`),
209
- PRIMARY KEY (`id`)
210
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
211
-
212
- -- CreateTable
213
- CREATE TABLE `application_refunds` (
214
- `id` VARCHAR(191) NOT NULL,
215
- `tenantId` VARCHAR(191) NOT NULL,
216
- `applicationId` VARCHAR(191) NOT NULL,
217
- `amount` DOUBLE NOT NULL,
218
- `reason` TEXT NOT NULL,
219
- `status` ENUM('PENDING', 'APPROVED', 'REJECTED', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
220
- `requestedById` VARCHAR(191) NOT NULL,
221
- `approvedById` VARCHAR(191) NULL,
222
- `processedById` VARCHAR(191) NULL,
223
- `paymentMethod` VARCHAR(191) NULL,
224
- `referenceNumber` VARCHAR(191) NULL,
225
- `recipientName` VARCHAR(191) NULL,
226
- `recipientAccount` VARCHAR(191) NULL,
227
- `recipientBank` VARCHAR(191) NULL,
228
- `requestedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
229
- `approvedAt` DATETIME(3) NULL,
230
- `rejectedAt` DATETIME(3) NULL,
231
- `processedAt` DATETIME(3) NULL,
232
- `approvalNotes` TEXT NULL,
233
- `rejectionNotes` TEXT NULL,
234
- `processingNotes` TEXT NULL,
235
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
236
- `updatedAt` DATETIME(3) NOT NULL,
237
-
238
- INDEX `application_refunds_applicationId_idx`(`applicationId`),
239
- INDEX `application_refunds_status_idx`(`status`),
240
- INDEX `application_refunds_tenantId_idx`(`tenantId`),
241
- INDEX `application_refunds_requestedById_idx`(`requestedById`),
242
- PRIMARY KEY (`id`)
243
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
244
-
245
- -- CreateTable
246
- CREATE TABLE `application_phases` (
247
- `id` VARCHAR(191) NOT NULL,
248
- `applicationId` VARCHAR(191) NOT NULL,
249
- `name` VARCHAR(191) NOT NULL,
250
- `description` TEXT NULL,
251
- `phaseCategory` ENUM('QUESTIONNAIRE', 'DOCUMENTATION', 'PAYMENT') NOT NULL,
252
- `phaseType` ENUM('PRE_APPROVAL', 'UNDERWRITING', 'KYC', 'VERIFICATION', 'DOWNPAYMENT', 'MORTGAGE', 'BALLOON', 'CUSTOM') NOT NULL,
253
- `order` INTEGER NOT NULL,
254
- `status` ENUM('PENDING', 'IN_PROGRESS', 'AWAITING_APPROVAL', 'ACTIVE', 'COMPLETED', 'SKIPPED', 'FAILED', 'SUPERSEDED') NOT NULL DEFAULT 'PENDING',
255
- `dueDate` DATETIME(3) NULL,
256
- `startDate` DATETIME(3) NULL,
257
- `endDate` DATETIME(3) NULL,
258
- `activatedAt` DATETIME(3) NULL,
259
- `completedAt` DATETIME(3) NULL,
260
- `requiresPreviousPhaseCompletion` BOOLEAN NOT NULL DEFAULT true,
261
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
262
- `updatedAt` DATETIME(3) NOT NULL,
263
-
264
- INDEX `application_phases_applicationId_idx`(`applicationId`),
265
- INDEX `application_phases_phaseCategory_idx`(`phaseCategory`),
266
- INDEX `application_phases_status_idx`(`status`),
267
- INDEX `application_phases_order_idx`(`order`),
268
- PRIMARY KEY (`id`)
269
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
270
-
271
- -- CreateTable
272
- CREATE TABLE `application_events` (
273
- `id` VARCHAR(191) NOT NULL,
274
- `applicationId` VARCHAR(191) NOT NULL,
275
- `eventType` ENUM('APPLICATION_CREATED', 'APPLICATION_STATE_CHANGED', 'PHASE_ACTIVATED', 'PHASE_COMPLETED', 'STEP_COMPLETED', 'STEP_REJECTED', 'DOCUMENT_SUBMITTED', 'DOCUMENT_APPROVED', 'DOCUMENT_REJECTED', 'PAYMENT_INITIATED', 'PAYMENT_COMPLETED', 'PAYMENT_FAILED', 'INSTALLMENTS_GENERATED', 'APPLICATION_SIGNED', 'APPLICATION_TERMINATED', 'APPLICATION_TRANSFERRED', 'UNDERWRITING_COMPLETED', 'OFFER_LETTER_GENERATED') NOT NULL,
276
- `eventGroup` ENUM('STATE_CHANGE', 'PAYMENT', 'DOCUMENT', 'NOTIFICATION', 'WORKFLOW') NULL,
277
- `fromState` VARCHAR(191) NULL,
278
- `toState` VARCHAR(191) NULL,
279
- `trigger` VARCHAR(191) NULL,
280
- `data` JSON NULL,
281
- `actorId` VARCHAR(191) NULL,
282
- `actorType` ENUM('USER', 'SYSTEM', 'WEBHOOK', 'ADMIN') NULL,
283
- `occurredAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
284
-
285
- INDEX `application_events_applicationId_idx`(`applicationId`),
286
- INDEX `application_events_eventType_idx`(`eventType`),
287
- INDEX `application_events_eventGroup_idx`(`eventGroup`),
288
- INDEX `application_events_occurredAt_idx`(`occurredAt`),
289
- PRIMARY KEY (`id`)
290
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
291
-
292
- -- CreateTable
293
- CREATE TABLE `payment_installments` (
294
- `id` VARCHAR(191) NOT NULL,
295
- `paymentPhaseId` VARCHAR(191) NOT NULL,
296
- `installmentNumber` INTEGER NOT NULL,
297
- `amount` DOUBLE NOT NULL,
298
- `principalAmount` DOUBLE NOT NULL DEFAULT 0,
299
- `interestAmount` DOUBLE NOT NULL DEFAULT 0,
300
- `dueDate` DATETIME(3) NOT NULL,
301
- `status` ENUM('PENDING', 'PAID', 'OVERDUE', 'PARTIALLY_PAID', 'WAIVED') NOT NULL DEFAULT 'PENDING',
302
- `paidAmount` DOUBLE NOT NULL DEFAULT 0,
303
- `paidDate` DATETIME(3) NULL,
304
- `lateFee` DOUBLE NOT NULL DEFAULT 0,
305
- `lateFeeWaived` BOOLEAN NOT NULL DEFAULT false,
306
- `gracePeriodDays` INTEGER NOT NULL DEFAULT 0,
307
- `gracePeriodEndDate` DATETIME(3) NULL,
308
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
309
- `updatedAt` DATETIME(3) NOT NULL,
310
-
311
- INDEX `payment_installments_paymentPhaseId_idx`(`paymentPhaseId`),
312
- INDEX `payment_installments_dueDate_idx`(`dueDate`),
313
- INDEX `payment_installments_status_idx`(`status`),
314
- PRIMARY KEY (`id`)
315
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
316
-
317
- -- CreateTable
318
- CREATE TABLE `application_payments` (
319
- `id` VARCHAR(191) NOT NULL,
320
- `applicationId` VARCHAR(191) NOT NULL,
321
- `phaseId` VARCHAR(191) NULL,
322
- `installmentId` VARCHAR(191) NULL,
323
- `payerId` VARCHAR(191) NULL,
324
- `amount` DOUBLE NOT NULL,
325
- `principalAmount` DOUBLE NOT NULL DEFAULT 0,
326
- `interestAmount` DOUBLE NOT NULL DEFAULT 0,
327
- `lateFeeAmount` DOUBLE NOT NULL DEFAULT 0,
328
- `paymentMethod` VARCHAR(191) NOT NULL,
329
- `status` ENUM('INITIATED', 'PENDING', 'COMPLETED', 'FAILED', 'REFUNDED') NOT NULL DEFAULT 'INITIATED',
330
- `reference` VARCHAR(191) NULL,
331
- `gatewayResponse` TEXT NULL,
332
- `processedAt` DATETIME(3) NULL,
333
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
334
- `updatedAt` DATETIME(3) NOT NULL,
335
-
336
- UNIQUE INDEX `application_payments_reference_key`(`reference`),
337
- INDEX `application_payments_applicationId_idx`(`applicationId`),
338
- INDEX `application_payments_phaseId_idx`(`phaseId`),
339
- INDEX `application_payments_installmentId_idx`(`installmentId`),
340
- INDEX `application_payments_payerId_idx`(`payerId`),
341
- INDEX `application_payments_status_idx`(`status`),
342
- INDEX `application_payments_reference_idx`(`reference`),
343
- PRIMARY KEY (`id`)
344
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
345
-
346
- -- CreateTable
347
- CREATE TABLE `application_documents` (
348
- `id` VARCHAR(191) NOT NULL,
349
- `applicationId` VARCHAR(191) NOT NULL,
350
- `phaseId` VARCHAR(191) NULL,
351
- `stepId` VARCHAR(191) NULL,
352
- `name` VARCHAR(191) NOT NULL,
353
- `url` VARCHAR(191) NOT NULL,
354
- `type` VARCHAR(191) NOT NULL,
355
- `uploadedById` VARCHAR(191) NULL,
356
- `status` ENUM('DRAFT', 'PENDING', 'PENDING_SIGNATURE', 'SENT', 'VIEWED', 'SIGNED', 'APPROVED', 'REJECTED', 'EXPIRED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
357
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
358
- `updatedAt` DATETIME(3) NOT NULL,
359
-
360
- INDEX `application_documents_applicationId_idx`(`applicationId`),
361
- INDEX `application_documents_phaseId_idx`(`phaseId`),
362
- INDEX `application_documents_stepId_idx`(`stepId`),
363
- INDEX `application_documents_type_idx`(`type`),
364
- INDEX `application_documents_status_idx`(`status`),
365
- PRIMARY KEY (`id`)
366
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
367
-
368
- -- CreateTable
369
- CREATE TABLE `application_terminations` (
370
- `id` VARCHAR(191) NOT NULL,
371
- `applicationId` VARCHAR(191) NOT NULL,
372
- `tenantId` VARCHAR(191) NOT NULL,
373
- `requestNumber` VARCHAR(191) NOT NULL,
374
- `initiatedBy` ENUM('BUYER', 'SELLER', 'ADMIN', 'SYSTEM') NOT NULL,
375
- `initiatorId` VARCHAR(191) NULL,
376
- `type` ENUM('BUYER_WITHDRAWAL', 'SELLER_WITHDRAWAL', 'MUTUAL_AGREEMENT', 'PAYMENT_DEFAULT', 'DOCUMENT_FAILURE', 'FRAUD', 'FORCE_MAJEURE', 'PROPERTY_UNAVAILABLE', 'REGULATORY', 'OTHER') NOT NULL,
377
- `reason` TEXT NULL,
378
- `supportingDocs` JSON NULL,
379
- `status` ENUM('REQUESTED', 'PENDING_REVIEW', 'PENDING_REFUND', 'REFUND_IN_PROGRESS', 'REFUND_COMPLETED', 'COMPLETED', 'REJECTED', 'CANCELLED') NOT NULL DEFAULT 'REQUESTED',
380
- `requiresApproval` BOOLEAN NOT NULL DEFAULT true,
381
- `autoApproveEligible` BOOLEAN NOT NULL DEFAULT false,
382
- `reviewedBy` VARCHAR(191) NULL,
383
- `reviewedAt` DATETIME(3) NULL,
384
- `reviewNotes` TEXT NULL,
385
- `rejectionReason` TEXT NULL,
386
- `applicationSnapshot` JSON NOT NULL,
387
- `totalApplicationAmount` DOUBLE NOT NULL,
388
- `totalPaidToDate` DOUBLE NOT NULL,
389
- `outstandingBalance` DOUBLE NOT NULL,
390
- `refundableAmount` DOUBLE NOT NULL DEFAULT 0,
391
- `penaltyAmount` DOUBLE NOT NULL DEFAULT 0,
392
- `forfeitedAmount` DOUBLE NOT NULL DEFAULT 0,
393
- `adminFeeAmount` DOUBLE NOT NULL DEFAULT 0,
394
- `netRefundAmount` DOUBLE NOT NULL DEFAULT 0,
395
- `settlementNotes` TEXT NULL,
396
- `refundStatus` ENUM('PENDING', 'APPROVED', 'REJECTED', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
397
- `refundReference` VARCHAR(191) NULL,
398
- `refundMethod` VARCHAR(191) NULL,
399
- `refundAccountDetails` JSON NULL,
400
- `refundInitiatedAt` DATETIME(3) NULL,
401
- `refundCompletedAt` DATETIME(3) NULL,
402
- `refundFailureReason` TEXT NULL,
403
- `unitReleasedAt` DATETIME(3) NULL,
404
- `unitReservedForId` VARCHAR(191) NULL,
405
- `requestedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
406
- `approvedAt` DATETIME(3) NULL,
407
- `executedAt` DATETIME(3) NULL,
408
- `completedAt` DATETIME(3) NULL,
409
- `cancelledAt` DATETIME(3) NULL,
410
- `idempotencyKey` VARCHAR(191) NULL,
411
- `metadata` JSON NULL,
412
- `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
413
- `updatedAt` DATETIME(3) NOT NULL,
414
-
415
- UNIQUE INDEX `application_terminations_requestNumber_key`(`requestNumber`),
416
- UNIQUE INDEX `application_terminations_idempotencyKey_key`(`idempotencyKey`),
417
- INDEX `application_terminations_applicationId_idx`(`applicationId`),
418
- INDEX `application_terminations_tenantId_idx`(`tenantId`),
419
- INDEX `application_terminations_status_idx`(`status`),
420
- INDEX `application_terminations_type_idx`(`type`),
421
- INDEX `application_terminations_initiatorId_idx`(`initiatorId`),
422
- INDEX `application_terminations_requestedAt_idx`(`requestedAt`),
423
- PRIMARY KEY (`id`)
424
- ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
425
-
426
- -- CreateIndex
427
234
  CREATE INDEX `offer_letters_applicationId_idx` ON `offer_letters`(`applicationId`);
428
-
429
- -- CreateIndex
430
235
  CREATE INDEX `payment_method_change_requests_applicationId_idx` ON `payment_method_change_requests`(`applicationId`);
431
-
432
- -- CreateIndex
433
236
  CREATE INDEX `property_transfer_requests_sourceApplicationId_idx` ON `property_transfer_requests`(`sourceApplicationId`);
434
237
 
435
- -- AddForeignKey
238
+ -- Step 10: Recreate foreign keys with new names
239
+ -- applications table
436
240
  ALTER TABLE `applications` ADD CONSTRAINT `applications_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
437
-
438
- -- AddForeignKey
439
241
  ALTER TABLE `applications` ADD CONSTRAINT `applications_propertyUnitId_fkey` FOREIGN KEY (`propertyUnitId`) REFERENCES `property_units`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
440
-
441
- -- AddForeignKey
442
242
  ALTER TABLE `applications` ADD CONSTRAINT `applications_buyerId_fkey` FOREIGN KEY (`buyerId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
443
-
444
- -- AddForeignKey
445
243
  ALTER TABLE `applications` ADD CONSTRAINT `applications_sellerId_fkey` FOREIGN KEY (`sellerId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
446
-
447
- -- AddForeignKey
448
244
  ALTER TABLE `applications` ADD CONSTRAINT `applications_paymentMethodId_fkey` FOREIGN KEY (`paymentMethodId`) REFERENCES `property_payment_methods`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
449
-
450
- -- AddForeignKey
451
245
  ALTER TABLE `applications` ADD CONSTRAINT `applications_currentPhaseId_fkey` FOREIGN KEY (`currentPhaseId`) REFERENCES `application_phases`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
452
-
453
- -- AddForeignKey
454
246
  ALTER TABLE `applications` ADD CONSTRAINT `applications_transferredFromId_fkey` FOREIGN KEY (`transferredFromId`) REFERENCES `applications`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
455
247
 
456
- -- AddForeignKey
457
- ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
458
-
459
- -- AddForeignKey
460
- ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
461
-
462
- -- AddForeignKey
463
- ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_requestedById_fkey` FOREIGN KEY (`requestedById`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
464
-
465
- -- AddForeignKey
466
- ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_approvedById_fkey` FOREIGN KEY (`approvedById`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
467
-
468
- -- AddForeignKey
469
- ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_processedById_fkey` FOREIGN KEY (`processedById`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
470
-
471
- -- AddForeignKey
248
+ -- application_phases
472
249
  ALTER TABLE `application_phases` ADD CONSTRAINT `application_phases_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
473
250
 
474
- -- AddForeignKey
251
+ -- questionnaire_phases, documentation_phases, payment_phases
475
252
  ALTER TABLE `questionnaire_phases` ADD CONSTRAINT `questionnaire_phases_phaseId_fkey` FOREIGN KEY (`phaseId`) REFERENCES `application_phases`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
476
-
477
- -- AddForeignKey
478
253
  ALTER TABLE `documentation_phases` ADD CONSTRAINT `documentation_phases_phaseId_fkey` FOREIGN KEY (`phaseId`) REFERENCES `application_phases`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
479
-
480
- -- AddForeignKey
481
254
  ALTER TABLE `payment_phases` ADD CONSTRAINT `payment_phases_phaseId_fkey` FOREIGN KEY (`phaseId`) REFERENCES `application_phases`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
482
255
 
483
- -- AddForeignKey
256
+ -- application_events
484
257
  ALTER TABLE `application_events` ADD CONSTRAINT `application_events_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
485
258
 
486
- -- AddForeignKey
259
+ -- payment_installments
487
260
  ALTER TABLE `payment_installments` ADD CONSTRAINT `payment_installments_paymentPhaseId_fkey` FOREIGN KEY (`paymentPhaseId`) REFERENCES `payment_phases`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
488
261
 
489
- -- AddForeignKey
262
+ -- application_payments
490
263
  ALTER TABLE `application_payments` ADD CONSTRAINT `application_payments_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
491
-
492
- -- AddForeignKey
493
264
  ALTER TABLE `application_payments` ADD CONSTRAINT `application_payments_phaseId_fkey` FOREIGN KEY (`phaseId`) REFERENCES `application_phases`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
494
-
495
- -- AddForeignKey
496
265
  ALTER TABLE `application_payments` ADD CONSTRAINT `application_payments_installmentId_fkey` FOREIGN KEY (`installmentId`) REFERENCES `payment_installments`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
497
-
498
- -- AddForeignKey
499
266
  ALTER TABLE `application_payments` ADD CONSTRAINT `application_payments_payerId_fkey` FOREIGN KEY (`payerId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
500
267
 
501
- -- AddForeignKey
268
+ -- application_documents
502
269
  ALTER TABLE `application_documents` ADD CONSTRAINT `application_documents_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
503
-
504
- -- AddForeignKey
505
270
  ALTER TABLE `application_documents` ADD CONSTRAINT `application_documents_uploadedById_fkey` FOREIGN KEY (`uploadedById`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
506
271
 
507
- -- AddForeignKey
508
- ALTER TABLE `offer_letters` ADD CONSTRAINT `offer_letters_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
272
+ -- application_refunds
273
+ ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
274
+ ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
275
+ ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_requestedById_fkey` FOREIGN KEY (`requestedById`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
276
+ ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_approvedById_fkey` FOREIGN KEY (`approvedById`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
277
+ ALTER TABLE `application_refunds` ADD CONSTRAINT `application_refunds_processedById_fkey` FOREIGN KEY (`processedById`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
509
278
 
510
- -- AddForeignKey
279
+ -- application_terminations
511
280
  ALTER TABLE `application_terminations` ADD CONSTRAINT `application_terminations_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
512
-
513
- -- AddForeignKey
514
281
  ALTER TABLE `application_terminations` ADD CONSTRAINT `application_terminations_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
515
-
516
- -- AddForeignKey
517
282
  ALTER TABLE `application_terminations` ADD CONSTRAINT `application_terminations_initiatorId_fkey` FOREIGN KEY (`initiatorId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
518
-
519
- -- AddForeignKey
520
283
  ALTER TABLE `application_terminations` ADD CONSTRAINT `application_terminations_reviewedBy_fkey` FOREIGN KEY (`reviewedBy`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
521
284
 
522
- -- AddForeignKey
285
+ -- offer_letters
286
+ ALTER TABLE `offer_letters` ADD CONSTRAINT `offer_letters_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
287
+
288
+ -- payment_method_change_requests
523
289
  ALTER TABLE `payment_method_change_requests` ADD CONSTRAINT `payment_method_change_requests_applicationId_fkey` FOREIGN KEY (`applicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
524
290
 
525
- -- AddForeignKey
291
+ -- property_transfer_requests
526
292
  ALTER TABLE `property_transfer_requests` ADD CONSTRAINT `property_transfer_requests_sourceApplicationId_fkey` FOREIGN KEY (`sourceApplicationId`) REFERENCES `applications`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
527
-
528
- -- AddForeignKey
529
293
  ALTER TABLE `property_transfer_requests` ADD CONSTRAINT `property_transfer_requests_targetApplicationId_fkey` FOREIGN KEY (`targetApplicationId`) REFERENCES `applications`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
@@ -0,0 +1,14 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `contractSnapshot` on the `application_terminations` table. All the data in the column will be lost.
5
+ - You are about to drop the column `totalContractAmount` on the `application_terminations` table. All the data in the column will be lost.
6
+ - Added the required column `applicationSnapshot` to the `application_terminations` table without a default value. This is not possible if the table is not empty.
7
+ - Added the required column `totalApplicationAmount` to the `application_terminations` table without a default value. This is not possible if the table is not empty.
8
+
9
+ */
10
+ -- AlterTable
11
+ ALTER TABLE `application_terminations` DROP COLUMN `contractSnapshot`,
12
+ DROP COLUMN `totalContractAmount`,
13
+ ADD COLUMN `applicationSnapshot` JSON NOT NULL,
14
+ ADD COLUMN `totalApplicationAmount` DOUBLE NOT NULL;