update site points controller and route to add new endpoint for all data
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
This commit is contained in:
@ -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
|
||||
},
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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, {});
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
import { Response } from 'express';
|
||||
import { ErrorType, ErrorValidation } from 'entity';
|
||||
// import { ErrorType, ErrorValidation } from 'entity';
|
||||
|
||||
export class ReturnHelper {
|
||||
static successResponseAny(
|
||||
|
||||
@ -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,
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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
Reference in New Issue
Block a user