@dssp/project 0.0.2 → 0.0.6

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 (196) hide show
  1. package/client/pages/checklist/checklist-importer.ts +6 -8
  2. package/client/pages/checklist/checklist-list-page.ts +10 -25
  3. package/client/pages/project/popup/popup-plan-upload.ts +138 -0
  4. package/client/pages/project/{project-create-popup.ts → popup/popup-project-create.ts} +2 -3
  5. package/client/pages/project/project-detail.ts +11 -11
  6. package/client/pages/project/project-list.ts +17 -10
  7. package/client/pages/project/project-plan-management.ts +117 -39
  8. package/client/pages/project/project-schedule-list.ts +2 -0
  9. package/client/pages/project/project-schedule.ts +296 -7
  10. package/client/pages/project/project-setting-list.ts +10 -6
  11. package/client/pages/project/project-update.ts +5 -2
  12. package/client/pages/resource/construction-type-management.ts +211 -0
  13. package/client/pages/resource/manager-management.ts +202 -0
  14. package/client/pages/resource/worker-type-management.ts +226 -0
  15. package/client/pages/task/task-importer.ts +6 -8
  16. package/client/pages/task/task-list-page.ts +10 -25
  17. package/client/route.ts +8 -4
  18. package/dist-client/pages/checklist/checklist-importer.d.ts +1 -0
  19. package/dist-client/pages/checklist/checklist-importer.js +3 -2
  20. package/dist-client/pages/checklist/checklist-importer.js.map +1 -1
  21. package/dist-client/pages/checklist/checklist-list-page.d.ts +1 -0
  22. package/dist-client/pages/checklist/checklist-list-page.js +8 -16
  23. package/dist-client/pages/checklist/checklist-list-page.js.map +1 -1
  24. package/dist-client/pages/project/popup/popup-plan-upload.d.ts +10 -0
  25. package/dist-client/pages/project/popup/popup-plan-upload.js +139 -0
  26. package/dist-client/pages/project/popup/popup-plan-upload.js.map +1 -0
  27. package/dist-client/pages/project/{project-create-popup.d.ts → popup/popup-project-create.d.ts} +1 -3
  28. package/dist-client/pages/project/{project-create-popup.js → popup/popup-project-create.js} +9 -10
  29. package/dist-client/pages/project/popup/popup-project-create.js.map +1 -0
  30. package/dist-client/pages/project/project-detail.d.ts +5 -4
  31. package/dist-client/pages/project/project-detail.js +9 -10
  32. package/dist-client/pages/project/project-detail.js.map +1 -1
  33. package/dist-client/pages/project/project-list.d.ts +12 -2
  34. package/dist-client/pages/project/project-list.js +11 -14
  35. package/dist-client/pages/project/project-list.js.map +1 -1
  36. package/dist-client/pages/project/project-plan-management.d.ts +9 -4
  37. package/dist-client/pages/project/project-plan-management.js +105 -35
  38. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  39. package/dist-client/pages/project/project-schedule-list.d.ts +1 -0
  40. package/dist-client/pages/project/project-schedule-list.js +1 -0
  41. package/dist-client/pages/project/project-schedule-list.js.map +1 -1
  42. package/dist-client/pages/project/project-schedule.d.ts +10 -3
  43. package/dist-client/pages/project/project-schedule.js +294 -7
  44. package/dist-client/pages/project/project-schedule.js.map +1 -1
  45. package/dist-client/pages/project/project-setting-list.d.ts +3 -2
  46. package/dist-client/pages/project/project-setting-list.js +9 -6
  47. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  48. package/dist-client/pages/project/project-update.d.ts +3 -2
  49. package/dist-client/pages/project/project-update.js +4 -2
  50. package/dist-client/pages/project/project-update.js.map +1 -1
  51. package/dist-client/pages/resource/construction-type-management.d.ts +22 -0
  52. package/dist-client/pages/resource/construction-type-management.js +208 -0
  53. package/dist-client/pages/resource/construction-type-management.js.map +1 -0
  54. package/dist-client/pages/resource/manager-management.d.ts +31 -0
  55. package/dist-client/pages/resource/manager-management.js +196 -0
  56. package/dist-client/pages/resource/manager-management.js.map +1 -0
  57. package/dist-client/pages/resource/worker-type-management.d.ts +28 -0
  58. package/dist-client/pages/resource/worker-type-management.js +222 -0
  59. package/dist-client/pages/resource/worker-type-management.js.map +1 -0
  60. package/dist-client/pages/task/task-importer.d.ts +1 -0
  61. package/dist-client/pages/task/task-importer.js +3 -2
  62. package/dist-client/pages/task/task-importer.js.map +1 -1
  63. package/dist-client/pages/task/task-list-page.d.ts +1 -0
  64. package/dist-client/pages/task/task-list-page.js +8 -16
  65. package/dist-client/pages/task/task-list-page.js.map +1 -1
  66. package/dist-client/route.d.ts +1 -1
  67. package/dist-client/route.js +7 -4
  68. package/dist-client/route.js.map +1 -1
  69. package/dist-client/tsconfig.tsbuildinfo +1 -1
  70. package/dist-server/controllers/index.d.ts +0 -0
  71. package/dist-server/controllers/project-to-excel.d.ts +7 -0
  72. package/dist-server/index.d.ts +2 -0
  73. package/dist-server/middlewares/index.d.ts +1 -0
  74. package/dist-server/routes.d.ts +1 -0
  75. package/dist-server/service/check-item/check-item-mutation.d.ts +10 -0
  76. package/dist-server/service/check-item/check-item-query.d.ts +11 -0
  77. package/dist-server/service/check-item/check-item-type.d.ts +18 -0
  78. package/dist-server/service/check-item/check-item.d.ts +18 -0
  79. package/dist-server/service/check-item/index.d.ts +5 -0
  80. package/dist-server/service/checklist/checklist-mutation.d.ts +10 -0
  81. package/dist-server/service/checklist/checklist-query.d.ts +11 -0
  82. package/dist-server/service/checklist/checklist-type.d.ts +18 -0
  83. package/dist-server/service/checklist/checklist.d.ts +26 -0
  84. package/dist-server/service/checklist/index.d.ts +5 -0
  85. package/dist-server/service/construction-type/construction-type-mutation.d.ts +6 -0
  86. package/dist-server/service/construction-type/construction-type-mutation.js +64 -0
  87. package/dist-server/service/construction-type/construction-type-mutation.js.map +1 -0
  88. package/dist-server/service/construction-type/construction-type-query.d.ts +11 -0
  89. package/dist-server/service/construction-type/construction-type-query.js +78 -0
  90. package/dist-server/service/construction-type/construction-type-query.js.map +1 -0
  91. package/dist-server/service/construction-type/construction-type-type.d.ts +11 -0
  92. package/dist-server/service/construction-type/construction-type-type.js +43 -0
  93. package/dist-server/service/construction-type/construction-type-type.js.map +1 -0
  94. package/dist-server/service/construction-type/construction-type.d.ts +16 -0
  95. package/dist-server/service/construction-type/construction-type.js +77 -0
  96. package/dist-server/service/construction-type/construction-type.js.map +1 -0
  97. package/dist-server/service/construction-type/index.d.ts +5 -0
  98. package/dist-server/service/construction-type/index.js +9 -0
  99. package/dist-server/service/construction-type/index.js.map +1 -0
  100. package/dist-server/service/index.d.ts +12 -0
  101. package/dist-server/service/index.js +12 -4
  102. package/dist-server/service/index.js.map +1 -1
  103. package/dist-server/service/manager/index.d.ts +5 -0
  104. package/dist-server/service/manager/index.js +9 -0
  105. package/dist-server/service/manager/index.js.map +1 -0
  106. package/dist-server/service/manager/manager-mutation.d.ts +5 -0
  107. package/dist-server/service/manager/manager-mutation.js +39 -0
  108. package/dist-server/service/manager/manager-mutation.js.map +1 -0
  109. package/dist-server/service/manager/manager-query.d.ts +4 -0
  110. package/dist-server/service/manager/manager-query.js +39 -0
  111. package/dist-server/service/manager/manager-query.js.map +1 -0
  112. package/dist-server/service/manager/manager-type.d.ts +15 -0
  113. package/dist-server/service/manager/manager-type.js +62 -0
  114. package/dist-server/service/manager/manager-type.js.map +1 -0
  115. package/dist-server/service/manager/manager.d.ts +8 -0
  116. package/dist-server/service/manager/manager.js +41 -0
  117. package/dist-server/service/manager/manager.js.map +1 -0
  118. package/dist-server/service/project/index.d.ts +7 -0
  119. package/dist-server/service/project/project-mutation.d.ts +9 -0
  120. package/dist-server/service/project/project-mutation.js +61 -55
  121. package/dist-server/service/project/project-mutation.js.map +1 -1
  122. package/dist-server/service/project/project-query.d.ts +16 -0
  123. package/dist-server/service/project/project-query.js +3 -3
  124. package/dist-server/service/project/project-query.js.map +1 -1
  125. package/dist-server/service/project/project-type.d.ts +29 -0
  126. package/dist-server/service/project/project-type.js +1 -2
  127. package/dist-server/service/project/project-type.js.map +1 -1
  128. package/dist-server/service/project/project.d.ts +35 -0
  129. package/dist-server/service/project/project.js +1 -2
  130. package/dist-server/service/project/project.js.map +1 -1
  131. package/dist-server/service/task/index.d.ts +5 -0
  132. package/dist-server/service/task/task-mutation.d.ts +10 -0
  133. package/dist-server/service/task/task-query.d.ts +11 -0
  134. package/dist-server/service/task/task-type.d.ts +18 -0
  135. package/dist-server/service/task/task.d.ts +25 -0
  136. package/dist-server/service/worker-type/index.d.ts +5 -0
  137. package/dist-server/service/worker-type/index.js +9 -0
  138. package/dist-server/service/worker-type/index.js.map +1 -0
  139. package/dist-server/service/worker-type/worker-type-mutation.d.ts +6 -0
  140. package/dist-server/service/worker-type/worker-type-mutation.js +64 -0
  141. package/dist-server/service/worker-type/worker-type-mutation.js.map +1 -0
  142. package/dist-server/service/worker-type/worker-type-query.d.ts +11 -0
  143. package/dist-server/service/{resource/resource-query.js → worker-type/worker-type-query.js} +31 -39
  144. package/dist-server/service/worker-type/worker-type-query.js.map +1 -0
  145. package/dist-server/service/worker-type/worker-type-type.d.ts +11 -0
  146. package/dist-server/service/worker-type/worker-type-type.js +43 -0
  147. package/dist-server/service/worker-type/worker-type-type.js.map +1 -0
  148. package/dist-server/service/worker-type/worker-type.d.ts +16 -0
  149. package/dist-server/service/{resource/resource.js → worker-type/worker-type.js} +35 -20
  150. package/dist-server/service/worker-type/worker-type.js.map +1 -0
  151. package/dist-server/tsconfig.tsbuildinfo +1 -1
  152. package/package.json +3 -3
  153. package/server/service/construction-type/construction-type-mutation.ts +66 -0
  154. package/server/service/construction-type/construction-type-query.ts +47 -0
  155. package/server/service/construction-type/construction-type-type.ts +26 -0
  156. package/server/service/{resource/resource.ts → construction-type/construction-type.ts} +18 -6
  157. package/server/service/construction-type/index.ts +6 -0
  158. package/server/service/index.ts +12 -4
  159. package/server/service/manager/index.ts +6 -0
  160. package/server/service/manager/manager-mutation.ts +42 -0
  161. package/server/service/manager/manager-query.ts +28 -0
  162. package/server/service/manager/manager-type.ts +40 -0
  163. package/server/service/manager/manager.ts +29 -0
  164. package/server/service/project/project-mutation.ts +101 -79
  165. package/server/service/project/project-query.ts +5 -8
  166. package/server/service/worker-type/index.ts +6 -0
  167. package/server/service/worker-type/worker-type-mutation.ts +66 -0
  168. package/server/service/worker-type/worker-type-query.ts +47 -0
  169. package/server/service/worker-type/worker-type-type.ts +26 -0
  170. package/server/service/worker-type/worker-type.ts +68 -0
  171. package/things-factory.config.js +3 -0
  172. package/client/pages/project/ox-progress-circle.ts +0 -133
  173. package/client/pages/resource/resource-importer.ts +0 -96
  174. package/client/pages/resource/resource-list-page.ts +0 -355
  175. package/dist-client/pages/project/ox-progress-circle.d.ts +0 -41
  176. package/dist-client/pages/project/ox-progress-circle.js +0 -182
  177. package/dist-client/pages/project/ox-progress-circle.js.map +0 -1
  178. package/dist-client/pages/project/project-create-popup.js.map +0 -1
  179. package/dist-client/pages/resource/resource-importer.d.ts +0 -9
  180. package/dist-client/pages/resource/resource-importer.js +0 -100
  181. package/dist-client/pages/resource/resource-importer.js.map +0 -1
  182. package/dist-client/pages/resource/resource-list-page.d.ts +0 -62
  183. package/dist-client/pages/resource/resource-list-page.js +0 -331
  184. package/dist-client/pages/resource/resource-list-page.js.map +0 -1
  185. package/dist-server/service/resource/index.js +0 -9
  186. package/dist-server/service/resource/index.js.map +0 -1
  187. package/dist-server/service/resource/resource-mutation.js +0 -129
  188. package/dist-server/service/resource/resource-mutation.js.map +0 -1
  189. package/dist-server/service/resource/resource-query.js.map +0 -1
  190. package/dist-server/service/resource/resource-type.js +0 -69
  191. package/dist-server/service/resource/resource-type.js.map +0 -1
  192. package/dist-server/service/resource/resource.js.map +0 -1
  193. package/server/service/resource/index.ts +0 -6
  194. package/server/service/resource/resource-mutation.ts +0 -139
  195. package/server/service/resource/resource-query.ts +0 -56
  196. package/server/service/resource/resource-type.ts +0 -49
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const manager_1 = require("./manager");
5
+ const manager_query_1 = require("./manager-query");
6
+ const manager_mutation_1 = require("./manager-mutation");
7
+ exports.entities = [manager_1.Manager];
8
+ exports.resolvers = [manager_query_1.ManagerQuery, manager_mutation_1.ManagerMutation];
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/manager/index.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AACnC,mDAA8C;AAC9C,yDAAoD;AAEvC,QAAA,QAAQ,GAAG,CAAC,iBAAO,CAAC,CAAA;AACpB,QAAA,SAAS,GAAG,CAAC,4BAAY,EAAE,kCAAe,CAAC,CAAA","sourcesContent":["import { Manager } from './manager'\nimport { ManagerQuery } from './manager-query'\nimport { ManagerMutation } from './manager-mutation'\n\nexport const entities = [Manager]\nexport const resolvers = [ManagerQuery, ManagerMutation]\n"]}
@@ -0,0 +1,5 @@
1
+ import { Manager } from './manager';
2
+ import { ManagerPatch } from './manager-type';
3
+ export declare class ManagerMutation {
4
+ updateMultipleManager(patches: ManagerPatch[], context: ResolverContext): Promise<Manager[]>;
5
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagerMutation = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const manager_1 = require("./manager");
7
+ const manager_type_1 = require("./manager-type");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ let ManagerMutation = class ManagerMutation {
10
+ async updateMultipleManager(patches, context) {
11
+ const { tx, user } = context.state;
12
+ let results = [];
13
+ const managerRepo = tx.getRepository(manager_1.Manager);
14
+ const userRepo = tx.getRepository(auth_base_1.User);
15
+ for (let i = 0; i < patches.length; i++) {
16
+ const updateRecord = patches[i];
17
+ const manager = updateRecord.id ? await managerRepo.findOneBy({ id: updateRecord.id }) : {};
18
+ const managerUser = await userRepo.findOneBy({ id: updateRecord.userId });
19
+ await userRepo.save(Object.assign(Object.assign({}, managerUser), { name: updateRecord.name, updater: user }));
20
+ const result = await managerRepo.save(Object.assign(Object.assign(Object.assign({}, manager), { user: managerUser }), updateRecord));
21
+ results.push(Object.assign({}, result));
22
+ }
23
+ return results;
24
+ }
25
+ };
26
+ tslib_1.__decorate([
27
+ (0, type_graphql_1.Directive)('@transaction'),
28
+ (0, type_graphql_1.Mutation)(returns => [manager_1.Manager], { description: "To modify multiple Managers' information" }),
29
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [manager_type_1.ManagerPatch])),
30
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
31
+ tslib_1.__metadata("design:type", Function),
32
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
33
+ tslib_1.__metadata("design:returntype", Promise)
34
+ ], ManagerMutation.prototype, "updateMultipleManager", null);
35
+ ManagerMutation = tslib_1.__decorate([
36
+ (0, type_graphql_1.Resolver)(manager_1.Manager)
37
+ ], ManagerMutation);
38
+ exports.ManagerMutation = ManagerMutation;
39
+ //# sourceMappingURL=manager-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-mutation.js","sourceRoot":"","sources":["../../../server/service/manager/manager-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,uCAAmC;AACnC,iDAA6C;AAC7C,yDAAgD;AAGzC,IAAM,eAAe,GAArB,MAAM,eAAe;IAGpB,AAAN,KAAK,CAAC,qBAAqB,CACe,OAAuB,EACxD,OAAwB;QAE/B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAElC,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,WAAW,GAAG,EAAE,CAAC,aAAa,CAAC,iBAAO,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAI,CAAC,CAAA;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC3F,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;YAEzE,MAAM,QAAQ,CAAC,IAAI,iCACd,WAAW,KACd,IAAI,EAAE,YAAY,CAAC,IAAI,EACvB,OAAO,EAAE,IAAI,IACb,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,+CAChC,OAAO,KACV,IAAI,EAAE,WAAW,KACd,YAAY,EACf,CAAA;YAEF,OAAO,CAAC,IAAI,mBAAM,MAAM,EAAG,CAAA;SAC5B;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAA;AAhCO;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iBAAO,CAAC,EAAE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;IAEzF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,2BAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4DA6BP;AAlCU,eAAe;IAD3B,IAAA,uBAAQ,EAAC,iBAAO,CAAC;GACL,eAAe,CAmC3B;AAnCY,0CAAe","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { Manager } from './manager'\nimport { ManagerPatch } from './manager-type'\nimport { User } from '@things-factory/auth-base'\n\n@Resolver(Manager)\nexport class ManagerMutation {\n @Directive('@transaction')\n @Mutation(returns => [Manager], { description: \"To modify multiple Managers' information\" })\n async updateMultipleManager(\n @Arg('patches', type => [ManagerPatch]) patches: ManagerPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Manager[]> {\n const { tx, user } = context.state\n\n let results = []\n const managerRepo = tx.getRepository(Manager)\n const userRepo = tx.getRepository(User)\n\n for (let i = 0; i < patches.length; i++) {\n const updateRecord = patches[i]\n const manager = updateRecord.id ? await managerRepo.findOneBy({ id: updateRecord.id }) : {}\n const managerUser = await userRepo.findOneBy({ id: updateRecord.userId })\n\n await userRepo.save({\n ...managerUser,\n name: updateRecord.name,\n updater: user\n })\n\n const result = await managerRepo.save({\n ...manager,\n user: managerUser,\n ...updateRecord\n })\n\n results.push({ ...result })\n }\n\n return results\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { ManagerOutput } from './manager-type';
2
+ export declare class ManagerQuery {
3
+ managers(context: ResolverContext): Promise<ManagerOutput[]>;
4
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagerQuery = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const manager_1 = require("./manager");
8
+ const manager_type_1 = require("./manager-type");
9
+ const auth_base_1 = require("@things-factory/auth-base");
10
+ let ManagerQuery = class ManagerQuery {
11
+ async managers(context) {
12
+ const { domain } = context.state;
13
+ const queryBuilder = await (0, shell_1.getRepository)(auth_base_1.User)
14
+ .createQueryBuilder('u')
15
+ .select('m.id', 'id')
16
+ .addSelect('m.phone', 'phone')
17
+ .addSelect('m.position', 'position')
18
+ .addSelect('u.id', 'userId')
19
+ .addSelect('u.name', 'name')
20
+ .addSelect('u.updated_at', 'updatedAt')
21
+ .innerJoin('users_domains', 'ud', 'u.id = ud.users_id')
22
+ .leftJoin('managers', 'm', 'u.id = m.user_id')
23
+ .where('ud.domains_id = :domain', { domain: domain.id })
24
+ .orderBy('u.name', 'DESC');
25
+ return await queryBuilder.getRawMany();
26
+ }
27
+ };
28
+ tslib_1.__decorate([
29
+ (0, type_graphql_1.Query)(returns => [manager_type_1.ManagerOutput], { description: '담당자 리스트' }),
30
+ tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
31
+ tslib_1.__metadata("design:type", Function),
32
+ tslib_1.__metadata("design:paramtypes", [Object]),
33
+ tslib_1.__metadata("design:returntype", Promise)
34
+ ], ManagerQuery.prototype, "managers", null);
35
+ ManagerQuery = tslib_1.__decorate([
36
+ (0, type_graphql_1.Resolver)(manager_1.Manager)
37
+ ], ManagerQuery);
38
+ exports.ManagerQuery = ManagerQuery;
39
+ //# sourceMappingURL=manager-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-query.js","sourceRoot":"","sources":["../../../server/service/manager/manager-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAmD;AACnD,iDAAqD;AACrD,uCAAmC;AACnC,iDAA8C;AAC9C,yDAAgD;AAGzC,IAAM,YAAY,GAAlB,MAAM,YAAY;IAEjB,AAAN,KAAK,CAAC,QAAQ,CAAQ,OAAwB;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAa,EAAC,gBAAI,CAAC;aAC3C,kBAAkB,CAAC,GAAG,CAAC;aACvB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;aACpB,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;aAC7B,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC;aACnC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;aAC3B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC3B,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC;aACtC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC;aACtD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,kBAAkB,CAAC;aAC7C,KAAK,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;aACvD,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAE5B,OAAO,MAAM,YAAY,CAAC,UAAU,EAAE,CAAA;IACxC,CAAC;CACF,CAAA;AAlBO;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,4BAAa,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4CAiBpB;AAnBU,YAAY;IADxB,IAAA,uBAAQ,EAAC,iBAAO,CAAC;GACL,YAAY,CAoBxB;AApBY,oCAAY","sourcesContent":["import { Resolver, Query, Ctx } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport { Manager } from './manager'\nimport { ManagerOutput } from './manager-type'\nimport { User } from '@things-factory/auth-base'\n\n@Resolver(Manager)\nexport class ManagerQuery {\n @Query(returns => [ManagerOutput], { description: '담당자 리스트' })\n async managers(@Ctx() context: ResolverContext): Promise<ManagerOutput[]> {\n const { domain } = context.state\n\n const queryBuilder = await getRepository(User)\n .createQueryBuilder('u')\n .select('m.id', 'id')\n .addSelect('m.phone', 'phone')\n .addSelect('m.position', 'position')\n .addSelect('u.id', 'userId')\n .addSelect('u.name', 'name')\n .addSelect('u.updated_at', 'updatedAt')\n .innerJoin('users_domains', 'ud', 'u.id = ud.users_id')\n .leftJoin('managers', 'm', 'u.id = m.user_id')\n .where('ud.domains_id = :domain', { domain: domain.id })\n .orderBy('u.name', 'DESC')\n\n return await queryBuilder.getRawMany()\n }\n}\n"]}
@@ -0,0 +1,15 @@
1
+ export declare class ManagerPatch {
2
+ id?: string;
3
+ phone?: string;
4
+ position?: string;
5
+ userId?: string;
6
+ name?: string;
7
+ }
8
+ export declare class ManagerOutput {
9
+ id?: string;
10
+ phone?: string;
11
+ position?: string;
12
+ userId?: string;
13
+ name?: string;
14
+ updatedAt?: string;
15
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagerOutput = exports.ManagerPatch = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ let ManagerPatch = class ManagerPatch {
7
+ };
8
+ tslib_1.__decorate([
9
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true }),
10
+ tslib_1.__metadata("design:type", String)
11
+ ], ManagerPatch.prototype, "id", void 0);
12
+ tslib_1.__decorate([
13
+ (0, type_graphql_1.Field)({ nullable: true }),
14
+ tslib_1.__metadata("design:type", String)
15
+ ], ManagerPatch.prototype, "phone", void 0);
16
+ tslib_1.__decorate([
17
+ (0, type_graphql_1.Field)({ nullable: true }),
18
+ tslib_1.__metadata("design:type", String)
19
+ ], ManagerPatch.prototype, "position", void 0);
20
+ tslib_1.__decorate([
21
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true }),
22
+ tslib_1.__metadata("design:type", String)
23
+ ], ManagerPatch.prototype, "userId", void 0);
24
+ tslib_1.__decorate([
25
+ (0, type_graphql_1.Field)({ nullable: true }),
26
+ tslib_1.__metadata("design:type", String)
27
+ ], ManagerPatch.prototype, "name", void 0);
28
+ ManagerPatch = tslib_1.__decorate([
29
+ (0, type_graphql_1.InputType)()
30
+ ], ManagerPatch);
31
+ exports.ManagerPatch = ManagerPatch;
32
+ let ManagerOutput = class ManagerOutput {
33
+ };
34
+ tslib_1.__decorate([
35
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true }),
36
+ tslib_1.__metadata("design:type", String)
37
+ ], ManagerOutput.prototype, "id", void 0);
38
+ tslib_1.__decorate([
39
+ (0, type_graphql_1.Field)({ nullable: true }),
40
+ tslib_1.__metadata("design:type", String)
41
+ ], ManagerOutput.prototype, "phone", void 0);
42
+ tslib_1.__decorate([
43
+ (0, type_graphql_1.Field)({ nullable: true }),
44
+ tslib_1.__metadata("design:type", String)
45
+ ], ManagerOutput.prototype, "position", void 0);
46
+ tslib_1.__decorate([
47
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
48
+ tslib_1.__metadata("design:type", String)
49
+ ], ManagerOutput.prototype, "userId", void 0);
50
+ tslib_1.__decorate([
51
+ (0, type_graphql_1.Field)({ nullable: true }),
52
+ tslib_1.__metadata("design:type", String)
53
+ ], ManagerOutput.prototype, "name", void 0);
54
+ tslib_1.__decorate([
55
+ (0, type_graphql_1.Field)({ nullable: true }),
56
+ tslib_1.__metadata("design:type", String)
57
+ ], ManagerOutput.prototype, "updatedAt", void 0);
58
+ ManagerOutput = tslib_1.__decorate([
59
+ (0, type_graphql_1.ObjectType)()
60
+ ], ManagerOutput);
61
+ exports.ManagerOutput = ManagerOutput;
62
+ //# sourceMappingURL=manager-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-type.js","sourceRoot":"","sources":["../../../server/service/manager/manager-type.ts"],"names":[],"mappings":";;;;AAAA,+CAA+D;AAGxD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAexB,CAAA;AAdC;IAAC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wCAC3B;AAEX;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACZ;AAEd;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CACT;AAEjB;IAAC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACvB;AAEf;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACb;AAdF,YAAY;IADxB,IAAA,wBAAS,GAAE;GACC,YAAY,CAexB;AAfY,oCAAY;AAkBlB,IAAM,aAAa,GAAnB,MAAM,aAAa;CAkBzB,CAAA;AAjBC;IAAC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCAC3B;AAEX;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACZ;AAEd;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACT;AAEjB;IAAC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;6CACH;AAEf;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACb;AAEb;IAAC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACR;AAjBP,aAAa;IADzB,IAAA,yBAAU,GAAE;GACA,aAAa,CAkBzB;AAlBY,sCAAa","sourcesContent":["import { ObjectType, Field, InputType, ID } from 'type-graphql'\n\n@InputType()\nexport class ManagerPatch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n @Field({ nullable: true })\n phone?: string\n\n @Field({ nullable: true })\n position?: string\n\n @Field(type => ID, { nullable: true })\n userId?: string\n\n @Field({ nullable: true })\n name?: string\n}\n\n@ObjectType()\nexport class ManagerOutput {\n @Field(type => ID, { nullable: true })\n id?: string\n\n @Field({ nullable: true })\n phone?: string\n\n @Field({ nullable: true })\n position?: string\n\n @Field(type => ID)\n userId?: string\n\n @Field({ nullable: true })\n name?: string\n\n @Field({ nullable: true })\n updatedAt?: string\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { User } from '@things-factory/auth-base';
2
+ export declare class Manager {
3
+ readonly id: string;
4
+ phone?: string;
5
+ position?: string;
6
+ user?: User;
7
+ userId?: string;
8
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Manager = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const auth_base_1 = require("@things-factory/auth-base");
8
+ let Manager = class Manager {
9
+ };
10
+ tslib_1.__decorate([
11
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
12
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
13
+ tslib_1.__metadata("design:type", String)
14
+ ], Manager.prototype, "id", void 0);
15
+ tslib_1.__decorate([
16
+ (0, typeorm_1.Column)({ nullable: true, comment: '핸드폰 번호' }),
17
+ (0, type_graphql_1.Field)({ nullable: true }),
18
+ tslib_1.__metadata("design:type", String)
19
+ ], Manager.prototype, "phone", void 0);
20
+ tslib_1.__decorate([
21
+ (0, typeorm_1.Column)({ nullable: true, comment: '직위' }),
22
+ (0, type_graphql_1.Field)({ nullable: true }),
23
+ tslib_1.__metadata("design:type", String)
24
+ ], Manager.prototype, "position", void 0);
25
+ tslib_1.__decorate([
26
+ (0, typeorm_1.OneToOne)(type => auth_base_1.User),
27
+ (0, typeorm_1.JoinColumn)(),
28
+ (0, type_graphql_1.Field)({ nullable: true }),
29
+ tslib_1.__metadata("design:type", auth_base_1.User)
30
+ ], Manager.prototype, "user", void 0);
31
+ tslib_1.__decorate([
32
+ (0, typeorm_1.RelationId)((manager) => manager.user),
33
+ tslib_1.__metadata("design:type", String)
34
+ ], Manager.prototype, "userId", void 0);
35
+ Manager = tslib_1.__decorate([
36
+ (0, typeorm_1.Entity)(),
37
+ (0, typeorm_1.Index)('ix_manager_0', (manager) => [manager.user]),
38
+ (0, type_graphql_1.ObjectType)({ description: '담당자 관리' })
39
+ ], Manager);
40
+ exports.Manager = Manager;
41
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../server/service/manager/manager.ts"],"names":[],"mappings":";;;;AAAA,qCAAyG;AACzG,+CAAoD;AAEpD,yDAAgD;AAKzC,IAAM,OAAO,GAAb,MAAM,OAAO;CAoBnB,CAAA;AAnBC;IAAC,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;mCACC;AAEnB;IAAC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC7C,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCACZ;AAEd;IAAC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACT;AAEjB;IAAC,IAAA,kBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACtB,IAAA,oBAAU,GAAE;IACZ,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACnB,gBAAI;qCAAA;AAEX;IAAC,IAAA,oBAAU,EAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;;uCAChC;AAnBJ,OAAO;IAHnB,IAAA,gBAAM,GAAE;IACR,IAAA,eAAK,EAAC,cAAc,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;GACzB,OAAO,CAoBnB;AApBY,0BAAO","sourcesContent":["import { Entity, Index, Column, RelationId, OneToOne, PrimaryGeneratedColumn, JoinColumn } from 'typeorm'\nimport { ObjectType, Field, ID } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n@Entity()\n@Index('ix_manager_0', (manager: Manager) => [manager.user])\n@ObjectType({ description: '담당자 관리' })\nexport class Manager {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @Column({ nullable: true, comment: '핸드폰 번호' })\n @Field({ nullable: true })\n phone?: string\n\n @Column({ nullable: true, comment: '직위' })\n @Field({ nullable: true })\n position?: string\n\n @OneToOne(type => User)\n @JoinColumn()\n @Field({ nullable: true })\n user?: User\n\n @RelationId((manager: Manager) => manager.user)\n userId?: string\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { Project } from './project';
2
+ import { ProjectQuery } from './project-query';
3
+ import { ProjectMutation } from './project-mutation';
4
+ import { InspectionSummary } from './project-type';
5
+ export declare const entities: (typeof Project)[];
6
+ export declare const resolvers: (typeof ProjectQuery | typeof ProjectMutation)[];
7
+ export declare const types: (typeof InspectionSummary)[];
@@ -0,0 +1,9 @@
1
+ import { Project } from './project';
2
+ import { NewProject, ProjectPatch } from './project-type';
3
+ export declare class ProjectMutation {
4
+ createProject(project: NewProject, context: ResolverContext): Promise<Project>;
5
+ updateProject(project: ProjectPatch, context: ResolverContext): Promise<Project>;
6
+ updateProjectPlan(project: ProjectPatch, context: ResolverContext): Promise<Project>;
7
+ deleteProject(id: string, context: ResolverContext): Promise<boolean>;
8
+ }
9
+ export declare function createAttachmentAfterDelete(context: ResolverContext, file: any, refBy: any, refType: any): Promise<any>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ProjectMutation = void 0;
3
+ exports.createAttachmentAfterDelete = exports.ProjectMutation = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const typeorm_1 = require("typeorm");
@@ -8,6 +8,7 @@ const attachment_base_1 = require("@things-factory/attachment-base");
8
8
  const project_1 = require("./project");
9
9
  const project_type_1 = require("./project-type");
10
10
  const building_complex_1 = require("@dssp/building-complex");
11
+ const headless_pdf_to_image_1 = require("@things-factory/board-service/dist-server/controllers/headless-pdf-to-image");
11
12
  let ProjectMutation = class ProjectMutation {
12
13
  async createProject(project, context) {
13
14
  const { domain, user, tx } = context.state;
@@ -40,32 +41,10 @@ let ProjectMutation = class ProjectMutation {
40
41
  const projectResult = await projectRepo.save(Object.assign(Object.assign({}, project), { updater: user }));
41
42
  // 2. 단지 정보 수정
42
43
  await buildingComplexRepo.save(Object.assign(Object.assign({}, buildingComplex), { updater: user }));
43
- // 2-1. 프로젝트 메인 이미지 첨부파일 나머지 삭제 후 저장 (null로 오면 삭제만)
44
- if (project.mainPhotoUpload !== undefined) {
45
- await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [project.id] }, context);
46
- if (project.mainPhotoUpload) {
47
- await (0, attachment_base_1.createAttachment)(null, {
48
- attachment: {
49
- file: project.mainPhotoUpload,
50
- refType: project_1.Project.name,
51
- refBy: project.id
52
- }
53
- }, context);
54
- }
55
- }
56
- // 2-2. 단지 BIM 이미지 첨부파일 나머지 삭제 후 저장 (null로 오면 삭제만)
57
- if (buildingComplex.drawingUpload !== undefined) {
58
- await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [buildingComplex.id] }, context);
59
- if (buildingComplex.drawingUpload) {
60
- await (0, attachment_base_1.createAttachment)(null, {
61
- attachment: {
62
- file: buildingComplex.drawingUpload,
63
- refType: building_complex_1.BuildingComplex.name,
64
- refBy: buildingComplex.id
65
- }
66
- }, context);
67
- }
68
- }
44
+ // 2-1. 프로젝트 메인 이미지 첨부파일 나머지 삭제 후 저장
45
+ await createAttachmentAfterDelete(context, project === null || project === void 0 ? void 0 : project.mainPhotoUpload, project.id, project_1.Project.name);
46
+ // 2-2. 단지 BIM 이미지 첨부파일 나머지 삭제 후 저장
47
+ await createAttachmentAfterDelete(context, buildingComplex === null || buildingComplex === void 0 ? void 0 : buildingComplex.drawingUpload, buildingComplex.id, building_complex_1.BuildingComplex.name);
69
48
  // 3. 동의 층 정보가 바뀌었으면 층 초기화 후 다시 생성
70
49
  const originBuilding = await buildingRepo.findBy({ buildingComplex: { id: buildingComplex.id } }); // 이전 동 정보 가져오기
71
50
  const afterBuilding = buildings.reduce((acc, building) => (Object.assign(Object.assign({}, acc), { [building.name]: building.floorCount })), {}); // 비교용으로 수정된 동 정보 데이터 파싱
@@ -79,8 +58,9 @@ let ProjectMutation = class ProjectMutation {
79
58
  await buildingLevelRepo.softDelete({ building: { id: (0, typeorm_1.In)(buildingIds) } });
80
59
  await buildingRepo.softDelete({ id: (0, typeorm_1.In)(buildingIds) });
81
60
  await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [...buildingIds, ...buildingLevelIds] }, context);
82
- buildings.forEach(async (building) => {
83
- // 3-2. 단지 정보들 생성
61
+ // 3-2. 단지 동 정보들 생성
62
+ for (let buildingKey in buildings) {
63
+ const building = buildings[buildingKey];
84
64
  const newBuilding = await buildingRepo.save({
85
65
  buildingComplex: buildingComplex,
86
66
  name: building.name,
@@ -91,15 +71,17 @@ let ProjectMutation = class ProjectMutation {
91
71
  for (let i = 1; i <= building.floorCount; i++) {
92
72
  await buildingLevelRepo.save({ building: newBuilding, floor: i, creator: user });
93
73
  }
94
- });
74
+ }
95
75
  }
96
76
  return projectResult;
97
77
  }
98
78
  async updateProjectPlan(project, context) {
99
79
  var _a;
100
- const { user, tx } = context.state;
80
+ const { user, tx, domain } = context.state;
101
81
  const projectRepo = tx.getRepository(project_1.Project);
102
82
  const buildingComplexRepo = tx.getRepository(building_complex_1.BuildingComplex);
83
+ const buildingRepo = tx.getRepository(building_complex_1.Building);
84
+ const buildingLevelRepo = tx.getRepository(building_complex_1.BuildingLevel);
103
85
  const buildingComplex = project.buildingComplex;
104
86
  const buildings = ((_a = project.buildingComplex) === null || _a === void 0 ? void 0 : _a.buildings) || [];
105
87
  // 1. 프로젝트 수정 시간 업데이트
@@ -110,33 +92,43 @@ let ProjectMutation = class ProjectMutation {
110
92
  const building = buildings[buildingKey];
111
93
  for (let buildingLevelKey in building.buildingLevels) {
112
94
  const buildingLevel = building.buildingLevels[buildingLevelKey];
113
- // 3. 층별 도면 이미지 저장 (null로 오면 삭제만)
114
- if ((buildingLevel === null || buildingLevel === void 0 ? void 0 : buildingLevel.mainDrawingUpload) !== undefined) {
115
- await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [buildingLevel.id] }, context);
116
- if (buildingLevel === null || buildingLevel === void 0 ? void 0 : buildingLevel.mainDrawingUpload) {
117
- await (0, attachment_base_1.createAttachment)(null, {
118
- attachment: {
119
- file: buildingLevel.mainDrawingUpload,
120
- refType: building_complex_1.BuildingLevel.name,
121
- refBy: buildingLevel.id
122
- }
123
- }, context);
124
- }
95
+ // 3. 층별 도면 이미지 저장
96
+ const mainDrawingAttatchment = await createAttachmentAfterDelete(context, buildingLevel.mainDrawingUpload, buildingLevel.id, building_complex_1.BuildingLevel.name + '_mainDrawing');
97
+ // 첨부된 PDF가 있으면 PDF 파일대로 썸네일 생성
98
+ if (mainDrawingAttatchment) {
99
+ const mainDrawingUpload = await buildingLevel.mainDrawingUpload;
100
+ const pdfPath = `/${attachment_base_1.ATTACHMENT_PATH}/${mainDrawingAttatchment.path}`;
101
+ const fileName = mainDrawingUpload.filename.replace('.pdf', '');
102
+ const pngFile = await (0, headless_pdf_to_image_1.pdfToImage)({ pdfPath, fileName });
103
+ await createAttachmentAfterDelete(context, pngFile, buildingLevel.id, building_complex_1.BuildingLevel.name + '_mainDrawing_image');
104
+ const pngThumbnailFile = await (0, headless_pdf_to_image_1.pdfToImage)({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } });
105
+ await createAttachmentAfterDelete(context, pngThumbnailFile, buildingLevel.id, building_complex_1.BuildingLevel.name + '_mainDrawing_thumbnail');
125
106
  }
126
- }
127
- // 4. 동별 도면 이미지 저장 (null로 오면 삭제만)
128
- if ((building === null || building === void 0 ? void 0 : building.drawingUpload) !== undefined) {
129
- await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [building.id] }, context);
130
- if (building === null || building === void 0 ? void 0 : building.drawingUpload) {
131
- await (0, attachment_base_1.createAttachment)(null, {
132
- attachment: {
133
- file: building.drawingUpload,
134
- refType: building_complex_1.Building.name,
135
- refBy: building.id
136
- }
137
- }, context);
107
+ // 3-1. 입면도 파일 저장
108
+ const elevationDrawingAttatchment = await createAttachmentAfterDelete(context, buildingLevel.elevationDrawingUpload, buildingLevel.id, building_complex_1.BuildingLevel.name + '_elevationDrawing');
109
+ if (elevationDrawingAttatchment) {
110
+ const elevationDrawingUpload = await buildingLevel.elevationDrawingUpload;
111
+ const pdfPath = `/${attachment_base_1.ATTACHMENT_PATH}/${elevationDrawingAttatchment.path}`;
112
+ const fileName = elevationDrawingUpload.filename.replace('.pdf', '');
113
+ const pngThumbnailFile = await (0, headless_pdf_to_image_1.pdfToImage)({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } });
114
+ await createAttachmentAfterDelete(context, pngThumbnailFile, buildingLevel.id, building_complex_1.BuildingLevel.name + '_elevationDrawing_thumbnail');
138
115
  }
116
+ // 3-2. 철근배분도 파일 저장
117
+ const rebarDistributionDrawingAttatchment = await createAttachmentAfterDelete(context, buildingLevel.rebarDistributionDrawingUpload, buildingLevel.id, building_complex_1.BuildingLevel.name + '_rebarDistributionDrawing');
118
+ if (rebarDistributionDrawingAttatchment) {
119
+ const rebarDistributionDrawingUpload = await buildingLevel.rebarDistributionDrawingUpload;
120
+ const pdfPath = `/${attachment_base_1.ATTACHMENT_PATH}/${rebarDistributionDrawingAttatchment.path}`;
121
+ const fileName = rebarDistributionDrawingUpload.filename.replace('.pdf', '');
122
+ const pngThumbnailFile = await (0, headless_pdf_to_image_1.pdfToImage)({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } });
123
+ await createAttachmentAfterDelete(context, pngThumbnailFile, buildingLevel.id, building_complex_1.BuildingLevel.name + '_rebarDistributionDrawing_thumbnail');
124
+ }
125
+ // 3-3. 층 업데이트 시간 갱신
126
+ await buildingLevelRepo.save(Object.assign(Object.assign({}, buildingLevel), { updater: user }));
139
127
  }
128
+ // 4. 동별 도면 이미지 저장
129
+ await createAttachmentAfterDelete(context, building === null || building === void 0 ? void 0 : building.drawingUpload, building.id, building_complex_1.Building.name);
130
+ // 4-1. 동 업데이트 시간 갱신
131
+ await buildingRepo.save(Object.assign(Object.assign({}, building), { updater: user }));
140
132
  }
141
133
  return projectResult;
142
134
  }
@@ -187,4 +179,18 @@ ProjectMutation = tslib_1.__decorate([
187
179
  (0, type_graphql_1.Resolver)(project_1.Project)
188
180
  ], ProjectMutation);
189
181
  exports.ProjectMutation = ProjectMutation;
182
+ async function createAttachmentAfterDelete(context, file, refBy, refType) {
183
+ let result = null;
184
+ // undefined = 기존 파일 그대로
185
+ if (file === undefined)
186
+ return result;
187
+ // 기존 첨부 파일이 있으면 삭제
188
+ await (0, attachment_base_1.deleteAttachmentsByRef)(null, { refBys: [refBy], refType }, context);
189
+ // 파일이 있으면 생성 (null로 들어올 경우 delete까지만)
190
+ if (file) {
191
+ result = await (0, attachment_base_1.createAttachment)(null, { attachment: { file, refType, refBy } }, context);
192
+ }
193
+ return result;
194
+ }
195
+ exports.createAttachmentAfterDelete = createAttachmentAfterDelete;
190
196
  //# sourceMappingURL=project-mutation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-mutation.js","sourceRoot":"","sources":["../../../server/service/project/project-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Args, Ctx, Directive } from 'type-graphql'\nimport { In, Not } from 'typeorm'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\n\nimport { Project } from './project'\nimport { NewProject, ProjectPatch } from './project-type'\nimport { BuildingComplex, Building, BuildingLevel } from '@dssp/building-complex'\n\n@Resolver(Project)\nexport class ProjectMutation {\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 생성' })\n async createProject(@Arg('project') project: NewProject, @Ctx() context: ResolverContext): Promise<Project> {\n const { domain, user, tx } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n\n const newBuildingComplex = await buildingComplexRepo.save({\n domain,\n creator: user,\n updater: user\n })\n\n const result = await projectRepo.save({\n name: project.name,\n buildingComplex: newBuildingComplex,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 업데이트' })\n async updateProject(@Arg('project') project: ProjectPatch, @Ctx() context: ResolverContext): Promise<Project> {\n const { user, tx } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n const buildingRepo = tx.getRepository(Building)\n const buildingLevelRepo = tx.getRepository(BuildingLevel)\n\n const buildingComplex = project.buildingComplex\n const buildings = project.buildingComplex?.buildings || []\n\n // 1. 프로젝트 수정\n const projectResult = await projectRepo.save({ ...project, updater: user })\n\n // 2. 단지 정보 수정\n await buildingComplexRepo.save({ ...buildingComplex, updater: user })\n\n // 2-1. 프로젝트 메인 이미지 첨부파일 나머지 삭제 후 저장 (null로 오면 삭제만)\n if (project.mainPhotoUpload !== undefined) {\n await deleteAttachmentsByRef(null, { refBys: [project.id] }, context)\n\n if (project.mainPhotoUpload) {\n await createAttachment(\n null,\n {\n attachment: {\n file: project.mainPhotoUpload,\n refType: Project.name,\n refBy: project.id\n }\n },\n context\n )\n }\n }\n\n // 2-2. 단지 BIM 이미지 첨부파일 나머지 삭제 후 저장 (null로 오면 삭제만)\n if (buildingComplex.drawingUpload !== undefined) {\n await deleteAttachmentsByRef(null, { refBys: [buildingComplex.id] }, context)\n\n if (buildingComplex.drawingUpload) {\n await createAttachment(\n null,\n {\n attachment: {\n file: buildingComplex.drawingUpload,\n refType: BuildingComplex.name,\n refBy: buildingComplex.id\n }\n },\n context\n )\n }\n }\n\n // 3. 동의 층 정보가 바뀌었으면 층 초기화 후 다시 생성\n const originBuilding = await buildingRepo.findBy({ buildingComplex: { id: buildingComplex.id } }) // 이전 동 정보 가져오기\n const afterBuilding = buildings.reduce((acc, building) => ({ ...acc, [building.name]: building.floorCount }), {}) // 비교용으로 수정된 동 정보 데이터 파싱\n const isBuidlingChanged = originBuilding.some(building => afterBuilding[building.name] !== building.floorCount) // 층 개수가 달라진 동이 있는지 확인\n\n // 동의 층 개수가 달라지면 모든 층의 데이터 제거 후 생성\n if (isBuidlingChanged || originBuilding.length !== buildings.length) {\n // 3-1. 기존 동/층 첨부파일 및 데이터 제거\n const buildingIds = originBuilding.map((building: Building) => building.id)\n const buildingLevels = await buildingLevelRepo.findBy({ building: { id: In(buildingIds) } })\n const buildingLevelIds = buildingLevels.map((buildingLevel: BuildingLevel) => buildingLevel.id)\n\n await buildingLevelRepo.softDelete({ building: { id: In(buildingIds) } })\n await buildingRepo.softDelete({ id: In(buildingIds) })\n await deleteAttachmentsByRef(null, { refBys: [...buildingIds, ...buildingLevelIds] }, context)\n\n buildings.forEach(async (building: Building) => {\n // 3-2. 단지 내 동 정보들 생성\n const newBuilding = await buildingRepo.save({\n buildingComplex: buildingComplex,\n name: building.name,\n floorCount: building.floorCount,\n creator: user\n })\n\n // 3-3. 동별로 for문 돌면서 층 데이터 개수대로 생성\n for (let i = 1; i <= building.floorCount; i++) {\n await buildingLevelRepo.save({ building: newBuilding, floor: i, creator: user })\n }\n })\n }\n\n return projectResult\n }\n\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 도면 업데이트' })\n async updateProjectPlan(@Arg('project') project: ProjectPatch, @Ctx() context: ResolverContext): Promise<Project> {\n const { user, tx } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n const buildingComplex = project.buildingComplex\n const buildings: Building[] = project.buildingComplex?.buildings || []\n\n // 1. 프로젝트 수정 시간 업데이트\n const projectResult = await projectRepo.save({ ...project, updater: user })\n\n // 2. 단지 축척 정보 수정\n await buildingComplexRepo.save({ ...buildingComplex, updater: user })\n\n for (let buildingKey in buildings) {\n const building = buildings[buildingKey]\n\n for (let buildingLevelKey in building.buildingLevels) {\n const buildingLevel = building.buildingLevels[buildingLevelKey]\n\n // 3. 층별 도면 이미지 저장 (null로 오면 삭제만)\n if (buildingLevel?.mainDrawingUpload !== undefined) {\n await deleteAttachmentsByRef(null, { refBys: [buildingLevel.id] }, context)\n\n if (buildingLevel?.mainDrawingUpload) {\n await createAttachment(\n null,\n {\n attachment: {\n file: buildingLevel.mainDrawingUpload,\n refType: BuildingLevel.name,\n refBy: buildingLevel.id\n }\n },\n context\n )\n }\n }\n }\n\n // 4. 동별 도면 이미지 저장 (null로 오면 삭제만)\n if (building?.drawingUpload !== undefined) {\n await deleteAttachmentsByRef(null, { refBys: [building.id] }, context)\n\n if (building?.drawingUpload) {\n await createAttachment(\n null,\n {\n attachment: {\n file: building.drawingUpload,\n refType: Building.name,\n refBy: building.id\n }\n },\n context\n )\n }\n }\n }\n\n return projectResult\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete Project' })\n async deleteProject(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Project).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"project-mutation.js","sourceRoot":"","sources":["../../../server/service/project/project-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { createAttachment, deleteAttachmentsByRef, ATTACHMENT_PATH } from '@things-factory/attachment-base'\nimport { Project } from './project'\nimport { NewProject, ProjectPatch } from './project-type'\nimport { BuildingComplex, Building, BuildingLevel } from '@dssp/building-complex'\nimport { pdfToImage } from '@things-factory/board-service/dist-server/controllers/headless-pdf-to-image'\n\n@Resolver(Project)\nexport class ProjectMutation {\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 생성' })\n async createProject(@Arg('project') project: NewProject, @Ctx() context: ResolverContext): Promise<Project> {\n const { domain, user, tx } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n\n const newBuildingComplex = await buildingComplexRepo.save({\n domain,\n creator: user,\n updater: user\n })\n\n const result = await projectRepo.save({\n name: project.name,\n buildingComplex: newBuildingComplex,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 업데이트' })\n async updateProject(@Arg('project') project: ProjectPatch, @Ctx() context: ResolverContext): Promise<Project> {\n const { user, tx } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n const buildingRepo = tx.getRepository(Building)\n const buildingLevelRepo = tx.getRepository(BuildingLevel)\n\n const buildingComplex = project.buildingComplex\n const buildings = project.buildingComplex?.buildings || []\n\n // 1. 프로젝트 수정\n const projectResult = await projectRepo.save({ ...project, updater: user })\n\n // 2. 단지 정보 수정\n await buildingComplexRepo.save({ ...buildingComplex, updater: user })\n\n // 2-1. 프로젝트 메인 이미지 첨부파일 나머지 삭제 후 저장\n await createAttachmentAfterDelete(context, project?.mainPhotoUpload, project.id, Project.name)\n\n // 2-2. 단지 BIM 이미지 첨부파일 나머지 삭제 후 저장\n await createAttachmentAfterDelete(context, buildingComplex?.drawingUpload, buildingComplex.id, BuildingComplex.name)\n\n // 3. 동의 층 정보가 바뀌었으면 층 초기화 후 다시 생성\n const originBuilding = await buildingRepo.findBy({ buildingComplex: { id: buildingComplex.id } }) // 이전 동 정보 가져오기\n const afterBuilding = buildings.reduce((acc, building) => ({ ...acc, [building.name]: building.floorCount }), {}) // 비교용으로 수정된 동 정보 데이터 파싱\n const isBuidlingChanged = originBuilding.some(building => afterBuilding[building.name] !== building.floorCount) // 층 개수가 달라진 동이 있는지 확인\n\n // 동의 층 개수가 달라지면 모든 층의 데이터 제거 후 생성\n if (isBuidlingChanged || originBuilding.length !== buildings.length) {\n // 3-1. 기존 동/층 첨부파일 및 데이터 제거\n const buildingIds = originBuilding.map((building: Building) => building.id)\n const buildingLevels = await buildingLevelRepo.findBy({ building: { id: In(buildingIds) } })\n const buildingLevelIds = buildingLevels.map((buildingLevel: BuildingLevel) => buildingLevel.id)\n\n await buildingLevelRepo.softDelete({ building: { id: In(buildingIds) } })\n await buildingRepo.softDelete({ id: In(buildingIds) })\n await deleteAttachmentsByRef(null, { refBys: [...buildingIds, ...buildingLevelIds] }, context)\n\n // 3-2. 단지 내 동 정보들 생성\n for (let buildingKey in buildings) {\n const building = buildings[buildingKey]\n const newBuilding = await buildingRepo.save({\n buildingComplex: buildingComplex,\n name: building.name,\n floorCount: building.floorCount,\n creator: user\n })\n\n // 3-3. 동별로 for문 돌면서 층 데이터 개수대로 생성\n for (let i = 1; i <= building.floorCount; i++) {\n await buildingLevelRepo.save({ building: newBuilding, floor: i, creator: user })\n }\n }\n }\n\n return projectResult\n }\n\n @Directive('@transaction')\n @Mutation(returns => Project, { description: '프로젝트 도면 업데이트' })\n async updateProjectPlan(@Arg('project') project: ProjectPatch, @Ctx() context: ResolverContext): Promise<Project> {\n const { user, tx, domain } = context.state\n const projectRepo = tx.getRepository(Project)\n const buildingComplexRepo = tx.getRepository(BuildingComplex)\n const buildingRepo = tx.getRepository(Building)\n const buildingLevelRepo = tx.getRepository(BuildingLevel)\n const buildingComplex = project.buildingComplex\n const buildings = project.buildingComplex?.buildings || []\n\n // 1. 프로젝트 수정 시간 업데이트\n const projectResult = await projectRepo.save({ ...project, updater: user })\n\n // 2. 단지 축척 정보 수정\n await buildingComplexRepo.save({ ...buildingComplex, updater: user })\n\n for (let buildingKey in buildings) {\n const building = buildings[buildingKey]\n\n for (let buildingLevelKey in building.buildingLevels) {\n const buildingLevel = building.buildingLevels[buildingLevelKey]\n\n // 3. 층별 도면 이미지 저장\n const mainDrawingAttatchment = await createAttachmentAfterDelete(\n context,\n buildingLevel.mainDrawingUpload,\n buildingLevel.id,\n BuildingLevel.name + '_mainDrawing'\n )\n // 첨부된 PDF가 있으면 PDF 파일대로 썸네일 생성\n if (mainDrawingAttatchment) {\n const mainDrawingUpload = await buildingLevel.mainDrawingUpload\n const pdfPath = `/${ATTACHMENT_PATH}/${mainDrawingAttatchment.path}`\n const fileName = mainDrawingUpload.filename.replace('.pdf', '')\n const pngFile = await pdfToImage({ pdfPath, fileName })\n await createAttachmentAfterDelete(context, pngFile, buildingLevel.id, BuildingLevel.name + '_mainDrawing_image')\n\n const pngThumbnailFile = await pdfToImage({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } })\n await createAttachmentAfterDelete(\n context,\n pngThumbnailFile,\n buildingLevel.id,\n BuildingLevel.name + '_mainDrawing_thumbnail'\n )\n }\n\n // 3-1. 입면도 파일 저장\n const elevationDrawingAttatchment = await createAttachmentAfterDelete(\n context,\n buildingLevel.elevationDrawingUpload,\n buildingLevel.id,\n BuildingLevel.name + '_elevationDrawing'\n )\n if (elevationDrawingAttatchment) {\n const elevationDrawingUpload = await buildingLevel.elevationDrawingUpload\n const pdfPath = `/${ATTACHMENT_PATH}/${elevationDrawingAttatchment.path}`\n const fileName = elevationDrawingUpload.filename.replace('.pdf', '')\n const pngThumbnailFile = await pdfToImage({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } })\n await createAttachmentAfterDelete(\n context,\n pngThumbnailFile,\n buildingLevel.id,\n BuildingLevel.name + '_elevationDrawing_thumbnail'\n )\n }\n\n // 3-2. 철근배분도 파일 저장\n const rebarDistributionDrawingAttatchment = await createAttachmentAfterDelete(\n context,\n buildingLevel.rebarDistributionDrawingUpload,\n buildingLevel.id,\n BuildingLevel.name + '_rebarDistributionDrawing'\n )\n if (rebarDistributionDrawingAttatchment) {\n const rebarDistributionDrawingUpload = await buildingLevel.rebarDistributionDrawingUpload\n const pdfPath = `/${ATTACHMENT_PATH}/${rebarDistributionDrawingAttatchment.path}`\n const fileName = rebarDistributionDrawingUpload.filename.replace('.pdf', '')\n const pngThumbnailFile = await pdfToImage({ pdfPath, fileName, defaultViewport: { width: 300, height: 200 } })\n await createAttachmentAfterDelete(\n context,\n pngThumbnailFile,\n buildingLevel.id,\n BuildingLevel.name + '_rebarDistributionDrawing_thumbnail'\n )\n }\n\n // 3-3. 층 업데이트 시간 갱신\n await buildingLevelRepo.save({ ...buildingLevel, updater: user })\n }\n\n // 4. 동별 도면 이미지 저장\n await createAttachmentAfterDelete(context, building?.drawingUpload, building.id, Building.name)\n\n // 4-1. 동 업데이트 시간 갱신\n await buildingRepo.save({ ...building, updater: user })\n }\n\n return projectResult\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete Project' })\n async deleteProject(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(Project).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n}\n\nexport async function createAttachmentAfterDelete(context: ResolverContext, file: any, refBy: any, refType: any) {\n let result = null\n\n // undefined = 기존 파일 그대로\n if (file === undefined) return result\n\n // 기존 첨부 파일이 있으면 삭제\n await deleteAttachmentsByRef(null, { refBys: [refBy], refType }, context)\n\n // 파일이 있으면 생성 (null로 들어올 경우 delete까지만)\n if (file) {\n result = await createAttachment(null, { attachment: { file, refType, refBy } }, context)\n }\n\n return result\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ import { Project } from './project';
4
+ import { InspectionSummary, ProjectList } from './project-type';
5
+ import { BuildingComplex } from '@dssp/building-complex';
6
+ import { Attachment } from '@things-factory/attachment-base';
7
+ export declare class ProjectQuery {
8
+ project(id: string, context: ResolverContext): Promise<Project>;
9
+ projects(projectName: string, context: ResolverContext): Promise<ProjectList>;
10
+ inspectionSummary(projectId: string, context: ResolverContext): Promise<InspectionSummary>;
11
+ mainPhoto(project: Project): Promise<string | Attachment>;
12
+ buildingComplex(project: Project): Promise<BuildingComplex>;
13
+ domain(project: Project): Promise<Domain>;
14
+ updater(project: Project): Promise<User>;
15
+ creator(project: Project): Promise<User>;
16
+ }
@@ -37,9 +37,9 @@ let ProjectQuery = class ProjectQuery {
37
37
  const { domain } = context.state;
38
38
  const queryBuilder = (0, shell_1.getRepository)(project_1.Project)
39
39
  .createQueryBuilder('p')
40
- .select(`COUNT(CASE WHEN bi.type="${building_complex_1.InspectionType.REQUEST}" THEN 1 ELSE NULL END) AS request`)
41
- .addSelect(`COUNT(CASE WHEN bi.type="${building_complex_1.InspectionType.PASS}" THEN 1 ELSE NULL END) AS pass`)
42
- .addSelect(`COUNT(CASE WHEN bi.type="${building_complex_1.InspectionType.FAIL}" THEN 1 ELSE NULL END) AS fail`)
40
+ .select(`COUNT(CASE WHEN bi.status='${building_complex_1.InspectionStatus.REQUEST}' THEN 1 ELSE NULL END) AS request`)
41
+ .addSelect(`COUNT(CASE WHEN bi.status='${building_complex_1.InspectionStatus.PASS}' THEN 1 ELSE NULL END) AS pass`)
42
+ .addSelect(`COUNT(CASE WHEN bi.status='${building_complex_1.InspectionStatus.FAIL}' THEN 1 ELSE NULL END) AS fail`)
43
43
  .innerJoin('p.buildingComplex', 'bc')
44
44
  .innerJoin('bc.buildings', 'b')
45
45
  .innerJoin('b.buildingLevels', 'bl')