update site points controller and route to add new endpoint for all data
Some checks failed
Deploy Backend / deploy (push) Has been cancelled

This commit is contained in:
wayanrivan
2026-07-07 10:52:42 +07:00
parent f47379d040
commit 3836e4c521
143 changed files with 1384 additions and 29024 deletions

View File

@ -21,11 +21,11 @@
},
"database": {
"engine": "postgres",
"host": "147.139.175.69",
"port": "4137",
"username": "saude_stag",
"password": "gM*#o>3W4&5X",
"database": "saude_stag",
"host": "127.0.0.1",
"port": "5432",
"username": "rivanwayan",
"password": "",
"database": "revenue",
"synchronize": true,
"logging": true
},

View File

@ -29,7 +29,6 @@
"cors": "^2.8.5",
"entity": "file:../entity",
"express": "^4.21.1",
"express-fileupload": "^1.5.2",
"express-jwt": "^8.4.1",
"fast-csv": "^5.0.2",
"helmet": "^8.0.0",
@ -37,6 +36,7 @@
"joi": "^17.13.3",
"moment": "^2.30.1",
"morgan": "^1.10.0",
"multer": "^2.2.0",
"npm": "^10.9.1",
"pg": "^8.13.1",
"reflect-metadata": "^0.2.2",
@ -44,7 +44,8 @@
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1",
"tslog": "^4.9.3",
"typeorm": "^0.3.20"
"typeorm": "^0.3.20",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.6",
@ -52,8 +53,8 @@
"@types/config": "^3.3.5",
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
"@types/express-fileupload": "^1.5.1",
"@types/morgan": "^1.9.9",
"@types/multer": "^2.2.0",
"@types/swagger-ui-express": "^4.1.7",
"@types/uuid": "^10.0.0",
"ts-node": "^10.9.2",

View File

@ -1,428 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Administrativu, Munisipo } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[AdministrativuController]', type: 'pretty' });
export class AdministrativuController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Administrativu);
const offset = (param.page - 1) * param.limit
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.munisipo_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder("Administrativu")
.leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.munisipo_id) {
res_count.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
}
const res_list = repo.createQueryBuilder("Administrativu")
.leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal)
.orderBy("Administrativu." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
// Handle foreign key filter with relation
if (filterObj.munisipo_id) {
res_list.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
}
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Administrativu);
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.munisipo_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
});
const filename = "administrativu.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Administrativu): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
let query = repo.createQueryBuilder("Administrativu")
.leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.munisipo_id) {
query = query.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
}
const data = await query
.select([
'Administrativu.id',
'Administrativu.code',
'Administrativu.name',
'Administrativu.status',
'Administrativu.created_at'])
.orderBy("Administrativu." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/administrativu"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
munisipo_id: Joi.string().uuid().required().label('Munisipo'),
});
const param: any = await schema.validateAsync(req.body);
const data = new Administrativu()
data.code = param.code
data.name = param.name
data.status = param.status
data.munisipo = await OrmHelper.DB.getRepository(Munisipo).findOneByOrFail({ id: param.munisipo_id });
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Administrativu ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/administrativu"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
munisipo_id: Joi.string().uuid().required().label('Munisipo'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Administrativu);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
data.munisipo = await OrmHelper.DB.getRepository(Munisipo).findOneByOrFail({ id: param.munisipo_id });
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Administrativu ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Administrativu);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Administrativu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Administrativu ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Administrativu = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Administrativu);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,519 +0,0 @@
import { Response, NextFunction } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from "fast-csv";
import dayjs from "dayjs";
import { Application } from "entity";
const log: Logger<ILogObj> = new Logger({
name: "[ApplicationController]",
type: "pretty",
});
export class ApplicationController {
static async list(
req: Request,
res: Response,
next: NextFunction
): Promise<Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string()
.allow("asc", "desc")
.required()
.label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Application);
const offset = (param.page - 1) * param.limit;
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ["code"],
col_any_like: ["name"],
});
const res_count = repo.createQueryBuilder().where(whereAttr, whereVal);
const res_list = repo
.createQueryBuilder()
.where(whereAttr, whereVal)
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
count_data,
current_page,
total_count_data,
list_data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
}
}
static async export(
req: Request,
res: Response,
next: NextFunction
): Promise<void | Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string()
.allow("asc", "desc")
.required()
.label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Application);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ["code"],
col_any_like: ["name"],
});
const filename = "application.csv";
res.setHeader("Content-Type", "text/csv");
res.setHeader("Content-Disposition", "attachment; filename=" + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Application): any => ({
...row,
created_at: dayjs(row.created_at).format("DD-MM-YYYY HH:MM:ss"),
}),
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit;
const data = await repo
.createQueryBuilder()
.where(whereAttr, whereVal)
.select(["id", "code", "name", "status", "created_at"])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit)
.getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
}
}
static async create(
req: Request,
res: Response,
next: NextFunction
): Promise<Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/application"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().max(32).required().label("ID"),
name: Joi.string().max(256).required().label("Name"),
reset_password_url: Joi.string()
.max(512)
.optional()
.allow("")
.label("Url reset password"),
status: Joi.string().required().label("Status"),
});
const param: Application = await schema.validateAsync(req.body);
const data = new Application();
data.id = param.id;
data.name = param.name;
data.reset_password_url = param.reset_password_url;
data.status = param.status;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_insert,
data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
500,
401,
Language.lang.failed_insert,
err.message
);
}
}
static async update(
req: Request,
res: Response,
next: NextFunction
): Promise<Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Application ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/application"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().required().label("ID"),
name: Joi.string().max(256).required().label("Name"),
reset_password_url: Joi.string()
.max(512)
.optional()
.allow("")
.label("Url reset password"),
status: Joi.string().required().label("Status"),
});
req.body.id = req.params["id"];
const param: Application = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Application);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.name = param.name;
data.reset_password_url = param.reset_password_url;
data.status = param.status;
await repo.save(data);
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_update,
data
);
} else {
return ReturnHelper.errorResponse(
res,
404,
401,
Language.lang.failed_not_found,
""
);
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
500,
402,
Language.lang.failed_update,
err.message
);
}
}
static async delete(
req: Request,
res: Response,
next: NextFunction
): Promise<Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Application ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(
req.params
);
const repo = OrmHelper.DB.getRepository(Application);
const affected = (
!param.hard
? await repo.softDelete({ id: param.id })
: await repo.delete({ id: param.id })
).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_delete,
{}
);
} else {
return ReturnHelper.errorResponse(
res,
404,
401,
Language.lang.failed_not_found,
""
);
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
500,
402,
Language.lang.failed_delete,
err.message
);
}
}
static async restore(
req: Request,
res: Response,
next: NextFunction
): Promise<Response> {
/*
#swagger.tags = ['Application']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Application ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: Application = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Application);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_restore,
{}
);
} else {
return ReturnHelper.errorResponse(
res,
404,
401,
Language.lang.failed_not_found,
""
);
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
500,
402,
Language.lang.failed_restore,
err.message
);
}
}
}

View File

@ -1,164 +0,0 @@
import { CardKeySet, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { CardKeySetModel } from "../model/card_key_sets";
import { OrmHelper } from "../helpers/orm";
const log: Logger<ILogObj> = new Logger({
name: "[CardKeySetsController]",
type: "pretty",
});
export class CardKeySetsController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Card Key Set']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().optional().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await CardKeySetModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("CardKeySet." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async active(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Card Key Set']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const repo = OrmHelper.DB.getRepository(CardKeySet);
let entity = await repo.createQueryBuilder("CardKeySet")
.where("CardKeySet.is_active = :is_active", { is_active: true })
.orderBy("CardKeySet.created_at", "DESC")
.getOne();
if (!entity) throw { message: "Active Card Key Set Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, entity);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Card Key Set']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/card_key_set" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
key_set_id: Joi.string().max(256).required().label("Key Set ID"),
app_master_key: Joi.string().allow(null, "").optional().label("App Master Key"),
read_basic_key: Joi.string().allow(null, "").optional().label("Read Basic Key"),
write_update_key: Joi.string().allow(null, "").optional().label("Write Update Key"),
read_sensitive_key: Joi.string().allow(null, "").optional().label("Read Sensitive Key"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { key_set_id: param.key_set_id };
let exist = await CardKeySetModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Card Key Set " + Language.lang.failed_duplicate };
let entity = new CardKeySet();
entity.key_set_id = param.key_set_id;
entity.app_master_key = param.app_master_key;
entity.read_basic_key = param.read_basic_key;
entity.write_update_key = param.write_update_key;
entity.read_sensitive_key = param.read_sensitive_key;
entity.is_active = true;
await queryRunner.manager.save(entity);
// Set the previous data (all other records) to is_active = false
await queryRunner.manager.createQueryBuilder()
.update(CardKeySet)
.set({ is_active: false })
.where("id != :id", { id: entity.id })
.execute();
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, entity);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Card Key Set']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['key_set_id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
key_set_id: Joi.string().required().label("Card Key Set ID"),
});
let param: any = await schema.validateAsync(req.params);
let entity = await CardKeySetModel.list({ "CardKeySet.key_set_id": param.key_set_id }).then((q) => q.getOne());
if (!entity) throw { message: "Card Key Set Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, entity);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,214 +0,0 @@
import { Response, NextFunction } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging, CardPrintQueue, CardPrintQueueStatus, CardPrintQueueType } from "entity";
import CommonHelper from "../helpers/common";
import { CardPrintQueueModel } from "../model/card_print_queue";
const log: Logger<ILogObj> = new Logger({ name: '[CardPrintQueueController]', type: 'pretty' });
export class CardPrintQueueController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['CardPrintQueue']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj };
var query = await CardPrintQueueModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("card_print_queue." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
private static async handleCreate(req: Request, res: Response, type: CardPrintQueueType): Promise<Response> {
try {
const schema = Joi.object().keys({
mrn: Joi.string().max(256).allow("").optional().label("MRN"),
municipiu_code: Joi.string().max(256).allow("").optional().label("Municipiu Code"),
posto_adm_code: Joi.string().max(256).allow("").optional().label("Posto Adm Code"),
name: Joi.string().max(256).allow("").optional().label("Name"),
address: Joi.string().allow("").optional().label("Address"),
municipiu: Joi.string().max(256).allow("").optional().label("Municipiu"),
posto_adm: Joi.string().max(256).allow("").optional().label("Posto Adm"),
suco: Joi.string().max(256).allow("").optional().label("Suco"),
aldeia: Joi.string().max(256).allow("").optional().label("Aldeia"),
sexo: Joi.string().max(64).allow("").optional().label("Sexo"),
birthdate: Joi.string().max(64).allow("").optional().label("Birthdate"),
patient_id: Joi.string().uuid().allow("").optional().label("Patient ID"),
facility_code: Joi.string().max(256).allow("").optional().label("Facility Code"),
status: Joi.string().valid("pending", "in_progress", "completed", "failed", "blocked").optional().label("Status"),
});
const param: any = await schema.validateAsync(req.body);
const data = new CardPrintQueue();
data.mrn = param.mrn || null;
data.municipiu_code = param.municipiu_code || null;
data.posto_adm_code = param.posto_adm_code || null;
data.name = param.name || null;
data.address = param.address || null;
data.municipiu = param.municipiu || null;
data.posto_adm = param.posto_adm || null;
data.suco = param.suco || null;
data.aldeia = param.aldeia || null;
data.sexo = param.sexo || null;
data.birthdate = param.birthdate || null;
data.patient_id = param.patient_id || null;
data.facility_code = param.facility_code || null;
data.status = param.status || CardPrintQueueStatus.PENDING;
data.type = type;
const authHeader = req.headers.authorization;
let rawToken = "";
if (authHeader) {
const parts = authHeader.split(" ");
rawToken = parts.length > 1 ? parts[1] : parts[0];
}
data.token = rawToken ? Buffer.from(rawToken).toString("base64") : null;
data.created_by = req.auth?.data?.name || null;
data.updated_by = req.auth?.data?.name || null;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardPrintQueue']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/card_print_queue"
}
}
}
}
*/
return CardPrintQueueController.handleCreate(req, res, CardPrintQueueType.PRINT_PROVISION);
}
static async createProvision(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardPrintQueue']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/card_print_queue"
}
}
}
}
*/
return CardPrintQueueController.handleCreate(req, res, CardPrintQueueType.PROVISION);
}
static async createPrint(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardPrintQueue']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/card_print_queue"
}
}
}
}
*/
return CardPrintQueueController.handleCreate(req, res, CardPrintQueueType.PRINT);
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['CardPrintQueue']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'number' }
*/
try {
const schema = Joi.object().keys({
id: Joi.number().integer().required().label("ID"),
});
let param: any = await schema.validateAsync(req.params);
let cardPrintQueue = await CardPrintQueueModel.list({ "card_print_queue.id": param.id }).then((q) => q.getOne());
if (!cardPrintQueue) throw { message: "Card Print Queue Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, cardPrintQueue);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,369 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging, CardType } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { CardTypeModel } from "../model/card_type";
const log: Logger<ILogObj> = new Logger({ name: '[CardTypeController]', type: 'pretty' });
export class CardTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj };
var query = await CardTypeModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("card_type." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await CardTypeModel.list(filter);
const data = await query.getMany();
const filename = "card_type.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: CardType): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/card_type"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new CardType()
data.name = param.name;
data.created_by = req.auth.data.name;
data.updated_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'CardType ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/card_type"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(CardType);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.name = param.name;
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'CardType ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(CardType);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'CardType ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(CardType);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['CardType']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("CardType Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await CardTypeModel.list({ "id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "CardType Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,282 +0,0 @@
import config from "config";
import { Paging, Status, Currency } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import { Language } from "../langs/lang";
import fs from "fs";
import { CurrencyModel } from "../model/currencies";
const log: Logger<ILogObj> = new Logger({
name: "[CurrencyController]",
type: "pretty",
});
export class CurrencyController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Currency']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
descriptionk:'',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const offset = (param.page - 1) * param.limit;
const filter = JSON.parse(param.filter);
const query = await CurrencyModel.list(filter);
const limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("Currency." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Currency']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/currency"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
name: Joi.string().required().label("Name"),
symbol: Joi.string().required().label("Symbol"),
status: Joi.string().uuid().required().valid("Y", "N").label("Status"),
});
const param = await schema.validateAsync(req.body);
const data = new Currency();
data.name = param.name;
data.symbol = param.symbol;
data.status = param.status;
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Currency']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Currency ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().required().label("ID"),
});
let param: any = await schema.validateAsync(req.params);
let data = await CurrencyModel.list({ id: param.id }).then((q) => q.getOne());
if (!data) throw { message: "Currency " + Language.lang.failed_not_found };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Currency']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/currency"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().required().label("Bank ID"),
name: Joi.string().required().label("Name"),
symbol: Joi.string().required().label("Symbol"),
status: Joi.string().uuid().required().valid("Y", "N").label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let currency: Currency = await CurrencyModel.list({ id: param.id }).then((q) => q.getOne());
if (!currency) throw { message: "Currnecy " + Language.lang.failed_not_found };
currency.name = param.name;
currency.symbol = param.symbol;
currency.status = param.status;
await queryRunner.manager.save(currency);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, currency);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Currency']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Bank ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Currency);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,255 +0,0 @@
import { Department, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DepartmentModel } from "../model/department";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[DepartmentController]",
type: "pretty",
});
export class DepartmentController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await DepartmentModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("Department." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/department" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(128).required().label("Name"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await DepartmentModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Department " + Language.lang.failed_duplicate };
let department = new Department();
department.name = param.name;
department.status = param.status;
department.created_by = req.auth.data.name;
department.updated_by = req.auth.data.name;
await queryRunner.manager.save(department);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, department);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Department Id"),
});
let param: any = await schema.validateAsync(req.params);
let department = await DepartmentModel.list({ "Department.id": param.id }).then((q) => q.getOne());
if (!department) throw { message: "Department Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, department);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/department" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Department ID"),
name: Joi.string().max(128).required().label("Name"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await DepartmentModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Department " + Language.lang.failed_duplicate };
let department = await DepartmentModel.list({ "Department.id": param.id }).then((q) => q.getOne());
if (!department) throw { message: "Department " + Language.lang.failed_not_found };
department.name = param.name;
department.status = param.status;
department.updated_by = req.auth.data.name;
await queryRunner.manager.save(department);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, department);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let department: Department = await DepartmentModel.list({ "Department.id": param.id }).then((q) => q.getOne());
if (!department) throw { message: "Department " + Language.lang.failed_not_found };
department.deleted_by = req.auth.data.name;
department.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(department);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(Department);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Department']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Department);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,494 +0,0 @@
import { Diagnosis, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Brackets } from "typeorm";
import { validate as validateUuid } from "uuid";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DiagnosisModel } from "../model/diagnosis";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[DiagnosisController]",
type: "pretty",
});
const DIAGNOSIS_NAME_COLUMNS = [
"Diagnosis.diagnosis",
"Diagnosis.diagnosis_ind",
"Diagnosis.diagnosis_pt",
"Diagnosis.diagnosis_tet",
] as const;
const MIN_DIAGNOSIS_SEARCH_TOKEN_LENGTH = 2;
function stripLikeWildcards(value: string): string {
return value.replace(/^%+|%+$/g, "").trim();
}
function parseDiagnosisSearchTokens(raw: unknown): string[] {
const text = stripLikeWildcards(String(raw ?? ""));
if (!text) {
return [];
}
return text
.split(/\s+/)
.map((t) => t.trim())
.filter((t) => t.length >= MIN_DIAGNOSIS_SEARCH_TOKEN_LENGTH);
}
function applyLocalizedDiagnosisFields(
diagnosis: Diagnosis,
param: { diagnosis: string; diagnosis_ind?: string; diagnosis_pt?: string; diagnosis_tet?: string },
) {
diagnosis.diagnosis = param.diagnosis;
diagnosis.diagnosis_ind = param.diagnosis_ind?.trim() || param.diagnosis;
diagnosis.diagnosis_pt = param.diagnosis_pt?.trim() || param.diagnosis;
diagnosis.diagnosis_tet = param.diagnosis_tet?.trim() || param.diagnosis;
}
type DiagnosisQueryBuilder = {
where: (sql: string, params?: Record<string, unknown>) => unknown;
orWhere: (sql: string, params?: Record<string, unknown>) => unknown;
andWhere: (sql: string, params?: Record<string, unknown>) => unknown;
};
function addDiagnosisNameTokenSearch(
qb: DiagnosisQueryBuilder,
raw: unknown,
op: "where" | "orWhere",
paramPrefix: string,
): void {
const tokens = parseDiagnosisSearchTokens(raw);
if (tokens.length === 0) {
const phrase = `%${stripLikeWildcards(String(raw ?? ""))}%`;
(qb as any)[op](
new Brackets((inner) => {
DIAGNOSIS_NAME_COLUMNS.forEach((col, idx) => {
const key = `${paramPrefix}_phrase_${idx}`;
const method = idx === 0 ? "where" : "orWhere";
(inner as any)[method](`${col} ILIKE :${key}`, { [key]: phrase });
});
}),
);
return;
}
(qb as any)[op](
new Brackets((tokenGroup) => {
tokens.forEach((token, tokenIdx) => {
const tokenKey = `${paramPrefix}_tok_${tokenIdx}`;
const tokenMethod = tokenIdx === 0 ? "andWhere" : "andWhere";
(tokenGroup as any)[tokenMethod](
new Brackets((colGroup) => {
DIAGNOSIS_NAME_COLUMNS.forEach((col, colIdx) => {
const colKey = `${tokenKey}_col_${colIdx}`;
const colMethod = colIdx === 0 ? "where" : "orWhere";
(colGroup as any)[colMethod](`${col} ILIKE :${colKey}`, {
[colKey]: `%${token}%`,
});
});
}),
);
});
}),
);
}
export class DiagnosisController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter JSON. Diagnosis.code, Diagnosis.diagnosis (multi-word token AND on diagnosis, diagnosis_ind, diagnosis_pt, diagnosis_tet), and Diagnosis.type are OR-combined; other fields use AND.',
in: 'query',
type: 'string',
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const codeKey = "Diagnosis.code";
const diagnosisKey = "Diagnosis.diagnosis";
const typeKey = "Diagnosis.type";
const orCode = filter[codeKey];
const orDiagnosis = filter[diagnosisKey];
const orType = filter[typeKey];
const restFilter = { ...filter };
delete restFilter[codeKey];
delete restFilter[diagnosisKey];
delete restFilter[typeKey];
var query = await DiagnosisModel.list(restFilter);
if (orCode !== undefined || orDiagnosis !== undefined || orType !== undefined) {
query.andWhere(
new Brackets((qb) => {
let isFirst = true;
const addOr = (column: string, paramKey: string, raw: any, castText = false) => {
const op = isFirst ? "where" : "orWhere";
isFirst = false;
const colExpr = castText ? `CAST(${column} AS TEXT)` : column;
if (Array.isArray(raw)) {
(qb as any)[op](`${colExpr} IN (:...${paramKey})`, { [paramKey]: raw });
return;
}
const f = String(raw);
if (validateUuid(f)) {
(qb as any)[op](`${colExpr} = :${paramKey}`, { [paramKey]: f });
return;
}
if (f === "null") {
(qb as any)[op](`${column} IS NULL`);
return;
}
if (f.includes("%")) {
(qb as any)[op](`${colExpr} ILIKE :${paramKey}`, { [paramKey]: f });
return;
}
(qb as any)[op](`${colExpr} = :${paramKey}`, { [paramKey]: f });
};
if (orCode !== undefined) addOr("Diagnosis.code", "diag_or_code", orCode);
if (orDiagnosis !== undefined) {
const op = isFirst ? "where" : "orWhere";
isFirst = false;
addDiagnosisNameTokenSearch(qb as DiagnosisQueryBuilder, orDiagnosis, op, "diag_or_diagnosis");
}
if (orType !== undefined) addOr("Diagnosis.type", "diag_or_type", orType, true);
}),
);
}
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("Diagnosis." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/diagnosis"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
diagnosis: Joi.string().max(256).required().label("Diagnosis"),
diagnosis_ind: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Indonesian)"),
diagnosis_pt: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Portuguese)"),
diagnosis_tet: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Tetum)"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await DiagnosisModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Diagnosis " + Language.lang.failed_duplicate };
let diagnosis = new Diagnosis();
applyLocalizedDiagnosisFields(diagnosis, param);
diagnosis.code = param.code;
diagnosis.status = param.status;
diagnosis.created_by = req.auth?.data.name;
diagnosis.updated_by = req.auth?.data.name;
await queryRunner.manager.save(diagnosis);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, diagnosis);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Diagnosis Id"),
});
let param: any = await schema.validateAsync(req.params);
let diagnosis = await DiagnosisModel.list({
"Diagnosis.id": param.id,
}).then((q) => q.getOne());
if (!diagnosis) throw { message: "Diagnosis Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, diagnosis);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/diagnosis"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Diagnosis ID"),
diagnosis: Joi.string().max(256).required().label("Diagnosis"),
diagnosis_ind: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Indonesian)"),
diagnosis_pt: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Portuguese)"),
diagnosis_tet: Joi.string().max(256).allow("", null).optional().label("Diagnosis (Tetum)"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await DiagnosisModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Diagnosis " + Language.lang.failed_duplicate };
let diagnosis = await DiagnosisModel.list({
"Diagnosis.id": param.id,
}).then((q) => q.getOne());
if (!diagnosis) throw { message: "Diagnosis " + Language.lang.failed_not_found };
applyLocalizedDiagnosisFields(diagnosis, param);
diagnosis.code = param.code;
diagnosis.status = param.status;
diagnosis.updated_by = req.auth?.data.name;
await queryRunner.manager.save(diagnosis);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, diagnosis);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Diagnosis ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let diagnosis: Diagnosis = await DiagnosisModel.list({
"Diagnosis.id": param.id,
}).then((q) => q.getOne());
if (!diagnosis) throw { message: "Diagnosis " + Language.lang.failed_not_found };
diagnosis.deleted_by = req.auth?.data.name;
diagnosis.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(diagnosis);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(Diagnosis);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Diagnosis (ICD-11)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Diagnosis ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Diagnosis);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,391 +0,0 @@
import { DiagnosticProcedure, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Brackets } from "typeorm";
import { validate as validateUuid } from "uuid";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DiagnosticProcedureModel } from "../model/diagnostic_procedure";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[DiagnosticProcedureController]",
type: "pretty",
});
export class DiagnosticProcedureController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter: JSON object; DiagnosticProcedure.code and DiagnosticProcedure.diagnosticProcedure are combined with OR; other fields use AND.',
in: 'query',
type: 'string',
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const codeKey = "DiagnosticProcedure.code";
const procedureKey = "DiagnosticProcedure.diagnosticProcedure";
const orCode = filter[codeKey];
const orProcedure = filter[procedureKey];
const restFilter = { ...filter };
delete restFilter[codeKey];
delete restFilter[procedureKey];
var query = await DiagnosticProcedureModel.list(restFilter);
if (orCode !== undefined || orProcedure !== undefined) {
query.andWhere(
new Brackets((qb) => {
let isFirst = true;
const addOr = (column: string, paramKey: string, raw: any) => {
const op = isFirst ? "where" : "orWhere";
isFirst = false;
if (Array.isArray(raw)) {
(qb as any)[op](`${column} IN (:...${paramKey})`, { [paramKey]: raw });
return;
}
const f = String(raw);
if (validateUuid(f)) {
(qb as any)[op](`${column} = :${paramKey}`, { [paramKey]: f });
return;
}
if (f === "null") {
(qb as any)[op](`${column} IS NULL`);
return;
}
if (f.includes("%")) {
(qb as any)[op](`${column} ILIKE :${paramKey}`, { [paramKey]: f });
return;
}
(qb as any)[op](`${column} = :${paramKey}`, { [paramKey]: f });
};
if (orCode !== undefined) addOr("DiagnosticProcedure.code", "dp_or_code", orCode);
if (orProcedure !== undefined) addOr("DiagnosticProcedure.diagnosticProcedure", "dp_or_procedure", orProcedure);
}),
);
}
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("DiagnosticProcedure." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/diagnostic_procedure"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
diagnosticProcedure: Joi.string().max(256).required().label("Diagnostic Procedure"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await DiagnosticProcedureModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Diagnostic Procedure " + Language.lang.failed_duplicate };
let diagnosticProcedure = new DiagnosticProcedure();
diagnosticProcedure.diagnosticProcedure = param.diagnosticProcedure;
diagnosticProcedure.code = param.code;
diagnosticProcedure.status = param.status;
diagnosticProcedure.created_by = req.auth.data.name;
diagnosticProcedure.updated_by = req.auth.data.name;
await queryRunner.manager.save(diagnosticProcedure);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, diagnosticProcedure);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Diagnostic Procedure Id"),
});
let param: any = await schema.validateAsync(req.params);
let diagnosticProcedure = await DiagnosticProcedureModel.list({ "DiagnosticProcedure.id": param.id }).then((q) => q.getOne());
if (!diagnosticProcedure) throw { message: "Diagnostic Procedure Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, diagnosticProcedure);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/diagnostic_procedure"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Diagnostic Procedure ID"),
diagnosticProcedure: Joi.string().max(256).required().label("Diagnostic Procedure"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await DiagnosticProcedureModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Diagnostic Procedure " + Language.lang.failed_duplicate };
let diagnosticProcedure = await DiagnosticProcedureModel.list({ "DiagnosticProcedure.id": param.id }).then((q) => q.getOne());
if (!diagnosticProcedure) throw { message: "Diagnostic Procedure " + Language.lang.failed_not_found };
diagnosticProcedure.diagnosticProcedure = param.diagnosticProcedure;
diagnosticProcedure.code = param.code;
diagnosticProcedure.status = param.status;
diagnosticProcedure.updated_by = req.auth.data.name;
await queryRunner.manager.save(diagnosticProcedure);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, diagnosticProcedure);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Diagnostic Procedure ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let diagnosticProcedure: DiagnosticProcedure = await DiagnosticProcedureModel.list({ "DiagnosticProcedure.id": param.id }).then((q) => q.getOne());
if (!diagnosticProcedure) throw { message: "Diagnostic Procedure " + Language.lang.failed_not_found };
diagnosticProcedure.deleted_by = req.auth.data.name;
diagnosticProcedure.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(diagnosticProcedure);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(DiagnosticProcedure);
affected = (await repo.delete({ id: param.id })).affected;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Diagnostic Procedure (ICD-9)']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Diagnostic Procedure ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(DiagnosticProcedure);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,391 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { District } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[DistrictController]', type: 'pretty' });
export class DistrictController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(District);
const offset = (param.page - 1) * param.limit
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder()
.where(whereAttr, whereVal);
const res_list = repo.createQueryBuilder()
.where(whereAttr, whereVal)
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(District);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const filename = "district.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: District): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
const data = await repo.createQueryBuilder()
.where(whereAttr, whereVal)
.select([
'id',
'code',
'name',
'status',
'created_at'])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/district"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
const param: District = await schema.validateAsync(req.body);
const data = new District()
data.code = param.code
data.name = param.name
data.status = param.status
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'District ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/district"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
req.body.id = req.params['id'];
const param: District = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(District);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'District ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(District);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['District']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'District ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: District = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(District);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,405 +0,0 @@
import { DoctorItem, GenericName, ItemMaster, ItemPrice, ItemTypeDetail, User, SellingPricePercentage, PharmacyInfo, RoomToPharmacy } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DoctorItemModel } from "../model/doctor_item";
import { OrmHelper } from "../helpers/orm";
import CommonHelper from "../helpers/common";
const log: Logger<ILogObj> = new Logger({
name: "[DoctorItemController]",
type: "pretty",
});
export class DoctorItemController {
static async listAll(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['doctor_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['room_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['order_field'] = { in: 'query', required: false, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: false, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
order_field: Joi.string().optional().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").optional().label("Order Direction"),
});
let param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
// filterObj = { ...filterObj};
const repo = OrmHelper.DB.getRepository(ItemMaster);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filterObj && Object.keys(filterObj).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filterObj, "item_master");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny.toLowerCase() }),
col_any_eq: [],
col_any_like: ["item_name", "generic_name"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
const orderField = param.order_field || "id";
const orderDirection = param.order_direction || "asc";
const offset = (param.page - 1) * param.limit;
const pharmacyInfoRow = await OrmHelper.DB
.getRepository(PharmacyInfo)
.createQueryBuilder("pharmacy_info")
.select("pharmacy_info.default_room_id", "default_room_id")
.where("pharmacy_info.deleted_at IS NULL")
.orderBy("pharmacy_info.created_at", "DESC")
.limit(1)
.getRawOne<{ default_room_id: string | null }>();
const defaultRoomId = pharmacyInfoRow?.default_room_id ?? null;
const roomToPharmacyRow = await OrmHelper.DB
.getRepository(RoomToPharmacy)
.createQueryBuilder("room_to_pharmacy")
.select("room_to_pharmacy.pharmacy_room_id", "pharmacy_room_id")
.where("room_to_pharmacy.deleted_at IS NULL")
.andWhere("room_to_pharmacy.room_id = :roomId", { roomId: param.room_id })
.orderBy("room_to_pharmacy.created_at", "DESC")
.limit(1)
.getRawOne<{ pharmacy_room_id: string | null }>();
const pharmacyRoomId = roomToPharmacyRow?.pharmacy_room_id ?? null;
let res_count = repo.createQueryBuilder("item_master")
.leftJoin("item_master.generic_name", "generic_name")
.leftJoin("item_master.type_detail", "item_type_detail")
.leftJoin(ItemPrice, "item_price", "item_price.item_master_id = item_master.id")
.leftJoin(SellingPricePercentage, "selling_price_percentage", "selling_price_percentage.item_master_id = item_master.id")
.leftJoin(
DoctorItem,
"doctor_item",
"doctor_item.item_master_id = item_master.id AND doctor_item.doctor_id = :doctorId",
{ doctorId: param.doctor_id }
);
if (whereAttr.length !== 0) {
res_count = res_count.where(whereAttr.join(" and "), whereVal);
}
let res_list = repo.createQueryBuilder("item_master")
.leftJoin("item_master.generic_name", "generic_name")
.leftJoin("item_master.type_detail", "item_type_detail")
.leftJoin(ItemPrice, "item_price", "item_price.item_master_id = item_master.id")
.leftJoin(SellingPricePercentage, "selling_price_percentage", "selling_price_percentage.item_master_id = item_master.id")
.leftJoin(
DoctorItem,
"doctor_item",
"doctor_item.item_master_id = item_master.id AND doctor_item.doctor_id = :doctorId",
{ doctorId: param.doctor_id }
);
if (whereAttr.length !== 0) {
res_list = res_list.where(whereAttr.join(" and "), whereVal);
}
res_list = res_list
.select([
"item_master.active_ingredient as active_ingredient",
"item_master.id as item_id",
"item_master.item_name as item_name",
"generic_name.generic_name as item_generic_name",
"item_type_detail.type_detail_name as item_type",
(pharmacyRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :pharmacyRoomId AND rs."itemmasterId" = item_master.id AND rs.deleted_at IS NULL), '0') as pharmacy_stock`
: "'0' as pharmacy_stock"),
(defaultRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :defaultRoomId AND rs."itemmasterId" = item_master.id AND rs.deleted_at IS NULL), '0') as storage_stock`
: "'0' as storage_stock"),
"ROUND(CASE WHEN selling_price_percentage.percentage IS NULL " +
"THEN COALESCE(item_price.selling_price, 0) " +
"ELSE COALESCE(item_price.selling_price, 0) + (COALESCE(item_price.selling_price, 0) * COALESCE(selling_price_percentage.percentage, 0) / 100) END, 2) as price",
"doctor_item.id as fav_id",
])
.orderBy("item_master." + orderField, orderDirection)
.offset(offset)
.limit(param.limit)
if (defaultRoomId) {
res_list = res_list.setParameter("defaultRoomId", defaultRoomId);
}
if (pharmacyRoomId) {
res_list = res_list.setParameter("pharmacyRoomId", pharmacyRoomId);
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getRawMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async listFav(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['doctor_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['room_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['order_field'] = { in: 'query', required: false, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: false, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
order_field: Joi.string().optional().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").optional().label("Order Direction"),
});
let param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
// filterObj = { ...filterObj};
const repo = OrmHelper.DB.getRepository(ItemMaster);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filterObj && Object.keys(filterObj).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter, "item_master");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny.toLowerCase() }),
col_any_eq: [],
col_any_like: ["item_name", "generic_name"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
const orderField = param.order_field || "id";
const orderDirection = param.order_direction || "asc";
const offset = (param.page - 1) * param.limit;
const pharmacyInfoRow = await OrmHelper.DB
.getRepository(PharmacyInfo)
.createQueryBuilder("pharmacy_info")
.select("pharmacy_info.default_room_id", "default_room_id")
.where("pharmacy_info.deleted_at IS NULL")
.orderBy("pharmacy_info.created_at", "DESC")
.limit(1)
.getRawOne<{ default_room_id: string | null }>();
const defaultRoomId = pharmacyInfoRow?.default_room_id ?? null;
const roomToPharmacyRow = await OrmHelper.DB
.getRepository(RoomToPharmacy)
.createQueryBuilder("room_to_pharmacy")
.select("room_to_pharmacy.pharmacy_room_id", "pharmacy_room_id")
.where("room_to_pharmacy.deleted_at IS NULL")
.andWhere("room_to_pharmacy.room_id = :roomId", { roomId: param.room_id })
.orderBy("room_to_pharmacy.created_at", "DESC")
.limit(1)
.getRawOne<{ pharmacy_room_id: string | null }>();
const pharmacyRoomId = roomToPharmacyRow?.pharmacy_room_id ?? null;
let res_count = repo.createQueryBuilder("item_master")
.innerJoin(
DoctorItem,
"doctor_item",
"doctor_item.item_master_id = item_master.id AND doctor_item.doctor_id = :doctorId",
{ doctorId: param.doctor_id }
)
.leftJoin("item_master.generic_name", "generic_name")
.leftJoin("item_master.type_detail", "item_type_detail")
.leftJoin(ItemPrice, "item_price", "item_price.item_master_id = item_master.id")
.leftJoin(SellingPricePercentage, "selling_price_percentage", "selling_price_percentage.item_master_id = item_master.id");
if (whereAttr.length !== 0) {
res_count = res_count.where(whereAttr.join(" and "), whereVal);
}
let res_list = repo.createQueryBuilder("item_master")
.innerJoin(
DoctorItem,
"doctor_item",
"doctor_item.item_master_id = item_master.id AND doctor_item.doctor_id = :doctorId",
{ doctorId: param.doctor_id }
)
.leftJoin("item_master.generic_name", "generic_name")
.leftJoin("item_master.type_detail", "item_type_detail")
.leftJoin(ItemPrice, "item_price", "item_price.item_master_id = item_master.id")
.leftJoin(SellingPricePercentage, "selling_price_percentage", "selling_price_percentage.item_master_id = item_master.id");
if (whereAttr.length !== 0) {
res_list = res_list.where(whereAttr.join(" and "), whereVal);
}
res_list = res_list
.select([
"item_master.id as item_id",
"item_master.item_name as item_name",
"generic_name.generic_name as item_generic_name",
"item_type_detail.type_detail_name as item_type",
(pharmacyRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :pharmacyRoomId AND rs."itemmasterId" = item_master.id AND rs.deleted_at IS NULL), '0') as pharmacy_stock`
: "'0' as pharmacy_stock"),
(defaultRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :defaultRoomId AND rs."itemmasterId" = item_master.id AND rs.deleted_at IS NULL), '0') as storage_stock`
: "'0' as storage_stock"),
"ROUND(CASE WHEN selling_price_percentage.percentage IS NULL " +
"THEN COALESCE(item_price.selling_price, 0) " +
"ELSE COALESCE(item_price.selling_price, 0) + (COALESCE(item_price.selling_price, 0) * COALESCE(selling_price_percentage.percentage, 0) / 100) END, 2) as price",
"doctor_item.id as fav_id",
])
.orderBy("item_master." + orderField, orderDirection)
.offset(offset)
.limit(param.limit);
if (defaultRoomId) {
res_list = res_list.setParameter("defaultRoomId", defaultRoomId);
}
if (pharmacyRoomId) {
res_list = res_list.setParameter("pharmacyRoomId", pharmacyRoomId);
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getRawMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async selectFav(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/doctorItem" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
item_master_id: Joi.string().uuid().required().label("Item Master ID"),
});
let param: any = await schema.validateAsync(req.body);
const doctor = await OrmHelper.DB.getRepository(User).findOne({ where: { id: param.doctor_id } });
if (!doctor) throw { message: "Doctor (User) " + Language.lang.failed_not_found };
const itemMaster = await OrmHelper.DB.getRepository(ItemMaster).findOne({ where: { id: param.item_master_id } });
if (!itemMaster) throw { message: "Item Master " + Language.lang.failed_not_found };
const exist = await DoctorItemModel.list({ doctor_id: param.doctor_id, item_master_id: param.item_master_id }).then((q) => q.getOne());
if (exist) throw { message: "Doctor Item " + Language.lang.failed_duplicate };
let doctorItem = new DoctorItem();
doctorItem.doctor = doctor;
doctorItem.item_master = itemMaster;
doctorItem.created_by = req.auth.data.name;
doctorItem.updated_by = req.auth.data.name;
await queryRunner.manager.save(doctorItem);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, doctorItem);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
} finally {
await queryRunner.release();
}
}
static async removeFav(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Doctor Item']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['fav_id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
fav_id: Joi.string().uuid().required().label("Favorite ID"),
});
const param: { fav_id: string } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(DoctorItem);
const affected = (await repo.delete({ id: param.fav_id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,345 +0,0 @@
import { DoctorItemPackage, ItemMaster, ItemPrice, SellingPricePercentage, User, PharmacyInfo, RoomToPharmacy } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DoctorItemPackageModel } from "../model/doctor_item_package";
import { OrmHelper } from "../helpers/orm";
import CommonHelper from "../helpers/common";
const log: Logger<ILogObj> = new Logger({
name: "[DoctorItemPackageController]",
type: "pretty",
});
export class DoctorItemPackageController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['doctor_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['room_id'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['order_field'] = { in: 'query', required: false, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: false, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
order_field: Joi.string().optional().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").optional().label("Order Direction"),
});
let param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj, "DoctorItemPackage.doctor": param.doctor_id };
const query = await DoctorItemPackageModel.list(filterObj, filterAny);
const orderField = param.order_field || "id";
const orderDirection = param.order_direction || "asc";
const offset = (param.page - 1) * param.limit;
const pharmacyInfoRow = await OrmHelper.DB
.getRepository(PharmacyInfo)
.createQueryBuilder("pharmacy_info")
.select("pharmacy_info.default_room_id", "default_room_id")
.where("pharmacy_info.deleted_at IS NULL")
.orderBy("pharmacy_info.created_at", "DESC")
.limit(1)
.getRawOne<{ default_room_id: string | null }>();
const defaultRoomId = pharmacyInfoRow?.default_room_id ?? null;
const roomToPharmacyRow = await OrmHelper.DB
.getRepository(RoomToPharmacy)
.createQueryBuilder("room_to_pharmacy")
.select("room_to_pharmacy.pharmacy_room_id", "pharmacy_room_id")
.where("room_to_pharmacy.deleted_at IS NULL")
.andWhere("room_to_pharmacy.room_id = :roomId", { roomId: param.room_id })
.orderBy("room_to_pharmacy.created_at", "DESC")
.limit(1)
.getRawOne<{ pharmacy_room_id: string | null }>();
const pharmacyRoomId = roomToPharmacyRow?.pharmacy_room_id ?? null;
const current_page = param.page;
const total_count_data = await query.getCount();
// Query 1: packages only (pagination is correct)
const packages = await query
.select([
"DoctorItemPackage.id",
"DoctorItemPackage.name",
"DoctorItemPackage.description",
"DoctorItemPackage.active",
])
.orderBy("DoctorItemPackage." + orderField, orderDirection)
.offset(offset)
.limit(param.limit)
.getMany();
if (!packages || packages.length === 0) {
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, 0, current_page, total_count_data, []);
}
const packageIds = packages.map((p: any) => p.id);
// Query 2: all items for these packages (build items[] per package)
let itemsQuery = OrmHelper.DB.getRepository(DoctorItemPackage)
.createQueryBuilder("DoctorItemPackage")
.select([
"DoctorItemPackage.id as package_id",
"ItemMaster.id as item_id",
"ItemMaster.item_name as item_name",
"GenericName.generic_name as item_generic_name",
"item_type.type_detail_name as item_type",
(pharmacyRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :pharmacyRoomId AND rs."itemmasterId" = ItemMaster.id AND rs.deleted_at IS NULL), '0') as pharmacy_stock`
: "'0' as pharmacy_stock"),
(defaultRoomId
? `COALESCE((SELECT SUM(rs.total_stock)::text FROM pharmacy_logistic.room_stock rs WHERE rs."roomId" = :defaultRoomId AND rs."itemmasterId" = ItemMaster.id AND rs.deleted_at IS NULL), '0') as storage_stock`
: "'0' as storage_stock"),
"ROUND(CASE WHEN selling_price_percentage.percentage IS NULL " +
"THEN COALESCE(item_price.selling_price, 0) " +
"ELSE COALESCE(item_price.selling_price, 0) + (COALESCE(item_price.selling_price, 0) * COALESCE(selling_price_percentage.percentage, 0) / 100) END, 2) as price",
])
.leftJoin("DoctorItemPackage.items", "ItemMaster")
.leftJoin("ItemMaster.generic_name", "GenericName")
.leftJoin("ItemMaster.type_detail", "item_type")
.leftJoin(ItemPrice, "item_price", "item_price.item_master_id = ItemMaster.id")
.leftJoin(SellingPricePercentage, "selling_price_percentage", "selling_price_percentage.item_master_id = ItemMaster.id")
.where("DoctorItemPackage.id IN (:...ids)", { ids: packageIds });
if (defaultRoomId) {
itemsQuery = itemsQuery.setParameter("defaultRoomId", defaultRoomId);
}
if (pharmacyRoomId) {
itemsQuery = itemsQuery.setParameter("pharmacyRoomId", pharmacyRoomId);
}
const itemsRaw = await itemsQuery.getRawMany();
const itemsByPackageId = new Map<string, any[]>();
for (const row of itemsRaw) {
const pkgId = row["package_id"];
if (!pkgId || !row["item_id"]) continue;
if (!itemsByPackageId.has(pkgId)) itemsByPackageId.set(pkgId, []);
itemsByPackageId.get(pkgId)!.push({
item_id: row["item_id"],
item_name: row["item_name"],
item_generic_name: row["item_generic_name"],
item_type: row["item_type"],
pharmacy_stock: row["pharmacy_stock"],
storage_stock: row["storage_stock"],
price: row["price"],
});
}
const list_data = packages.map((p: any) => ({
id: p.id,
name: p.name,
description: p.description ?? null,
active: p.active,
items: itemsByPackageId.get(p.id) ?? [],
}));
const count_data = list_data.length;
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/doctorItemPackage" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
name: Joi.string().required().max(256).label("Name"),
description: Joi.string().allow("", null).optional().label("Description"),
item_master_ids: Joi.array().items(Joi.string().uuid()).optional().label("Item Master IDs"),
active: Joi.bool().optional().label("Active"),
});
let param: any = await schema.validateAsync(req.body);
const doctor = await OrmHelper.DB.getRepository(User).findOne({ where: { id: param.doctor_id } });
if (!doctor) throw { message: "Doctor (User) " + Language.lang.failed_not_found };
// const exist = await DoctorItemPackageModel.list({ "Doctor.id": param.doctor_id, "DoctorItemPackage.name": param.name }).then((q) => q.getOne());
// if (exist) throw { message: "Doctor Item Package " + Language.lang.failed_duplicate };
let items: ItemMaster[] = [];
if (param.item_master_ids && param.item_master_ids.length > 0) {
for (const itemMasterId of param.item_master_ids) {
const itemMaster = await OrmHelper.DB.getRepository(ItemMaster).findOne({ where: { id: itemMasterId } });
if (!itemMaster) throw { message: "Item Master " + Language.lang.failed_not_found };
items.push(itemMaster);
}
}
let doctorItemPackage = new DoctorItemPackage();
doctorItemPackage.doctor = doctor;
doctorItemPackage.name = param.name;
doctorItemPackage.description = param.description || null;
doctorItemPackage.items = items;
doctorItemPackage.active = typeof param.active === "boolean" ? param.active : true;
doctorItemPackage.created_by = req.auth.data.name;
doctorItemPackage.updated_by = req.auth.data.name;
await queryRunner.manager.save(doctorItemPackage);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, doctorItemPackage);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Doctor Item Package Id"),
});
let param: any = await schema.validateAsync(req.params);
let doctorItemPackage = await DoctorItemPackageModel.list({ "DoctorItemPackage.id": param.id }).then((q) => q.getOne());
if (!doctorItemPackage) throw { message: "Doctor Item Package " + Language.lang.failed_not_found };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, doctorItemPackage);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Item Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/doctorItemPackage" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Doctor Item Package ID"),
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
name: Joi.string().required().max(256).label("Name"),
description: Joi.string().allow("", null).optional().label("Description"),
item_master_ids: Joi.array().items(Joi.string().uuid()).optional().label("Item Master IDs"),
active: Joi.bool().optional().label("Active"),
});
let param: any = await schema.validateAsync(req.body);
const doctor = await OrmHelper.DB.getRepository(User).findOne({ where: { id: param.doctor_id } });
if (!doctor) throw { message: "Doctor (User) " + Language.lang.failed_not_found };
let doctorItemPackage = await DoctorItemPackageModel.list({ "DoctorItemPackage.id": param.id }).then((q) => q.getOne());
if (!doctorItemPackage) throw { message: "Doctor Item Package " + Language.lang.failed_not_found };
const exist = await DoctorItemPackageModel.list({ "Doctor.id": param.doctor_id, "DoctorItemPackage.name": param.name }).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Doctor Item Package " + Language.lang.failed_duplicate };
let items: ItemMaster[] = [];
if (param.item_master_ids && param.item_master_ids.length > 0) {
for (const itemMasterId of param.item_master_ids) {
const itemMaster = await OrmHelper.DB.getRepository(ItemMaster).findOne({ where: { id: itemMasterId } });
if (!itemMaster) throw { message: "Item Master " + Language.lang.failed_not_found };
items.push(itemMaster);
}
}
doctorItemPackage.doctor = doctor;
doctorItemPackage.name = param.name;
doctorItemPackage.description = param.description || null;
doctorItemPackage.items = items;
if (typeof param.active === "boolean") {
doctorItemPackage.active = param.active;
}
doctorItemPackage.updated_by = req.auth.data.name;
await queryRunner.manager.save(doctorItemPackage);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, doctorItemPackage);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_update, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Doctor Item Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: { id: string } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(DoctorItemPackage);
const affected = (await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,279 +0,0 @@
import { DoctorSchedule, Room, User, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { DoctorScheduleModel } from "../model/doctor_schedule";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[DoctorScheduleController]",
type: "pretty",
});
export class DoctorScheduleController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await DoctorScheduleModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("DoctorSchedule." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/doctorSchedule" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
day: Joi.string().max(32).required().label("Day"),
start_time: Joi.string().max(16).required().label("Start Time"),
end_time: Joi.string().max(16).required().label("End Time"),
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
quota: Joi.string().max(32).allow("", null).optional().label("Quota"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let room = await OrmHelper.DB.getRepository(Room).findOne({ where: { id: param.room_id } });
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
let doctor = await OrmHelper.DB.getRepository(User).findOne({ where: { id: param.doctor_id } });
if (!doctor) throw { message: "Doctor (User) " + Language.lang.failed_not_found };
let doctorSchedule = new DoctorSchedule();
doctorSchedule.day = param.day;
doctorSchedule.start_time = param.start_time;
doctorSchedule.end_time = param.end_time;
doctorSchedule.doctor = doctor;
doctorSchedule.room = room;
doctorSchedule.quota = param.quota || null;
doctorSchedule.status = param.status;
doctorSchedule.created_by = req.auth.data.name;
doctorSchedule.updated_by = req.auth.data.name;
await queryRunner.manager.save(doctorSchedule);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, doctorSchedule);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Doctor Schedule Id"),
});
let param: any = await schema.validateAsync(req.params);
let doctorSchedule = await DoctorScheduleModel.list({ "DoctorSchedule.id": param.id }).then((q) => q.getOne());
if (!doctorSchedule) throw { message: "Doctor Schedule Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, doctorSchedule);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/doctorSchedule" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Doctor Schedule ID"),
day: Joi.string().max(32).required().label("Day"),
start_time: Joi.string().max(16).required().label("Start Time"),
end_time: Joi.string().max(16).required().label("End Time"),
doctor_id: Joi.string().uuid().required().label("Doctor ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
quota: Joi.string().max(32).allow("", null).optional().label("Quota"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let room = await OrmHelper.DB.getRepository(Room).findOne({ where: { id: param.room_id } });
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
let doctor = await OrmHelper.DB.getRepository(User).findOne({ where: { id: param.doctor_id } });
if (!doctor) throw { message: "Doctor (User) " + Language.lang.failed_not_found };
let doctorSchedule = await DoctorScheduleModel.list({ "DoctorSchedule.id": param.id }).then((q) => q.getOne());
if (!doctorSchedule) throw { message: "Doctor Schedule " + Language.lang.failed_not_found };
doctorSchedule.day = param.day;
doctorSchedule.start_time = param.start_time;
doctorSchedule.end_time = param.end_time;
doctorSchedule.doctor = doctor;
doctorSchedule.room = room;
doctorSchedule.quota = param.quota || null;
doctorSchedule.status = param.status;
doctorSchedule.updated_by = req.auth.data.name;
await queryRunner.manager.save(doctorSchedule);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, doctorSchedule);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let doctorSchedule: DoctorSchedule = await DoctorScheduleModel.list({ "DoctorSchedule.id": param.id }).then((q) => q.getOne());
if (!doctorSchedule) throw { message: "Doctor Schedule " + Language.lang.failed_not_found };
doctorSchedule.deleted_by = req.auth.data.name;
doctorSchedule.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(doctorSchedule);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(DoctorSchedule);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Doctor Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(DoctorSchedule);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,301 +0,0 @@
import { ExaminationDetail, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ExaminationDetailModel } from "../model/examination_detail";
import { MeasurementUnitModel } from "../model/measurement_unit";
import { ReferenceRangeModel } from "../model/reference_range";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ExaminationDetailController]",
type: "pretty",
});
export class ExaminationDetailController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (name, order_no, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ExaminationDetailModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query.clone();
const res_ids = query
.clone()
.select("ExaminationDetail.id", "id")
.orderBy("ExaminationDetail." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_ids.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const ids = (await res_ids.getRawMany()).map((r: any) => r.id).filter(Boolean);
let list_data: any[] = [];
if (ids.length > 0) {
const res_list = OrmHelper.DB.getRepository(ExaminationDetail)
.createQueryBuilder("ExaminationDetail")
.leftJoinAndSelect("ExaminationDetail.measurement_unit", "measurementUnit")
.leftJoinAndSelect("ExaminationDetail.reference_range", "referenceRange")
.where("ExaminationDetail.id IN (:...ids)", { ids })
.orderBy("ExaminationDetail." + param.order_field, param.order_direction);
if (param.with_deleted) {
res_list.withDeleted();
}
list_data = await res_list.getMany();
}
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/examinationDetail" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
order_no: Joi.string().max(256).required().label("Order No."),
measurement_unit_id: Joi.string().uuid().required().label("Measurement Unit ID"),
reference_range_ids: Joi.array().items(Joi.string().uuid()).min(1).required().label("Reference Range IDs"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let measurementUnit = await MeasurementUnitModel.list({ "MeasurementUnit.id": param.measurement_unit_id }).then((q) => q.getOne());
if (!measurementUnit) throw { message: "Measurement Unit not found" };
const referenceRanges = await Promise.all(
param.reference_range_ids.map(async (id: string) => {
const rr = await ReferenceRangeModel.list({ "ReferenceRange.id": id }).then((q) => q.getOne());
if (!rr) throw { message: `Reference Range ${id} not found` };
return rr;
})
);
let examinationDetail = new ExaminationDetail();
examinationDetail.name = param.name;
examinationDetail.order_no = param.order_no;
examinationDetail.measurement_unit = measurementUnit;
examinationDetail.reference_range = referenceRanges;
examinationDetail.status = param.status;
examinationDetail.created_by = req.auth?.data.name;
examinationDetail.updated_by = req.auth?.data.name;
await queryRunner.manager.save(examinationDetail);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, examinationDetail);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Examination Detail Id"),
});
let param: any = await schema.validateAsync(req.params);
let examinationDetail = await ExaminationDetailModel.list({ "ExaminationDetail.id": param.id }).then((q) => q.leftJoinAndSelect("ExaminationDetail.measurement_unit", "measurementUnit").leftJoinAndSelect("ExaminationDetail.reference_range", "referenceRange").getOne());
if (!examinationDetail) throw { message: "Examination Detail Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, examinationDetail);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/examinationDetail" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Examination Detail ID"),
name: Joi.string().max(256).required().label("Name"),
order_no: Joi.string().max(256).required().label("Order No."),
measurement_unit_id: Joi.string().uuid().required().label("Measurement Unit ID"),
reference_range_ids: Joi.array().items(Joi.string().uuid()).min(1).required().label("Reference Range IDs"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let examinationDetail = await ExaminationDetailModel.list({ "ExaminationDetail.id": param.id }).then((q) => q.getOne());
if (!examinationDetail) throw { message: "Examination Detail " + Language.lang.failed_not_found };
let measurementUnit = await MeasurementUnitModel.list({ "MeasurementUnit.id": param.measurement_unit_id }).then((q) => q.getOne());
if (!measurementUnit) throw { message: "Measurement Unit not found" };
const referenceRanges = await Promise.all(
param.reference_range_ids.map(async (id: string) => {
const rr = await ReferenceRangeModel.list({ "ReferenceRange.id": id }).then((q) => q.getOne());
if (!rr) throw { message: `Reference Range ${id} not found` };
return rr;
})
);
examinationDetail.name = param.name;
examinationDetail.order_no = param.order_no;
examinationDetail.measurement_unit = measurementUnit;
examinationDetail.reference_range = referenceRanges;
examinationDetail.status = param.status;
examinationDetail.updated_by = req.auth?.data.name;
await queryRunner.manager.save(examinationDetail);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, examinationDetail);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let examinationDetail: ExaminationDetail = await ExaminationDetailModel.list({ "ExaminationDetail.id": param.id }).then((q) => q.getOne());
if (!examinationDetail) throw { message: "Examination Detail " + Language.lang.failed_not_found };
examinationDetail.deleted_by = req.auth?.data.name;
examinationDetail.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(examinationDetail);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ExaminationDetail);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Examination Detail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ExaminationDetail);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,276 +0,0 @@
import { ExaminationType, Paging, Service } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ExaminationTypeModel } from "../model/examination_type";
import { ServiceModel } from "../model/service";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
import { In } from "typeorm";
const log: Logger<ILogObj> = new Logger({
name: "[ExaminationTypeController]",
type: "pretty",
});
export class ExaminationTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (name, status, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ExaminationTypeModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndSelect("ExaminationType.services", "services")
.orderBy("ExaminationType." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit)
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/examinationType" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
status: Joi.string().required().label("Status"),
service_ids: Joi.array().items(Joi.string().uuid()).optional().label("Service IDs"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ExaminationTypeModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Examination Type " + Language.lang.failed_duplicate };
let services: Service[] = [];
if (param.service_ids && param.service_ids.length > 0) {
services = await queryRunner.manager.getRepository(Service).find({ where: { id: In(param.service_ids) } });
if (services.length != param.service_ids.length) throw { message: "Service not found" };
}
let examinationType = new ExaminationType();
examinationType.name = param.name;
examinationType.status = param.status;
examinationType.services = services;
examinationType.created_by = req.auth.data.name;
examinationType.updated_by = req.auth.data.name;
await queryRunner.manager.save(examinationType);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, examinationType);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Examination Type Id"),
});
let param: any = await schema.validateAsync(req.params);
let examinationType = await ExaminationTypeModel.list({ "ExaminationType.id": param.id })
.then((q) => q.leftJoinAndSelect("ExaminationType.services", "services").getOne());
if (!examinationType) throw { message: "Examination Type Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, examinationType);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/examinationType" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Examination Type ID"),
name: Joi.string().max(256).required().label("Name"),
status: Joi.string().required().label("Status"),
service_ids: Joi.array().items(Joi.string().uuid()).optional().label("Service IDs"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ExaminationTypeModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Examination Type " + Language.lang.failed_duplicate };
let examinationType = await ExaminationTypeModel.list({ "ExaminationType.id": param.id })
.then((q) => q.leftJoinAndSelect("ExaminationType.services", "services").getOne());
if (!examinationType) throw { message: "Examination Type " + Language.lang.failed_not_found };
let services: Service[] = [];
if (param.service_ids && param.service_ids.length > 0) {
services = await queryRunner.manager.getRepository(Service).find({ where: { id: In(param.service_ids) } });
if (services.length != param.service_ids.length) throw { message: "Service not found" };
}
examinationType.name = param.name;
examinationType.status = param.status;
examinationType.services = services;
examinationType.updated_by = req.auth.data.name;
await queryRunner.manager.save(examinationType);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, examinationType);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let examinationType: ExaminationType = await ExaminationTypeModel.list({ "ExaminationType.id": param.id }).then((q) => q.getOne());
if (!examinationType) throw { message: "Examination Type " + Language.lang.failed_not_found };
examinationType.deleted_by = req.auth.data.name;
examinationType.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(examinationType);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ExaminationType);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Examination Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ExaminationType);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,395 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { FareType } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[FareTypeController]', type: 'pretty' });
export class FareTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: '',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(FareType);
const offset = (param.page - 1) * param.limit
const filterObj = param.filter ? JSON.parse(param.filter) : {};
const filterAny = filterObj.any && filterObj.any !== "" ? String(filterObj.any) : "";
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.any;
delete filterWithoutFK.munisipo_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
// const { whereAttr, whereVal } = CommonHelper.handleFilter({
// filter: filterStrWithoutFK,
// col_any_eq: ['code'],
// col_any_like: ['name']
// });
const res_count = repo.createQueryBuilder("FareType")
// .leftJoin("Administrativu.munisipo", "munisipo")
// .where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
// if (filterObj.munisipo_id) {
// res_count.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
if (filterAny !== "") {
res_count.andWhere("FareType.name ILIKE :any", {
any: filterAny.includes("%") ? filterAny : `%${filterAny}%`
});
}
const res_list = repo.createQueryBuilder("FareType")
// .leftJoin("Administrativu.munisipo", "munisipo")
// .where(whereAttr || "1=1", whereVal)
.orderBy("FareType." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
// Handle foreign key filter with relation
// if (filterObj.munisipo_id) {
// res_list.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
if (filterAny !== "") {
res_list.andWhere("FareType.name ILIKE :any", {
any: filterAny.includes("%") ? filterAny : `%${filterAny}%`
});
}
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
*/
try {
const repo = OrmHelper.DB.getRepository(FareType);
const res_count = repo.createQueryBuilder("FareType")
// .leftJoin("Administrativu.munisipo", "munisipo")
// .where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
// if (filterObj.munisipo_id) {
// res_count.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
const res_list = repo.createQueryBuilder("FareType").orderBy("FareType.name", "ASC");
// Handle foreign key filter with relation
// if (filterObj.munisipo_id) {
// res_list.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/faretype"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
name: Joi.string().required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new FareType()
data.name = param.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Fare Type ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(FareType);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, { name: data.name });
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Fare Type ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/faretype"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
name: Joi.string().required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(FareType);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.name = param.name
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Fare Type ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(FareType);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Fare Type']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Fare Type ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: FareType = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(FareType);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,226 +0,0 @@
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import { UploadedFile } from "express-fileupload";
import fs from "fs"; // Import fs module to check if directory exists
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../../helpers/common";
import { ReturnHelper } from "../../helpers/express/return";
import { Language } from "../../langs/lang";
import config from "config";
import Thirdparty from "../../helpers/thirdparty";
import JwtHelper from "../../helpers/jwt";
const log: Logger<ILogObj> = new Logger({
name: "[FileController]",
type: "pretty",
});
export class FileController {
static async upload(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['File']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"multipart/form-data": {
schema: {
type: "object",
properties: {
file: {
type: "string",
format: "binary"
}
}
}
}
}
}
}
*/
try {
const uploadedFile: UploadedFile | any = req.files.file;
const schema = Joi.object({
file: Joi.object({
name: Joi.string().label("File Name"),
mimetype: Joi.string()
.valid(
"image/jpeg",
"image/png",
"image/webp",
"application/pdf",
"application/vnd.ms-excel", // ✅ .xls
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // ✅ .xlsx
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"text/csv", // csv
)
.optional()
.label("File Type"),
size: Joi.number()
.max(10 * 1024 * 1024)
.optional()
.label("File Size"),
})
.optional()
.label("File"),
});
const fileData = {
name: uploadedFile.name,
mimetype: uploadedFile.mimetype,
size: uploadedFile.size,
};
let body = await schema.validateAsync({ file: fileData });
const field = {
file: uploadedFile,
application: "saude",
};
let url = config.get("service.file") + "upload";
let result = await Thirdparty.UploadFile(url, field, JwtHelper.token(req.auth.data));
console.log("result :", result);
let data = { file: result.data.file };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['File']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
type: "object",
properties: {
file: {
type: "string",
description: "File name returned from upload"
}
},
required: ["file"]
}
}
}
}
}
*/
try {
const schema = Joi.object({
file: Joi.string().required().label("File"),
});
const param = await schema.validateAsync(req.body);
if (param.file.includes("..") || param.file.includes("/") || param.file.includes("\\")) {
return ReturnHelper.errorResponse(res, 400, 400, Language.lang.failed_delete, "Invalid file name");
}
const field = {
file: param.file,
application: "saude",
};
let url = config.get("service.file") + "delete";
await Thirdparty.DeleteFile(url, field, JwtHelper.token(req.auth.data));
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_delete, err.message);
}
}
static async download(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['File']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['name'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['token'] = {
in: 'query',
required: true,
type: 'string'
}
*/
try {
// 1⃣ Validasi parameter
const schema = Joi.object({
name: Joi.string().required().label("File Name"),
token: Joi.string().required().label("Token"),
});
const param = await schema.validateAsync(req.query);
// 2⃣ Ambil file dari service-file via SFTP (bukan static URL /file/ yang diarahkan ke frontend)
const url = config.get("service.file") + "download";
const buffer = await Thirdparty.DownloadFile(url, { file: param.name, application: "saude" }, param.token);
// 3⃣ Deteksi ekstensi & MIME type
const fileName = param.name;
const ext = fileName.split(".").pop()?.toLowerCase();
const mimeMap: Record<string, string> = {
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
xls: "application/vnd.ms-excel",
csv: "text/csv",
pdf: "application/pdf",
jpg: "image/jpeg",
jpeg: "image/jpeg",
png: "image/png",
webp: "image/webp",
gif: "image/gif",
doc: "application/msword",
docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
zip: "application/zip",
txt: "text/plain",
};
const contentType = mimeMap[ext ?? ""] ?? "application/octet-stream";
// 4⃣ Set header tipe file
res.setHeader("Content-Type", contentType);
res.setHeader("Content-Length", buffer.length);
// 5⃣ Tentukan apakah file perlu auto download
const isInline = contentType.startsWith("image/") || contentType === "application/pdf";
// 🟢 Kalau image/pdf → tampil di browser
// 🔵 Kalau file lain → download otomatis
if (isInline) {
res.setHeader("Content-Disposition", `inline; filename="${encodeURIComponent(fileName)}"`);
} else {
res.setHeader("Content-Disposition", `attachment; filename="${encodeURIComponent(fileName)}"`);
}
// 6⃣ Kirim file ke browser
return res.end(buffer);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,557 +0,0 @@
import { Diagnosis, FosterCareHistory, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Brackets } from "typeorm";
import { validate as validateUuid } from "uuid";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { FosterCareHistoryModel } from "../model/fostercarehistory";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[FosterCareHistoryController]",
type: "pretty",
});
export class FosterCareHistoryController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter: JSON object; FosterCareHistory.code and FosterCareHistory.diagnosis are combined with OR; other fields use AND.',
in: 'query',
type: 'string',
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const codeKey = "FosterCareHistory.code";
const diagnosisKey = "FosterCareHistory.diagnosis";
const orCode = filter[codeKey];
const orDiagnosis = filter[diagnosisKey];
const restFilter = { ...filter };
delete restFilter[codeKey];
delete restFilter[diagnosisKey];
var query = await FosterCareHistoryModel.list(restFilter);
if (orCode !== undefined || orDiagnosis !== undefined) {
query.andWhere(
new Brackets((qb) => {
let isFirst = true;
const addOr = (column: string, paramKey: string, raw: any) => {
const op = isFirst ? "where" : "orWhere";
isFirst = false;
if (Array.isArray(raw)) {
(qb as any)[op](`${column} IN (:...${paramKey})`, { [paramKey]: raw });
return;
}
const f = String(raw);
if (validateUuid(f)) {
(qb as any)[op](`${column} = :${paramKey}`, { [paramKey]: f });
return;
}
if (f === "null") {
(qb as any)[op](`${column} IS NULL`);
return;
}
if (f.includes("%")) {
(qb as any)[op](`${column} ILIKE :${paramKey}`, { [paramKey]: f });
return;
}
(qb as any)[op](`${column} = :${paramKey}`, { [paramKey]: f });
};
if (orCode !== undefined) addOr("FosterCareHistory.code", "diag_or_code", orCode);
if (orDiagnosis !== undefined) addOr("FosterCareHistory.diagnosis", "diag_or_diagnosis", orDiagnosis);
}),
);
}
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("FosterCareHistory." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/fostercarehistory"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
diagnosis: Joi.string().max(256).required().label("Diagnosis"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
category: Joi.string().max(128).allow(null, "").label("Category"),
subcategory: Joi.string().max(128).allow(null, "").label("Subcategory"),
definition: Joi.string().max(128).allow(null, "").label("Definition"),
objective: Joi.string().max(128).allow(null, "").label("Objective"),
result_criteria: Joi.array().items(
Joi.object({
group: Joi.number().allow(null),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Result Criteria"),
causes: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Causes"),
related_clinical_condition: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Related Clinical Condition"),
subjective_major: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Subjective Major"),
objectitve_major: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Objective Major"),
subjective_minor: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Subjective Minor"),
objective_minor: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Objective Minor"),
observation: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Observation"),
therapeutic: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Therapeutic"),
education: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Education"),
colaboration: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Colaboration"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await FosterCareHistoryModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Diagnosis " + Language.lang.failed_duplicate };
let fostercarehistory = new FosterCareHistory();
fostercarehistory.diagnosis = param.diagnosis;
fostercarehistory.code = param.code;
fostercarehistory.status = param.status;
fostercarehistory.category = param.category;
fostercarehistory.subcategory = param.subcategory;
fostercarehistory.definition = param.definition;
fostercarehistory.objective = param.objective;
fostercarehistory.result_criteria = param.result_criteria ?? [];
fostercarehistory.causes = param.causes ?? [];
fostercarehistory.related_clinical_condition = param.related_clinical_condition ?? [];
fostercarehistory.subjective_major = param.subjective_major ?? [];
fostercarehistory.objectitve_major = param.objectitve_major ?? [];
fostercarehistory.subjective_minor = param.subjective_minor ?? [];
fostercarehistory.objective_minor = param.objective_minor ?? [];
fostercarehistory.observation = param.observation ?? [];
fostercarehistory.therapeutic = param.therapeutic ?? [];
fostercarehistory.education = param.education ?? [];
fostercarehistory.colaboration = param.colaboration ?? [];
fostercarehistory.created_by = req.auth?.data.name;
fostercarehistory.updated_by = req.auth?.data.name;
await queryRunner.manager.save(fostercarehistory);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, fostercarehistory);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Foster Care History Id"),
});
let param: any = await schema.validateAsync(req.params);
let fostercarehistory = await FosterCareHistoryModel.list({
"FosterCareHistory.id": param.id,
}).then((q) => q.getOne());
if (!fostercarehistory) throw { message: "Foster Care History Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, fostercarehistory);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/fostercarehistory"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Diagnosis ID"),
diagnosis: Joi.string().max(256).required().label("Diagnosis"),
code: Joi.string().max(128).required().label("Code"),
status: Joi.string().required().label("Status"),
category: Joi.string().max(128).allow(null, "").label("Category"),
subcategory: Joi.string().max(128).allow(null, "").label("Subcategory"),
definition: Joi.string().max(128).allow(null, "").label("Definition"),
objective: Joi.string().max(128).allow(null, "").label("Objective"),
result_criteria: Joi.array().items(
Joi.object({
group: Joi.number().allow(null),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Result Criteria"),
causes: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Causes"),
related_clinical_condition: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Related Clinical Condition"),
subjective_major: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Subjective Major"),
objectitve_major: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Objective Major"),
subjective_minor: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Subjective Minor"),
objective_minor: Joi.array().items(
Joi.object({
group: Joi.string().allow(null, ""),
name: Joi.string().allow(null, ""),
})
).allow(null).label("Objective Minor"),
observation: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Observation"),
therapeutic: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Therapeutic"),
education: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Education"),
colaboration: Joi.array().items(
Joi.object({
name: Joi.string().allow(null, ""),
})
).allow(null).label("Colaboration"),
});
let param: any = await schema.validateAsync(req.body);
let filter = {
code: param.code,
};
let exist = await FosterCareHistoryModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Foster Care History " + Language.lang.failed_duplicate };
let fostercarehistory = await FosterCareHistoryModel.list({
"FosterCareHistory.id": param.id,
}).then((q) => q.getOne());
if (!fostercarehistory) throw { message: "FosterCareHistory " + Language.lang.failed_not_found };
fostercarehistory.diagnosis = param.diagnosis;
fostercarehistory.code = param.code;
fostercarehistory.status = param.status;
fostercarehistory.category = param.category;
fostercarehistory.subcategory = param.subcategory;
fostercarehistory.definition = param.definition;
fostercarehistory.objective = param.objective;
fostercarehistory.result_criteria = param.result_criteria ?? fostercarehistory.result_criteria;
fostercarehistory.causes = param.causes ?? fostercarehistory.causes;
fostercarehistory.related_clinical_condition = param.related_clinical_condition ?? fostercarehistory.related_clinical_condition;
fostercarehistory.subjective_major = param.subjective_major ?? fostercarehistory.subjective_major;
fostercarehistory.objectitve_major = param.objectitve_major ?? fostercarehistory.objectitve_major;
fostercarehistory.subjective_minor = param.subjective_minor ?? fostercarehistory.subjective_minor;
fostercarehistory.objective_minor = param.objective_minor ?? fostercarehistory.objective_minor;
fostercarehistory.observation = param.observation ?? fostercarehistory.observation;
fostercarehistory.therapeutic = param.therapeutic ?? fostercarehistory.therapeutic;
fostercarehistory.education = param.education ?? fostercarehistory.education;
fostercarehistory.colaboration = param.colaboration ?? fostercarehistory.colaboration;
fostercarehistory.updated_by = req.auth?.data.name;
await queryRunner.manager.save(fostercarehistory);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, fostercarehistory);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Foster Care History ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let fostercarehistory: FosterCareHistory = await FosterCareHistoryModel.list({
"FosterCareHistory.id": param.id,
}).then((q) => q.getOne());
if (!fostercarehistory) throw { message: "Foster Care History " + Language.lang.failed_not_found };
fostercarehistory.deleted_by = req.auth?.data.name;
fostercarehistory.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(fostercarehistory);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(FosterCareHistory);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Foster Care History']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Foster Care History ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(FosterCareHistory);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,309 +0,0 @@
import { HospitalInformation } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
import dayjs from 'dayjs';
import fileUpload from "express-fileupload";
import { v4 as uuidv4 } from 'uuid';
import fs from "fs";
import path from "path";
import config from '../../config/stag.json';
const log: Logger<ILogObj> = new Logger({
name: "[HospitalInformationController]",
type: "pretty",
});
const hospitalCreateUpdateSchema = {
name: Joi.string().required().label("Hospital Name"),
address: Joi.string().required().label("Hospital Address"),
phone: Joi.string().required().label("Hospital Phone"),
logo: Joi.string().allow(null, "").label("Hospital Logo"),
// province: Joi.string().allow("").optional().label("Province Code"),
// city: Joi.string().allow("").optional().label("City Code"),
// subdistrict: Joi.string().allow("").optional().label("Subdistrict Code"),
// ward: Joi.string().allow("").optional().label("Ward Code"),
munisipo: Joi.string().allow(null, "").label("Munisipo ID"),
administrativu: Joi.string().allow(null, "").label("Administrativu ID"),
aldeia: Joi.string().allow(null, "").label("Aldeia ID"),
suco: Joi.string().allow(null, "").label("Suco ID"),
};
interface FileUploadRequest extends Request {
files?: fileUpload.FileArray | null;
body: any;
}
export class HospitalInformationController {
static async view(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Hospital Information']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const hospital = await OrmHelper.DB.getRepository(HospitalInformation)
.createQueryBuilder("HospitalInformation")
.leftJoinAndSelect("HospitalInformation.munisipo", "munisipo")
.leftJoinAndSelect("HospitalInformation.administrativu", "administrativu")
.leftJoinAndSelect("HospitalInformation.aldeia", "aldeia")
.leftJoinAndSelect("HospitalInformation.suco", "suco")
// .leftJoinAndSelect("HospitalInformation.province", "province")
// .leftJoinAndSelect("HospitalInformation.city", "city")
// .leftJoinAndSelect("HospitalInformation.subdistrict", "subdistrict")
// .leftJoinAndSelect("HospitalInformation.ward", "ward")
.getOne();
if (!hospital) return ReturnHelper.errorResponse(res, 404, 404, Language.lang.failed_view, "Hospital not found");
let hospitallogo = '';
if (hospital.logo != null && hospital.logo != undefined && hospital.logo != '') {
hospitallogo = `${config.server.host_swagger}uploads/hospital-logo/${hospital.logo}`;
}
const result = {
id: hospital.id,
name: hospital.name,
address: hospital.address,
phone: hospital.phone,
logo: hospitallogo,
file: hospital.logo,
munisipo: hospital.munisipo,
administrativu: hospital.administrativu,
aldeia: hospital.aldeia,
suco: hospital.suco
};
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Hospital Information']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/hospitalinformation" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({ ...hospitalCreateUpdateSchema });
let param: any = await schema.validateAsync(req.body);
const existing = await OrmHelper.DB.getRepository(HospitalInformation).findOne({ where: {} });
let hospitalinformation: HospitalInformation;
if (existing) {
// ── UPDATE ─────────────────────────────────────────────
hospitalinformation = existing;
hospitalinformation.name = param.name;
hospitalinformation.address = param.address;
hospitalinformation.phone = param.phone;
hospitalinformation.logo = param.logo || existing.logo; // ✅ pertahankan logo lama kalau kosong
// hospitalinformation.province = param.province;
// hospitalinformation.city = param.city;
// hospitalinformation.subdistrict = param.subdistrict;
// hospitalinformation.ward = param.ward;
hospitalinformation.suco = param.suco;
hospitalinformation.administrativu = param.administrativu;
hospitalinformation.aldeia = param.aldeia;
hospitalinformation.munisipo = param.munisipo;
hospitalinformation.updated_at = dayjs().toDate();
hospitalinformation.updated_by = req.auth?.data.name;
} else {
// ── INSERT ─────────────────────────────────────────────
hospitalinformation = new HospitalInformation();
hospitalinformation.name = param.name;
hospitalinformation.address = param.address;
hospitalinformation.phone = param.phone;
hospitalinformation.logo = param.logo;
// hospitalinformation.province = param.province;
// hospitalinformation.city = param.city;
// hospitalinformation.subdistrict = param.subdistrict;
// hospitalinformation.ward = param.ward;
hospitalinformation.suco = param.suco;
hospitalinformation.administrativu = param.administrativu;
hospitalinformation.aldeia = param.aldeia;
hospitalinformation.munisipo = param.munisipo;
hospitalinformation.created_at = dayjs().toDate();
hospitalinformation.updated_at = dayjs().toDate();
hospitalinformation.created_by = req.auth?.data.name;
hospitalinformation.updated_by = req.auth?.data.name;
}
await queryRunner.manager.save(hospitalinformation);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, hospitalinformation);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async uploadlogo(req: FileUploadRequest, res: Response, next: NextFunction): Promise<Response> {
/* #swagger.tags = ['Hospital Information']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.consumes = ['multipart/form-data']
#swagger.requestBody = {
required: true,
content: {
"multipart/form-data": {
schema: {
type: "object",
properties: {
file: {
type: "string",
format: "binary",
description: "Image file (max 1MB, jpg/png/webp)"
},
},
required: ["file"]
}
}
}
}
*/
try {
// Validation schema
// const schema = Joi.object().keys({
// path: Joi.string().label('File Path'),
// application: Joi.string().label('Application'),
// });
log.info("body", req.body);
// const param: { path: string, application: string } = await schema.validateAsync(req.body);
// Check if file exists
if (!req.files || !req.files.file) {
return ReturnHelper.errorResponse(res, 400, 404, Language.lang.failed_insert, "File not found");
}
const file = req.files.file as fileUpload.UploadedFile;
// Validate file size (max 1MB)
const maxSize = 10 * 1024 * 1024; // 10MB
if (file.size > maxSize) {
return ReturnHelper.errorResponse(
res,
400,
400,
Language.lang.failed_insert,
"File size exceeds 10MB limit"
);
}
// Validate file type
const allowedMimes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'];
if (!allowedMimes.includes(file.mimetype)) {
return ReturnHelper.errorResponse(res, 400, 400, Language.lang.failed_insert, "Invalid file type. Only JPG, PNG, and WEBP are allowed");
}
// Normalize path
// param.path = param.path[param.path.length - 1] !== '/' ? param.path + '/' : param.path;
// if (param.path == undefined || param.path == null) param.path = 'uploads/hospital-logo/';
// Generate unique filename
const ext = file.name.split('.');
const name = uuidv4() + '.' + ext[ext.length - 1];
const result: { file: string } = {
// url: "",
// path: "",
file: "",
// mime: file.mimetype,
// size: file.size,
// md5: file.md5
};
const folder_path = 'uploads/hospital-logo/';
const file_path = path.join(folder_path, name);
// Create directory if it doesn't exist
if (!fs.existsSync(folder_path)) {
fs.mkdirSync(folder_path, { recursive: true });
}
// Move file to destination
await file.mv(file_path);
// result.path = param.path[param.path.length - 1] === '/' ? param.path.substring(0, param.path.length - 1) : param.path;
result.file = name;
// result.url = `${result.path}/${name}`; // Generate URL
log.info(`File uploaded successfully: ${file_path}`);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, result);
} catch (e: unknown) {
// Proper error logging to avoid tslog serialization issues
if (e instanceof Error) {
log.error("File upload failed:", {
message: e.message,
stack: e.stack,
name: e.name
});
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, e.message);
} else {
log.error("File upload failed with unknown error:", String(e));
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, "Unknown error occurred");
}
}
}
static async deletelogo(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Hospital Information']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/files" } } } }
*/
try {
const schema = Joi.object().keys({
file_name: Joi.string().required().label('File Name'),
});
const param: { file_name: string } = await schema.validateAsync(req.body);
// const env = process.env.NODE_ENV + '/'
const fixedPath = 'uploads/hospital-logo/';
const file_path = fixedPath + param.file_name;
// Check if file exists
if (!fs.existsSync(file_path)) {
return ReturnHelper.errorResponse(res, 404, 404, Language.lang.failed_not_found, "File not found");
}
// Delete file
fs.unlinkSync(file_path);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,371 +0,0 @@
import { Paging, InpatientRoom, Room, InpatientRoomBed, InpatientRoomBedStatus } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import { Language } from "../langs/lang";
import { InpatientRoomModel } from "../model/inpatient_room";
import { RoomModel } from "../model/room";
const log: Logger<ILogObj> = new Logger({
name: "[InpatientRoomController]",
type: "pretty",
});
export class InpatientRoomController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Inpatient Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
descriptionk:'',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const offset = (param.page - 1) * param.limit;
const filter = JSON.parse(param.filter);
const query = await InpatientRoomModel.list(filter);
const limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndSelect("InpatientRoom.room", "room")
.leftJoinAndSelect("room.serviceclass", "service_class")
.orderBy("InpatientRoom." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Inpatient Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/inpatient_room"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
room_id: Joi.string().uuid().required().label("Room ID"),
name: Joi.string().required().label("Name"),
number_of_bed: Joi.number().required().min(0).label("Number of Bed"),
});
const param = await schema.validateAsync(req.body);
let room: Room = await RoomModel.list({ id: param.room_id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
const data = new InpatientRoom();
data.room = room;
data.name = param.name;
data.number_of_bed = param.number_of_bed;
data.created_by = req.auth?.data.name;
await queryRunner.manager.save(data);
for (let i = 1; i <= param.number_of_bed; i++) {
const bed = new InpatientRoomBed();
bed.inpatient_room = data;
bed.number = i;
bed.status = InpatientRoomBedStatus.Empty;
bed.created_by = req.auth?.data.name;
await queryRunner.manager.save(bed);
}
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Inpatient Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Inpatient Room ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().required().label("ID"),
});
let param: any = await schema.validateAsync(req.params);
let data = await InpatientRoomModel.list({ "InpatientRoom.id": param.id }).then((q) =>
q //
.leftJoinAndSelect("InpatientRoom.room", "room")
.getOne(),
);
if (!data) throw { message: "Inpatient Room " + Language.lang.failed_not_found };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Inpatient Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/inpatient_room"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().required().label("Inpatient Room ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
name: Joi.string().required().label("Name"),
number_of_bed: Joi.number().required().min(0).label("Number of Bed"),
});
let param: any = await schema.validateAsync(req.body);
let inpatientRoom: InpatientRoom = await InpatientRoomModel.list({ id: param.id }).then((q) => q.getOne());
if (!inpatientRoom) throw { message: "Inpatient Room " + Language.lang.failed_not_found };
let room: Room = await RoomModel.list({ id: param.room_id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
const newNumberOfBed: number = param.number_of_bed;
const authName = req.auth?.data?.name;
const existingBeds = await queryRunner.manager
.getRepository(InpatientRoomBed)
.createQueryBuilder("bed")
.leftJoinAndSelect("bed.boarding_room", "boarding_room")
.leftJoin("bed.inpatient_room", "inpatient_room")
.where("inpatient_room.id = :roomId", { roomId: param.id })
.andWhere("bed.deleted_at IS NULL")
.orderBy("bed.number", "DESC")
.getMany();
const occupiedCount = existingBeds.filter((bed) => bed.boarding_room != null).length;
if (occupiedCount > newNumberOfBed) {
throw { message: "Update gagal, masih ada bed yang sedang digunakan" };
}
if (existingBeds.length > newNumberOfBed) {
let remainingToDelete = existingBeds.length - newNumberOfBed;
for (const bed of existingBeds) {
if (remainingToDelete <= 0) break;
if (bed.boarding_room != null) continue;
await queryRunner.manager.update(InpatientRoomBed, { id: bed.id }, { deleted_by: authName });
await queryRunner.manager.softDelete(InpatientRoomBed, { id: bed.id });
remainingToDelete--;
}
if (remainingToDelete > 0) {
throw { message: "Update gagal, masih ada bed yang sedang digunakan" };
}
}
const activeBeds = await queryRunner.manager
.getRepository(InpatientRoomBed)
.createQueryBuilder("bed")
.leftJoin("bed.inpatient_room", "inpatient_room")
.where("inpatient_room.id = :roomId", { roomId: param.id })
.andWhere("bed.deleted_at IS NULL")
.getMany();
if (activeBeds.length < newNumberOfBed) {
const usedNumbers = activeBeds.map((bed) => bed.number);
let added = 0;
const toAdd = newNumberOfBed - activeBeds.length;
for (let i = 1; i <= newNumberOfBed && added < toAdd; i++) {
if (usedNumbers.includes(i)) continue;
const bed = new InpatientRoomBed();
bed.inpatient_room = inpatientRoom;
bed.number = i;
bed.status = InpatientRoomBedStatus.Empty;
bed.created_by = authName;
await queryRunner.manager.save(bed);
added++;
}
}
inpatientRoom.room = room;
inpatientRoom.name = param.name;
inpatientRoom.number_of_bed = newNumberOfBed;
inpatientRoom.updated_by = authName;
await queryRunner.manager.save(inpatientRoom);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, inpatientRoom);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Inpatient Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Inpatient Room ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(InpatientRoom);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,88 +0,0 @@
import { Room, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { OrmHelper } from "../helpers/orm";
const log: Logger<ILogObj> = new Logger({
name: "[LaboratoryController]",
type: "pretty",
});
const LABORATORY_DEPARTMENT_ID = "7ebc5d8a-63f0-40f6-962b-59953ebd4ba0";
export class LaboratoryController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Laboratory']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (status, code, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
// Build query with department join
const repo = OrmHelper.DB.getRepository(Room);
let whereAttr: string[] = [];
let whereVal: any = {};
// Always filter by laboratory department ID
whereAttr.push("department.id = :_departmentId");
whereVal["_departmentId"] = LABORATORY_DEPARTMENT_ID;
// Apply additional filters if provided
if (filter && Object.keys(filter).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter, "Room");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
const offset = (param.page - 1) * param.limit;
const res_count = repo.createQueryBuilder("Room")
.leftJoin("Room.department", "department")
.where(whereAttr.join(" and "), whereVal);
const res_list = repo.createQueryBuilder("Room")
.leftJoinAndSelect("Room.department", "department")
.where(whereAttr.join(" and "), whereVal)
.orderBy("Room." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
}

View File

@ -1,267 +0,0 @@
import { DiseaseCategory, MainDisease, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { MainDiseaseModel } from "../model/main_disease";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[MainDiseaseController]",
type: "pretty",
});
const diseaseCategoryValues = Object.values(DiseaseCategory);
export class MainDiseaseController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await MainDiseaseModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("MainDisease." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/main_disease" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(128).required().label("Name"),
status: Joi.string().required().label("Status"),
category: Joi.string()
.valid(...diseaseCategoryValues)
.required()
.label("Category"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await MainDiseaseModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Main Disease " + Language.lang.failed_duplicate };
let entity = new MainDisease();
entity.name = param.name;
entity.status = param.status;
entity.category = param.category;
entity.created_by = req.auth.data.name;
entity.updated_by = req.auth.data.name;
await queryRunner.manager.save(entity);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, entity);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Main Disease Id"),
});
let param: any = await schema.validateAsync(req.params);
let entity = await MainDiseaseModel.list({ "MainDisease.id": param.id }).then((q) => q.getOne());
if (!entity) throw { message: "Main Disease Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, entity);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/main_disease" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Main Disease ID"),
name: Joi.string().max(128).required().label("Name"),
status: Joi.string().required().label("Status"),
category: Joi.string()
.valid(...diseaseCategoryValues)
.required()
.label("Category"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await MainDiseaseModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Main Disease " + Language.lang.failed_duplicate };
let entity = await MainDiseaseModel.list({ "MainDisease.id": param.id }).then((q) => q.getOne());
if (!entity) throw { message: "Main Disease " + Language.lang.failed_not_found };
entity.name = param.name;
entity.status = param.status;
entity.category = param.category;
entity.updated_by = req.auth.data.name;
await queryRunner.manager.save(entity);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, entity);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let entity: MainDisease = await MainDiseaseModel.list({ "MainDisease.id": param.id }).then((q) => q.getOne());
if (!entity) throw { message: "Main Disease " + Language.lang.failed_not_found };
entity.deleted_by = req.auth.data.name;
entity.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(entity);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(MainDisease);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Main Disease']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(MainDisease);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,255 +0,0 @@
import { MeasurementUnit, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { MeasurementUnitModel } from "../model/measurement_unit";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[MeasurementUnitController]",
type: "pretty",
});
export class MeasurementUnitController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (status, unit, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await MeasurementUnitModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("MeasurementUnit." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/measurementUnit" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
unit: Joi.string().max(256).required().label("Unit"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { unit: param.unit };
let exist = await MeasurementUnitModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Measurement Unit " + Language.lang.failed_duplicate };
let measurementUnit = new MeasurementUnit();
measurementUnit.unit = param.unit;
measurementUnit.status = param.status;
measurementUnit.created_by = req.auth.data.name;
measurementUnit.updated_by = req.auth.data.name;
await queryRunner.manager.save(measurementUnit);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, measurementUnit);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Measurement Unit Id"),
});
let param: any = await schema.validateAsync(req.params);
let measurementUnit = await MeasurementUnitModel.list({ "MeasurementUnit.id": param.id }).then((q) => q.getOne());
if (!measurementUnit) throw { message: "Measurement Unit Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, measurementUnit);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/measurementUnit" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Measurement Unit ID"),
unit: Joi.string().max(256).required().label("Unit"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { unit: param.unit };
let exist = await MeasurementUnitModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Measurement Unit " + Language.lang.failed_duplicate };
let measurementUnit = await MeasurementUnitModel.list({ "MeasurementUnit.id": param.id }).then((q) => q.getOne());
if (!measurementUnit) throw { message: "Measurement Unit " + Language.lang.failed_not_found };
measurementUnit.unit = param.unit;
measurementUnit.status = param.status;
measurementUnit.updated_by = req.auth.data.name;
await queryRunner.manager.save(measurementUnit);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, measurementUnit);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let measurementUnit: MeasurementUnit = await MeasurementUnitModel.list({ "MeasurementUnit.id": param.id }).then((q) => q.getOne());
if (!measurementUnit) throw { message: "Measurement Unit " + Language.lang.failed_not_found };
measurementUnit.deleted_by = req.auth.data.name;
measurementUnit.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(measurementUnit);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(MeasurementUnit);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Measurement Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(MeasurementUnit);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,267 +0,0 @@
import { MedicalForm, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { MedicalFormModel } from "../model/medical_form";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[MedicalFormController]",
type: "pretty",
});
export class MedicalFormController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await MedicalFormModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("MedicalForm." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/medical_form" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
title: Joi.string().max(256).required().label("Title"),
name: Joi.string().max(256).required().label("Name"),
description: Joi.string().max(512).required().label("Description"),
picture: Joi.string().max(512).allow("").optional().label("Picture"),
status: Joi.string().max(64).required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await MedicalFormModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Medical Form " + Language.lang.failed_duplicate };
let medicalForm = new MedicalForm();
medicalForm.title = param.title;
medicalForm.name = param.name;
medicalForm.description = param.description;
medicalForm.picture = param.picture || null;
medicalForm.status = param.status;
medicalForm.created_by = req.auth.data.name;
medicalForm.updated_by = req.auth.data.name;
await queryRunner.manager.save(medicalForm);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, medicalForm);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Medical Form Id"),
});
let param: any = await schema.validateAsync(req.params);
let medicalForm = await MedicalFormModel.list({ "MedicalForm.id": param.id }).then((q) => q.getOne());
if (!medicalForm) throw { message: "Medical Form Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, medicalForm);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/medical_form" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Medical Form ID"),
title: Joi.string().max(256).required().label("Title"),
name: Joi.string().max(256).required().label("Name"),
description: Joi.string().max(512).required().label("Description"),
picture: Joi.string().max(512).allow("").optional().label("Picture"),
status: Joi.string().max(64).required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await MedicalFormModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Medical Form " + Language.lang.failed_duplicate };
let medicalForm = await MedicalFormModel.list({ "MedicalForm.id": param.id }).then((q) => q.getOne());
if (!medicalForm) throw { message: "Medical Form " + Language.lang.failed_not_found };
medicalForm.title = param.title;
medicalForm.name = param.name;
medicalForm.description = param.description;
medicalForm.picture = param.picture || null;
medicalForm.status = param.status;
medicalForm.updated_by = req.auth.data.name;
await queryRunner.manager.save(medicalForm);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, medicalForm);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let medicalForm: MedicalForm = await MedicalFormModel.list({ "MedicalForm.id": param.id }).then((q) => q.getOne());
if (!medicalForm) throw { message: "Medical Form " + Language.lang.failed_not_found };
medicalForm.deleted_by = req.auth.data.name;
medicalForm.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(medicalForm);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(MedicalForm);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Medical Form']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(MedicalForm);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,465 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Menu } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[MenuController]', type: 'pretty' });
export class MenuController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Menu);
const offset = (param.page - 1) * param.limit
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: [],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder()
.where(whereAttr, whereVal);
const res_list = repo.createQueryBuilder()
.where(whereAttr, whereVal)
.andWhere('id_parent is null')
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const res_list_all = await repo.createQueryBuilder().andWhere('id_parent is not null').getMany();
let list_data_final = await res_list.getMany();
let list_child: any = {};
for (let p of res_list_all) {
if (!list_child[p.id_parent]) {
list_child[p.id_parent] = [];
}
list_child[p.id_parent].push(p);
}
for (let f of list_data_final) {
if (list_child[f.id]) {
f.children = list_child[f.id];
for (let g of f.children) {
if (list_child[g.id]) {
g.children = list_child[g.id];
for (let h of g.children) {
if (list_child[h.id]) {
h.children = list_child[h.id];
for (let i of h.children) {
if (list_child[i.id]) {
i.children = list_child[i.id];
for (let j of i.children) {
if (list_child[j.id]) {
j.children = list_child[j.id];
for (let k of j.children) {
if (list_child[k.id]) {
k.children = list_child[k.id];
}
}
}
}
}
}
}
}
}
}
}
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = list_data_final;
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Menu);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: [],
col_any_like: ['name']
});
const filename = "menu.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Menu): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
const data = await repo.createQueryBuilder()
.where(whereAttr, whereVal)
.select([
'id',
'code',
'name',
'status',
'created_at'])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/menu"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
module: Joi.string().max(128).required().label('Module'),
name: Joi.string().max(128).required().label('Name'),
link: Joi.string().max(256).required().label('Link'),
id_parent: Joi.string().uuid().optional().allow('').label('ID Parent'),
order_number: Joi.number().min(1).required().label('Order'),
icon: Joi.string().max(128).optional().allow('').label('Icon'),
application: Joi.string().max(32).required().label('Application'),
status: Joi.string().required().label('Status'),
});
const param: Menu = await schema.validateAsync(req.body);
const data = new Menu()
data.module = param.module
data.name = param.name
data.link = param.link
data.order_number = param.order_number
data.icon = param.icon
data.application = param.application
data.status = param.status
if (param.id_parent) {
data.id_parent = param.id_parent
}
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Menu ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/menu"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
module: Joi.string().max(128).required().label('Module'),
name: Joi.string().max(128).required().label('Name'),
link: Joi.string().max(256).required().label('Link'),
id_parent: Joi.string().uuid().optional().allow('').label('ID Parent'),
order_number: Joi.number().min(1).required().label('Order'),
icon: Joi.string().max(128).optional().allow('').label('Icon'),
application: Joi.string().max(32).required().label('Application'),
status: Joi.string().required().label('Status'),
});
req.body.id = req.params['id'];
const param: Menu = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Menu);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.module = param.module
data.name = param.name
data.link = param.link
data.order_number = param.order_number
data.icon = param.icon
data.application = param.application
data.status = param.status
if (param.id_parent) {
data.id_parent = param.id_parent
}
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Menu ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Menu);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Menu']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Menu ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Menu = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Menu);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,391 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Munisipo } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[MunisipoController]', type: 'pretty' });
export class MunisipoController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Munisipo);
const offset = (param.page - 1) * param.limit
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder()
.where(whereAttr, whereVal);
const res_list = repo.createQueryBuilder()
.where(whereAttr, whereVal)
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Munisipo);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const filename = "munisipo.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Munisipo): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
const data = await repo.createQueryBuilder()
.where(whereAttr, whereVal)
.select([
'id',
'code',
'name',
'status',
'created_at'])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/munisipo"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
const param: Munisipo = await schema.validateAsync(req.body);
const data = new Munisipo()
data.code = param.code
data.name = param.name
data.status = param.status
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Munisipo ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/munisipo"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
req.body.id = req.params['id'];
const param: Munisipo = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Munisipo);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Munisipo ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Munisipo);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Munisipo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Munisipo ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Munisipo = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Munisipo);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,392 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Nationality } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[NationalityController]', type: 'pretty' });
export class NationalityController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Nationality);
const offset = (param.page - 1) * param.limit
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder()
.where(whereAttr, whereVal);
const res_list = repo.createQueryBuilder()
.where(whereAttr, whereVal)
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Nationality);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: param.filter,
col_any_eq: ['code'],
col_any_like: ['name']
});
const filename = "nationality.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Nationality): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
const data = await repo.createQueryBuilder()
.where(whereAttr, whereVal)
.select([
'id',
'code',
'name',
'status',
'created_at'])
.orderBy(param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/nationality"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
const param: Nationality = await schema.validateAsync(req.body);
const data = new Nationality()
data.code = param.code
data.name = param.name
data.status = param.status
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Nationality ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/nationality"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
});
req.body.id = req.params['id'];
const param: Nationality = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Nationality);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Nationality ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Nationality);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Nationality']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Nationality ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Nationality = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Nationality);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,363 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { PatientGroup, Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { PatientGroupModel } from "../model/patient_group";
const log: Logger<ILogObj> = new Logger({ name: '[PatientGroupController]', type: 'pretty' });
export class PatientGroupController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PatientGroupModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("patient_group." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PatientGroupModel.list(filter);
const data = await query.getMany();
const filename = "patient_group.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: PatientGroup): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/patient_group"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
patient_group_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new PatientGroup()
data.patient_group_name = param.patient_group_name
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PatientGroup ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/patient_group"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
patient_group_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(PatientGroup);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.patient_group_name = param.patient_group_name
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Patient Group ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PatientGroup);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PatientGroup ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: PatientGroup = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PatientGroup);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGroup']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Patient Group Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await PatientGroupModel.list({ "id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "Patient Group Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,438 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { PatientGuarantor, Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { PatientGuarantorModel } from "../model/patient_guarantor";
const log: Logger<ILogObj> = new Logger({ name: '[PatientGuarantorController]', type: 'pretty' });
export class PatientGuarantorController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj };
var query = await PatientGuarantorModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("patient_guarantor." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PatientGuarantorModel.list(filter);
const data = await query.getMany();
const filename = "patient_guarantor.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: PatientGuarantor): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/patient_guarantor"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
guarantor_name: Joi.string().max(256).required().label('Guarantor Name'),
phone: Joi.string().max(15).required().label('Phone'),
// province: Joi.string().max(128).required().label('Province'),
// city: Joi.string().max(128).required().label('City'),
munisipo: Joi.string().allow(null, "").label("Munisipo ID"),
administrativu: Joi.string().allow(null, "").label("Administrativu ID"),
aldeia: Joi.string().allow(null, "").label("Aldeia ID"),
suco: Joi.string().allow(null, "").label("Suco ID"),
// zip_code: Joi.string().max(10).required().label('Zip Code'),
agreement_no: Joi.string().max(50).required().label('Agreement No.'),
agreement_desc: Joi.string().max(512).optional().label('Agreement Description'),
patient_group_id: Joi.string().guid({ version: 'uuidv4' }).required().label('Patient Group'),
faretype: Joi.string().guid({ version: 'uuidv4' }).required().label('Fare Type'),
maximalliability: Joi.number().optional().label('Maximal Liability'),
is_default: Joi.bool().optional().default(false).label('Is Default'),
is_full_paid: Joi.bool().optional().default(false).label('Is Full Paid'),
});
const param: any = await schema.validateAsync(req.body);
if (param.is_default === true) {
await OrmHelper.DB.getRepository(PatientGuarantor)
.update({ is_default: true }, { is_default: false, updated_by: req.auth?.data.name });
}
const data = new PatientGuarantor()
data.guarantor_name = param.guarantor_name;
data.phone = param.phone;
// data.province = param.province;
// data.city = param.city;
data.administrativu = param.administrativu;
data.suco = param.suco;
data.aldeia = param.aldeia;
data.munisipo = param.munisipo;
// data.zip_code = param.zip_code;
data.agreement_no = param.agreement_no;
data.agreement_desc = param.agreement_desc;
data.patient_group = param.patient_group_id;
data.faretype = param.faretype;
data.is_default = param.is_default;
data.is_full_paid = param.is_full_paid;
data.maximal_liability = param.maximalliability;
data.created_by = req.auth?.data.name;
data.updated_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PatientGuarantor ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/patient_guarantor"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
guarantor_name: Joi.string().max(256).required().label('Guarantor Name'),
phone: Joi.string().max(15).required().label('Phone'),
// province: Joi.string().max(128).required().label('Province'),
// city: Joi.string().max(128).required().label('City'),
munisipo: Joi.string().allow(null, "").label("Munisipo ID"),
administrativu: Joi.string().allow(null, "").label("Administrativu ID"),
aldeia: Joi.string().allow(null, "").label("Aldeia ID"),
suco: Joi.string().allow(null, "").label("Suco ID"),
// zip_code: Joi.string().max(10).required().label('Zip Code'),
agreement_no: Joi.string().max(50).required().label('Agreement No.'),
agreement_desc: Joi.string().max(512).optional().label('Agreement Description'),
patient_group_id: Joi.string().guid({ version: 'uuidv4' }).required().label('Patient Group'),
faretype: Joi.string().guid({ version: 'uuidv4' }).required().label('Fare Type'),
maximalliability: Joi.number().optional().label('Maximal Liability'),
is_default: Joi.bool().optional().default(false).label('Is Default'),
is_full_paid: Joi.bool().optional().default(false).label('Is Full Paid'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(PatientGuarantor);
const data = await repo.findOneBy({ id: param.id });
if (!data) return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
if (param.is_default === true) {
await OrmHelper.DB.getRepository(PatientGuarantor)
.update({ is_default: true }, { is_default: false, updated_by: req.auth?.data.name });
}
data.guarantor_name = param.guarantor_name;
data.phone = param.phone;
// data.province = param.province;
// data.city = param.city;
data.administrativu = param.administrativu;
data.suco = param.suco;
data.aldeia = param.aldeia;
data.munisipo = param.munisipo;
// data.zip_code = param.zip_code;
data.agreement_no = param.agreement_no;
data.agreement_desc = param.agreement_desc;
data.patient_group = param.patient_group_id;
data.faretype = param.faretype;
data.maximal_liability = param.maximalliability;
data.is_default = param.is_default;
data.is_full_paid = param.is_full_paid;
data.created_by = req.auth?.data.name;
data.updated_by = req.auth?.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Group ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PatientGuarantor);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PatientGuarantor ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: PatientGuarantor = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PatientGuarantor);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PatientGuarantor']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Patient Guarantor Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await PatientGuarantorModel.list({ "patient_guarantor.id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "Patient Guarantor Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,369 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging, PaymentMethod } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { PaymentMethodModel } from "../model/payment_method";
const log: Logger<ILogObj> = new Logger({ name: '[PaymentMethodController]', type: 'pretty' });
export class PaymentMethodController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj };
var query = await PaymentMethodModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("payment_method." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PaymentMethodModel.list(filter);
const data = await query.getMany();
const filename = "payment_method.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: PaymentMethod): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/payment_method"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new PaymentMethod()
data.name = param.name;
data.created_by = req.auth.data.name;
data.updated_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PaymentMethod ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/payment_method"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(PaymentMethod);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.name = param.name;
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PaymentMethod ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PaymentMethod);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PaymentMethod ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PaymentMethod);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['PaymentMethod']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("PaymentMethod Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await PaymentMethodModel.list({ "id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "PaymentMethod Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,88 +0,0 @@
import { Room, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { OrmHelper } from "../helpers/orm";
const log: Logger<ILogObj> = new Logger({
name: "[PharmacyController]",
type: "pretty",
});
const PHARMACY_DEPARTMENT_ID = "81b710d9-6fe3-4dd0-9900-fae31ecadb6f";
export class PharmacyController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (status, code, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
// Build query with department join
const repo = OrmHelper.DB.getRepository(Room);
let whereAttr: string[] = [];
let whereVal: any = {};
// Always filter by pharmacy department ID
whereAttr.push("department.id = :_departmentId");
whereVal["_departmentId"] = PHARMACY_DEPARTMENT_ID;
// Apply additional filters if provided
if (filter && Object.keys(filter).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter, "Room");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
const offset = (param.page - 1) * param.limit;
const res_count = repo.createQueryBuilder("Room")
.leftJoin("Room.department", "department")
.where(whereAttr.join(" and "), whereVal);
const res_list = repo.createQueryBuilder("Room")
.leftJoinAndSelect("Room.department", "department")
.where(whereAttr.join(" and "), whereVal)
.orderBy("Room." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
}

View File

@ -1,355 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { Factory, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { FactoryModel } from "../../model/factory";
const log: Logger<ILogObj> = new Logger({ name: '[FactoryController]', type: 'pretty' });
export class FactoryController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await FactoryModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("factory." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await FactoryModel.list(filter);
const data = await query.getMany();
const filename = "factory.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Factory): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/factory"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
factory_name: Joi.string().max(256).required().label('Name'),
address: Joi.string().max(512).allow('', null).label('Address'),
web: Joi.string().uri().max(256).allow('', null).label('Web'),
phone: Joi.string().max(50).allow('', null).label('Phone'),
email: Joi.string().email().max(256).allow('', null).label('Email')
});
const param: any = await schema.validateAsync(req.body);
const data = new Factory()
data.factory_name = param.factory_name
data.address = param.address
data.web = param.web
data.phone = param.phone
data.email = param.email
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Factory ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/factory"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
factory_name: Joi.string().max(256).required().label('Name'),
address: Joi.string().max(512).allow('', null).label('Address'),
web: Joi.string().uri().max(256).allow('', null).label('Web'),
phone: Joi.string().max(50).allow('', null).label('Phone'),
email: Joi.string().email().max(256).allow('', null).label('Email')
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Factory);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.factory_name = param.factory_name
data.address = param.address
data.web = param.web
data.phone = param.phone
data.email = param.email
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Factory ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Factory);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Factory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Factory ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Factory = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Factory);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,409 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { Factory, FactoryToSupplier, Paging, Supplier } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { FactoryToSupplierModel } from "../../model/factory_to_supplier";
const log: Logger<ILogObj> = new Logger({ name: '[FactorytoSupplierController]', type: 'pretty' });
export class FactorytoSupplierController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await FactoryToSupplierModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("factory_to_supplier." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await FactoryToSupplierModel.list(filter);
const data = await query.getMany();
const filename = "factory_to_supplier.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: FactoryToSupplier): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/factory_to_supplier"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
supplier_id: Joi.string()
.uuid()
.required()
.label("Supplier ID"),
factory_ids: Joi.array()
.items(Joi.string().uuid().required())
.min(1)
.required()
.label("Factory IDs")
});
const param: any = await schema.validateAsync(req.body);
const factoryToSupplierRepo = OrmHelper.DB.getRepository(FactoryToSupplier);
const factoryRepo = OrmHelper.DB.getRepository(Factory);
const supplierRepo = OrmHelper.DB.getRepository(Supplier);
await factoryToSupplierRepo
.createQueryBuilder()
.delete()
.from(FactoryToSupplier)
.where("supplier_id = :supplierId", { supplierId: param.supplier_id })
.execute();
let relation : FactoryToSupplier;
for (const factoryId of param.factory_ids) {
relation = new FactoryToSupplier();
relation.factory = await factoryRepo.findOneBy({ id: factoryId });
relation.supplier = await supplierRepo.findOneBy({ id: param.supplier_id });
relation.created_by = req.auth.data.name;
await factoryToSupplierRepo.save(relation);
}
const data = await factoryToSupplierRepo.createQueryBuilder("factory_to_supplier")
.leftJoinAndSelect("factory_to_supplier.factory", "factory")
.leftJoinAndSelect("factory_to_supplier.supplier", "supplier")
.where("factory_to_supplier.supplier_id = :supplierId", { supplierId: param.supplier_id }).getMany();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['supplier_id'] = {
in: 'path',
description: 'Supplier ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/factory_to_supplier"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
supplier_id: Joi.string()
.uuid()
.required()
.label("Supplier ID"),
factory_ids: Joi.array()
.items(Joi.string().uuid().optional())
.required()
.label("Factory IDs")
});
req.body.supplier_id = req.params['supplier_id'];
const param: any = await schema.validateAsync(req.body);
const factoryToSupplierRepo = OrmHelper.DB.getRepository(FactoryToSupplier);
const factoryRepo = OrmHelper.DB.getRepository(Factory);
const supplierRepo = OrmHelper.DB.getRepository(Supplier);
const supplier = await supplierRepo.findOneBy({ id: param.supplier_id });
if(supplier == null) {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
await factoryToSupplierRepo
.createQueryBuilder()
.delete()
.from(FactoryToSupplier)
.where("supplier_id = :supplierId", { supplierId: param.supplier_id })
.execute();
if(param.factory_ids.length > 0) {
let relation : FactoryToSupplier;
for (const factoryId of param.factory_ids) {
relation = new FactoryToSupplier();
relation.factory = await factoryRepo.findOneBy({ id: factoryId });
relation.supplier = await supplierRepo.findOneBy({ id: param.supplier_id });
relation.created_by = req.auth.data.name;
await factoryToSupplierRepo.save(relation);
}
}
const data = await factoryToSupplierRepo.createQueryBuilder("factory_to_supplier")
.leftJoinAndSelect("factory_to_supplier.factory", "factory")
.leftJoinAndSelect("factory_to_supplier.supplier", "supplier")
.where("factory_to_supplier.supplier_id = :supplierId", { supplierId: param.supplier_id }).getMany();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['supplier_id'] = {
in: 'path',
description: 'Supplier ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: true,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
supplier_id: Joi.string().uuid().required().label('Supplier ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, supplier_id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(FactoryToSupplier);
let baseQuery = repo.createQueryBuilder().where("supplier_id = :supplierId", { supplierId: param.supplier_id });
const count = await baseQuery.getCount();
if (count === 0) return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
if (!param.hard) {
let updateQuery = repo.createQueryBuilder().update(FactoryToSupplier)
.set({ deleted_by: req.auth.data.name })
.where("supplier_id = :supplierId", {supplierId: param.supplier_id});
await updateQuery.execute();
let softDeleteQuery = repo.createQueryBuilder().softDelete()
.where("supplier_id = :supplierId", {supplierId: param.supplier_id});
await softDeleteQuery.execute();
} else {
let deleteQuery = repo.createQueryBuilder().delete()
.where("supplier_id = :supplierId", {supplierId: param.supplier_id});
await deleteQuery.execute();
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - FactoryToSupplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['supplier_id'] = {
in: 'path',
description: 'Supplier ID.',
required: false,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
supplier_id: Joi.string().uuid().required().label('Supplier ID'),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(FactoryToSupplier);
let restoreQuery = repo.createQueryBuilder().restore()
.where("supplier_id = :supplierId", {supplierId: param.supplier_id});
const affected = (await restoreQuery.execute()).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { GenericName, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { GenericNameModel } from "../../model/generic_name";
const log: Logger<ILogObj> = new Logger({ name: '[GenericNameController]', type: 'pretty' });
export class GenericNameController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await GenericNameModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("generic_name." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await GenericNameModel.list(filter);
const data = await query.getMany();
const filename = "generic_name.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: GenericName): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/generic_name"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
generic_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new GenericName()
data.generic_name = param.generic_name
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'GenericName ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/generic_name"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
generic_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(GenericName);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.generic_name = param.generic_name
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Generic Name ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(GenericName);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - GenericName']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'GenericName ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: GenericName = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(GenericName);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,151 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { InitialStock, ItemMaster, Room, ItemOrigin, RoomStock, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { InitialStockModel } from "../../model/initial_stock";
const log: Logger<ILogObj> = new Logger({ name: '[InitialStockController]', type: 'pretty' });
export class InitialStockController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - InitialStock']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: any = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await InitialStockModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query.select([
'InitialStock.id',
'InitialStock.exp_date',
'InitialStock.stock',
'InitialStock.batch',
'ItemMaster.item_name',
'Room.room',
'ItemOrigin.origin_name',
])
.leftJoin("InitialStock.itemmaster", "ItemMaster")
.leftJoin("InitialStock.room", "Room")
.leftJoin("InitialStock.itemorigin", "ItemOrigin")
.orderBy("InitialStock." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - InitialStock']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/initial_stock"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
itemmaster: Joi.string().uuid().required().label("Item Master ID"),
room: Joi.string().uuid().required().label("Room ID"),
itemorigin: Joi.string().uuid().required().label("Item Origin ID"),
batch: Joi.string().label("Batch"),
exp_date: Joi.date().required().label("Exp Date"),
stock: Joi.number().required().label("Stock"),
});
const param: any = await schema.validateAsync(req.body);
const itemmaster = OrmHelper.DB.getRepository(ItemMaster).findOneBy({ id: param.itemmaster });
const room = OrmHelper.DB.getRepository(Room).findOneBy({ id: param.room })
const itemorigin = OrmHelper.DB.getRepository(ItemOrigin).findOneBy({ id: param.itemorigin });
if (!itemmaster) throw { message: "Item Master not found" };
if (!room) throw { message: "Room not found" };
if (!itemorigin) throw { message: "Item Origin not found" };
const initial_stock = new InitialStock();
initial_stock.itemmaster = param.itemmaster;
initial_stock.room = param.room;
initial_stock.itemorigin = param.itemorigin;
initial_stock.batch = param.batch;
initial_stock.exp_date = param.exp_date;
initial_stock.stock = param.stock;
await queryRunner.manager.save(initial_stock);
const room_stock = new RoomStock();
room_stock.itemmaster = param.itemmaster;
room_stock.room = param.room;
room_stock.batch = param.batch;
room_stock.exp_date = new Date(param.exp_date);
room_stock.total_stock = param.stock;
room_stock.itemorigin = param.itemorigin;
await queryRunner.manager.save(room_stock);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, initial_stock);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemCategory, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemCategoryModel } from "../../model/item_category";
const log: Logger<ILogObj> = new Logger({ name: '[ItemCategoryController]', type: 'pretty' });
export class ItemCategoryController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemCategoryModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_category." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemCategoryModel.list(filter);
const data = await query.getMany();
const filename = "item_category.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemCategory): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_category"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
category_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemCategory()
data.category_name = param.category_name
data.created_by = req.auth.data.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemCategory ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_category"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
category_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemCategory);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.category_name = param.category_name
data.updated_by = req.auth.data.name
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemCategory ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemCategory);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemCategory']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemCategory ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemCategory = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemCategory);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemClass, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemClassModel } from "../../model/item_class";
const log: Logger<ILogObj> = new Logger({ name: '[ItemClassController]', type: 'pretty' });
export class ItemClassController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemClassModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_class." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemClassModel.list(filter);
const data = await query.getMany();
const filename = "item_class.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemClass): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_class"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
item_class_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemClass()
data.item_class_name = param.item_class_name
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemClass ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_class"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
item_class_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemClass);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.item_class_name = param.item_class_name
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Class ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemClass);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClass']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemClass ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemClass = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemClass);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemClassDetail, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemClassDetailModel } from "../../model/item_class_detail";
const log: Logger<ILogObj> = new Logger({ name: '[ItemClassDetailController]', type: 'pretty' });
export class ItemClassDetailController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemClassDetailModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_class_detail." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemClassDetailModel.list(filter);
const data = await query.getMany();
const filename = "item_class_detail.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemClassDetail): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_class_detail"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
class_detail_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemClassDetail()
data.class_detail_name = param.class_detail_name
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemClassDetail ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_class_detail"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
class_detail_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemClassDetail);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.class_detail_name = param.class_detail_name
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Group ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemClassDetail);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemClassDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemClassDetail ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemClassDetail = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemClassDetail);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemGroup, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemGroupModel } from "../../model/item_group";
const log: Logger<ILogObj> = new Logger({ name: '[ItemGroupController]', type: 'pretty' });
export class ItemGroupController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemGroupModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_group." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemGroupModel.list(filter);
const data = await query.getMany();
const filename = "item_group.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemGroup): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_group"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
group_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemGroup()
data.group_name = param.group_name
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemGroup ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_group"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
group_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemGroup);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.group_name = param.group_name
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Group ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemGroup);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemGroup']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemGroup ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemGroup = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemGroup);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,424 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemMaster, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemMasterModel } from "../../model/item_master";
const log: Logger<ILogObj> = new Logger({ name: '[ItemMasterController]', type: 'pretty' });
export class ItemMasterController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemMasterModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_master." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const query = await ItemMasterModel.list();
query.select([
"item_master.id",
"item_master.item_name",
"item_master.largeunit",
"item_master.smallunit",
"item_master.pack_size",
]).orderBy("item_master.item_name", "ASC");
const total_count_data = await query.getCount();
const list_data = await query.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, 1, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemMasterModel.list(filter);
const data = await query.getMany();
const filename = "item_master.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemMaster): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_master"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
item_name: Joi.string().max(256).required().label('Item Name'),
generic_name_id: Joi.string().uuid().required().label('Generic Name ID'),
item_type_detail_id: Joi.string().uuid().required().label('Item Type Detail ID'),
item_category_id: Joi.string().uuid().required().label('Item Category ID'),
item_class_id: Joi.string().uuid().required().label('Item Class ID'),
item_class_detail_id: Joi.string().uuid().required().label('Item Class Detail ID'),
item_status_id: Joi.string().uuid().required().label('Item Status ID'),
factory_id: Joi.string().uuid().required().label('Factory ID'),
// unit_id: Joi.string().uuid().required().label('Unit ID'),
smallunit: Joi.string().required().label('Small Unit'),
largeunit: Joi.string().required().label('Large Unit'),
pack_size: Joi.number().integer().min(0).required().label('Pack Size'),
minimum_quantity: Joi.number().integer().min(0).required().label('Minimum Quantity'),
minimum_sales_quantity: Joi.number().integer().min(0).required().label('Minimum Sales Quantity'),
strength: Joi.number().min(0).required().label('Strength'),
active: Joi.boolean().required().label('Active'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemMaster()
data.item_name = param.item_name,
data.generic_name = param.generic_name_id,
data.type_detail = param.item_type_detail_id,
data.category = param.item_category_id,
data.item_class = param.item_class_id,
data.item_class_detail = param.item_class_detail_id,
data.status = param.item_status_id,
data.factory = param.factory_id,
data.smallunit = param.smallunit,
data.largeunit = param.largeunit,
data.pack_size = param.pack_size,
data.minimum_quantity = param.minimum_quantity,
data.minimum_sales_quantity = param.minimum_sales_quantity,
data.strength = param.strength,
data.active = param.active
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemMaster ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_master"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
item_name: Joi.string().max(256).required().label('Item Name'),
generic_name_id: Joi.string().uuid().required().label('Generic Name ID'),
item_type_detail_id: Joi.string().uuid().required().label('Item Type Detail ID'),
item_category_id: Joi.string().uuid().required().label('Item Category ID'),
item_class_id: Joi.string().uuid().required().label('Item Class ID'),
item_class_detail_id: Joi.string().uuid().required().label('Item Class Detail ID'),
item_status_id: Joi.string().uuid().required().label('Item Status ID'),
factory_id: Joi.string().uuid().required().label('Factory ID'),
smallunit: Joi.string().required().label('Small Unit'),
largeunit: Joi.string().required().label('Large Unit'),
pack_size: Joi.number().integer().min(0).required().label('Pack Size'),
minimum_quantity: Joi.number().integer().min(0).required().label('Minimum Quantity'),
minimum_sales_quantity: Joi.number().integer().min(0).required().label('Minimum Sales Quantity'),
strength: Joi.number().min(0).required().label('Strength'),
active: Joi.boolean().required().label('Active'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemMaster);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.item_name = param.item_name,
data.generic_name = param.generic_name_id,
data.type_detail = param.item_type_detail_id,
data.category = param.item_category_id,
data.item_class = param.item_class_id,
data.item_class_detail = param.item_class_detail_id,
data.status = param.item_status_id,
data.factory = param.factory_id,
data.smallunit = param.smallunit,
data.largeunit = param.largeunit, data.pack_size = param.pack_size,
data.minimum_quantity = param.minimum_quantity,
data.minimum_sales_quantity = param.minimum_sales_quantity,
data.strength = param.strength,
data.active = param.active
data.updated_by = req.auth?.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Master ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemMaster);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemMaster']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemMaster ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemMaster = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemMaster);
const affected = (await repo.restore({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,377 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemOrigin, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemOriginModel } from "../../model/item_origin";
const log: Logger<ILogObj> = new Logger({ name: '[ItemOriginController]', type: 'pretty' });
export class ItemOriginController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemOriginModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_origin." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const query = await ItemOriginModel.list();
query.select([
"item_origin.id",
"item_origin.origin_name",
]).orderBy("item_origin.origin_name", "ASC");
const total_count_data = await query.getCount();
const list_data = await query.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, 1, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemOriginModel.list(filter);
const data = await query.getMany();
const filename = "item_origin.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemOrigin): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_origin"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
origin_name: Joi.string().max(256).required().label('Name'),
origin_description: Joi.string().max(256).required().label('Desc'),
department: Joi.string().max(256).optional().label('Department'),
account: Joi.string().max(256).optional().label('Account'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemOrigin()
data.origin_name = param.origin_name
data.origin_description = param.origin_description
data.department = param.department
data.account = param.account
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemOrigin ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_origin"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
origin_name: Joi.string().max(256).required().label('Name'),
origin_description: Joi.string().max(256).required().label('Desc'),
department: Joi.string().max(256).required().label('Department'),
account: Joi.string().max(256).required().label('Account'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemOrigin);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.origin_name = param.origin_name
data.origin_description = param.origin_description
data.department = param.department
data.account = param.account
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Origin ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemOrigin);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemOrigin']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemOrigin ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemOrigin = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemOrigin);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,386 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemPrice, Paging, ItemMaster } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemPriceModel } from "../../model/item_price";
const log: Logger<ILogObj> = new Logger({ name: '[ItemPriceController]', type: 'pretty' });
export class ItemPriceController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemPriceModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_price." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemPriceModel.list(filter);
const data = await query.getMany();
const filename = "item_price.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemPrice): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_price"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
item_master_id: Joi.string()
.uuid()
.required()
.label('Item Master Id'),
purchase_price: Joi.number()
.min(0)
.required()
.label('Purchase Price'),
selling_price: Joi.number()
.min(0)
.required()
.label('Selling Price'),
// expired_date: Joi.date()
// .required()
// .label('Expired Date'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemPrice()
data.item_master = param.item_master_id
data.purchase_price = param.purchase_price
data.selling_price = param.selling_price
// data.expired_date = param.expired_date
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemMaster ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_price"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
item_master_id: Joi.string()
.uuid()
.required()
.label('Item Master Id'),
purchase_price: Joi.number()
.min(0)
.required()
.label('Purchase Price'),
selling_price: Joi.number()
.min(0)
.required()
.label('Selling Price'),
});
const param: any = await schema.validateAsync(req.body);
const itemMaster = await OrmHelper.DB.getRepository(ItemMaster).findOneBy({ id: req.params['id'] });
if (!itemMaster) return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "Item Master not found");
const repo = OrmHelper.DB.getRepository(ItemPrice);
// ✅ Include withDeleted agar record soft-deleted ikut dicek
let data = await repo.findOne({
where: { item_master: { id: req.params['id'] } },
withDeleted: true
});
if (data) {
// UPDATE (termasuk restore jika soft-deleted)
data.purchase_price = param.purchase_price;
data.selling_price = param.selling_price;
data.deleted_at = null as any;
data.deleted_by = null as any;
data.updated_by = req.auth?.data.name;
} else {
// INSERT baru
data = new ItemPrice();
data.item_master = itemMaster;
data.purchase_price = param.purchase_price;
data.selling_price = param.selling_price;
data.created_by = req.auth?.data.name;
data.updated_by = req.auth?.data.name;
}
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Price ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemPrice);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemPrice']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemPrice ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemPrice = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemPrice);
const affected = (await repo.restore({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,339 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemStatus, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemStatusModel } from "../../model/item_status";
const log: Logger<ILogObj> = new Logger({ name: '[ItemStatusController]', type: 'pretty' });
export class ItemStatusController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemStatusModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_status." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemStatusModel.list(filter);
const data = await query.getMany();
const filename = "item_status.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemStatus): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_status"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
status_name: Joi.string().max(256).required().label('Name'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemStatus()
data.status_name = param.status_name
data.created_by = req.auth.data.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemStatus ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_status"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
status_name: Joi.string().max(256).required().label('Name'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemStatus);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.status_name = param.status_name
data.updated_by = req.auth.data.name
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemStatus ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemStatus);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemStatus']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemStatus ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemStatus = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemStatus);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,343 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemType, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemTypeModel } from "../../model/item_type";
const log: Logger<ILogObj> = new Logger({ name: '[ItemTypeController]', type: 'pretty' });
export class ItemTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemTypeModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_type." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemTypeModel.list(filter);
const data = await query.getMany();
const filename = "item_type.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemType): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_type"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
type_name: Joi.string().max(256).required().label('Name'),
item_group_id: Joi.string().uuid().required().label('Item Group ID'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemType()
data.type_name = param.type_name
data.item_group = param.item_group_id
data.created_by = req.auth.data.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemType ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_type"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
type_name: Joi.string().max(256).required().label('Name'),
item_group_id: Joi.string().uuid().required().label('Item Group ID'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemType);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.type_name = param.type_name
data.item_group = param.item_group_id
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Type ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemType);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemType']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemType ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemType = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemType);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,343 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { ItemTypeDetail, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { ItemTypeDetailModel } from "../../model/item_type_detail";
const log: Logger<ILogObj> = new Logger({ name: '[ItemTypeDetailController]', type: 'pretty' });
export class ItemTypeDetailController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemTypeDetailModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("item_type_detail." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ItemTypeDetailModel.list(filter);
const data = await query.getMany();
const filename = "item_type_detail.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: ItemTypeDetail): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_type_detail"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
type_detail_name: Joi.string().max(256).required().label('Name'),
item_type_id: Joi.string().uuid().required().label('Item Group ID'),
});
const param: any = await schema.validateAsync(req.body);
const data = new ItemTypeDetail()
data.type_detail_name = param.type_detail_name
data.item_type = param.item_type_id
data.created_by = req.auth?.data.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemTypeDetail ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/item_type_detail"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
type_detail_name: Joi.string().max(256).required().label('Name'),
item_type_id: Joi.string().uuid().required().label('Item Group ID'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(ItemTypeDetail);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.type_detail_name = param.type_detail_name
data.item_type = param.item_type_id
data.updated_by = req.auth?.data.name
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Item Type Detail ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemTypeDetail);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - ItemTypeDetail']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'ItemTypeDetail ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: ItemTypeDetail = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ItemTypeDetail);
const affected = (await repo.restore({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,692 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { PharmacyInfo, Paging, Subdistrict } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import fileUpload from "express-fileupload";
import fs from "fs";
import path from "path";
import { v4 as uuidv4 } from 'uuid';
import config from "../../../config/stag.json";
import { PharmacyInfoModel } from "../../model/pharmacy_info";
interface FileUploadRequest extends Request {
files?: fileUpload.FileArray | null;
body: any;
}
const log: Logger<ILogObj> = new Logger({ name: '[PharmacyInfoController]', type: 'pretty' });
export class PharmacyInfoController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PharmacyInfoModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("pharmacy_info." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = (await res_list.getMany()).map((item) => ({
...item,
logo: config.server.host_swagger + 'uploads/hospital-logo/' + item.logo,
file: item.logo
}));
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Pharmacy Info Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await PharmacyInfoModel.list({ "id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "Pharmacy Info Not Found" };
const result = {
...data,
logo: config.server.host_swagger + 'uploads/hospital-logo/' + data.logo,
file: data.logo
};
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PharmacyInfoModel.list(filter);
const data = await query.getMany();
const filename = "pharmacy_info.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: PharmacyInfo): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/pharmacy_info"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
logo: Joi.string()
.max(256)
.required()
.label('Logo'),
name: Joi.string()
.max(256)
.required()
.label('Name'),
address: Joi.string()
.max(500)
.required()
.label('Address'),
munisipiu: Joi.string()
.uuid()
.required()
.label('Munisipiu'),
postu_admin: Joi.string()
.uuid()
.required()
.label('Postu Admin'),
suco: Joi.string()
.uuid()
.required()
.label('Suco'),
aldeia: Joi.string()
.uuid()
.required()
.label('Aldeia'),
phone: Joi.string()
.max(30)
.optional()
.label('Phone'),
default_room_id: Joi.string()
.uuid()
.required()
.label('Default Room'),
// province: Joi.string().allow("").optional().label("Province Code"),
// city: Joi.string().allow("").optional().label("City Code"),
// subdistrict: Joi.string().allow("").optional().label("Subdistrict Code"),
// ward: Joi.string().allow("").optional().label("Ward Code"),
});
const param: any = await schema.validateAsync(req.body);
const data = new PharmacyInfo()
data.name = param.name,
data.address = param.address
data.munisipiu = param.munisipiu,
data.postu_admin = param.postu_admin
data.suco = param.suco
data.aldeia = param.aldeia
data.phone = param.phone
data.default_room = param.default_room_id
data.logo = param.logo
// data.province = param.province
// data.city = param.city
// data.subdistrict = param.subdistrict
// data.ward = param.ward
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PharmacyInfo ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/pharmacy_info"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
logo: Joi.string()
.max(256)
.required()
.label('Logo'),
name: Joi.string()
.max(256)
.required()
.label('Name'),
address: Joi.string()
.max(500)
.required()
.label('Address'),
munisipiu: Joi.string()
.uuid()
.allow('', null)
.label('Munisipiu'),
postu_admin: Joi.string()
.uuid()
.allow('', null)
.label('Postu Admin'),
suco: Joi.string()
.uuid()
.allow('', null)
.label('Suco'),
aldeia: Joi.string()
.uuid()
.allow('', null)
.label('Aldeia'),
// province: Joi.string()
// .allow("", null)
// .label('Province'),
// city: Joi.string()
// .allow("", null)
// .label('City'),
// subdistrict: Joi.string()
// .allow("", null)
// .label('Subdistrict'),
// ward: Joi.string()
// .allow("", null)
// .label('Ward'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(PharmacyInfo);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.name = param.name,
data.address = param.address
data.munisipiu = param.munisipiu,
data.postu_admin = param.postu_admin
data.suco = param.suco
data.aldeia = param.aldeia
data.phone = param.phone
data.default_room = param.default_room_id
data.logo = param.logo
// data.province = param.province
// data.city = param.city
// data.subdistrict = param.subdistrict
// data.ward = param.ward
data.updated_by = req.auth?.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Pharmacy Info ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PharmacyInfo);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PharmacyInfo ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: PharmacyInfo = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PharmacyInfo);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async uploadlogo(req: FileUploadRequest, res: Response, next: NextFunction): Promise<Response> {
/* #swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.consumes = ['multipart/form-data']
#swagger.requestBody = {
required: true,
content: {
"multipart/form-data": {
schema: {
type: "object",
properties: {
file: {
type: "string",
format: "binary",
description: "Image file (max 1MB, jpg/png/webp)"
},
path: {
type: "string",
description: 'File path',
default: 'uploads/pharmacy-info'
},
application: {
type: "string",
description: 'Application name',
default: 'saude'
}
},
required: ["file", "path", "application"]
}
}
}
}
*/
try {
// Validation schema
const schema = Joi.object().keys({
path: Joi.string().label('File Path'),
application: Joi.string().label('Application'),
});
log.info("body", req.body);
const param: { path: string, application: string } = await schema.validateAsync(req.body);
// Check if file exists
if (!req.files || !req.files.file) {
return ReturnHelper.errorResponse(res, 400, 404, Language.lang.failed_insert, "File not found");
}
const file = req.files.file as fileUpload.UploadedFile;
// Validate file size (max 1MB)
const maxSize = 10 * 1024 * 1024; // 10MB
if (file.size > maxSize) {
return ReturnHelper.errorResponse(
res,
400,
400,
Language.lang.failed_insert,
"File size exceeds 10MB limit"
);
}
// Validate file type
const allowedMimes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'];
if (!allowedMimes.includes(file.mimetype)) {
return ReturnHelper.errorResponse(res, 400, 400, Language.lang.failed_insert, "Invalid file type. Only JPG, PNG, and WEBP are allowed");
}
// Normalize path
param.path = param.path[param.path.length - 1] !== '/' ? param.path + '/' : param.path;
if (param.path == undefined || param.path == null) param.path = 'uploads/pharmacy-info/';
// Generate unique filename
const ext = file.name.split('.');
const name = uuidv4() + '.' + ext[ext.length - 1];
const result: { file: string } = {
// url: "",
// path: "",
file: "",
// mime: file.mimetype,
// size: file.size,
// md5: file.md5
};
const folder_path = param.path;
const file_path = path.join(folder_path, name);
// Create directory if it doesn't exist
if (!fs.existsSync(folder_path)) {
fs.mkdirSync(folder_path, { recursive: true });
}
// Move file to destination
await file.mv(file_path);
// result.path = param.path[param.path.length - 1] === '/' ? param.path.substring(0, param.path.length - 1) : param.path;
result.file = name;
// result.url = `${result.path}/${name}`; // Generate URL
log.info(`File uploaded successfully: ${file_path}`);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, result);
} catch (e: unknown) {
// Proper error logging to avoid tslog serialization issues
if (e instanceof Error) {
log.error("File upload failed:", {
message: e.message,
stack: e.stack,
name: e.name
});
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, e.message);
} else {
log.error("File upload failed with unknown error:", String(e));
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, "Unknown error occurred");
}
}
}
static async deletelogo(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/files" } } } }
*/
try {
const schema = Joi.object().keys({
file_name: Joi.string().required().label('File Name'),
});
const param: { file_name: string } = await schema.validateAsync(req.body);
// const env = process.env.NODE_ENV + '/'
const fixedPath = 'uploads/pharmacy-info/';
const file_path = fixedPath + param.file_name;
// Check if file exists
if (!fs.existsSync(file_path)) {
return ReturnHelper.errorResponse(res, 404, 404, Language.lang.failed_not_found, "File not found");
}
// Delete file
fs.unlinkSync(file_path);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async view(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PharmacyInfo']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const data = await OrmHelper.DB
.getRepository(PharmacyInfo)
.findOne({
where: {}
});
if (!data) return ReturnHelper.errorResponse(res, 404, 404, Language.lang.failed_view, "data not found");
const result = {
id: data.id,
name: data.name,
address: data.address,
phone: data.phone,
logo: config.server.host_swagger + 'uploads/hospital-logo/' + data.logo
};
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
}

View File

@ -1,282 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { PlanningVerificator, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { PlanningVerificatorModel } from "../../model/planning_verificator";
const log: Logger<ILogObj> = new Logger({ name: '[PlanningVerificatorController]', type: 'pretty' });
export class PlanningVerificatorController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PlanningVerificator']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PlanningVerificatorModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("planning_verificator." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - PlanningVerificator']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await PlanningVerificatorModel.list(filter);
const data = await query.getMany();
const filename = "planning_verificator.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: PlanningVerificator): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PlanningVerificator']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/planning_verificator"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
user_id: Joi.string().max(256).required().label('User Id'),
});
const param: any = await schema.validateAsync(req.body);
const data = new PlanningVerificator()
data.user = param.user_id
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PlanningVerificator']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Planning Verificator ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PlanningVerificator);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - PlanningVerificator']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'PlanningVerificator ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: PlanningVerificator = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(PlanningVerificator);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,347 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { SellingPricePercentage, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { SellingPricePercentageModel } from "../../model/selling_price_percentage";
const log: Logger<ILogObj> = new Logger({ name: '[SellingPricePercentageController]', type: 'pretty' });
export class SellingPricePercentageController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await SellingPricePercentageModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("selling_price_percentage." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await SellingPricePercentageModel.list(filter);
const data = await query.getMany();
const filename = "selling_price_percentage.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: SellingPricePercentage): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/selling_price_percentage"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
item_master_id: Joi.string().uuid().required().label('Item Master ID'),
item_origin_id: Joi.string().uuid().required().label('Item Origin ID'),
percentage: Joi.number().min(0).max(999.99).precision(2).required().label('Percentage'),
});
const param: any = await schema.validateAsync(req.body);
const data = new SellingPricePercentage()
data.item_master = param.item_master_id
data.item_origin = param.item_origin_id
data.percentage = param.percentage
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'SellingPricePercentage ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/selling_price_percentage"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
item_master_id: Joi.string().uuid().required().label('Item Master ID'),
item_origin_id: Joi.string().uuid().required().label('Item Origin ID'),
percentage: Joi.number().min(0).max(999.99).precision(2).required().label('Percentage'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(SellingPricePercentage);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.item_master = param.item_master_id
data.item_origin = param.item_origin_id
data.percentage = param.percentage
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Selling Price Percentage ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(SellingPricePercentage);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - SellingPricePercentage']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'SellingPricePercentage ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: SellingPricePercentage = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(SellingPricePercentage);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,376 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { Supplier, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { SupplierModel } from "../../model/supplier";
const log: Logger<ILogObj> = new Logger({ name: '[SupplierController]', type: 'pretty' });
export class SupplierController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await SupplierModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("supplier." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const query = await SupplierModel.list();
query.select([
"supplier.id",
"supplier.supplier_name",
]).orderBy("supplier.supplier_name", "ASC");
const total_count_data = await query.getCount();
const list_data = await query.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, 1, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await SupplierModel.list(filter);
const data = await query.getMany();
const filename = "supplier.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Supplier): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/supplier"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
supplier_name: Joi.string().max(256).required().label('Name'),
address: Joi.string().max(512).allow('', null).label('Address'),
phone: Joi.string().max(50).allow('', null).label('Phone'),
email: Joi.string().email().max(256).allow('', null).label('Email')
});
const param: any = await schema.validateAsync(req.body);
const data = new Supplier()
data.supplier_name = param.supplier_name
data.address = param.address
data.phone = param.phone
data.email = param.email
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Supplier ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/supplier"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
supplier_name: Joi.string().max(256).required().label('Name'),
address: Joi.string().max(512).allow('', null).label('Address'),
phone: Joi.string().max(50).allow('', null).label('Phone'),
email: Joi.string().email().max(256).allow('', null).label('Email')
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Supplier);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.supplier_name = param.supplier_name
data.address = param.address
data.phone = param.phone
data.email = param.email
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Supplier ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Supplier);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Supplier']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Supplier ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Supplier = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Supplier);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,347 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { Unit, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { UnitModel } from "../../model/unit";
const log: Logger<ILogObj> = new Logger({ name: '[UnitController]', type: 'pretty' });
export class UnitController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UnitModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("unit." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UnitModel.list(filter);
const data = await query.getMany();
const filename = "unit.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Unit): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/unit"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
unit_name: Joi.string().max(256).required().label('Name'),
small_unit: Joi.string().max(256).optional().allow('').label('Small Unit'),
large_unit: Joi.string().max(256).optional().allow('').label('Large Unit'),
});
const param: any = await schema.validateAsync(req.body);
const data = new Unit()
data.unit_name = param.unit_name
data.small_unit = param.small_unit
data.large_unit = param.large_unit
data.created_by = req.auth.data.name
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Unit ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/unit"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
unit_name: Joi.string().max(256).required().label('Name'),
small_unit: Joi.string().max(256).optional().allow('').label('Small Unit'),
large_unit: Joi.string().max(256).optional().allow('').label('Large Unit'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Unit);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.unit_name = param.unit_name
data.small_unit = param.small_unit
data.large_unit = param.large_unit
data.updated_by = req.auth.data.name
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Unit ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Unit);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - Unit']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Unit ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Unit = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Unit);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,343 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { UsageInstructions, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { UsageInstructionsModel } from "../../model/usage_instructions";
const log: Logger<ILogObj> = new Logger({ name: '[UsageInstructionsController]', type: 'pretty' });
export class UsageInstructionsController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UsageInstructionsModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("usage_instructions." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UsageInstructionsModel.list(filter);
const data = await query.getMany();
const filename = "usage_instructions.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: UsageInstructions): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/usage_instructions"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
usage_instructions_name: Joi.string().max(256).required().label('Name'),
usage_instructions_abbreviation: Joi.string().max(256).required().label('Abbreviation'),
});
const param: any = await schema.validateAsync(req.body);
const data = new UsageInstructions()
data.usage_instructions_name = param.usage_instructions_name
data.usage_instructions_abbreviation = param.usage_instructions_abbreviation
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'UsageInstructions ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/usage_instructions"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
usage_instructions_name: Joi.string().max(256).required().label('Name'),
usage_instructions_abbreviation: Joi.string().max(256).required().label('Abbreviation'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(UsageInstructions);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.usage_instructions_name = param.usage_instructions_name
data.usage_instructions_abbreviation = param.usage_instructions_abbreviation
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Usage Instructions ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageInstructions);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'UsageInstructions ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: UsageInstructions = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageInstructions);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,343 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../../helpers/express/return";
import { OrmHelper } from "../../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../../langs/lang";
import { UsageTime, Paging } from "entity";
import CommonHelper from "../../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { UsageTimeModel } from "../../model/usage_time";
const log: Logger<ILogObj> = new Logger({ name: '[UsageTimeController]', type: 'pretty' });
export class UsageTimeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UsageTimeModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("usage_time." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UsageTimeModel.list(filter);
const data = await query.getMany();
const filename = "usage_time.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: UsageTime): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/usage_time"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
usage_time_name: Joi.string().max(256).required().label('Name'),
usage_time_abbreviation: Joi.string().max(256).required().label('Abbreviation'),
});
const param: any = await schema.validateAsync(req.body);
const data = new UsageTime()
data.usage_time_name = param.usage_time_name
data.usage_time_abbreviation = param.usage_time_abbreviation
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'UsageTime ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/usage_time"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
usage_time_name: Joi.string().max(256).required().label('Name'),
usage_time_abbreviation: Joi.string().max(256).required().label('Abbreviation'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(UsageTime);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.usage_time_name = param.usage_time_name
data.usage_time_abbreviation = param.usage_time_abbreviation
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Usage Instructions ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageTime);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageTime']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'UsageTime ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: UsageTime = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageTime);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,467 +0,0 @@
import { QueueMonitoring, Paging, QueueMonitoringRooms, Status } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { QueueMonitoringModel } from "../model/queue_monitoring";
import { RoomModel } from "../model/room";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[QueueMonitoringController]",
type: "pretty",
});
export class QueueMonitoringController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (status, slug, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await QueueMonitoringModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndMapMany(
"QueueMonitoring.queue_monitoring_rooms", //
QueueMonitoringRooms,
"qmr",
'qmr."queueMonitoringId" = "QueueMonitoring"."id"',
)
.leftJoinAndSelect("qmr.room", "room")
.leftJoinAndSelect("room.department", "department")
.orderBy("QueueMonitoring." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
let list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
if (list_data && list_data.length > 0) {
list_data = list_data.map((item) => {
return {
...item,
rooms: (item.queue_monitoring_rooms || []).map((qmr) => qmr.room),
};
});
list_data = list_data.map(({ queue_monitoring_rooms, ...rest }) => rest);
}
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async detailBySlug(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['slug'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
slug: Joi.string().required().label("Queue Monitoring Slug"),
});
const param: any = await schema.validateAsync(req.params);
const queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.slug": param.slug }).then((q) =>
q //
.leftJoinAndMapMany(
"QueueMonitoring.queue_monitoring_rooms", //
QueueMonitoringRooms,
"qmr",
'qmr."queueMonitoringId" = "QueueMonitoring"."id"',
)
.leftJoinAndSelect("qmr.room", "room")
.leftJoinAndSelect("room.department", "department")
.getOne(),
);
if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" };
if (queueMonitoring) {
queueMonitoring.rooms = (queueMonitoring.queue_monitoring_rooms || []).map((item) => item.room);
delete queueMonitoring.queue_monitoring_rooms;
}
if (queueMonitoring.rooms && queueMonitoring.rooms.length > 0) {
try {
const roomIds = queueMonitoring.rooms.map((room: any) => room.id);
const today = moment().format("YYYY-MM-DD");
const placeholders = roomIds.map((_: any, index: number) => `$${index + 1}`).join(", ");
const dateParamIndex = roomIds.length + 1;
const queryParams = [...roomIds, today];
const queueQuery = `
SELECT
ro.id,
ro.qeue_number,
ro.registration_status,
ro."roomId",
ro.updated_at,
p.full_name AS fullname_patient
FROM emr.emr_registration_outpatient ro
LEFT JOIN emr.emr_registrations r ON ro."registrationId" = r.id
LEFT JOIN emr.emr_patients p ON r."patientId" = p.id
WHERE ro."roomId" IN (${placeholders})
AND DATE(ro.visit_date) = $${dateParamIndex}
AND ro.registration_status IN ('ON GOING', 'REGISTERED')
ORDER BY ro."roomId",
CASE WHEN ro.registration_status = 'ON GOING' THEN 0
WHEN ro.registration_status = 'REGISTERED' THEN 1
ELSE 2 END,
ro.qeue_number ASC
`;
const allQueues = await OrmHelper.DB.manager.query(queueQuery, queryParams);
const queuesByRoom: { [key: string]: any[] } = {};
allQueues.forEach((queue: any) => {
const roomId = queue.roomId;
if (roomId) {
if (!queuesByRoom[roomId]) {
queuesByRoom[roomId] = [];
}
queuesByRoom[roomId].push({
id: queue.id,
qeue_number: queue.qeue_number,
registration_status: queue.registration_status,
fullname_patient: queue.fullname_patient,
});
}
});
// room lookup
const roomIdToRoomObj: { [key: string]: any } = {};
queueMonitoring.rooms.forEach((room: any) => {
roomIdToRoomObj[room.id] = room;
});
queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({
...room,
queues: queuesByRoom[room.id] || [],
}));
const latestOnGoing = allQueues
.filter((q: any) => q.registration_status === "ON GOING")
.reduce((latest: any, current: any) => {
const latestDate = new Date(latest?.updated_at || latest?.updatedAt || 0);
const currentDate = new Date(current?.updated_at || current?.updatedAt || 0);
return currentDate > latestDate ? current : latest;
}, undefined);
(queueMonitoring as any).currentQueue = latestOnGoing
? {
room: roomIdToRoomObj[latestOnGoing.roomId]?.room || null,
id: latestOnGoing.id,
qeue_number: latestOnGoing.qeue_number,
registration_status: latestOnGoing.registration_status,
fullname_patient: latestOnGoing.fullname_patient,
}
: null;
} catch (queryError: any) {
log.warn(`Failed to fetch queue data from emr.emr_registration_outpatient: ${queryError.message}`);
queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({
...room,
queues: [],
}));
(queueMonitoring as any).currentQueue = null;
}
}
const responseData = {
...queueMonitoring,
};
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, responseData);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/queueMonitoring" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
slug: Joi.string().required().label("Slug"),
name: Joi.string().required().label("Name"),
room_ids: Joi.array().items(Joi.string().uuid()).min(1).required().label("Room IDs"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let queueMonitoring = new QueueMonitoring();
queueMonitoring.slug = param.slug;
queueMonitoring.name = param.name;
queueMonitoring.status = param.status;
queueMonitoring.created_by = req.auth?.data.name;
queueMonitoring.updated_by = req.auth?.data.name;
await queryRunner.manager.save(queueMonitoring);
if (param.room_ids && param.room_ids.length > 0) {
await queryRunner.manager.getRepository(QueueMonitoringRooms)
.createQueryBuilder()
.delete()
.from(QueueMonitoringRooms)
.where('"id" = :id', { id: queueMonitoring.id })
.execute();
for (const roomId of param.room_ids) {
const room = await RoomModel.list({ id: roomId }).then((q) => q.getOne());
if (!room) throw { message: `Room with id ${roomId} not found` };
let queueMonitoringRooms = new QueueMonitoringRooms();
queueMonitoringRooms.queue_monitoring = queueMonitoring;
queueMonitoringRooms.room = room;
queueMonitoringRooms.status = param.status;
queueMonitoringRooms.created_by = req.auth?.data.name;
queueMonitoringRooms.updated_by = req.auth?.data.name;
await queryRunner.manager.save(queueMonitoringRooms);
}
}
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, queueMonitoring);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Queue Monitoring Id"),
});
let param: any = await schema.validateAsync(req.params);
let queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.id": param.id }).then((q) =>
q //
.leftJoinAndMapMany(
"QueueMonitoring.queue_monitoring_rooms", //
QueueMonitoringRooms,
"qmr",
'qmr."queueMonitoringId" = "QueueMonitoring"."id"',
)
.leftJoinAndSelect("qmr.room", "room")
.leftJoinAndSelect("room.department", "department")
.getOne(),
);
if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" };
if (queueMonitoring) {
queueMonitoring.rooms = (queueMonitoring.queue_monitoring_rooms || []).map((item) => item.room);
delete queueMonitoring.queue_monitoring_rooms;
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, queueMonitoring);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/queueMonitoring" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Queue Monitoring ID"),
slug: Joi.string().required().label("Slug"),
name: Joi.string().required().label("Name"),
room_ids: Joi.array().items(Joi.string().uuid()).min(1).required().label("Room IDs"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.id": param.id }).then((q) => q.getOne());
if (!queueMonitoring) throw { message: "Queue Monitoring " + Language.lang.failed_not_found };
queueMonitoring.slug = param.slug;
queueMonitoring.name = param.name;
queueMonitoring.status = param.status;
queueMonitoring.updated_by = req.auth.data.name;
await queryRunner.manager.save(queueMonitoring);
if (param.room_ids && param.room_ids.length > 0) {
await queryRunner.manager //
.getRepository(QueueMonitoringRooms)
.createQueryBuilder()
.delete()
.from(QueueMonitoringRooms)
.where('"queueMonitoringId" = :id', { id: queueMonitoring.id })
.execute();
for (const roomId of param.room_ids) {
const room = await RoomModel.list({ id: roomId }).then((q) => q.getOne());
if (!room) throw { message: `Room with id ${roomId} not found` };
let queueMonitoringRooms = new QueueMonitoringRooms();
queueMonitoringRooms.queue_monitoring = queueMonitoring;
queueMonitoringRooms.room = room;
queueMonitoringRooms.status = param.status;
queueMonitoringRooms.created_by = req.auth.data.name;
queueMonitoringRooms.updated_by = req.auth.data.name;
await queryRunner.manager.save(queueMonitoringRooms);
}
}
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, queueMonitoring);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let queueMonitoring: QueueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.id": param.id }).then((q) => q.getOne());
if (!queueMonitoring) throw { message: "Queue Monitoring " + Language.lang.failed_not_found };
queueMonitoring.deleted_by = req.auth.data.name;
queueMonitoring.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(queueMonitoring);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(QueueMonitoring);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Queue Monitoring']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(QueueMonitoring);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,297 +0,0 @@
import { ReferenceRange, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ReferenceRangeModel } from "../model/reference_range";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ReferenceRangeController]",
type: "pretty",
});
export class ReferenceRangeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (gender, age_range_min, age_range_max, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
var query = await ReferenceRangeModel.list(filterObj);
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
query.andWhere(
`(
"ReferenceRange".status::text ILIKE :any
OR "ReferenceRange".gender::text ILIKE :any
OR "ReferenceRange".age_range_min::text ILIKE :any
OR "ReferenceRange".age_range_max::text ILIKE :any
OR "ReferenceRange".value_min::text ILIKE :any
OR "ReferenceRange".value_max::text ILIKE :any
)`,
{ any: anyVal },
);
}
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("ReferenceRange." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/referenceRange" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
gender: Joi.string().valid("male", "female").required().label("Gender"),
age_range_min: Joi.number().integer().min(0).default(0).required().label("Age Range Min (days)"),
age_range_max: Joi.number().integer().min(0).default(36500).required().label("Age Range Max (days)"),
value_min: Joi.number().required().label("Value Min"),
value_max: Joi.number().required().label("Value Max"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let referenceRange = new ReferenceRange();
referenceRange.gender = param.gender;
referenceRange.age_range_min = param.age_range_min;
referenceRange.age_range_max = param.age_range_max;
referenceRange.value_min = param.value_min;
referenceRange.value_max = param.value_max;
referenceRange.status = param.status;
referenceRange.created_by = req.auth?.data.name;
referenceRange.updated_by = req.auth?.data.name;
await queryRunner.manager.save(referenceRange);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, referenceRange);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Reference Range Id"),
});
const param: any = await schema.validateAsync(req.params);
// ❗ FIX: jangan pakai "ReferenceRange.id"
const referenceRange = await ReferenceRangeModel
.list({ id: param.id })
.then((q) => q.getOne());
if (!referenceRange) {
throw { message: "Reference Range Not Found" };
}
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_view,
referenceRange
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_not_found,
err.message
);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/referenceRange" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Reference Range ID"),
gender: Joi.string().valid("male", "female").required().label("Gender"),
age_range_min: Joi.number().integer().min(0).default(0).required().label("Age Range Min (days)"),
age_range_max: Joi.number().integer().min(0).default(36500).required().label("Age Range Max (days)"),
value_min: Joi.number().required().label("Value Min"),
value_max: Joi.number().required().label("Value Max"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let referenceRange = await ReferenceRangeModel.list({ "ReferenceRange.id": param.id }).then((q) => q.getOne());
if (!referenceRange) throw { message: "Reference Range " + Language.lang.failed_not_found };
referenceRange.gender = param.gender;
referenceRange.age_range_min = param.age_range_min
referenceRange.age_range_max = param.age_range_max;
referenceRange.value_min = param.value_min;
referenceRange.value_max = param.value_max;
referenceRange.status = param.status;
referenceRange.updated_by = req.auth?.data.name;
await queryRunner.manager.save(referenceRange);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, referenceRange);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let referenceRange: ReferenceRange = await ReferenceRangeModel.list({ "ReferenceRange.id": param.id }).then((q) => q.getOne());
if (!referenceRange) throw { message: "Reference Range " + Language.lang.failed_not_found };
referenceRange.deleted_by = req.auth?.data.name;
referenceRange.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(referenceRange);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ReferenceRange);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Reference Range']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ReferenceRange);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,375 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { RefferalHospital, Paging, RefferalHospitalType } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { RefferalHospitalModel } from "../model/refferal_hospital";
const log: Logger<ILogObj> = new Logger({ name: '[RefferalHospitalController]', type: 'pretty' });
export class RefferalHospitalController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await RefferalHospitalModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("refferal_hospital." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
var query = await RefferalHospitalModel.list();
const res_count = query;
const res_list = query.orderBy("refferal_hospital.refferal_hospital_name", "ASC");
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await RefferalHospitalModel.list(filter);
const data = await query.getMany();
const filename = "refferal_hospital.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: RefferalHospital): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/refferal_hospital"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
refferal_hospital_name: Joi.string().max(256).required().label('Name'),
type: Joi.string().valid(...Object.values(RefferalHospitalType)).optional().allow(null, "").label('Type'),
});
const param: any = await schema.validateAsync(req.body);
const lastRow = await OrmHelper.DB.getRepository(RefferalHospital).findOne({
order: {
order_number: "DESC"
},
where: {}
});
const data = new RefferalHospital()
data.refferal_hospital_name = param.refferal_hospital_name
data.type = param.type || null;
data.order_number = lastRow && lastRow.order_number ? String(Number(lastRow.order_number) + 1) : "1";
data.created_by = req.auth.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'RefferalHospital ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/refferal_hospital"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
refferal_hospital_name: Joi.string().max(256).required().label('Name'),
type: Joi.string().valid(...Object.values(RefferalHospitalType)).optional().allow(null, "").label('Type'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(RefferalHospital);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.refferal_hospital_name = param.refferal_hospital_name
data.type = param.type || null;
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Refferal Hospital ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(RefferalHospital);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RefferalHospital']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'RefferalHospital ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: RefferalHospital = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(RefferalHospital);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,164 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Province, City, Subdistrict, Ward } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[RegionController]', type: 'pretty' });
export class RegionController {
static async province(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Region']
#swagger.security = [{
"bearerAuth": []
}]
*/
try {
const repo = OrmHelper.DB.getRepository(Province);
const res_count = repo.createQueryBuilder("province");
const res_list = repo.createQueryBuilder("province");
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async city(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Region']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['province_code'] = {
in: 'path',
description: 'Province Code.',
required: true,
type: 'string'
}
*/
try {
const { province_code } = req.params;
if (!/^\d{2}$/.test(province_code)) {
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, 0, 1, 0, []);
}
const repo = OrmHelper.DB.getRepository(City);
const res_count = repo.createQueryBuilder("city")
.where("city.code LIKE :province_code", { province_code: `${province_code}%` });
const res_list = repo.createQueryBuilder("city")
.where("city.code LIKE :province_code", { province_code: `${province_code}%` });
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async subdistrict(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Region']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['city_code'] = {
in: 'path',
description: 'City Code.',
required: true,
type: 'string'
}
*/
try {
const { city_code } = req.params;
if (!/^\d{2}\.\d{2}$/.test(city_code)) {
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, 0, 1, 0, []);
}
const repo = OrmHelper.DB.getRepository(Subdistrict);
const res_count = repo.createQueryBuilder("subdistrict")
.where("subdistrict.code LIKE :city_code", { city_code: `${city_code}%` });
const res_list = repo.createQueryBuilder("subdistrict")
.where("subdistrict.code LIKE :city_code", { city_code: `${city_code}%` });
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async ward(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Region']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['subdistric_code'] = {
in: 'path',
description: 'Subdistric Code.',
required: true,
type: 'string'
}
*/
try {
const { subdistric_code } = req.params;
if (!/^\d{2}\.\d{2}\.\d{2}$/.test(subdistric_code)) {
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, 0, 1, 0, []);
}
const repo = OrmHelper.DB.getRepository(Ward);
const res_count = repo.createQueryBuilder("ward")
.where("ward.code LIKE :subdistric_code", { subdistric_code: `${subdistric_code}%` });
const res_list = repo.createQueryBuilder("ward")
.where("ward.code LIKE :subdistric_code", { subdistric_code: `${subdistric_code}%` });
const current_page = 1;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
}

View File

@ -1,201 +0,0 @@
import { NextFunction, Response } from "express";
import { RegistrationFee, Service, Paging } from "entity";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[RegistrationFee]",
type: "pretty",
});
const RegistrationFeeCreateAndUpdateSchema = {
service: Joi.array().items(Joi.string().allow(null, "").uuid()).optional().label("Service"),
type: Joi.string().valid("emergency", "outpatient").required().label("Type"),
};
export class RegistrationFeeController {
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Registration Fee']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = {
description: "Filter in JSON format. Available fields: type (string, exact match), service_name (string, partial match case-insensitive), service_id (number, exact match). Example: {\"type\":\"premium\",\"service_name\":\"konsultasi\",\"service_id\":5}",
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("ASC", "DESC").required().label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
const baseQuery = OrmHelper.DB.getRepository(RegistrationFee)
.createQueryBuilder("RegistrationFee")
.leftJoinAndMapMany(
"RegistrationFee.services",
Service,
"service",
"service.id::text = ANY(RegistrationFee.service)"
);
// ── Filter RegistrationFee.type ───────────────────────────────────
if (filter.type && filter.type !== "") {
baseQuery.andWhere("RegistrationFee.type ILIKE :type", { type:`%${filter.type}%` });
}
// ── Filter service.name ───────────────────────────────────────────
if (filter.service_name && filter.service_name !== "") {
baseQuery.andWhere("service.name ILIKE :service_name", { service_name: `%${filter.service_name}%` });
}
// ── Filter service.id ─────────────────────────────────────────────
if (filter.service_id && filter.service_id !== "") {
baseQuery.andWhere("service.id = :service_id", { service_id: filter.service_id });
}
if (param.with_deleted) {
baseQuery.withDeleted();
}
const current_page = param.page;
const total_count_data = await baseQuery.getCount();
const list_data = await baseQuery
.orderBy("RegistrationFee." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit)
.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
count_data,
current_page,
total_count_data,
list_data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Registration Fee']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/registration_fee" } } } }
*/
try {
const schema = Joi.object().keys({
...RegistrationFeeCreateAndUpdateSchema
});
const param: any = await schema.validateAsync(req.body);
if (param.service && param.service.length > 0) {
for (const serviceId of param.service) {
const serviceExist = await OrmHelper.DB.getRepository(Service)
.createQueryBuilder("Service")
.where("Service.id = :id", { id: serviceId })
.getOne();
if (!serviceExist) throw { message: `Service ID ${serviceId} not found` };
}
}
const data = new RegistrationFee();
data.type = param.type;
data.service = Array.isArray(param.service) ? param.service : [];
data.created_by = req.auth?.data.name;
await OrmHelper.DB.getRepository(RegistrationFee).save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Registration Fee']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: 'ID', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/registration_fee" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
...RegistrationFeeCreateAndUpdateSchema,
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync({
...req.body,
id: req.params.id
});
if (param.service && param.service.length > 0) {
for (const serviceId of param.service) {
const serviceExist = await OrmHelper.DB.getRepository(Service)
.createQueryBuilder("Service")
.where("Service.id = :id", { id: serviceId })
.getOne();
if (!serviceExist) throw { message: `Service ID ${serviceId} not found` };
}
}
const registrationfee = await OrmHelper.DB.getRepository(RegistrationFee)
.findOne({ where: { id: param.id } });
if (!registrationfee) throw { message: "Registration Fee " + Language.lang.failed_not_found };
registrationfee.type = param.type;
registrationfee.service = Array.isArray(param.service) ? param.service : [];
registrationfee.updated_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(registrationfee);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, registrationfee);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
}

View File

@ -1,147 +0,0 @@
import { ResponsiblePartyConsent } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ResponsiblePartyConsentController]",
type: "pretty",
});
export class ResponsiblePartyConsentController {
static async body(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Responsible Party Consent']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['type'] = { in: 'query', required: false, type: 'string' }
*/
try {
const schema = Joi.object({
type: Joi.string().optional().allow("").label("Type"),
});
const { type } = await schema.validateAsync(req.query);
let query = OrmHelper.DB.getRepository(ResponsiblePartyConsent)
.createQueryBuilder("ResponsiblePartyConsent");
if (type && type !== "") {
query = query.where("ResponsiblePartyConsent.type = :type", { type });
}
const data = await query.getMany();
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
data.length,
1,
data.length,
data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Responsible Party Consent']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/responsiblepartyconsent" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const typeEnum = [
"responsible-party-consent",
"patient-education",
"inpatient-admission-consent",
"provision-of-information",
"ward-class-upgrade-entitlement",
];
// create
const schema = Joi.object().keys({
bodytext: Joi.string().required().label("Body Text"),
type: Joi.string().valid(...typeEnum).required().label("Type"),
});
let param: any = await schema.validateAsync(req.body);
let responsiblepartyconsent = new ResponsiblePartyConsent();
responsiblepartyconsent.body = param.bodytext;
responsiblepartyconsent.type = param.type;
responsiblepartyconsent.created_by = req.auth?.data.name;
responsiblepartyconsent.updated_by = req.auth?.data.name;
await queryRunner.manager.save(responsiblepartyconsent);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, responsiblepartyconsent);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Responsible Party Consent']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/responsiblepartyconsent" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const typeEnum = [
"responsible-party-consent",
"patient-education",
"inpatient-admission-consent",
"provision-of-information",
"ward-class-upgrade-entitlement",
];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room ID"),
bodytext: Joi.string().required().label("Body Text"),
type: Joi.string().valid(...typeEnum).required().label("Type"),
});
let param: any = await schema.validateAsync(req.body);
let responsiblepartyconsent = await OrmHelper.DB.getRepository(ResponsiblePartyConsent)
.createQueryBuilder("ResponsiblePartyConsent")
.where("ResponsiblePartyConsent.id = :id", { id: param.id })
.getOne();
if (!responsiblepartyconsent) throw { message: "Responsible Party Consent " + Language.lang.failed_not_found };
responsiblepartyconsent.body = param.bodytext;
responsiblepartyconsent.type = param.type;
responsiblepartyconsent.updated_by = req.auth?.data.name;
responsiblepartyconsent.updated_at = moment().toDate();
await queryRunner.manager.save(responsiblepartyconsent);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, responsiblepartyconsent);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
}

View File

@ -1,578 +0,0 @@
import { Room, Paging, Service, SpecialistForm } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { RoomModel } from "../model/room";
import { DepartmentModel } from "../model/department";
import { ServiceClassModel } from "../model/service_class";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
import fileUpload from "express-fileupload";
import { v4 as uuidv4 } from "uuid";
import fs from "fs";
import path from "path";
import { Brackets, In } from "typeorm";
import config from "../../config/stag.json";
const log: Logger<ILogObj> = new Logger({
name: "[RoomController]",
type: "pretty",
});
interface FileUploadRequest extends Request {
files?: fileUpload.FileArray | null;
body: any;
}
export class RoomController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (status, code, departmentId, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
var query = await RoomModel.list(filterObj);
query.leftJoinAndSelect("Room.department", "department");
query.leftJoinAndSelect("Room.serviceclass", "serviceclass");
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
query.andWhere(
new Brackets((qb) => {
qb.where("Room.code ILIKE :searchVal", { searchVal: anyVal })
.orWhere("Room.room ILIKE :searchVal", { searchVal: anyVal })
.orWhere("Room.number ILIKE :searchVal", { searchVal: anyVal })
.orWhere("department.name ILIKE :searchVal", { searchVal: anyVal });
}),
);
}
const offset = (param.page - 1) * param.limit;
const res_list = query
.orderBy("Room." + param.order_field, param.order_direction)
.take(param.limit)
.skip(offset);
if (param.with_deleted) {
res_list.withDeleted();
}
const photoBaseUrl = config.server.host_swagger + "uploads/room-picture/";
const current_page = param.page;
const [list_data, total_count_data] = await res_list.getManyAndCount();
const mapped_data = list_data.map((item: any) => ({
...item,
picture: item.picture ? photoBaseUrl + item.picture : null,
}));
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, mapped_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = {
in: 'query',
type: 'string',
required: false,
description: 'Department Id (optional)'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().optional().label("Department Id"),
});
let param: any = await schema.validateAsync(req.query);
const query = await RoomModel.list();
query.select(["Room.id", "Room.room"]).orderBy("Room.room", "ASC");
// ✅ optional filter by departmentId
if (param.id) {
query.andWhere("Room.departmentId = :departmentId", {
departmentId: param.id,
});
}
const total_count_data = await query.getCount();
const list_data = await query.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, 1, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/room" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
room: Joi.string().max(256).required().label("Room"),
code: Joi.string().max(128).required().label("Code"),
number: Joi.string().allow("").max(128).optional().label("Number"),
description: Joi.string().allow("").max(512).optional().label("Description"),
department_id: Joi.string().uuid().required().label("Department ID"),
serviceclass: Joi.string().uuid().required().label("Service Class ID"),
status: Joi.string().required().label("Status"),
location: Joi.string().required().label("Location"),
floor: Joi.number().required().label("Floor"),
picture: Joi.string().required().label("picture"),
specialist_form: Joi.string().valid(...Object.values(SpecialistForm)).optional().allow(null, "").label("Specialist Form"),
});
let param: any = await schema.validateAsync(req.body);
let exist = await RoomModel.list({ code: param.code }).then((q) => q.getOne());
if (exist) throw { message: "Room " + Language.lang.failed_duplicate };
let department = await DepartmentModel.list({ id: param.department_id }).then((q) => q.getOne());
if (!department) throw { message: "Department not found" };
let serviceclass = await ServiceClassModel.list({ id: param.serviceclass }).then((q) => q.getOne());
if (!serviceclass) throw { message: "Class not found" };
let room = new Room();
room.room = param.room;
room.code = param.code;
room.number = param.number || null;
room.description = param.description || null;
room.department = department;
room.serviceclass = param.serviceclass;
room.status = param.status;
room.location = param.location;
room.picture = param.picture;
room.floor = param.floor;
room.specialist_form = param.specialist_form || null;
room.created_by = req.auth?.data.name;
room.updated_by = req.auth?.data.name;
await queryRunner.manager.save(room);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, room);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room Id"),
});
let param: any = await schema.validateAsync(req.params);
let room = await RoomModel.list({ "Room.id": param.id }).then((q) => q.leftJoinAndSelect("Room.department", "department").leftJoinAndSelect("Room.serviceclass", "serviceclass").getOne());
if (!room) throw { message: "Room Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, room);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/room" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room ID"),
room: Joi.string().max(256).required().label("Room"),
code: Joi.string().max(128).required().label("Code"),
number: Joi.string().allow("").max(128).optional().label("Number"),
description: Joi.string().allow("").max(512).optional().label("Description"),
department_id: Joi.string().uuid().required().label("Department ID"),
serviceclass: Joi.string().uuid().required().label("Service Class ID"),
floor: Joi.number().required().label("Floor"),
status: Joi.string().required().label("Status"),
location: Joi.string().required().label("Location"),
picture: Joi.string().required().label("picture"),
specialist_form: Joi.string().valid(...Object.values(SpecialistForm)).optional().allow(null, "").label("Specialist Form"),
});
let param: any = await schema.validateAsync(req.body);
let exist = await RoomModel.list({ code: param.code }).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Room " + Language.lang.failed_duplicate };
let department = await DepartmentModel.list({ id: param.department_id }).then((q) => q.getOne());
if (!department) throw { message: "Department not found" };
let serviceclass = await ServiceClassModel.list({ id: param.serviceclass }).then((q) => q.getOne());
if (!serviceclass) throw { message: "Class not found" };
let room = await RoomModel.list({ "Room.id": param.id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
room.room = param.room;
room.code = param.code;
room.number = param.number || null;
room.description = param.description || null;
room.serviceclass = param.serviceclass;
room.department = department;
room.status = param.status;
room.floor = param.floor;
room.location = param.location;
room.picture = param.picture;
room.specialist_form = param.specialist_form || null;
room.updated_by = req.auth?.data.name;
await queryRunner.manager.save(room);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, room);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let room: Room = await RoomModel.list({ "Room.id": param.id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
room.deleted_by = req.auth?.data.name;
room.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(room);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(Room);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Room);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
static async uploadpicture(req: FileUploadRequest, res: Response, next: NextFunction): Promise<Response> {
/* #swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.consumes = ['multipart/form-data']
#swagger.requestBody = {
required: true,
content: {
"multipart/form-data": {
schema: {
type: "object",
properties: {
file: {
type: "string",
format: "binary",
description: "Image file (max 1MB, jpg/png/webp)"
},
},
required: ["file"]
}
}
}
}
*/
try {
// Validation schema
const schema = Joi.object().keys({
// path: Joi.string().label('File Path'),
// application: Joi.string().label('Application'),
});
log.info("body", req.body);
// const param: { path: string, application: string } = await schema.validateAsync(req.body);
// Check if file exists
if (!req.files || !req.files.file) {
return ReturnHelper.errorResponse(res, 400, 404, Language.lang.failed_insert, "File not found");
}
const file = req.files.file as fileUpload.UploadedFile;
// Validate file size (max 1MB)
const maxSize = 1024 * 1024; // 1MB
if (file.size > maxSize) {
return ReturnHelper.errorResponse(res, 400, 400, Language.lang.failed_insert, "File size exceeds 1MB limit");
}
// Validate file type
const allowedMimes = ["image/jpeg", "image/jpg", "image/png", "image/webp", "image/svg+xml", "image/svg"];
if (!allowedMimes.includes(file.mimetype)) {
return ReturnHelper.errorResponse(res, 400, 400, Language.lang.failed_insert, "Invalid file type. Only JPG, PNG, WEBP, and SVG are allowed");
}
// Normalize path
// param.path = param.path[param.path.length - 1] !== '/' ? param.path + '/' : param.path;
// if (param.path == undefined || param.path == null) param.path = 'uploads/room-picture/';
// Generate unique filename
const ext = file.name.split(".");
const name = uuidv4() + "." + ext[ext.length - 1];
const result: { file: string } = {
// url: "",
// path: "",
file: "",
// mime: file.mimetype,
// size: file.size,
// md5: file.md5
};
const folder_path = "uploads/room-picture/";
const file_path = path.join(folder_path, name);
// Create directory if it doesn't exist
if (!fs.existsSync(folder_path)) {
fs.mkdirSync(folder_path, { recursive: true });
}
// Move file to destination
await file.mv(file_path);
// result.path = param.path[param.path.length - 1] === '/' ? param.path.substring(0, param.path.length - 1) : param.path;
result.file = name;
// result.url = `${result.path}/${name}`; // Generate URL
log.info(`File uploaded successfully: ${file_path}`);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, result);
} catch (e: unknown) {
// Proper error logging to avoid tslog serialization issues
if (e instanceof Error) {
log.error("File upload failed:", {
message: e.message,
stack: e.stack,
name: e.name,
});
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, e.message);
} else {
log.error("File upload failed with unknown error:", String(e));
return ReturnHelper.errorResponse(res, 500, 500, Language.lang.failed_insert, "Unknown error occurred");
}
}
}
static async deletepicture(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/files" } } } }
*/
try {
const schema = Joi.object().keys({
file_name: Joi.string().required().label("File Name"),
});
const param: { file_name: string } = await schema.validateAsync(req.body);
// Prevent deletion of files starting with "template_"
if (param.file_name.startsWith("template_")) {
return ReturnHelper.errorResponse(res, 403, 403, Language.lang.failed_delete, "Cannot delete files that start with 'template_'");
}
// const env = process.env.NODE_ENV + '/'
const fixedPath = "uploads/room-picture/";
const file_path = fixedPath + param.file_name;
// Check if file exists
if (!fs.existsSync(file_path)) {
return ReturnHelper.errorResponse(res, 404, 404, Language.lang.failed_not_found, "File not found");
}
// Delete file
fs.unlinkSync(file_path);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async gettemplatepicture(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.description = 'Get all room pictures from uploads/room-picture/template directory".'
*/
try {
const filePath = "uploads/room-picture/template/";
if (!fs.existsSync(filePath)) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, []);
}
const files = fs.readdirSync(filePath);
const photoBaseUrl = config.server.host_swagger + "uploads/room-picture/template/";
const filesWithUrl = files.map((filename, index) => ({
id: index,
name: `template/${filename}`,
url: photoBaseUrl + filename,
}));
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, filesWithUrl);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_view, err.message);
}
}
static async listLocation(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const query = await RoomModel.list();
const list_data = await query
.select(["Room.id AS id", "Room.room AS room", "Room.location AS location"])
.orderBy("Room.location", "ASC")
.addOrderBy("Room.room", "ASC")
.getRawMany();
const grouped_data = list_data.reduce(
(acc: Record<string, Array<{ id: string; room: string }>>, item: { id: string; room: string; location: string }) => {
const locationKey = item.location || "unknown";
if (!acc[locationKey]) {
acc[locationKey] = [];
}
acc[locationKey].push({
id: item.id,
room: item.room,
});
return acc;
},
{},
);
const formatted_data = Object.entries(grouped_data).map(([location, rooms]) => ({
location,
rooms,
}));
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, formatted_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
}

View File

@ -1,237 +0,0 @@
import { RoomNumber, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { RoomNumberModel } from "../model/room_number";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[RoomNumberController]",
type: "pretty",
});
export class RoomNumberController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (number, departmentId, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
var query = await RoomNumberModel.list(filterObj);
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
query.andWhere("RoomNumber.number ILIKE :any", { any: anyVal });
}
const offset = (param.page - 1) * param.limit;
const res_count = query;
const res_list = query
.orderBy("RoomNumber." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/room_number" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
number: Joi.string().max(256).required().label("Room Number"),
});
let param: any = await schema.validateAsync(req.body);
let exist = await RoomNumberModel.list({ number: param.number }).then((q) => q.getOne());
if (exist) throw { message: "Room Number " + Language.lang.failed_duplicate };
let roomNumber = new RoomNumber();
roomNumber.number = param.number;
roomNumber.created_by = req.auth?.data.name;
roomNumber.updated_by = req.auth?.data.name;
await queryRunner.manager.save(roomNumber);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, roomNumber);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room Number Id"),
});
let param: any = await schema.validateAsync(req.params);
let roomNumber = await RoomNumberModel.list({ "RoomNumber.id": param.id }).then((q) => q.getOne());
if (!roomNumber) throw { message: "Room Number Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, roomNumber);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/room_number" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
number: Joi.string().max(256).required().label("Room Number"),
});
let param: any = await schema.validateAsync(req.body);
let exist = await RoomNumberModel.list({ number: param.number }).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Room Number " + Language.lang.failed_duplicate };
let roomNumber = await RoomNumberModel.list({ "RoomNumber.id": param.id }).then((q) => q.getOne());
if (!roomNumber) throw { message: "Room Number " + Language.lang.failed_not_found };
roomNumber.number = param.number;
roomNumber.updated_by = req.auth?.data.name;
await queryRunner.manager.save(roomNumber);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, roomNumber);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let roomNumber: RoomNumber = await RoomNumberModel.list({ "RoomNumber.id": param.id }).then((q) => q.getOne());
if (!roomNumber) throw { message: "Room Number " + Language.lang.failed_not_found };
roomNumber.deleted_by = req.auth?.data.name;
roomNumber.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(roomNumber);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(RoomNumber);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RoomNumber']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(RoomNumber);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,406 +0,0 @@
import { Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceModel } from "../model/service";
import { RoomServicesModel } from "../model/room_services";
import { RoomModel } from "../model/room";
import { DepartmentModel } from "../model/department";
import { OrmHelper } from "../helpers/orm";
const log: Logger<ILogObj> = new Logger({
name: "[RoomServicesController]",
type: "pretty",
});
export class RoomServicesController {
// Controller - List (Room-sided, default)
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room Services']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = {
description: 'Filter data in JSON format. Available fields: {\"any\": \"value\"} for searching by Room.code, Room.room, or Department.name (case-insensitive, supports partial match)',
in: 'query',
type: 'string',
example: '{\"any\": \"radiology\"}'
}
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
// Get total count of rooms
const query = await RoomServicesModel.listByRoom(filterObj, param.with_deleted);
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
query.andWhere(
"(Room.code ILIKE :any OR Room.room ILIKE :any OR Department.name ILIKE :any)",
{ any: anyVal }
);
}
const total_count_data = await query.getCount();
// Get all rooms with services
const rooms = await query
.orderBy("Room." + param.order_field, param.order_direction)
.skip((param.page - 1) * param.limit)
.take(param.limit)
.getMany();
const { byTypeId, typeMeta } = await RoomServicesModel.getActiveServicesGroupedByType();
const list_data = rooms.map((room) => {
const service_types = RoomServicesModel.deriveTypesForRoomWithMap(room, byTypeId, typeMeta);
return {
id: room.id,
room: room.room,
code: room.code,
description: room.description,
status: room.status,
department: room.department
? {
id: room.department.id,
name: room.department.name,
}
: null,
service_types,
services: room.services
? room.services.map((service) => ({
id: service.id,
name: service.name,
service_type: service.serviceType
? {
id: service.serviceType.id,
name: service.serviceType.name,
}
: null,
}))
: [],
};
});
const count_data = list_data.length;
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
count_data,
param.page,
total_count_data,
list_data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
}
}
// Controller - List by Service (Service-sided)
static async listServices(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room Services']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['room_id'] = { description: 'Room ID', in: 'path', type: 'string' }
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
const roomId = req.params["room_id"];
const room = await RoomModel.list({ "Room.id": roomId }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ServiceModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const base_query = query
.select([
"Service.id",
"Service.name",
"Service.created_at",
"Service.created_by",
"serviceType.id",
"serviceType.name",
"serviceFare.id",
"serviceFare.fare",
"fareType.id",
"fareType.name",
])
.leftJoin("Service.serviceType", "serviceType")
.leftJoin("Service.rooms", "room")
.innerJoin("Service.servicefare", "serviceFare")
.innerJoin("serviceFare.serviceClass", "serviceClass")
.innerJoin("serviceFare.faretype", "fareType")
.andWhere("room.id = :roomId", { roomId });
// .select([
// "Service.id",
// "Service.name",
// "Service.created_at",
// "Service.created_by",
// "serviceType.id",
// "serviceType.name",
// "serviceFare.id",
// "serviceFare.fare",
// "fareType.id",
// "fareType.name",
// ])
// .leftJoin("Service.serviceType", "serviceType")
// .leftJoin("Service.rooms", "room")
// .leftJoin("room.serviceclass", "roomClass")
// .innerJoin("Service.servicefare", "serviceFare")
// .innerJoin("serviceFare.serviceClass", "serviceClass", "serviceClass.id = roomClass.id")
// .innerJoin("serviceFare.faretype", "fareType")
// .andWhere("room.id = :roomId", { roomId });
const res_count = base_query.clone();
const res_list = base_query
.orderBy("Service." + param.order_field, param.order_direction)
.skip(offset)
.take(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room Services']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: 'Room ID', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room ID"),
});
let param: any = await schema.validateAsync(req.params);
let room = await RoomModel.list({ "Room.id": param.id })
.then((q) => q.leftJoinAndSelect("Room.services", "s")
.leftJoinAndSelect("s.serviceType", "serviceType")
.leftJoinAndSelect("Room.department", "department").getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
const detail_data = await RoomServicesModel.formatRoomResponse(room);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, detail_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_not_found,
err.message
);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room Services']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: 'Room ID', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/roomServices" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room ID"),
service_type_ids: Joi.array().items(Joi.string().uuid()).default([]).label("Service Type IDs"),
});
let param: any = await schema.validateAsync(req.body);
let room = await RoomModel.list({ "Room.id": param.id })
.then((q) => q.leftJoinAndSelect("Room.services", "s")
.leftJoinAndSelect("Room.department", "department").getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
room = await RoomServicesModel.applyTypesToRoom(
queryRunner.manager,
room,
param.service_type_ids ?? [],
req.auth.data.name
);
await queryRunner.commitTransaction();
const response_data = await RoomServicesModel.formatRoomResponse(
room,
queryRunner.manager
);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, response_data);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
// Controller - List Ancillary Services (Service-sided)
static async listAncillaryServices(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Room Services']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ServiceModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const base_query = query
.select([
"Service.id",
"Service.name",
"Service.created_at",
"Service.created_by",
"serviceType.id",
"serviceType.name",
"serviceFare.id",
"serviceFare.fare",
"fareType.id",
"fareType.name",
"room.id",
"room.room",
])
.leftJoin("Service.serviceType", "serviceType")
.leftJoin("Service.rooms", "room")
.leftJoin("room.department", "department")
.innerJoin("Service.servicefare", "serviceFare")
.innerJoin("serviceFare.serviceClass", "serviceClass")
.innerJoin("serviceFare.faretype", "fareType")
.andWhere("department.code = :code", { code: "08" });
const res_count = base_query.clone();
const res_list = base_query
.orderBy("Service." + param.order_field, param.order_direction)
.skip(offset)
.take(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
}
}
}

View File

@ -1,507 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { RoomToPharmacy, Paging, Room } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { RoomToPharmacyModel } from "../model/room_to_pharmacy";
const log: Logger<ILogObj> = new Logger({ name: '[RoomToPharmacyController]', type: 'pretty' });
export class RoomToPharmacyController {
// static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
// /*
// #swagger.tags = ['RoomToPharmacy']
// #swagger.security = [{ "bearerAuth": [] }]
// #swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
// #swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
// #swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
// #swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
// #swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
// #swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
// */
// try {
// const schema = Joi.object().keys({
// filter: Joi.string().allow("").optional().label("Filter"),
// page: Joi.number().required().min(1).label("Page"),
// limit: Joi.number().required().min(1).label("Limit"),
// with_deleted: Joi.bool().required().label("With Deleted"),
// order_field: Joi.string().required().label("Order Field"),
// order_direction: Joi.string().allow("ASC", "DESC").required().label("Order Direction"),
// });
// const param: Paging = await schema.validateAsync(req.query);
// const filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
// const filterAny = filter.any && filter.any !== "" ? filter.any : "";
// let filterObj = { ...filter } as any;
// delete filterObj.any;
// const query = await RoomToPharmacyModel.list(filterObj);
// const offset = (param.page - 1) * param.limit;
// const res_count = query;
// const res_list = query
// .leftJoinAndSelect("room_to_pharmacy.pharmacy_room", "emrregistration")
// .leftJoinAndSelect("room_to_pharmacy.room", "room")
// .orderBy("room_to_pharmacy." + param.order_field, param.order_direction)
// .offset(offset)
// .limit(param.limit);
// if (param.with_deleted) {
// res_count.withDeleted();
// res_list.withDeleted();
// }
// const current_page = param.page;
// const total_count_data = await res_count.getCount();
// const list_data = await res_list.getMany();
// const count_data = CommonHelper.countObject(list_data);
// return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
// } catch (e: unknown) {
// log.error(e);
// const err = e as Error;
// return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
// }
// }
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomToPharmacy']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = {
description: "Filter in JSON format. Available fields: room (string, partial match case-insensitive), code (string, partial match case-insensitive), status (string, exact match), pharmacy_room (string, partial match case-insensitive). Example: {\"room\":\"igd\",\"code\":\"R01\",\"status\":\"active\",\"pharmacy_room\":\"apotek\"}",
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
const roomQuery = OrmHelper.DB.getRepository(Room)
.createQueryBuilder("room")
.leftJoinAndSelect("room.department", "department")
.leftJoinAndMapMany(
"room.roomToPharmacies",
RoomToPharmacy,
"room_to_pharmacy",
"room_to_pharmacy.room_id = room.id"
)
.leftJoinAndMapOne(
"room_to_pharmacy.pharmacy_room",
Room,
"pharmacy_room",
"pharmacy_room.id = room_to_pharmacy.pharmacy_room_id"
)
.where("department.id IN (:...departmentIds)", {
departmentIds: [
'42bc42a7-e2a7-4f95-a788-9d9e51a51a20',
'3fc39ff1-b4bc-4276-92ef-def7ca9432fb',
'a0d2ef11-6927-4e5c-8628-6acf26351071',
]
})
.orderBy("room." + param.order_field, param.order_direction as "ASC" | "DESC");
if (param.with_deleted) {
roomQuery.withDeleted();
}
// Filter tambahan jika ada
const roomNameFilter = filter["room.name"] ?? filter.room;
if (roomNameFilter !== undefined && roomNameFilter !== "") {
const roomVal = String(roomNameFilter);
roomQuery.andWhere("room.room ILIKE :room", { room: roomVal.includes("%") ? roomVal : `%${roomVal}%` });
}
if (filter.status) {
roomQuery.andWhere("room.status = :status", { status: filter.status });
}
// Filter room.code
if (filter.code && filter.code !== "") {
roomQuery.andWhere("room.code ILIKE :code", { code: `%${filter.code}%` });
}
// Filter pharmacy_room.room
if (filter.pharmacy_room && filter.pharmacy_room !== "") {
roomQuery.andWhere("pharmacy_room.room ILIKE :pharmacy_room", { pharmacy_room: `%${filter.pharmacy_room}%` });
}
const total_count_data = await roomQuery.clone().getCount();
const rooms = await roomQuery
.offset(offset)
.limit(limit)
.getMany();
// Transform: { room_name: { pharmacy_room_1: {}, pharmacy_room_2: {} } }
const list_data_return = rooms.map((room: any) => {
const roomToPharmacies: any[] = room.roomToPharmacies ?? [];
const pharmacyRooms: Record<string, any> = {};
roomToPharmacies.forEach((rtp: any, index: number) => {
const pharmacy: Room | null = rtp.pharmacy_room ?? null;
pharmacyRooms[`pharmacy_room_${index + 1}`] = pharmacy ? {
id: pharmacy.id,
room: pharmacy.room,
code: pharmacy.code,
description: pharmacy.description ?? null,
status: pharmacy.status,
} : null;
});
return {
rooms: {
id: room.id,
room: room.room,
code: room.code,
description: room.description ?? null,
status: room.status,
department: room.department ? {
id: room.department.id,
name: room.department.name,
} : null,
pharmacy_rooms: Object.keys(pharmacyRooms).length > 0
? pharmacyRooms
: null,
}
};
});
const count_data = CommonHelper.countObject(list_data_return);
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
count_data,
param.page,
total_count_data,
list_data_return
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomToPharmacy']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await RoomToPharmacyModel.list(filter);
const data = await query.getMany();
const filename = "room_to_pharmacy.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: RoomToPharmacy): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RoomToPharmacy']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/room_to_pharmacy"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
pharmacy_room_id: Joi.string()
.uuid()
.required()
.label("Pharmacy Room ID"),
room_id: Joi.string()
.uuid()
.required()
.label("Room ID"),
// room_ids: Joi.array()
// .items(Joi.string().uuid().required())
// .min(1)
// .required()
// .label("Room IDs")
});
const param: any = await schema.validateAsync(req.body);
const data = new RoomToPharmacy()
data.pharmacy_room = param.pharmacy_room_id;
data.room = param.room_id;
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
// await RoomToPharmacyRepo
// .createQueryBuilder()
// .delete()
// .from(RoomToPharmacy)
// .where("pharmacy_room_id = :pharmacyRoomId", { pharmacyRoomId: param.pharmacy_room_id })
// .execute();
// let relation : RoomToPharmacy;
// for (const roomId of param.room_ids) {
// relation = new RoomToPharmacy();
// relation.room = await roomRepo.findOneBy({ id: roomId });
// relation.pharmacy_room = await roomRepo.findOneBy({ id: param.pharmacy_room_id });
// relation.created_by = req.auth.data.name;
// await RoomToPharmacyRepo.save(relation);
// }
// const data = await RoomToPharmacyRepo.createQueryBuilder("room_to_pharmacy")
// .leftJoinAndSelect("room_to_pharmacy.room", "room")
// .leftJoinAndSelect("room_to_pharmacy.pharmacy_room", "pharmacy_room")
// .where("room_to_pharmacy.pharmacy_room_id = :pharmacyRoomId", { pharmacyRoomId: param.pharmacy_room_id }).getMany();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['RoomToPharmacy']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['room_id'] = {
in: 'path',
description: 'Room ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/room_to_pharmacy"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
room_id: Joi.string().uuid().required(),
pharmacy_room_id: Joi.string().uuid().required(),
});
req.body.room_id = req.params['room_id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(RoomToPharmacy);
// ✅ cari berdasarkan room saja
let data = await repo.findOne({
where: {
room: { id: param.room_id }
},
relations: ["room", "pharmacy_room"]
});
// ambil pharmacy room
const pharmacyRoom = await OrmHelper.DB.getRepository(Room).findOneBy({
id: param.pharmacy_room_id
});
if (!pharmacyRoom) {
throw new Error("Pharmacy Room not found");
}
if (data) {
data.pharmacy_room = pharmacyRoom;
data.updated_by = req.auth?.data.name;
await repo.save(data);
} else {
const room = await OrmHelper.DB.getRepository(Room).findOneBy({
id: param.room_id
});
if (!room) throw new Error("Room not found");
data = new RoomToPharmacy();
data.room = room;
data.pharmacy_room = pharmacyRoom;
data.created_by = req.auth?.data.name;
data.updated_by = req.auth?.data.name;
await repo.save(data);
}
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_update,
data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
500,
401,
Language.lang.failed_update,
err.message
);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['RoomToPharmacy']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Room Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await OrmHelper.DB.getRepository(Room)
.createQueryBuilder("room")
.leftJoinAndSelect("room.department", "department")
.leftJoinAndMapMany(
"room.roomToPharmacies",
RoomToPharmacy,
"room_to_pharmacy",
"room_to_pharmacy.room_id = room.id"
)
.leftJoinAndMapOne(
"room_to_pharmacy.pharmacy_room",
Room,
"pharmacy_room",
"pharmacy_room.id = room_to_pharmacy.pharmacy_room_id"
)
.where("room.id = :id", { id: param.id })
.getOne();
if (!data) throw { message: "RoomToPharmacy Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,407 +0,0 @@
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ScheduleModel } from "../model/schedule";
import CommonHelper from "../helpers/common";
const log: Logger<ILogObj> = new Logger({
name: "[ScheduleController]",
type: "pretty",
});
export class ScheduleController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
#swagger.responses[200] = {
description: 'Schedule series paginated list',
schema: {
status: true,
code: 200,
message: 'success',
data: { count: 1, page: 1, total_count: 1, list: [{ id: 'uuid-string', title: 'Practice Schedule' }] }
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
const param: {
filter?: string;
page: number;
limit: number;
with_deleted: boolean;
order_field: string;
order_direction: "asc" | "desc";
} = await schema.validateAsync(req.query);
const filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
const filterObj = { ...filter } as any;
delete filterObj.any;
const query = await ScheduleModel.listSeries(filterObj);
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
query.andWhere(
"(ScheduleSeries.title ILIKE :any OR Room.room ILIKE :any OR Room.code ILIKE :any OR Doctor.name ILIKE :any OR Doctor.username ILIKE :any)",
{ any: anyVal }
);
}
const orderDirection = param.order_direction.toUpperCase() as "ASC" | "DESC";
const offset = (param.page - 1) * param.limit;
const resCount = query;
const resList = query
.orderBy("ScheduleSeries." + param.order_field, orderDirection)
.offset(offset)
.limit(param.limit);
if (param.with_deleted) {
resCount.withDeleted();
resList.withDeleted();
}
const currentPage = param.page;
const totalCountData = await resCount.getCount();
const listData = await resList.getMany();
const countData = CommonHelper.countObject(listData);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, countData, currentPage, totalCountData, listData);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async options(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { in: 'query', required: false, type: 'string', description: 'Filter by room id (optional)' }
#swagger.responses[200] = {
description: 'Schedule options',
schema: {
status: true,
code: 200,
message: 'success',
data: {
doctors: [{ id: 'uuid-string', title: 'Doctor Name' }],
rooms: [{ id: 'uuid-string', title: 'Room Name' }]
}
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
});
const param: { filter?: string } = await schema.validateAsync(req.query);
const filterObj = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const result = await ScheduleModel.getScheduleOptions(filterObj);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async calendar(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['start_date'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['end_date'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['filter'] = { in: 'query', required: false, type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: false, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: false, type: 'number' }
#swagger.responses[200] = {
description: 'Schedule calendar rooms and events',
schema: {
status: true,
code: 200,
message: 'success',
data: {
count: 1,
page: 1,
total_count: 1,
list: {
rooms: [{
id: 'uuid-string',
name: 'string',
code: 'string',
picture: 'string',
location: 'string',
status: 'string',
department: {
name: 'string',
},
}],
events: [{
id: 'occ:series-101:2026-03-20',
series_id: 'series-101',
room_id: 'room-1',
room_name: 'Room 1',
doctor_id: 'doctor-1',
doctor_name: 'Doctor 1',
title: 'Practice',
start_at: '2026-03-20T09:00:00+07:00',
end_at: '2026-03-20T12:00:00+07:00',
quota: 10,
used_quota: 5,
left_quota: 5,
is_recurring: true,
is_exception: false,
status: 'confirmed'
}],
}
}
}
}
*/
try {
const schema = Joi.object().keys({
start_date: Joi.string().required().label("Start Date"),
end_date: Joi.string().required().label("End Date"),
filter: Joi.string().allow("").optional().label("Filter"),
limit: Joi.number().min(1).optional().label("Limit"),
page: Joi.number().min(1).optional().label("Page"),
});
const param: {
start_date: string;
end_date: string;
filter?: string;
limit?: number;
page?: number;
} = await schema.validateAsync(req.query);
const filterObj = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const result = await ScheduleModel.getScheduleCalendarRange(param.start_date, param.end_date, filterObj, {
limit: param.limit,
page: param.page,
});
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.responses[200] = {
description: 'Schedule series detail',
schema: {
status: true,
code: 200,
message: 'success',
data: {
series: {
id: 'uuid-string',
title: 'Practice Schedule',
recurrence: { $ref: '#/components/schemas/scheduleRecurrence' }
},
exceptions: [{ id: 'uuid-string', occurrence_date: '2026-03-24' }]
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Series ID"),
});
const param: { id: string } = await schema.validateAsync(req.params);
const result = await ScheduleModel.getSeriesById(param.id);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/scheduleSeriesCreate" } } } }
#swagger.responses[200] = {
description: 'Schedule series created',
schema: { status: true, code: 200, message: 'success', data: { id: 'uuid-string' } }
}
*/
try {
const schema = Joi.object().keys({
roomId: Joi.string().uuid().required(),
doctorId: Joi.string().uuid().required(),
title: Joi.string().max(256).required(),
quota: Joi.number().integer().min(0).allow(null).optional(),
startDate: Joi.string().required(),
untilDate: Joi.string().allow("", null).optional(),
startTime: Joi.string().required(),
endTime: Joi.string().required(),
recurrence: Joi.object({
type: Joi.string().valid("daily", "weekly", "monthly").required(),
interval: Joi.number().min(1).optional(),
daysOfWeek: Joi.array().items(Joi.string().valid("SU", "MO", "TU", "WE", "TH", "FR", "SA")).optional(),
})
.allow(null)
.optional(),
});
const param = await schema.validateAsync(req.body);
const actor = req.auth?.data?.name || "system";
const result = await ScheduleModel.createSeries(param, actor);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/scheduleSeriesUpdate" } } } }
#swagger.responses[200] = {
description: 'Schedule series updated',
schema: { status: true, code: 200, message: 'success', data: { id: 'uuid-string' } }
}
*/
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required(),
roomId: Joi.string().uuid().required(),
doctorId: Joi.string().uuid().required(),
title: Joi.string().max(256).required(),
quota: Joi.number().integer().min(0).allow(null).optional(),
startDate: Joi.string().required(),
untilDate: Joi.string().allow("", null).optional(),
startTime: Joi.string().required(),
endTime: Joi.string().required(),
recurrence: Joi.object({
type: Joi.string().valid("daily", "weekly", "monthly").required(),
interval: Joi.number().min(1).optional(),
daysOfWeek: Joi.array().items(Joi.string().valid("SU", "MO", "TU", "WE", "TH", "FR", "SA")).optional(),
})
.allow(null)
.optional(),
});
const param = await schema.validateAsync(req.body);
const actor = req.auth?.data?.name || "system";
const result = await ScheduleModel.updateSeries(param.id, param, actor);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_update, err.message);
}
}
static async createException(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/scheduleExceptionCreate" } } } }
#swagger.responses[200] = {
description: 'Schedule exception created or updated',
schema: { status: true, code: 200, message: 'success', data: { id: 'uuid-string' } }
}
*/
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required(),
occurrenceDate: Joi.string().required(),
isCancelled: Joi.boolean().optional(),
overrideRoomId: Joi.string().uuid().allow("", null).optional(),
overrideDoctorId: Joi.string().uuid().allow("", null).optional(),
overrideTitle: Joi.string().max(256).allow("", null).optional(),
overrideStartAt: Joi.string().allow("", null).optional(),
overrideEndAt: Joi.string().allow("", null).optional(),
});
const param = await schema.validateAsync(req.body);
const actor = req.auth?.data?.name || "system";
const result = await ScheduleModel.createSeriesException(param.id, param, actor);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, result);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Schedule']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
#swagger.responses[200] = {
description: 'Schedule series deleted',
schema: { status: true, code: 200, message: 'success', data: {} }
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.alternatives()
.try(Joi.boolean(), Joi.string().valid("", "true", "false", "1", "0"))
.optional()
.label("Is hard delete?"),
});
const param: { id: string; hard?: boolean | string } = await schema.validateAsync(req.params);
const isHardDelete =
param.hard === true || param.hard === "true" || param.hard === "1";
const actor = req.auth?.data?.name || "system";
const affected = await ScheduleModel.deleteSeries(param.id, isHardDelete, actor);
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,348 +0,0 @@
import { Service, Paging, Status } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceModel } from "../model/service";
import { ServiceTypeModel } from "../model/service_type";
import { ServiceFareModel } from "../model/service_fare";
import { RoomServicesModel } from "../model/room_services";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ServiceController]",
type: "pretty",
});
export class ServiceController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: false, type: 'string', default: 'created_at' }
#swagger.parameters['order_direction'] = { in: 'query', required: false, schema: { '@enum': ['ASC', 'DESC'], default: 'DESC' } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().optional().default("created_at").label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").optional().default("desc").label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
var query = await ServiceModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("Service." + param.order_field, param.order_direction)
.leftJoinAndSelect("Service.serviceType", "serviceType")
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/service" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
service_type_id: Joi.string().uuid().required().label("Service Type ID"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let serviceType = await ServiceTypeModel.list({ id: param.service_type_id }).then((q) => q.getOne());
if (!serviceType) throw { message: "Service Type not found" };
let service = new Service();
service.name = param.name;
service.serviceType = serviceType;
service.status = param.status;
service.created_by = req.auth?.data.name;
service.updated_by = req.auth?.data.name;
await queryRunner.manager.save(service);
await queryRunner.commitTransaction();
const saved = await ServiceModel.list({ "Service.id": service.id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "serviceType").getOne());
if (saved) {
await RoomServicesModel.syncRoomsOnServiceCreated(OrmHelper.DB.manager, saved);
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, service);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Id"),
});
let param: any = await schema.validateAsync(req.params);
let service = await ServiceModel.list({ "Service.id": param.id })
.then((q) => q
.leftJoinAndSelect("Service.serviceType", "serviceType")
.getOne());
if (!service) throw { message: "Service Not Found" };
let serviceFares = await ServiceFareModel.list({ "ServiceFare.serviceId": param.id })
.then((q) => q
.leftJoinAndSelect("ServiceFare.serviceClass", "serviceClass")
.getMany());
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, { ...service, serviceFares });
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/service" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service ID"),
name: Joi.string().max(256).required().label("Name"),
service_type_id: Joi.string().uuid().required().label("Service Type ID"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let serviceType = await ServiceTypeModel.list({ id: param.service_type_id }).then((q) => q.getOne());
if (!serviceType) throw { message: "Service Type not found" };
let service = await ServiceModel.list({ "Service.id": param.id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "st").getOne());
if (!service) throw { message: "Service " + Language.lang.failed_not_found };
const oldTypeId = service.serviceType?.id;
service.name = param.name;
service.serviceType = serviceType;
service.status = param.status;
service.updated_by = req.auth?.data.name;
await queryRunner.manager.save(service);
await queryRunner.commitTransaction();
const saved = await ServiceModel.list({ "Service.id": service.id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "serviceType").getOne());
if (saved) {
await RoomServicesModel.syncRoomsOnServiceUpdated(
OrmHelper.DB.manager,
saved,
oldTypeId
);
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, service);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
// static async updateservicerooms(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
// /*
// #swagger.tags = ['Service']
// #swagger.security = [{ "bearerAuth": [] }]
// #swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
// #swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/servicerooms" } } } }
// */
// const queryRunner = OrmHelper.DB.createQueryRunner();
// await queryRunner.startTransaction();
// try {
// req.body.id = req.params["id"];
// const schema = Joi.object().keys({
// id: Joi.string().uuid().required().label("Service ID"),
// room_ids: Joi.array().items(Joi.string().uuid()).optional().label("Room IDs"),
// });
// let param: any = await schema.validateAsync(req.body);
// let service = await ServiceModel.list({ "Service.id": param.id })
// .then((q) => q.leftJoinAndSelect("Service.serviceType", "st").leftJoinAndSelect("Service.rooms", "r").getOne());
// if (!service) throw { message: "Service " + Language.lang.failed_not_found };
// let rooms: any[] = [];
// if (param.room_ids && param.room_ids.length > 0) {
// for (const roomId of param.room_ids) {
// const room = await RoomModel.list({ id: roomId }).then((q) => q.getOne());
// if (room) rooms.push(room);
// }
// }
// service.rooms = rooms;
// service.updated_by = req.auth.data.name;
// await queryRunner.manager.save(service);
// await queryRunner.commitTransaction();
// return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, service);
// } catch (e: unknown) {
// await queryRunner.rollbackTransaction();
// log.error(e);
// const err = e as Error;
// return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
// } finally {
// await queryRunner.release();
// }
// }
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let service: Service = await ServiceModel.list({ "Service.id": param.id }).then((q) => q.getOne());
if (!service) throw { message: "Service " + Language.lang.failed_not_found };
service.deleted_by = req.auth?.data.name;
service.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(service);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(Service);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
await RoomServicesModel.syncRoomsOnServiceDeleted(OrmHelper.DB.manager, param.id);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Service);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
const service = await ServiceModel.list({ "Service.id": param.id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "serviceType").getOne());
if (service && service.status === Status.Active) {
await RoomServicesModel.syncRoomsOnServiceCreated(OrmHelper.DB.manager, service);
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,251 +0,0 @@
import { ServiceClass, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceClassModel } from "../model/service_class";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ServiceClassController]",
type: "pretty",
});
export class ServiceClassController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ServiceClassModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("ServiceClass." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceClass" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ServiceClassModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Service Class " + Language.lang.failed_duplicate };
let serviceClass = new ServiceClass();
serviceClass.name = param.name;
serviceClass.created_by = req.auth.data.name;
serviceClass.updated_by = req.auth.data.name;
await queryRunner.manager.save(serviceClass);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, serviceClass);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Class Id"),
});
let param: any = await schema.validateAsync(req.params);
let serviceClass = await ServiceClassModel.list({ "ServiceClass.id": param.id }).then((q) => q.getOne());
if (!serviceClass) throw { message: "Service Class Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, serviceClass);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceClass" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Class ID"),
name: Joi.string().max(256).required().label("Name"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ServiceClassModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Service Class " + Language.lang.failed_duplicate };
let serviceClass = await ServiceClassModel.list({ "ServiceClass.id": param.id }).then((q) => q.getOne());
if (!serviceClass) throw { message: "Service Class " + Language.lang.failed_not_found };
serviceClass.name = param.name;
serviceClass.updated_by = req.auth.data.name;
await queryRunner.manager.save(serviceClass);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, serviceClass);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let serviceClass: ServiceClass = await ServiceClassModel.list({ "ServiceClass.id": param.id }).then((q) => q.getOne());
if (!serviceClass) throw { message: "Service Class " + Language.lang.failed_not_found };
serviceClass.deleted_by = req.auth.data.name;
serviceClass.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(serviceClass);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ServiceClass);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Class']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ServiceClass);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,216 +0,0 @@
import { Service, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceModel } from "../model/service";
import { ExaminationDetailModel } from "../model/examination_detail";
import { OrmHelper } from "../helpers/orm";
const log: Logger<ILogObj> = new Logger({
name: "[ServiceExaminationController]",
type: "pretty",
});
export class ServiceExaminationController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Examination']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter: plain text or JSON object (service_id, etc.)', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
var query = await ServiceModel.list(filter);
const res_count = query;
const res_list = query
.leftJoinAndSelect("Service.serviceType", "serviceType")
.leftJoinAndSelect("Service.examination_details", "examinationDetails")
.leftJoinAndSelect("examinationDetails.measurement_unit", "measurementUnit")
.leftJoinAndSelect("examinationDetails.reference_range", "referenceRange")
.orderBy("Service." + param.order_field, param.order_direction)
.skip(offset)
.take(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res, 200,
Language.lang.success_view,
count_data,
current_page,
total_count_data,
list_data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Examination']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: { $ref: "#/components/schemas/serviceExaminationCreate" }
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
service_id: Joi.string().uuid().required().label("Service ID"),
examination_detail_ids: Joi.array()
.items(Joi.string().uuid())
.optional()
.label("Examination Detail IDs"),
});
let param: any = await schema.validateAsync(req.body);
// ✅ ambil service
let service = await ServiceModel.list({ "Service.id": param.service_id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "st")
.leftJoinAndSelect("Service.examination_details", "ed")
.getOne());
if (!service) throw { message: "Service " + Language.lang.failed_not_found };
// ✅ ambil examination details
let examinationDetails: any[] = [];
if (param.examination_detail_ids && param.examination_detail_ids.length > 0) {
for (const examinationDetailId of param.examination_detail_ids) {
const examinationDetail = await ExaminationDetailModel
.list({ "ExaminationDetail.id": examinationDetailId })
.then((q) => q.getOne());
if (examinationDetail) {
examinationDetails.push(examinationDetail);
}
}
}
// ✅ assign (CREATE behavior)
service.examination_details = examinationDetails;
service.created_by = req.auth?.data.name;
service.updated_by = req.auth?.data.name;
await queryRunner.manager.save(service);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(
res,
200,
Language.lang.success_insert,
service
);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(
res,
400,
401,
Language.lang.failed_view,
err.message
);
} finally {
await queryRunner.release();
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Examination']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceExamination" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service ID"),
examination_detail_ids: Joi.array().items(Joi.string().uuid()).optional().label("Examination Detail IDs"),
});
let param: any = await schema.validateAsync(req.body);
let service = await ServiceModel.list({ "Service.id": param.id })
.then((q) => q.leftJoinAndSelect("Service.serviceType", "st").leftJoinAndSelect("Service.examination_details", "ed").getOne());
if (!service) throw { message: "Service " + Language.lang.failed_not_found };
let examinationDetails: any[] = [];
if (param.examination_detail_ids && param.examination_detail_ids.length > 0) {
for (const examinationDetailId of param.examination_detail_ids) {
const examinationDetail = await ExaminationDetailModel.list({ "ExaminationDetail.id": examinationDetailId }).then((q) => q.getOne());
if (examinationDetail) examinationDetails.push(examinationDetail);
}
}
service.examination_details = examinationDetails;
service.updated_by = req.auth?.data.name;
await queryRunner.manager.save(service);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, service);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
}

View File

@ -1,424 +0,0 @@
import { ServiceFare, ServiceClass, Service, FareType, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceFareModel } from "../model/service_fare";
import { ServiceClassModel } from "../model/service_class";
import { ServiceModel } from "../model/service";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ServiceFareController]",
type: "pretty",
});
export class ServiceFareController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = {
description: 'Filter data in JSON format. Available fields: {\"any\": \"value\"} for searching by Service.name or service type name (case-insensitive, supports partial match)',
in: 'query',
type: 'string',
example: '{\"any\": \"express\"}'
}
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().valid("ASC", "DESC").uppercase().required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
const filterAny = filter.any && filter.any !== "" ? String(filter.any) : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
var query = await ServiceModel.list(filterObj);
const base_query = query
.select([
"Service.id",
"Service.name",
])
.leftJoin("Service.serviceType", "st")
.addSelect("st.name", "service_type_name")
.leftJoin(
qb => {
return qb
.select('sf."serviceId"', "serviceId")
.addSelect("COALESCE(MIN(sf.fare), 0)", "min")
.addSelect("COALESCE(MAX(sf.fare), 0)", "max")
.from("service_fares", "sf")
.innerJoin("fare_type", "ft", 'sf."faretypeId" = ft.id AND ft.deleted_at IS NULL')
.innerJoin("service_classes", "sc", 'sf."serviceClassId" = sc.id AND sc.deleted_at IS NULL')
.innerJoin("services", "s", 'sf."serviceId" = s.id AND s.deleted_at IS NULL')
.groupBy('sf."serviceId"');
},
"sfa",
'sfa."serviceId" = Service.id'
)
.addSelect('COALESCE(sfa.min, 0)', "min_fare")
.addSelect('COALESCE(sfa.max, 0)', "max_fare");
const res_count = base_query.clone();
const res_list = base_query
.orderBy("Service." + param.order_field, param.order_direction)
.skip(offset)
.take(limit);
if (filterAny !== "") {
const anyVal = filterAny.includes("%") ? filterAny : `%${filterAny}%`;
res_list.andWhere("(Service.name ILIKE :any OR st.name ILIKE :any)", { any: anyVal });
res_count.andWhere("(Service.name ILIKE :any OR st.name ILIKE :any)", { any: anyVal });
}
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getRawAndEntities();
const merged = list_data.entities.map((entity, index) => ({
...entity,
min_fare: list_data.raw[index]?.min_fare ?? null,
max_fare: list_data.raw[index]?.max_fare ?? null,
service_type_name: list_data.raw[index]?.service_type_name ?? null,
}));
const count_data = CommonHelper.countObject(merged);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, merged);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async option(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
*/
try {
const [services, fareTypes, serviceClasses] = await Promise.all([
OrmHelper.DB.getRepository(Service)
.createQueryBuilder("Service")
.select(["Service.id", "Service.name"])
.getMany(),
OrmHelper.DB.getRepository(FareType)
.createQueryBuilder("FareType")
.select(["FareType.id", "FareType.name"])
.getMany(),
OrmHelper.DB.getRepository(ServiceClass)
.createQueryBuilder("ServiceClass")
.select(["ServiceClass.id", "ServiceClass.name"])
.getMany(),
]);
// Semua FareType dapat semua ServiceClass
const fareTypesWithClass = fareTypes.map((ft) => ({
id: ft.id,
name: ft.name,
service_class: serviceClasses.map((sc) => ({
id: sc.id,
name: sc.name,
})),
}));
// Semua Service dapat semua FareType (yang sudah berisi ServiceClass)
const list_data = services.map((svc) => ({
service: {
id: svc.id,
name: svc.name,
faretype: fareTypesWithClass,
},
}));
const total_count_data = list_data.length;
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res, 200,
Language.lang.success_view,
count_data,
1,
total_count_data,
list_data
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceFare" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
service_id: Joi.string().uuid().required().label("Service ID"),
faretype: Joi.array().items(
Joi.object().keys({
faretype_id: Joi.string().uuid().required().label("Fare Type ID"),
service_class: Joi.array().items(
Joi.object().keys({
service_class_id: Joi.string().uuid().required().label("Service Class ID"),
fare: Joi.number().min(0).allow(null).label("Fare"),
})
).min(1).required().label("Service Class"),
})
).min(1).required().label("Fare Type"),
});
let param: any = await schema.validateAsync(req.body);
// Validasi Service
let service = await ServiceModel.list({ "Service.id": param.service_id }).then((q) => q.getOne());
if (!service) throw { message: "Service not found" };
const savedServiceFares: ServiceFare[] = [];
// Loop tiap faretype
for (const ft of param.faretype) {
// Validasi FareType
let fareType = await OrmHelper.DB.getRepository("FareType")
.createQueryBuilder("FareType")
.where("FareType.id = :id", { id: ft.faretype_id })
.getOne();
if (!fareType) throw { message: `Fare Type ID ${ft.faretype_id} not found` };
for (const sc of ft.service_class) {
let serviceClass = await ServiceClassModel.list({ "ServiceClass.id": sc.service_class_id }).then((q) => q.getOne());
if (!serviceClass) throw { message: `Service Class ID ${sc.service_class_id} not found` };
let serviceFare = await ServiceFareModel.list({
"ServiceFare.serviceId": param.service_id,
"ServiceFare.faretype": ft.faretype_id,
"ServiceFare.serviceClassId": sc.service_class_id,
}).then((q) => q.getOne());
if (!serviceFare) {
serviceFare = new ServiceFare();
serviceFare.service = service;
serviceFare.faretype = ft.faretype_id;
serviceFare.serviceClass = serviceClass;
serviceFare.created_by = req.auth?.data.name;
}
serviceFare.fare = String(sc.fare ?? 0);
serviceFare.updated_by = req.auth?.data.name;
const saved = await queryRunner.manager.save(serviceFare);
savedServiceFares.push(saved);
}
}
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, savedServiceFares);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: 'Service ID', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Id"), // ← label diupdate
});
let param: any = await schema.validateAsync(req.params);
let serviceFare = await ServiceModel.list({ "Service.id": param.id })
.then((q) =>
q
.select([
"Service.id",
"Service.name",
"servicefare.id",
"servicefare.fare",
"serviceClass.id",
"serviceClass.name",
"faretype.id",
"faretype.name",
])
.leftJoin("Service.servicefare", "servicefare")
.leftJoin("servicefare.serviceClass", "serviceClass")
.leftJoin("servicefare.faretype", "faretype")
.getOne()
);
if (!serviceFare || serviceFare.length === 0) throw { message: "Service Fare Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, serviceFare);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: 'Service Fare ID', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceFareUpdate" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Fare ID"),
fare: Joi.number().min(0).required().label("Fare"),
});
let param: any = await schema.validateAsync({
...req.body,
id: req.params.id,
});
// Cari data berdasarkan ID
let serviceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }).then((q) => q.getOne());
if (!serviceFare) throw { message: "Service Fare " + Language.lang.failed_not_found };
// Update fare saja
serviceFare.fare = String(param.fare);
serviceFare.updated_by = req.auth?.data.name;
await queryRunner.manager.save(serviceFare);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, serviceFare);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let serviceFare: ServiceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }).then((q) => q.getOne());
if (!serviceFare) throw { message: "Service Fare " + Language.lang.failed_not_found };
serviceFare.deleted_by = req.auth?.data.name;
serviceFare.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(serviceFare);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ServiceFare);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Fare']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ServiceFare);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,287 +0,0 @@
import { ServicePackage, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServicePackageModel } from "../model/service_package";
import { ServiceClassModel } from "../model/service_class";
import { ServiceModel } from "../model/service";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ServicePackageController]",
type: "pretty",
});
export class ServicePackageController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ServicePackageModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndSelect("ServicePackage.serviceClass", "serviceClass")
.leftJoinAndSelect("ServicePackage.services", "services")
.orderBy("ServicePackage." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/servicePackage" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
service_class_id: Joi.string().uuid().required().label("Service Class ID"),
fare: Joi.number().min(0).required().label("Fare"),
service_ids: Joi.array().items(Joi.string().uuid()).optional().label("Service IDs"),
});
let param: any = await schema.validateAsync(req.body);
let serviceClass = await ServiceClassModel.list({ id: param.service_class_id }).then((q) => q.getOne());
if (!serviceClass) throw { message: "Service Class not found" };
let services: any[] = [];
if (param.service_ids && param.service_ids.length > 0) {
for (const serviceId of param.service_ids) {
const svc = await ServiceModel.list({ id: serviceId }).then((q) => q.getOne());
if (svc) services.push(svc);
}
}
let servicePackage = new ServicePackage();
servicePackage.name = param.name;
servicePackage.serviceClass = serviceClass;
servicePackage.fare = String(param.fare);
servicePackage.services = services;
servicePackage.created_by = req.auth.data.name;
servicePackage.updated_by = req.auth.data.name;
await queryRunner.manager.save(servicePackage);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, servicePackage);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Package Id"),
});
let param: any = await schema.validateAsync(req.params);
let servicePackage = await ServicePackageModel.list({ "ServicePackage.id": param.id })
.then((q) =>
q
.leftJoinAndSelect("ServicePackage.serviceClass", "serviceClass")
.leftJoinAndSelect("ServicePackage.services", "services")
.getOne()
);
if (!servicePackage) throw { message: "Service Package Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, servicePackage);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/servicePackage" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Package ID"),
name: Joi.string().max(256).required().label("Name"),
service_class_id: Joi.string().uuid().required().label("Service Class ID"),
fare: Joi.number().min(0).required().label("Fare"),
service_ids: Joi.array().items(Joi.string().uuid()).optional().label("Service IDs"),
});
let param: any = await schema.validateAsync(req.body);
let serviceClass = await ServiceClassModel.list({ id: param.service_class_id }).then((q) => q.getOne());
if (!serviceClass) throw { message: "Service Class not found" };
let servicePackage = await ServicePackageModel.list({ "ServicePackage.id": param.id })
.then((q) => q.leftJoinAndSelect("ServicePackage.serviceClass", "sc").leftJoinAndSelect("ServicePackage.services", "s").getOne());
if (!servicePackage) throw { message: "Service Package " + Language.lang.failed_not_found };
let services: any[] = [];
if (param.service_ids && param.service_ids.length > 0) {
for (const serviceId of param.service_ids) {
const svc = await ServiceModel.list({ id: serviceId }).then((q) => q.getOne());
if (svc) services.push(svc);
}
}
servicePackage.name = param.name;
servicePackage.serviceClass = serviceClass;
servicePackage.fare = String(param.fare);
servicePackage.services = services;
servicePackage.updated_by = req.auth.data.name;
await queryRunner.manager.save(servicePackage);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, servicePackage);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let servicePackage: ServicePackage = await ServicePackageModel.list({ "ServicePackage.id": param.id }).then((q) => q.getOne());
if (!servicePackage) throw { message: "Service Package " + Language.lang.failed_not_found };
servicePackage.deleted_by = req.auth.data.name;
servicePackage.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(servicePackage);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ServicePackage);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Package']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ServicePackage);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,255 +0,0 @@
import { ServiceType, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { Language } from "../langs/lang";
import { ServiceTypeModel } from "../model/service_type";
import { OrmHelper } from "../helpers/orm";
import moment from "moment";
const log: Logger<ILogObj> = new Logger({
name: "[ServiceTypeController]",
type: "pretty",
});
export class ServiceTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await ServiceTypeModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("ServiceType." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceType" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
const schema = Joi.object().keys({
name: Joi.string().max(256).required().label("Name"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ServiceTypeModel.list(filter).then((q) => q.getOne());
if (exist) throw { message: "Service Type " + Language.lang.failed_duplicate };
let serviceType = new ServiceType();
serviceType.name = param.name;
serviceType.status = param.status;
serviceType.created_by = req.auth.data.name;
serviceType.updated_by = req.auth.data.name;
await queryRunner.manager.save(serviceType);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, serviceType);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Type Id"),
});
let param: any = await schema.validateAsync(req.params);
let serviceType = await ServiceTypeModel.list({ "ServiceType.id": param.id }).then((q) => q.getOne());
if (!serviceType) throw { message: "Service Type Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, serviceType);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceType" } } } }
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Service Type ID"),
name: Joi.string().max(256).required().label("Name"),
status: Joi.string().required().label("Status"),
});
let param: any = await schema.validateAsync(req.body);
let filter = { name: param.name };
let exist = await ServiceTypeModel.list(filter).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Service Type " + Language.lang.failed_duplicate };
let serviceType = await ServiceTypeModel.list({ "ServiceType.id": param.id }).then((q) => q.getOne());
if (!serviceType) throw { message: "Service Type " + Language.lang.failed_not_found };
serviceType.name = param.name;
serviceType.status = param.status;
serviceType.updated_by = req.auth.data.name;
await queryRunner.manager.save(serviceType);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, serviceType);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
let affected = 0;
if (!param.hard) {
let serviceType: ServiceType = await ServiceTypeModel.list({ "ServiceType.id": param.id }).then((q) => q.getOne());
if (!serviceType) throw { message: "Service Type " + Language.lang.failed_not_found };
serviceType.deleted_by = req.auth.data.name;
serviceType.deleted_at = moment().toDate();
await OrmHelper.DB.manager.save(serviceType);
affected = 1;
} else {
const repo = OrmHelper.DB.getRepository(ServiceType);
affected = (await repo.delete({ id: param.id })).affected ?? 0;
}
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Service Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
});
const param: any = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(ServiceType);
const affected = (await repo.restore({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -9,19 +9,19 @@ import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Aldeia, Suco } from "entity";
import { SitePoints } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[AldeiaController]', type: 'pretty' });
const log: Logger<ILogObj> = new Logger({ name: '[SitePointsController]', type: 'pretty' });
export class AldeiaController {
export class SitePointsController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
description: '',
in: 'query',
type: 'string'
}
@ -66,42 +66,38 @@ export class AldeiaController {
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Aldeia);
const repo = OrmHelper.DB.getRepository(SitePoints);
const offset = (param.page - 1) * param.limit
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.suco_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
filter: param.filter,
col_any_eq: [''],
col_any_like: ['sector', 'cell', 'site', 'location']
});
const res_count = repo.createQueryBuilder("Aldeia")
.leftJoin("Aldeia.suco", "suco")
const res_count = repo.createQueryBuilder("SitePoints")
// .leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.suco_id) {
res_count.andWhere("suco.id = :sucoId", { sucoId: filterObj.suco_id });
}
// if (filterObj.munisipo_id) {
// res_count.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
const res_list = repo.createQueryBuilder("Aldeia")
.leftJoin("Aldeia.suco", "suco")
const res_list = repo.createQueryBuilder("SitePoints")
// .leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal)
.orderBy("Aldeia." + param.order_field, param.order_direction)
.orderBy("SitePoints." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
// Handle foreign key filter with relation
if (filterObj.suco_id) {
res_list.andWhere("suco.id = :sucoId", { sucoId: filterObj.suco_id });
}
// if (filterObj.munisipo_id) {
// res_list.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
if (param.with_deleted) {
res_count.withDeleted();
@ -122,14 +118,35 @@ export class AldeiaController {
}
}
static async alldatas(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
*/
try {
const repo = OrmHelper.DB.getRepository(SitePoints);
const list_data = await repo.find();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, 1, list_data.length, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
description: '',
in: 'query',
type: 'string'
}
@ -160,21 +177,21 @@ export class AldeiaController {
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Aldeia);
const repo = OrmHelper.DB.getRepository(SitePoints);
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.suco_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
// const filterWithoutFK = { ...filterObj };
// delete filterWithoutFK.munisipo_id;
// const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
filter: param.filter,
col_any_eq: [''],
col_any_like: ['sector', 'cell', 'site', 'location']
});
const filename = "aldeia.csv";
const filename = "site_points.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
@ -182,7 +199,7 @@ export class AldeiaController {
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Aldeia): any => ({
transform: (row: SitePoints): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
@ -194,23 +211,27 @@ export class AldeiaController {
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
let query = repo.createQueryBuilder("Aldeia")
.leftJoin("Aldeia.suco", "suco")
let query = repo.createQueryBuilder("sitepoints")
// .leftJoin("Administrativu.munisipo", "munisipo")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.suco_id) {
query = query.andWhere("suco.id = :sucoId", { sucoId: filterObj.suco_id });
}
// if (filterObj.munisipo_id) {
// query = query.andWhere("munisipo.id = :munisipoId", { munisipoId: filterObj.munisipo_id });
// }
const data = await query
.select([
'Aldeia.id',
'Aldeia.code',
'Aldeia.name',
'Aldeia.status',
'Aldeia.created_at'])
.orderBy("Aldeia." + param.order_field, param.order_direction)
'sitepoints.id',
'sitepoints.cell',
'sitepoints.sector',
'sitepoints.site',
'sitepoints.lat',
'sitepoints.lng',
'sitepoints.location',
'sitepoints.created_at'
])
.orderBy("sitepoints." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
@ -238,7 +259,7 @@ export class AldeiaController {
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
@ -248,7 +269,7 @@ export class AldeiaController {
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/aldeia"
$ref: "#/components/schemas/site_points"
}
}
}
@ -257,19 +278,23 @@ export class AldeiaController {
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
suco_id: Joi.string().uuid().required().label('Suco'),
cell: Joi.string().allow('').label('Cell'),
sector: Joi.string().allow('').label('Sector'),
site: Joi.string().allow('').label('Site'),
lat: Joi.number().allow(null).label('Latitude'),
lng: Joi.number().allow(null).label('Longitude'),
location: Joi.string().allow('').label('Location'),
});
const param: any = await schema.validateAsync(req.body);
const data = new Aldeia()
data.code = param.code
data.name = param.name
data.status = param.status
data.suco = await OrmHelper.DB.getRepository(Suco).findOneByOrFail({ id: param.suco_id });
const data = new SitePoints()
data.cell = param.cell
data.sector = param.sector
data.site = param.site
data.lat = param.lat
data.lng = param.lng
data.location = param.location
await OrmHelper.DB.manager.save(data);
@ -284,13 +309,13 @@ export class AldeiaController {
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Aldeia ID.',
description: 'Site Points ID.',
required: true,
type: 'string'
}
@ -300,7 +325,7 @@ export class AldeiaController {
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/aldeia"
$ref: "#/components/schemas/site_points"
}
}
}
@ -310,25 +335,29 @@ export class AldeiaController {
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
suco_id: Joi.string().uuid().required().label('Suco'),
cell: Joi.string().allow('').label('Cell'),
sector: Joi.string().allow('').label('Sector'),
site: Joi.string().allow('').label('Site'),
lat: Joi.number().allow(null).label('Latitude'),
lng: Joi.number().allow(null).label('Longitude'),
location: Joi.string().allow('').label('Location'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Aldeia);
const repo = OrmHelper.DB.getRepository(SitePoints);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
data.suco = await OrmHelper.DB.getRepository(Suco).findOneByOrFail({ id: param.suco_id });
data.cell = param.cell
data.sector = param.sector
data.site = param.site
data.lat = param.lat
data.lng = param.lng
data.location = param.location
await repo.save(data);
@ -346,13 +375,13 @@ export class AldeiaController {
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Aldeia ID.',
description: 'Site Points ID.',
required: true,
type: 'string'
}
@ -371,9 +400,9 @@ export class AldeiaController {
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Aldeia);
const repo = OrmHelper.DB.getRepository(SitePoints);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
let affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
@ -390,14 +419,14 @@ export class AldeiaController {
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Aldeia']
#swagger.tags = ['Site Points']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Aldeia ID.',
description: 'Site Points ID.',
required: true,
type: 'string'
}
@ -407,11 +436,11 @@ export class AldeiaController {
id: Joi.string().uuid().required().label('ID')
});
const param: Aldeia = await schema.validateAsync(req.params);
const param: SitePoints = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Aldeia);
const repo = OrmHelper.DB.getRepository(SitePoints);
const affected = (await repo.restore({ id: param.id })).affected;
let affected = (await repo.restore({ id: param.id })).affected || 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});

View File

@ -1,428 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { Paging } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { Suco, Administrativu } from "entity";
const log: Logger<ILogObj> = new Logger({ name: '[SucoController]', type: 'pretty' });
export class SucoController {
static async list(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
page: Joi.number().required().min(1).label('Page'),
limit: Joi.number().required().min(1).label('Limit'),
with_deleted: Joi.bool().required().label('With Deleted'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Suco);
const offset = (param.page - 1) * param.limit
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.administrativu_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
});
const res_count = repo.createQueryBuilder("Suco")
.leftJoin("Suco.administrativu", "administrativu")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.administrativu_id) {
res_count.andWhere("administrativu.id = :administrativuId", { administrativuId: filterObj.administrativu_id });
}
const res_list = repo.createQueryBuilder("Suco")
.leftJoin("Suco.administrativu", "administrativu")
.where(whereAttr || "1=1", whereVal)
.orderBy("Suco." + param.order_field, param.order_direction)
.offset(offset)
.limit(param.limit);
// Handle foreign key filter with relation
if (filterObj.administrativu_id) {
res_list.andWhere("administrativu.id = :administrativuId", { administrativuId: filterObj.administrativu_id });
}
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
const repo = OrmHelper.DB.getRepository(Suco);
const filterObj = param.filter ? JSON.parse(param.filter) : {};
// Remove foreign key from filter for CommonHelper.handleFilter
const filterWithoutFK = { ...filterObj };
delete filterWithoutFK.administrativu_id;
const filterStrWithoutFK = JSON.stringify(filterWithoutFK);
const { whereAttr, whereVal } = CommonHelper.handleFilter({
filter: filterStrWithoutFK,
col_any_eq: ['code'],
col_any_like: ['name']
});
const filename = "suco.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: Suco): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
const offset = (page - 1) * limit
let query = repo.createQueryBuilder("Suco")
.leftJoin("Suco.administrativu", "administrativu")
.where(whereAttr || "1=1", whereVal);
// Handle foreign key filter with relation
if (filterObj.administrativu_id) {
query = query.andWhere("administrativu.id = :administrativuId", { administrativuId: filterObj.administrativu_id });
}
const data = await query
.select([
'Suco.id',
'Suco.code',
'Suco.name',
'Suco.status',
'Suco.created_at'])
.orderBy("Suco." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit).getRawMany();
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/suco"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
administrativu_id: Joi.string().uuid().required().label('Administrativu'),
});
const param: any = await schema.validateAsync(req.body);
const data = new Suco()
data.code = param.code
data.name = param.name
data.status = param.status
data.administrativu = await OrmHelper.DB.getRepository(Administrativu).findOneByOrFail({ id: param.administrativu_id });
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Suco ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/suco"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
code: Joi.string().max(128).required().label('Code'),
name: Joi.string().max(256).required().label('Name'),
status: Joi.string().required().label('Status'),
administrativu_id: Joi.string().uuid().required().label('Administrativu'),
});
req.body.id = req.params['id'];
const param: any = await schema.validateAsync(req.body);
const repo = OrmHelper.DB.getRepository(Suco);
const data = await repo.findOneBy({ id: param.id });
if (data != null) {
data.code = param.code
data.name = param.name
data.status = param.status
data.administrativu = await OrmHelper.DB.getRepository(Administrativu).findOneByOrFail({ id: param.administrativu_id });
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Suco ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Suco);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Suco']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Suco ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: Suco = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(Suco);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -1,290 +0,0 @@
import { Paging, Room, SurgeryRoom } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import { Language } from "../langs/lang";
import { RoomModel } from "../model/room";
import { SurgeryRoomModel } from "../model/surgery_room";
const log: Logger<ILogObj> = new Logger({
name: "[SurgeryRoomController]",
type: "pretty",
});
export class SurgeryRoomController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description:'',
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['page'] = {
in: 'query',
required: true,
type: 'number'
}
#swagger.parameters['with_deleted'] = {
in: 'query',
required: true,
type: 'boolean'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
const param: Paging = await schema.validateAsync(req.query);
const offset = (param.page - 1) * param.limit;
const filter = JSON.parse(param.filter);
const query = await SurgeryRoomModel.list(filter);
const limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndSelect("SurgeryRoom.room", "room")
.leftJoinAndSelect("room.serviceclass", "service_class")
.orderBy("SurgeryRoom." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/surgery_room"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
room_id: Joi.string().uuid().required().label("Room ID"),
name: Joi.string().required().label("Name"),
});
const param = await schema.validateAsync(req.body);
let room: Room = await RoomModel.list({ id: param.room_id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
const data = new SurgeryRoom();
data.room = room;
data.name = param.name;
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Surgery Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Surgery Room ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().required().label("ID"),
});
let param: any = await schema.validateAsync(req.params);
let data = await SurgeryRoomModel.list({ "SurgeryRoom.id": param.id }).then((q) =>
q //
.leftJoinAndSelect("SurgeryRoom.room", "room")
.getOne(),
);
if (!data) throw { message: "Surgery Room " + Language.lang.failed_not_found };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
description:'',
in: 'path',
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/surgery_room"
}
}
}
}
*/
const queryRunner = OrmHelper.DB.createQueryRunner();
await queryRunner.startTransaction();
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().required().label("Surgery Room ID"),
room_id: Joi.string().uuid().required().label("Room ID"),
name: Joi.string().required().label("Name"),
});
let param: any = await schema.validateAsync(req.body);
let surgeryRoom: SurgeryRoom = await SurgeryRoomModel.list({ id: param.id }).then((q) => q.getOne());
if (!surgeryRoom) throw { message: "Surgery Room " + Language.lang.failed_not_found };
let room: Room = await RoomModel.list({ id: param.room_id }).then((q) => q.getOne());
if (!room) throw { message: "Room " + Language.lang.failed_not_found };
surgeryRoom.room = room;
surgeryRoom.name = param.name;
surgeryRoom.updated_by = req.auth?.data.name;
await queryRunner.manager.save(surgeryRoom);
await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, surgeryRoom);
} catch (e: unknown) {
await queryRunner.rollbackTransaction();
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
} finally {
await queryRunner.release();
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Surgery Room']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Surgery Room ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(SurgeryRoom);
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,197 +0,0 @@
import { SurgeryType, Paging } from "entity";
import { NextFunction, Response } from "express";
import { Request } from "express-jwt";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import CommonHelper from "../helpers/common";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import { Language } from "../langs/lang";
import { SurgeryTypeModel } from "../model/surgery_type";
const log: Logger<ILogObj> = new Logger({
name: "[SurgeryTypeController]",
type: "pretty",
});
export class SurgeryTypeController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
let filterAny = filter.any && filter.any !== "" ? filter.any : "";
let filterObj = { ...filter } as any;
delete filterObj.any;
filterObj = { ...filterObj };
var query = await SurgeryTypeModel.list(filterObj, filterAny);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_list = query
.orderBy("SurgeryType." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/surgery_type" } } } }
*/
try {
const schema = Joi.object().keys({
name: Joi.string().required().label("Name"),
});
let param: { name: string } = await schema.validateAsync(req.body);
let exist = await SurgeryTypeModel.list({ name: param.name }).then((q) => q.getOne());
if (exist) throw { message: "Surgery Type " + Language.lang.failed_duplicate };
let surgeryType = new SurgeryType();
surgeryType.name = param.name;
surgeryType.created_by = req.auth?.data.name;
surgeryType.updated_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(surgeryType);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, surgeryType);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_insert, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Surgery Type Id"),
});
let param: { id: string } = await schema.validateAsync(req.params);
let surgeryType = await SurgeryTypeModel.list({ "SurgeryType.id": param.id }).then((q) => q.getOne());
if (!surgeryType) throw { message: "Surgery Type " + Language.lang.failed_not_found };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, surgeryType);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['Surgery Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
#swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/surgery_type" } } } }
*/
try {
req.body.id = req.params["id"];
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("Surgery Type ID"),
name: Joi.string().required().label("Name"),
});
let param: { id: string; name: string } = await schema.validateAsync(req.body);
let exist = await SurgeryTypeModel.list({ name: param.name }).then((q) => q.getOne());
if (exist && exist.id != param.id) throw { message: "Surgery Type " + Language.lang.failed_duplicate };
let surgeryType = await SurgeryTypeModel.list({ "SurgeryType.id": param.id }).then((q) => q.getOne());
if (!surgeryType) throw { message: "Surgery Type " + Language.lang.failed_not_found };
surgeryType.name = param.name;
surgeryType.updated_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(surgeryType);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, surgeryType);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Surgery Type']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { in: 'path', required: true, type: 'string' }
#swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete (ignored; entity has no soft delete)', required: false, type: 'boolean' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("ID"),
hard: Joi.bool().optional().allow("").label("Is hard delete?"),
});
const param: { id: string; hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(SurgeryType);
const affected = (await repo.delete({ id: param.id })).affected ?? 0;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
}

View File

@ -1,573 +0,0 @@
import { Response, NextFunction, Application } from "express";
import { Request } from "express-jwt";
import { ReturnHelper } from "../helpers/express/return";
import { OrmHelper } from "../helpers/orm";
import Joi from "joi";
import { ILogObj, Logger } from "tslog";
import { Language } from "../langs/lang";
import { UserToRoom, Paging, User, Room } from "entity";
import CommonHelper from "../helpers/common";
import * as fastcsv from 'fast-csv';
import dayjs from "dayjs";
import { UserToRoomModel } from "../model/user_to_room";
import { RoomModel } from "../model/room";
const log: Logger<ILogObj> = new Logger({ name: '[UserToRoomController]', type: 'pretty' });
export class UserToRoomController {
static async list(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = {
description: "Filter in JSON format. Available fields: user_id (string, uuid, exact match), name (string, partial match case-insensitive), status (string, exact match). Example: {\"user_id\":\"uuid-here\",\"name\":\"john\",\"status\":\"active\"}",
in: 'query',
type: 'string'
}
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
// Base filter builder (reusable untuk step 1 & count)
const applyFilters = (qb: any) => {
if (param.with_deleted) qb.withDeleted();
const userIdFilter = filter["user.id"] ?? filter.user_id ?? filter.doctor_id ?? filter.id;
if (userIdFilter !== undefined && userIdFilter !== "") {
qb.andWhere("user.id = :userId", { userId: userIdFilter });
}
const userNameFilter = filter["user.name"] ?? filter.name;
if (userNameFilter !== undefined && userNameFilter !== "") {
const userNameVal = String(userNameFilter);
qb.andWhere("user.name ILIKE :name", { name: userNameVal.includes("%") ? userNameVal : `%${userNameVal}%` });
}
const userStatusFilter = filter["user.status"] ?? filter.status;
if (userStatusFilter !== undefined && userStatusFilter !== "") qb.andWhere("user.status = :status", { status: userStatusFilter });
return qb;
};
// Step 1: Ambil paginated user IDs dulu (tanpa join room)
const idQuery = OrmHelper.DB.getRepository(User)
.createQueryBuilder("user")
.select("user.id")
.orderBy("user." + param.order_field, param.order_direction as "ASC" | "DESC")
.offset(offset)
.limit(limit);
applyFilters(idQuery);
const paginatedUserIds = await idQuery.getRawMany();
const userIds = paginatedUserIds.map((row) => row.user_id);
if (userIds.length === 0) {
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
0,
param.page,
0,
[]
);
}
// Step 2: Count total (tanpa join room, tanpa offset/limit)
const countQuery = OrmHelper.DB.getRepository(User)
.createQueryBuilder("user")
.select("user.id");
applyFilters(countQuery);
const total_count_data = await countQuery.getCount();
// Step 3: Fetch data lengkap hanya untuk IDs yang sudah dipaginasi
const userQuery = OrmHelper.DB.getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.roles", "roles")
.leftJoinAndMapMany(
"user.userToRooms",
UserToRoom,
"user_to_room",
"user_to_room.user = user.id"
)
.leftJoinAndMapOne(
"user_to_room.roomData",
Room,
"room",
"room.id = user_to_room.room"
)
.whereInIds(userIds)
.orderBy("user." + param.order_field, param.order_direction as "ASC" | "DESC");
if (param.with_deleted) userQuery.withDeleted();
const users = await userQuery.getMany();
// Transform data
const list_data_return = users.map((user: any) => {
const userToRooms: any[] = user.userToRooms ?? [];
const rooms: Record<string, any> = {};
userToRooms.forEach((utr: any, index: number) => {
const room = utr.roomData ?? null;
rooms[`room_${index + 1}`] = room ? {
id: room.id,
room: room.room,
code: room.code,
} : null;
});
return {
id: user.id,
name: user.name,
username: user.username,
email: user.email,
status: user.status,
roles: user.roles ? user.roles.map((role: any) => ({
id: role.id,
name: role.name,
})) : [],
rooms: Object.keys(rooms).length > 0 ? rooms : null,
};
});
const count_data = CommonHelper.countObject(list_data_return);
return ReturnHelper.successResponselist(
res,
200,
Language.lang.success_view,
count_data,
param.page,
total_count_data,
list_data_return
);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async export(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['filter'] = {
description: 'Filter with 2 format : <ul><li>Simple format use text plaint will filter eq:code or like %name%</li><li>Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}</li></ul>',
in: 'query',
type: 'string'
}
#swagger.parameters['filter'] = {
in: 'query',
type: 'string'
}
#swagger.parameters['order_field'] = {
in: 'query',
required: true,
type: 'string'
}
#swagger.parameters['order_direction'] = {
in: 'query',
required: true,
schema: {
'@enum': ['ASC', 'DESC']
}
}
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow('').optional().label('Filter'),
order_field: Joi.string().required().label('Order Field'),
order_direction: Joi.string().allow('asc', 'desc').required().label('Order Direction'),
});
const param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
var query = await UserToRoomModel.list(filter);
const data = await query.getMany();
const filename = "user_to_room.csv";
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
const csvStream = fastcsv.format({
headers: true,
writeHeaders: true,
transform: (row: UserToRoom): any => ({
...row,
created_at: dayjs(row.created_at).format('DD-MM-YYYY HH:MM:ss'),
})
});
csvStream.pipe(res);
const limit = 50;
const fetchAndWrite = async (page: any) => {
if (CommonHelper.countObject(data) === 0) {
csvStream.end();
} else {
data.forEach((item: any) => csvStream.write(item));
if (CommonHelper.countObject(data) == limit) {
fetchAndWrite(page + 1);
} else {
csvStream.end();
}
}
};
fetchAndWrite(1);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message);
}
}
static async create(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/user_to_room"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
user_id: Joi.string()
.uuid()
.required()
.label("User ID"),
room_id: Joi.string()
.uuid()
.required()
.label("Room ID"),
// room_ids: Joi.array()
// .items(Joi.string().uuid().required())
// .min(1)
// .required()
// .label("Factory IDs")
});
const param: any = await schema.validateAsync(req.body);
// const userToRoomRepo = OrmHelper.DB.getRepository(UserToRoom);
// const userRepo = OrmHelper.DB.getRepository(User);
// const roomRepo = OrmHelper.DB.getRepository(Room);
// await userToRoomRepo
// .createQueryBuilder()
// .delete()
// .from(UserToRoom)
// .where("service_id = :userId", { userId: param.user_id })
// .execute();
const data = new UserToRoom()
data.user = param.user_id;
data.room = param.room_id;
data.created_by = req.auth?.data.name;
await OrmHelper.DB.manager.save(data);
// let relation : UserToRoom;
// for (const roomId of param.room_ids) {
// relation = new UserToRoom();
// relation.user = await userRepo.findOneBy({ id: param.user_id });
// relation.room = await roomRepo.findOneBy({ id: roomId });
// relation.created_by = req.auth.data.name;
// await userToRoomRepo.save(relation);
// }
// const data = await userToRoomRepo.createQueryBuilder("user_to_room")
// .leftJoinAndSelect("user_to_room.user", "user")
// .leftJoinAndSelect("user_to_room.room", "room")
// .where("user_to_room.service_id = :userId", { userId: param.user_id }).getMany();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message);
}
}
static async update(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['user_id'] = {
in: 'path',
description: 'User ID.',
required: true,
type: 'string'
}
#swagger.requestBody = {
required: true,
content: {
"application/json": {
schema: {
$ref: "#/components/schemas/user_to_room_update"
}
}
}
}
*/
try {
const schema = Joi.object().keys({
user_id: Joi.string().uuid().required().label('User ID'),
room_ids: Joi.array()
.items(Joi.string().uuid().required())
.min(1)
.required()
.label("Factory IDs")
// room_id: Joi.string().uuid().required().label('Room ID'),
});
req.body.user_id = req.params['user_id'];
const param: any = await schema.validateAsync(req.body);
const userToRoomRepo = OrmHelper.DB.getRepository(UserToRoom);
const userRepo = OrmHelper.DB.getRepository(User);
const roomRepo = OrmHelper.DB.getRepository(Room);
await userToRoomRepo
.createQueryBuilder()
.delete()
.from(UserToRoom)
.where("user = :userId", { userId: param.user_id })
.execute();
let relation: UserToRoom | any;
for (const roomId of param.room_ids) {
relation = new UserToRoom();
relation.user = await userRepo.findOneBy({ id: param.user_id });
relation.room = await roomRepo.findOneBy({ id: roomId });
relation.created_by = req.auth?.data.name;
await userToRoomRepo.save(relation);
}
const data = await userToRoomRepo.createQueryBuilder("user_to_room")
.leftJoinAndSelect("user_to_room.user", "user")
.leftJoinAndSelect("user_to_room.room", "room")
.where("user_to_room.user = :userId", { userId: param.user_id }).getMany();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
// const repo = OrmHelper.DB.getRepository(UserToRoom);
// const data = await repo.findOneBy({ id: param.id });
// if (data != null) {
// data.user = param.user_id;
// data.room = param.room_id;
// data.updated_by = req.auth.data.name;
// await repo.save(data);
// return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
// } else {
// return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
// }
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async detail(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['id'] = { description: '', in: 'path', type: 'string' }
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label("UserToRoom Id"),
});
let param: any = await schema.validateAsync(req.params);
let data = await UserToRoomModel.list({ "id": param.id }).then((q) => q.getOne());
if (!data) throw { message: "UserToRoom Not Found" };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data);
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async listRoom(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['filter'] = { description: 'Filter in JSON format. Available fields: user_id (string, uuid, exact match), name (string, partial match case-insensitive), status (string, exact match). Example: {\"user_id\":\"uuid-here\",\"name\":\"john\",\"status\":\"active\"}', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const query = await RoomModel.list(filter);
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
const res_count = query;
const res_list = query
.leftJoinAndSelect("Room.department", "department")
.orderBy("Room." + param.order_field, param.order_direction as "ASC" | "DESC")
.take(limit)
.skip(offset);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data
);
}
catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
static async listRoomByUser(req: Request, res: Response, next: NextFunction): Promise<void | Response> {
/*
#swagger.tags = ['UserToRoom']
#swagger.security = [{ "bearerAuth": [] }]
#swagger.parameters['user_id'] = { description: 'User ID.', in: 'path', type: 'string' }
#swagger.parameters['filter'] = { description: 'Filter in JSON format. Available fields: user_id (string, uuid, exact match), name (string, partial match case-insensitive), status (string, exact match). Example: {\"user_id\":\"uuid-here\",\"name\":\"john\",\"status\":\"active\"}', in: 'query', type: 'string' }
#swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['page'] = { in: 'query', required: true, type: 'number' }
#swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' }
#swagger.parameters['order_field'] = { in: 'query', required: true, type: 'string' }
#swagger.parameters['order_direction'] = { in: 'query', required: true, schema: { '@enum': ['ASC', 'DESC'] } }
*/
try {
const paramPathSchema = Joi.object().keys({
user_id: Joi.string().uuid().required().label("User ID"),
});
const schema = Joi.object().keys({
filter: Joi.string().allow("").optional().label("Filter"),
page: Joi.number().required().min(1).label("Page"),
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
});
const paramPath = await paramPathSchema.validateAsync(req.params);
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const query = await RoomModel.list(filter);
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
query.innerJoin(UserToRoom, "user_to_room", "user_to_room.room = Room.id")
.andWhere("user_to_room.user = :userId", { userId: paramPath.user_id });
const res_count = query;
const res_list = query
.leftJoinAndSelect("Room.department", "department")
.orderBy("Room." + param.order_field, param.order_direction as "ASC" | "DESC")
.take(limit)
.skip(offset);
if (param.with_deleted) {
res_count.withDeleted();
res_list.withDeleted();
}
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
return ReturnHelper.successResponselist(
res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data
);
}
catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message);
}
}
}

View File

@ -1,5 +1,5 @@
import { Response } from 'express';
import { ErrorType, ErrorValidation } from 'entity';
// import { ErrorType, ErrorValidation } from 'entity';
export class ReturnHelper {
static successResponseAny(

View File

@ -1,12 +0,0 @@
import config from 'config';
import express from 'express';
import fileUpload from 'express-fileupload'
export class UploadHelper {
static setup(app: express.Application) {
app.use(fileUpload({
limits: { fileSize: 10485760 },
abortOnLimit: true,
}));
}
}

View File

@ -2,106 +2,11 @@ import config from "config";
import { DataSource } from "typeorm";
import { ILogObj, Logger } from "tslog";
import {
ResponsiblePartyConsent,
Province,
City,
Subdistrict,
Ward,
RefferalHospital,
RegistrationFee,
FareType,
RoomStock,
Administrativu,
Aldeia,
District,
Menu,
Munisipo,
Suco,
Application,
Nationality,
Diagnosis,
DiagnosticProcedure,
Room,
MedicalForm,
ServiceType,
ServiceClass,
Service,
ServiceFare,
ServicePackage,
Department,
DoctorSchedule,
MeasurementUnit,
ReferenceRange,
QueueMonitoring,
QueueMonitoringRooms,
ExaminationDetail,
ExaminationType,
User,
UserRole,
HrmsEmployee,
HrmsDepartment,
HrmsPosition,
HrmsShift,
HospitalInformation,
ItemOrigin,
ItemType,
ItemTypeDetail,
Unit,
ItemCategory,
ItemStatus,
UsageInstructions,
UsageTime,
ItemClass,
ItemClassDetail,
GenericName,
Factory,
Supplier,
FactoryToSupplier,
ItemMaster,
ItemGroup,
PharmacyInfo,
ItemPrice,
SellingPricePercentage,
PatientGroup,
Currency,
InpatientRoom,
SurgeryRoom,
SurgeryType,
PatientGuarantor,
InitialStock,
DoctorItem,
DoctorItemPackage,
UserToRoom,
RoomToPharmacy,
PlanningVerificator,
ScheduleSeries,
ScheduleException,
CardType,
PaymentMethod,
FosterCareHistory,
InpatientRoomBed,
EmrBoardingRoom,
EmrPatient,
EmrRegistration,
EmrDiagnosis,
EmrRegistrationOutpatient,
EmrRegistrationEmergency,
EmrRegistrationEmergencyResponsible,
DischargeStatusEmergency,
EmrInternalConsultation,
Counter,
RoomNumber,
MainDisease,
CardKeySet,
CardPrintQueue,
EmrRegistrationTreatment,
TreatmentPlanSession,
TreatmentPlan,
PatientPastMedicalDocument
SitePoints,
} from "entity";
export class OrmHelper {
static DB: DataSource = null;
static DB: DataSource;
static setup() {
const log: Logger<ILogObj> = new Logger({
@ -118,106 +23,10 @@ export class OrmHelper {
username: String(config.get("database.username")),
password: String(config.get("database.password")),
database: String(config.get("database.database")),
synchronize: true,
synchronize: false,
logging: config.get("database.logging"),
entities: [
//
Menu,
Administrativu,
Aldeia,
District,
Munisipo,
Suco,
Application,
Nationality,
Diagnosis,
DiagnosticProcedure,
Room,
MedicalForm,
ServiceType,
ServiceClass,
Service,
ServiceFare,
ServicePackage,
Department,
DoctorSchedule,
MeasurementUnit,
ReferenceRange,
QueueMonitoring,
QueueMonitoringRooms,
ExaminationDetail,
ExaminationType,
User,
UserRole,
HrmsEmployee,
HrmsDepartment,
HrmsPosition,
HospitalInformation,
HrmsShift,
ItemGroup,
ItemOrigin,
ItemType,
ItemTypeDetail,
Unit,
Currency,
InpatientRoom,
InpatientRoomBed,
EmrPatient,
EmrRegistration,
EmrDiagnosis,
EmrRegistrationOutpatient,
EmrRegistrationEmergency,
EmrRegistrationEmergencyResponsible,
DischargeStatusEmergency,
EmrInternalConsultation,
EmrBoardingRoom,
SurgeryRoom,
SurgeryType,
ItemCategory,
ItemStatus,
UsageInstructions,
UsageTime,
ItemClass,
ItemClassDetail,
GenericName,
Factory,
Supplier,
FactoryToSupplier,
ItemMaster,
PharmacyInfo,
ItemPrice,
SellingPricePercentage,
PatientGroup,
PatientGuarantor,
InitialStock,
DoctorItem,
DoctorItemPackage,
UserToRoom,
RoomToPharmacy,
PlanningVerificator,
RoomStock,
ScheduleSeries,
ScheduleException,
FareType,
CardType,
PaymentMethod,
RegistrationFee,
RefferalHospital,
Province,
City,
Subdistrict,
Ward,
ResponsiblePartyConsent,
FosterCareHistory,
Counter,
RoomNumber,
MainDisease,
CardKeySet,
CardPrintQueue,
EmrRegistrationTreatment,
TreatmentPlanSession,
TreatmentPlan,
PatientPastMedicalDocument
SitePoints,
],
subscribers: [],
migrations: [],
@ -230,3 +39,37 @@ export class OrmHelper {
.catch((error: any) => log.error(error));
}
}
// for seed datas
// export class OrmHelper {
// static DB: DataSource;
// static async setup(): Promise<void> {
// const log: Logger<ILogObj> = new Logger({
// name: "[OrmHelper]",
// type: "pretty",
// });
// const engine: "mysql" | "postgres" = config.get("database.engine");
// OrmHelper.DB = new DataSource({
// type: engine,
// host: config.get("database.host"),
// port: Number(config.get("database.port")),
// username: String(config.get("database.username")),
// password: String(config.get("database.password")),
// database: String(config.get("database.database")),
// synchronize: true,
// logging: config.get("database.logging"),
// entities: [SitePoints],
// subscribers: [],
// migrations: [],
// });
// try {
// await OrmHelper.DB.initialize();
// } catch (error: any) {
// log.error(error);
// throw error;
// }
// }
// }

View File

@ -1,23 +0,0 @@
import { CardKeySet } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class CardKeySetModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(CardKeySet);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("CardKeySet");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,37 +0,0 @@
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
import { CardPrintQueue } from "entity";
export class CardPrintQueueModel {
static async list(filterObj = {}, filterAny: string = ""): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(CardPrintQueue);
let whereAttr = [];
let whereVal: any = {};
if (filterObj) {
const filterResult = CommonHelper.handleQueryFilter(filterObj);
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny }),
col_any_eq: [],
col_any_like: ["name", "mrn"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
var query = repo.createQueryBuilder("card_print_queue");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,37 +0,0 @@
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
import { CardType } from "entity";
export class CardTypeModel {
static async list(filterObj = {}, filterAny: string = ""): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(CardType);
let whereAttr = [];
let whereVal: any = {};
if (filterObj) {
const filterResult = CommonHelper.handleQueryFilter(filterObj);
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny }),
col_any_eq: [],
col_any_like: ["name"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
var query = repo.createQueryBuilder("card_type");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,27 +0,0 @@
import { Currency } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class CurrencyModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(Currency);
let whereAttr = [];
let whereVal: any = {};
if (filter) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = {
...whereVal,
...CommonHelper.handleQueryFilter(filter).whereVal,
};
}
var query = null;
query = repo.createQueryBuilder();
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { Department } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DepartmentModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(Department);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("Department");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { Diagnosis } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DiagnosisModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(Diagnosis);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("Diagnosis");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,24 +0,0 @@
import { DiagnosticProcedure } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DiagnosticProcedureModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(DiagnosticProcedure);
let whereAttr = [];
let whereVal: any = {};
if (filter) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = null;
query = repo.createQueryBuilder("DiagnosticProcedure");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,27 +0,0 @@
import { DoctorItem } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DoctorItemModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(DoctorItem);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter, "DoctorItem");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
let query = repo
.createQueryBuilder("DoctorItem")
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,38 +0,0 @@
import { DoctorItemPackage } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DoctorItemPackageModel {
static async list(filter = {}, filterAny: string = ""): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(DoctorItemPackage);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter, "DoctorItemPackage");
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny.toLowerCase() }),
col_any_eq: [],
col_any_like: ["DoctorItemPackage.name"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
let query = repo
.createQueryBuilder("DoctorItemPackage")
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,26 +0,0 @@
import { DoctorSchedule } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class DoctorScheduleModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(DoctorSchedule);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filter);
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
var query = repo.createQueryBuilder("DoctorSchedule")
.leftJoinAndSelect("DoctorSchedule.doctor", "Doctor")
.leftJoinAndSelect("DoctorSchedule.room", "Room");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { ExaminationDetail } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class ExaminationDetailModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(ExaminationDetail);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("ExaminationDetail");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { ExaminationType } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class ExaminationTypeModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(ExaminationType);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("ExaminationType");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { Factory } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class FactoryModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(Factory);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "factory").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "factory").whereVal };
}
var query = repo.createQueryBuilder("factory");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,25 +0,0 @@
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
import { FactoryToSupplier } from "entity";
export class FactoryToSupplierModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(FactoryToSupplier);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "factory_to_supplier").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "factory_to_supplier").whereVal };
}
var query = repo.createQueryBuilder("factory_to_supplier")
.leftJoinAndSelect("factory_to_supplier.factory", "factory")
.leftJoinAndSelect("factory_to_supplier.supplier", "supplier")
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { FareType } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class FareTypeModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(FareType);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter).whereVal };
}
var query = repo.createQueryBuilder("FareType");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,37 +0,0 @@
import { FosterCareHistory } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class FosterCareHistoryModel {
static async list(filterObj = {}, filterAny: string = ""): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(FosterCareHistory);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filterObj && Object.keys(filterObj).length > 0) {
const filterResult = CommonHelper.handleQueryFilter(filterObj);
whereAttr = [...whereAttr, ...filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
if (filterAny && filterAny !== "" && filterAny !== null && filterAny !== undefined) {
const filterResult = CommonHelper.handleFilter({
filter: JSON.stringify({ any: filterAny }),
col_any_eq: [],
col_any_like: ["foster_care_history_code", "foster_care_history_name", "foster_care_history_type"],
});
if (filterResult.whereAttr && filterResult.whereAttr !== "") {
whereAttr = [...whereAttr, filterResult.whereAttr];
whereVal = { ...whereVal, ...filterResult.whereVal };
}
}
var query = repo.createQueryBuilder("FosterCareHistory");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { GenericName } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class GenericNameModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(GenericName);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "generic_name").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "generic_name").whereVal };
}
var query = repo.createQueryBuilder("generic_name");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { InitialStock } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class InitialStockModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(InitialStock);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "InitialStock").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "InitialStock").whereVal };
}
var query = repo.createQueryBuilder("InitialStock");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,28 +0,0 @@
import { InpatientRoom } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class InpatientRoomModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(InpatientRoom);
let whereAttr = [];
let whereVal: any = {};
if (filter) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter).whereAttr];
whereVal = {
...whereVal,
...CommonHelper.handleQueryFilter(filter).whereVal,
};
}
var query = null;
query = repo.createQueryBuilder();
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { ItemCategory } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class ItemCategoryModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(ItemCategory);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "item_category").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "item_category").whereVal };
}
var query = repo.createQueryBuilder("item_category");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

View File

@ -1,23 +0,0 @@
import { ItemClass } from "entity";
import { SelectQueryBuilder } from "typeorm";
import CommonHelper from "../helpers/common";
import { OrmHelper } from "../helpers/orm";
export class ItemClassModel {
static async list(filter = {}): Promise<SelectQueryBuilder<any>> {
const repo = OrmHelper.DB.getRepository(ItemClass);
let whereAttr: string[] = [];
let whereVal: any = {};
if (filter && Object.keys(filter).length > 0) {
whereAttr = [...whereAttr, ...CommonHelper.handleQueryFilter(filter, "item_class").whereAttr];
whereVal = { ...whereVal, ...CommonHelper.handleQueryFilter(filter, "item_class").whereVal };
}
var query = repo.createQueryBuilder("item_class");
if (whereAttr.length != 0) {
query = query.where(whereAttr.join(" and "), whereVal);
}
return query;
}
}

Some files were not shown because too many files have changed in this diff Show More