rez_core 6.5.75 → 6.5.77

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 (185) hide show
  1. package/dist/constant/db-data-type.constant.d.ts +30 -0
  2. package/dist/constant/db-data-type.constant.js +59 -0
  3. package/dist/constant/db-data-type.constant.js.map +1 -0
  4. package/dist/constant/storage-type.constant.d.ts +4 -0
  5. package/dist/constant/storage-type.constant.js +9 -0
  6. package/dist/constant/storage-type.constant.js.map +1 -0
  7. package/dist/module/eav/controller/eav.controller.d.ts +21 -0
  8. package/dist/module/eav/controller/eav.controller.js +127 -0
  9. package/dist/module/eav/controller/eav.controller.js.map +1 -0
  10. package/dist/module/eav/dto/eav-operation.dto.d.ts +20 -0
  11. package/dist/module/eav/dto/eav-operation.dto.js +75 -0
  12. package/dist/module/eav/dto/eav-operation.dto.js.map +1 -0
  13. package/dist/module/eav/eav.module.d.ts +2 -0
  14. package/dist/module/eav/eav.module.js +84 -0
  15. package/dist/module/eav/eav.module.js.map +1 -0
  16. package/dist/module/eav/entity/eav-boolean.entity.d.ts +9 -0
  17. package/dist/module/eav/entity/eav-boolean.entity.js +48 -0
  18. package/dist/module/eav/entity/eav-boolean.entity.js.map +1 -0
  19. package/dist/module/eav/entity/eav-date.entity.d.ts +9 -0
  20. package/dist/module/eav/entity/eav-date.entity.js +48 -0
  21. package/dist/module/eav/entity/eav-date.entity.js.map +1 -0
  22. package/dist/module/eav/entity/eav-decimal.entity.d.ts +9 -0
  23. package/dist/module/eav/entity/eav-decimal.entity.js +48 -0
  24. package/dist/module/eav/entity/eav-decimal.entity.js.map +1 -0
  25. package/dist/module/eav/entity/eav-int.entity.d.ts +9 -0
  26. package/dist/module/eav/entity/eav-int.entity.js +48 -0
  27. package/dist/module/eav/entity/eav-int.entity.js.map +1 -0
  28. package/dist/module/eav/entity/eav-json.entity.d.ts +9 -0
  29. package/dist/module/eav/entity/eav-json.entity.js +48 -0
  30. package/dist/module/eav/entity/eav-json.entity.js.map +1 -0
  31. package/dist/module/eav/entity/eav-text.entity.d.ts +9 -0
  32. package/dist/module/eav/entity/eav-text.entity.js +48 -0
  33. package/dist/module/eav/entity/eav-text.entity.js.map +1 -0
  34. package/dist/module/eav/entity/eav-time.entity.d.ts +9 -0
  35. package/dist/module/eav/entity/eav-time.entity.js +48 -0
  36. package/dist/module/eav/entity/eav-time.entity.js.map +1 -0
  37. package/dist/module/eav/entity/eav-timestamp.entity.d.ts +9 -0
  38. package/dist/module/eav/entity/eav-timestamp.entity.js +48 -0
  39. package/dist/module/eav/entity/eav-timestamp.entity.js.map +1 -0
  40. package/dist/module/eav/entity/eav-varchar.entity.d.ts +9 -0
  41. package/dist/module/eav/entity/eav-varchar.entity.js +48 -0
  42. package/dist/module/eav/entity/eav-varchar.entity.js.map +1 -0
  43. package/dist/module/eav/interface/eav-strategy.interface.d.ts +8 -0
  44. package/dist/module/eav/interface/eav-strategy.interface.js +3 -0
  45. package/dist/module/eav/interface/eav-strategy.interface.js.map +1 -0
  46. package/dist/module/eav/repository/eav-boolean.repository.d.ts +13 -0
  47. package/dist/module/eav/repository/eav-boolean.repository.js +57 -0
  48. package/dist/module/eav/repository/eav-boolean.repository.js.map +1 -0
  49. package/dist/module/eav/repository/eav-date.repository.d.ts +13 -0
  50. package/dist/module/eav/repository/eav-date.repository.js +57 -0
  51. package/dist/module/eav/repository/eav-date.repository.js.map +1 -0
  52. package/dist/module/eav/repository/eav-decimal.repository.d.ts +13 -0
  53. package/dist/module/eav/repository/eav-decimal.repository.js +57 -0
  54. package/dist/module/eav/repository/eav-decimal.repository.js.map +1 -0
  55. package/dist/module/eav/repository/eav-int.repository.d.ts +13 -0
  56. package/dist/module/eav/repository/eav-int.repository.js +57 -0
  57. package/dist/module/eav/repository/eav-int.repository.js.map +1 -0
  58. package/dist/module/eav/repository/eav-json.repository.d.ts +13 -0
  59. package/dist/module/eav/repository/eav-json.repository.js +57 -0
  60. package/dist/module/eav/repository/eav-json.repository.js.map +1 -0
  61. package/dist/module/eav/repository/eav-text.repository.d.ts +13 -0
  62. package/dist/module/eav/repository/eav-text.repository.js +57 -0
  63. package/dist/module/eav/repository/eav-text.repository.js.map +1 -0
  64. package/dist/module/eav/repository/eav-time.repository.d.ts +13 -0
  65. package/dist/module/eav/repository/eav-time.repository.js +57 -0
  66. package/dist/module/eav/repository/eav-time.repository.js.map +1 -0
  67. package/dist/module/eav/repository/eav-timestamp.repository.d.ts +13 -0
  68. package/dist/module/eav/repository/eav-timestamp.repository.js +57 -0
  69. package/dist/module/eav/repository/eav-timestamp.repository.js.map +1 -0
  70. package/dist/module/eav/repository/eav-varchar.repository.d.ts +13 -0
  71. package/dist/module/eav/repository/eav-varchar.repository.js +57 -0
  72. package/dist/module/eav/repository/eav-varchar.repository.js.map +1 -0
  73. package/dist/module/eav/service/eav-boolean.service.d.ts +12 -0
  74. package/dist/module/eav/service/eav-boolean.service.js +59 -0
  75. package/dist/module/eav/service/eav-boolean.service.js.map +1 -0
  76. package/dist/module/eav/service/eav-date.service.d.ts +12 -0
  77. package/dist/module/eav/service/eav-date.service.js +59 -0
  78. package/dist/module/eav/service/eav-date.service.js.map +1 -0
  79. package/dist/module/eav/service/eav-decimal.service.d.ts +12 -0
  80. package/dist/module/eav/service/eav-decimal.service.js +59 -0
  81. package/dist/module/eav/service/eav-decimal.service.js.map +1 -0
  82. package/dist/module/eav/service/eav-factory.service.d.ts +26 -0
  83. package/dist/module/eav/service/eav-factory.service.js +81 -0
  84. package/dist/module/eav/service/eav-factory.service.js.map +1 -0
  85. package/dist/module/eav/service/eav-int.service.d.ts +12 -0
  86. package/dist/module/eav/service/eav-int.service.js +59 -0
  87. package/dist/module/eav/service/eav-int.service.js.map +1 -0
  88. package/dist/module/eav/service/eav-json.service.d.ts +12 -0
  89. package/dist/module/eav/service/eav-json.service.js +59 -0
  90. package/dist/module/eav/service/eav-json.service.js.map +1 -0
  91. package/dist/module/eav/service/eav-text.service.d.ts +12 -0
  92. package/dist/module/eav/service/eav-text.service.js +59 -0
  93. package/dist/module/eav/service/eav-text.service.js.map +1 -0
  94. package/dist/module/eav/service/eav-time.service.d.ts +12 -0
  95. package/dist/module/eav/service/eav-time.service.js +59 -0
  96. package/dist/module/eav/service/eav-time.service.js.map +1 -0
  97. package/dist/module/eav/service/eav-timestamp.service.d.ts +12 -0
  98. package/dist/module/eav/service/eav-timestamp.service.js +59 -0
  99. package/dist/module/eav/service/eav-timestamp.service.js.map +1 -0
  100. package/dist/module/eav/service/eav-varchar.service.d.ts +12 -0
  101. package/dist/module/eav/service/eav-varchar.service.js +59 -0
  102. package/dist/module/eav/service/eav-varchar.service.js.map +1 -0
  103. package/dist/module/eav/service/eav.service.d.ts +14 -0
  104. package/dist/module/eav/service/eav.service.js +65 -0
  105. package/dist/module/eav/service/eav.service.js.map +1 -0
  106. package/dist/module/enterprise/entity/brand.entity.d.ts +0 -0
  107. package/dist/module/enterprise/entity/brand.entity.js +1 -0
  108. package/dist/module/enterprise/entity/brand.entity.js.map +1 -0
  109. package/dist/module/enterprise/entity/school.entity.d.ts +0 -0
  110. package/dist/module/enterprise/entity/school.entity.js +1 -0
  111. package/dist/module/enterprise/entity/school.entity.js.map +1 -0
  112. package/dist/module/enterprise/repository/brand.repository.d.ts +0 -0
  113. package/dist/module/enterprise/repository/brand.repository.js +1 -0
  114. package/dist/module/enterprise/repository/brand.repository.js.map +1 -0
  115. package/dist/module/meta/entity/brand-profile.entity.d.ts +3 -0
  116. package/dist/module/meta/entity/brand-profile.entity.js +18 -0
  117. package/dist/module/meta/entity/brand-profile.entity.js.map +1 -0
  118. package/dist/module/meta/entity/dynamic.entity.d.ts +3 -0
  119. package/dist/module/meta/entity/dynamic.entity.js +8 -0
  120. package/dist/module/meta/entity/dynamic.entity.js.map +1 -0
  121. package/dist/module/meta/entity/field-group.entity.d.ts +0 -0
  122. package/dist/module/meta/entity/field-group.entity.js +1 -0
  123. package/dist/module/meta/entity/field-group.entity.js.map +1 -0
  124. package/dist/module/meta/entity/school.entity.d.ts +8 -0
  125. package/dist/module/meta/entity/school.entity.js +44 -0
  126. package/dist/module/meta/entity/school.entity.js.map +1 -0
  127. package/dist/module/meta/entity/schoolAddress.entity.d.ts +9 -0
  128. package/dist/module/meta/entity/schoolAddress.entity.js +48 -0
  129. package/dist/module/meta/entity/schoolAddress.entity.js.map +1 -0
  130. package/dist/module/meta/entity/section-master.entity.d.ts +0 -0
  131. package/dist/module/meta/entity/section-master.entity.js +1 -0
  132. package/dist/module/meta/entity/section-master.entity.js.map +1 -0
  133. package/dist/module/meta/entity/user-app-mapping.entity.d.ts +0 -0
  134. package/dist/module/meta/entity/user-app-mapping.entity.js +1 -0
  135. package/dist/module/meta/entity/user-app-mapping.entity.js.map +1 -0
  136. package/dist/resources/dev.properties.yaml +31 -0
  137. package/dist/resources/local.properties.yaml +27 -0
  138. package/dist/resources/uat.properties.yaml +31 -0
  139. package/dist/table.config.d.ts +3 -3
  140. package/dist/tsconfig.build.tsbuildinfo +1 -1
  141. package/package.json +1 -1
  142. package/src/app.module.ts +3 -1
  143. package/src/constant/db-data-type.constant.ts +81 -0
  144. package/src/constant/storage-type.constant.ts +4 -0
  145. package/src/module/eav/EAV_USAGE_GUIDE.md +351 -0
  146. package/src/module/eav/controller/eav.controller.ts +119 -0
  147. package/src/module/eav/dto/eav-operation.dto.ts +62 -0
  148. package/src/module/eav/eav.module.ts +80 -0
  149. package/src/module/eav/entity/eav-boolean.entity.ts +26 -0
  150. package/src/module/eav/entity/eav-date.entity.ts +25 -0
  151. package/src/module/eav/entity/eav-decimal.entity.ts +25 -0
  152. package/src/module/eav/entity/eav-int.entity.ts +25 -0
  153. package/src/module/eav/entity/eav-json.entity.ts +25 -0
  154. package/src/module/eav/entity/eav-text.entity.ts +25 -0
  155. package/src/module/eav/entity/eav-time.entity.ts +25 -0
  156. package/src/module/eav/entity/eav-timestamp.entity.ts +25 -0
  157. package/src/module/eav/entity/eav-varchar.entity.ts +25 -0
  158. package/src/module/eav/interface/eav-strategy.interface.ts +32 -0
  159. package/src/module/eav/repository/eav-boolean.repository.ts +67 -0
  160. package/src/module/eav/repository/eav-date.repository.ts +67 -0
  161. package/src/module/eav/repository/eav-decimal.repository.ts +67 -0
  162. package/src/module/eav/repository/eav-int.repository.ts +67 -0
  163. package/src/module/eav/repository/eav-json.repository.ts +67 -0
  164. package/src/module/eav/repository/eav-text.repository.ts +67 -0
  165. package/src/module/eav/repository/eav-time.repository.ts +67 -0
  166. package/src/module/eav/repository/eav-timestamp.repository.ts +67 -0
  167. package/src/module/eav/repository/eav-varchar.repository.ts +67 -0
  168. package/src/module/eav/service/eav-boolean.service.ts +64 -0
  169. package/src/module/eav/service/eav-date.service.ts +64 -0
  170. package/src/module/eav/service/eav-decimal.service.ts +64 -0
  171. package/src/module/eav/service/eav-factory.service.ts +93 -0
  172. package/src/module/eav/service/eav-int.service.ts +64 -0
  173. package/src/module/eav/service/eav-json.service.ts +64 -0
  174. package/src/module/eav/service/eav-text.service.ts +64 -0
  175. package/src/module/eav/service/eav-time.service.ts +64 -0
  176. package/src/module/eav/service/eav-timestamp.service.ts +64 -0
  177. package/src/module/eav/service/eav-varchar.service.ts +65 -0
  178. package/src/module/eav/service/eav.service.ts +116 -0
  179. package/src/module/listmaster/service/list-master-item.service.ts +11 -61
  180. package/src/module/meta/controller/entity.controller.ts +2 -10
  181. package/src/module/meta/entity/base-entity.entity.ts +3 -0
  182. package/src/module/meta/entity/dynamic.entity.ts +4 -0
  183. package/src/module/meta/entity/entity-master.entity.ts +16 -52
  184. package/src/module/meta/service/entity-master.service.ts +135 -6
  185. package/src/module/meta/service/media-data.service.ts +0 -206
@@ -1,11 +1,15 @@
1
- import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
- import { DataSource, Repository } from 'typeorm';
1
+ import { BadRequestException, Inject, Injectable } from '@nestjs/common';
2
+ import { DataSource, EntityManager, Repository } from 'typeorm';
3
3
  import { InjectRepository } from '@nestjs/typeorm';
4
4
  import { EntityMaster } from '../entity/entity-master.entity';
5
5
  import { EntityMasterRepository } from '../repository/entity-master.repository';
6
6
  import { ListMasterService } from 'src/module/listmaster/service/list-master.service';
7
7
  import { SavedFilterRepositoryService } from 'src/module/filter/repository/saved-filter.repository';
8
8
  import { AttributeMasterRepository } from '../repository/attribute-master.repository';
9
+ import { StorageType } from '../../../constant/storage-type.constant';
10
+ import { BaseEntity } from '../entity/base-entity.entity';
11
+ import { UserData } from '../../user/entity/user.entity';
12
+ import { EntityDynamicService } from './entity-dynamic.service';
9
13
 
10
14
  @Injectable()
11
15
  export class EntityMasterService {
@@ -15,17 +19,143 @@ export class EntityMasterService {
15
19
  private attributeMasterRepo: AttributeMasterRepository,
16
20
  private entityMasterRepo: EntityMasterRepository,
17
21
  private readonly dataSource: DataSource,
22
+ @Inject('EntityDynamicService')
23
+ private readonly entityService: EntityDynamicService,
18
24
  @Inject('ListMasterService')
19
25
  private readonly listMasterService: ListMasterService,
20
26
  private readonly savedFilterRepoService: SavedFilterRepositoryService,
21
- ) {}
27
+ ) {
28
+ }
29
+
30
+ /**
31
+ * Override createEntity to add dynamic table creation for SELF storage type
32
+ */
33
+ async createEntity(
34
+ entityData: BaseEntity,
35
+ loggedInUser: UserData | null,
36
+ manager?: EntityManager | null,
37
+ ) {
38
+ // Cast to EntityMaster to access specific fields
39
+ const entityMasterData = entityData as unknown as EntityMaster;
40
+
41
+ // Validate required fields for entity master
42
+ if (!entityMasterData.mapped_entity_type) {
43
+ throw new BadRequestException('mapped_entity_type is required');
44
+ }
45
+ if (!entityMasterData.app_id) {
46
+ throw new BadRequestException('app_id is required');
47
+ }
48
+ if (!entityMasterData.storage_type) {
49
+ throw new BadRequestException('storage_type is required');
50
+ }
51
+ if (!entityMasterData.db_table_name) {
52
+ throw new BadRequestException('db_table_name is required');
53
+ }
54
+
55
+ // Validate that table name doesn't already exist
56
+ const existingByTable = await this.getEntityByTableName(entityMasterData.db_table_name);
57
+ if (existingByTable) {
58
+ throw new BadRequestException(
59
+ `Table with name "${entityMasterData.db_table_name}" already exists`,
60
+ );
61
+ }
62
+
63
+ // Validate that mapped_entity_type doesn't already exist for this enterprise
64
+ if (loggedInUser) {
65
+ const existingByType = await this.entityMasterRepository.findOne({
66
+ where: {
67
+ mapped_entity_type: entityMasterData.mapped_entity_type,
68
+ enterprise_id: loggedInUser.enterprise_id,
69
+ },
70
+ });
71
+ if (existingByType) {
72
+ throw new BadRequestException(
73
+ `Entity with mapped_entity_type "${entityMasterData.mapped_entity_type}" already exists`,
74
+ );
75
+ }
76
+ }
77
+
78
+ // Create table if storage_type is SELF
79
+ if (entityMasterData.storage_type === StorageType.SELF) {
80
+ await this.createDatabaseTable(
81
+ entityMasterData.db_table_name,
82
+ );
83
+ }
84
+
85
+ // Call parent createEntity method to handle standard entity creation
86
+ return await this.entityService.createEntity(entityData, loggedInUser);
87
+ }
88
+
89
+ /**
90
+ * Create a database table with all BaseEntity columns
91
+ */
92
+ private async createDatabaseTable(
93
+ tableName: string,
94
+ ): Promise<void> {
95
+ const queryRunner = this.dataSource.createQueryRunner();
96
+
97
+ try {
98
+ await queryRunner.connect();
99
+
100
+ // Check if table already exists
101
+ const tableExists = await queryRunner.hasTable(tableName);
102
+ if (tableExists) {
103
+ throw new BadRequestException(`Table "${tableName}" already exists in database`);
104
+ }
105
+
106
+ // Create table with all BaseEntity columns
107
+ const createTableQuery = `
108
+ CREATE TABLE ${tableName} (
109
+ id BIGSERIAL PRIMARY KEY,
110
+ entity_type VARCHAR(50),
111
+ code VARCHAR(100),
112
+ name VARCHAR(255),
113
+ description VARCHAR(1000),
114
+ status VARCHAR(50),
115
+ seq_no BIGINT,
116
+ created_by BIGINT,
117
+ created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
118
+ modified_by BIGINT,
119
+ modified_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
120
+ enterprise_id INTEGER,
121
+ level_type VARCHAR(25),
122
+ level_id INTEGER,
123
+ parent_type VARCHAR(100),
124
+ parent_id BIGINT
125
+ )
126
+ `;
127
+
128
+ await queryRunner.query(createTableQuery);
129
+
130
+ // Create indexes for common query patterns
131
+ await queryRunner.query(
132
+ `CREATE INDEX idx_${tableName}_entity_type ON ${tableName}(entity_type)`,
133
+ );
134
+ await queryRunner.query(
135
+ `CREATE INDEX idx_${tableName}_code ON ${tableName}(code)`,
136
+ );
137
+ await queryRunner.query(
138
+ `CREATE INDEX idx_${tableName}_enterprise ON ${tableName}(enterprise_id)`,
139
+ );
140
+ await queryRunner.query(
141
+ `CREATE INDEX idx_${tableName}_parent ON ${tableName}(parent_type, parent_id)`,
142
+ );
143
+
144
+ } catch (error) {
145
+ throw new BadRequestException(
146
+ `Failed to create table "${tableName}": ${error.message}`,
147
+ );
148
+ } finally {
149
+ await queryRunner.release();
150
+ }
151
+ }
22
152
 
23
153
  async getEntityById(id: number): Promise<EntityMaster | null> {
24
154
  return this.entityMasterRepo.getEntityById(id);
25
155
  }
26
156
 
27
- async getAllEntityDropDown(entity_type:string,loggedInUser): Promise<{ label: string; value: any }[]>{
28
- return this.entityMasterRepo.getAllEntityDropdownData(entity_type,loggedInUser);
157
+ async getAllEntityDropDown(entity_type: string, loggedInUser): Promise<{ label: string; value: any }[]> {
158
+ return this.entityMasterRepo.getAllEntityDropdownData(entity_type, loggedInUser);
29
159
  }
30
160
 
31
161
  async getEntityData(
@@ -167,5 +297,4 @@ export class EntityMasterService {
167
297
  );
168
298
  }
169
299
 
170
-
171
300
  }
@@ -236,212 +236,6 @@ export class MediaDataService extends EntityServiceImpl {
236
236
  }
237
237
  }
238
238
 
239
- public async buildUploadPathGenericdd(
240
- mappedEntityType: string,
241
- loggedInUser,
242
- mappedEntityId?: number,
243
- parentId?: number,
244
- parentType?: string,
245
- ) {
246
- // 1️⃣ Fetch entity metadata
247
- const entityMaster = await this.entityMasterService.getEntityData(
248
- mappedEntityType,
249
- loggedInUser,
250
- );
251
- if (!entityMaster) {
252
- throw new Error(`Entity master not found for ${mappedEntityType}`);
253
- }
254
-
255
- let pathTemplate = entityMaster.doc_upload_path ?? '';
256
- const entityOverwrite = entityMaster.overwrite_path ?? 0;
257
-
258
- if (!pathTemplate) {
259
- throw new Error(`doc_upload_path not defined for ${mappedEntityType}`);
260
- }
261
-
262
- // 2️⃣ Prepare replacement map
263
- const replacements: Record<string, string | null> = {};
264
-
265
- // --- ORG ---
266
- const organizationRepo =
267
- this.reflectionHelper.getRepoService('OrganizationData');
268
- let organizationData = await organizationRepo.findOne({
269
- where: {
270
- id: loggedInUser.organization_id,
271
- },
272
- });
273
-
274
- replacements['org_code'] = organizationData.code;
275
-
276
- // --- LEVEL CODE ---
277
- // Priority: If parent is provided, use parent for level_code; otherwise use normal logic
278
- let levelEntityId: number;
279
- let levelEntityType: string;
280
-
281
- if (parentId && parentType) {
282
- // When parent is provided, parent becomes the level_code
283
- levelEntityId = parentId;
284
- levelEntityType = parentType;
285
- } else {
286
- // Normal logic: determine which entity to use for level_code
287
- levelEntityId = entityOverwrite ? mappedEntityId : loggedInUser.level_id;
288
- levelEntityType = entityOverwrite
289
- ? mappedEntityType
290
- : loggedInUser.level_type;
291
- }
292
-
293
- // Get entity data for level_code
294
- const getEntityData = await this.entityMasterService.getEntityData(
295
- levelEntityType,
296
- loggedInUser,
297
- );
298
-
299
- if (!getEntityData) return null;
300
- const levelEntityDataResult = await this.entityManager.query(
301
- `SELECT *
302
- FROM ${getEntityData?.db_table_name}
303
- WHERE id = $1`,
304
- [levelEntityId],
305
- );
306
-
307
- const levelEntityData = levelEntityDataResult[0] || null;
308
-
309
- if (levelEntityData?.code) {
310
- replacements['level_code'] = levelEntityData.code; // universal alias
311
- }
312
-
313
- // --- MAPPED ENTITY CODE (when parent is provided) ---
314
- // When parent is provided, the mapped entity becomes an additional level
315
- if (parentId && parentType && mappedEntityId && mappedEntityType) {
316
- const mappedEntityKey = `${mappedEntityType.toLowerCase()}_code`;
317
- const mappedEntityData = await super.getEntityData(
318
- mappedEntityType,
319
- mappedEntityId,
320
- loggedInUser,
321
- );
322
- if (mappedEntityData?.code) {
323
- replacements[mappedEntityKey] = mappedEntityData.code;
324
-
325
- // Modify path template to include mapped entity
326
- // Example: ${org_code}/${level_code} becomes ${org_code}/${level_code}/${tem_code}
327
- const mappedVariable = `\${${mappedEntityKey}}`;
328
- if (!pathTemplate.includes(mappedVariable)) {
329
- pathTemplate = pathTemplate + `/${mappedVariable}`;
330
- }
331
- }
332
- }
333
-
334
- // --- TEMPLATE CODE (if parent is provided) ---
335
- // Special handling for template_code when parent_id and parent_type are provided
336
- if (parentId && parentType) {
337
- // const templateEntityData = await super.getEntityData(
338
- // parentType,
339
- // parentId,
340
- // loggedInUser,
341
- // );
342
-
343
- // Get entity data for level_code
344
- const getEntityData = await this.entityMasterService.getEntityData(
345
- mappedEntityType,
346
- loggedInUser,
347
- );
348
-
349
- if (!getEntityData) return null;
350
- const levelEntityDataResult = await this.entityManager.query(
351
- `SELECT *
352
- FROM ${getEntityData?.db_table_name}
353
- WHERE id = $1`,
354
- [mappedEntityId],
355
- );
356
-
357
- if (
358
- levelEntityDataResult?.[0].code &&
359
- parentType != 'SCH' &&
360
- loggedInUser.level_type != 'SCH'
361
- ) {
362
- replacements['template_code'] = levelEntityDataResult[0].code;
363
- // If we have parent template, modify the path to include it
364
- pathTemplate = '${org_code}/template/${template_code}';
365
- } else {
366
- const getEntityData = await this.entityMasterService.getEntityData(
367
- mappedEntityType,
368
- loggedInUser,
369
- );
370
-
371
- if (!getEntityData) return null;
372
- const levelEntityDataResult = await this.entityManager.query(
373
- `SELECT *
374
- FROM ${getEntityData?.db_table_name}
375
- WHERE id = $1`,
376
- [mappedEntityId],
377
- );
378
-
379
- replacements['template_code'] = levelEntityDataResult?.[0].code;
380
-
381
- pathTemplate = '${org_code}/${level_code}/template/${template_code}';
382
- }
383
- }
384
-
385
- // --- Dynamic variables inside path ---
386
- const matches = pathTemplate.match(/\$\{(\w+)\}/g) || [];
387
-
388
- for (const variable of matches) {
389
- const key = variable.replace(/\$\{|\}/g, '');
390
- if (replacements[key]) continue; // already resolved
391
-
392
- if (key === 'org_code') continue; // already set
393
- if (key === 'level_code') continue; // already set above
394
- if (key === 'template_code') continue; // handled above if parent is provided
395
-
396
- if (key.endsWith('_code')) {
397
- // derive entity type dynamically
398
- const entityType = key.replace('_code', '').toUpperCase();
399
-
400
- let entityId: number | undefined;
401
-
402
- // Special handling for template_code - use parent if available, otherwise mapped entity
403
- if (key === 'template_code') {
404
- if (parentType?.toUpperCase() === 'TEMPLATE' && parentId) {
405
- entityId = parentId;
406
- } else if (mappedEntityType === 'TEMPLATE') {
407
- entityId = mappedEntityId;
408
- }
409
- } else {
410
- // For other _code variables, check if parent matches the entity type
411
- if (parentType?.toUpperCase() === entityType && parentId) {
412
- entityId = parentId;
413
- } else if (mappedEntityType === entityType) {
414
- entityId = mappedEntityId;
415
- }
416
- }
417
-
418
- // Generic lookup
419
- if (entityId) {
420
- const entityData = await super.getEntityData(
421
- entityType,
422
- entityId,
423
- loggedInUser,
424
- );
425
- replacements[key] = entityData?.code ?? null;
426
- }
427
- }
428
- }
429
-
430
- // --- ORG special case ---
431
- // If ORG level & overwrite = 0 → use org_code, otherwise use the mapped entity's code
432
- if (loggedInUser.level_type === 'ORG' && entityOverwrite === 0) {
433
- // When overwrite is 0 and user is ORG level, but we want to use mapped entity
434
- // Don't set level_code to null - it should already be set above based on entityOverwrite logic
435
- }
436
-
437
- // 3️⃣ Final substitution and cleanup
438
- if (pathTemplate) {
439
- const finalPath = this.resolveUploadPath(pathTemplate, replacements);
440
- return finalPath;
441
- }
442
- return null;
443
- }
444
-
445
239
  public async buildUploadPathGeneric(
446
240
  mappedEntityType: string,
447
241
  loggedInUser,