123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- const HospitalRepository = require('../../repository/admin/HospitalRepository.js');
- const HttpException = require('../../utils/HttpException.js');
- const { SearchFilter } = require('../../utils/SearchFilter.js');
- const timeLocal = require('../../utils/TimeLocal.js');
- const { createLog, updateLog, deleteLog } = require('../../utils/LogActivity.js');
- const ProvinceRepository = require('../../repository/admin/ProvinceRepository.js');
- const CityRepository = require('../../repository/admin/CityRepository.js');
- const { BASE_URL } = require('../../../config/config.js');
- const prisma = require('../../prisma/PrismaClient.js');
- const { formatISOWithoutTimezone } = require('../../utils/FormatDate.js');
- exports.getAllHospitalService = async ({ page, limit, search, sortBy, orderBy, province, city, type, ownership, progress_status }) => {
- const skip = (page - 1) * limit;
- const where = {
- ...SearchFilter(search, ['name', 'province.id', 'city.id', 'type', 'ownership', 'simrs_type']),
- ...(province ? { province_id: province } : {}),
- ...(city ? { city_id: city } : {}),
- ...(type ? { type: type } : {}),
- ...(ownership ? { ownership: ownership } : {}),
- ...(progress_status ? { progress_status: progress_status } : {}),
- deletedAt: null
- };
- const [hospitals, total] = await Promise.all([
- HospitalRepository.findAll({ skip, take: limit, where, orderBy: { [sortBy]: orderBy } }),
- HospitalRepository.countAll(where)
- ]);
- return { hospitals, total };
- };
- exports.showHospitalService = async (id) => {
- const hospital = await HospitalRepository.findById(id);
- if (!hospital) {
- throw new HttpException("Data hospital not found", 404);
- }
- return hospital;
- };
- exports.storeHospitalService = async (validateData, req) => {
- const creatorId = req.user.id;
- const province = await ProvinceRepository.findById(validateData.province_id);
- if (!province) {
- throw new HttpException('Province not found', 404);
- }
- const city = await CityRepository.findById(validateData.city_id);
- if (!city) {
- throw new HttpException('City not found', 404);
- }
- if (!req.file) {
- throw new HttpException({ image: ['image file is required'] }, 422);
- }
- const existingHospital = await prisma.hospital.findFirst({
- where: {
- name: validateData.name,
- city_id: validateData.city_id,
- deletedAt: null
- }
- });
- if (existingHospital) {
- throw new HttpException('Hospital with same name in this city already exists', 400);
- }
- const imagePath = req.file ? `/storage/img/${req.file.filename}` : null;
- const payload = {
- ...validateData,
- image: imagePath,
- progress_status: "cari_data",
- // simrs_type: "-",
- created_by: creatorId
- };
- const data = await HospitalRepository.create(payload);
- await createLog(req, data);
- };
- const validProgressStatuses = ['cari_data', 'dihubungi', 'negosiasi', 'follow_up', 'mou', 'onboarded', 'tidak_berminat'];
- exports.updateHospitalService = async (validateData, id, req) => {
- const hospital = await HospitalRepository.findById(id);
- if (!hospital) {
- throw new HttpException("Hospital data not found", 404);
- }
- const province = await ProvinceRepository.findById(validateData.province_id);
- if (!province) {
- throw new HttpException('Province not found', 404);
- }
- const city = await CityRepository.findById(validateData.city_id);
- if (!city) {
- throw new HttpException('City not found', 404);
- }
- if (validateData.progress_status && !validProgressStatuses.includes(validateData.progress_status)) {
- throw new HttpException(
- `Invalid progress_status. Allowed values are: ${validProgressStatuses.join(', ')}`,
- 422
- );
- }
- const existingHospital = await prisma.hospital.findFirst({
- where: {
- name: validateData.name,
- city_id: validateData.city_id,
- deletedAt: null
- }
- });
- if (existingHospital) {
- throw new HttpException('Hospital with same name in this city already exists', 400);
- }
- // Jika ada file baru, replace image
- let imagePath = hospital.image; // pakai yang lama
- if (req.file) {
- imagePath = `/storage/img/${req.file.filename}`; // path relatif
- }
- const payload = {
- ...validateData,
- image: imagePath,
- // created_by: req.user.id,
- };
- const data = await HospitalRepository.update(id, payload);
- await updateLog(req, data);
- };
- exports.deleteHospitalService = async (id, req) => {
- const hospital = await HospitalRepository.findById(id);
- if (!hospital) {
- throw new HttpException('Hospital not found', 404);
- }
- const data = await HospitalRepository.update(id, {
- deletedAt: timeLocal.now().toDate()
- });
- await deleteLog(req, data);
- };
|