359 lines
13 KiB
PHP
359 lines
13 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\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;
|
|
}
|
|
// 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,
|
|
|
|
]
|
|
]);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|