Files
aso/Modules/Linksehat/Http/Controllers/Api/ChatController.php
2024-06-10 10:00:46 +07:00

374 lines
14 KiB
PHP

<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Channel;
use App\Events\ChatMessageSent;
use App\Models\UserChannel;
use App\Models\Message;
use App\Models\File;
use App\Models\Livechat;
use App\Models\Person;
use App\Models\Prescription;
use App\Models\PrescriptionItem;
use App\Models\Drug;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Dompdf\Dompdf;
use Dompdf\Options;
use Pusher\Pusher;
class ChatController extends Controller
{
public function createChannel(Request $request){
// Validasi data yang diterima dari request
$validatedData = $request->validate([
'member_id' => 'required',
'doctor_id' => 'required',
], [
'member_id.required' => 'Member ID harus diisi.',
'doctor_id.required' => 'Doctor ID harus diisi.',
]);
// Buat dan simpan data channel ke dalam tabel
$channel = Channel::updateOrCreate([
'member_id' => $request->member_id,
'doctor_id' => $request->doctor_id,
],
[
'name' => $request->member_id .'_' . $request->doctor_id,
'type' => $request->type,
'member_id' => $request->member_id,
'doctor_id' => $request->doctor_id,
]);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk member_id
$userChannelMember = UserChannel::updateOrCreate(
[
'user_id' => $request->member_id,
'channel_id' => $channel->id
],
[
'user_id' => $request->member_id,
'channel_id' => $channel->id
]
);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk doctor_id
$userChannelDoctor = UserChannel::updateOrCreate(
[
'user_id' => $request->doctor_id,
'channel_id' => $channel->id
],
[
'user_id' => $request->doctor_id,
'channel_id' => $channel->id
]
);
// Berikan respons yang sesuai ke klien
return response()->json(['message' => 'Channel created successfully', 'channel' => $channel]);
}
public function listChannel(Request $request){
// Validasi request jika diperlukan
$channel = Channel::where('member_id',$request->user_id)->get()->toArray();
if (!$channel) {
$dataChannel = Channel::where('doctor_id',$request->user_id)->get()->toArray();
$data = [];
if ($dataChannel){
foreach($dataChannel as $d){
$user = User::with('detail')->where('nID', $d['member_id'])->first();
$lastMessage = Message::where('channel_id', $d['id'])
->latest('created_at')
->first();
$urlAvatarDefault = $user->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $user->detail->sImage ?? $urlAvatarDefault;
$arr['id'] = $d['id'];
$arr['avatar'] = $avatarMember;
$arr['name'] = $user->sFirstName .' '.$user->sLastName;
$arr['last_message'] = $lastMessage;
$arr['channel_id'] = $d['id'];
array_push($data, $arr);
}
}
$channel = $data;
}
return response()->json(['message' => 'Get List Channel successfully', 'channel' => $channel]);
}
public function sendMessage(Request $request)
{
// Validasi request jika diperlukan
$validatedData = $request->validate([
'user_id' => 'required'
]);
// Ambil data dari request
$message = Message::create([
'content' => $request->message,
'from_user' => $request->user_id,
'channel_id' => $request->channel_id,
'type' => $request->message ? 'text' : 'file'
]);
$pathFile = null;
if ($request->hasFile('file_chat')) {
foreach ($request->file_chat as $file) {
$pathFile = File::storeFile('chat', $message->id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\Message',
'fileable_id' => $message->id,
'type' => 'chat',
'name' => File::getFileName('chat', $message->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
$message->update([
'content' => env('LMS_APP_STORAGE') . 'storage/' . $pathFile,
'from_user' => $request->user_id,
'channel_id' => $request->channel_id,
'type' => 'file',
]);
}
// Berikan respons yang sesuai ke klien
$channel = Channel::where('id',$request->channel_id)->first();
if($channel->member_id == $request->user_id){
// Get nama dokter
$person = Person::where('id', $channel->doctor_id)->first();
$name = $person->name;
} else {
// Get nama pasien
$person = User::where('nID', $channel->member_id)->first();
$name = $person->sFirstName . ' ' . $person->sLastName;
}
ChatMessageSent::dispatch($message);
return response()->json([
'message' => 'Message sent successfully',
'data' => [
'header' => $name,
]
]);
}
public function getMessage(Request $request)
{
// Buat instance Pusher dengan konfigurasi yang sesuai
$channel = Channel::where('id',$request->channel_id)->first();
$livechat = Livechat::where([
'doctor_id' => $channel->doctor_id,
'patient_id' => $channel->member_id,
])->latest('created_at')->first();
if($channel->member_id == $request->user_id){
// Get nama dokter
$person = Person::where('id', $channel->doctor_id)->first();
$name = $person->name;
$avatar = '';
$age = '';
$gender = '';
$question = '';
$consultationStart = $livechat->start_date;
$consultationEnd = $livechat->end_date;
$work = '';
$weight = '-';
$height = '-';
$address = '';
$maritalStatus = '';
} else {
// Get nama pasien
$user = User::where('nID', $channel->member_id)->with('detail')->first();
$name = $user->sFirstName . ' ' . $user->sLastName;
$gender = null;
if ($user->detail) {
$urlAvatarDefault = $user->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatar = $user->detail->sImage ?? $urlAvatarDefault;
$gender = DB::connection('oldlms')->table('tm_jenis_kelamin')->where('nID', $user->detail->nIDJenisKelamin)->first('sJenisKelamin');
$age = Helper::calculateAge($user->detail->dTanggalLahir);
if ($gender){
$gender = $gender->sJenisKelamin;
}
$work = DB::connection('oldlms')->table('tm_pekerjaan')->where('nID', $user->detail->nIDPekerjaan)->first('sPekerjaan');
if($work){
$work = $work->sPekerjaan;
}
$maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->where('nID', $user->detail->sMartialStatus)->first('sStatusPernikahan');
if($maritalStatus){
$maritalStatus = $maritalStatus->sStatusPernikahan;
}
$weight = $user->detail->sWeight;
$height = $user->detail->sWeight;
} else {
$avatar = 'https://linksehat.dev/assets/img/users/male-avatar.png';
$age = '-';
$work = '-';
$maritalStatus = '-';
$weight = '-';
$height = '-';
}
$question = $livechat->descriptions;
$consultationStart = $livechat->start_date;
$consultationEnd = $livechat->end_date;
$address = DB::connection('oldlms')->table('tm_users_address')->where('nIDUser', $user->nID)->first('sAlamat');
if($address){
$address = $address->sAlamat;
}
}
// Ini Untul Chat
$perPage = $request->input('per_page', 10); // Default 10 pesan per halaman
$page = $request->input('page', 1); // Default halaman 1
$data = Message::where('channel_id', $request->channel_id)
->where('type', '!=', 'trigger')
->orderBy('created_at', 'desc') // Urutkan berdasarkan created_at secara descending
->paginate($perPage, ['*'], 'page', $page);
// Data Consultation Summary
$consultationSummary = [
'subject' => $livechat->subject,
'object' => $livechat->object,
'assessment' => $livechat->assessment,
'plan' => $livechat->plan,
];
$healthSertificate = false;
if ($livechat->health_certificate_start && $livechat->health_certificate_end){
$healthSertificate = True;
}
$prescription = Prescription::where('livechat_id', $livechat->id)->first();
$prescriptionItems = PrescriptionItem::with('drug')->where('prescription_id',$prescription->id)->get();
$prescriptions = [];
if ($prescriptionItems){
foreach($prescriptionItems as $item){
$row['medicine'] = $item->drug->name;
$row['direction'] = $item->direction;
$row['signa'] = $item->signa;
$row['note'] = $item->note;
array_push($prescriptions, $row);
}
}
// Berikan respons yang sesuai ke klien
return response()->json([
'message' => 'Message sent successfully',
'data' => [
'header' => $name,
'avatar' => $avatar,
'gender' => $gender,
'marital_status' => $maritalStatus,
'age' => $age,
'weight' => $weight,
'height' => $height,
'question' => $question,
'diseases' => [],
'medications' => [],
'allergy' => [],
'family_history' => [],
'start' => $consultationStart,
'end' => $consultationEnd,
'work' => $work,
'address' => $address,
'consultation_id' => $livechat->id,
'consultation_status' => Helper::getStatusLivechat($livechat->status),
'health_sertificate' => $healthSertificate,
'chat' => $data->items(),
'pagination' => [
'total' => $data->total(),
'per_page' => $data->perPage(),
'current_page' => $data->currentPage(),
'last_page' => $data->lastPage(),
'from' => $data->firstItem(),
'to' => $data->lastItem(),
],
'summary' => $consultationSummary,
'prescription' => $prescriptions
]
]);
}
public function downloadHealtcare($id){
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
$pdf->setPaper('A4', 'portrait');
$livechat = Livechat::where([
'id' => $id
])->latest('created_at')->first();
$user = User::where('nID', $livechat->patient_id)->with('detail')->first();
$name = $user->sFirstName . ' ' . $user->sLastName;
$age = Helper::calculateAge($user->detail->dTanggalLahir);
$person = Person::where('id', $livechat->doctor_id)->first();
$doctorName = $person->name;
$work = DB::connection('oldlms')->table('tm_pekerjaan')->where('nID', $user->detail->nIDPekerjaan)->first('sPekerjaan');
if($work){
$work = $work->sPekerjaan;
}
$address = DB::connection('oldlms')->table('tm_users_address')->where('nIDUser', $user->nID)->first('sAlamat');
if($address){
$address = $address->sAlamat;
}
// Memuat view pdf_view.php ke dalam variabel
$calculateDate = Helper::calculateDateDifference($livechat->health_certificate_start, $livechat->health_certificate_end);
$data = [
'name' => $name,
'age' => $age,
'work' => $work,
'address' => $address,
'doctor_name' => $doctorName,
'date' => $livechat->created_at,
'start_date' => $livechat->health_certificate_start,
'end_date' => $livechat->health_certificate_end,
'calculate_date' => $calculateDate
];
// Halaman 1
$html1 = view('pdf.health_sertificate', $data);
$htmlCombined = $html1 ;
$pdf->loadHtml($htmlCombined);
$pdf->render();
$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="file.pdf"',
];
return response($pdf->output(), 200, $headers);
}
}