update master data pharmacy

This commit is contained in:
Muhammad Rayhan Ardiansyah
2026-02-27 14:34:50 +07:00
parent 3cd4755c8e
commit ce1e4d3466
16 changed files with 2696 additions and 42 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,343 @@
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_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_abbreviation = param.usage_instructions_abbreviation
data.updated_by = req.auth.data.name;
await repo.save(data);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data);
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message);
}
}
static async delete(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'Usage Instructions ID.',
required: true,
type: 'string'
}
#swagger.parameters['hard'] = {
in: 'path',
description: 'Is Hard Delete',
required: false,
type: 'boolean'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID'),
hard: Joi.bool().optional().allow('').label('Is hard delete?')
});
const param: { id: string, hard: boolean } = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageInstructions);
const existData = await repo.findOne({ where: { id: param.id } });
if (existData && !param.hard) {
existData.deleted_by = req.auth.data.name;
await OrmHelper.DB.manager.save(existData);
}
const affected = (!param.hard ? await repo.softDelete({ id: param.id }) : await repo.delete({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message);
}
}
static async restore(req: Request, res: Response, next: NextFunction): Promise<Response> {
/*
#swagger.tags = ['Pharmacy - UsageInstructions']
#swagger.security = [{
"bearerAuth": []
}]
#swagger.parameters['id'] = {
in: 'path',
description: 'UsageInstructions ID.',
required: true,
type: 'string'
}
*/
try {
const schema = Joi.object().keys({
id: Joi.string().uuid().required().label('ID')
});
const param: UsageInstructions = await schema.validateAsync(req.params);
const repo = OrmHelper.DB.getRepository(UsageInstructions);
const affected = (await repo.restore({ id: param.id })).affected;
if (affected > 0) {
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {});
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message);
}
}
}

View File

@ -0,0 +1,343 @@
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);
}
}
}

23
src/model/factory.ts Normal file
View File

@ -0,0 +1,23 @@
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;
}
}

23
src/model/generic_name.ts Normal file
View File

@ -0,0 +1,23 @@
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;
}
}

23
src/model/item_class.ts Normal file
View File

@ -0,0 +1,23 @@
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;
}
}

View File

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

23
src/model/supplier.ts Normal file
View File

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

View File

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

23
src/model/usage_time.ts Normal file
View File

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

View File

@ -35,6 +35,12 @@ import { ItemTypeDetailController } from '../controllers/pharmacy/item_type_deta
import { ItemTypeController } from '../controllers/pharmacy/item_type'; import { ItemTypeController } from '../controllers/pharmacy/item_type';
import { ItemOriginController } from '../controllers/pharmacy/item_origin'; import { ItemOriginController } from '../controllers/pharmacy/item_origin';
import { ItemGroupController } from '../controllers/pharmacy/item_group'; import { ItemGroupController } from '../controllers/pharmacy/item_group';
import { UsageInstructionsController } from '../controllers/pharmacy/usage_instructions';
import { UsageTimeController } from '../controllers/pharmacy/usage_time';
import { ItemClassController } from '../controllers/pharmacy/item_class';
import { ItemClassDetailController } from '../controllers/pharmacy/item_class_detail';
import { FactoryController } from '../controllers/pharmacy/factory';
import { SupplierController } from '../controllers/pharmacy/supplier';
export class RoutePrivate { export class RoutePrivate {
static setup(app: express.Application) { static setup(app: express.Application) {
@ -221,54 +227,102 @@ export class RoutePrivate {
app.post('/api/hospital-information/upload-logo', HospitalInformationController.uploadlogo) app.post('/api/hospital-information/upload-logo', HospitalInformationController.uploadlogo)
app.delete('/api/hospital-information/delete-logo', HospitalInformationController.deletelogo) app.delete('/api/hospital-information/delete-logo', HospitalInformationController.deletelogo)
app.get('/api/item-group/list', ItemGroupController.list) app.get('/api/pharmacy/item-group/list', ItemGroupController.list)
app.get('/api/item-group/export', ItemGroupController.export) app.get('/api/pharmacy/item-group/export', ItemGroupController.export)
app.post('/api/item-group/create', ItemGroupController.create) app.post('/api/pharmacy/item-group/create', ItemGroupController.create)
app.put('/api/item-group/update/:id', ItemGroupController.update) app.put('/api/pharmacy/item-group/update/:id', ItemGroupController.update)
app.delete('/api/item-group/delete/:id/:hard', ItemGroupController.delete) app.delete('/api/pharmacy/item-group/delete/:id/:hard', ItemGroupController.delete)
app.put('/api/item-group/restore/:id', ItemGroupController.restore) app.put('/api/pharmacy/item-group/restore/:id', ItemGroupController.restore)
app.get('/api/item-origin/list', ItemOriginController.list) app.get('/api/pharmacy/item-origin/list', ItemOriginController.list)
app.get('/api/item-origin/export', ItemOriginController.export) app.get('/api/pharmacy/item-origin/export', ItemOriginController.export)
app.post('/api/item-origin/create', ItemOriginController.create) app.post('/api/pharmacy/item-origin/create', ItemOriginController.create)
app.put('/api/item-origin/update/:id', ItemOriginController.update) app.put('/api/pharmacy/item-origin/update/:id', ItemOriginController.update)
app.delete('/api/item-origin/delete/:id/:hard', ItemOriginController.delete) app.delete('/api/pharmacy/item-origin/delete/:id/:hard', ItemOriginController.delete)
app.put('/api/item-origin/restore/:id', ItemOriginController.restore) app.put('/api/pharmacy/item-origin/restore/:id', ItemOriginController.restore)
app.get('/api/item-type/list', ItemTypeController.list) app.get('/api/pharmacy/item-type/list', ItemTypeController.list)
app.get('/api/item-type/export', ItemTypeController.export) app.get('/api/pharmacy/item-type/export', ItemTypeController.export)
app.post('/api/item-type/create', ItemTypeController.create) app.post('/api/pharmacy/item-type/create', ItemTypeController.create)
app.put('/api/item-type/update/:id', ItemTypeController.update) app.put('/api/pharmacy/item-type/update/:id', ItemTypeController.update)
app.delete('/api/item-type/delete/:id/:hard', ItemTypeController.delete) app.delete('/api/pharmacy/item-type/delete/:id/:hard', ItemTypeController.delete)
app.put('/api/item-type/restore/:id', ItemTypeController.restore) app.put('/api/pharmacy/item-type/restore/:id', ItemTypeController.restore)
app.get('/api/item-type-detail/list', ItemTypeDetailController.list) app.get('/api/pharmacy/item-type-detail/list', ItemTypeDetailController.list)
app.get('/api/item-type-detail/export', ItemTypeDetailController.export) app.get('/api/pharmacy/item-type-detail/export', ItemTypeDetailController.export)
app.post('/api/item-type-detail/create', ItemTypeDetailController.create) app.post('/api/pharmacy/item-type-detail/create', ItemTypeDetailController.create)
app.put('/api/item-type-detail/update/:id', ItemTypeDetailController.update) app.put('/api/pharmacy/item-type-detail/update/:id', ItemTypeDetailController.update)
app.delete('/api/item-type-detail/delete/:id/:hard', ItemTypeDetailController.delete) app.delete('/api/pharmacy/item-type-detail/delete/:id/:hard', ItemTypeDetailController.delete)
app.put('/api/item-type-detail/restore/:id', ItemTypeDetailController.restore) app.put('/api/pharmacy/item-type-detail/restore/:id', ItemTypeDetailController.restore)
app.get('/api/unit/list', UnitController.list) app.get('/api/pharmacy/unit/list', UnitController.list)
app.get('/api/unit/export', UnitController.export) app.get('/api/pharmacy/unit/export', UnitController.export)
app.post('/api/unit/create', UnitController.create) app.post('/api/pharmacy/unit/create', UnitController.create)
app.put('/api/unit/update/:id', UnitController.update) app.put('/api/pharmacy/unit/update/:id', UnitController.update)
app.delete('/api/unit/delete/:id/:hard', UnitController.delete) app.delete('/api/pharmacy/unit/delete/:id/:hard', UnitController.delete)
app.put('/api/unit/restore/:id', UnitController.restore) app.put('/api/pharmacy/unit/restore/:id', UnitController.restore)
app.get('/api/item-category/list', ItemCategoryController.list) app.get('/api/pharmacy/item-category/list', ItemCategoryController.list)
app.get('/api/item-category/export', ItemCategoryController.export) app.get('/api/pharmacy/item-category/export', ItemCategoryController.export)
app.post('/api/item-category/create', ItemCategoryController.create) app.post('/api/pharmacy/item-category/create', ItemCategoryController.create)
app.put('/api/item-category/update/:id', ItemCategoryController.update) app.put('/api/pharmacy/item-category/update/:id', ItemCategoryController.update)
app.delete('/api/item-category/delete/:id/:hard', ItemCategoryController.delete) app.delete('/api/pharmacy/item-category/delete/:id/:hard', ItemCategoryController.delete)
app.put('/api/item-category/restore/:id', ItemCategoryController.restore) app.put('/api/pharmacy/item-category/restore/:id', ItemCategoryController.restore)
app.get('/api/item-status/list', ItemStatusController.list) app.get('/api/pharmacy/item-status/list', ItemStatusController.list)
app.get('/api/item-status/export', ItemStatusController.export) app.get('/api/pharmacy/item-status/export', ItemStatusController.export)
app.post('/api/item-status/create', ItemStatusController.create) app.post('/api/pharmacy/item-status/create', ItemStatusController.create)
app.put('/api/item-status/update/:id', ItemStatusController.update) app.put('/api/pharmacy/item-status/update/:id', ItemStatusController.update)
app.delete('/api/item-status/delete/:id/:hard', ItemStatusController.delete) app.delete('/api/pharmacy/item-status/delete/:id/:hard', ItemStatusController.delete)
app.put('/api/item-status/restore/:id', ItemStatusController.restore) app.put('/api/pharmacy/item-status/restore/:id', ItemStatusController.restore)
app.get('/api/pharmacy/usage-instructions/list', UsageInstructionsController.list)
app.get('/api/pharmacy/usage-instructions/export', UsageInstructionsController.export)
app.post('/api/pharmacy/usage-instructions/create', UsageInstructionsController.create)
app.put('/api/pharmacy/usage-instructions/update/:id', UsageInstructionsController.update)
app.delete('/api/pharmacy/usage-instructions/delete/:id/:hard', UsageInstructionsController.delete)
app.put('/api/pharmacy/usage-instructions/restore/:id', UsageInstructionsController.restore)
app.get('/api/pharmacy/usage-time/list', UsageTimeController.list)
app.get('/api/pharmacy/usage-time/export', UsageTimeController.export)
app.post('/api/pharmacy/usage-time/create', UsageTimeController.create)
app.put('/api/pharmacy/usage-time/update/:id', UsageTimeController.update)
app.delete('/api/pharmacy/usage-time/delete/:id/:hard', UsageTimeController.delete)
app.put('/api/pharmacy/usage-time/restore/:id', UsageTimeController.restore)
app.get('/api/pharmacy/item-class/list', ItemClassController.list)
app.get('/api/pharmacy/item-class/export', ItemClassController.export)
app.post('/api/pharmacy/item-class/create', ItemClassController.create)
app.put('/api/pharmacy/item-class/update/:id', ItemClassController.update)
app.delete('/api/pharmacy/item-class/delete/:id/:hard', ItemClassController.delete)
app.put('/api/pharmacy/item-class/restore/:id', ItemClassController.restore)
app.get('/api/pharmacy/item-class-detail/list', ItemClassDetailController.list)
app.get('/api/pharmacy/item-class-detail/export', ItemClassDetailController.export)
app.post('/api/pharmacy/item-class-detail/create', ItemClassDetailController.create)
app.put('/api/pharmacy/item-class-detail/update/:id', ItemClassDetailController.update)
app.delete('/api/pharmacy/item-class-detail/delete/:id/:hard', ItemClassDetailController.delete)
app.put('/api/pharmacy/item-class-detail/restore/:id', ItemClassDetailController.restore)
app.get('/api/pharmacy/generic-name/list', ItemClassDetailController.list)
app.get('/api/pharmacy/generic-name/export', ItemClassDetailController.export)
app.post('/api/pharmacy/generic-name/create', ItemClassDetailController.create)
app.put('/api/pharmacy/generic-name/update/:id', ItemClassDetailController.update)
app.delete('/api/pharmacy/generic-name/delete/:id/:hard', ItemClassDetailController.delete)
app.put('/api/pharmacy/generic-name/restore/:id', ItemClassDetailController.restore)
app.get('/api/pharmacy/factory/list', FactoryController.list)
app.get('/api/pharmacy/factory/export', FactoryController.export)
app.post('/api/pharmacy/factory/create', FactoryController.create)
app.put('/api/pharmacy/factory/update/:id', FactoryController.update)
app.delete('/api/pharmacy/factory/delete/:id/:hard', FactoryController.delete)
app.put('/api/pharmacy/factory/restore/:id', FactoryController.restore)
app.get('/api/pharmacy/supplier/list', SupplierController.list)
app.get('/api/pharmacy/supplier/export', SupplierController.export)
app.post('/api/pharmacy/supplier/create', SupplierController.create)
app.put('/api/pharmacy/supplier/update/:id', SupplierController.update)
app.delete('/api/pharmacy/supplier/delete/:id/:hard', SupplierController.delete)
app.put('/api/pharmacy/supplier/restore/:id', SupplierController.restore)
} }
} }

View File

@ -227,6 +227,36 @@ const doc = {
item_status: { item_status: {
$status_name: 'Itemstatus name', $status_name: 'Itemstatus name',
}, },
item_class: {
$item_class_name: 'ItemClass name',
},
item_class_detail: {
$class_detail_name: 'ItemClassDetail name',
},
usage_instructions: {
$usage_instructions_name: 'UsageInstructions name',
$usage_instructions_abbreviation: 'UsageInstructions Abbreviation'
},
usage_time: {
$usage_time_name: 'UsageInstructions name',
$usage_time_abbreviation: 'UsageInstructions Abbreviation'
},
generic_name: {
$generic_name: 'Generic name',
},
factory: {
$factory_name: 'factory name',
$address: 'Factory address',
$web: 'Factory url web',
$phone: 'Factory phone',
$email: 'Factory email'
},
supplier: {
$supplier_name: 'supplier name',
$address: 'supplier address',
$phone: 'supplier phone',
$email: 'supplier email'
},
}, },
parameters: { parameters: {