Merge remote-tracking branch 'origin/staging' into origin/production

This commit is contained in:
Linksehat Staging Server
2024-05-20 08:49:14 +07:00
107 changed files with 9366 additions and 105 deletions

View File

@@ -296,7 +296,9 @@ class ClaimController extends Controller
'Excess Paid',
'Diagnosis',
'Keterangan',
'Catatan'
'Catatan',
'Invoice No',
'Billing No'
];
$style = (new StyleBuilder())
->setFontBold()
@@ -336,7 +338,9 @@ class ClaimController extends Controller
DB::raw('
(Select SUM(request_log_benefits.amount_approved) as tot_bill FROM request_log_benefits
WHERE request_log_benefits.request_log_id = request_logs.id AND request_log_benefits.deleted_at IS NULL LIMIT 1) AS tot_bill
')
'),
'request_logs.invoice_no',
'request_logs.billing_no',
)
->groupBy(
'request_logs.submission_date',
@@ -509,6 +513,8 @@ class ClaimController extends Controller
!empty($item->diagnosis) ? $item->diagnosis : '',
!empty($item->keterangan) ? $item->keterangan : '',
!empty($item->catatan) ? $item->catatan : '',
!empty($item->invoice_no) ? $item->invoice_no : '',
!empty($item->billing_no) ? $item->billing_no : '',
];
array_push($dataRow,$rowData);
@@ -543,6 +549,8 @@ class ClaimController extends Controller
'',
'',
'',
!empty($item->invoice_no) ? $item->invoice_no : '',
!empty($item->billing_no) ? $item->billing_no : '',
];
array_push($dataRow,$rowData);

View File

@@ -14,6 +14,10 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController;
use Modules\Client\Http\Controllers\Api\ClaimReportController;
use Modules\Client\Http\Controllers\Api\ClaimRequestController;
use Modules\Client\Http\Controllers\Api\DataController;
use Modules\Internal\Http\Controllers\Api\FormulariumController;
use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController;
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
use Modules\Internal\Http\Controllers\Api\CorporateController;
/*
|--------------------------------------------------------------------------
@@ -71,5 +75,20 @@ Route::prefix('client')->group(function () {
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::post('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::get('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'index']);
Route::post('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'store']);
Route::post('master/formulariums/{formulariums_template_id}/import', [FormulariumController::class, 'import']);
Route::get('master/formulariums/{formulariums_template_id}/list', [FormulariumController::class, 'generateFormulariumList']);
Route::get('master/formularium-template', [FormulariumTemplateController::class, 'index']);
Route::get('master/formularium-template/search', [FormulariumTemplateController::class, 'search']);
Route::post('master/formularium-template/store', [FormulariumTemplateController::class, 'store']);
Route::put('master/formularium-template/{id}/activation', [FormulariumTemplateController::class, 'activation']);
Route::get('master/formularium-template/{id}/edit', [FormulariumTemplateController::class, 'edit']);
Route::put('master/formularium-template/{id}/update', [FormulariumTemplateController::class, 'update']);
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
});
});

View File

@@ -34,6 +34,9 @@ use Modules\Internal\Transformers\RequestLogResource;
use App\Models\RequestLog;
use ZipArchive;
use File;
use PDF;
class ClaimController extends Controller
@@ -91,13 +94,13 @@ class ClaimController extends Controller
// (SELECT plans.code FROM plans WHERE plans.id = member_plans.plan_id LIMIT 1) AS plan_code
// '),
DB::raw('
(SELECT plans.code
FROM plans
(SELECT plans.code
FROM plans
WHERE plans.id IN (
SELECT member_plans.plan_id
FROM member_plans
SELECT member_plans.plan_id
FROM member_plans
WHERE member_plans.member_id = claim_requests.member_id
)
)
AND plans.service_code = claim_requests.service_code) AS plan_code
'),
DB::raw('
@@ -116,13 +119,103 @@ class ClaimController extends Controller
'claim_requests.status_claim_management as status',
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function downloadTemplate()
public function filesProvider(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 50;
$results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->join('files', 'request_logs.id', '=', 'files.fileable_id')
// ->leftJoin('member_plans', 'member_plans.member_id', '=', 'members.id')
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('members.name', 'like', "%" . $search . "%");
$query->orWhere('request_logs.code', 'like', "%" . $search . "%");
$query->orWhere('members.member_id', 'like', "%" . $search . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
$query->orderBy($orderBy, $direction);
})
->when($request->input('start_date') , function ($query, $start_date) {
$query->where(function ($query) use ($start_date) {
$query->where('request_logs.created_at', '>=', $start_date. ' 00:00:00');
});
})
->when($request->input('end_date') , function ($query, $end_date) {
$query->where(function ($query) use ($end_date) {
$query->where('request_logs.created_at', '<=', $end_date. ' 23:59:59');
});
})
->when($request->input('provider') , function ($query, $provider) {
$query->where(function ($query) use ($provider) {
$query->where('request_logs.organization_id', '=', $provider);
});
})
->where('files.fileable_type', '=', 'App\Models\RequestLog')
->where('request_logs.final_log', '=', '1')
->where('request_logs.status_final_log', '=', 'approved')
->select(
'files.original_name as files',
'files.id',
'files.id AS id_log',
'request_logs.code as code',
'members.name',
'request_logs.created_at',
DB::raw('
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
'),
'request_logs.status_final_log as status',
DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path")
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function downloadZip(Request $request)
{
$selectedRows = $request->selectedRows; // asumsi $selectedRows berisi array ID file yang dipilih
$files = [];
// Ambil path file dari database atau sumber lain sesuai dengan $selectedRows
$data = DB::table('files')
->whereIn('id', $selectedRows)
->select('path')
->get();
foreach ($data as $value) {
$files[] = storage_path('app/public/' . $value->path);
}
$zipFileName = 'downloaded_files.zip';
$zip = new ZipArchive();
if ($zip->open(storage_path('app/public/' . $zipFileName), ZipArchive::CREATE | ZipArchive::OVERWRITE)) {
foreach ($files as $file) {
$zip->addFile($file, basename($file));
}
$zip->close();
// Mengembalikan response berupa URL file zip
return response()->json(['file_url' => env('APP_URL').Storage::url($zipFileName)], 200);
} else {
return response()->json(['message' => 'Gagal membuat file ZIP.'], 500);
}
}
public function downloadTemplate()
{
return Helper::responseJson([
'file_name' => "Template - Claim - Management.xlsx",
@@ -155,7 +248,7 @@ class ClaimController extends Controller
'approval_by_claim_management' => auth()->user()->id,
'approval_date_claim_management' => date('Y-m-d H:i:s'),
]);
if ($affectedRows === 0) {
$check_status = DB::table('claim_requests')
->where('code','=', $row['code'])
@@ -183,16 +276,16 @@ class ClaimController extends Controller
$row['error'] = $e->getMessage();
if(!$row['code'])
{
$row['error'] = 'Kolom Code wajib isi';
$row['error'] = 'Kolom Code wajib isi';
}
if(!$row['qc'])
{
$row['error'] = 'Kolom QC wajib isi';
$row['error'] = 'Kolom QC wajib isi';
}
$result_rows[] = $row;
$failedRows[] = $row;
}
}
}
$response = [
'message' => 'File uploaded and data saved to database',
@@ -217,7 +310,7 @@ class ClaimController extends Controller
$row[] = $data[0][$i];
$header[] = $data[0][0];
}
$filed = [];
foreach ($header[0] as $value)
{
@@ -228,18 +321,18 @@ class ClaimController extends Controller
$filed[] = $modelColumn;
}
}
$result = [];
foreach ($row as $subarray) {
$trimmedSubarray = [];
for ($i = 0; $i < count($filed); $i++) {
$trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null;
}
$result[] = $trimmedSubarray;
}
return $result;
}
}
public function exportClaimManagement(Request $request)
{
@@ -314,13 +407,13 @@ class ClaimController extends Controller
'),
'claim_requests.created_at',
DB::raw('
(SELECT plans.code
FROM plans
(SELECT plans.code
FROM plans
WHERE plans.id IN (
SELECT member_plans.plan_id
FROM member_plans
SELECT member_plans.plan_id
FROM member_plans
WHERE member_plans.member_id = claim_requests.member_id
)
)
AND plans.service_code = claim_requests.service_code) AS plan_code
'),
// DB::raw('
@@ -391,7 +484,7 @@ class ClaimController extends Controller
->setCellAlignment(CellAlignment::LEFT)
// ->setBackgroundColor(Color::YELLOW)
->build();
$footerRow = WriterEntityFactory::createRowFromArray($footer, $style);
$writer->addRow($footerRow);
@@ -426,10 +519,10 @@ class ClaimController extends Controller
$headerRow = WriterEntityFactory::createRowFromArray($header, $style);
$writer->addRow($headerRow);
// ============================
foreach($request->params as $item)
{
$rowData = [
$item['code'],
$item['qc'],
@@ -461,7 +554,7 @@ class ClaimController extends Controller
->setCellAlignment(CellAlignment::LEFT)
// ->setBackgroundColor(Color::YELLOW)
->build();
$footerRow = WriterEntityFactory::createRowFromArray($footer, $style);
$writer->addRow($footerRow);

View File

@@ -3,6 +3,7 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Drug;
use App\Models\Unit;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -25,6 +26,37 @@ class DrugController extends Controller
return $drugs;
}
public function drugList(Request $request){
$drugs = Drug::query()
->where([
'atc_code' => 'lms', // ini untuk menggunakan list obat yang baru
])
->get();
$manipulatedDrugs = $drugs->map(function ($drug) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $drug->id, // Ganti dengan properti yang sesuai dari model Icd
'label' => $drug->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedDrugs);
}
public function unitList(Request $request){
$units = Unit::query()
->get();
$manipulatedUnits = $units->map(function ($unit) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $unit->id, // Ganti dengan properti yang sesuai dari model Icd
'label' => $unit->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedUnits);
}
/**
* Show the form for creating a new resource.
* @return Renderable
@@ -123,20 +155,22 @@ class DrugController extends Controller
foreach ($processedData as $row) {
try {
Drug::create(
[
'name' => $row['name'],
'code' => $row['code'],
'generic_name' => $row['generic_name'],
'description' => $row['description'],
'mims_class' => $row['mims_class'],
'indications' => $row['indications'],
'atc_code' => $row['atc_code'],
'segmentation' => $row['segmentation'],
'type' => $row['type'],
'dosage' => $row['dosage'],
'remark' => $row['remark'],
]
Drug::updateOrCreate([
'code' => $row['code'],
],
[
'name' => $row['name'],
'code' => $row['code'],
'generic_name' => $row['generic_name'],
'description' => $row['description'],
'mims_class' => $row['mims_class'],
'indications' => $row['indications'],
'atc_code' => $row['atc_code'],
'segmentation' => $row['segmentation'],
'type' => $row['type'],
'dosage' => $row['dosage'],
'remark' => $row['remark'],
]
);
$importedRows++;
} catch (\Exception $e) {

View File

@@ -24,20 +24,44 @@ use Modules\Internal\Services\IcdService;
class FormulariumTemplateController extends Controller
{
public function index(Request $request)
{
if ($request->search){
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = FormulariumTemplate::query()
// ->filter($request->toArray())
->orderBy('name', 'ASC')
->paginate(15);
return $diagnosisTemplate;
{ if($request->corporate_id)
{
if ($request->search){
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
})
->join('corporate_formulariums', 'formularium_templates.id', '=', 'corporate_formulariums.formularium_template_id')
->where('corporate_formulariums.corporate_id', '=', $request->corporate_id)
->select('formularium_templates.*', 'corporate_formulariums.corporate_id')
->orderBy('formularium_templates.id', 'ASC')
->paginate(15);
} else {
$diagnosisTemplate = FormulariumTemplate::query()
// ->filter($request->toArray())
->join('corporate_formulariums', 'formularium_templates.id', '=', 'corporate_formulariums.formularium_template_id')
->where('corporate_formulariums.corporate_id', '=', $request->corporate_id)
->select('formularium_templates.*', 'corporate_formulariums.corporate_id')
->orderBy('formularium_templates.id', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
else
{
if ($request->search){
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = FormulariumTemplate::query()
// ->filter($request->toArray())
->orderBy('name', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
}
/**
@@ -127,7 +151,7 @@ class FormulariumTemplateController extends Controller
})->limit(10)->get();
}
public function import(Request $request)
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
@@ -171,7 +195,7 @@ class FormulariumTemplateController extends Controller
6 => 'version',
7 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
@@ -246,7 +270,7 @@ class FormulariumTemplateController extends Controller
public function activation(Request $request, $id)
{
$request->validate([
'active' => 'required'
]);
@@ -268,20 +292,20 @@ class FormulariumTemplateController extends Controller
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
@@ -295,22 +319,22 @@ class FormulariumTemplateController extends Controller
$item['active'] == 1 ? 'Active' : 'Inactive', // Status
$item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
}

View File

@@ -2,11 +2,36 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\Livechat;
use App\Models\OLDLMS\LivechatSummary;
use App\Models\OLDLMS\Appointment;
use App\Models\OLDLMS\Dokter;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\Prescription;
use App\Models\OLDLMS\PrescriptionItem;
use App\Models\Prescription as PrescriptionAso;
use App\Models\PrescriptionItem as PrescriptionItemAso;
use App\Models\Icd;
use App\Models\Organization;
use App\Models\Drug;
use App\Models\Unit;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Transformers\LivechatResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Dompdf\Dompdf;
use Dompdf\Options;
use DB;
class PrescriptionController extends Controller
{
@@ -15,21 +40,31 @@ class PrescriptionController extends Controller
* @param int|null $id
* @return \Illuminate\Http\JsonResponse
*/
public function index($id = null)
public function index(Request $request)
{
$query = Prescription::query();
if ($id !== null) {
$query->where('nID', $id);
$startDate = $request->startDate;
$endDate = $request->endDate;
$livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare', 'summary')
->where('nTebusObat', '=', 1);
// ->where('nIDAppointment', '!=', null)
// ->where('nIDAppointment', '!=', '');
if ($startDate) {
$livechat = $livechat->where('dCreateOn', '>=', $startDate);
}
$prescriptions = $query->select('nID','nIDLiveChat', 'nIDLiveChatSummary', 'nIDDokter', 'sDokterName', 'dTanggalResep', 'sSource', 'nIDUser', 'sKodeResep', 'sDiagnose', 'sStatus')
->get();
// $prescriptions->toArray();
// dd($prescriptions);
if ($endDate) {
$endDate = date('Y-m-d', strtotime($endDate . ' +1 day'));
$livechat = $livechat->where('dCreateOn', '<', $endDate);
}
return response()->json($prescriptions);
// return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
$livechat = $livechat->whereHas('summary', function ($query) {
$query->whereNotNull('nIDLiveChat');
});
$livechat = $livechat->latest()->paginate(15);
return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
@@ -51,6 +86,128 @@ class PrescriptionController extends Controller
*/
public function store(Request $request)
{
// Insert atau Update ke table prescription di ASO
$data = [
'livechat_id' => $request->id,
'organization_id' => $request->hospital,
'icd_code' => $request->diagnosis,
];
$prescriptionAso = PrescriptionAso::updateOrCreate([
'livechat_id' => $request->id
], $data);
// Insert ke table tx_prescription di Linksehat
$livechat = Livechat::where('nID', $request->id)->first();
$livechatSummary = LivechatSummary::where('nIDLivechat', $request->id)->first();
$dokterData = Dokter::where('nIDUser', $livechat->nIDDokter)->first();
$nIDDokter = $dokterData ? $dokterData->nID : $livechat->nIDDokter;
$userDokter = User::where('nID', $livechat->nIDDokter)->first();
$userDetailDokter = UserDetail::where('nIDUser', $userDokter->nID)->first();
$dokter = $userDetailDokter->sTitlePrefix . ' ' . $userDokter->sFirstName . ' ' . $userDokter->sLastName . ' ' . $userDetailDokter->sTitleSuffix;
$kodeResep = 'LMS' . date('ymd') . rand(1,100);
$diagnosis = explode(",",$request->diagnosis);
if(isset($request->diagnosis) && is_array($diagnosis) && count($diagnosis) > 0) {
foreach($diagnosis as $data){
$icd = Icd::where('code', $data)->first();
array_push($diagnosis, $icd->name);
};
}
$sDiagnosis = implode(", ",$diagnosis);
$hospitalData = Organization::where('id', $request->hospital)->first();
$hospital = '';
if ($hospitalData) {
$hospital = $hospitalData->code;
}
$data = [
'nIDLivechat' => $request->id,
'nIDLivechatSummary' => $livechatSummary->nID,
'nIDDokter' => $nIDDokter,
'sDokterName' => $dokter,
'dTanggalResep' => date('Y-m-d H:i:s'),
'sSource' => 'lms',
'nIDUser' => $livechat->nIDUser,
'sRegID' => '',
'sKodeResep' => $kodeResep,
'sDiagnose' => $sDiagnosis,
'sKodeRS' => $hospital,
];
$prescription = Prescription::updateOrCreate([
'nIDLivechat' => $request->id
],$data);
$medicine = $request->medicine;
$customMessages = [
'required' => 'Kolom :attribute wajib diisi.',
'numeric' => 'Kolom :attribute harus berupa angka.',
];
$validator = Validator::make($request->all(), [
'medicine' => 'required|array',
'medicine.*' => 'required',
], $customMessages);
if ($validator->fails()) {
return Helper::responseJson([$request->all()],'error', 400, $validator->errors());
} else {
// BeginTransaction
// delete item
DB::beginTransaction();
PrescriptionItemAso::where('prescription_id', $prescriptionAso->id)->delete();
PrescriptionItem::where('nIDPrescription', $prescription->nID)->delete();
foreach($medicine as $key => $value){
$drugData = Drug::where('id', $value['drug_id'])->first();
$drug = '';
$drugCode = '';
if ($drugData){
$drug = $drugData->name;
$drugCode = $drugData->code;
}
$unitData = Unit::where('id', $value['unit_id'])->first();
$unit = '';
if ($unitData) {
$unit = $unitData->name;
}
// Insert Data
$dataAso = [
'prescription_id' => $prescriptionAso->id,
'drug_id' => $value['drug_id'],
'qty' => $value['qty'],
'unit_id' => $value['unit_id'],
'signa' => $value['signa'],
'note' => $value['note']
];
$data = [
'nIDPrescription' => $prescription->nID,
'sItemName' => $drug,
'sItemCode' => $drug,
'sOriginCode' => $drugCode,
'nQty' => $value['qty'],
'sSatuan' => $unit,
'sSigna' => $value['signa'],
'sNote' => $value['note'],
];
try {
// Insert to ASO
PrescriptionItemAso::create($dataAso);
// Insert to Linksehat
PrescriptionItem::create($data);
} catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
DB::commit();
return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray());
}
return Helper::responseJson(status: 'success', statusCode: 200, message: 'Resep Online berhasil ajukan!', data: $prescription);
}
/**
@@ -93,4 +250,58 @@ class PrescriptionController extends Controller
{
//
}
public function downloadPrescription($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::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare')
->where('nIDAppointment', '!=', null)->where('nIDAppointment', '!=', '')
->where('nID', $id)
->first();
$prescription = Prescription::where('nIDLivechat', $id)->first();
$valid_date = date('d-m-Y', strtotime($prescription->dTanggalResep . ' +3 days'));
$prescriptionItem = PrescriptionItem::where('nIDPrescription', $prescription->nID)->get();
$user = User::where('nID', $livechat->nIDUser)->first();
$doctor = Dokter::where('nIDUser', $livechat->nIDDokter)->first();
$patient = [
'name' => $user->sFirstName. ' '. $user->sMiddleName. ' '. $user->sLastName,
'tgl_lahir' => date('d-m-Y', strtotime($user->dTanggalLahir)),
'kelamin' => $user->nIDJenisKelamin == 1 ? 'M' : 'F',
'umur' => Helper::calculateAge($user->dTanggalLahir)
];
// Memuat view pdf_view.php ke dalam variabel
$data = [
'doctor' => $doctor,
'items' => $prescriptionItem,
'tanggal_resep' => date('d-m-Y', strtotime($prescription->dTanggalResep)),
'pasien' => $patient,
'valid_date' => $valid_date,
];
// Halaman 1
$html1 = view('pdf.prescription', $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);
}
}

View File

@@ -215,6 +215,24 @@ class RequestLogController extends Controller
return Helper::responseJson(data: $manipulatedIcds);
}
public function hospitals(){
$organizations = Organization::query()
->where([
'type' => 'hospital',
'status' => 'active',
])
->get();
$manipulatedOrganizations = $organizations->map(function ($organization) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $organization->id, // Ganti dengan properti yang sesuai dari model Icd
'label' => $organization->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedOrganizations);
}
/**
* Show the form for editing the specified resource.
* @param int $id
@@ -255,6 +273,14 @@ class RequestLogController extends Controller
$requestLog->catatan = $request->catatan;
}
if (!empty($request->billing_no)) {
$requestLog->billing_no = $request->billing_no;
}
if (!empty($request->invoice_no)) {
$requestLog->invoice_no = $request->invoice_no;
}
if (!empty($request->reason)) {
$requestLog->reason = $request->reason;
}
@@ -301,10 +327,12 @@ class RequestLogController extends Controller
$requestLog = RequestLog::findOrFail($id);
$requestLog->status_final_log = null;
$requestLog->final_log = 0;
$requestLog->reason_final = 'Reason Delete ' .$request->reason;
$requestLog->reason_final = 'Reason Delete Final LOG' .$request->reason;
$requestLog->save();
// Hapus semua manfaat log permintaan terkait
RequestLogBenefit::where('request_log_id', $id)->delete();
return response()->json([
'error' => false,
'message' => 'Delete Final LOG',
@@ -406,7 +434,13 @@ class RequestLogController extends Controller
// Update Request LOG untuk lanjut ke Final LOG
// if (!empty($request->catatan)) {
$requestLog->catatan = $request->catatan;
// }
}
if (!empty($request->billing_no)) {
$requestLog->billing_no = $request->billing_no;
}
if (!empty($request->invoice_no)) {
$requestLog->invoice_no = $request->invoice_no;
}
if ($request->discharge_date) {
$requestLog->discharge_date = $request->discharge_date;
}

View File

@@ -238,6 +238,8 @@ Route::prefix('internal')->group(function () {
Route::post('claims/{claim_id}/set-final-encounter', [ClaimEncounterController::class, 'setFinalEncounter']);
Route::get('claims', [ClaimController::class, 'index']);
Route::get('claims-files-provider', [ClaimController::class, 'filesProvider']);
Route::post('download-zip', [ClaimController::class, 'downloadZip']);
Route::get('claims/download-template', [ClaimController::class, 'downloadTemplate']);
Route::post('claims/import', [ClaimController::class, 'import']);
Route::post('claims/exportFiled/', [ClaimController::class, 'exportFiled']);
@@ -285,6 +287,10 @@ Route::prefix('internal')->group(function () {
// search diagnosis
Route::get('diagnosis', [RequestLogController::class, 'diagnosis']);
Route::get('hospitals', [RequestLogController::class, 'hospitals']);
Route::get('drugs', [DrugController::class, 'drugList']);
Route::get('units', [DrugController::class, 'unitList']);
// insert benefit
Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']);
Route::post('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']);
@@ -301,7 +307,13 @@ Route::prefix('internal')->group(function () {
Route::resource('appointments', AppointmentController::class);
Route::get('live-chat/export', [LivechatController::class, 'export']);
Route::resource('live-chat', LivechatController::class);
Route::get('prescription', [PrescriptionController::class, 'index']);
Route::post('prescription', [PrescriptionController::class, 'store']);
Route::get('prescription-download/{id}', [PrescriptionController::class, 'downloadPrescription']);
Route::get('prescription/{id}', [PrescriptionController::class, 'index']);
Route::get('doctorrating', [DoctorRatingController::class, 'index']);
Route::get('doctorrating/{id}', [PrescriptionController::class, 'index']);

View File

@@ -61,6 +61,8 @@ class DoctorResource extends JsonResource
'speciality_id' => $item->speciality->id,
];
}),
'period_start' => $items->pluck('period_start')->first(),
'period_end' => $items->pluck('period_end')->first(),
];
});

View File

@@ -5,6 +5,8 @@ namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Helpers\Helper;
use App\Models\Prescription;
use App\Models\PrescriptionItem;
class LivechatResource extends JsonResource
{
@@ -16,6 +18,20 @@ class LivechatResource extends JsonResource
*/
public function toArray($request)
{
$prescription = Prescription::where('livechat_id', $this->nID)->first();
$diagnosis = $prescription ? $prescription->icd_code : '';
$hospital = $prescription ? $prescription->organization_id : '';
$prescriptionItem = $prescription ? PrescriptionItem::where('prescription_id', $prescription->id)->get() : [
[
'drug_id' => 0,
'qty' => 0,
'signa' => '',
'unit_id' => 0,
'note' => '', // input to database
]
];
$livechat = [
'id' => $this->nID,
'doctor_name' => isset($this->doctor->user->sFirstName) ? $this->doctor->user->detail->sTitlePrefix . '. ' . $this->doctor->user->sFirstName . ' ' . $this->doctor->user->sLastName . ' ' . $this->doctor->user->detail->sTitleSuffix : null,
@@ -36,6 +52,9 @@ class LivechatResource extends JsonResource
'appointment_media' => $this->appointment->sMedia ?? null,
'status_chat' => $this->status_name ?? null,
'payment_method' => $this->appointment->payment_method ?? null,
'diagnosis' => $diagnosis,
'hospital' => $hospital,
'medicine' => $prescriptionItem
];
$start_time = $this->dStartTime;

View File

@@ -42,7 +42,7 @@ class RequestLogShowResource extends JsonResource
$claimCode = $claimRequest->code;
$isReversal = false;
$isRole = auth()->user()->role_id;
if ($requestLog['status'] == 'approved' &&
if ($requestLog['status'] == 'approved' &&
$requestLog['status_final_log'] == 'approved' &&
$claimRequest->status == 'approved' &&
$claimRequest->status_claim_management == 'approved' &&
@@ -108,11 +108,14 @@ class RequestLogShowResource extends JsonResource
->whereIn('code', $diagnosis)
->select('code', 'name')
->get();
}
}
$data = [
'id' => $requestLog['id'],
'code' => $requestLog['code'],
'invoice_no' => $requestLog['invoice_no'],
'billing_no' => $requestLog['billing_no'],
'code' => $requestLog['code'],
'code_claim' => $claimCode,
'member_id' => $requestLog['member']['member_id'],
'corporate_id' => $corporateId,

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\Linksehat\Helpers\Doctor;
class ApiResponse
{
public static function apiResponse(string $status, array|object $data = null, string|array|object $message = null, int $statusCode)
{
if ($message instanceof \Illuminate\Support\MessageBag) {
$message = $message->first();
}
return response()->json([
'meta' => [
'status' => $status,
'code' => $statusCode,
'message' => $message
],
'data' => $data,
], $statusCode);
}
}

View File

@@ -3,6 +3,9 @@
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\User;
use App\Models\Icd;
use App\Models\Drug;
use App\Models\Unit;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -93,5 +96,51 @@ class AutocompleteController extends Controller {
}
return Helper::responseJson($data);
}
public function diagnosis(){
$icds = Icd::query()
->get();
$manipulatedIcds = $icds->map(function ($icd) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $icd->code, // Ganti dengan properti yang sesuai dari model Icd
'label' => $icd->code . ' - ' .$icd->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedIcds);
}
public function drugList(Request $request){
$drugs = Drug::query()
->where([
'atc_code' => 'lms', // ini untuk menggunakan list obat yang baru
])
->get();
$manipulatedDrugs = $drugs->map(function ($drug) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $drug->id, // Ganti dengan properti yang sesuai dari model Icd
'label' => $drug->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedDrugs);
}
public function unitList(Request $request){
$units = Unit::query()
->get();
$manipulatedUnits = $units->map(function ($unit) {
// Contoh manipulasi, tambahkan atau ubah properti sesuai kebutuhan
return [
'value' => $unit->id, // Ganti dengan properti yang sesuai dari model Icd
'label' => $unit->name, // Ganti dengan properti yang sesuai dari model Icd
];
});
return Helper::responseJson(data: $manipulatedUnits);
}
}

View File

@@ -0,0 +1,323 @@
<?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([
'name' => $request->member_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;
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 = '';
$address = '';
} else {
// Get nama pasien
$user = User::where('nID', $channel->member_id)->with('detail')->first();
$name = $user->sFirstName . ' ' . $user->sLastName;
$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');
if ($gender){
$gender = $gender->sJenisKelamin;
}
$age = Helper::calculateAge($user->detail->dTanggalLahir);
$question = $livechat->descriptions;
$consultationStart = $livechat->start_date;
$consultationEnd = $livechat->end_date;
$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;
}
}
// 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,
'age' => $age,
'question' => $question,
'start' => $consultationStart,
'end' => $consultationEnd,
'work' => $work,
'address' => $address,
'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,
'livechat_id' => $livechat->id,
'health_sertificate' => $healthSertificate,
]
]);
}
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);
}
}

View File

@@ -0,0 +1,264 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api\Doctor;
use App\Http\Controllers\Controller;
use App\Models\User;
use Crypt;
use Error;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use App\Helpers\Helper;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\DB;
class AuthDoctorController extends Controller
{
public function login(Request $request)
{
$data = [
'email' => $request->email,
'password' => $request->password
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required'
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'password.required' => trans('Validation.required',['attribute' => 'Password']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$user = User::where('email', $request->email)->first();
if (!$user) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
if (!Hash::check($request->password, $user->password)) {
return ApiResponse::apiResponse('Bad Request', $data, trans('Message.password'), 400);
}
$res_data = [
// 'user' => $user,
'token' => $user->createToken('app')->plainTextToken
];
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
}
public function logout(Request $request)
{
$request->user()->tokens()->delete();
return ApiResponse::apiResponse('Success', [], trans('Message.logout'), 200);
}
public function forgotPassword(Request $request)
{
$data = [
'email' => $request->email,
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$user = User::where('email', $request->email)->first();
if (!$user) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
//send email
// Insert data notifications
$emailTo = $request->email;
$dataNotif = [
'user_id' => $user->id,
'email' => $emailTo,
'title' => 'Forgot Password',
'description' => 'Request forgot password from App Doctor',
'type' => 1,
'isUnRead' => true,
'created_by' => auth()->check() ? auth()->user()->id : null,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$sendNotif = Helper::insertNotification($dataNotif);
//Insert data password reset
$token = mt_rand(100000, 999999); // Menghasilkan angka acak antara 100000 dan 999999
$p_resets = DB::table('password_resets')
->insert([
'email' => $request->email,
'token' => $token,
'created_at' => date('Y-m-d H:i:s'),
]);
// Send Email after insert notifications
if($sendNotif && $p_resets)
{
//send to alarm
$nameTo = 'User';
$dataEmail = [
'email' => $emailTo,
'name' => $nameTo,
'subject' => 'Request Forgot Password from App Doctor Date '. date('Y-m-d H:i:s'),
'body' => View::make('email/forgot_password', ['token' => $token])->render(),
];
Helper::sendEmail($dataEmail);
$res = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $token)
->get();
return ApiResponse::apiResponse("Success", $res, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Internal Server Error", $data, trans('Message.server_error'), 500);
}
}
}
public function verifCode(Request $request)
{
$data = [
'email' => $request->email,
'token' => $request->token,
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'token' => 'required|numeric',
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'token.required' => trans('Validation.required',['attribute' => 'Token']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
//Check Time
$check = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $request->token)
->select('created_at')
->first();
if($check)
{
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
$now = time(); // Waktu sekarang dalam UNIX timestamp
// Hitung selisih waktu dalam menit
$diffInMinutes = ($now - $created_at) / 60;
if ($diffInMinutes > 60) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
} else {
// Lanjutkan dengan proses pemulihan kata sandi
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
}
}
public function resetPassword(Request $request)
{
$data = [
'email' => $request->email,
'token' => $request->token,
'new_password' => $request->new_password
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'token' => 'required|numeric',
'new_password' => [
'required',
'min:8',
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/'
]
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'token.required' => trans('Validation.required',['attribute' => 'Token']),
'new_password.required' => trans('Validation.required',['attribute' => 'New Password']),
'new_password.min' => trans('Validation.min',['attribute' => 'New Password']),
'new_password.regex' => trans('Validation.regex',['attribute' => 'New Password']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
//Check Time
$check = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $request->token)
->select('created_at')
->first();
if($check)
{
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
$now = time(); // Waktu sekarang dalam UNIX timestamp
// Hitung selisih waktu dalam menit
$diffInMinutes = ($now - $created_at) / 60;
if ($diffInMinutes > 60) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
} else {
// Lanjutkan dengan proses pemulihan kata sandi
$user = User::where('email', $request->email)->first();
if ($user)
{
$newPassword = Hash::make($request->new_password);
$user->password = $newPassword;
$user->save();
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
}
}
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
}
}
}

View File

@@ -0,0 +1,205 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api\Doctor;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\OLDLMS\User as UserLMS;
use App\Models\Livechat;
use App\Models\Channel;
use App\Models\Message;
use App\Models\Prescription;
use App\Models\PrescriptionItem;
use Crypt;
use Error;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use App\Helpers\Helper;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\DB;
class ChatDoctorController extends Controller
{
public function getChat()
{
$data = [
'user_id' => auth()->check() ? auth()->user()->id : null,
];
$user_id = auth()->check() ? auth()->user()->id : null;
//Get data Chat
$user = User::where('id',$user_id)->with('person')->first();
$chat = Livechat::where([
'doctor_id'=> $user->person_id,
'accept_date'=> null,
'status' => 1
])->get();
$dataIncomingChat = [];
if($chat) {
foreach($chat as $c){
$patient = UserLMS::where('nID',$c->patient_id)->with('detail')->first();
$urlAvatarDefault = $patient->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $patient->detail->sImage ?? $urlAvatarDefault;
$arr['id'] = $c->id;
$arr['patient_id'] = $patient->nID;
$arr['avatar'] = $avatarMember;
$arr['name'] = $patient->sFirstName .' '.$patient->sLastName; ;
array_push($dataIncomingChat, $arr);
}
}
$dataChannel = Channel::where('doctor_id',$user->person_id)->get()->toArray();
$dataOnGoing = [];
if ($dataChannel){
foreach($dataChannel as $d){
$user = UserLMS::with('detail')->where('nID', $d['member_id'])->first();
$lastMessage = Message::where('channel_id', $d['id'])
->latest('created_at')
->first();
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';
$avatarMember = $user->detail->sImage ?? $urlAvatarDefault;
} else {
$avatarMember = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$arr['id'] = $d['id'];
$arr['avatar'] = $avatarMember;
$arr['name'] = $user->sFirstName .' '.$user->sLastName;
$arr['last_message'] = $lastMessage;
array_push($dataOnGoing, $arr);
}
}
$channel = $data;
$data = [
'incoming_chat' => $dataIncomingChat,
'ongoing_chat' => $dataOnGoing
];
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
public function getChatDetail($id){
$livechat = Livechat::find($id);
$user = UserLMS::with('detail')->where('nID', $livechat->patient_id)->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;
$gender = DB::connection('oldlms')->table('tm_jenis_kelamin')->where('nID', $user->detail->nIDJenisKelamin)->first('sJenisKelamin');
$maritalStaus = DB::connection('oldlms')->table('tm_status_pernikahan')->where('nID', $user->detail->sMartialStatus)->first('sStatusPernikahan');
$data = [];
if ($livechat->status != 2){
$data = [
'id' => $user->nID,
'name' => $user->sFirstName . ' ' . $user->sLastName,
'avatar' => $avatarMember,
'gender' => $gender->sJenisKelamin,
'marital_status' => $maritalStaus->sStatusPernikahan,
'age' => Helper::calculateAge($user->detail->dTanggalLahir),
'weight' => $user->detail->sWeight,
'height' => $user->detail->sHeight,
'question' => $livechat->descriptions,
'diseases' => [],
'medications' => [],
'allergy' => [],
'family_history' => []
];
} else if ($livechat->status == 2){ // sudah accept, tinggal tunggu bayar pasient
$data = [
'message' => 'waiting payment'
];
}
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
public function declineChat(Request $request)
{
$livechat = Livechat::find($request->id);
if ($livechat) {
// Memperbarui atribut model
$livechat->status = 3; // Decline
// Menyimpan perubahan ke database
$livechat->save();
return ApiResponse::apiResponse("Success",['message' => 'Livechat updated successfully'], trans('Message.success'), 200);
} else {
return response()->json(['message' => 'Livechat not found'], 404);
}
}
public function approveChat(Request $request)
{
$livechat = Livechat::find($request->id);
if ($livechat) {
// Memperbarui atribut model
$livechat->status = 2; // Accept
$livechat->accept_date = date('Y-m-d H:i:s'); // Accept
// Menyimpan perubahan ke database
$livechat->save();
return ApiResponse::apiResponse("Success",['message' => 'Livechat updated successfully'], trans('Message.success'), 200);
} else {
return response()->json(['message' => 'Livechat not found'], 404);
}
}
public function endChat(Request $request)
{
$livechat = Livechat::find($request->id);
if ($livechat) {
// Memperbarui atribut model
$livechat->status = 6; // End Chat
$livechat->end_date = date('Y-m-d H:i:s'); // Accept
// Menyimpan perubahan ke database
$livechat->save();
return ApiResponse::apiResponse("Success",['message' => 'Livechat updated successfully'], trans('Message.success'), 200);
} else {
return response()->json(['message' => 'Livechat not found'], 404);
}
}
public function summaryChat(Request $request)
{
$livechat = Livechat::find($request->id);
if ($livechat) {
// Memperbarui atribut model
$livechat->subject = $request->subject; // Subject
$livechat->object = $request->object; // Object
$livechat->assessment = $request->assessment; // Assessment
$livechat->plan = $request->plan; // Plan
$livechat->health_certificate_start = $request->health_certificate_start; // start
$livechat->health_certificate_end = $request->health_certificate_end; // end
// Menyimpan perubahan ke database
$livechat->save();
$prescriptions = Prescription::create([
'livechat_id' => $livechat->id,
'organization_id' => $livechat->organization_id,
]);
if ($request->prescriptions) {
foreach ($request->prescriptions as $prescription) {
$prescriptionItem = PrescriptionItem::create([
'prescription_id' => $prescriptions->id,
'drug_id' => $prescription['medicine'],
'signa' => $prescription['dosis'],
'direction' => $prescription['direction'],
'note' => $prescription['note'],
]);
}
}
return ApiResponse::apiResponse("Success",['message' => 'Livechat updated successfully'], trans('Message.success'), 200);
} else {
return response()->json(['message' => 'Livechat not found'], 404);
}
}
}

View File

@@ -0,0 +1,175 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api\Doctor;
use App\Http\Controllers\Controller;
use App\Models\User;
use Crypt;
use Error;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use App\Helpers\Helper;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\DB;
class ProfileDoctorController extends Controller
{
public function getProfile()
{
$data = [
'user_id' => auth()->check() ? auth()->user()->id : null,
];
$user_id = auth()->check() ? auth()->user()->id : null;
//Get data Profile
$dataProfile = DB::table('users')
->join('persons','persons.id', '=', 'users.person_id')
->leftJoin('person_educations','person_educations.person_id', '=', 'persons.id')
->leftJoin('practitioners','practitioners.person_id', '=', 'persons.id')
->leftJoin('practitioner_roles','practitioner_roles.practitioner_id', '=', 'practitioners.id')
->where('users.id', '=', $user_id)
->select(
'persons.name',
DB::raw('
"Pediatrics" AS specialist
'),
DB::raw('
"4" AS rating
'),
'persons.name AS full_name',
'persons.birth_date as date_of_birth',
'persons.gender',
'persons.phone AS mobile_number',
'persons.email',
'practitioners.str_number',
'practitioners.exp_date_str',
'practitioner_roles.sip_number',
'practitioner_roles.exp_date_sip'
)
->first();
//Name
$dataName = [
'name' => $dataProfile->name,
'specialist' => $dataProfile->specialist,
'rating' => $dataProfile->rating
];
$res_data['dataName'] = $dataName;
// Basic
$dataProfileBasic = [
'full_name' => $dataProfile->full_name,
'date_of_birth' => $dataProfile->date_of_birth ? date('d M Y', strtotime($dataProfile->date_of_birth)) : '',
'gender' => $dataProfile->gender
];
$res_data['dataProfileBasic'] = $dataProfileBasic;
//Contact
$dataProfileContact = [
'mobile_number' => $dataProfile->mobile_number,
'email' => $dataProfile->email
];
$res_data['dataProfileContact'] = $dataProfileContact;
//Education
$dataEdu = DB::table('users')
->join('persons','persons.id', '=', 'users.person_id')
->leftJoin('person_educations','person_educations.person_id', '=', 'persons.id')
->where('users.id', '=', $user_id)
->select(
'person_educations.level_id',
'person_educations.name',
'person_educations.start_date',
'person_educations.end_date',
)
->get();
$dataEducations = [];
foreach($dataEdu as $val)
{
$dataEducations[] = [
'level_id' => $val->level_id,
'name' => $val->name,
'start_date' => date('d/m/Y', strtotime($val->start_date)),
'end_date' => date('d/m/Y', strtotime($val->end_date)),
];
}
$res_data['dataEducations'] = $dataEducations;
//Work Experience
$dataWork = DB::table('users')
->join('persons','persons.id', '=', 'users.person_id')
->leftJoin('practitioners','practitioners.person_id', '=', 'persons.id')
->leftJoin('practitioner_roles','practitioner_roles.practitioner_id', '=', 'practitioners.id')
->leftJoin('organizations','organizations.id', '=', 'practitioner_roles.organization_id')
->where('users.id', '=', $user_id)
->select(
'organizations.name',
'practitioner_roles.period_start',
'practitioner_roles.period_end',
)
->get();
$dataWorkExperience = [];
foreach ($dataWork as $val)
{
$dataWorkExperience[] = [
'name' => $val->name ? $val->name : '',
'period' => $this->fWorkExperience($val->period_start, $val->period_end)
];
}
$res_data['dataWorkExperience'] = $dataWorkExperience;
//STR
$dataStr = [
'str_number' => $dataProfile->str_number,
'exp_date_str' => $dataProfile->exp_date_str ? date('d M Y', strtotime($dataProfile->exp_date_str)) : ''
];
$res_data['dataStr'] = $dataStr;
//SIP
$dataSip = [
'sip_number' => $dataProfile->sip_number,
'exp_date_sip' => $dataProfile->exp_date_sip ? date('d M Y', strtotime($dataProfile->exp_date_sip)) : ''
];
$res_data['dataSip'] = $dataSip;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
public function fWorkExperience($start, $end)
{
$startDateString = $start; // Tanggal dan waktu awal
$endDateString = $end ; // Tanggal dan waktu akhir
// Mengubah string tanggal ke timestamp UNIX
$startTime = strtotime($startDateString);
$endTime = strtotime($endDateString);
// Menghitung selisih waktu dalam detik
$timeDifference = $endTime - $startTime;
// Menghitung jumlah tahun, bulan, dan hari dari selisih waktu
$years = floor($timeDifference / (365 * 24 * 60 * 60));
$months = floor(($timeDifference - ($years * 365 * 24 * 60 * 60)) / (30 * 24 * 60 * 60));
$days = floor(($timeDifference - ($years * 365 * 24 * 60 * 60) - ($months * 30 * 24 * 60 * 60)) / (24 * 60 * 60));
// Formatkan hasilnya
$experience = '';
if ($years > 0) {
$experience .= $years . ' years ';
}
if ($months > 0) {
$experience .= $months . ' months ';
}
if ($days > 0) {
$experience .= $days . ' days';
}
return $experience;
}
}

View File

@@ -0,0 +1,360 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Organization;
use App\Models\Speciality;
use App\Models\Livechat;
use App\Models\Channel;
use App\Models\UserChannel;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Exception;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Redirect;
class DuitkuController extends Controller
{
public function configuration()
{
$duitkuConfig = new \Duitku\Config(env('API_KEY_DUITKU'), env('CODE_MERCHANT_DUITKU'));
// false for production mode
// true for sandbox mode
$duitkuConfig->setSandboxMode(true);
// set sanitizer (default : true)
$duitkuConfig->setSanitizedMode(false);
// set log parameter (default : true)
$duitkuConfig->setDuitkuLogs(false);
return $duitkuConfig;
}
public function createInvoice(Request $request)
{
$data = [
'paymentMethod' => $request->paymentMethod,
'paymentAmount' => $request->paymentAmount,
'email' => $request->email,
'phoneNumber' => $request->phoneNumber,
'productDetails' => $request->productDetails,
'merchantOrderId' => $request->merchantOrderId,
'additionalParam' => $request->additionalParam,
'merchantUserInfo' => $request->merchantUserInfo,
'customerVaName' => $request->customerVaName,
// 'callbackUrl' => $request->callbackUrl,
// 'returnUrl' => $request->returnUrl,
// 'expiryPeriod' => $request->expiryPeriod,
'firstName' => $request->firstName,
'lastName' => $request->lastName,
'alamat' => $request->alamat,
'city' => $request->city,
'postalCode' => $request->postalCode,
// 'countryCode' => $request->countryCode
];
$validator = Validator::make($request->all(), [
'paymentMethod' => 'nullable',
'paymentAmount' => 'required',
'email' => 'required|email',
'phoneNumber' => 'nullable',
'productDetails' => 'required',
'merchantOrderId' => 'required',
'additionalParam' => 'nullable',
'merchantUserInfo' => 'nullable',
'customerVaName' => 'required',
// 'callbackUrl' => 'required',
// 'returnUrl' => 'nullable',
// 'expiryPeriod' => 'required',
'firstName' => 'required',
'lastName' => 'required',
'alamat' => 'required',
'city' => 'required',
'postalCode' => 'required',
// 'countryCode' => 'required'
], [
'paymentAmount.required' => 'Jumlah pembayaran harus diisi',
'email.required' => 'Email harus diisi',
'email.email' => 'Format email salah',
'productDetails.required' => 'Judul pembayaran harus diisi',
'merchantOrderId.required' => 'Order ID harus diisi',
'customerVaName.required' => 'Nama panggilan pelanggan harus diisi',
'firstName.required' => 'Nama depan pelanggan harus diisi',
'lastName.required' => 'Nama belakang pelanggan harus diisi',
'alamat.required' => 'Alamat pelanggan harus diisi',
'city.required' => 'Kota pelanggan harus diisi',
'postalCode.required' => 'Kode pos pelanggan harus diisi',
]);
if ($validator->fails())
{
return Helper::responseJson(
data: $data,
status: 'Bad Request',
statusCode: 400,
message: $validator->errors()
);
}
else
{
#CONTOH DARI DUITKU
// $paymentMethod = ""; // PaymentMethod list => https://docs.duitku.com/pop/id/#payment-method
// $paymentAmount = 10000; // Amount
// $email = "customer@gmail.com"; // your customer email
// $phoneNumber = "081234567890"; // your customer phone number (optional)
// $productDetails = "Test Payment";
// $merchantOrderId = "2"; // from merchant, unique
// $additionalParam = ''; // optional
// $merchantUserInfo = ''; // optional
// $customerVaName = 'John Doe'; // display name on bank confirmation display
// $callbackUrl = 'http://YOUR_SERVER/callback'; // url for callback
// $returnUrl = 'http://YOUR_SERVER/return'; // url for redirect
// $expiryPeriod = 60; // set the expired time in minutes
// // Customer Detail
// $firstName = "John";
// $lastName = "Doe";
// // Address
// $alamat = "Jl. Kembangan Raya";
// $city = "Jakarta";
// $postalCode = "11530";
// $countryCode = "ID";
$paymentMethod = $request->paymentMethod; // PaymentMethod list => https://docs.duitku.com/pop/id/#payment-method
$paymentAmount = $request->paymentAmount; // Amount
$email = $request->email; // your customer email
$phoneNumber = $request->phoneNumber; // your customer phone number (optional)
$productDetails = $request->productDetails;
$merchantOrderId = $request->merchantOrderId; // from merchant, unique
$additionalParam = $request->additionalParam; // optional
$merchantUserInfo = $request->merchantUserInfo; // optional
$customerVaName = $request->customerVaName; // display name on bank confirmation display
$callbackUrl = env('APP_URL').'/api/linksehat/callback-duitku'; // url for callback
$returnUrl = env('APP_URL').'/api/linksehat/redirect-duitku';; // url for redirect
$expiryPeriod = 60; // set the expired time in minutes
// Customer Detail
$firstName = $request->firstName;
$lastName = $request->lastName;
// Address
$alamat = $request->alamat;
$city = $request->city;
$postalCode = $request->postalCode;
$countryCode = "ID";
$address = array(
'firstName' => $firstName,
'lastName' => $lastName,
'address' => $alamat,
'city' => $city,
'postalCode' => $postalCode,
'phone' => $phoneNumber,
'countryCode' => $countryCode
);
$customerDetail = array(
'firstName' => $firstName,
'lastName' => $lastName,
'email' => $email,
'phoneNumber' => $phoneNumber,
'billingAddress' => $address,
'shippingAddress' => $address
);
// Item Details
$item1 = array(
'name' => $productDetails,
'price' => $paymentAmount,
'quantity' => 1
);
$itemDetails = array(
$item1
);
$params = array(
'paymentAmount' => $paymentAmount,
'merchantOrderId' => $merchantOrderId,
'productDetails' => $productDetails,
'additionalParam' => $additionalParam,
'merchantUserInfo' => $merchantUserInfo,
'customerVaName' => $customerVaName,
'email' => $email,
'phoneNumber' => $phoneNumber,
'itemDetails' => $itemDetails,
'customerDetail' => $customerDetail,
'callbackUrl' => $callbackUrl,
'returnUrl' => $returnUrl,
'expiryPeriod' => $expiryPeriod
);
$duitkuConfig = $this->configuration();
try {
// createInvoice Request
$responseDuitkuPop = \Duitku\Pop::createInvoice($params, $duitkuConfig);
header('Content-Type: application/json');
echo $responseDuitkuPop;
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
public function paymentMethod(Request $request)
{
$duitkuConfig = $this->configuration();
try {
$paymentAmount = "10000"; //"YOUR_AMOUNT";
$paymentMethodList = \Duitku\Pop::getPaymentMethod($paymentAmount, $duitkuConfig);
header('Content-Type: application/json');
echo $paymentMethodList;
} catch (Exception $e) {
echo $e->getMessage();
}
}
public function checkStatus(Request $request)
{
$duitkuConfig = $this->configuration();
$data = [
'merchantOrderId' => $request->merchantOrderId
];
$validator = Validator::make($request->all(), [
'merchantOrderId' => 'required',
], [
'merchantOrderId.required' => 'Order ID harus diisi',
]);
if ($validator->fails())
{
return Helper::responseJson(
data: $data,
status: 'Bad Request',
statusCode: 400,
message: $validator->errors()
);
}
else
{
try {
$merchantOrderId = $request->merchantOrderId;
$transactionList = \Duitku\Pop::transactionStatus($merchantOrderId, $duitkuConfig);
header('Content-Type: application/json');
$transaction = json_decode($transactionList);
// var_dump($transactionList);
if ($transaction->statusCode == "00") {
// Action Success
} else if ($transaction->statusCode == "01") {
// Action Pending
} else {
// Action Failed Or Expired
}
echo $transaction->statusCode;
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
public function callback(Request $request)
{
$duitkuConfig = $this->configuration();
try {
$callback = \Duitku\Pop::callback($duitkuConfig);
header('Content-Type: application/json');
$notif = json_decode($callback);
// $notif = $request; ini untuk di local
DB::table('api_logs')
->insert([
'type' => 'in',
'target' => env('APP_URL').'/api/linksehat/callback-duitku',
'request' => $callback,
'created_by' => auth()->check() ? auth()->user()->id : null,
'created_at' => date('Y-m-d H:i:s')
]);
if ($notif->resultCode == "00") {
// Action Success
$livechat = Livechat::where('uuid', $notif->merchantOrderId)->first();
// Update status pembayaran
$livechat->payment_method = $notif->paymentCode;
$livechat->status = 5; // success payment
$livechat->save();
// Update start chat
$livechat->start_date = date('Y-m-d H:i:s');
// Buat dan simpan data channel ke dalam tabel
$channel = Channel::updateOrCreate([
'name' => $livechat->patient_id .'_' . $request->doctor_id,
],
[
'name' => $livechat->patient_id .'_' . $livechat->doctor_id,
'type' => 'Private',
'member_id' => $livechat->patient_id,
'doctor_id' => $livechat->doctor_id,
]);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk member_id
$userChannelMember = UserChannel::updateOrCreate(
[
'user_id' => $livechat->patient_id,
'channel_id' => $channel->id
],
[
'user_id' => $livechat->patient_id,
'channel_id' => $channel->id
]
);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk doctor_id
$userChannelDoctor = UserChannel::updateOrCreate(
[
'user_id' => $livechat->doctor_id,
'channel_id' => $channel->id
],
[
'user_id' => $livechat->doctor_id,
'channel_id' => $channel->id
]
);
// Berikan respons yang sesuai ke klien
return response()->json(['message' => 'Channel created successfully', 'channel' => $channel]);
} else if ($notif->resultCode == "01") {
// Action Failed
$livechat = Livechat::where('uuid', $notif->merchantOrderId)->first();
// Update status pembayaran
$livechat->payment_method = $notif->paymentCode;
$livechat->status = 7; // failed payment
$livechat->save();
return response()->json(['message' => 'User Gagal melakukan pembayaran']);
}
} catch (Exception $e) {
http_response_code(400);
echo $e->getMessage();
}
}
public function redirect(Request $request)
{
$resultCode = $request->input('resultCode');
$merchantOrderId = $request->input('merchantOrderId');
$reference = $request->input('reference');
return Redirect::to('https://linksehat.com/');
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Organization;
use App\Models\PractitionerRole;
use App\Models\OLDLMS\User;
use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Modules\Linksehat\Transformers\Article\ArticleResource;
use Modules\Linksehat\Transformers\Home\HomeResource;
use Modules\Linksehat\Transformers\Doctor\DoctorResource;
use Modules\Linksehat\Transformers\Hospital\HospitalResource;
class HomeController extends Controller
{
public function index(Request $request)
{
$user = User::with('detail')
->where('nId', $request->id)
->first();
return Helper::responseJson([
'home' => HomeResource::make($user, $request),
]);
}
public function listHospital(Request $request){
// Hospital List
$hospitalList = [];
$hospitals = Organization::where([
'type' => 'hospital',
'status' => 'active',
])
->with('currentAddress')
->get()->toArray();
foreach($hospitals as $hospital){
$lat = 0;
$lang = 0;
if ($hospital['current_address']['lat']){
$lat = $hospital['current_address']['lat'];
}
if ($hospital['current_address']['lng']){
$lang = $hospital['current_address']['lng'];
}
$address = '';
if ($hospital['current_address']['text']){
$address = $hospital['current_address']['text'];
}
$radius = 0;
if ($lat && $lang && $request->longitude && $request->latitude){
$radius = round(Helper::calculateDistance($lat, $lang, $request->latitude, $request->longitude), 2);
}
$data = [
'name' => $hospital['name'],
'radius' => $radius,
'image' => '',
'address' => $address
];
array_push($hospitalList, $data);
}
usort($hospitalList, function($a, $b) {
return $a['radius'] <=> $b['radius'];
});
return Helper::responseJson([
'hospital' => $hospitalList
]);
}
}

View File

@@ -5,6 +5,8 @@ namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\RequestLogBenefit;
use App\Models\RequestLog;
use App\Models\Corporate;
use App\Models\Member;
use App\Models\OLDLMS\User;
@@ -135,4 +137,39 @@ class LinkingController extends Controller
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
public function card_detail($member_id, $id){
$member = Member::where('member_id', $member_id)->get()->toArray();
$requestLogBenefits = RequestLogBenefit::where('request_log_id', $id)->with('benefit')->get()->toArray();
$requestLog = RequestLog::find($id)->first();
$benefitItem = [];
$dataRequestLog = [
'code' => $requestLog['code'],
'diagnosis' => Helper::diagnosisName($requestLog['diagnosis']),
'service_type' => Helper::serviceName($requestLog['service_code']),
];
foreach($requestLogBenefits as $requestLogBenefit) {
$data = [
'benefit_item' => $requestLogBenefit['benefit']['description'],
'amount_incurred' => $requestLogBenefit['amount_incurred'],
'amount_approved' => $requestLogBenefit['amount_approved'],
'amount_not_approved' => $requestLogBenefit['amount_not_approved'],
'excess_paid' => $requestLogBenefit['excess_paid'],
];
$benefitItem[] = $data;
};
$dataRequestLog['benefit_item'] = $benefitItem;
// dd($dataRequestLog);
// $data = [
// 'id' => $requestLog['id'],
// 'code' => $requestLog['code'],
// 'submission_date' => Carbon::parse($requestLog['submission_date'])->format('d M Y H:i:s'),
// 'provider_name' => $requestLog['organization']['name'],
// 'service' => Helper::serviceName($requestLog['service_code'])
// ];
return Helper::responseJson(data:$dataRequestLog);
}
}

View File

@@ -0,0 +1,308 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Helpers\DuitkuHelper;
use App\Services\Duitku;
use App\Models\Organization;
use App\Models\PractitionerRole;
use App\Models\Invoice;
use App\Models\PaymentsMethods;
use App\Models\Livechat;
use App\Models\OLDLMS\User;
use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Modules\Linksehat\Transformers\Livechat\LivechatResource;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\DuitkuController;
use DB;
use Str;
class LivechatController extends Controller
{
public function index(Request $request)
{
$user = User::with('detail')
->where('nId', $request->id)
->first();
return Helper::responseJson([
'livechat' => LivechatResource::make($user, $request),
]);
}
public function consultation(Request $request)
{
$dataMemberProfile = [];
$user = User::with('detail')
->where('nId', $request->member_id)
->first();
$memberProfile = User::with('detail')->where('nIDUser', $request->member_id)->get()->toArray();
if (count($memberProfile) > 0){
$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;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $user->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $user->nID,
'name' => $user->sFirstName . ' ' . $user->sLastName,
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember,
];
array_push($dataMemberProfile, $data);
}
} else {
$nID = $user->nIDUser ? $user->nIDUser : $user->nID;
if ($nID){
$memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray();
$dataMember = User::with('detail')->where('nID', $nID)->get()->first();
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';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $user->detail->sImage ?? $urlAvatarDefault;
$avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $user->detail->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $dataMember->nID,
'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName,
'relationship' => 'Me',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
if (count($memberProfile) > 0){
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship->sHubunganKeluarga,
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
}
}
}
return Helper::responseJson([
'member' => $dataMemberProfile
]);
}
public function consultation_request(Request $request)
{
$data = [
'doctor_id' => $request->doctor_id,
'patient_id' => $request->patient_id,
'organization_id' => $request->organization_id,
'descriptions' => $request->descriptions
];
$validator = Validator::make($request->all(), [
'doctor_id' => 'required',
'patient_id' => 'required',
'descriptions' => 'required',
], [
'doctor_id.required' => 'ID Dokter harus diisi',
'patient_id.required' => 'ID Dokter harus diisi',
'descriptions.required' => 'Description harus diisi',
]);
if ($validator->fails()){
return Helper::responseJson(
status: 'Bad Request',
statusCode: 400,
message: $validator->errors()
);
} else {
// insert table livechat
/**
* Status Livechat
* 1=Request, 2=Accept, 3=Decline, 4=Waiting Payment, 5=Success Payment, 6 = End Chat
*/
$timezone = date_default_timezone_get();
$data['request_date'] = date('Y-m-d H:i:s');
$data['timezone'] = $timezone;
$data['uuid'] = (string) Str::orderedUuid();
$data['status'] = 1;
$livechat = Livechat::create($data);
$doctor = $livechat->doctor;
$data = [
'id' => $livechat->id,
'request_date' => $livechat->request_date,
'image_path' =>'https'
];
return Helper::responseJson(data: $data);
}
}
public function consultation_request_show($id){
$livechat = Livechat::where('id', $id)->with(['doctor', 'practitioner'])->first();
$practitionerRole = PractitionerRole::where('id',$livechat->practitioner->id)->first();
$price = $practitionerRole->price ? $practitionerRole->price : 30000;
$discount = 0;
$adminFee = 5000;
$totalPay = $price + $adminFee - $discount;
$data = [
'id' => $livechat->id,
'code_transaksi' => $livechat->uuid,
'doctor_id' => $livechat->doctor_id,
'doctor_name' => $livechat->doctor->name,
'doctor_specialist' => 'Umum',
'price' => $price,
'admin_price' => $adminFee,
'promo' => [
[
'id' => 1,
'code' => 'SEHATBERSAMA',
'discount_percent' => 20
],
[
'id' => 2,
'code' => 'MARET MERIAH',
'discount_percent' => 5
],
],
'total' => $totalPay
];
return Helper::responseJson(data: $data);
}
public function consultation_payment_choose($id){
$livechat = Livechat::where('id', $id)->with(['doctor', 'practitioner'])->first();
$practitionerRole = PractitionerRole::where('id',$livechat->practitioner->id)->first();
$eWallet = PaymentsMethods::where(
[
'active' => 1,
'config_pmc_id' => 3,
])->get()->toArray();
$va = PaymentsMethods::where(
[
'active' => 1,
'config_pmc_id' => 2,
])->get()->toArray();
$payment = DuitkuHelper::paymentMethod();
$price = $practitionerRole->price ? $practitionerRole->price : 30000;
$discount = 0;
$adminFee = 5000;
$totalPay = $price + $adminFee - $discount;
$data = [
'id' => $livechat->id,
'code_transaksi' => $livechat->uuid,
'price' => $price,
'admin_price' => $adminFee,
'total' => $totalPay,
'payment_method' => [
'ewallet' => $eWallet,
'va' => $va
]
// 'payment_method' => json_decode($payment)
];
return Helper::responseJson(data: $data);
}
public function consultation_payment(Request $request)
{
try {
// Mengambil data Livechat dengan relasi doctor dan practitioner
$livechat = Livechat::with(['doctor', 'practitioner'])->find($request->consultation_id);
if (!$livechat) {
return response()->json(['success' => false, 'message' => 'Consultation not found'], 404);
}
// Update status
$livechat->status = 4;
$livechat->save();
$practitionerRole = PractitionerRole::find($livechat->practitioner->id);
$price = $practitionerRole->price ?? 30000; // Gunakan null coalescing operator
$adminFee = 5000;
$discount = 0;
$totalPay = $price + $adminFee - $discount;
// Mengambil user dari database
$user = User::with('detail')->where('nId', $livechat->patient_id)->first();
$address = DB::connection('oldlms')->table('tm_users_address')->where('nIDUser', $user->nID)->first('sAlamat');
if($address){
$address = $address->sAlamat;
}
if (!$user) {
return response()->json(['success' => false, 'message' => 'User not found'], 404);
}
// Menyiapkan data untuk invoice
$data = [
'paymentMethod' => $request->payment_code,
'paymentAmount' => $totalPay,
'email' => $user->sEmail,
'phoneNumber' => $user->sPhone,
'productDetails' => 'INV-' . date('Ymd') . '-' . rand(100, 999),
'merchantOrderId' => $livechat->uuid,
'additionalParam' => '',
'merchantUserInfo' => '',
'customerVaName' => $user->sFirstName . ' ' . $user->sLastName,
'firstName' => $user->sFirstName,
'lastName' => $user->sLastName,
'alamat' => $address,
'city' => '',
'postalCode' => ''
];
// Membuat invoice menggunakan DuitkuHelper
$duitku = DuitkuHelper::createInvoice($data);
return response()->json(['success' => true, 'data' => $duitku], 200);
} catch (Exception $e) {
// Menangkap error dan mengembalikan respon error
return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
}
}
public function consultation_check_payment($id){
$livechat = Livechat::where('id',$id)->with(['doctor', 'practitioner'])->first();
$duitku = DuitkuHelper::checkStatus($livechat->uuid);
return $duitku;
}
}

View File

@@ -43,7 +43,46 @@ class ProfileController extends Controller
*/
public function store(Request $request)
{
//
$validator = Validator::make($request->all(), [
'id_user' => 'required',
'first_name' => 'required',
'last_name' => 'required',
'date_of_birth' => 'required',
// 'email' => 'required',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
} else {
$value = [
'nIDuser' => $request->id_user,
'sIPAddress' => $request->ip(),
'sPassword' => null,
'sFirstName' => $request->first_name,
'sLastName' => $request->last_name,
];
$user = User::create($value);
$dataDetail = [
'nIDUser' => $user->nID,
'dTanggalLahir' => $request->date_of_birth,
'nIDJenisKelamin' => $request->gender
];
$userDetail = UserDetail::create(
$dataDetail
);
$data['data'] = [
'status' => 200,
'message' => 'data berhasil di tambahkan',
'error' => 'false'
];
return response()->json($data);
}
}
/**

View File

@@ -0,0 +1,65 @@
<?php
namespace Modules\Linksehat\Http\Middleware\Doctor;
use Modules\Linksehat\Helpers\Doctor\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace Modules\Linksehat\Http\Middleware\Doctor;
use Modules\Linksehat\Helpers\Doctor\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authorization
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
$authorization = $request->header('Authorization');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate authorization
if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) {
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Authorization']), 401);
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json' && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

View File

@@ -5,6 +5,8 @@ use Modules\Linksehat\Http\Controllers\Api\AuthController;
use Modules\Linksehat\Http\Controllers\Api\DashboardController;
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
use Modules\Linksehat\Http\Controllers\Api\DoctorController;
use Modules\Linksehat\Http\Controllers\Api\DuitkuController;
use Modules\Linksehat\Http\Controllers\Api\ChatController;
use Modules\Linksehat\Http\Controllers\Api\HospitalController;
use Modules\Linksehat\Http\Controllers\Api\NotificationTokenController;
use Modules\Linksehat\Http\Controllers\Api\PersonController;
@@ -12,7 +14,13 @@ use Modules\Linksehat\Http\Controllers\Api\ProfileController;
use Modules\Linksehat\Http\Controllers\Api\SearchController;
use Modules\Linksehat\Http\Controllers\Api\SpecialityController;
use Modules\Linksehat\Http\Controllers\Api\LinkingController;
use Modules\Linksehat\Http\Controllers\Api\HomeController;
use Modules\Linksehat\Http\Controllers\Api\LivechatController;
use Modules\Linksehat\Http\Middleware\Doctor\Authentication;
use Modules\Linksehat\Http\Middleware\Doctor\Authorization;
use Modules\Linksehat\Http\Controllers\Api\Doctor\AuthDoctorController;
use Modules\Linksehat\Http\Controllers\Api\Doctor\ProfileDoctorController;
use Modules\Linksehat\Http\Controllers\Api\Doctor\ChatDoctorController;
/*
|--------------------------------------------------------------------------
| API Routes
@@ -24,8 +32,9 @@ use Modules\Linksehat\Http\Controllers\Api\LinkingController;
|
*/
Broadcast::routes(['middleware' => ['auth:sanctum']]);
Route::prefix('linksehat')->group(function () {
Route::get('dashboard/{query}/{limit?}', [DashboardController::class, 'index']);
Route::controller(SearchController::class)->group(function () {
@@ -63,11 +72,11 @@ Route::prefix('linksehat')->group(function () {
Route::get('doctors/{id}', 'show')->name('doctors.show');
});
Route::middleware('auth:sanctum')->group(function () {
Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile');
Route::get('change-profile/{id}', [ProfileController::class, 'changeProfile'])->name('change-profile');
Route::post('profile', [ProfileController::class, 'update'])->name('profile.update');
Route::post('profile-add', [ProfileController::class, 'store'])->name('profile.store');
Route::post('notification-tokens/delete/{id}', [NotificationTokenController::class, 'destroy'])->name('profile.delete.token');
Route::post('notification-tokens', [NotificationTokenController::class, 'store'])->name('profile.store.token');
Route::apiResource('appointment', AppointmentController::class);
@@ -77,10 +86,84 @@ Route::prefix('linksehat')->group(function () {
Route::get('autocomplete/blood_type', [AutocompleteController::class, 'bloodType']);
Route::get('autocomplete/relationship', [AutocompleteController::class, 'relationship']);
Route::get('autocomplete/corporate', [AutocompleteController::class, 'corporate']);
Route::get('autocomplete/drugs', [AutocompleteController::class, 'drugList']);
Route::get('autocomplete/units', [AutocompleteController::class, 'unitList']);
Route::get('autocomplete/diagnosis', [AutocompleteController::class, 'diagnosis']);
Route::post('manual-linking', [LinkingController::class, 'linkingValidate']);
Route::get('card/{member_id}', [LinkingController::class, 'card']);
Route::get('card/{member_id}/{log_id}', [LinkingController::class, 'card_detail']);
Route::controller(HomeController::class)->group(function () {
Route::get('home', 'index')->name('homes.index');
Route::get('home/hospital', 'listHospital')->name('homes.listHospital');
});
Route::controller(LivechatController::class)->group(function () {
Route::get('livechat', 'index')->name('livechats.index');
Route::get('livechat/consultation', 'consultation')->name('livechats.consultation');
Route::post('livechat/consultation-request', 'consultation_request')->name('livechats.consultation-request');
Route::get('livechat/consultation-request/{id}', 'consultation_request_show');
Route::get('livechat/consultation-request/consultation-payment-choose/{id}', 'consultation_payment_choose');
Route::get('livechat/consultation-request/consultation-payment-check/{id}', 'consultation_check_payment');
Route::post('livechat/consultation-payment', 'consultation_payment');
});
Route::controller(ChatController::class)->group(function () {
Route::post('livechat/send-message', 'sendMessage');
Route::get('livechat/get-message', 'getMessage');
Route::post('livechat/channel','createChannel');
Route::get('livechat/channel','listChannel');
Route::get('livechat/{id}/health-sertificate','downloadHealtcare');
});
Route::post('create-invoice-duitku', [DuitkuController::class, 'createInvoice']);
Route::post('check-status-duitku', [DuitkuController::class, 'checkStatus']);
});
});
Route::post('payment-method-duitku', [DuitkuController::class, 'paymentMethod']);
Route::post('callback-duitku', [DuitkuController::class, 'callback']);
Route::get('redirect-duitku', [DuitkuController::class, 'redirect']);
//DOCTOR API
Route::prefix('doctor')->group(function() {
//Version 1.0
Route::prefix('v1')->group(function() {
Route::middleware(Authentication::class)->group(function () {
Route::controller(AuthDoctorController::class)->group(function () {
Route::post('login', 'login');
});
});
Route::middleware('auth:sanctum')->group(function () {
Route::middleware(Authorization::class)->group(function () {
Route::controller(AuthDoctorController::class)->group(function () {
Route::post('logout', 'logout');
Route::post('forgot-password', 'forgotPassword');
});
Route::controller(ProfileDoctorController::class)->group(function () {
Route::get('get-profile', 'getProfile');
});
Route::controller(ChatDoctorController::class)->group(function () {
Route::get('chat', 'getChat');
Route::post('decline', 'declineChat');
Route::post('approve', 'approveChat');
Route::post('end', 'endChat');
Route::post('summary', 'summaryChat');
Route::get('chat/{id}', 'getChatDetail');
});
});
});
Route::controller(AuthDoctorController::class)->group(function () {
Route::post('forgot-password', 'forgotPassword');
Route::post('verif-code', 'verifCode');
Route::post('resend-code', 'forgotPassword');
Route::post('reset-password', 'resetPassword');
});
});
});
;});

View File

@@ -0,0 +1,280 @@
<?php
namespace Modules\Linksehat\Transformers\Home;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use App\Models\Organization;
use App\Models\Practitioner;
use App\Models\PractitionerRole;
use App\Models\Member;
use App\Models\Person;
use App\Models\CorporateEmployee;
use App\Models\Corporate;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\Helpers\Helper;
use DB;
class HomeResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $request;
protected $connection = 'oldlms';
public function __construct($resource, $request)
{
$this->request = $request;
parent::__construct($resource);
}
public function toArray($request)
{
$memberProfile = User::with('detail')->where('nIDUser', $this->nID)->get()->toArray();
$dataMemberProfile = [];
$userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first();
$memberId = null;
$linking = false;
$jam = date('G'); // Ambil jam dalam format 24 jam
if ($jam < 12) {
$wellcome = "Good Morning!";
} elseif ($jam < 18) {
$wellcome = "Good Afternoon!";
} else {
$wellcome = "Good Evening!";
}
if($userInsurance){
$memberId = $userInsurance->sNoPolis;
$linking = true;
} else {
$member = Member::where('email', $this->sEmail)->get()->first();
$person = Person::where('phone', $this->sPhone)->get()->first();
if ($member || $person){ // Autolinking
$corporateEmployee = CorporateEmployee::where('member_id', $member->id)->get()->first(); // cek corporate id empolyee/member
if ($corporateEmployee){
$corporate = Corporate::findOrFail($corporateEmployee->corporate_id)->automatic_linking; // cek autocomplete
if ($corporate){
if($member) {
// Insert into database linksehat
$insurance = UserInsurance::updateOrCreate(
[
'nIDUser' => $this->nID,
],
[
'nIDUser' => $this->nID,
'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'],
'sNoPolis' => $member->member_id,
'sNamaPeserta' => $member->fullName,
'sKartuPeserta' => '',
'sLayanan' => 'RJ,TC',
'dStartDate' => $member->members_effective_date,
'dExpireDate' => $member->members_expire_date,
'dTanggalLahir' => $member->birth_date,
'nNoKTP' => $member->nric != '' ? $member->nric : 0 ,
'sIsConfrimed' => 1,
'sStatus' => 1,
]);
$message = $member->currentPolicy->corporate->welcome_message;
$linking = true;
$memberId = $member->member_id;
}
}
}
}
};
if (count($memberProfile) > 0){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $this->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $this->nID,
'name' => $this->sFirstName . ' ' . $this->sLastName,
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
} else {
$nID = $this->nIDUser ? $this->nIDUser : $this->nID;
if ($nID){
$memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray();
$dataMember = User::with('detail')->where('nID', $nID)->get()->first();
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
$avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $dataMember->nID,
'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName,
'relationship' => 'Me',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
if (count($memberProfile) > 0){
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship->sHubunganKeluarga,
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
}
} else {
}
}
// Principal
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
// Doctor livechat
$doctors = Practitioner::with('person', 'practitionerRoles.organization', 'practitionerRoles.speciality')
->whereHas('person', function ($query) {
$query->where('isOnline', 1); // hanya online
})
->get()
->toArray();
$doctorsLivechat = [];
foreach($doctors as $doctor){
$specialist = 'Umum';
$year = 0;
$price = 0;
if (!empty($doctor['person']['start_date_work'])) {
$starExperience = Carbon::parse($doctor['person']['start_date_work'])->format('Y-m-d');
$experience = Carbon::createFromFormat('Y-m-d', $starExperience);
$year = $experience->diffInYears(Carbon::now());
}
if ($doctor['practitioner_roles']) {
if ($doctor['practitioner_roles'][0]['speciality']){
$specialist = $doctor['practitioner_roles'][0]['speciality']['name'];
}
if ($doctor['practitioner_roles'][0]['price']){
$price = $doctor['practitioner_roles'][0]['price'];
}
}
$data = [
'id' => $doctor['id'],
'full_name' => $doctor['person']['name'],
'specialist' => $specialist,
'experience' => $year,
'review' => $doctor['person']['review'],
'price' => $price,
'price_real' => $price
];
array_push($doctorsLivechat, $data);
}
// Hospital List
$hospitalList = [];
$hospitals = Organization::where([
'type' => 'hospital',
'status' => 'active',
])
->with('currentAddress')
->get()->toArray();
foreach($hospitals as $hospital){
$lat = 0;
$lang = 0;
if ($hospital['current_address']['lat']){
$lat = $hospital['current_address']['lat'];
}
if ($hospital['current_address']['lng']){
$lang = $hospital['current_address']['lng'];
}
$address = '';
if ($hospital['current_address']['text']){
$address = $hospital['current_address']['text'];
}
$radius = 0;
if ($lat && $lang && $request->longitude && $request->latitude){
$radius = round(Helper::calculateDistance($lat, $lang, $request->latitude, $request->longitude), 2);
}
$data = [
'name' => $hospital['name'],
'radius' => $radius,
'image' => '',
'address' => $address
];
array_push($hospitalList, $data);
}
usort($hospitalList, function($a, $b) {
return $a['radius'] <=> $b['radius'];
});
$hospitalList = array_slice($hospitalList, 0, 5);
return [
'id' => $this->nID,
'message' => $wellcome,
'full_name' => $this->sFirstName . ' '. $this->sLastName,
'avatar' => $avatar,
'member_id' => $memberId,
'linking' => $linking,
'doctors_livechat' => $doctorsLivechat,
'hospital' => $hospitalList
];
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace Modules\Linksehat\Transformers\Livechat;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Practitioner;
use App\Models\PractitionerRole;
use App\Models\Speciality;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\Helpers\Helper;
use DB;
class LivechatResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $request;
protected $connection = 'oldlms';
public function __construct($resource, $request)
{
$this->request = $request;
parent::__construct($resource);
}
public function toArray($request)
{
// Specialis
$specialists = Speciality::all();
// Doctor livechat
$doctors = Practitioner::with('person', 'practitionerRoles.organization', 'practitionerRoles.speciality')
->whereHas('person', function ($query) {
$query->where('isOnline', 1); // hanya online
})
->get()
->toArray();
$doctorsLivechat = [];
foreach($doctors as $doctor){
$specialist = 'Umum';
$year = 0;
$price = 0;
if (!empty($doctor['person']['start_date_work'])) {
$starExperience = Carbon::parse($doctor['person']['start_date_work'])->format('Y-m-d');
$experience = Carbon::createFromFormat('Y-m-d', $starExperience);
$year = $experience->diffInYears(Carbon::now());
}
if ($doctor['practitioner_roles']) {
if ($doctor['practitioner_roles'][0]['speciality']){
$specialist = $doctor['practitioner_roles'][0]['speciality']['name'];
}
if ($doctor['practitioner_roles'][0]['price']){
$price = $doctor['practitioner_roles'][0]['price'];
}
}
$data = [
'id' => $doctor['id'],
'full_name' => $doctor['person']['name'],
'specialist' => $specialist,
'experience' => $year,
'review' => $doctor['person']['review'],
'price' => $price,
'price_real' => $price
];
array_push($doctorsLivechat, $data);
}
return [
'jadwal_weekday' => 'Senin - Jumat (08:00 - 17:30)',
'jadwal_weekend' => 'Sabtu (08:00 - 12:00)',
'doctors_livechat' =>
$doctorsLivechat
,
'specialist' => $specialists
];
}
}