@7365admin1/module-hygiene 4.6.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/models/hygiene-base.model.ts","../src/repositories/hygiene-dashboard.repository.ts","../src/controllers/hygiene-dashboard.controller.ts","../src/models/hygiene-area.model.ts","../src/repositories/hygiene-area.repository.ts","../src/utils/capitalize-text.ts","../src/services/hygiene-area.service.ts","../src/services/hygiene-area-export.service.ts","../src/repositories/hygiene-unit.repository.ts","../src/models/hygiene-unit.model.ts","../src/controllers/hygiene-area.controller.ts","../src/utils/convert-excel.util.ts","../src/services/hygiene-unit.service.ts","../src/services/hygiene-unit-export.service.ts","../src/controllers/hygiene-unit.controller.ts","../src/models/hygiene-parent-checklist.model.ts","../src/repositories/hygiene-parent-checklist.repository.ts","../src/controllers/hygiene-parent-checklist.controller.ts","../src/models/hygiene-area-checklist.model.ts","../src/services/hygiene-area-checklist.service.ts","../src/repositories/hygiene-area-checklist.repository.ts","../src/controllers/hygiene-area-checklist.controller.ts","../src/models/hygiene-supply.model.ts","../src/repositories/hygiene-supply.repository.ts","../src/controllers/hygiene-supply.controller.ts","../src/models/hygiene-stock.model.ts","../src/repositories/hygiene-stock.repository.ts","../src/services/hygiene-stock.service.ts","../src/controllers/hygiene-stock.controller.ts","../src/models/hygiene-checkout-item.model.ts","../src/repositories/hygiene-checkout-item.repository.ts","../src/services/hygiene-checkout-item.service.ts","../src/controllers/hygiene-checkout-item.controller.ts","../src/models/hygiene-schedule-task.model.ts","../src/repositories/hygiene-schedule-task.repository.ts","../src/services/hygiene-schedule-task.service.ts","../src/controllers/hygiene-schedule-task.controller.ts","../src/services/hygiene-qr.service.ts","../src/controllers/hygiene-qr.controller.ts"],"sourcesContent":["export const allowedTypes: string[] = [\"common\", \"toilet\"];\n\nexport const allowedStatus: string[] = [\"ready\", \"ongoing\", \"completed\"];\n\nexport const allowedPeriods: string[] = [\"today\", \"thisWeek\", \"thisMonth\"];\n","import moment from \"moment-timezone\";\nimport { ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n BadRequestError,\n useCache,\n makeCacheKey,\n logger,\n} from \"@7365admin1/node-server-utils\";\nimport { allowedPeriods } from \"../models/hygiene-base.model\";\n\nexport function useHygieneDashboardRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const dashboard_namespace_collection = \"hygiene.dashboard\";\n const feedback_namespace_collection = \"feedbacks\";\n const cleaning_schedule_namespace_collection = \"site.cleaning.schedules\";\n const area_checklist_namespace_collection = \"site.cleaning.schedule.areas\";\n const schedule_task_namespace_collection = \"site.schedule-tasks\";\n const supply_namespace_collection = \"site.supplies\";\n const request_item_namespace_collection = \"site.supply.requests\";\n\n const feedbackCollection = db.collection(feedback_namespace_collection);\n const areaChecklistCollection = db.collection(\n area_checklist_namespace_collection,\n );\n const scheduleTaskCollection = db.collection(\n schedule_task_namespace_collection,\n );\n const supplyCollection = db.collection(supply_namespace_collection);\n const requestItemCollection = db.collection(\n request_item_namespace_collection,\n );\n\n const { setCache, getCache } = useCache(dashboard_namespace_collection);\n\n async function getHygieneDashboard({\n site,\n feedbackPeriod = \"today\",\n commonAreaPeriod = \"today\",\n toiletAreaPeriod = \"today\",\n scheduleTaskPeriod = \"today\",\n supplyPeriod = \"today\",\n requestItemPeriod = \"today\",\n }: {\n site: string | ObjectId;\n feedbackPeriod?: (typeof allowedPeriods)[number];\n commonAreaPeriod?: (typeof allowedPeriods)[number];\n toiletAreaPeriod?: (typeof allowedPeriods)[number];\n scheduleTaskPeriod?: (typeof allowedPeriods)[number];\n supplyPeriod?: (typeof allowedPeriods)[number];\n requestItemPeriod?: (typeof allowedPeriods)[number];\n }) {\n const countQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n const yesterDayQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n const todayQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n\n const cacheOptions: Record<string, any> = {\n feedbackPeriod,\n commonAreaPeriod,\n toiletAreaPeriod,\n scheduleTaskPeriod,\n supplyPeriod,\n requestItemPeriod,\n };\n\n try {\n site = new ObjectId(site);\n Object.keys(countQueries).forEach((key) => {\n countQueries[key].site = site;\n yesterDayQueries[key].site = site;\n todayQueries[key].site = site;\n });\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const dashboardCacheKey = makeCacheKey(\n dashboard_namespace_collection,\n cacheOptions,\n );\n\n const cachedDashboard = await getCache(dashboardCacheKey);\n if (cachedDashboard) {\n logger.info(`Cache hit for dashboard: ${dashboardCacheKey}`);\n return cachedDashboard;\n }\n\n function formatEndDate(date: string | Date): Date {\n if (typeof date === \"string\") {\n const dateWithoutTimezone = date.replace(/\\s*\\+\\d{2}:\\d{2}$/, \"\");\n date = new Date(dateWithoutTimezone);\n }\n const singaporeMoment = moment.tz(date, \"Asia/Singapore\");\n singaporeMoment.set({\n hour: 23,\n minute: 59,\n second: 59,\n millisecond: 999,\n });\n return singaporeMoment.toDate();\n }\n\n function applyPeriodToQuery(query: Record<string, any>, period: string) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (period === \"today\") {\n query.createdAt = {\n $gte: today,\n $lte: formatEndDate(today),\n };\n } else if (period === \"thisWeek\" || period === \"thisMonth\") {\n const filterDate = period === \"thisWeek\" ? 7 : 30;\n const filterStartDate = new Date();\n filterStartDate.setDate(today.getDate() - filterDate);\n filterStartDate.setHours(0, 0, 0, 0);\n query.createdAt = {\n $gte: filterStartDate,\n $lte: formatEndDate(new Date()),\n };\n }\n }\n\n try {\n applyPeriodToQuery(countQueries.feedback, feedbackPeriod);\n applyPeriodToQuery(countQueries.commonArea, commonAreaPeriod);\n applyPeriodToQuery(countQueries.toiletArea, toiletAreaPeriod);\n applyPeriodToQuery(countQueries.scheduleTask, scheduleTaskPeriod);\n applyPeriodToQuery(countQueries.supply, supplyPeriod);\n applyPeriodToQuery(countQueries.requestItem, requestItemPeriod);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const yesterdayEnd = new Date(yesterday);\n yesterdayEnd.setHours(23, 59, 59, 999);\n\n Object.keys(yesterDayQueries).forEach((key) => {\n yesterDayQueries[key].createdAt = {\n $gte: yesterday,\n $lte: yesterdayEnd,\n };\n });\n Object.keys(todayQueries).forEach((key) => {\n todayQueries[key].createdAt = {\n $gte: today,\n $lte: formatEndDate(new Date()),\n };\n });\n\n const calculatePercentageChange = (\n currentCount: number,\n previousCount: number,\n ) => {\n if (previousCount === 0) {\n return currentCount > 0 ? 100 : 0;\n }\n return (\n Math.round(\n ((currentCount - previousCount) / previousCount) * 100 * 100,\n ) / 100\n );\n };\n\n const [\n feedbackReport,\n commonAreaChecklistReport,\n toiletAreaChecklistReport,\n scheduleTaskReport,\n supplyReport,\n requestItemReport,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...countQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: countQueries.commonArea.createdAt\n ? [\n {\n $match: {\n site: site,\n createdAt: countQueries.commonArea.createdAt,\n },\n },\n ]\n : [{ $match: { site: site } }],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: countQueries.toiletArea.createdAt\n ? [\n {\n $match: {\n site: site,\n createdAt: countQueries.toiletArea.createdAt,\n },\n },\n ]\n : [{ $match: { site: site } }],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: countQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: countQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: countQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const [\n yesterdayFeedbackCount,\n yesterdayCommonAreaChecklistCount,\n yesterdayToiletAreaChecklistCount,\n yesterdayScheduledTaskCount,\n yesterdaySupplyCount,\n yesterdayRequestItemCount,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...yesterDayQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: yesterDayQueries.commonArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: yesterDayQueries.toiletArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: yesterDayQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: yesterDayQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: yesterDayQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const [\n todayFeedbackCount,\n todayCommonAreaChecklistCount,\n todayToiletAreaChecklistCount,\n todayScheduledTaskCount,\n todaySupplyCount,\n todayRequestItemCount,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...todayQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: todayQueries.commonArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: todayQueries.toiletArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: todayQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: todayQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: todayQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const resultYesterday = {\n feedbackCount: yesterdayFeedbackCount[0]?.count || 0,\n commonAreaChecklistCount:\n yesterdayCommonAreaChecklistCount[0]?.count || 0,\n toiletAreaChecklistCount:\n yesterdayToiletAreaChecklistCount[0]?.count || 0,\n scheduleTaskCount: yesterdayScheduledTaskCount[0]?.count || 0,\n supplyCount: yesterdaySupplyCount[0]?.count || 0,\n requestItemCount: yesterdayRequestItemCount[0]?.count || 0,\n };\n\n const resultToday = {\n feedbackCount: todayFeedbackCount[0]?.count || 0,\n commonAreaChecklistCount: todayCommonAreaChecklistCount[0]?.count || 0,\n toiletAreaChecklistCount: todayToiletAreaChecklistCount[0]?.count || 0,\n scheduleTaskCount: todayScheduledTaskCount[0]?.count || 0,\n supplyCount: todaySupplyCount[0]?.count || 0,\n requestItemCount: todayRequestItemCount[0]?.count || 0,\n };\n\n const result = {\n feedback: {\n count: feedbackReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.feedbackCount,\n resultYesterday.feedbackCount,\n ),\n },\n commonAreaChecklist: {\n count: commonAreaChecklistReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.commonAreaChecklistCount,\n resultYesterday.commonAreaChecklistCount,\n ),\n },\n toiletAreaChecklist: {\n count: toiletAreaChecklistReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.toiletAreaChecklistCount,\n resultYesterday.toiletAreaChecklistCount,\n ),\n },\n scheduleTask: {\n count: scheduleTaskReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.scheduleTaskCount,\n resultYesterday.scheduleTaskCount,\n ),\n },\n supply: {\n count: supplyReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.supplyCount,\n resultYesterday.supplyCount,\n ),\n },\n requestItem: {\n count: requestItemReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.requestItemCount,\n resultYesterday.requestItemCount,\n ),\n },\n };\n\n setCache(dashboardCacheKey, result, 15 * 60)\n .then(() => {\n logger.info(`Cache set for dashboard: ${dashboardCacheKey}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to set cache for dashboard: ${dashboardCacheKey}`,\n err,\n );\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n getHygieneDashboard,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedPeriods } from \"../models/hygiene-base.model\";\nimport { useHygieneDashboardRepository } from \"../repositories/hygiene-dashboard.repository\";\n\nexport function useHygieneDashboardController() {\n const { getHygieneDashboard: _getHygieneDashboard } =\n useHygieneDashboardRepository();\n\n async function getHygieneDashboard(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n feedbackPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n commonAreaPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n toiletAreaPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n scheduleTaskPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n supplyPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n requestItemPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const site = (req.params.site as string) ?? \"\";\n const feedbackPeriod =\n (req.query.feedbackPeriod as (typeof allowedPeriods)[number]) || \"today\";\n const commonAreaPeriod =\n (req.query.commonAreaPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const toiletAreaPeriod =\n (req.query.toiletAreaPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const scheduleTaskPeriod =\n (req.query.scheduleTaskPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const supplyPeriod =\n (req.query.supplyPeriod as (typeof allowedPeriods)[number]) || \"today\";\n const requestItemPeriod =\n (req.query.requestItemPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n\n try {\n const data = await _getHygieneDashboard({\n site,\n feedbackPeriod,\n commonAreaPeriod,\n toiletAreaPeriod,\n scheduleTaskPeriod,\n supplyPeriod,\n requestItemPeriod,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n getHygieneDashboard,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedTypes } from \"./hygiene-base.model\";\n\nexport type TAreaUnits = {\n unit: string | ObjectId;\n name: string;\n};\n\nexport type TArea = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n set?: number;\n units?: TAreaUnits[];\n status?: \"active\" | \"deleted\";\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport type TAreaCreate = Pick<\n TArea,\n \"site\" | \"name\" | \"type\" | \"set\" | \"units\"\n>;\n\nexport type TAreaGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number] | \"all\";\n} & Pick<TArea, \"site\">;\n\nexport type TAreaUpdate = Partial<\n Pick<TArea, \"name\" | \"type\" | \"set\" | \"units\">\n>;\n\nexport type TAreaUpdateChecklist = {\n units: TAreaUnits[];\n};\n\nexport const areaSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).optional(),\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n});\n\nexport function MArea(value: TAreaCreate) {\n const { error } = areaSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.units && Array.isArray(value.units)) {\n value.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n return {\n site: value.site,\n name: value.name,\n type: value.type,\n set: value.set ?? 0,\n units: value.units ?? [],\n status: \"active\",\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport { capitalizeText } from \"../utils/capitalize-text\";\nimport {\n MArea,\n TAreaCreate,\n TAreaGetQuery,\n TAreaUpdate,\n} from \"../models/hygiene-area.model\";\n\nexport function useAreaRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { \"units.unit\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene area.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene area.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, type: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\",\n );\n }\n }\n\n async function createArea(value: TAreaCreate, session?: ClientSession) {\n try {\n value = MArea(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\n `${capitalizeText(value.type)} area already exists.`,\n );\n }\n\n throw error;\n }\n }\n\n async function getAreas({\n page = 1,\n limit = 10,\n search = \"\",\n type = \"all\",\n site,\n }: TAreaGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (type && type !== \"all\") {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n set: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreasForChecklist(site: string | ObjectId) {\n const query: Record<string, any> = { status: { $ne: \"deleted\" } };\n const cacheOptions: Record<string, any> = {};\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n set: 1,\n units: 1,\n },\n },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n type: 1,\n name: 1,\n set: 1,\n units: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaByMultipleId(_id: string[] | ObjectId[]) {\n for (let i = 0; i < _id.length; i++) {\n try {\n _id[i] = new ObjectId(_id[i]);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n }\n\n const query: Record<string, any> = {\n _id: { $in: _id },\n status: { $ne: \"deleted\" },\n };\n\n try {\n const data = await collection.aggregate([{ $match: query }]).toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function verifyAreaByUnitId(unitId: string | ObjectId) {\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n const query: Record<string, any> = {\n \"units.unit\": unitId,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n verify_unitId: unitId.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const count = await collection.countDocuments(query);\n const result = count > 0;\n\n setCache(cacheKey, result, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateArea(\n _id: string | ObjectId,\n value: TAreaUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue: any = {\n updatedAt: new Date(),\n };\n\n if (value.name !== undefined) {\n updateValue.name = value.name;\n }\n\n if (value.type !== undefined) {\n updateValue.type = value.type;\n }\n\n if (value.set !== undefined) {\n updateValue.set = value.set;\n }\n\n if (value.units && Array.isArray(value.units)) {\n updateValue.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n unitId: string | ObjectId,\n name: string,\n session?: ClientSession,\n ) {\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const res = await collection.updateMany(\n { \"units.unit\": unitId },\n {\n $set: {\n \"units.$.name\": name,\n updatedAt: new Date(),\n },\n },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update unit name in areas.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteArea(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createArea,\n getAreas,\n getAreasForChecklist,\n getAreaById,\n getAreaByMultipleId,\n verifyAreaByUnitId,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n };\n}\n","export function capitalizeText(text: string): string {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaExportService } from \"./hygiene-area-export.service\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\n\nexport function useAreaService() {\n const { createArea: _createArea, getAreasForChecklist } = useAreaRepo();\n const { generateAreaExcel } = useAreaExportService();\n const { getUnits: _getUnits } = useUnitRepository();\n\n async function importArea({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n // Fetch all units for this site to match unit names\n let availableUnits: Array<{ _id: ObjectId; name: string }> = [];\n try {\n const unitsData = (await _getUnits({\n page: 1,\n limit: 999999,\n search: \"\",\n site,\n })) as { items: any[]; pages: number };\n\n if (unitsData && unitsData.items) {\n availableUnits = unitsData.items;\n }\n } catch (error) {\n logger.warn(`Failed to fetch units for site: ${error}`);\n // Continue without units if fetch fails\n }\n\n const insertedAreaIds: ObjectId[] = [];\n const duplicateAreas: string[] = [];\n const failedAreas: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.TYPE) {\n logger.warn(`Skipping row ${i + 1} with missing TYPE:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaType = String(row.TYPE).trim().toLowerCase();\n if (!areaType) {\n logger.warn(`Skipping row ${i + 1} with empty area type`);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaNameValue = row?.NAME || row?.AREA;\n if (!areaNameValue) {\n logger.warn(`Skipping row ${i + 1} with missing NAME/AREA:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaName = String(areaNameValue).trim();\n if (!areaName) {\n logger.warn(`Skipping row ${i + 1} with empty ${areaType} area name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n if (areaName.startsWith(\"Sample:\")) {\n logger.warn(`Skipping row ${i + 1} with sample area: ${areaName}`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const areaData: any = {\n type: areaType,\n name: areaName,\n site,\n };\n\n // Handle SET field\n if (row.SET !== undefined && row.SET !== null && row.SET !== \"\") {\n const setNumber = parseInt(String(row.SET).trim());\n if (!isNaN(setNumber) && setNumber >= 0) {\n areaData.set = setNumber;\n }\n }\n\n // Handle UNITS field\n if (row.UNITS && availableUnits.length > 0) {\n const unitNames = String(row.UNITS)\n .split(\",\")\n .map((u) => u.trim())\n .filter((u) => u);\n\n if (unitNames.length > 0) {\n const areaUnits: Array<{ unit: ObjectId; name: string }> = [];\n\n for (const unitName of unitNames) {\n const foundUnit = availableUnits.find(\n (u) => u.name.toLowerCase() === unitName.toLowerCase(),\n );\n\n if (foundUnit) {\n areaUnits.push({\n unit: foundUnit._id,\n name: foundUnit.name,\n });\n } else {\n logger.warn(\n `Unit \"${unitName}\" not found in site for area \"${areaName}\"`,\n );\n }\n }\n\n if (areaUnits.length > 0) {\n areaData.units = areaUnits;\n }\n }\n }\n\n const insertedId = await _createArea(areaData);\n\n insertedAreaIds.push(insertedId);\n\n logger.info(`Successfully created ${areaType} area: ${areaName}`);\n } catch (error: any) {\n logger.error(\n `Error creating ${areaType} area \"${areaName}\": ${error.message}`,\n );\n\n if (error.message.includes(\"duplicate\")) {\n duplicateAreas.push(areaName);\n } else {\n failedAreas.push(areaName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedAreaIds.length} areas successfully created`;\n\n if (duplicateAreas.length > 0) {\n message += `, ${duplicateAreas.length} areas skipped (already exist)`;\n }\n\n if (failedAreas.length > 0) {\n message += `, ${failedAreas.length} areas failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedAreaIds.length === 0) {\n if (\n duplicateAreas.length > 0 &&\n failedAreas.length === 0 &&\n skippedRows.length === 0\n ) {\n return {\n message: `No new areas were created. All ${\n duplicateAreas.length\n } areas already exist in the system: ${duplicateAreas.join(\", \")}`,\n };\n } else if (failedAreas.length > 0) {\n throw new BadRequestError(\n `No areas were created. ${failedAreas.length} areas failed due to errors. Please check your data format and ensure area names are valid.`,\n );\n } else if (skippedRows.length > 0 && duplicateAreas.length === 0) {\n throw new BadRequestError(\n `No areas were created. All ${skippedRows.length} rows contained invalid or missing data.`,\n );\n } else {\n return {\n message: `No new areas were created. ${duplicateAreas.length} areas already exist, ${skippedRows.length} rows had invalid data.`,\n };\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading area information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\",\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`,\n );\n }\n }\n }\n\n async function exportAreas(site: string | ObjectId) {\n try {\n const areas = (await getAreasForChecklist(site)) as any[];\n\n if (!areas || !Array.isArray(areas) || areas.length === 0) {\n throw new BadRequestError(\"No data found to export\");\n }\n\n // Generate Excel file\n const excelBuffer = (await generateAreaExcel(areas)) as Buffer;\n\n if (!excelBuffer || excelBuffer.length === 0) {\n throw new Error(\"Generated Excel file is empty or invalid.\");\n }\n\n return excelBuffer;\n } catch (error: any) {\n logger.error(`Error downloading areas: ${error.message}`);\n throw error;\n }\n }\n\n return { importArea, exportAreas };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport * as xlsx from \"xlsx\";\n\ninterface AreaUnit {\n unit?: string;\n name?: string;\n}\n\ninterface Area {\n _id?: string;\n name?: string;\n type?: string;\n set?: number;\n units?: AreaUnit[];\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n}\n\nexport function useAreaExportService() {\n async function generateAreaExcel(areas: Area[]): Promise<Buffer> {\n try {\n const rows: any[] = [];\n\n rows.push([\"AREA\", \"TYPE\", \"SET\", \"UNITS\"]);\n\n for (const area of areas) {\n const areaName = area.name || \"\";\n const areaType = area.type || \"\";\n const areaSet = String(area.set || 0);\n const unitsString =\n area.units && area.units.length > 0\n ? area.units.map((u) => u.name || \"\").join(\", \")\n : \"\";\n\n rows.push([areaName, areaType, areaSet, unitsString]);\n }\n\n const workbook = xlsx.utils.book_new();\n const worksheet = xlsx.utils.aoa_to_sheet(rows);\n\n worksheet[\"!cols\"] = [\n { width: 30 }, // AREA\n { width: 20 }, // TYPE\n { width: 10 }, // SET\n { width: 40 }, // UNITS\n ];\n\n xlsx.utils.book_append_sheet(workbook, worksheet, \"Areas\");\n\n const excelBuffer = xlsx.write(workbook, {\n type: \"buffer\",\n bookType: \"xlsx\",\n });\n\n return excelBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate area Excel: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateAreaExcel,\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MUnit,\n TUnitGetQuery,\n TUnitUpdate,\n TUnitCreate,\n} from \"../models/hygiene-unit.model\";\n\nexport function useUnitRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.area.unit\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene unit.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene unit.\",\n );\n }\n }\n\n async function createUnit(value: TUnitCreate, session?: ClientSession) {\n try {\n value = MUnit(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Unit already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getUnits({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TUnitGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $project: { name: 1 } },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUnit(\n _id: string | ObjectId,\n value: TUnitUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteUnit(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TUnit = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n status?: \"active\" | \"deleted\";\n};\n\nexport type TUnitCreate = Pick<TUnit, \"site\" | \"name\">;\n\nexport type TUnitGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TUnit, \"site\">;\n\nexport type TUnitUpdate = Pick<TUnit, \"name\">;\n\nexport const unitSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n});\n\nexport function MUnit(value: TUnitCreate) {\n const { error } = unitSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n return {\n site: value.site,\n name: value.name,\n status: \"active\",\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\nimport { areaSchema } from \"../models/hygiene-area.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaService } from \"../services/hygiene-area.service\";\n\nexport function useAreaController() {\n const {\n createArea: _createArea,\n getAreas: _getAreas,\n getAreaById: _getAreaById,\n updateArea: _updateArea,\n deleteArea: _deleteById,\n } = useAreaRepo();\n const { importArea: _importArea, exportAreas: _exportAreas } =\n useAreaService();\n\n async function createArea(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = areaSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createArea(payload);\n\n res.status(201).json({ message: \"Area created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreas(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .valid(\"all\", ...allowedTypes)\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"all\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getAreas({\n page,\n limit,\n search,\n type,\n site,\n });\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getAreaById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateArea(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", null, ...allowedTypes),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required(),\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .optional()\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateArea(id, value);\n\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteArea(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteById(value);\n res.json({ message: \"Area deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importArea(\n req: MulterRequest,\n res: Response,\n next: NextFunction,\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const schema = Joi.string().hex().required();\n\n const { error, value } = schema.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _importArea({ dataJson, site: value });\n\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function exportAreas(req: Request, res: Response, next: NextFunction) {\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const excelBuffer = await _exportAreas(value);\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\n \"Content-Type\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n );\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"areas-${formattedDate}.xlsx\"`,\n );\n res.setHeader(\"Content-Length\", excelBuffer.length);\n\n res.end(excelBuffer);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createArea,\n getAreas,\n getAreaById,\n updateArea,\n deleteArea,\n importArea,\n exportAreas,\n };\n}\n","import { Readable } from \"stream\";\nimport * as xlsx from \"xlsx\";\n\nexport function convertBufferFile(bufferFile: Buffer): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const fileStream = Readable.from(bufferFile);\n\n let fileBuffer = Buffer.alloc(0);\n fileStream.on(\"data\", (chunk) => {\n fileBuffer = Buffer.concat([fileBuffer, chunk]);\n });\n\n fileStream.on(\"end\", () => {\n try {\n const workbook = xlsx.read(fileBuffer, { type: \"buffer\" });\n const sheetName = workbook.SheetNames[0];\n const sheet = workbook.Sheets[sheetName];\n const jsonData = xlsx.utils.sheet_to_json(sheet);\n resolve(jsonData);\n } catch (error) {\n reject(\"Error parsing file\");\n }\n });\n\n fileStream.on(\"error\", (err) => {\n reject(\"Error Reading File: \" + err.message);\n });\n });\n}\n\nexport function calculateTotalHrs(time: number) {\n const totalHrs = time / (1000 * 60 * 60);\n return totalHrs.toFixed(1) + \" Hr\";\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@7365admin1/node-server-utils\";\nimport { TUnitUpdate } from \"../models/hygiene-unit.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { useUnitExportService } from \"./hygiene-unit-export.service\";\n\nexport function useUnitService() {\n const { verifyAreaByUnitId, updateAreaChecklist } = useAreaRepo();\n const {\n createUnit: _createUnit,\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n } = useUnitRepository();\n\n async function importUnit({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const insertedUnitIds: ObjectId[] = [];\n const duplicateUnits: string[] = [];\n const failedUnits: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.UNIT) {\n logger.warn(`Skipping row ${i + 1} with missing UNIT:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const unitName = String(row.UNIT).trim();\n if (!unitName) {\n logger.warn(`Skipping row ${i + 1} with empty unit name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n if (unitName.startsWith(\"Sample:\")) {\n logger.warn(`Skipping row ${i + 1} with sample unit: ${unitName}`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const insertedId = await _createUnit({\n name: unitName,\n site,\n });\n\n insertedUnitIds.push(insertedId);\n\n logger.info(`Successfully created unit: ${unitName}`);\n } catch (error: any) {\n logger.error(`Error creating unit \"${unitName}\": ${error.message}`);\n\n if (error.message.includes(\"Unit already exists\")) {\n duplicateUnits.push(unitName);\n } else {\n failedUnits.push(unitName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedUnitIds.length} units successfully created`;\n\n if (duplicateUnits.length > 0) {\n message += `, ${duplicateUnits.length} units skipped (already exist)`;\n }\n\n if (failedUnits.length > 0) {\n message += `, ${failedUnits.length} units failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedUnitIds.length === 0) {\n if (duplicateUnits.length > 0 && failedUnits.length === 0) {\n throw new BadRequestError(\n `No new units were created. All ${\n duplicateUnits.length\n } units already exist in the system: ${duplicateUnits.join(\", \")}`,\n );\n } else if (failedUnits.length > 0) {\n throw new BadRequestError(\n `No units were created. Please check your data format and ensure unit names are valid.`,\n );\n } else if (skippedRows.length > 0) {\n throw new BadRequestError(\n `No units were created. All rows contained invalid or missing unit names.`,\n );\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading unit information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"duplicate\")) {\n throw new BadRequestError(\n \"Upload failed due to duplicate unit names. Please ensure all unit names are unique.\",\n );\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\",\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`,\n );\n }\n }\n }\n\n async function updateUnit(_id: string | ObjectId, value: TUnitUpdate) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const result = await _updateUnit(_id, value, session);\n\n const isExistingArea = await verifyAreaByUnitId(_id);\n if (isExistingArea) {\n await updateAreaChecklist(_id, value.name, session);\n }\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n logger.error(`Error updating unit and associated areas:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteUnit(_id: string | ObjectId) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const isExistingArea = await verifyAreaByUnitId(_id);\n if (isExistingArea) {\n throw new BadRequestError(\"Failed to delete unit, unit is in use.\");\n }\n\n const result = await _deleteUnit(_id, session);\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n logger.error(`Error deleting unit:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function exportUnits(site: string | ObjectId) {\n const { generateUnitExcel: _generateUnitExcel } = useUnitExportService();\n const { getUnits: _getUnits } = useUnitRepository();\n\n try {\n const data = (await _getUnits({\n page: 1,\n limit: 999999,\n search: \"\",\n site,\n })) as { items: any[]; pages: number; pageRange: string };\n\n if (!data || !data.items || data.items.length === 0) {\n throw new BadRequestError(\"No data found to export\");\n }\n\n // Generate Excel file\n const excelBuffer = await _generateUnitExcel(data.items);\n\n if (!excelBuffer || excelBuffer.length === 0) {\n throw new Error(\"Generated Excel file is empty or invalid.\");\n }\n\n return excelBuffer;\n } catch (error: any) {\n logger.error(`Error downloading units: ${error.message}`);\n throw error;\n }\n }\n\n return { importUnit, updateUnit, deleteUnit, exportUnits };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport * as xlsx from \"xlsx\";\n\ninterface Unit {\n _id?: string;\n name?: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n}\n\nexport function useUnitExportService() {\n async function generateUnitExcel(units: Unit[]): Promise<Buffer> {\n try {\n const rows: any[] = [];\n\n rows.push([\"UNIT\"]);\n\n for (const unit of units) {\n const unitName = unit.name || \"\";\n rows.push([unitName]);\n }\n\n const workbook = xlsx.utils.book_new();\n const worksheet = xlsx.utils.aoa_to_sheet(rows);\n\n worksheet[\"!cols\"] = [\n { width: 25 }, // UNIT\n ];\n\n xlsx.utils.book_append_sheet(workbook, worksheet, \"Units\");\n\n const excelBuffer = xlsx.write(workbook, {\n type: \"buffer\",\n bookType: \"xlsx\",\n });\n\n return excelBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate unit Excel: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateUnitExcel,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { unitSchema } from \"../models/hygiene-unit.model\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { useUnitService } from \"../services/hygiene-unit.service\";\n\nexport function useUnitController() {\n const { createUnit: _createUnit, getUnits: _getUnits } = useUnitRepository();\n const {\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n importUnit: _importUnit,\n exportUnits: _exportUnits,\n } = useUnitService();\n\n async function createUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = unitSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnit(payload);\n\n res.status(201).json({ message: \"Unit created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getUnits(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getUnits({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateUnit(id, value);\n\n res.json({ message: \"Unit updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteUnit(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteUnit(value);\n\n res.json({ message: \"Unit deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importUnit(\n req: MulterRequest,\n res: Response,\n next: NextFunction,\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n\n const result = await _importUnit({ dataJson, site: value });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function exportUnits(req: Request, res: Response, next: NextFunction) {\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const excelBuffer = await _exportUnits(value);\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\n \"Content-Type\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n );\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"units-${formattedDate}.xlsx\"`,\n );\n res.setHeader(\"Content-Length\", excelBuffer.length);\n\n res.end(excelBuffer);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n importUnit,\n exportUnits,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"./hygiene-base.model\";\n\nexport type TParentChecklist = {\n _id?: ObjectId;\n site?: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TParentChecklistGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n startDate?: string | Date;\n endDate?: string | Date;\n} & Pick<TParentChecklist, \"status\">;\n\nexport const parentChecklistSchema = Joi.object({\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().required(),\n});\n\nexport function MParentChecklist(value: TParentChecklist) {\n const { error } = parentChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Parent Checklist Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(`Invalid site ID format: ${value.site}`);\n }\n }\n\n return {\n site: value.site,\n status: \"ready\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n useCache,\n logger,\n makeCacheKey,\n BadRequestError,\n} from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport {\n MParentChecklist,\n TParentChecklist,\n TParentChecklistGetQuery,\n} from \"../models/hygiene-parent-checklist.model\";\n\nexport function useParentChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedules\";\n const site_collection = \"sites\";\n\n const collection = db.collection(namespace_collection);\n const siteCollection = db.collection(site_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { createdAt: 1 } },\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene parent checklist.\",\n );\n }\n }\n\n async function createParentChecklist(\n value: TParentChecklist,\n session?: ClientSession,\n ) {\n try {\n const currentDate = value.createdAt\n ? new Date(value.createdAt)\n : new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingQuery: any = {\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n };\n\n if (value.site) {\n try {\n existingQuery.site = new ObjectId(value.site);\n logger.info(\n `createParentChecklist: Looking for existing checklist with query: ${JSON.stringify(\n { ...existingQuery, site: value.site },\n )}`,\n );\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n } else {\n logger.info(\n `createParentChecklist: Looking for existing checklist with query (no site filter): ${JSON.stringify(\n existingQuery,\n )}`,\n );\n }\n\n const existingChecklist = await collection.findOne(existingQuery);\n\n if (existingChecklist) {\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Parent checklist already exists for ${\n value.site ? `site ${value.site} on` : \"\"\n } today: ${dateStr}. Found checklist: ${JSON.stringify({\n _id: existingChecklist._id,\n site: existingChecklist.site,\n })}`,\n );\n return existingChecklist._id;\n }\n\n if (value.site) {\n const checklistDoc = MParentChecklist({\n site: value.site,\n createdAt: currentDate,\n });\n\n const result = await collection.insertOne(checklistDoc, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created parent checklist for site ${value.site} for today: ${dateStr}`,\n );\n\n return result.insertedId;\n }\n\n const siteIds = await getHygieneSiteIds();\n\n if (!Array.isArray(siteIds)) {\n logger.error(\"getHygieneSiteIds returned non-array value:\", siteIds);\n throw new InternalServerError(\"Failed to retrieve site IDs\");\n }\n\n if (siteIds.length === 0) {\n logger.warn(\"No sites found for creating parent checklist\");\n throw new BadRequestError(\"No sites available for checklist creation\");\n }\n\n const checklistDocs: any[] = [];\n\n for (const site of siteIds) {\n checklistDocs.push(\n MParentChecklist({\n site,\n createdAt: currentDate,\n }),\n );\n }\n\n const result = await collection.insertMany(checklistDocs, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created ${\n Object.keys(result.insertedIds).length\n } parent checklists for today: ${dateStr}`,\n );\n\n return Object.values(result.insertedIds);\n } catch (error) {\n logger.error(\"Failed to create daily parent checklist\", error);\n throw error;\n }\n }\n\n async function getAllParentChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n startDate = \"\",\n endDate = \"\",\n status = \"all\",\n }: TParentChecklistGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n if (status && status !== \"all\") {\n query.status = status;\n cacheOptions.status = status;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [{ $match: query }];\n\n pipeline.push({\n $project: {\n _id: 1,\n site: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n {\n case: { $eq: [\"$status\", \"ongoing\"] },\n then: \"Ongoing\",\n },\n { case: { $eq: [\"$status\", \"completed\"] }, then: \"Completed\" },\n ],\n default: \"$status\",\n },\n },\n completedAt: 1,\n createdAt: 1,\n },\n });\n\n pipeline.push(\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n );\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateParentChecklistStatuses(\n _id: string | ObjectId,\n status: (typeof allowedStatus)[number],\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"completed\") {\n updateValue.completedAt = new Date();\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update parent checklist status.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getHygieneSiteIds() {\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(site_collection, { tag: \"site-ids\" });\n const cachedData = await getCache(cacheKey);\n if (cachedData && Array.isArray(cachedData)) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await siteCollection\n .aggregate([\n { $match: query },\n { $project: { _id: 1 } },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n const siteIds = items.map((item) => item._id.toString());\n\n if (siteIds.length > 0) {\n setCache(cacheKey, siteIds, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n }\n\n return siteIds;\n } catch (error) {\n logger.error(\"Failed to get hygiene site IDs\", error);\n throw error;\n }\n }\n\n return {\n createIndex,\n createParentChecklist,\n getAllParentChecklist,\n updateParentChecklistStatuses,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport { parentChecklistSchema } from \"../models/hygiene-parent-checklist.model\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\n\nexport function useParentChecklistController() {\n const {\n createParentChecklist: _createParentChecklist,\n getAllParentChecklist: _getAllParentChecklist,\n } = useParentChecklistRepo();\n\n async function createParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const payload = req.body;\n\n const { error } = parentChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createParentChecklist(payload);\n res\n .status(201)\n .json({ message: \"Parent checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n status: Joi.string()\n .valid(...allowedStatus, \"all\")\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n const status = (req.query.status as string) ?? \"all\";\n\n try {\n const data = await _getAllParentChecklist({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n status,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createParentChecklist,\n getAllParentChecklist,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus, allowedTypes } from \"./hygiene-base.model\";\n\nexport const allowedChecklistStatus = [\"ready\", \"completed\"];\n\nexport type TCleaningScheduleArea = {\n _id?: ObjectId;\n schedule: string | ObjectId;\n area: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n checklist: TAreaChecklist[];\n status?: (typeof allowedStatus)[number];\n createdBy?: string | ObjectId;\n createdAt?: Date | string;\n completedAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TAreaChecklist = {\n set: number;\n units: TAreaChecklistUnits[];\n};\n\nexport type TAreaChecklistUnits = {\n unit: string | ObjectId;\n name: string;\n approve?: boolean;\n reject?: boolean;\n status?: (typeof allowedChecklistStatus)[number];\n remarks?: string;\n completedBy?: string | ObjectId;\n timestamp?: Date | string;\n};\n\nexport type TAreaChecklistCreate = Pick<\n TCleaningScheduleArea,\n \"schedule\" | \"area\"\n> & {\n site: string | ObjectId;\n};\n\nexport type TAreaChecklistBatchCreate = Pick<\n TCleaningScheduleArea,\n \"schedule\" | \"createdBy\"\n> & {\n site: string | ObjectId;\n};\n\nexport type TCleaningScheduleAreaGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number] | \"all\";\n status?: (typeof allowedStatus)[number] | \"all\";\n} & Pick<TCleaningScheduleArea, \"schedule\">;\n\nexport type TAreaChecklistUpdate = Pick<TCleaningScheduleArea, \"checklist\">;\n\nexport type TAreaChecklistUnitsUpdate = Pick<\n TAreaChecklistUnits,\n \"approve\" | \"reject\" | \"remarks\" | \"completedBy\"\n>;\n\nexport const areaChecklistSchema = Joi.object({\n schedule: Joi.string().hex().required(),\n area: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n set: Joi.number().min(0).required(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required(),\n )\n .min(1)\n .required(),\n }).required(),\n )\n .optional()\n .default([]),\n createdBy: Joi.string().hex().required(),\n});\n\nexport function MAreaChecklist(value: TCleaningScheduleArea) {\n const { error } = areaChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.schedule) {\n try {\n value.schedule = new ObjectId(value.schedule);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule ID format.\");\n }\n }\n\n if (value.area) {\n try {\n value.area = new ObjectId(value.area);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((checklistItem) => {\n return {\n set: checklistItem.set,\n units: checklistItem.units.map((unit) => ({\n unit: new ObjectId(unit.unit),\n name: unit.name,\n approve: false,\n reject: false,\n status: \"ready\",\n remarks: \"\",\n completedBy: \"\",\n timestamp: \"\",\n })),\n };\n });\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n schedule: value.schedule,\n area: value.area,\n name: value.name,\n type: value.type,\n checklist: value.checklist || [],\n status: \"ready\",\n createdBy: value.createdBy,\n createdAt: new Date(),\n completedAt: \"\",\n updatedAt: \"\",\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger, useAtlas } from \"@7365admin1/node-server-utils\";\nimport {\n TAreaChecklistBatchCreate,\n TAreaChecklistUnitsUpdate,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\n\nexport function useAreaChecklistService() {\n const { getAreasForChecklist } = useAreaRepo();\n const {\n createAreaChecklist: _createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistUnits,\n getAreaChecklistById,\n updateAreaChecklistUnits: _updateAreaChecklistUnits,\n updateAreaChecklistStatus,\n getMaxSetNumberForArea,\n } = useAreaChecklistRepo();\n const { updateParentChecklistStatuses } = useParentChecklistRepo();\n\n async function createAreaChecklist(value: TAreaChecklistBatchCreate) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const results: ObjectId[] = [];\n let totalChecklistsCreated = 0;\n\n const BATCH_SIZE = 10;\n\n const areasResult = (await getAreasForChecklist(value.site)) as any;\n const areas = areasResult || [];\n\n if (areas.length > 0) {\n for (let i = 0; i < areas.length; i += BATCH_SIZE) {\n const batch = areas.slice(i, i + BATCH_SIZE);\n\n const batchPromises = batch.map(async (area: any) => {\n if (!area.units || area.units.length === 0) {\n logger.warn(\n `Skipping area ${area.name} (${area._id}): No units defined`,\n );\n return null;\n }\n\n const maxSet = await getMaxSetNumberForArea(area._id, session);\n const setCount = area.set || 1;\n\n const checklistData: TCleaningScheduleArea = {\n schedule: value.schedule,\n area: area._id.toString(),\n name: area.name,\n type: area.type,\n checklist: Array.from({ length: setCount }, (_, index) => ({\n set: maxSet + index + 1,\n units: area.units.map((unit: any) => ({\n unit: unit.unit.toString(),\n name: unit.name,\n })),\n })),\n createdBy: value.createdBy,\n };\n\n const insertedId = await _createAreaChecklist(\n checklistData,\n session,\n );\n totalChecklistsCreated++;\n return insertedId;\n });\n\n const batchResults = await Promise.all(batchPromises);\n // Filter out null results from skipped areas\n results.push(...batchResults.filter((id) => id !== null));\n }\n\n logger.info(\n `Created ${totalChecklistsCreated} area checklists out of ${areas.length} areas for site: ${value.site}`,\n );\n } else {\n logger.warn(`No common areas found for site: ${value.site}`);\n }\n\n await session?.commitTransaction();\n\n logger.info(\n `Successfully created ${totalChecklistsCreated} area checklists for site: ${value.site}`,\n );\n\n return results;\n } catch (error) {\n logger.error(`Error generating area checklists:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function updateAreaChecklistUnits(\n _id: string | ObjectId,\n set: number,\n unitId: string | ObjectId,\n value: TAreaChecklistUnitsUpdate,\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n await _updateAreaChecklistUnits(_id, set, unitId, value, session);\n\n const allUnitsResult = (await getAreaChecklistUnits(\n {\n page: 1,\n limit: 1000,\n _id: _id.toString(),\n },\n session,\n )) as any;\n\n let areaStatus: (typeof allowedStatus)[number] = \"ready\";\n\n if (\n allUnitsResult &&\n allUnitsResult.items &&\n allUnitsResult.items.length > 0\n ) {\n const sets = allUnitsResult.items;\n const allUnits = sets.flatMap((set: any) => set.units || []);\n const readyCount = allUnits.filter(\n (unit: any) => unit.status === \"Ready\",\n ).length;\n const completedCount = allUnits.filter(\n (unit: any) => unit.status === \"Completed\",\n ).length;\n const totalCount = allUnits.length;\n\n if (completedCount === totalCount) {\n areaStatus = \"completed\";\n } else if (readyCount === totalCount) {\n areaStatus = \"ready\";\n } else {\n areaStatus = \"ongoing\";\n }\n }\n\n await updateAreaChecklistStatus(_id, areaStatus, session);\n\n const currentArea = await getAreaChecklistById(_id, session);\n const scheduleId = currentArea.schedule;\n\n if (scheduleId) {\n const allAreasResult = (await getAllAreaChecklist(\n {\n page: 1,\n limit: 1000,\n schedule: scheduleId.toString(),\n },\n session,\n )) as any;\n\n if (\n allAreasResult &&\n allAreasResult.items &&\n allAreasResult.items.length > 0\n ) {\n const areas = allAreasResult.items;\n const readyAreasCount = areas.filter(\n (area: any) => area.status === \"Ready\",\n ).length;\n const completedAreasCount = areas.filter(\n (area: any) => area.status === \"Completed\",\n ).length;\n const totalAreasCount = areas.length;\n\n let parentStatus: (typeof allowedStatus)[number] = \"ready\";\n\n if (completedAreasCount === totalAreasCount) {\n parentStatus = \"completed\";\n } else if (readyAreasCount === totalAreasCount) {\n parentStatus = \"ready\";\n } else {\n parentStatus = \"ongoing\";\n }\n\n await updateParentChecklistStatuses(\n scheduleId,\n parentStatus,\n session,\n );\n } else {\n logger.info(\n \"No area checklists found, keeping parent status as ready\",\n );\n }\n }\n\n await session?.commitTransaction();\n\n return;\n } catch (error) {\n logger.error(`Error updating area checklist unit and statuses:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return { createAreaChecklist, updateAreaChecklistUnits };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MAreaChecklist,\n TAreaChecklistUnitsUpdate,\n TAreaChecklistUpdate,\n TCleaningScheduleArea,\n TCleaningScheduleAreaGetQuery,\n} from \"../models/hygiene-area-checklist.model\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\n\nexport function useAreaChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedule.areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { schedule: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { createdAt: 1 } },\n { key: { \"checklist.units.unit\": 1 } },\n { key: { \"checklist.units.status\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene checklist area.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({\n name: \"text\",\n \"checklist.units.name\": \"text\",\n \"checklist.units.remarks\": \"text\",\n });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene checklist area.\",\n );\n }\n }\n\n async function createAreaChecklist(\n value: TCleaningScheduleArea,\n session?: ClientSession,\n ) {\n try {\n const parentChecklistId = new ObjectId(value.schedule);\n\n const currentDate = new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n type: value.type,\n schedule: parentChecklistId,\n name: value.name,\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n logger.info(\n `Area checklist already exists for area ${value.name} on ${\n currentDate.toISOString().split(\"T\")[0]\n }`,\n );\n return existingChecklist._id;\n }\n\n const processedValue = MAreaChecklist(value);\n const result = await collection.insertOne(processedValue, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return result.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllAreaChecklist(\n {\n page = 1,\n limit = 10,\n search = \"\",\n type = \"all\",\n status = \"all\",\n schedule,\n }: TCleaningScheduleAreaGetQuery,\n session?: ClientSession,\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (type && type !== \"all\") {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (status && status !== \"all\") {\n query.status = status;\n cacheOptions.status = status;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"users\",\n let: { createdById: \"$createdBy\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$createdById\", \"\"] },\n { $eq: [\"$_id\", \"$$createdById\"] },\n ],\n },\n },\n },\n { $project: { name: 1 } },\n ],\n as: \"createdByDoc\",\n },\n },\n {\n $unwind: {\n path: \"$createdByDoc\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n type: 1,\n set: {\n $cond: {\n if: { $gt: [{ $size: { $ifNull: [\"$checklist\", []] } }, 0] },\n then: {\n $max: {\n $map: {\n input: \"$checklist\",\n as: \"item\",\n in: { $toInt: \"$$item.set\" },\n },\n },\n },\n else: 0,\n },\n },\n createdByName: \"$createdByDoc.name\",\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline, { session }).toArray();\n\n const length = await collection.countDocuments(query, { session });\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistory({\n page = 1,\n limit = 10,\n search = \"\",\n type,\n schedule,\n status,\n createdAt,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number];\n schedule: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: string | Date;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (type) {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (createdAt) {\n query.createdAt = {\n $gte: new Date(`${createdAt}T00:00:00Z`),\n $lte: new Date(`${createdAt}T23:59:59Z`),\n };\n cacheOptions.createdAt = new Date(createdAt).toISOString().split(\"T\")[0];\n }\n\n if (status) {\n query.status = status;\n cacheOptions.status = status;\n } else {\n query.status = { $in: [\"ongoing\", \"completed\"] };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n createdAt: 1,\n completedAt: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n set: {\n $cond: {\n if: { $gt: [{ $size: { $ifNull: [\"$checklist\", []] } }, 0] },\n then: {\n $max: {\n $map: {\n input: \"$checklist\",\n as: \"item\",\n in: { $toInt: \"$$item.set\" },\n },\n },\n },\n else: 0,\n },\n },\n },\n },\n { $sort: { status: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistoryDetails(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaPipeline: Object[] = [\n { $match: { _id } },\n {\n $project: {\n name: 1,\n createdAt: 1,\n completedAt: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n },\n },\n ];\n\n const unitPipeline: Object[] = [\n { $match: { _id } },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $unwind: {\n path: \"$checklist.units\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $lookup: {\n from: \"users\",\n let: { completedById: \"$checklist.units.completedBy\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$completedById\", \"\"] },\n { $eq: [\"$_id\", \"$$completedById\"] },\n ],\n },\n },\n },\n { $project: { name: 1 } },\n ],\n as: \"completedBy\",\n },\n },\n {\n $unwind: {\n path: \"$completedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$checklist.set\",\n unit: \"$checklist.units.unit\",\n name: \"$checklist.units.name\",\n remarks: \"$checklist.units.remarks\",\n status: {\n $switch: {\n branches: [\n {\n case: { $eq: [\"$checklist.units.status\", \"ready\"] },\n then: \"Ready\",\n },\n {\n case: { $eq: [\"$checklist.units.status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$checklist.units.status\",\n },\n },\n completedByName: \"$completedBy.name\",\n timestamp: \"$checklist.units.timestamp\",\n },\n },\n { $sort: { set: 1, name: 1 } },\n {\n $group: {\n _id: \"$set\",\n units: {\n $push: {\n unit: \"$unit\",\n name: \"$name\",\n status: \"$status\",\n remarks: \"$remarks\",\n completedByName: \"$completedByName\",\n timestamp: \"$timestamp\",\n },\n },\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$_id\",\n units: 1,\n },\n },\n { $sort: { set: 1 } },\n ];\n\n const [area, units] = await Promise.all([\n collection.aggregate(areaPipeline).toArray(),\n collection.aggregate(unitPipeline).toArray(),\n ]);\n\n if (!area.length) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n const items: Record<string, any> = {\n area: area[0],\n units,\n };\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistUnits(\n {\n page = 1,\n limit = 10,\n search = \"\",\n _id,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n _id: string | ObjectId;\n },\n session?: ClientSession,\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query._id = new ObjectId(_id);\n cacheOptions._id = _id.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $unwind: {\n path: \"$checklist.units\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$checklist.set\",\n unit: \"$checklist.units.unit\",\n name: \"$checklist.units.name\",\n status: {\n $switch: {\n branches: [\n {\n case: { $eq: [\"$checklist.units.status\", \"ready\"] },\n then: \"Ready\",\n },\n {\n case: { $eq: [\"$checklist.units.status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$checklist.units.status\",\n },\n },\n remarks: \"$checklist.units.remarks\",\n },\n },\n { $sort: { set: 1, name: 1 } },\n {\n $group: {\n _id: \"$set\",\n units: {\n $push: {\n unit: \"$unit\",\n name: \"$name\",\n status: \"$status\",\n remarks: \"$remarks\",\n },\n },\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$_id\",\n units: 1,\n },\n },\n { $sort: { set: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const countPipeline: Object[] = [\n { $match: query },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $group: {\n _id: \"$checklist.set\",\n },\n },\n { $count: \"total\" },\n ];\n\n const [items, countResult] = await Promise.all([\n collection.aggregate(pipeline, { session }).toArray(),\n collection.aggregate(countPipeline, { session }).toArray(),\n ]);\n\n const length = countResult.length > 0 ? countResult[0].total : 0;\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const area = await collection.findOne(\n { _id },\n { projection: { schedule: 1, name: 1, type: 1, status: 1 }, session },\n );\n\n if (!area) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n return area;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistByAreaAndSchedule(\n schedule: string | ObjectId,\n area: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n schedule = new ObjectId(schedule);\n area = new ObjectId(area);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const data = await collection.findOne({ schedule, area }, { session });\n\n if (!data) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateAreaChecklistUnits(\n _id: string | ObjectId,\n set: number,\n unitId: string | ObjectId,\n value: TAreaChecklistUnitsUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue: Record<string, any> = {\n \"checklist.$[checklist].units.$[unit].timestamp\": now,\n updatedAt: now,\n };\n\n if (value.approve === true) {\n updateValue[\"checklist.$[checklist].units.$[unit].approve\"] = true;\n updateValue[\"checklist.$[checklist].units.$[unit].reject\"] = false;\n updateValue[\"checklist.$[checklist].units.$[unit].status\"] =\n \"completed\";\n } else if (value.reject === true) {\n updateValue[\"checklist.$[checklist].units.$[unit].approve\"] = false;\n updateValue[\"checklist.$[checklist].units.$[unit].reject\"] = true;\n updateValue[\"checklist.$[checklist].units.$[unit].status\"] = \"ready\";\n }\n\n if (value.remarks) {\n updateValue[\"checklist.$[checklist].units.$[unit].remarks\"] =\n value.remarks;\n }\n\n if (value.completedBy) {\n updateValue[\"checklist.$[checklist].units.$[unit].completedBy\"] =\n new ObjectId(value.completedBy);\n }\n\n const arrayFilters = [\n { \"checklist.set\": set, \"checklist.units.unit\": unitId },\n { \"unit.unit\": unitId },\n ];\n\n const res = await collection.updateOne(\n { _id, \"checklist.set\": set, \"checklist.units.unit\": unitId },\n { $set: updateValue },\n { arrayFilters, session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update area checklist unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n logger.error(\"Error updating area checklist unit:\", error.message);\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n _id: string | ObjectId,\n value: TAreaChecklistUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n ...value,\n updatedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update area checklist.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateAreaChecklistStatus(\n _id: string | ObjectId,\n status: (typeof allowedStatus)[number],\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"completed\") {\n updateValue.completedAt = new Date();\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update area checklist status.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getMaxSetNumberForArea(\n areaId: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n const _id = new ObjectId(areaId);\n\n const result = await collection\n .aggregate(\n [\n { $match: { area: _id.toString() } },\n { $unwind: \"$checklist\" },\n { $group: { _id: null, maxSet: { $max: \"$checklist.set\" } } },\n ],\n { session },\n )\n .toArray();\n\n return result.length > 0 && result[0].maxSet ? result[0].maxSet : 0;\n } catch (error) {\n logger.error(`Error getting max set number for area ${areaId}:`, error);\n return 0;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n getAreaChecklistUnits,\n getAreaChecklistById,\n getAreaChecklistByAreaAndSchedule,\n updateAreaChecklist,\n updateAreaChecklistStatus,\n updateAreaChecklistUnits,\n getMaxSetNumberForArea,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useAreaChecklistService } from \"../services/hygiene-area-checklist.service\";\nimport { useAreaExportService } from \"../services/hygiene-area-export.service\";\n\nexport function useAreaChecklistController() {\n const {\n getAllAreaChecklist: _getAllAreaChecklist,\n getAreaChecklistHistory: _getAreaChecklistHistory,\n getAreaChecklistHistoryDetails: _getAreaChecklistHistoryDetails,\n getAreaChecklistUnits: _getAreaChecklistUnits,\n } = useAreaChecklistRepo();\n const {\n createAreaChecklist: _createAreaChecklist,\n updateAreaChecklistUnits: _updateAreaChecklistUnits,\n } = useAreaChecklistService();\n\n async function createAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n site: req.params.site,\n schedule: req.params.schedule,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n schedule: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createAreaChecklist(value);\n res\n .status(201)\n .json({ message: \"Area checklist generated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .valid(...allowedTypes, \"all\")\n .optional()\n .allow(\"\", null),\n status: Joi.string()\n .valid(...allowedStatus, \"all\")\n .optional()\n .allow(\"\", null),\n schedule: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"all\";\n const status = (req.query.status as string) ?? \"all\";\n const schedule = (req.params.schedule as string) ?? \"\";\n\n try {\n const data = await _getAllAreaChecklist({\n page,\n limit,\n search,\n type,\n status,\n schedule,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistory(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", ...allowedTypes),\n schedule: Joi.string().hex().required(),\n status: Joi.string().allow(\"\", null, ...allowedStatus),\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"\";\n const schedule = (req.params.schedule as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n const createdAt = (req.query.createdAt as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistHistory({\n page,\n limit,\n search,\n type,\n schedule,\n status,\n createdAt,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistoryDetails(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaChecklistHistoryDetails(value);\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistUnits(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const _id = (req.params.id as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistUnits({\n page,\n limit,\n search,\n _id,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateAreaChecklistUnits(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const completedBy = cookies[\"user\"] || \"\";\n\n const decisionMap: Record<string, { approve: boolean; reject: boolean }> = {\n approve: { approve: true, reject: false },\n reject: { approve: false, reject: true },\n };\n\n const decision = req.params.decision;\n const decisionValues = decisionMap[decision] || {\n approve: undefined,\n reject: undefined,\n };\n\n const payload = {\n ...req.params,\n ...req.body,\n ...decisionValues,\n completedBy,\n };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n set: Joi.number().integer().min(1).required(),\n unit: Joi.string().hex().required(),\n decision: Joi.string().valid(\"approve\", \"reject\").required(),\n approve: Joi.boolean().optional(),\n reject: Joi.boolean().optional(),\n remarks: Joi.string().optional().allow(\"\", null),\n completedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, set, unit, decision, ...value } = payload;\n await _updateAreaChecklistUnits(id, parseInt(set as string), unit, value);\n\n res.json({ message: \"Area checklist updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n getAreaChecklistUnits,\n updateAreaChecklistUnits,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TSupply = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n unitOfMeasurement: string;\n qty: number;\n status?: \"active\" | \"deleted\";\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TSupplyCreate = Pick<\n TSupply,\n \"site\" | \"name\" | \"unitOfMeasurement\"\n>;\n\nexport type TSupplyGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TSupply, \"site\">;\n\nexport type TSupplyGetById = Pick<\n TSupply,\n \"_id\" | \"name\" | \"unitOfMeasurement\" | \"qty\"\n>;\n\nexport type TSupplyUpdate = Partial<\n Pick<TSupply, \"name\" | \"unitOfMeasurement\" | \"qty\">\n>;\n\nexport const supplySchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n unitOfMeasurement: Joi.string().required(),\n});\n\nexport function MSupply(value: TSupplyCreate) {\n const { error } = supplySchema.validate(value);\n if (error) {\n logger.info(`Hygiene Supply Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n return {\n site: value.site,\n name: value.name,\n unitOfMeasurement: value.unitOfMeasurement,\n qty: 0,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MSupply,\n TSupplyGetQuery,\n TSupplyUpdate,\n TSupplyCreate,\n TSupplyGetById,\n} from \"../models/hygiene-supply.model\";\n\nexport function useSupplyRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supplies\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([{ key: { site: 1 } }]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene supply.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene supply.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene supply.\",\n );\n }\n }\n\n async function createSupply(value: TSupplyCreate, session?: ClientSession) {\n try {\n value = MSupply(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Supply already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getSupplies({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TSupplyGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n qty: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getSupplyById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TSupplyGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n unitOfMeasurement: 1,\n qty: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Supply not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TSupplyGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateSupply(\n _id: string | ObjectId,\n value: TSupplyUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning supply.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Supply already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteSupply(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete supply.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createSupply,\n getSupplies,\n getSupplyById,\n updateSupply,\n deleteSupply,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { supplySchema } from \"../models/hygiene-supply.model\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\n\nexport function useSupplyController() {\n const {\n createSupply: _createSupply,\n getSupplies: _getSupplies,\n getSupplyById: _getSupplyById,\n updateSupply: _updateSupply,\n deleteSupply: _deleteSupply,\n } = useSupplyRepository();\n\n async function createSupply(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = supplySchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createSupply(payload);\n\n res.status(201).json({ message: \"Supply created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getSupplies(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getSupplies({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getSupplyById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getSupplyById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateSupply(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n unitOfMeasurement: Joi.string().optional().allow(\"\", null),\n qty: Joi.number().min(0).optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateSupply(id, value);\n\n res.json({ message: \"Supply updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteSupply(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteSupply(value);\n\n res.json({ message: \"Supply deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createSupply,\n getSupplies,\n getSupplyById,\n updateSupply,\n deleteSupply,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TStock = {\n _id?: ObjectId;\n site: string | ObjectId;\n supply: string | ObjectId;\n in?: number;\n out?: number;\n balance: number;\n remarks?: string;\n status?: \"active\" | \"deleted\";\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TStockCreate = Pick<\n TStock,\n \"site\" | \"supply\" | \"in\" | \"out\" | \"balance\" | \"remarks\"\n>;\n\nexport type TStockCreateService = Pick<\n TStock,\n \"site\" | \"supply\" | \"remarks\"\n> & {\n qty: number;\n};\n\nexport type TGetStocksQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TStock, \"site\" | \"supply\">;\n\nexport const stockSchema = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n in: Joi.number().min(0).optional(),\n out: Joi.number().min(0).optional(),\n balance: Joi.number().min(0).required(),\n remarks: Joi.string().optional().allow(\"\", null),\n});\n\nexport function MStock(value: TStockCreate) {\n const { error } = stockSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Stock Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.supply) {\n try {\n value.supply = new ObjectId(value.supply);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n }\n\n return {\n site: value.site,\n supply: value.supply,\n in: value.in ?? 0,\n out: value.out ?? 0,\n balance: value.balance,\n remarks: value.remarks ?? \"\",\n createdAt: new Date().toISOString(),\n status: \"active\",\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n paginate,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MStock,\n TGetStocksQuery,\n TStockCreate,\n} from \"../models/hygiene-stock.model\";\n\nexport function useStockRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supply.stocks\";\n const supply_collection = \"site.supplies\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n const { delNamespace: delSupplyNamespace } = useCache(supply_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { supply: 1 } },\n { key: { balance: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene stock.\");\n }\n }\n\n async function createStock(value: TStockCreate, session?: ClientSession) {\n try {\n value = MStock(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n delSupplyNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${supply_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${supply_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getStocksBySupplyId({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n supply,\n }: TGetStocksQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n supply = new ObjectId(supply);\n query.supply = supply;\n cacheOptions.supply = supply.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n createdAt: 1,\n in: 1,\n out: 1,\n balance: 1,\n },\n },\n { $sort: { _id: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createStock,\n getStocksBySupplyId,\n };\n}\n","import { ClientSession } from \"mongodb\";\nimport {\n NotFoundError,\n useAtlas,\n BadRequestError,\n} from \"@7365admin1/node-server-utils\";\nimport { TStockCreateService } from \"../models/hygiene-stock.model\";\nimport { useStockRepository } from \"../repositories/hygiene-stock.repository\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\n\nexport function useStockService() {\n const { createStock: _createStock } = useStockRepository();\n const { getSupplyById, updateSupply } = useSupplyRepository();\n\n async function createStock(\n value: TStockCreateService,\n out: boolean = false,\n session?: ClientSession,\n ) {\n let ownSession = false;\n if (!session) {\n session = useAtlas.getClient()?.startSession();\n ownSession = true;\n }\n\n try {\n if (ownSession) session?.startTransaction();\n\n const { qty, ...stockData } = value;\n const supply = await getSupplyById(value.supply, session);\n\n if (!supply || supply.qty === undefined) {\n throw new NotFoundError(\"Supply not found.\");\n }\n\n const newSupplyQty = out ? supply.qty - qty : supply.qty + qty;\n\n if (out && newSupplyQty < 0) {\n throw new BadRequestError(\n `Insufficient stock. Available: ${supply.qty}, Requested: ${qty}`,\n );\n }\n\n await updateSupply(value.supply, { qty: newSupplyQty }, session);\n\n const createdStock = await _createStock(\n {\n ...stockData,\n in: out ? 0 : qty,\n out: out ? qty : 0,\n balance: newSupplyQty,\n },\n session,\n );\n\n if (ownSession) await session?.commitTransaction();\n\n return createdStock;\n } catch (error) {\n if (ownSession) await session?.abortTransaction();\n throw error;\n } finally {\n if (ownSession) await session?.endSession();\n }\n }\n\n return { createStock };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useStockRepository } from \"../repositories/hygiene-stock.repository\";\nimport { useStockService } from \"../services/hygiene-stock.service\";\n\nexport function useStockController() {\n const { getStocksBySupplyId: _getStocksBySupplyId } = useStockRepository();\n const { createStock: _createStock } = useStockService();\n\n async function createStock(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n remarks: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createStock(payload);\n\n res.status(201).json({ message: \"Stock created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getStocksBySupplyId(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const supply = (req.params.supply as string) ?? \"\";\n\n try {\n const data = await _getStocksBySupplyId({\n page,\n limit,\n search,\n site,\n supply,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createStock,\n getStocksBySupplyId,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport const allowedCheckOutItemStatus: string[] = [\"pending\", \"completed\"];\n\nexport type TCheckOutItem = {\n _id?: ObjectId;\n site: string | ObjectId;\n supply: string | ObjectId;\n supplyName: string;\n qty: number;\n attachment?: string[];\n createdBy: string | ObjectId;\n createdByName: string;\n status?: (typeof allowedCheckOutItemStatus)[number];\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TCheckOutItemCreate = Pick<\n TCheckOutItem,\n | \"site\"\n | \"supply\"\n | \"supplyName\"\n | \"qty\"\n | \"attachment\"\n | \"createdBy\"\n | \"createdByName\"\n>;\n\nexport type TCheckOutItemCreateService = Pick<\n TCheckOutItem,\n \"site\" | \"supply\" | \"qty\" | \"attachment\" | \"createdBy\"\n>;\n\nexport type TCheckOutItemCreateByBatchService = Pick<\n TCheckOutItem,\n \"site\" | \"attachment\" | \"createdBy\"\n> & { items: Pick<TCheckOutItem, \"supply\" | \"qty\">[] };\n\nexport type TCheckOutItemGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TCheckOutItem, \"site\">;\n\nexport type TCheckOutItemGetById = Pick<\n TCheckOutItem,\n \"_id\" | \"site\" | \"supply\" | \"supplyName\" | \"qty\" | \"status\"\n> & { unitOfMeasurement?: string };\n\nexport const checkOutItemSchema = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n supplyName: Joi.string().required(),\n qty: Joi.number().min(0).required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n createdByName: Joi.string().required(),\n});\n\nexport function MCheckOutItem(value: TCheckOutItemCreate) {\n const { error } = checkOutItemSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Check Out Item Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.supply) {\n try {\n value.supply = new ObjectId(value.supply);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n }\n\n return {\n site: value.site,\n supply: value.supply,\n supplyName: value.supplyName,\n qty: value.qty,\n attachment: value.attachment || [],\n createdBy: value.createdBy,\n createdByName: value.createdByName,\n status: \"pending\",\n createdAt: new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n useCache,\n logger,\n makeCacheKey,\n paginate,\n BadRequestError,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MCheckOutItem,\n TCheckOutItemGetById,\n TCheckOutItemGetQuery,\n TCheckOutItemCreate,\n} from \"../models/hygiene-checkout-item.model\";\n\nexport function useCheckOutItemRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supply.checkouts\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { supply: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene check out item.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ supplyName: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene supply.\",\n );\n }\n }\n\n async function createCheckOutItem(\n value: TCheckOutItemCreate,\n session?: ClientSession,\n ) {\n try {\n value = MCheckOutItem(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getCheckOutItems({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TCheckOutItemGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"site.supplies\",\n let: { supplyId: \"$supply\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$supplyId\", \"\"] },\n { $eq: [\"$_id\", \"$$supplyId\"] },\n ],\n },\n },\n },\n { $project: { qty: 1 } },\n ],\n as: \"supplyDoc\",\n },\n },\n {\n $unwind: {\n path: \"$supplyDoc\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n supplyName: 1,\n supplyQty: \"$supplyDoc.qty\",\n checkOutByName: \"$createdByName\",\n checkOutQty: \"$qty\",\n createdAt: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getCheckOutItemById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid check out item ID format.\");\n }\n\n const query: Record<string, any> = { _id };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TCheckOutItemGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate(\n [\n { $match: query },\n {\n $lookup: {\n from: \"site.supply.items\",\n localField: \"supply\",\n foreignField: \"_id\",\n as: \"supplyDetails\",\n },\n },\n {\n $unwind: {\n path: \"$supplyDetails\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n site: 1,\n supply: 1,\n supplyName: 1,\n qty: 1,\n status: 1,\n unitOfMeasurement: \"$supplyDetails.unitOfMeasurement\",\n attachment: 1,\n },\n },\n ],\n session ? { session } : undefined,\n )\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Check out item not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TCheckOutItemGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function completeCheckOutItem(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid check out item ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"completed\",\n updatedAt: new Date().toISOString(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to complete check out item.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createCheckOutItem,\n getCheckOutItems,\n getCheckOutItemById,\n completeCheckOutItem,\n };\n}\n","import { useUserRepo } from \"@7365admin1/core\";\nimport { BadRequestError, useAtlas } from \"@7365admin1/node-server-utils\";\nimport {\n TCheckOutItemCreateByBatchService,\n TCheckOutItemCreateService,\n} from \"../models/hygiene-checkout-item.model\";\nimport { useCheckOutItemRepository } from \"../repositories/hygiene-checkout-item.repository\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\nimport { useStockService } from \"./hygiene-stock.service\";\n\nexport function useCheckOutItemService() {\n const {\n createCheckOutItem: _createCheckOutItem,\n getCheckOutItemById: _getCheckOutItemById,\n completeCheckOutItem,\n } = useCheckOutItemRepository();\n const { getSupplyById } = useSupplyRepository();\n const { getUserById } = useUserRepo();\n const { createStock } = useStockService();\n\n async function createCheckOutItem(value: TCheckOutItemCreateService) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const supplyData = await getSupplyById(value.supply);\n const createdByData = await getUserById(value.createdBy);\n\n const checkOutItemId = await _createCheckOutItem(\n {\n ...value,\n supplyName: supplyData?.name || \"\",\n createdByName: createdByData?.name || \"\",\n },\n session,\n );\n\n const checkOutItem = await _getCheckOutItemById(\n checkOutItemId.toString(),\n session,\n );\n\n if (!checkOutItem) {\n throw new BadRequestError(\"Failed to create check out item.\");\n }\n\n const createdStocks = await createStock(\n {\n site: checkOutItem.site.toString(),\n supply: checkOutItem.supply.toString(),\n qty: checkOutItem.qty,\n },\n true,\n session,\n );\n\n await completeCheckOutItem(checkOutItemId.toString(), session);\n\n await session?.commitTransaction();\n\n return createdStocks;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n async function createCheckOutItemByBatch(\n value: TCheckOutItemCreateByBatchService,\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const { site, attachment, createdBy, items } = value;\n const createdByData = await getUserById(createdBy);\n const createdCheckOutItemIds = [];\n\n for (const item of items) {\n const supplyData = await getSupplyById(item.supply, session);\n\n const createdId = await _createCheckOutItem(\n {\n site,\n supply: item.supply,\n supplyName: supplyData?.name || \"\",\n qty: item.qty,\n attachment,\n createdBy,\n createdByName: createdByData?.name || \"\",\n },\n session,\n );\n\n await createStock(\n {\n site,\n supply: item.supply,\n qty: item.qty,\n },\n true,\n session,\n );\n\n createdCheckOutItemIds.push(createdId);\n }\n\n await session?.commitTransaction();\n\n return createdCheckOutItemIds;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n return {\n createCheckOutItem,\n createCheckOutItemByBatch,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useCheckOutItemRepository } from \"../repositories/hygiene-checkout-item.repository\";\nimport { useCheckOutItemService } from \"../services/hygiene-checkout-item.service\";\n\nexport function useCheckOutItemController() {\n const {\n getCheckOutItems: _getCheckOutItems,\n getCheckOutItemById: _getCheckOutItemById,\n } = useCheckOutItemRepository();\n const {\n createCheckOutItem: _createCheckOutItem,\n createCheckOutItemByBatch: _createCheckOutItemByBatch,\n } = useCheckOutItemService();\n\n async function createCheckOutItem(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n ...req.body,\n ...req.params,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createCheckOutItem(payload);\n\n res\n .status(201)\n .json({ message: \"Check out item created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function createCheckOutItemByBatch(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n ...req.body,\n ...req.params,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n items: Joi.array()\n .items(\n Joi.object({\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n }),\n )\n .min(1)\n .required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createCheckOutItemByBatch(payload);\n\n res\n .status(201)\n .json({ message: \"Check out items created successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getCheckOutItems(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getCheckOutItems({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getCheckOutItemById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getCheckOutItemById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createCheckOutItem,\n createCheckOutItemByBatch,\n getCheckOutItems,\n getCheckOutItemById,\n };\n}\n","import { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TScheduleTask = {\n _id?: ObjectId;\n site: string | ObjectId;\n title: string;\n time: string; // HH:mm format\n startDate: string;\n endDate?: string;\n description?: string;\n areas: { name: string; value: ObjectId }[]; // at least 1\n status?: \"active\" | \"deleted\";\n createdBy: string | ObjectId;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport type TScheduleTaskCreate = Pick<\n TScheduleTask,\n | \"site\"\n | \"title\"\n | \"time\"\n | \"startDate\"\n | \"endDate\"\n | \"description\"\n | \"areas\"\n | \"createdBy\"\n>;\n\nexport type TScheduleTaskGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TScheduleTask, \"site\">;\n\nexport type TScheduleTaskGetById = Pick<\n TScheduleTask,\n | \"title\"\n | \"time\"\n | \"startDate\"\n | \"endDate\"\n | \"description\"\n | \"areas\"\n | \"status\"\n | \"createdBy\"\n | \"createdAt\"\n>;\n\nexport type TScheduleTaskUpdate = Partial<\n Pick<\n TScheduleTask,\n \"title\" | \"time\" | \"startDate\" | \"endDate\" | \"description\" | \"areas\"\n >\n>;\n\nexport const scheduleTaskSchema = Joi.object({\n site: Joi.string().hex().required(),\n title: Joi.string().required(),\n time: Joi.string()\n .pattern(/^([0-1]\\d|2[0-3]):([0-5]\\d)$/)\n .required(),\n startDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .required(),\n endDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n description: Joi.string().optional().allow(\"\", null),\n areas: Joi.array()\n .min(1)\n .items(\n Joi.object({\n name: Joi.string().required(),\n value: Joi.any().required(),\n }),\n )\n .required(),\n createdBy: Joi.string().hex().required(),\n});\n\nexport function MScheduleTask(value: TScheduleTaskCreate) {\n const { error } = scheduleTaskSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Schedule Task Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.areas && Array.isArray(value.areas)) {\n value.areas = value.areas.map((area) => {\n try {\n return {\n name: area.name,\n value: new ObjectId(area.value.toString()),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid area value format: ${area.name}`);\n }\n });\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n site: value.site,\n title: value.title,\n time: value.time,\n startDate: value.startDate,\n endDate: value.endDate,\n description: value.description,\n areas: value.areas,\n status: \"active\",\n createdBy: value.createdBy,\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MScheduleTask,\n TScheduleTaskGetQuery,\n TScheduleTask,\n TScheduleTaskCreate,\n TScheduleTaskGetById,\n TScheduleTaskUpdate,\n} from \"../models/hygiene-schedule-task.model\";\n\nexport function useScheduleTaskRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.schedule-tasks\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene schedule task.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ title: \"text\", description: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene schedule task.\",\n );\n }\n }\n\n async function createScheduleTask(\n value: TScheduleTaskCreate,\n session?: ClientSession,\n ) {\n try {\n value = MScheduleTask(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTasks({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TScheduleTaskGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n title: 1,\n areas: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllScheduleTask() {\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n try {\n const items = await collection\n .aggregate([{ $match: query }, { $sort: { _id: -1 } }])\n .toArray();\n\n return items as TScheduleTask[];\n } catch (error) {\n throw error;\n }\n }\n\n async function getTasksForScheduleTask({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TScheduleTaskGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n createdAt: 1,\n title: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTaskById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule task ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TScheduleTaskGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n title: 1,\n time: 1,\n startDate: 1,\n endDate: 1,\n description: 1,\n areas: 1,\n status: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Schedule task not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TScheduleTaskGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateScheduleTask(\n _id: string | ObjectId,\n value: TScheduleTaskUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule task ID format.\");\n }\n\n if (value.areas && Array.isArray(value.areas)) {\n value.areas = value.areas.map((area) => {\n try {\n return {\n name: area.name,\n value: new ObjectId(area.value.toString()),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid area value format: ${area.name}`);\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update hygiene schedule task.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createScheduleTask,\n getScheduleTasks,\n getAllScheduleTask,\n getTasksForScheduleTask,\n getScheduleTaskById,\n updateScheduleTask,\n };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport {\n TAreaChecklist,\n TAreaChecklistUnits,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { TScheduleTask } from \"../models/hygiene-schedule-task.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\nimport { useScheduleTaskRepository } from \"../repositories/hygiene-schedule-task.repository\";\n\nexport function useScheduleTaskService() {\n const { createParentChecklist } = useParentChecklistRepo();\n const { getAllScheduleTask } = useScheduleTaskRepository();\n const {\n createAreaChecklist,\n getAreaChecklistByAreaAndSchedule,\n updateAreaChecklist,\n } = useAreaChecklistRepo();\n const { getAreaById } = useAreaRepo();\n\n function checkScheduleConditions(\n schedule: any,\n currentDate: Date = new Date(),\n ): boolean {\n try {\n const now = currentDate;\n\n // Get current time in HH:mm format\n const timeString = now.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n timeZone: \"Asia/Singapore\",\n });\n const [currentHour, currentMinute] = timeString.split(\":\").map(Number);\n\n // Get current date in YYYY-MM-DD format\n const currentDateString = now.toLocaleDateString(\"en-US\", {\n timeZone: \"Asia/Singapore\",\n });\n\n logger.info(\n `Checking schedule ${schedule._id}: Current time ${currentHour}:${currentMinute}, Current date ${currentDateString}, Schedule time ${schedule.time}, Start date ${schedule.startDate}, End date ${schedule.endDate}`,\n );\n\n // Check if current date is within the date range\n const startDate = new Date(schedule.startDate + \"T00:00:00\");\n const currentDateOnly = new Date(currentDateString + \"T00:00:00\");\n\n // Check if current date is before start date\n if (currentDateOnly < startDate) {\n logger.info(\n `Schedule ${schedule._id}: Current date ${currentDateString} is before start date ${schedule.startDate}`,\n );\n return false;\n }\n\n // Check if current date is after end date (if endDate is provided)\n if (schedule.endDate) {\n const endDate = new Date(schedule.endDate + \"T00:00:00\");\n if (currentDateOnly > endDate) {\n logger.info(\n `Schedule ${schedule._id}: Current date ${currentDateString} is after end date ${schedule.endDate}`,\n );\n return false;\n }\n }\n\n // Check if the time matches\n const [scheduleHour, scheduleMinute] = schedule.time\n .split(\":\")\n .map(Number);\n\n const timeMatches =\n currentHour === scheduleHour && currentMinute === scheduleMinute;\n\n if (!timeMatches) {\n logger.info(\n `Schedule ${schedule._id}: Time does not match. Current: ${currentHour}:${currentMinute}, Expected: ${scheduleHour}:${scheduleMinute}`,\n );\n return false;\n }\n\n logger.info(\n `Schedule ${schedule._id}: All conditions matched - Date is within range and time matches`,\n );\n return true;\n } catch (error) {\n logger.error(\n `Error checking schedule conditions for ${schedule._id}:`,\n error,\n );\n return false;\n }\n }\n\n async function processScheduledTasks(currentDate?: Date) {\n try {\n logger.info(\"Starting scheduled task processing...\");\n\n const scheduleTasks: TScheduleTask[] = await getAllScheduleTask();\n\n if (!scheduleTasks || scheduleTasks.length === 0) {\n logger.info(\"No schedule tasks found to process\");\n return { processed: 0, validated: 0 };\n }\n\n logger.info(`Found ${scheduleTasks.length} schedule tasks to check`);\n\n let processedCount = 0;\n let validatedCount = 0;\n const validatedTasks: TScheduleTask[] = [];\n\n for (const scheduleTask of scheduleTasks) {\n try {\n logger.info(\n `Checking schedule ${scheduleTask._id} - ${scheduleTask.title}: time=${scheduleTask.time}, startDate=${scheduleTask.startDate}, endDate=${scheduleTask.endDate}`,\n );\n\n const shouldRun = checkScheduleConditions(scheduleTask, currentDate);\n if (!shouldRun) {\n logger.info(\n `Schedule ${scheduleTask._id} conditions not met, skipping`,\n );\n continue;\n }\n\n logger.info(\n `Schedule ${scheduleTask._id} conditions validated, creating area checklists`,\n );\n\n if (!scheduleTask._id) {\n logger.warn(`Schedule ${scheduleTask.title} has no _id, skipping`);\n continue;\n }\n\n if (!scheduleTask.site) {\n logger.warn(`Schedule ${scheduleTask._id} has no site, skipping`);\n continue;\n }\n\n logger.info(\n `Getting or creating parent checklist for schedule ${scheduleTask._id} in site ${scheduleTask.site}`,\n );\n\n const parentChecklistIds = await createParentChecklist({\n site: scheduleTask.site.toString(),\n createdAt: new Date(),\n });\n\n const parentChecklistId = Array.isArray(parentChecklistIds)\n ? parentChecklistIds[0]\n : parentChecklistIds;\n\n logger.info(\n `Using parent checklist ${parentChecklistId}, now creating/updating area checklists`,\n );\n\n for (const area of scheduleTask.areas) {\n try {\n const areaId = area.value.toString();\n\n const areaDetails = (await getAreaById(areaId)) as any;\n\n let units: TAreaChecklistUnits[] = [];\n\n if (areaDetails.units && areaDetails.units.length > 0) {\n units = areaDetails.units.map((unit: any) => ({\n unit: unit.unit.toString(),\n name: unit.name,\n }));\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Using units from area details: ${JSON.stringify(\n units,\n )}`,\n );\n }\n\n if (units.length === 0) {\n logger.warn(\n `Area ${area.name} (${areaId}): No units found, skipping area.`,\n );\n continue;\n }\n\n let existingAreaChecklist;\n try {\n existingAreaChecklist = await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Existing area checklist found: ${\n existingAreaChecklist ? \"Yes\" : \"No\"\n }`,\n );\n if (existingAreaChecklist) {\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Existing checklist content: ${JSON.stringify(\n existingAreaChecklist.checklist,\n )}`,\n );\n }\n } catch (error) {\n existingAreaChecklist = null;\n logger.info(\n `Area ${area.name} (${areaId}): No existing area checklist found (exception).`,\n );\n }\n\n if (existingAreaChecklist) {\n const currentSetNumber =\n existingAreaChecklist.checklist?.length || 0;\n const newSet: TAreaChecklist = {\n set: currentSetNumber + 1,\n units: units,\n };\n\n const updatedChecklist = [\n ...(existingAreaChecklist.checklist || []),\n newSet,\n ];\n logger.info(\n `Area ${area.name} (${areaId}): Appending new set ${\n newSet.set\n } to checklist. Updated checklist: ${JSON.stringify(\n updatedChecklist,\n )}`,\n );\n\n await updateAreaChecklist(existingAreaChecklist._id, {\n checklist: updatedChecklist,\n });\n\n logger.info(\n `Appended set ${newSet.set} to area checklist for area ${area.name}`,\n );\n try {\n const verifyChecklist =\n await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Checklist after update: ${JSON.stringify(\n verifyChecklist.checklist,\n )}`,\n );\n } catch (verifyError: any) {\n logger.warn(\n `Area ${area.name} (${areaId}): Error verifying checklist after update:`,\n verifyError,\n );\n }\n } else {\n const checklistData: TCleaningScheduleArea = {\n schedule: parentChecklistId.toString(),\n area: areaId,\n name: area.name,\n type: areaDetails.type || \"common\",\n checklist: [\n {\n set: 1,\n units: units,\n },\n ],\n createdBy: scheduleTask.createdBy,\n };\n\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Creating new area checklist with data: ${JSON.stringify(\n checklistData,\n )}`,\n );\n await createAreaChecklist(checklistData);\n logger.info(`Created new area checklist for area ${area.name}`);\n try {\n const verifyChecklist =\n await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Checklist after creation: ${JSON.stringify(\n verifyChecklist.checklist,\n )}`,\n );\n } catch (verifyError: any) {\n logger.warn(\n `Area ${area.name} (${areaId}): Error verifying checklist after creation:`,\n verifyError,\n );\n }\n }\n } catch (error) {\n logger.error(`Error processing area ${area.name}:`, error);\n continue;\n }\n }\n\n processedCount++;\n validatedCount++;\n validatedTasks.push(scheduleTask);\n\n logger.info(\n `Successfully processed schedule ${scheduleTask._id}, created/updated area checklists for all areas.`,\n );\n } catch (error) {\n logger.error(\n `Error processing schedule task ${scheduleTask._id}:`,\n error,\n );\n continue;\n }\n }\n\n logger.info(\n `Scheduled task processing completed. Processed: ${processedCount}, Validated: ${validatedCount} tasks`,\n );\n\n return {\n processed: processedCount,\n validated: validatedCount,\n tasks: validatedTasks,\n };\n } catch (error) {\n logger.error(\"Error processing scheduled tasks:\", error);\n throw error;\n }\n }\n\n return { checkScheduleConditions, processScheduledTasks };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { scheduleTaskSchema } from \"../models/hygiene-schedule-task.model\";\nimport { useScheduleTaskRepository } from \"../repositories/hygiene-schedule-task.repository\";\n\nexport function useScheduleTaskController() {\n const {\n createScheduleTask: _createScheduleTask,\n getScheduleTasks: _getScheduleTasks,\n getTasksForScheduleTask: _getTasksForScheduleTask,\n getScheduleTaskById: _getScheduleTaskById,\n updateScheduleTask: _updateScheduleTask,\n } = useScheduleTaskRepository();\n\n async function createScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, ...req.params, createdBy };\n\n const { error } = scheduleTaskSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createScheduleTask(payload);\n\n res\n .status(201)\n .json({ message: \"Schedule task created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getScheduleTasks(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getScheduleTasks({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getTasksForScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getTasksForScheduleTask({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getScheduleTaskById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getScheduleTaskById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n title: Joi.string().optional().allow(\"\", null),\n time: Joi.string()\n .pattern(/^([0-1]\\d|2[0-3]):([0-5]\\d)$/)\n .optional()\n .allow(\"\", null),\n startDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n endDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n description: Joi.string().optional().allow(\"\", null),\n areas: Joi.array()\n .min(1)\n .items(\n Joi.object({\n name: Joi.string().required(),\n value: Joi.any().required(),\n }),\n )\n .optional(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateScheduleTask(id, value);\n\n res.json({ message: \"Schedule task updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createScheduleTask,\n getScheduleTasks,\n getTasksForScheduleTask,\n getScheduleTaskById,\n updateScheduleTask,\n };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport { launch } from \"puppeteer\";\nimport QRCode from \"qrcode\";\n\nexport function useQRService() {\n async function generateQRDataUrl(qrUrl: string): Promise<string> {\n return QRCode.toDataURL(qrUrl, {\n width: 350,\n margin: 2,\n errorCorrectionLevel: \"M\",\n color: {\n dark: \"#000000\",\n light: \"#FFFFFF\",\n },\n });\n }\n\n async function generateQRImage(qrUrl: string): Promise<Buffer> {\n try {\n // Generate QR code as data URL server-side\n const qrDataUrl = await generateQRDataUrl(qrUrl);\n\n const browser = await launch({\n headless: true,\n executablePath: process.env.CHROME_BINARY,\n args: [`--no-sandbox`, `--disable-gpu`, `--disable-dev-shm-usage`],\n });\n\n const page = await browser.newPage();\n\n await page.setViewport({\n width: 400,\n height: 400,\n });\n\n // Use embedded QR code image (no external CDN needed)\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <style>\n body {\n margin: 0;\n padding: 20px;\n display: flex;\n justify-content: center;\n align-items: center;\n background: white;\n min-height: 100vh;\n }\n #qr-image {\n display: block;\n width: 350px;\n height: 350px;\n }\n </style>\n </head>\n <body>\n <img id=\"qr-image\" src=\"${qrDataUrl}\" alt=\"QR Code\" />\n </body>\n </html>\n `;\n\n await page.setContent(html, {\n waitUntil: [\"load\", \"networkidle0\"],\n });\n\n await page.waitForSelector(\"#qr-image\", { timeout: 10000 });\n\n const imageBuffer = await page.screenshot({\n type: \"png\",\n clip: {\n x: 0,\n y: 0,\n width: 400,\n height: 400,\n },\n });\n\n await browser.close();\n\n return imageBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate QR image: ${error.message}`,\n });\n throw error;\n }\n }\n\n async function generateQRPDF(qrUrl: string, title?: string): Promise<Buffer> {\n try {\n // Generate QR code as data URL server-side (no CDN needed)\n const qrDataUrl = await generateQRDataUrl(qrUrl);\n\n const browser = await launch({\n headless: true,\n executablePath: process.env.CHROME_BINARY,\n args: [`--no-sandbox`, `--disable-gpu`, `--disable-dev-shm-usage`],\n });\n\n const page = await browser.newPage();\n\n // Set viewport for PDF generation\n await page.setViewport({\n width: 800,\n height: 1100,\n });\n\n // Escape title for safe HTML insertion\n const escapedTitle = (title || \"Cleaning Schedule QR Code\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n\n // Generate HTML with embedded QR code image (no external JavaScript needed)\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n body {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: white;\n padding: 60px 40px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n }\n .qr-container {\n text-align: center;\n background: transparent;\n padding: 0;\n }\n h1 {\n font-size: 28px;\n color: #333;\n margin-bottom: 20px;\n font-weight: 600;\n }\n .qr-wrapper {\n display: inline-block;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 0;\n margin: 20px 0;\n }\n #qr-image {\n display: block;\n width: 350px;\n height: 350px;\n }\n .instructions {\n margin-top: 30px;\n font-size: 16px;\n color: #666;\n line-height: 1.6;\n }\n .url-info {\n margin-top: 20px;\n padding: 15px;\n background: #f5f5f5;\n border-radius: 6px;\n font-size: 12px;\n color: #888;\n word-break: break-all;\n }\n </style>\n </head>\n <body>\n <div class=\"qr-container\">\n <h1>${escapedTitle}</h1>\n <div class=\"qr-wrapper\">\n <img id=\"qr-image\" src=\"${qrDataUrl}\" alt=\"QR Code\" />\n </div>\n <div class=\"instructions\">\n <p>Scan this QR code to access the cleaning schedule.</p>\n </div>\n <div class=\"url-info\">\n ${qrUrl}\n </div>\n </div>\n </body>\n </html>\n `;\n\n await page.setContent(html, {\n waitUntil: [\"load\", \"networkidle0\"],\n });\n\n // Wait for QR code image to load\n await page.waitForSelector(\"#qr-image\", { timeout: 10000 });\n\n // Wait for the image to fully load\n await page.waitForFunction(\n () => {\n const img = document.getElementById(\"qr-image\") as HTMLImageElement;\n return img && img.complete && img.naturalWidth > 0;\n },\n { timeout: 10000 },\n );\n\n // Generate PDF\n const pdfBuffer = await page.pdf({\n format: \"A4\",\n printBackground: true,\n margin: {\n top: \"20mm\",\n right: \"20mm\",\n bottom: \"20mm\",\n left: \"20mm\",\n },\n });\n\n await browser.close();\n\n return pdfBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate QR PDF: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateQRImage,\n generateQRPDF,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useQRService } from \"../services/hygiene-qr.service\";\n\nexport function useQRController() {\n const { generateQRImage: _generateQRImage, generateQRPDF: _generateQRPDF } =\n useQRService();\n\n async function generateQR(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n url: Joi.string().uri().required(),\n filename: Joi.string().optional().allow(\"\", null),\n title: Joi.string().optional().allow(\"\", null),\n download: Joi.boolean().optional().default(false),\n });\n\n const query = { ...req.query };\n\n const { error, value } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { url, filename, title, download } = value;\n\n // If download is requested, generate PDF, otherwise generate PNG image\n if (download) {\n const pdfBuffer = await _generateQRPDF(url, title);\n\n if (!pdfBuffer || pdfBuffer.length === 0) {\n throw new Error(\"Generated QR PDF is empty or invalid.\");\n }\n\n const sanitizedFilename = (filename || \"qrcode\")\n .replace(/['\"]/g, \"\")\n .replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\"Content-Type\", \"application/pdf\");\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"${sanitizedFilename}-${formattedDate}.pdf\"`,\n );\n res.setHeader(\"Content-Length\", pdfBuffer.length);\n\n res.end(pdfBuffer);\n } else {\n // Generate PNG image for inline display\n const imageBuffer = await _generateQRImage(url);\n\n if (!imageBuffer || imageBuffer.length === 0) {\n throw new Error(\"Generated QR image is empty or invalid.\");\n }\n\n res.setHeader(\"Content-Type\", \"image/png\");\n res.setHeader(\"Cache-Control\", \"public, max-age=3600\");\n res.setHeader(\"Content-Length\", imageBuffer.length);\n\n res.end(imageBuffer);\n }\n\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n generateQR,\n };\n}\n"],"mappings":"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","names":["BadRequestError","logger","logger","BadRequestError","error","Joi","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","ObjectId","error","ObjectId","useAtlas","InternalServerError","BadRequestError","useCache","logger","makeCacheKey","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","BadRequestError","logger","NotFoundError","logger","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","Joi","ObjectId","BadRequestError","logger","error","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","paginate","BadRequestError","NotFoundError","logger","Joi","BadRequestError","logger","xlsx","logger","BadRequestError","error","Joi","BadRequestError","logger","NotFoundError","useAtlas","logger","xlsx","BadRequestError","NotFoundError","logger","useAtlas","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","paginate","useCache","logger","makeCacheKey","BadRequestError","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","dateStr","result","makeCacheKey","paginate","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","ObjectId","error","logger","useAtlas","ObjectId","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","makeCacheKey","paginate","useAtlas","logger","set","Joi","BadRequestError","logger","value","Joi","logger","BadRequestError","error","decision","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","NotFoundError","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","paginate","NotFoundError","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","BadRequestError","useCache","logger","makeCacheKey","paginate","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","useAtlas","BadRequestError","useAtlas","NotFoundError","BadRequestError","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","useCache","logger","makeCacheKey","paginate","BadRequestError","NotFoundError","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","BadRequestError","useAtlas","useAtlas","BadRequestError","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error","BadRequestError","logger","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","NotFoundError","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","logger","logger","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","logger","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/models/hygiene-base.model.ts","../src/repositories/hygiene-dashboard.repository.ts","../src/controllers/hygiene-dashboard.controller.ts","../src/models/hygiene-area.model.ts","../src/repositories/hygiene-area.repository.ts","../src/utils/capitalize-text.ts","../src/services/hygiene-area.service.ts","../src/services/hygiene-area-export.service.ts","../src/repositories/hygiene-unit.repository.ts","../src/models/hygiene-unit.model.ts","../src/controllers/hygiene-area.controller.ts","../src/utils/convert-excel.util.ts","../src/services/hygiene-unit.service.ts","../src/services/hygiene-unit-export.service.ts","../src/controllers/hygiene-unit.controller.ts","../src/models/hygiene-parent-checklist.model.ts","../src/repositories/hygiene-parent-checklist.repository.ts","../src/controllers/hygiene-parent-checklist.controller.ts","../src/models/hygiene-area-checklist.model.ts","../src/services/hygiene-area-checklist.service.ts","../src/repositories/hygiene-area-checklist.repository.ts","../src/controllers/hygiene-area-checklist.controller.ts","../src/models/hygiene-supply.model.ts","../src/repositories/hygiene-supply.repository.ts","../src/controllers/hygiene-supply.controller.ts","../src/models/hygiene-stock.model.ts","../src/repositories/hygiene-stock.repository.ts","../src/services/hygiene-stock.service.ts","../src/controllers/hygiene-stock.controller.ts","../src/models/hygiene-checkout-item.model.ts","../src/repositories/hygiene-checkout-item.repository.ts","../src/services/hygiene-checkout-item.service.ts","../src/controllers/hygiene-checkout-item.controller.ts","../src/models/hygiene-schedule-task.model.ts","../src/repositories/hygiene-schedule-task.repository.ts","../src/services/hygiene-schedule-task.service.ts","../src/controllers/hygiene-schedule-task.controller.ts","../src/services/hygiene-qr.service.ts","../src/controllers/hygiene-qr.controller.ts"],"sourcesContent":["export const allowedTypes: string[] = [\"common\", \"toilet\"];\n\nexport const allowedStatus: string[] = [\"ready\", \"ongoing\", \"completed\"];\n\nexport const allowedPeriods: string[] = [\"today\", \"thisWeek\", \"thisMonth\"];\n","import moment from \"moment-timezone\";\nimport { ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n BadRequestError,\n useCache,\n makeCacheKey,\n logger,\n} from \"@7365admin1/node-server-utils\";\nimport { allowedPeriods } from \"../models/hygiene-base.model\";\n\nexport function useHygieneDashboardRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const dashboard_namespace_collection = \"hygiene.dashboard\";\n const feedback_namespace_collection = \"feedbacks\";\n const cleaning_schedule_namespace_collection = \"site.cleaning.schedules\";\n const area_checklist_namespace_collection = \"site.cleaning.schedule.areas\";\n const schedule_task_namespace_collection = \"site.schedule-tasks\";\n const supply_namespace_collection = \"site.supplies\";\n const request_item_namespace_collection = \"site.supply.requests\";\n\n const feedbackCollection = db.collection(feedback_namespace_collection);\n const areaChecklistCollection = db.collection(\n area_checklist_namespace_collection,\n );\n const scheduleTaskCollection = db.collection(\n schedule_task_namespace_collection,\n );\n const supplyCollection = db.collection(supply_namespace_collection);\n const requestItemCollection = db.collection(\n request_item_namespace_collection,\n );\n\n const { setCache, getCache } = useCache(dashboard_namespace_collection);\n\n async function getHygieneDashboard({\n site,\n feedbackPeriod = \"today\",\n commonAreaPeriod = \"today\",\n toiletAreaPeriod = \"today\",\n scheduleTaskPeriod = \"today\",\n supplyPeriod = \"today\",\n requestItemPeriod = \"today\",\n }: {\n site: string | ObjectId;\n feedbackPeriod?: (typeof allowedPeriods)[number];\n commonAreaPeriod?: (typeof allowedPeriods)[number];\n toiletAreaPeriod?: (typeof allowedPeriods)[number];\n scheduleTaskPeriod?: (typeof allowedPeriods)[number];\n supplyPeriod?: (typeof allowedPeriods)[number];\n requestItemPeriod?: (typeof allowedPeriods)[number];\n }) {\n const countQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n const yesterDayQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n const todayQueries: Record<string, any> = {\n feedback: {},\n commonArea: {},\n toiletArea: {},\n scheduleTask: {},\n supply: {},\n requestItem: {},\n };\n\n const cacheOptions: Record<string, any> = {\n feedbackPeriod,\n commonAreaPeriod,\n toiletAreaPeriod,\n scheduleTaskPeriod,\n supplyPeriod,\n requestItemPeriod,\n };\n\n try {\n site = new ObjectId(site);\n Object.keys(countQueries).forEach((key) => {\n countQueries[key].site = site;\n yesterDayQueries[key].site = site;\n todayQueries[key].site = site;\n });\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const dashboardCacheKey = makeCacheKey(\n dashboard_namespace_collection,\n cacheOptions,\n );\n\n const cachedDashboard = await getCache(dashboardCacheKey);\n if (cachedDashboard) {\n logger.info(`Cache hit for dashboard: ${dashboardCacheKey}`);\n return cachedDashboard;\n }\n\n function formatEndDate(date: string | Date): Date {\n if (typeof date === \"string\") {\n const dateWithoutTimezone = date.replace(/\\s*\\+\\d{2}:\\d{2}$/, \"\");\n date = new Date(dateWithoutTimezone);\n }\n const singaporeMoment = moment.tz(date, \"Asia/Singapore\");\n singaporeMoment.set({\n hour: 23,\n minute: 59,\n second: 59,\n millisecond: 999,\n });\n return singaporeMoment.toDate();\n }\n\n function applyPeriodToQuery(query: Record<string, any>, period: string) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n if (period === \"today\") {\n query.createdAt = {\n $gte: today,\n $lte: formatEndDate(today),\n };\n } else if (period === \"thisWeek\" || period === \"thisMonth\") {\n const filterDate = period === \"thisWeek\" ? 7 : 30;\n const filterStartDate = new Date();\n filterStartDate.setDate(today.getDate() - filterDate);\n filterStartDate.setHours(0, 0, 0, 0);\n query.createdAt = {\n $gte: filterStartDate,\n $lte: formatEndDate(new Date()),\n };\n }\n }\n\n try {\n applyPeriodToQuery(countQueries.feedback, feedbackPeriod);\n applyPeriodToQuery(countQueries.commonArea, commonAreaPeriod);\n applyPeriodToQuery(countQueries.toiletArea, toiletAreaPeriod);\n applyPeriodToQuery(countQueries.scheduleTask, scheduleTaskPeriod);\n applyPeriodToQuery(countQueries.supply, supplyPeriod);\n applyPeriodToQuery(countQueries.requestItem, requestItemPeriod);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const yesterdayEnd = new Date(yesterday);\n yesterdayEnd.setHours(23, 59, 59, 999);\n\n Object.keys(yesterDayQueries).forEach((key) => {\n yesterDayQueries[key].createdAt = {\n $gte: yesterday,\n $lte: yesterdayEnd,\n };\n });\n Object.keys(todayQueries).forEach((key) => {\n todayQueries[key].createdAt = {\n $gte: today,\n $lte: formatEndDate(new Date()),\n };\n });\n\n const calculatePercentageChange = (\n currentCount: number,\n previousCount: number,\n ) => {\n if (previousCount === 0) {\n return currentCount > 0 ? 100 : 0;\n }\n return (\n Math.round(\n ((currentCount - previousCount) / previousCount) * 100 * 100,\n ) / 100\n );\n };\n\n const [\n feedbackReport,\n commonAreaChecklistReport,\n toiletAreaChecklistReport,\n scheduleTaskReport,\n supplyReport,\n requestItemReport,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...countQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: countQueries.commonArea.createdAt\n ? [\n {\n $match: {\n site: site,\n createdAt: countQueries.commonArea.createdAt,\n },\n },\n ]\n : [{ $match: { site: site } }],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: countQueries.toiletArea.createdAt\n ? [\n {\n $match: {\n site: site,\n createdAt: countQueries.toiletArea.createdAt,\n },\n },\n ]\n : [{ $match: { site: site } }],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: countQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: countQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: countQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const [\n yesterdayFeedbackCount,\n yesterdayCommonAreaChecklistCount,\n yesterdayToiletAreaChecklistCount,\n yesterdayScheduledTaskCount,\n yesterdaySupplyCount,\n yesterdayRequestItemCount,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...yesterDayQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: yesterDayQueries.commonArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: yesterDayQueries.toiletArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: yesterDayQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: yesterDayQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: yesterDayQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const [\n todayFeedbackCount,\n todayCommonAreaChecklistCount,\n todayToiletAreaChecklistCount,\n todayScheduledTaskCount,\n todaySupplyCount,\n todayRequestItemCount,\n ] = await Promise.all([\n feedbackCollection\n .aggregate([\n {\n $match: {\n ...todayQueries.feedback,\n category: \"cleaning_services\",\n status: \"to-do\",\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"common\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: todayQueries.commonArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n areaChecklistCollection\n .aggregate([\n { $match: { type: \"toilet\" } },\n {\n $lookup: {\n from: cleaning_schedule_namespace_collection,\n localField: \"schedule\",\n foreignField: \"_id\",\n as: \"scheduleDoc\",\n pipeline: [\n {\n $match: {\n site: site,\n createdAt: todayQueries.toiletArea.createdAt,\n },\n },\n ],\n },\n },\n {\n $unwind: {\n path: \"$scheduleDoc\",\n preserveNullAndEmptyArrays: false,\n },\n },\n { $count: \"count\" },\n ])\n .toArray(),\n scheduleTaskCollection\n .aggregate([\n { $match: todayQueries.scheduleTask },\n { $count: \"count\" },\n ])\n .toArray(),\n supplyCollection\n .aggregate([{ $match: todayQueries.supply }, { $count: \"count\" }])\n .toArray(),\n requestItemCollection\n .aggregate([\n { $match: todayQueries.requestItem },\n { $count: \"count\" },\n ])\n .toArray(),\n ]);\n\n const resultYesterday = {\n feedbackCount: yesterdayFeedbackCount[0]?.count || 0,\n commonAreaChecklistCount:\n yesterdayCommonAreaChecklistCount[0]?.count || 0,\n toiletAreaChecklistCount:\n yesterdayToiletAreaChecklistCount[0]?.count || 0,\n scheduleTaskCount: yesterdayScheduledTaskCount[0]?.count || 0,\n supplyCount: yesterdaySupplyCount[0]?.count || 0,\n requestItemCount: yesterdayRequestItemCount[0]?.count || 0,\n };\n\n const resultToday = {\n feedbackCount: todayFeedbackCount[0]?.count || 0,\n commonAreaChecklistCount: todayCommonAreaChecklistCount[0]?.count || 0,\n toiletAreaChecklistCount: todayToiletAreaChecklistCount[0]?.count || 0,\n scheduleTaskCount: todayScheduledTaskCount[0]?.count || 0,\n supplyCount: todaySupplyCount[0]?.count || 0,\n requestItemCount: todayRequestItemCount[0]?.count || 0,\n };\n\n const result = {\n feedback: {\n count: feedbackReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.feedbackCount,\n resultYesterday.feedbackCount,\n ),\n },\n commonAreaChecklist: {\n count: commonAreaChecklistReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.commonAreaChecklistCount,\n resultYesterday.commonAreaChecklistCount,\n ),\n },\n toiletAreaChecklist: {\n count: toiletAreaChecklistReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.toiletAreaChecklistCount,\n resultYesterday.toiletAreaChecklistCount,\n ),\n },\n scheduleTask: {\n count: scheduleTaskReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.scheduleTaskCount,\n resultYesterday.scheduleTaskCount,\n ),\n },\n supply: {\n count: supplyReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.supplyCount,\n resultYesterday.supplyCount,\n ),\n },\n requestItem: {\n count: requestItemReport[0]?.count || 0,\n percentage: calculatePercentageChange(\n resultToday.requestItemCount,\n resultYesterday.requestItemCount,\n ),\n },\n };\n\n setCache(dashboardCacheKey, result, 15 * 60)\n .then(() => {\n logger.info(`Cache set for dashboard: ${dashboardCacheKey}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to set cache for dashboard: ${dashboardCacheKey}`,\n err,\n );\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n getHygieneDashboard,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedPeriods } from \"../models/hygiene-base.model\";\nimport { useHygieneDashboardRepository } from \"../repositories/hygiene-dashboard.repository\";\n\nexport function useHygieneDashboardController() {\n const { getHygieneDashboard: _getHygieneDashboard } =\n useHygieneDashboardRepository();\n\n async function getHygieneDashboard(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n feedbackPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n commonAreaPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n toiletAreaPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n scheduleTaskPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n supplyPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n requestItemPeriod: Joi.string()\n .valid(...allowedPeriods)\n .optional(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const site = (req.params.site as string) ?? \"\";\n const feedbackPeriod =\n (req.query.feedbackPeriod as (typeof allowedPeriods)[number]) || \"today\";\n const commonAreaPeriod =\n (req.query.commonAreaPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const toiletAreaPeriod =\n (req.query.toiletAreaPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const scheduleTaskPeriod =\n (req.query.scheduleTaskPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n const supplyPeriod =\n (req.query.supplyPeriod as (typeof allowedPeriods)[number]) || \"today\";\n const requestItemPeriod =\n (req.query.requestItemPeriod as (typeof allowedPeriods)[number]) ||\n \"today\";\n\n try {\n const data = await _getHygieneDashboard({\n site,\n feedbackPeriod,\n commonAreaPeriod,\n toiletAreaPeriod,\n scheduleTaskPeriod,\n supplyPeriod,\n requestItemPeriod,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n getHygieneDashboard,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedTypes } from \"./hygiene-base.model\";\n\nexport type TAreaUnits = {\n unit: string | ObjectId;\n name: string;\n};\n\nexport type TArea = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n set?: number;\n units?: TAreaUnits[];\n status?: \"active\" | \"deleted\";\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport type TAreaCreate = Pick<\n TArea,\n \"site\" | \"name\" | \"type\" | \"set\" | \"units\"\n>;\n\nexport type TAreaGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number] | \"all\";\n} & Pick<TArea, \"site\">;\n\nexport type TAreaUpdate = Partial<\n Pick<TArea, \"name\" | \"type\" | \"set\" | \"units\">\n>;\n\nexport type TAreaUpdateChecklist = {\n units: TAreaUnits[];\n};\n\nexport const areaSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).optional(),\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n});\n\nexport function MArea(value: TAreaCreate) {\n const { error } = areaSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.units && Array.isArray(value.units)) {\n value.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n return {\n site: value.site,\n name: value.name,\n type: value.type,\n set: value.set ?? 0,\n units: value.units ?? [],\n status: \"active\",\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport { capitalizeText } from \"../utils/capitalize-text\";\nimport {\n MArea,\n TAreaCreate,\n TAreaGetQuery,\n TAreaUpdate,\n} from \"../models/hygiene-area.model\";\n\nexport function useAreaRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { \"units.unit\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene area.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene area.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, type: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\",\n );\n }\n }\n\n async function createArea(value: TAreaCreate, session?: ClientSession) {\n try {\n value = MArea(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\n `${capitalizeText(value.type)} area already exists.`,\n );\n }\n\n throw error;\n }\n }\n\n async function getAreas({\n page = 1,\n limit = 10,\n search = \"\",\n type = \"all\",\n site,\n }: TAreaGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (type && type !== \"all\") {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n set: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreasForChecklist(site: string | ObjectId) {\n const query: Record<string, any> = { status: { $ne: \"deleted\" } };\n const cacheOptions: Record<string, any> = {};\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n set: 1,\n units: 1,\n },\n },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n type: 1,\n name: 1,\n set: 1,\n units: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaByMultipleId(_id: string[] | ObjectId[]) {\n for (let i = 0; i < _id.length; i++) {\n try {\n _id[i] = new ObjectId(_id[i]);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n }\n\n const query: Record<string, any> = {\n _id: { $in: _id },\n status: { $ne: \"deleted\" },\n };\n\n try {\n const data = await collection.aggregate([{ $match: query }]).toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function verifyAreaByUnitId(unitId: string | ObjectId) {\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n const query: Record<string, any> = {\n \"units.unit\": unitId,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n verify_unitId: unitId.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const count = await collection.countDocuments(query);\n const result = count > 0;\n\n setCache(cacheKey, result, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateArea(\n _id: string | ObjectId,\n value: TAreaUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue: any = {\n updatedAt: new Date(),\n };\n\n if (value.name !== undefined) {\n updateValue.name = value.name;\n }\n\n if (value.type !== undefined) {\n updateValue.type = value.type;\n }\n\n if (value.set !== undefined) {\n updateValue.set = value.set;\n }\n\n if (value.units && Array.isArray(value.units)) {\n updateValue.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n unitId: string | ObjectId,\n name: string,\n session?: ClientSession,\n ) {\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const res = await collection.updateMany(\n { \"units.unit\": unitId },\n {\n $set: {\n \"units.$.name\": name,\n updatedAt: new Date(),\n },\n },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update unit name in areas.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteArea(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createArea,\n getAreas,\n getAreasForChecklist,\n getAreaById,\n getAreaByMultipleId,\n verifyAreaByUnitId,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n };\n}\n","export function capitalizeText(text: string): string {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaExportService } from \"./hygiene-area-export.service\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\n\nexport function useAreaService() {\n const { createArea: _createArea, getAreasForChecklist } = useAreaRepo();\n const { generateAreaExcel } = useAreaExportService();\n const { getUnits: _getUnits } = useUnitRepository();\n\n async function importArea({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n // Fetch all units for this site to match unit names\n let availableUnits: Array<{ _id: ObjectId; name: string }> = [];\n try {\n const unitsData = (await _getUnits({\n page: 1,\n limit: 999999,\n search: \"\",\n site,\n })) as { items: any[]; pages: number };\n\n if (unitsData && unitsData.items) {\n availableUnits = unitsData.items;\n }\n } catch (error) {\n logger.warn(`Failed to fetch units for site: ${error}`);\n // Continue without units if fetch fails\n }\n\n const insertedAreaIds: ObjectId[] = [];\n const duplicateAreas: string[] = [];\n const failedAreas: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.TYPE) {\n logger.warn(`Skipping row ${i + 1} with missing TYPE:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaType = String(row.TYPE).trim().toLowerCase();\n if (!areaType) {\n logger.warn(`Skipping row ${i + 1} with empty area type`);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaNameValue = row?.NAME || row?.AREA;\n if (!areaNameValue) {\n logger.warn(`Skipping row ${i + 1} with missing NAME/AREA:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaName = String(areaNameValue).trim();\n if (!areaName) {\n logger.warn(`Skipping row ${i + 1} with empty ${areaType} area name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n if (areaName.startsWith(\"Sample:\")) {\n logger.warn(`Skipping row ${i + 1} with sample area: ${areaName}`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const areaData: any = {\n type: areaType,\n name: areaName,\n site,\n };\n\n // Handle SET field\n if (row.SET !== undefined && row.SET !== null && row.SET !== \"\") {\n const setNumber = parseInt(String(row.SET).trim());\n if (!isNaN(setNumber) && setNumber >= 0) {\n areaData.set = setNumber;\n }\n }\n\n // Handle UNITS field\n if (row.UNITS && availableUnits.length > 0) {\n const unitNames = String(row.UNITS)\n .split(\",\")\n .map((u) => u.trim())\n .filter((u) => u);\n\n if (unitNames.length > 0) {\n const areaUnits: Array<{ unit: ObjectId; name: string }> = [];\n\n for (const unitName of unitNames) {\n const foundUnit = availableUnits.find(\n (u) => u.name.toLowerCase() === unitName.toLowerCase(),\n );\n\n if (foundUnit) {\n areaUnits.push({\n unit: foundUnit._id,\n name: foundUnit.name,\n });\n } else {\n logger.warn(\n `Unit \"${unitName}\" not found in site for area \"${areaName}\"`,\n );\n }\n }\n\n if (areaUnits.length > 0) {\n areaData.units = areaUnits;\n }\n }\n }\n\n const insertedId = await _createArea(areaData);\n\n insertedAreaIds.push(insertedId);\n\n logger.info(`Successfully created ${areaType} area: ${areaName}`);\n } catch (error: any) {\n logger.error(\n `Error creating ${areaType} area \"${areaName}\": ${error.message}`,\n );\n\n if (error.message.includes(\"duplicate\")) {\n duplicateAreas.push(areaName);\n } else {\n failedAreas.push(areaName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedAreaIds.length} areas successfully created`;\n\n if (duplicateAreas.length > 0) {\n message += `, ${duplicateAreas.length} areas skipped (already exist)`;\n }\n\n if (failedAreas.length > 0) {\n message += `, ${failedAreas.length} areas failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedAreaIds.length === 0) {\n if (\n duplicateAreas.length > 0 &&\n failedAreas.length === 0 &&\n skippedRows.length === 0\n ) {\n return {\n message: `No new areas were created. All ${\n duplicateAreas.length\n } areas already exist in the system: ${duplicateAreas.join(\", \")}`,\n };\n } else if (failedAreas.length > 0) {\n throw new BadRequestError(\n `No areas were created. ${failedAreas.length} areas failed due to errors. Please check your data format and ensure area names are valid.`,\n );\n } else if (skippedRows.length > 0 && duplicateAreas.length === 0) {\n throw new BadRequestError(\n `No areas were created. All ${skippedRows.length} rows contained invalid or missing data.`,\n );\n } else {\n return {\n message: `No new areas were created. ${duplicateAreas.length} areas already exist, ${skippedRows.length} rows had invalid data.`,\n };\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading area information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\",\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`,\n );\n }\n }\n }\n\n async function exportAreas(site: string | ObjectId) {\n try {\n const areas = (await getAreasForChecklist(site)) as any[];\n\n if (!areas || !Array.isArray(areas) || areas.length === 0) {\n throw new BadRequestError(\"No data found to export\");\n }\n\n // Generate Excel file\n const excelBuffer = (await generateAreaExcel(areas)) as Buffer;\n\n if (!excelBuffer || excelBuffer.length === 0) {\n throw new Error(\"Generated Excel file is empty or invalid.\");\n }\n\n return excelBuffer;\n } catch (error: any) {\n logger.error(`Error downloading areas: ${error.message}`);\n throw error;\n }\n }\n\n return { importArea, exportAreas };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport * as xlsx from \"xlsx\";\n\ninterface AreaUnit {\n unit?: string;\n name?: string;\n}\n\ninterface Area {\n _id?: string;\n name?: string;\n type?: string;\n set?: number;\n units?: AreaUnit[];\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n}\n\nexport function useAreaExportService() {\n async function generateAreaExcel(areas: Area[]): Promise<Buffer> {\n try {\n const rows: any[] = [];\n\n rows.push([\"AREA\", \"TYPE\", \"SET\", \"UNITS\"]);\n\n for (const area of areas) {\n const areaName = area.name || \"\";\n const areaType = area.type || \"\";\n const areaSet = String(area.set || 0);\n const unitsString =\n area.units && area.units.length > 0\n ? area.units.map((u) => u.name || \"\").join(\", \")\n : \"\";\n\n rows.push([areaName, areaType, areaSet, unitsString]);\n }\n\n const workbook = xlsx.utils.book_new();\n const worksheet = xlsx.utils.aoa_to_sheet(rows);\n\n worksheet[\"!cols\"] = [\n { width: 30 }, // AREA\n { width: 20 }, // TYPE\n { width: 10 }, // SET\n { width: 40 }, // UNITS\n ];\n\n xlsx.utils.book_append_sheet(workbook, worksheet, \"Areas\");\n\n const excelBuffer = xlsx.write(workbook, {\n type: \"buffer\",\n bookType: \"xlsx\",\n });\n\n return excelBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate area Excel: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateAreaExcel,\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MUnit,\n TUnitGetQuery,\n TUnitUpdate,\n TUnitCreate,\n} from \"../models/hygiene-unit.model\";\n\nexport function useUnitRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.area.unit\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene unit.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene unit.\",\n );\n }\n }\n\n async function createUnit(value: TUnitCreate, session?: ClientSession) {\n try {\n value = MUnit(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Unit already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getUnits({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TUnitGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $project: { name: 1 } },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUnit(\n _id: string | ObjectId,\n value: TUnitUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteUnit(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TUnit = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n status?: \"active\" | \"deleted\";\n};\n\nexport type TUnitCreate = Pick<TUnit, \"site\" | \"name\">;\n\nexport type TUnitGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TUnit, \"site\">;\n\nexport type TUnitUpdate = Pick<TUnit, \"name\">;\n\nexport const unitSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n});\n\nexport function MUnit(value: TUnitCreate) {\n const { error } = unitSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n return {\n site: value.site,\n name: value.name,\n status: \"active\",\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\nimport { areaSchema } from \"../models/hygiene-area.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaService } from \"../services/hygiene-area.service\";\n\nexport function useAreaController() {\n const {\n createArea: _createArea,\n getAreas: _getAreas,\n getAreaById: _getAreaById,\n updateArea: _updateArea,\n deleteArea: _deleteById,\n } = useAreaRepo();\n const { importArea: _importArea, exportAreas: _exportAreas } =\n useAreaService();\n\n async function createArea(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = areaSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createArea(payload);\n\n res.status(201).json({ message: \"Area created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreas(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .valid(\"all\", ...allowedTypes)\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"all\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getAreas({\n page,\n limit,\n search,\n type,\n site,\n });\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getAreaById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateArea(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", null, ...allowedTypes),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required(),\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .optional()\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateArea(id, value);\n\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteArea(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteById(value);\n res.json({ message: \"Area deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importArea(\n req: MulterRequest,\n res: Response,\n next: NextFunction,\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const schema = Joi.string().hex().required();\n\n const { error, value } = schema.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _importArea({ dataJson, site: value });\n\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function exportAreas(req: Request, res: Response, next: NextFunction) {\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const excelBuffer = await _exportAreas(value);\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\n \"Content-Type\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n );\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"areas-${formattedDate}.xlsx\"`,\n );\n res.setHeader(\"Content-Length\", excelBuffer.length);\n\n res.end(excelBuffer);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createArea,\n getAreas,\n getAreaById,\n updateArea,\n deleteArea,\n importArea,\n exportAreas,\n };\n}\n","import { Readable } from \"stream\";\nimport * as xlsx from \"xlsx\";\n\nexport function convertBufferFile(bufferFile: Buffer): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const fileStream = Readable.from(bufferFile);\n\n let fileBuffer = Buffer.alloc(0);\n fileStream.on(\"data\", (chunk) => {\n fileBuffer = Buffer.concat([fileBuffer, chunk]);\n });\n\n fileStream.on(\"end\", () => {\n try {\n const workbook = xlsx.read(fileBuffer, { type: \"buffer\" });\n const sheetName = workbook.SheetNames[0];\n const sheet = workbook.Sheets[sheetName];\n const jsonData = xlsx.utils.sheet_to_json(sheet);\n resolve(jsonData);\n } catch (error) {\n reject(\"Error parsing file\");\n }\n });\n\n fileStream.on(\"error\", (err) => {\n reject(\"Error Reading File: \" + err.message);\n });\n });\n}\n\nexport function calculateTotalHrs(time: number) {\n const totalHrs = time / (1000 * 60 * 60);\n return totalHrs.toFixed(1) + \" Hr\";\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@7365admin1/node-server-utils\";\nimport { TUnitUpdate } from \"../models/hygiene-unit.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { useUnitExportService } from \"./hygiene-unit-export.service\";\n\nexport function useUnitService() {\n const { verifyAreaByUnitId, updateAreaChecklist } = useAreaRepo();\n const {\n createUnit: _createUnit,\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n } = useUnitRepository();\n\n async function importUnit({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const insertedUnitIds: ObjectId[] = [];\n const duplicateUnits: string[] = [];\n const failedUnits: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.UNIT) {\n logger.warn(`Skipping row ${i + 1} with missing UNIT:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const unitName = String(row.UNIT).trim();\n if (!unitName) {\n logger.warn(`Skipping row ${i + 1} with empty unit name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n if (unitName.startsWith(\"Sample:\")) {\n logger.warn(`Skipping row ${i + 1} with sample unit: ${unitName}`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const insertedId = await _createUnit({\n name: unitName,\n site,\n });\n\n insertedUnitIds.push(insertedId);\n\n logger.info(`Successfully created unit: ${unitName}`);\n } catch (error: any) {\n logger.error(`Error creating unit \"${unitName}\": ${error.message}`);\n\n if (error.message.includes(\"Unit already exists\")) {\n duplicateUnits.push(unitName);\n } else {\n failedUnits.push(unitName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedUnitIds.length} units successfully created`;\n\n if (duplicateUnits.length > 0) {\n message += `, ${duplicateUnits.length} units skipped (already exist)`;\n }\n\n if (failedUnits.length > 0) {\n message += `, ${failedUnits.length} units failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedUnitIds.length === 0) {\n if (duplicateUnits.length > 0 && failedUnits.length === 0) {\n throw new BadRequestError(\n `No new units were created. All ${\n duplicateUnits.length\n } units already exist in the system: ${duplicateUnits.join(\", \")}`,\n );\n } else if (failedUnits.length > 0) {\n throw new BadRequestError(\n `No units were created. Please check your data format and ensure unit names are valid.`,\n );\n } else if (skippedRows.length > 0) {\n throw new BadRequestError(\n `No units were created. All rows contained invalid or missing unit names.`,\n );\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading unit information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"duplicate\")) {\n throw new BadRequestError(\n \"Upload failed due to duplicate unit names. Please ensure all unit names are unique.\",\n );\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\",\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`,\n );\n }\n }\n }\n\n async function updateUnit(_id: string | ObjectId, value: TUnitUpdate) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const result = await _updateUnit(_id, value, session);\n\n const isExistingArea = await verifyAreaByUnitId(_id);\n if (isExistingArea) {\n await updateAreaChecklist(_id, value.name, session);\n }\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n logger.error(`Error updating unit and associated areas:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteUnit(_id: string | ObjectId) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const isExistingArea = await verifyAreaByUnitId(_id);\n if (isExistingArea) {\n throw new BadRequestError(\"Failed to delete unit, unit is in use.\");\n }\n\n const result = await _deleteUnit(_id, session);\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n logger.error(`Error deleting unit:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function exportUnits(site: string | ObjectId) {\n const { generateUnitExcel: _generateUnitExcel } = useUnitExportService();\n const { getUnits: _getUnits } = useUnitRepository();\n\n try {\n const data = (await _getUnits({\n page: 1,\n limit: 999999,\n search: \"\",\n site,\n })) as { items: any[]; pages: number; pageRange: string };\n\n if (!data || !data.items || data.items.length === 0) {\n throw new BadRequestError(\"No data found to export\");\n }\n\n // Generate Excel file\n const excelBuffer = await _generateUnitExcel(data.items);\n\n if (!excelBuffer || excelBuffer.length === 0) {\n throw new Error(\"Generated Excel file is empty or invalid.\");\n }\n\n return excelBuffer;\n } catch (error: any) {\n logger.error(`Error downloading units: ${error.message}`);\n throw error;\n }\n }\n\n return { importUnit, updateUnit, deleteUnit, exportUnits };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport * as xlsx from \"xlsx\";\n\ninterface Unit {\n _id?: string;\n name?: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n}\n\nexport function useUnitExportService() {\n async function generateUnitExcel(units: Unit[]): Promise<Buffer> {\n try {\n const rows: any[] = [];\n\n rows.push([\"UNIT\"]);\n\n for (const unit of units) {\n const unitName = unit.name || \"\";\n rows.push([unitName]);\n }\n\n const workbook = xlsx.utils.book_new();\n const worksheet = xlsx.utils.aoa_to_sheet(rows);\n\n worksheet[\"!cols\"] = [\n { width: 25 }, // UNIT\n ];\n\n xlsx.utils.book_append_sheet(workbook, worksheet, \"Units\");\n\n const excelBuffer = xlsx.write(workbook, {\n type: \"buffer\",\n bookType: \"xlsx\",\n });\n\n return excelBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate unit Excel: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateUnitExcel,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { unitSchema } from \"../models/hygiene-unit.model\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { useUnitService } from \"../services/hygiene-unit.service\";\n\nexport function useUnitController() {\n const { createUnit: _createUnit, getUnits: _getUnits } = useUnitRepository();\n const {\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n importUnit: _importUnit,\n exportUnits: _exportUnits,\n } = useUnitService();\n\n async function createUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = unitSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnit(payload);\n\n res.status(201).json({ message: \"Unit created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getUnits(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getUnits({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateUnit(id, value);\n\n res.json({ message: \"Unit updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteUnit(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteUnit(value);\n\n res.json({ message: \"Unit deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importUnit(\n req: MulterRequest,\n res: Response,\n next: NextFunction,\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n\n const result = await _importUnit({ dataJson, site: value });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function exportUnits(req: Request, res: Response, next: NextFunction) {\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error, value } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const excelBuffer = await _exportUnits(value);\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\n \"Content-Type\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n );\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"units-${formattedDate}.xlsx\"`,\n );\n res.setHeader(\"Content-Length\", excelBuffer.length);\n\n res.end(excelBuffer);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n importUnit,\n exportUnits,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"./hygiene-base.model\";\n\nexport type TParentChecklist = {\n _id?: ObjectId;\n site?: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TParentChecklistGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n startDate?: string | Date;\n endDate?: string | Date;\n} & Pick<TParentChecklist, \"status\">;\n\nexport const parentChecklistSchema = Joi.object({\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().required(),\n});\n\nexport function MParentChecklist(value: TParentChecklist) {\n const { error } = parentChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Parent Checklist Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(`Invalid site ID format: ${value.site}`);\n }\n }\n\n return {\n site: value.site,\n status: \"ready\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n useCache,\n logger,\n makeCacheKey,\n BadRequestError,\n} from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport {\n MParentChecklist,\n TParentChecklist,\n TParentChecklistGetQuery,\n} from \"../models/hygiene-parent-checklist.model\";\n\nexport function useParentChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedules\";\n const site_collection = \"sites\";\n\n const collection = db.collection(namespace_collection);\n const siteCollection = db.collection(site_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { createdAt: 1 } },\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene parent checklist.\",\n );\n }\n }\n\n async function createParentChecklist(\n value: TParentChecklist,\n session?: ClientSession,\n ) {\n try {\n const currentDate = value.createdAt\n ? new Date(value.createdAt)\n : new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingQuery: any = {\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n };\n\n if (value.site) {\n try {\n existingQuery.site = new ObjectId(value.site);\n logger.info(\n `createParentChecklist: Looking for existing checklist with query: ${JSON.stringify(\n { ...existingQuery, site: value.site },\n )}`,\n );\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n } else {\n logger.info(\n `createParentChecklist: Looking for existing checklist with query (no site filter): ${JSON.stringify(\n existingQuery,\n )}`,\n );\n }\n\n const existingChecklist = await collection.findOne(existingQuery);\n\n if (existingChecklist) {\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Parent checklist already exists for ${\n value.site ? `site ${value.site} on` : \"\"\n } today: ${dateStr}. Found checklist: ${JSON.stringify({\n _id: existingChecklist._id,\n site: existingChecklist.site,\n })}`,\n );\n return existingChecklist._id;\n }\n\n if (value.site) {\n const checklistDoc = MParentChecklist({\n site: value.site,\n createdAt: currentDate,\n });\n\n const result = await collection.insertOne(checklistDoc, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created parent checklist for site ${value.site} for today: ${dateStr}`,\n );\n\n return result.insertedId;\n }\n\n const siteIds = await getHygieneSiteIds();\n\n if (!Array.isArray(siteIds)) {\n logger.error(\"getHygieneSiteIds returned non-array value:\", siteIds);\n throw new InternalServerError(\"Failed to retrieve site IDs\");\n }\n\n if (siteIds.length === 0) {\n logger.warn(\"No sites found for creating parent checklist\");\n throw new BadRequestError(\"No sites available for checklist creation\");\n }\n\n const checklistDocs: any[] = [];\n\n for (const site of siteIds) {\n checklistDocs.push(\n MParentChecklist({\n site,\n createdAt: currentDate,\n }),\n );\n }\n\n const result = await collection.insertMany(checklistDocs, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created ${\n Object.keys(result.insertedIds).length\n } parent checklists for today: ${dateStr}`,\n );\n\n return Object.values(result.insertedIds);\n } catch (error) {\n logger.error(\"Failed to create daily parent checklist\", error);\n throw error;\n }\n }\n\n async function getAllParentChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n startDate = \"\",\n endDate = \"\",\n status = \"all\",\n }: TParentChecklistGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n if (status && status !== \"all\") {\n query.status = status;\n cacheOptions.status = status;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [{ $match: query }];\n\n pipeline.push({\n $project: {\n _id: 1,\n site: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n {\n case: { $eq: [\"$status\", \"ongoing\"] },\n then: \"Ongoing\",\n },\n { case: { $eq: [\"$status\", \"completed\"] }, then: \"Completed\" },\n ],\n default: \"$status\",\n },\n },\n completedAt: 1,\n createdAt: 1,\n },\n });\n\n pipeline.push(\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n );\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateParentChecklistStatuses(\n _id: string | ObjectId,\n status: (typeof allowedStatus)[number],\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"completed\") {\n updateValue.completedAt = new Date();\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update parent checklist status.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getHygieneSiteIds() {\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(site_collection, { tag: \"site-ids\" });\n const cachedData = await getCache(cacheKey);\n if (cachedData && Array.isArray(cachedData)) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await siteCollection\n .aggregate([\n { $match: query },\n { $project: { _id: 1 } },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n const siteIds = items.map((item) => item._id.toString());\n\n if (siteIds.length > 0) {\n setCache(cacheKey, siteIds, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n }\n\n return siteIds;\n } catch (error) {\n logger.error(\"Failed to get hygiene site IDs\", error);\n throw error;\n }\n }\n\n return {\n createIndex,\n createParentChecklist,\n getAllParentChecklist,\n updateParentChecklistStatuses,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport { parentChecklistSchema } from \"../models/hygiene-parent-checklist.model\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\n\nexport function useParentChecklistController() {\n const {\n createParentChecklist: _createParentChecklist,\n getAllParentChecklist: _getAllParentChecklist,\n } = useParentChecklistRepo();\n\n async function createParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const payload = req.body;\n\n const { error } = parentChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createParentChecklist(payload);\n res\n .status(201)\n .json({ message: \"Parent checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n status: Joi.string()\n .valid(...allowedStatus, \"all\")\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n const status = (req.query.status as string) ?? \"all\";\n\n try {\n const data = await _getAllParentChecklist({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n status,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createParentChecklist,\n getAllParentChecklist,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus, allowedTypes } from \"./hygiene-base.model\";\n\nexport const allowedChecklistStatus = [\"ready\", \"completed\"];\n\nexport type TCleaningScheduleArea = {\n _id?: ObjectId;\n schedule: string | ObjectId;\n area: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n checklist: TAreaChecklist[];\n status?: (typeof allowedStatus)[number];\n createdBy?: string | ObjectId;\n createdAt?: Date | string;\n completedAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TAreaChecklist = {\n set: number;\n units: TAreaChecklistUnits[];\n remarks?: string;\n attachment?: string[];\n};\n\nexport type TAreaChecklistUnits = {\n unit: string | ObjectId;\n name: string;\n approve?: boolean;\n reject?: boolean;\n status?: (typeof allowedChecklistStatus)[number];\n remarks?: string;\n completedBy?: string | ObjectId;\n timestamp?: Date | string;\n};\n\nexport type TAreaChecklistCreate = Pick<\n TCleaningScheduleArea,\n \"schedule\" | \"area\"\n> & {\n site: string | ObjectId;\n};\n\nexport type TAreaChecklistBatchCreate = Pick<\n TCleaningScheduleArea,\n \"schedule\" | \"createdBy\"\n> & {\n site: string | ObjectId;\n};\n\nexport type TCleaningScheduleAreaGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number] | \"all\";\n status?: (typeof allowedStatus)[number] | \"all\";\n} & Pick<TCleaningScheduleArea, \"schedule\">;\n\nexport type TAreaChecklistUpdate = Pick<TCleaningScheduleArea, \"checklist\">;\n\nexport type TAreaChecklistUnitsUpdate = Pick<\n TAreaChecklistUnits,\n \"approve\" | \"reject\" | \"remarks\" | \"completedBy\"\n> &\n Pick<TAreaChecklist, \"attachment\">;\n\nexport const areaChecklistSchema = Joi.object({\n schedule: Joi.string().hex().required(),\n area: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n set: Joi.number().min(0).required(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required(),\n )\n .min(1)\n .required(),\n }).required(),\n )\n .optional()\n .default([]),\n createdBy: Joi.string().hex().required(),\n});\n\nexport function MAreaChecklist(value: TCleaningScheduleArea) {\n const { error } = areaChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.schedule) {\n try {\n value.schedule = new ObjectId(value.schedule);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule ID format.\");\n }\n }\n\n if (value.area) {\n try {\n value.area = new ObjectId(value.area);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((checklistItem) => {\n return {\n set: checklistItem.set,\n units: checklistItem.units.map((unit) => ({\n unit: new ObjectId(unit.unit),\n name: unit.name,\n approve: false,\n reject: false,\n status: \"ready\",\n remarks: \"\",\n completedBy: \"\",\n timestamp: \"\",\n })),\n };\n });\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n schedule: value.schedule,\n area: value.area,\n name: value.name,\n type: value.type,\n checklist: value.checklist || [],\n status: \"ready\",\n createdBy: value.createdBy,\n createdAt: new Date(),\n completedAt: \"\",\n updatedAt: \"\",\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger, useAtlas } from \"@7365admin1/node-server-utils\";\nimport {\n TAreaChecklistBatchCreate,\n TAreaChecklistUnitsUpdate,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { allowedStatus } from \"../models/hygiene-base.model\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\n\nexport function useAreaChecklistService() {\n const { getAreasForChecklist } = useAreaRepo();\n const {\n createAreaChecklist: _createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistUnits,\n getAreaChecklistById,\n updateAreaChecklistUnits: _updateAreaChecklistUnits,\n updateAreaChecklistStatus,\n getMaxSetNumberForArea,\n } = useAreaChecklistRepo();\n const { updateParentChecklistStatuses } = useParentChecklistRepo();\n\n async function createAreaChecklist(value: TAreaChecklistBatchCreate) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const results: ObjectId[] = [];\n let totalChecklistsCreated = 0;\n\n const BATCH_SIZE = 10;\n\n const areasResult = (await getAreasForChecklist(value.site)) as any;\n const areas = areasResult || [];\n\n if (areas.length > 0) {\n for (let i = 0; i < areas.length; i += BATCH_SIZE) {\n const batch = areas.slice(i, i + BATCH_SIZE);\n\n const batchPromises = batch.map(async (area: any) => {\n if (!area.units || area.units.length === 0) {\n logger.warn(\n `Skipping area ${area.name} (${area._id}): No units defined`,\n );\n return null;\n }\n\n const maxSet = await getMaxSetNumberForArea(area._id, session);\n const setCount = area.set || 1;\n\n const checklistData: TCleaningScheduleArea = {\n schedule: value.schedule,\n area: area._id.toString(),\n name: area.name,\n type: area.type,\n checklist: Array.from({ length: setCount }, (_, index) => ({\n set: maxSet + index + 1,\n units: area.units.map((unit: any) => ({\n unit: unit.unit.toString(),\n name: unit.name,\n })),\n })),\n createdBy: value.createdBy,\n };\n\n const insertedId = await _createAreaChecklist(\n checklistData,\n session,\n );\n totalChecklistsCreated++;\n return insertedId;\n });\n\n const batchResults = await Promise.all(batchPromises);\n // Filter out null results from skipped areas\n results.push(...batchResults.filter((id) => id !== null));\n }\n\n logger.info(\n `Created ${totalChecklistsCreated} area checklists out of ${areas.length} areas for site: ${value.site}`,\n );\n } else {\n logger.warn(`No common areas found for site: ${value.site}`);\n }\n\n await session?.commitTransaction();\n\n logger.info(\n `Successfully created ${totalChecklistsCreated} area checklists for site: ${value.site}`,\n );\n\n return results;\n } catch (error) {\n logger.error(`Error generating area checklists:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function updateAreaChecklistUnits(\n _id: string | ObjectId,\n set: number,\n unitId: string | ObjectId,\n value: TAreaChecklistUnitsUpdate,\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n await _updateAreaChecklistUnits(_id, set, unitId, value, session);\n\n const allUnitsResult = (await getAreaChecklistUnits(\n {\n page: 1,\n limit: 1000,\n _id: _id.toString(),\n },\n session,\n )) as any;\n\n let areaStatus: (typeof allowedStatus)[number] = \"ready\";\n\n if (\n allUnitsResult &&\n allUnitsResult.items &&\n allUnitsResult.items.length > 0\n ) {\n const sets = allUnitsResult.items;\n const allUnits = sets.flatMap((set: any) => set.units || []);\n const readyCount = allUnits.filter(\n (unit: any) => unit.status === \"Ready\",\n ).length;\n const completedCount = allUnits.filter(\n (unit: any) => unit.status === \"Completed\",\n ).length;\n const totalCount = allUnits.length;\n\n if (completedCount === totalCount) {\n areaStatus = \"completed\";\n } else if (readyCount === totalCount) {\n areaStatus = \"ready\";\n } else {\n areaStatus = \"ongoing\";\n }\n }\n\n await updateAreaChecklistStatus(_id, areaStatus, session);\n\n const currentArea = await getAreaChecklistById(_id, session);\n const scheduleId = currentArea.schedule;\n\n if (scheduleId) {\n const allAreasResult = (await getAllAreaChecklist(\n {\n page: 1,\n limit: 1000,\n schedule: scheduleId.toString(),\n },\n session,\n )) as any;\n\n if (\n allAreasResult &&\n allAreasResult.items &&\n allAreasResult.items.length > 0\n ) {\n const areas = allAreasResult.items;\n const readyAreasCount = areas.filter(\n (area: any) => area.status === \"Ready\",\n ).length;\n const completedAreasCount = areas.filter(\n (area: any) => area.status === \"Completed\",\n ).length;\n const totalAreasCount = areas.length;\n\n let parentStatus: (typeof allowedStatus)[number] = \"ready\";\n\n if (completedAreasCount === totalAreasCount) {\n parentStatus = \"completed\";\n } else if (readyAreasCount === totalAreasCount) {\n parentStatus = \"ready\";\n } else {\n parentStatus = \"ongoing\";\n }\n\n await updateParentChecklistStatuses(\n scheduleId,\n parentStatus,\n session,\n );\n } else {\n logger.info(\n \"No area checklists found, keeping parent status as ready\",\n );\n }\n }\n\n await session?.commitTransaction();\n\n return;\n } catch (error) {\n logger.error(`Error updating area checklist unit and statuses:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return { createAreaChecklist, updateAreaChecklistUnits };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MAreaChecklist,\n TAreaChecklistUnitsUpdate,\n TAreaChecklistUpdate,\n TCleaningScheduleArea,\n TCleaningScheduleAreaGetQuery,\n} from \"../models/hygiene-area-checklist.model\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\n\nexport function useAreaChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedule.areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { schedule: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { createdAt: 1 } },\n { key: { \"checklist.units.unit\": 1 } },\n { key: { \"checklist.units.status\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene checklist area.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({\n name: \"text\",\n \"checklist.units.name\": \"text\",\n \"checklist.units.remarks\": \"text\",\n });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene checklist area.\",\n );\n }\n }\n\n async function createAreaChecklist(\n value: TCleaningScheduleArea,\n session?: ClientSession,\n ) {\n try {\n const parentChecklistId = new ObjectId(value.schedule);\n\n const currentDate = new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n type: value.type,\n schedule: parentChecklistId,\n name: value.name,\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n logger.info(\n `Area checklist already exists for area ${value.name} on ${\n currentDate.toISOString().split(\"T\")[0]\n }`,\n );\n return existingChecklist._id;\n }\n\n const processedValue = MAreaChecklist(value);\n const result = await collection.insertOne(processedValue, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return result.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllAreaChecklist(\n {\n page = 1,\n limit = 10,\n search = \"\",\n type = \"all\",\n status = \"all\",\n schedule,\n }: TCleaningScheduleAreaGetQuery,\n session?: ClientSession,\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (type && type !== \"all\") {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (status && status !== \"all\") {\n query.status = status;\n cacheOptions.status = status;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"users\",\n let: { createdById: \"$createdBy\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$createdById\", \"\"] },\n { $eq: [\"$_id\", \"$$createdById\"] },\n ],\n },\n },\n },\n { $project: { name: 1 } },\n ],\n as: \"createdByDoc\",\n },\n },\n {\n $unwind: {\n path: \"$createdByDoc\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n type: 1,\n set: {\n $cond: {\n if: { $gt: [{ $size: { $ifNull: [\"$checklist\", []] } }, 0] },\n then: {\n $max: {\n $map: {\n input: \"$checklist\",\n as: \"item\",\n in: { $toInt: \"$$item.set\" },\n },\n },\n },\n else: 0,\n },\n },\n createdByName: \"$createdByDoc.name\",\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline, { session }).toArray();\n\n const length = await collection.countDocuments(query, { session });\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistory({\n page = 1,\n limit = 10,\n search = \"\",\n type,\n schedule,\n status,\n createdAt,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number];\n schedule: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: string | Date;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (type) {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (createdAt) {\n query.createdAt = {\n $gte: new Date(`${createdAt}T00:00:00Z`),\n $lte: new Date(`${createdAt}T23:59:59Z`),\n };\n cacheOptions.createdAt = new Date(createdAt).toISOString().split(\"T\")[0];\n }\n\n if (status) {\n query.status = status;\n cacheOptions.status = status;\n } else {\n query.status = { $in: [\"ongoing\", \"completed\"] };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n createdAt: 1,\n completedAt: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n set: {\n $cond: {\n if: { $gt: [{ $size: { $ifNull: [\"$checklist\", []] } }, 0] },\n then: {\n $max: {\n $map: {\n input: \"$checklist\",\n as: \"item\",\n in: { $toInt: \"$$item.set\" },\n },\n },\n },\n else: 0,\n },\n },\n },\n },\n { $sort: { status: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistoryDetails(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaPipeline: Object[] = [\n { $match: { _id } },\n {\n $project: {\n name: 1,\n createdAt: 1,\n completedAt: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n },\n },\n ];\n\n const unitPipeline: Object[] = [\n { $match: { _id } },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $unwind: {\n path: \"$checklist.units\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $lookup: {\n from: \"users\",\n let: { completedById: \"$checklist.units.completedBy\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$completedById\", \"\"] },\n { $eq: [\"$_id\", \"$$completedById\"] },\n ],\n },\n },\n },\n { $project: { name: 1 } },\n ],\n as: \"completedBy\",\n },\n },\n {\n $unwind: {\n path: \"$completedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$checklist.set\",\n unit: \"$checklist.units.unit\",\n name: \"$checklist.units.name\",\n remarks: \"$checklist.units.remarks\",\n status: {\n $switch: {\n branches: [\n {\n case: { $eq: [\"$checklist.units.status\", \"ready\"] },\n then: \"Ready\",\n },\n {\n case: { $eq: [\"$checklist.units.status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$checklist.units.status\",\n },\n },\n completedByName: \"$completedBy.name\",\n timestamp: \"$checklist.units.timestamp\",\n },\n },\n { $sort: { set: 1, name: 1 } },\n {\n $group: {\n _id: \"$set\",\n units: {\n $push: {\n unit: \"$unit\",\n name: \"$name\",\n status: \"$status\",\n remarks: \"$remarks\",\n completedByName: \"$completedByName\",\n timestamp: \"$timestamp\",\n },\n },\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$_id\",\n units: 1,\n },\n },\n { $sort: { set: 1 } },\n ];\n\n const [area, units] = await Promise.all([\n collection.aggregate(areaPipeline).toArray(),\n collection.aggregate(unitPipeline).toArray(),\n ]);\n\n if (!area.length) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n const items: Record<string, any> = {\n area: area[0],\n units,\n };\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistUnits(\n {\n page = 1,\n limit = 10,\n search = \"\",\n _id,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n _id: string | ObjectId;\n },\n session?: ClientSession,\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query._id = new ObjectId(_id);\n cacheOptions._id = _id.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $unwind: {\n path: \"$checklist.units\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$checklist.set\",\n remarks: \"$checklist.remarks\",\n attachment: \"$checklist.attachment\",\n unit: \"$checklist.units.unit\",\n name: \"$checklist.units.name\",\n approve: \"$checklist.units.approve\",\n reject: \"$checklist.units.reject\",\n status: {\n $switch: {\n branches: [\n {\n case: { $eq: [\"$checklist.units.status\", \"ready\"] },\n then: \"Ready\",\n },\n {\n case: { $eq: [\"$checklist.units.status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$checklist.units.status\",\n },\n },\n },\n },\n { $sort: { set: 1, name: 1 } },\n {\n $group: {\n _id: \"$set\",\n remarks: { $first: \"$remarks\" },\n attachment: { $first: \"$attachment\" },\n units: {\n $push: {\n unit: \"$unit\",\n name: \"$name\",\n approve: \"$approve\",\n reject: \"$reject\",\n status: \"$status\",\n remarks: \"$remarks\",\n },\n },\n },\n },\n {\n $project: {\n _id: 0,\n set: \"$_id\",\n remarks: \"$remarks\",\n attachment: \"$attachment\",\n units: 1,\n },\n },\n { $sort: { set: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const countPipeline: Object[] = [\n { $match: query },\n {\n $unwind: {\n path: \"$checklist\",\n preserveNullAndEmptyArrays: false,\n },\n },\n {\n $group: {\n _id: \"$checklist.set\",\n },\n },\n { $count: \"total\" },\n ];\n\n const [items, countResult] = await Promise.all([\n collection.aggregate(pipeline, { session }).toArray(),\n collection.aggregate(countPipeline, { session }).toArray(),\n ]);\n\n const length = countResult.length > 0 ? countResult[0].total : 0;\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const area = await collection.findOne(\n { _id },\n { projection: { schedule: 1, name: 1, type: 1, status: 1 }, session },\n );\n\n if (!area) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n return area;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistByAreaAndSchedule(\n schedule: string | ObjectId,\n area: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n schedule = new ObjectId(schedule);\n area = new ObjectId(area);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const data = await collection.findOne({ schedule, area }, { session });\n\n if (!data) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateAreaChecklistUnits(\n _id: string | ObjectId,\n set: number,\n unitId: string | ObjectId,\n value: TAreaChecklistUnitsUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n unitId = new ObjectId(unitId);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue: Record<string, any> = {\n \"checklist.$[checklist].units.$[unit].timestamp\": now,\n updatedAt: now,\n };\n\n if (value.approve === true) {\n updateValue[\"checklist.$[checklist].units.$[unit].approve\"] = true;\n updateValue[\"checklist.$[checklist].units.$[unit].reject\"] = false;\n updateValue[\"checklist.$[checklist].units.$[unit].status\"] =\n \"completed\";\n } else if (value.reject === true) {\n updateValue[\"checklist.$[checklist].units.$[unit].approve\"] = false;\n updateValue[\"checklist.$[checklist].units.$[unit].reject\"] = true;\n updateValue[\"checklist.$[checklist].units.$[unit].status\"] = \"ready\";\n }\n\n if (value.remarks) {\n updateValue[\"checklist.$[checklist].units.$[unit].remarks\"] =\n value.remarks;\n }\n\n if (value.attachment) {\n updateValue[\"checklist.$[checklist].attachment\"] = value.attachment;\n\n if (value.remarks) {\n updateValue[\"checklist.$[checklist].remarks\"] = value.remarks;\n }\n }\n\n if (value.completedBy) {\n updateValue[\"checklist.$[checklist].units.$[unit].completedBy\"] =\n new ObjectId(value.completedBy);\n }\n\n const arrayFilters = [\n { \"checklist.set\": set, \"checklist.units.unit\": unitId },\n { \"unit.unit\": unitId },\n ];\n\n const res = await collection.updateOne(\n { _id, \"checklist.set\": set, \"checklist.units.unit\": unitId },\n { $set: updateValue },\n { arrayFilters, session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update area checklist unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n logger.error(\"Error updating area checklist unit:\", error.message);\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n _id: string | ObjectId,\n value: TAreaChecklistUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n ...value,\n updatedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update area checklist.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateAreaChecklistStatus(\n _id: string | ObjectId,\n status: (typeof allowedStatus)[number],\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const updateValue: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"completed\") {\n updateValue.completedAt = new Date();\n }\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update area checklist status.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getMaxSetNumberForArea(\n areaId: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n const _id = new ObjectId(areaId);\n\n const result = await collection\n .aggregate(\n [\n { $match: { area: _id.toString() } },\n { $unwind: \"$checklist\" },\n { $group: { _id: null, maxSet: { $max: \"$checklist.set\" } } },\n ],\n { session },\n )\n .toArray();\n\n return result.length > 0 && result[0].maxSet ? result[0].maxSet : 0;\n } catch (error) {\n logger.error(`Error getting max set number for area ${areaId}:`, error);\n return 0;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n getAreaChecklistUnits,\n getAreaChecklistById,\n getAreaChecklistByAreaAndSchedule,\n updateAreaChecklist,\n updateAreaChecklistStatus,\n updateAreaChecklistUnits,\n getMaxSetNumberForArea,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useAreaChecklistService } from \"../services/hygiene-area-checklist.service\";\nimport { useAreaExportService } from \"../services/hygiene-area-export.service\";\n\nexport function useAreaChecklistController() {\n const {\n getAllAreaChecklist: _getAllAreaChecklist,\n getAreaChecklistHistory: _getAreaChecklistHistory,\n getAreaChecklistHistoryDetails: _getAreaChecklistHistoryDetails,\n getAreaChecklistUnits: _getAreaChecklistUnits,\n } = useAreaChecklistRepo();\n const {\n createAreaChecklist: _createAreaChecklist,\n updateAreaChecklistUnits: _updateAreaChecklistUnits,\n } = useAreaChecklistService();\n\n async function createAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n site: req.params.site,\n schedule: req.params.schedule,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n schedule: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createAreaChecklist(value);\n res\n .status(201)\n .json({ message: \"Area checklist generated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .valid(...allowedTypes, \"all\")\n .optional()\n .allow(\"\", null),\n status: Joi.string()\n .valid(...allowedStatus, \"all\")\n .optional()\n .allow(\"\", null),\n schedule: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"all\";\n const status = (req.query.status as string) ?? \"all\";\n const schedule = (req.params.schedule as string) ?? \"\";\n\n try {\n const data = await _getAllAreaChecklist({\n page,\n limit,\n search,\n type,\n status,\n schedule,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistory(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", ...allowedTypes),\n schedule: Joi.string().hex().required(),\n status: Joi.string().allow(\"\", null, ...allowedStatus),\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"\";\n const schedule = (req.params.schedule as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n const createdAt = (req.query.createdAt as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistHistory({\n page,\n limit,\n search,\n type,\n schedule,\n status,\n createdAt,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistoryDetails(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaChecklistHistoryDetails(value);\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistUnits(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const _id = (req.params.id as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistUnits({\n page,\n limit,\n search,\n _id,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateAreaChecklistUnits(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const completedBy = cookies[\"user\"] || \"\";\n\n const decisionMap: Record<string, { approve: boolean; reject: boolean }> = {\n approve: { approve: true, reject: false },\n reject: { approve: false, reject: true },\n };\n\n const decision = req.params.decision;\n const decisionValues = decisionMap[decision] || {\n approve: undefined,\n reject: undefined,\n };\n\n const payload = {\n ...req.params,\n ...req.body,\n ...decisionValues,\n completedBy,\n };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n set: Joi.number().integer().min(1).required(),\n unit: Joi.string().hex().required(),\n decision: Joi.string().valid(\"approve\", \"reject\").required(),\n approve: Joi.boolean().optional(),\n reject: Joi.boolean().optional(),\n remarks: Joi.string().optional().allow(\"\", null),\n attachment: Joi.array().items(Joi.string()).optional(),\n completedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, set, unit, decision, ...value } = payload;\n await _updateAreaChecklistUnits(id, parseInt(set as string), unit, value);\n\n res.json({ message: \"Area checklist updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n getAreaChecklistUnits,\n updateAreaChecklistUnits,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TSupply = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n unitOfMeasurement: string;\n qty: number;\n status?: \"active\" | \"deleted\";\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TSupplyCreate = Pick<\n TSupply,\n \"site\" | \"name\" | \"unitOfMeasurement\"\n>;\n\nexport type TSupplyGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TSupply, \"site\">;\n\nexport type TSupplyGetById = Pick<\n TSupply,\n \"_id\" | \"name\" | \"unitOfMeasurement\" | \"qty\"\n>;\n\nexport type TSupplyUpdate = Partial<\n Pick<TSupply, \"name\" | \"unitOfMeasurement\" | \"qty\">\n>;\n\nexport const supplySchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n unitOfMeasurement: Joi.string().required(),\n});\n\nexport function MSupply(value: TSupplyCreate) {\n const { error } = supplySchema.validate(value);\n if (error) {\n logger.info(`Hygiene Supply Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n return {\n site: value.site,\n name: value.name,\n unitOfMeasurement: value.unitOfMeasurement,\n qty: 0,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MSupply,\n TSupplyGetQuery,\n TSupplyUpdate,\n TSupplyCreate,\n TSupplyGetById,\n} from \"../models/hygiene-supply.model\";\n\nexport function useSupplyRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supplies\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([{ key: { site: 1 } }]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene supply.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene supply.\",\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, deletedAt: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene supply.\",\n );\n }\n }\n\n async function createSupply(value: TSupplyCreate, session?: ClientSession) {\n try {\n value = MSupply(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Supply already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getSupplies({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TSupplyGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n qty: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getSupplyById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TSupplyGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n unitOfMeasurement: 1,\n qty: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Supply not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TSupplyGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateSupply(\n _id: string | ObjectId,\n value: TSupplyUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning supply.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Supply already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteSupply(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete supply.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createSupply,\n getSupplies,\n getSupplyById,\n updateSupply,\n deleteSupply,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { supplySchema } from \"../models/hygiene-supply.model\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\n\nexport function useSupplyController() {\n const {\n createSupply: _createSupply,\n getSupplies: _getSupplies,\n getSupplyById: _getSupplyById,\n updateSupply: _updateSupply,\n deleteSupply: _deleteSupply,\n } = useSupplyRepository();\n\n async function createSupply(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = supplySchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createSupply(payload);\n\n res.status(201).json({ message: \"Supply created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getSupplies(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getSupplies({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getSupplyById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getSupplyById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateSupply(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n unitOfMeasurement: Joi.string().optional().allow(\"\", null),\n qty: Joi.number().min(0).optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateSupply(id, value);\n\n res.json({ message: \"Supply updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteSupply(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteSupply(value);\n\n res.json({ message: \"Supply deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createSupply,\n getSupplies,\n getSupplyById,\n updateSupply,\n deleteSupply,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport type TStock = {\n _id?: ObjectId;\n site: string | ObjectId;\n supply: string | ObjectId;\n in?: number;\n out?: number;\n balance: number;\n remarks?: string;\n status?: \"active\" | \"deleted\";\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TStockCreate = Pick<\n TStock,\n \"site\" | \"supply\" | \"in\" | \"out\" | \"balance\" | \"remarks\"\n>;\n\nexport type TStockCreateService = Pick<\n TStock,\n \"site\" | \"supply\" | \"remarks\"\n> & {\n qty: number;\n};\n\nexport type TGetStocksQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TStock, \"site\" | \"supply\">;\n\nexport const stockSchema = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n in: Joi.number().min(0).optional(),\n out: Joi.number().min(0).optional(),\n balance: Joi.number().min(0).required(),\n remarks: Joi.string().optional().allow(\"\", null),\n});\n\nexport function MStock(value: TStockCreate) {\n const { error } = stockSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Stock Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.supply) {\n try {\n value.supply = new ObjectId(value.supply);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n }\n\n return {\n site: value.site,\n supply: value.supply,\n in: value.in ?? 0,\n out: value.out ?? 0,\n balance: value.balance,\n remarks: value.remarks ?? \"\",\n createdAt: new Date().toISOString(),\n status: \"active\",\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n paginate,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MStock,\n TGetStocksQuery,\n TStockCreate,\n} from \"../models/hygiene-stock.model\";\n\nexport function useStockRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supply.stocks\";\n const supply_collection = \"site.supplies\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n const { delNamespace: delSupplyNamespace } = useCache(supply_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { supply: 1 } },\n { key: { balance: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene stock.\");\n }\n }\n\n async function createStock(value: TStockCreate, session?: ClientSession) {\n try {\n value = MStock(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n delSupplyNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${supply_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${supply_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getStocksBySupplyId({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n supply,\n }: TGetStocksQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n supply = new ObjectId(supply);\n query.supply = supply;\n cacheOptions.supply = supply.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n createdAt: 1,\n in: 1,\n out: 1,\n balance: 1,\n },\n },\n { $sort: { _id: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createStock,\n getStocksBySupplyId,\n };\n}\n","import { ClientSession } from \"mongodb\";\nimport {\n NotFoundError,\n useAtlas,\n BadRequestError,\n} from \"@7365admin1/node-server-utils\";\nimport { TStockCreateService } from \"../models/hygiene-stock.model\";\nimport { useStockRepository } from \"../repositories/hygiene-stock.repository\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\n\nexport function useStockService() {\n const { createStock: _createStock } = useStockRepository();\n const { getSupplyById, updateSupply } = useSupplyRepository();\n\n async function createStock(\n value: TStockCreateService,\n out: boolean = false,\n session?: ClientSession,\n ) {\n let ownSession = false;\n if (!session) {\n session = useAtlas.getClient()?.startSession();\n ownSession = true;\n }\n\n try {\n if (ownSession) session?.startTransaction();\n\n const { qty, ...stockData } = value;\n const supply = await getSupplyById(value.supply, session);\n\n if (!supply || supply.qty === undefined) {\n throw new NotFoundError(\"Supply not found.\");\n }\n\n const newSupplyQty = out ? supply.qty - qty : supply.qty + qty;\n\n if (out && newSupplyQty < 0) {\n throw new BadRequestError(\n `Insufficient stock. Available: ${supply.qty}, Requested: ${qty}`,\n );\n }\n\n await updateSupply(value.supply, { qty: newSupplyQty }, session);\n\n const createdStock = await _createStock(\n {\n ...stockData,\n in: out ? 0 : qty,\n out: out ? qty : 0,\n balance: newSupplyQty,\n },\n session,\n );\n\n if (ownSession) await session?.commitTransaction();\n\n return createdStock;\n } catch (error) {\n if (ownSession) await session?.abortTransaction();\n throw error;\n } finally {\n if (ownSession) await session?.endSession();\n }\n }\n\n return { createStock };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useStockRepository } from \"../repositories/hygiene-stock.repository\";\nimport { useStockService } from \"../services/hygiene-stock.service\";\n\nexport function useStockController() {\n const { getStocksBySupplyId: _getStocksBySupplyId } = useStockRepository();\n const { createStock: _createStock } = useStockService();\n\n async function createStock(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n remarks: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createStock(payload);\n\n res.status(201).json({ message: \"Stock created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getStocksBySupplyId(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const supply = (req.params.supply as string) ?? \"\";\n\n try {\n const data = await _getStocksBySupplyId({\n page,\n limit,\n search,\n site,\n supply,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createStock,\n getStocksBySupplyId,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\n\nexport const allowedCheckOutItemStatus: string[] = [\"pending\", \"completed\"];\n\nexport type TCheckOutItem = {\n _id?: ObjectId;\n site: string | ObjectId;\n supply: string | ObjectId;\n supplyName: string;\n qty: number;\n attachment?: string[];\n createdBy: string | ObjectId;\n createdByName: string;\n status?: (typeof allowedCheckOutItemStatus)[number];\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TCheckOutItemCreate = Pick<\n TCheckOutItem,\n | \"site\"\n | \"supply\"\n | \"supplyName\"\n | \"qty\"\n | \"attachment\"\n | \"createdBy\"\n | \"createdByName\"\n>;\n\nexport type TCheckOutItemCreateService = Pick<\n TCheckOutItem,\n \"site\" | \"supply\" | \"qty\" | \"attachment\" | \"createdBy\"\n>;\n\nexport type TCheckOutItemCreateByBatchService = Pick<\n TCheckOutItem,\n \"site\" | \"attachment\" | \"createdBy\"\n> & { items: Pick<TCheckOutItem, \"supply\" | \"qty\">[] };\n\nexport type TCheckOutItemGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TCheckOutItem, \"site\">;\n\nexport type TCheckOutItemGetById = Pick<\n TCheckOutItem,\n \"_id\" | \"site\" | \"supply\" | \"supplyName\" | \"qty\" | \"status\"\n> & { unitOfMeasurement?: string };\n\nexport const checkOutItemSchema = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n supplyName: Joi.string().required(),\n qty: Joi.number().min(0).required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n createdByName: Joi.string().required(),\n});\n\nexport function MCheckOutItem(value: TCheckOutItemCreate) {\n const { error } = checkOutItemSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Check Out Item Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.supply) {\n try {\n value.supply = new ObjectId(value.supply);\n } catch (error) {\n throw new BadRequestError(\"Invalid supply ID format.\");\n }\n }\n\n return {\n site: value.site,\n supply: value.supply,\n supplyName: value.supplyName,\n qty: value.qty,\n attachment: value.attachment || [],\n createdBy: value.createdBy,\n createdByName: value.createdByName,\n status: \"pending\",\n createdAt: new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n useCache,\n logger,\n makeCacheKey,\n paginate,\n BadRequestError,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MCheckOutItem,\n TCheckOutItemGetById,\n TCheckOutItemGetQuery,\n TCheckOutItemCreate,\n} from \"../models/hygiene-checkout-item.model\";\n\nexport function useCheckOutItemRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.supply.checkouts\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { supply: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene check out item.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ supplyName: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene supply.\",\n );\n }\n }\n\n async function createCheckOutItem(\n value: TCheckOutItemCreate,\n session?: ClientSession,\n ) {\n try {\n value = MCheckOutItem(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getCheckOutItems({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TCheckOutItemGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"site.supplies\",\n let: { supplyId: \"$supply\" },\n pipeline: [\n {\n $match: {\n $expr: {\n $and: [\n { $ne: [\"$$supplyId\", \"\"] },\n { $eq: [\"$_id\", \"$$supplyId\"] },\n ],\n },\n },\n },\n { $project: { qty: 1 } },\n ],\n as: \"supplyDoc\",\n },\n },\n {\n $unwind: {\n path: \"$supplyDoc\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n supplyName: 1,\n supplyQty: \"$supplyDoc.qty\",\n checkOutByName: \"$createdByName\",\n checkOutQty: \"$qty\",\n createdAt: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getCheckOutItemById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid check out item ID format.\");\n }\n\n const query: Record<string, any> = { _id };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TCheckOutItemGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate(\n [\n { $match: query },\n {\n $lookup: {\n from: \"site.supply.items\",\n localField: \"supply\",\n foreignField: \"_id\",\n as: \"supplyDetails\",\n },\n },\n {\n $unwind: {\n path: \"$supplyDetails\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n site: 1,\n supply: 1,\n supplyName: 1,\n qty: 1,\n status: 1,\n unitOfMeasurement: \"$supplyDetails.unitOfMeasurement\",\n attachment: 1,\n },\n },\n ],\n session ? { session } : undefined,\n )\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Check out item not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TCheckOutItemGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function completeCheckOutItem(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid check out item ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"completed\",\n updatedAt: new Date().toISOString(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to complete check out item.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createCheckOutItem,\n getCheckOutItems,\n getCheckOutItemById,\n completeCheckOutItem,\n };\n}\n","import { useUserRepo } from \"@7365admin1/core\";\nimport { BadRequestError, useAtlas } from \"@7365admin1/node-server-utils\";\nimport {\n TCheckOutItemCreateByBatchService,\n TCheckOutItemCreateService,\n} from \"../models/hygiene-checkout-item.model\";\nimport { useCheckOutItemRepository } from \"../repositories/hygiene-checkout-item.repository\";\nimport { useSupplyRepository } from \"../repositories/hygiene-supply.repository\";\nimport { useStockService } from \"./hygiene-stock.service\";\n\nexport function useCheckOutItemService() {\n const {\n createCheckOutItem: _createCheckOutItem,\n getCheckOutItemById: _getCheckOutItemById,\n completeCheckOutItem,\n } = useCheckOutItemRepository();\n const { getSupplyById } = useSupplyRepository();\n const { getUserById } = useUserRepo();\n const { createStock } = useStockService();\n\n async function createCheckOutItem(value: TCheckOutItemCreateService) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const supplyData = await getSupplyById(value.supply);\n const createdByData = await getUserById(value.createdBy);\n\n const checkOutItemId = await _createCheckOutItem(\n {\n ...value,\n supplyName: supplyData?.name || \"\",\n createdByName: createdByData?.name || \"\",\n },\n session,\n );\n\n const checkOutItem = await _getCheckOutItemById(\n checkOutItemId.toString(),\n session,\n );\n\n if (!checkOutItem) {\n throw new BadRequestError(\"Failed to create check out item.\");\n }\n\n const createdStocks = await createStock(\n {\n site: checkOutItem.site.toString(),\n supply: checkOutItem.supply.toString(),\n qty: checkOutItem.qty,\n },\n true,\n session,\n );\n\n await completeCheckOutItem(checkOutItemId.toString(), session);\n\n await session?.commitTransaction();\n\n return createdStocks;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n async function createCheckOutItemByBatch(\n value: TCheckOutItemCreateByBatchService,\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const { site, attachment, createdBy, items } = value;\n const createdByData = await getUserById(createdBy);\n const createdCheckOutItemIds = [];\n\n for (const item of items) {\n const supplyData = await getSupplyById(item.supply, session);\n\n const createdId = await _createCheckOutItem(\n {\n site,\n supply: item.supply,\n supplyName: supplyData?.name || \"\",\n qty: item.qty,\n attachment,\n createdBy,\n createdByName: createdByData?.name || \"\",\n },\n session,\n );\n\n await createStock(\n {\n site,\n supply: item.supply,\n qty: item.qty,\n },\n true,\n session,\n );\n\n createdCheckOutItemIds.push(createdId);\n }\n\n await session?.commitTransaction();\n\n return createdCheckOutItemIds;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n return {\n createCheckOutItem,\n createCheckOutItemByBatch,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useCheckOutItemRepository } from \"../repositories/hygiene-checkout-item.repository\";\nimport { useCheckOutItemService } from \"../services/hygiene-checkout-item.service\";\n\nexport function useCheckOutItemController() {\n const {\n getCheckOutItems: _getCheckOutItems,\n getCheckOutItemById: _getCheckOutItemById,\n } = useCheckOutItemRepository();\n const {\n createCheckOutItem: _createCheckOutItem,\n createCheckOutItemByBatch: _createCheckOutItemByBatch,\n } = useCheckOutItemService();\n\n async function createCheckOutItem(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n ...req.body,\n ...req.params,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createCheckOutItem(payload);\n\n res\n .status(201)\n .json({ message: \"Check out item created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function createCheckOutItemByBatch(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = {\n ...req.body,\n ...req.params,\n createdBy,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n attachment: Joi.array().items(Joi.string()).optional().allow(null),\n createdBy: Joi.string().hex().required(),\n items: Joi.array()\n .items(\n Joi.object({\n supply: Joi.string().hex().required(),\n qty: Joi.number().min(0).required(),\n }),\n )\n .min(1)\n .required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createCheckOutItemByBatch(payload);\n\n res\n .status(201)\n .json({ message: \"Check out items created successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getCheckOutItems(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getCheckOutItems({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getCheckOutItemById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getCheckOutItemById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createCheckOutItem,\n createCheckOutItemByBatch,\n getCheckOutItems,\n getCheckOutItemById,\n };\n}\n","import { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TScheduleTask = {\n _id?: ObjectId;\n site: string | ObjectId;\n title: string;\n time: string; // HH:mm format\n startDate: string;\n endDate?: string;\n description?: string;\n areas: { name: string; value: ObjectId }[]; // at least 1\n status?: \"active\" | \"deleted\";\n createdBy: string | ObjectId;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport type TScheduleTaskCreate = Pick<\n TScheduleTask,\n | \"site\"\n | \"title\"\n | \"time\"\n | \"startDate\"\n | \"endDate\"\n | \"description\"\n | \"areas\"\n | \"createdBy\"\n>;\n\nexport type TScheduleTaskGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TScheduleTask, \"site\">;\n\nexport type TScheduleTaskGetById = Pick<\n TScheduleTask,\n | \"title\"\n | \"time\"\n | \"startDate\"\n | \"endDate\"\n | \"description\"\n | \"areas\"\n | \"status\"\n | \"createdBy\"\n | \"createdAt\"\n>;\n\nexport type TScheduleTaskUpdate = Partial<\n Pick<\n TScheduleTask,\n \"title\" | \"time\" | \"startDate\" | \"endDate\" | \"description\" | \"areas\"\n >\n>;\n\nexport const scheduleTaskSchema = Joi.object({\n site: Joi.string().hex().required(),\n title: Joi.string().required(),\n time: Joi.string()\n .pattern(/^([0-1]\\d|2[0-3]):([0-5]\\d)$/)\n .required(),\n startDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .required(),\n endDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n description: Joi.string().optional().allow(\"\", null),\n areas: Joi.array()\n .min(1)\n .items(\n Joi.object({\n name: Joi.string().required(),\n value: Joi.any().required(),\n }),\n )\n .required(),\n createdBy: Joi.string().hex().required(),\n});\n\nexport function MScheduleTask(value: TScheduleTaskCreate) {\n const { error } = scheduleTaskSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Schedule Task Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.areas && Array.isArray(value.areas)) {\n value.areas = value.areas.map((area) => {\n try {\n return {\n name: area.name,\n value: new ObjectId(area.value.toString()),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid area value format: ${area.name}`);\n }\n });\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n site: value.site,\n title: value.title,\n time: value.time,\n startDate: value.startDate,\n endDate: value.endDate,\n description: value.description,\n areas: value.areas,\n status: \"active\",\n createdBy: value.createdBy,\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@7365admin1/node-server-utils\";\nimport {\n MScheduleTask,\n TScheduleTaskGetQuery,\n TScheduleTask,\n TScheduleTaskCreate,\n TScheduleTaskGetById,\n TScheduleTaskUpdate,\n} from \"../models/hygiene-schedule-task.model\";\n\nexport function useScheduleTaskRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.schedule-tasks\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene schedule task.\",\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ title: \"text\", description: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene schedule task.\",\n );\n }\n }\n\n async function createScheduleTask(\n value: TScheduleTaskCreate,\n session?: ClientSession,\n ) {\n try {\n value = MScheduleTask(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTasks({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TScheduleTaskGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n title: 1,\n areas: 1,\n status: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllScheduleTask() {\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n try {\n const items = await collection\n .aggregate([{ $match: query }, { $sort: { _id: -1 } }])\n .toArray();\n\n return items as TScheduleTask[];\n } catch (error) {\n throw error;\n }\n }\n\n async function getTasksForScheduleTask({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TScheduleTaskGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n createdAt: 1,\n title: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTaskById(\n _id: string | ObjectId,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule task ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n if (!session) {\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData as TScheduleTaskGetById;\n }\n } else {\n logger.info(`Skipping cache during transaction for key: ${cacheKey}`);\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n title: 1,\n time: 1,\n startDate: 1,\n endDate: 1,\n description: 1,\n areas: 1,\n status: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Schedule task not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0] as TScheduleTaskGetById;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateScheduleTask(\n _id: string | ObjectId,\n value: TScheduleTaskUpdate,\n session?: ClientSession,\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule task ID format.\");\n }\n\n if (value.areas && Array.isArray(value.areas)) {\n value.areas = value.areas.map((area) => {\n try {\n return {\n name: area.name,\n value: new ObjectId(area.value.toString()),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid area value format: ${area.name}`);\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session },\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update hygiene schedule task.\",\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err,\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createScheduleTask,\n getScheduleTasks,\n getAllScheduleTask,\n getTasksForScheduleTask,\n getScheduleTaskById,\n updateScheduleTask,\n };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport {\n TAreaChecklist,\n TAreaChecklistUnits,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { TScheduleTask } from \"../models/hygiene-schedule-task.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\nimport { useScheduleTaskRepository } from \"../repositories/hygiene-schedule-task.repository\";\n\nexport function useScheduleTaskService() {\n const { createParentChecklist } = useParentChecklistRepo();\n const { getAllScheduleTask } = useScheduleTaskRepository();\n const {\n createAreaChecklist,\n getAreaChecklistByAreaAndSchedule,\n updateAreaChecklist,\n } = useAreaChecklistRepo();\n const { getAreaById } = useAreaRepo();\n\n function checkScheduleConditions(\n schedule: any,\n currentDate: Date = new Date(),\n ): boolean {\n try {\n const now = currentDate;\n\n // Get current time in HH:mm format\n const timeString = now.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n timeZone: \"Asia/Singapore\",\n });\n const [currentHour, currentMinute] = timeString.split(\":\").map(Number);\n\n // Get current date in YYYY-MM-DD format\n const currentDateString = now.toLocaleDateString(\"en-US\", {\n timeZone: \"Asia/Singapore\",\n });\n\n logger.info(\n `Checking schedule ${schedule._id}: Current time ${currentHour}:${currentMinute}, Current date ${currentDateString}, Schedule time ${schedule.time}, Start date ${schedule.startDate}, End date ${schedule.endDate}`,\n );\n\n // Check if current date is within the date range\n const startDate = new Date(schedule.startDate + \"T00:00:00\");\n const currentDateOnly = new Date(currentDateString + \"T00:00:00\");\n\n // Check if current date is before start date\n if (currentDateOnly < startDate) {\n logger.info(\n `Schedule ${schedule._id}: Current date ${currentDateString} is before start date ${schedule.startDate}`,\n );\n return false;\n }\n\n // Check if current date is after end date (if endDate is provided)\n if (schedule.endDate) {\n const endDate = new Date(schedule.endDate + \"T00:00:00\");\n if (currentDateOnly > endDate) {\n logger.info(\n `Schedule ${schedule._id}: Current date ${currentDateString} is after end date ${schedule.endDate}`,\n );\n return false;\n }\n }\n\n // Check if the time matches\n const [scheduleHour, scheduleMinute] = schedule.time\n .split(\":\")\n .map(Number);\n\n const timeMatches =\n currentHour === scheduleHour && currentMinute === scheduleMinute;\n\n if (!timeMatches) {\n logger.info(\n `Schedule ${schedule._id}: Time does not match. Current: ${currentHour}:${currentMinute}, Expected: ${scheduleHour}:${scheduleMinute}`,\n );\n return false;\n }\n\n logger.info(\n `Schedule ${schedule._id}: All conditions matched - Date is within range and time matches`,\n );\n return true;\n } catch (error) {\n logger.error(\n `Error checking schedule conditions for ${schedule._id}:`,\n error,\n );\n return false;\n }\n }\n\n async function processScheduledTasks(currentDate?: Date) {\n try {\n logger.info(\"Starting scheduled task processing...\");\n\n const scheduleTasks: TScheduleTask[] = await getAllScheduleTask();\n\n if (!scheduleTasks || scheduleTasks.length === 0) {\n logger.info(\"No schedule tasks found to process\");\n return { processed: 0, validated: 0 };\n }\n\n logger.info(`Found ${scheduleTasks.length} schedule tasks to check`);\n\n let processedCount = 0;\n let validatedCount = 0;\n const validatedTasks: TScheduleTask[] = [];\n\n for (const scheduleTask of scheduleTasks) {\n try {\n logger.info(\n `Checking schedule ${scheduleTask._id} - ${scheduleTask.title}: time=${scheduleTask.time}, startDate=${scheduleTask.startDate}, endDate=${scheduleTask.endDate}`,\n );\n\n const shouldRun = checkScheduleConditions(scheduleTask, currentDate);\n if (!shouldRun) {\n logger.info(\n `Schedule ${scheduleTask._id} conditions not met, skipping`,\n );\n continue;\n }\n\n logger.info(\n `Schedule ${scheduleTask._id} conditions validated, creating area checklists`,\n );\n\n if (!scheduleTask._id) {\n logger.warn(`Schedule ${scheduleTask.title} has no _id, skipping`);\n continue;\n }\n\n if (!scheduleTask.site) {\n logger.warn(`Schedule ${scheduleTask._id} has no site, skipping`);\n continue;\n }\n\n logger.info(\n `Getting or creating parent checklist for schedule ${scheduleTask._id} in site ${scheduleTask.site}`,\n );\n\n const parentChecklistIds = await createParentChecklist({\n site: scheduleTask.site.toString(),\n createdAt: new Date(),\n });\n\n const parentChecklistId = Array.isArray(parentChecklistIds)\n ? parentChecklistIds[0]\n : parentChecklistIds;\n\n logger.info(\n `Using parent checklist ${parentChecklistId}, now creating/updating area checklists`,\n );\n\n for (const area of scheduleTask.areas) {\n try {\n const areaId = area.value.toString();\n\n const areaDetails = (await getAreaById(areaId)) as any;\n\n let units: TAreaChecklistUnits[] = [];\n\n if (areaDetails.units && areaDetails.units.length > 0) {\n units = areaDetails.units.map((unit: any) => ({\n unit: unit.unit.toString(),\n name: unit.name,\n }));\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Using units from area details: ${JSON.stringify(\n units,\n )}`,\n );\n }\n\n if (units.length === 0) {\n logger.warn(\n `Area ${area.name} (${areaId}): No units found, skipping area.`,\n );\n continue;\n }\n\n let existingAreaChecklist;\n try {\n existingAreaChecklist = await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Existing area checklist found: ${\n existingAreaChecklist ? \"Yes\" : \"No\"\n }`,\n );\n if (existingAreaChecklist) {\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Existing checklist content: ${JSON.stringify(\n existingAreaChecklist.checklist,\n )}`,\n );\n }\n } catch (error) {\n existingAreaChecklist = null;\n logger.info(\n `Area ${area.name} (${areaId}): No existing area checklist found (exception).`,\n );\n }\n\n if (existingAreaChecklist) {\n const currentSetNumber =\n existingAreaChecklist.checklist?.length || 0;\n const newSet: TAreaChecklist = {\n set: currentSetNumber + 1,\n units: units,\n };\n\n const updatedChecklist = [\n ...(existingAreaChecklist.checklist || []),\n newSet,\n ];\n logger.info(\n `Area ${area.name} (${areaId}): Appending new set ${\n newSet.set\n } to checklist. Updated checklist: ${JSON.stringify(\n updatedChecklist,\n )}`,\n );\n\n await updateAreaChecklist(existingAreaChecklist._id, {\n checklist: updatedChecklist,\n });\n\n logger.info(\n `Appended set ${newSet.set} to area checklist for area ${area.name}`,\n );\n try {\n const verifyChecklist =\n await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Checklist after update: ${JSON.stringify(\n verifyChecklist.checklist,\n )}`,\n );\n } catch (verifyError: any) {\n logger.warn(\n `Area ${area.name} (${areaId}): Error verifying checklist after update:`,\n verifyError,\n );\n }\n } else {\n const checklistData: TCleaningScheduleArea = {\n schedule: parentChecklistId.toString(),\n area: areaId,\n name: area.name,\n type: areaDetails.type || \"common\",\n checklist: [\n {\n set: 1,\n units: units,\n },\n ],\n createdBy: scheduleTask.createdBy,\n };\n\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Creating new area checklist with data: ${JSON.stringify(\n checklistData,\n )}`,\n );\n await createAreaChecklist(checklistData);\n logger.info(`Created new area checklist for area ${area.name}`);\n try {\n const verifyChecklist =\n await getAreaChecklistByAreaAndSchedule(\n parentChecklistId.toString(),\n areaId,\n );\n logger.info(\n `Area ${\n area.name\n } (${areaId}): Checklist after creation: ${JSON.stringify(\n verifyChecklist.checklist,\n )}`,\n );\n } catch (verifyError: any) {\n logger.warn(\n `Area ${area.name} (${areaId}): Error verifying checklist after creation:`,\n verifyError,\n );\n }\n }\n } catch (error) {\n logger.error(`Error processing area ${area.name}:`, error);\n continue;\n }\n }\n\n processedCount++;\n validatedCount++;\n validatedTasks.push(scheduleTask);\n\n logger.info(\n `Successfully processed schedule ${scheduleTask._id}, created/updated area checklists for all areas.`,\n );\n } catch (error) {\n logger.error(\n `Error processing schedule task ${scheduleTask._id}:`,\n error,\n );\n continue;\n }\n }\n\n logger.info(\n `Scheduled task processing completed. Processed: ${processedCount}, Validated: ${validatedCount} tasks`,\n );\n\n return {\n processed: processedCount,\n validated: validatedCount,\n tasks: validatedTasks,\n };\n } catch (error) {\n logger.error(\"Error processing scheduled tasks:\", error);\n throw error;\n }\n }\n\n return { checkScheduleConditions, processScheduledTasks };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { scheduleTaskSchema } from \"../models/hygiene-schedule-task.model\";\nimport { useScheduleTaskRepository } from \"../repositories/hygiene-schedule-task.repository\";\n\nexport function useScheduleTaskController() {\n const {\n createScheduleTask: _createScheduleTask,\n getScheduleTasks: _getScheduleTasks,\n getTasksForScheduleTask: _getTasksForScheduleTask,\n getScheduleTaskById: _getScheduleTaskById,\n updateScheduleTask: _updateScheduleTask,\n } = useScheduleTaskRepository();\n\n async function createScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>,\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, ...req.params, createdBy };\n\n const { error } = scheduleTaskSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createScheduleTask(payload);\n\n res\n .status(201)\n .json({ message: \"Schedule task created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getScheduleTasks(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getScheduleTasks({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getTasksForScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getTasksForScheduleTask({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getScheduleTaskById(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error, value } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getScheduleTaskById(value);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateScheduleTask(\n req: Request,\n res: Response,\n next: NextFunction,\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n title: Joi.string().optional().allow(\"\", null),\n time: Joi.string()\n .pattern(/^([0-1]\\d|2[0-3]):([0-5]\\d)$/)\n .optional()\n .allow(\"\", null),\n startDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n endDate: Joi.string()\n .pattern(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional()\n .allow(\"\", null),\n description: Joi.string().optional().allow(\"\", null),\n areas: Joi.array()\n .min(1)\n .items(\n Joi.object({\n name: Joi.string().required(),\n value: Joi.any().required(),\n }),\n )\n .optional(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateScheduleTask(id, value);\n\n res.json({ message: \"Schedule task updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createScheduleTask,\n getScheduleTasks,\n getTasksForScheduleTask,\n getScheduleTaskById,\n updateScheduleTask,\n };\n}\n","import { logger } from \"@7365admin1/node-server-utils\";\nimport { launch } from \"puppeteer\";\nimport QRCode from \"qrcode\";\n\nexport function useQRService() {\n async function generateQRDataUrl(qrUrl: string): Promise<string> {\n return QRCode.toDataURL(qrUrl, {\n width: 350,\n margin: 2,\n errorCorrectionLevel: \"M\",\n color: {\n dark: \"#000000\",\n light: \"#FFFFFF\",\n },\n });\n }\n\n async function generateQRImage(qrUrl: string): Promise<Buffer> {\n try {\n // Generate QR code as data URL server-side\n const qrDataUrl = await generateQRDataUrl(qrUrl);\n\n const browser = await launch({\n headless: true,\n executablePath: process.env.CHROME_BINARY,\n args: [`--no-sandbox`, `--disable-gpu`, `--disable-dev-shm-usage`],\n });\n\n const page = await browser.newPage();\n\n await page.setViewport({\n width: 400,\n height: 400,\n });\n\n // Use embedded QR code image (no external CDN needed)\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <style>\n body {\n margin: 0;\n padding: 20px;\n display: flex;\n justify-content: center;\n align-items: center;\n background: white;\n min-height: 100vh;\n }\n #qr-image {\n display: block;\n width: 350px;\n height: 350px;\n }\n </style>\n </head>\n <body>\n <img id=\"qr-image\" src=\"${qrDataUrl}\" alt=\"QR Code\" />\n </body>\n </html>\n `;\n\n await page.setContent(html, {\n waitUntil: [\"load\", \"networkidle0\"],\n });\n\n await page.waitForSelector(\"#qr-image\", { timeout: 10000 });\n\n const imageBuffer = await page.screenshot({\n type: \"png\",\n clip: {\n x: 0,\n y: 0,\n width: 400,\n height: 400,\n },\n });\n\n await browser.close();\n\n return imageBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate QR image: ${error.message}`,\n });\n throw error;\n }\n }\n\n async function generateQRPDF(qrUrl: string, title?: string): Promise<Buffer> {\n try {\n // Generate QR code as data URL server-side (no CDN needed)\n const qrDataUrl = await generateQRDataUrl(qrUrl);\n\n const browser = await launch({\n headless: true,\n executablePath: process.env.CHROME_BINARY,\n args: [`--no-sandbox`, `--disable-gpu`, `--disable-dev-shm-usage`],\n });\n\n const page = await browser.newPage();\n\n // Set viewport for PDF generation\n await page.setViewport({\n width: 800,\n height: 1100,\n });\n\n // Escape title for safe HTML insertion\n const escapedTitle = (title || \"Cleaning Schedule QR Code\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n\n // Generate HTML with embedded QR code image (no external JavaScript needed)\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n body {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: white;\n padding: 60px 40px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n }\n .qr-container {\n text-align: center;\n background: transparent;\n padding: 0;\n }\n h1 {\n font-size: 28px;\n color: #333;\n margin-bottom: 20px;\n font-weight: 600;\n }\n .qr-wrapper {\n display: inline-block;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 0;\n margin: 20px 0;\n }\n #qr-image {\n display: block;\n width: 350px;\n height: 350px;\n }\n .instructions {\n margin-top: 30px;\n font-size: 16px;\n color: #666;\n line-height: 1.6;\n }\n .url-info {\n margin-top: 20px;\n padding: 15px;\n background: #f5f5f5;\n border-radius: 6px;\n font-size: 12px;\n color: #888;\n word-break: break-all;\n }\n </style>\n </head>\n <body>\n <div class=\"qr-container\">\n <h1>${escapedTitle}</h1>\n <div class=\"qr-wrapper\">\n <img id=\"qr-image\" src=\"${qrDataUrl}\" alt=\"QR Code\" />\n </div>\n <div class=\"instructions\">\n <p>Scan this QR code to access the cleaning schedule.</p>\n </div>\n <div class=\"url-info\">\n ${qrUrl}\n </div>\n </div>\n </body>\n </html>\n `;\n\n await page.setContent(html, {\n waitUntil: [\"load\", \"networkidle0\"],\n });\n\n // Wait for QR code image to load\n await page.waitForSelector(\"#qr-image\", { timeout: 10000 });\n\n // Wait for the image to fully load\n await page.waitForFunction(\n () => {\n const img = document.getElementById(\"qr-image\") as HTMLImageElement;\n return img && img.complete && img.naturalWidth > 0;\n },\n { timeout: 10000 },\n );\n\n // Generate PDF\n const pdfBuffer = await page.pdf({\n format: \"A4\",\n printBackground: true,\n margin: {\n top: \"20mm\",\n right: \"20mm\",\n bottom: \"20mm\",\n left: \"20mm\",\n },\n });\n\n await browser.close();\n\n return pdfBuffer as Buffer;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Failed to generate QR PDF: ${error.message}`,\n });\n throw error;\n }\n }\n\n return {\n generateQRImage,\n generateQRPDF,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@7365admin1/node-server-utils\";\nimport { useQRService } from \"../services/hygiene-qr.service\";\n\nexport function useQRController() {\n const { generateQRImage: _generateQRImage, generateQRPDF: _generateQRPDF } =\n useQRService();\n\n async function generateQR(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n url: Joi.string().uri().required(),\n filename: Joi.string().optional().allow(\"\", null),\n title: Joi.string().optional().allow(\"\", null),\n download: Joi.boolean().optional().default(false),\n });\n\n const query = { ...req.query };\n\n const { error, value } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { url, filename, title, download } = value;\n\n // If download is requested, generate PDF, otherwise generate PNG image\n if (download) {\n const pdfBuffer = await _generateQRPDF(url, title);\n\n if (!pdfBuffer || pdfBuffer.length === 0) {\n throw new Error(\"Generated QR PDF is empty or invalid.\");\n }\n\n const sanitizedFilename = (filename || \"qrcode\")\n .replace(/['\"]/g, \"\")\n .replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n const date = new Date();\n const formattedDate = `${String(date.getMonth() + 1).padStart(\n 2,\n \"0\",\n )}-${String(date.getDate()).padStart(2, \"0\")}-${date.getFullYear()}`;\n\n res.setHeader(\"Content-Type\", \"application/pdf\");\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"${sanitizedFilename}-${formattedDate}.pdf\"`,\n );\n res.setHeader(\"Content-Length\", pdfBuffer.length);\n\n res.end(pdfBuffer);\n } else {\n // Generate PNG image for inline display\n const imageBuffer = await _generateQRImage(url);\n\n if (!imageBuffer || imageBuffer.length === 0) {\n throw new Error(\"Generated QR image is empty or invalid.\");\n }\n\n res.setHeader(\"Content-Type\", \"image/png\");\n res.setHeader(\"Cache-Control\", \"public, max-age=3600\");\n res.setHeader(\"Content-Length\", imageBuffer.length);\n\n res.end(imageBuffer);\n }\n\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n generateQR,\n };\n}\n"],"mappings":"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","names":["BadRequestError","logger","logger","BadRequestError","error","Joi","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","ObjectId","error","ObjectId","useAtlas","InternalServerError","BadRequestError","useCache","logger","makeCacheKey","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","BadRequestError","logger","NotFoundError","logger","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","Joi","ObjectId","BadRequestError","logger","error","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","paginate","BadRequestError","NotFoundError","logger","Joi","BadRequestError","logger","xlsx","logger","BadRequestError","error","Joi","BadRequestError","logger","NotFoundError","useAtlas","logger","xlsx","BadRequestError","NotFoundError","logger","useAtlas","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","paginate","useCache","logger","makeCacheKey","BadRequestError","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","dateStr","result","makeCacheKey","paginate","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","ObjectId","error","logger","useAtlas","ObjectId","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","makeCacheKey","paginate","useAtlas","logger","set","Joi","BadRequestError","logger","value","Joi","logger","BadRequestError","error","decision","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","NotFoundError","useAtlas","InternalServerError","useCache","logger","BadRequestError","ObjectId","makeCacheKey","paginate","NotFoundError","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","BadRequestError","useCache","logger","makeCacheKey","paginate","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","useAtlas","BadRequestError","useAtlas","NotFoundError","BadRequestError","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","ObjectId","BadRequestError","logger","error","ObjectId","useAtlas","InternalServerError","useCache","logger","makeCacheKey","paginate","BadRequestError","NotFoundError","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","BadRequestError","useAtlas","useAtlas","BadRequestError","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error","BadRequestError","logger","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","NotFoundError","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","NotFoundError","logger","logger","Joi","BadRequestError","logger","logger","BadRequestError","error","Joi","logger","Joi","BadRequestError","logger","Joi","logger","BadRequestError","error"]}
|