transaksi

This commit is contained in:
hasrinuryawati 2025-04-27 20:02:22 +07:00
parent 17278441a7
commit ced9b41539
26 changed files with 950 additions and 181 deletions

View File

@ -3,13 +3,15 @@
namespace App\Http\Controllers;
use App\Models\Asuransi;
use App\Models\AsuransiTindakan;
use App\Models\Tindakan;
use Illuminate\Http\Request;
class AsuransiController extends Controller
{
public function index()
{
$asuransi = Asuransi::get();
$asuransi = Asuransi::orderByDesc('id')->get();
return view('module.asuransi.index', compact('asuransi'));
}
@ -33,4 +35,48 @@ class AsuransiController extends Controller
return redirect()->back()->with('message','Data berhasil di ubah');
}
public function maappingForm(Asuransi $asuransi)
{
$dataAsuransi = Asuransi::find($asuransi->id);
$tindakan = Tindakan::get();
$tindakanMapping = AsuransiTindakan::where('id_asuransi', $dataAsuransi->id)
->get()
->keyBy('id_tindakan');
return view('module.asuransi.mapping_tindakan', compact(['dataAsuransi', 'tindakan', 'tindakanMapping']));
}
public function mapping(Request $request)
{
$request->validate([
'id_asuransi' => 'required|exists:asuransi,id',
'tindakan' => 'required|array',
]);
$idAsuransi = $request->id_asuransi;
$dataTindakan = $request->tindakan;
foreach ($dataTindakan as $idTindakan => $data) {
if (isset($data['selected']) && $data['selected']) {
$existing = AsuransiTindakan::where('id_asuransi', $idAsuransi)
->where('id_tindakan', $idTindakan)
->first();
if ($existing) {
continue;
}
$asuransiTindakan = new AsuransiTindakan();
$asuransiTindakan->id_asuransi = $idAsuransi;
$asuransiTindakan->id_tindakan = $idTindakan;
$asuransiTindakan->cover_type = $data['cover_type'] ?? 'none';
$asuransiTindakan->cover_percentage = $data['cover_percentage'] ?? null;
$asuransiTindakan->created_by = auth('pegawai')->user()->nama ?? 'system';
$asuransiTindakan->save();
}
}
return redirect()->back()->with('success', 'Mapping berhasil disimpan.');
}
}

View File

@ -2,61 +2,50 @@
namespace App\Http\Controllers;
use App\Models\Asuransi;
use App\Models\Pasien;
use App\Models\Registrasi;
use App\Models\RuangPelayanan;
use App\Models\Tindakan;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class PasienController extends Controller
{
public function index()
{
return view('module.pasien.index');
$pasien = Pasien::with('registrasi')->orderByDesc('id')->get();
$ruangPelayanan = RuangPelayanan::get();
$asuransi = Asuransi::get();
$tindakan = Tindakan::get();
return view('module.pasien.index', compact(['pasien', 'ruangPelayanan', 'asuransi', 'tindakan']));
}
/**
* Show the form for creating a new resource.
*/
public function create()
public function cekNik(Request $request)
{
//
$pasien = Pasien::where('nik', $request->nik)->first();
if ($pasien) {
return response()->json([
'success' => true,
'pasien' => [
'nama' => $pasien->nama,
'tgl_lahir' => $pasien->tgl_lahir,
'jenis_kelamin' => $pasien->jenis_kelamin,
],
]);
} else {
return response()->json(['success' => false]);
}
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Pasien $pasien)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Pasien $pasien)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Pasien $pasien)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Pasien $pasien)
{
//
}
}

View File

@ -2,64 +2,53 @@
namespace App\Http\Controllers;
use App\Models\Asuransi;
use App\Models\Pasien;
use App\Models\Registrasi;
use App\Models\RuangPelayanan;
use App\Models\Tindakan;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class RegistrasiController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
$registrasi = Registrasi::with(['pasien', 'asuransi', 'pegawai', 'ruangPelayanan'])->get();
$ruangPelayanan = RuangPelayanan::get();
$asuransi = Asuransi::get();
$tindakan = Tindakan::get();
return view('module.registrasi.index', compact(['registrasi', 'ruangPelayanan', 'asuransi', 'tindakan']));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
$randomUppercaseString = Str::upper(Str::random(4));
$pasien = Pasien::where('nik', $request->nik)->first();
/**
* Display the specified resource.
*/
public function show(Registrasi $registrasi)
{
//
}
if ($pasien === null)
{
$pasien = new Pasien();
$pasien->nama = $request->nama;
$pasien->nik = $request->nik;
$pasien->tgl_lahir = $request->tgl_lahir;
$pasien->jenis_kelamin = $request->jenis_kelamin;
$pasien->created_by = auth('pegawai')->user()->nama;
$pasien->save();
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Registrasi $registrasi)
{
//
}
$registrasi = new Registrasi();
$registrasi->code = now()->format('ymd') . $randomUppercaseString;
$registrasi->tgl_registrasi = now()->format('Y-m-d');
$registrasi->id_pasien = $pasien->id;
$registrasi->id_asuransi = $request->asuransi;
$registrasi->no_asuransi = $request->no_asuransi;
$registrasi->id_pegawai = auth('pegawai')->user()->id;
$registrasi->id_ruang_pelayanan = $request->ruang_pelayanan;
$registrasi->created_by = auth('pegawai')->user()->nama;
$registrasi->save();
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Registrasi $registrasi)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Registrasi $registrasi)
{
//
return redirect()->back()->with('message','Registrasi pasien berhasil');
}
}

View File

@ -9,7 +9,7 @@ class RuangPelayananController extends Controller
{
public function index()
{
$ruangPelayanan = RuangPelayanan::get();
$ruangPelayanan = RuangPelayanan::orderByDesc('id')->get();
return view('module.ruang_pelayanan.index', compact('ruangPelayanan'));
}

View File

@ -9,7 +9,7 @@ class TindakanController extends Controller
{
public function index()
{
$tindakan = Tindakan::get();
$tindakan = Tindakan::orderByDesc('id')->get();
return view('module.tindakan.index', compact('tindakan'));
}

View File

@ -2,64 +2,51 @@
namespace App\Http\Controllers;
use App\Models\Asuransi;
use App\Models\AsuransiTindakan;
use App\Models\Registrasi;
use App\Models\Tindakan;
use App\Models\Transaksi;
use Illuminate\Http\Request;
class TransaksiController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
public function tindakanForm(Registrasi $registrasi)
{
//
$dataRegistrasi = Registrasi::find($registrasi->id);
$tindakan = Tindakan::get();
$asuransiTindakan = AsuransiTindakan::where('id_asuransi', $dataRegistrasi->id_asuransi)->get();
return view('module.transaksi.tindakan', compact(['dataRegistrasi', 'tindakan', 'asuransiTindakan']));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
$idRegistrasi = $request->input('id_registrasi');
$idTindakanList = $request->input('id_tindakan');
$jumlahTindakanList = $request->input('jumlah_tindakan');
$subtotalList = $request->input('subtotal');
$asuransiDiscountList = $request->input('asuransi_discount');
$totalAkhirList = $request->input('total_akhir');
/**
* Display the specified resource.
*/
public function show(Transaksi $transaksi)
{
//
}
foreach ($idTindakanList as $index => $idTindakan) {
$transaksi = new Transaksi();
$transaksi->id_registrasi = $idRegistrasi;
$transaksi->id_tindakan = $idTindakan;
$transaksi->jml_tindakan = $jumlahTindakanList[$index];
$transaksi->potongan = $asuransiDiscountList[$index];
$transaksi->subtotal = $subtotalList[$index];
$transaksi->total = $totalAkhirList[$index];
$transaksi->id_pegawai = auth('pegawai')->user()->id;
$transaksi->created_by = auth('pegawai')->user()->nama;
$transaksi->save();
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Transaksi $transaksi)
{
//
}
$registrasi = Registrasi::find($idRegistrasi);
$registrasi->status_tindakan = "done";
$registrasi->updated_by = auth('pegawai')->user()->nama;
$registrasi->save();
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Transaksi $transaksi)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Transaksi $transaksi)
{
//
return redirect()->back()->with('message', 'Transaksi berhasil');
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AsuransiTindakan extends Model
{
use HasFactory;
protected $table = 'asuransi_tindakan';
protected $fillable = [
'created_at',
'created_by',
'updated_at',
'updated_by',
'deleted_at',
'deleted_by',
'id_asuransi',
'id_tindakan',
'cover_type',
'cover_percentage'
];
}

View File

@ -20,6 +20,7 @@ class Pasien extends Model
'updated_by',
'nama',
'nik',
'tgl_lahir',
'jenis_kelamin',
];

View File

@ -26,6 +26,7 @@ class Registrasi extends Model
'no_asuransi',
'id_pegawai',
'id_ruang_pelayanan',
'status_tindakan',
];
public function pasien() : BelongsTo

View File

@ -21,6 +21,9 @@ class Transaksi extends Model
'id_registrasi',
'id_tindakan',
'jml_tindakan',
'potongan',
'subtotal',
'total',
'id_pegawai',
];

View File

@ -18,6 +18,7 @@ return new class extends Migration
$table->timestamps();
$table->string('nama', 100);
$table->string('nik', 16)->unique();
$table->date('tgl_lahir');
$table->enum('jenis_kelamin', ['male', 'female']);
});

View File

@ -32,7 +32,7 @@ return new class extends Migration
table:'asuransi',
indexName:'registrasi_id_asuransi'
);
$table->integer('no_asuransi')->nullable();
$table->string('no_asuransi')->nullable();
$table->foreignId('id_pegawai')
->constrained(
@ -45,6 +45,8 @@ return new class extends Migration
table:'ruang_pelayanan',
indexName:'registrasi_id_ruang_pelayanan'
);
$table->enum('status_tindakan', ['inprogress', 'done'])->default('inprogress');
});
}

View File

@ -30,6 +30,10 @@ return new class extends Migration
);
$table->integer('jml_tindakan');
$table->decimal('potongan', 15, 2);
$table->decimal('subtotal', 15, 2);
$table->decimal('total', 15, 2);
$table->foreignId('id_pegawai')
->constrained(
table:'pegawai',

View File

@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('asuransi_tindakan', function (Blueprint $table) {
$table->id();
$table->string('created_by')->nullable();
$table->string('updated_by')->nullable();
$table->timestamps();
$table->foreignId('id_asuransi')
->constrained(
table:'asuransi',
indexName:'asuransi_tindakan_id_asuransi'
);
$table->foreignId('id_tindakan')
->constrained(
table:'tindakan',
indexName:'asuransi_tindakan_id_tindakan'
);
$table->enum('cover_type', ['full', 'partial', 'none']);
$table->integer('cover_percentage')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('asuransi_tindakan');
}
};

View File

@ -4,7 +4,9 @@
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0">
@if (Route::currentRouteName() === "pasien.index")
@if (Route::currentRouteName() === "registrasi.index")
Registrasi
@elseif (Route::currentRouteName() === "pasien.index")
Pasien
@elseif (Route::currentRouteName() === "asuransi.index")
Asuransi

View File

@ -51,6 +51,10 @@
{{-- Toastr --}}
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js"></script>
<!-- Select2 -->
<script src="{{ asset('plugins/select2/js/select2.full.min.js') }}"></script>
<script>
@if(Session::has('message'))
toastr.options =

View File

@ -44,6 +44,15 @@
</a>
</li>
<li class="nav-item">
<a href="{{ route('registrasi.index') }}" class="nav-link {{ request()->is('registrasi') ? 'active' : '' }}">
<i class="nav-icon fas fa-copy"></i>
<p>
Registrasi
</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('pasien.index') }}" class="nav-link {{ request()->is('pasien') ? 'active' : '' }}">
<i class="nav-icon fas fa-copy"></i>

View File

@ -26,3 +26,7 @@
{{-- Toastr --}}
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css">
<!-- Select2 -->
<link rel="stylesheet" href="{{ asset('plugins/select2/css/select2.min.css') }}">
<link rel="stylesheet" href="{{ asset('plugins/select2-bootstrap4-theme/select2-bootstrap4.min.css') }}">

View File

@ -6,8 +6,6 @@
<div class="col-12">
<div class="card">
<div class="card-header">
<a href="#" class="btn btn-success"><i class="fas fa-file-excel"></i>Unduh Excel</a>
<a href="#" class="btn btn-danger"><i class="fas fa-file-pdf"></i>Unduh PDF</a>
<button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#modal-add"><i class="fas fa-plus"></i>Data</button>
</div>
<!-- /.card-header -->
@ -30,8 +28,8 @@
<td>{{ $data->nama }}</td>
<td>
<div class="row">
{{-- <button type="button" class="btn btn-primary btn-sm mr-1 mt-1" title="Detail" data-toggle="modal" data-target="#modal-detail"><i class="fas fa-info-circle"></i></button> --}}
<a href="#" class="btn btn-secondary btn-sm mr-1 mt-1" title="Edit" data-toggle="modal" data-target="#modal-edit{{ $data->id }}"><i class="fas fa-edit"></i></a>
<a href="{{ route('asuransi.mapping.form', $data->id) }}" target="BLANK" class="btn btn-warning btn-sm mr-1 mt-1" title="Mapping Tindakan">Mapping Tindakan</a>
</div>
</td>
</tr>

View File

@ -0,0 +1,113 @@
@extends('layout.main')
@section('content')
<section class="content">
<div class="container-fluid">
<div class="card">
<div class="card-header">
<h3 class="card-title">Mapping Asuransi - Tindakan</h3>
</div>
<div class="card-body">
<form action="{{ route('asuransi.mapping') }}" method="POST">
@csrf
<h3>{{ $dataAsuransi->nama }}</h3>
<input name="id_asuransi" type="hidden" value="{{ $dataAsuransi->id }}">
<div class="table-responsive mt-4">
<table class="table table-bordered">
<thead>
<tr>
<th><input type="checkbox" id="checkAll"></th>
<th>Nama Tindakan</th>
<th>Tarif Normal</th>
<th>Cover Type</th>
<th>Cover Percentage (%)</th>
</tr>
</thead>
<tbody>
@foreach ($tindakan as $td)
@php
$mapped = $tindakanMapping[$td->id] ?? null;
@endphp
<tr>
<td>
<input type="checkbox"
name="tindakan[{{ $td->id }}][selected]"
value="1"
{{ $mapped ? 'disabled checked' : '' }}>
</td>
<td>{{ $td->nama }}</td>
<td>{{ number_format($td->tarif) }}</td>
<td>
@if ($mapped)
{{ ucfirst($mapped->cover_type) }}
@else
<select name="tindakan[{{ $td->id }}][cover_type]"
class="form-control cover-type-select"
data-id="{{ $td->id }}">
<option value="">Pilih</option>
<option value="full">Full</option>
<option value="partial">Partial</option>
<option value="none">None</option>
</select>
@endif
</td>
<td>
@if ($mapped)
{{ $mapped->cover_percentage ?? '-' }}%
@else
<input type="number"
name="tindakan[{{ $td->id }}][cover_percentage]"
class="form-control cover-percentage-input"
placeholder="%">
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="mt-4 text-right">
<button type="submit" class="btn btn-primary">Simpan Mapping</button>
</div>
</form>
</div>
</div>
</div>
</section>
@endsection
@push('script')
<script>
document.getElementById('checkAll').addEventListener('change', function () {
let checkboxes = document.querySelectorAll('input[type="checkbox"][name$="[selected]"]:not([disabled])');
checkboxes.forEach(checkbox => {
checkbox.checked = this.checked;
});
});
document.querySelectorAll('.cover-type-select').forEach(select => {
select.addEventListener('change', function () {
let selectedCoverType = this.value;
let tindakanId = this.dataset.id;
let percentageInput = document.querySelector('input[name="tindakan[' + tindakanId + '][cover_percentage]"]');
if (selectedCoverType === 'full') {
percentageInput.value = 100;
percentageInput.setAttribute('readonly', true);
} else if (selectedCoverType === 'partial') {
percentageInput.value = '';
percentageInput.removeAttribute('readonly');
} else if (selectedCoverType === 'none') {
percentageInput.value = 0;
percentageInput.setAttribute('readonly', true);
} else {
percentageInput.value = '';
percentageInput.removeAttribute('readonly');
}
});
});
</script>
@endpush

View File

@ -5,56 +5,123 @@
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<a href="#" class="btn btn-success"><i class="fas fa-file-excel"></i>Unduh Excel</a>
<a href="#" class="btn btn-danger"><i class="fas fa-file-pdf"></i>Unduh PDF</a>
<button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#modal-add">Register</button>
</div>
<!-- /.card-header -->
<div class="card-body">
<table id="pasien_tb" class="table table-bordered table-striped">
<thead>
<tr>
<th>No</th>
<th>Nama</th>
<th>NIK</th>
<th>Tgl Lahir</th>
<th>Jenis Kelamin</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@php
$no = 1;
@endphp
@foreach ($pasien as $data)
<tr>
<td>1</td>
<td>Internet
Explorer 4.0
<td>{{ $no++ }}</td>
<td>{{ $data->nama }}</td>
<td>{{ $data->nik }}</td>
<td>{{ $data->tgl_lahir }}</td>
<td>
@if ($data->jenis_kelamin === "male")
Laki-laki
@else
Perempuan
@endif
</td>
<td></td>
<td></td>
<td>
<div class="row">
<button type="button" class="btn btn-primary btn-sm mr-1 mt-1" title="Detail" data-toggle="modal" data-target="#modal-detail"><i class="fas fa-info-circle"></i></button>
<button type="button" class="btn btn-info btn-sm mr-1 mt-1" title="Detail" data-toggle="modal" data-target="#modal-detail{{ $data->id }}"><i class="fas fa-info-circle"></i></button>
<a href="#" class="btn btn-secondary btn-sm mr-1 mt-1" title="Edit" data-toggle="modal" data-target="#modal-edit"><i class="fas fa-edit"></i></a>
</div>
</td>
</tr>
<tr>
<td>2</td>
<td>Internet
Explorer 5.0
</td>
<td></td>
<td></td>
<td>Win 95+</td>
</tr>
<tr>
<td>3</td>
<td>Internet
Explorer 6
</td>
<td></td>
<td></td>
<td>Win 98+</td>
</tr>
{{-- Modal Detail --}}
<div class="modal fade" id="modal-detail{{ $data->id }}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Detail Rekam Medis Pasien</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-4"><b>Tgl Registrasi</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]['tgl_registrasi'] }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Kode Registrasi</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]['code'] }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Nama</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->nama }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Tgl Lahir</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->tgl_lahir }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Jenis Kelamin</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">
@if ($data->jenis_kelamin === "male")
Laki-laki
@else
Perempuan
@endif
</div>
</div>
<div class="row">
<div class="col-md-4"><b>Asuransi</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]->asuransi->nama ?? '-' }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>No. Asuransi</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]['no_asuransi'] ?? '-'}}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Ruang Pelayanan</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]->ruangPelayanan->nama}}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Pegawai</b></div>
<div class="col-md-1">:</div>
<div class="col-md-7">{{ $data->registrasi[0]->pegawai->nama ?? '-' }}</div>
</div>
</div>
<div class="modal-footer justify-content-between">
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
<!-- /.modal -->
{{-- Modal Edit --}}
<div class="modal fade" id="modal-edit">
@ -106,6 +173,8 @@
<!-- /.modal-dialog -->
</div>
<!-- /.modal -->
@endforeach
</tbody>
</table>
</div>
@ -115,7 +184,7 @@
{{-- Modal Add --}}
<div class="modal fade" id="modal-add">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Register Pasien</h4>
@ -123,14 +192,14 @@
<span aria-hidden="true">&times;</span>
</button>
</div>
<form action="#" method="POST" enctype="multipart/form-data">
<form action="{{ route('pasien.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="modal-body">
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="name">Nama</label>
<input class="form-control" type="text" name="name" required>
<label for="nama">Nama</label>
<input class="form-control" type="text" name="nama" required>
</div>
</div>
<div class="col-sm-6">
@ -154,9 +223,10 @@
<div class="col-sm-6">
<div class="form-group">
<label for="ruang_pelayanan">Ruangan Pelayanan</label>
<select name="ruang_pelayanan" class="form-control" style="width: 100%;">
<option value="">Ruang 1.a</option>
<option value="">Ruang 1.b</option>
<select name="ruang_pelayanan" class="form-control select2bs4" style="width: 100%;">
@foreach ($ruangPelayanan as $rp)
<option value="{{ $rp->id }}">{{ $rp->nama }}</option>
@endforeach
</select>
</div>
</div>
@ -166,9 +236,11 @@
<div class="col-sm-6">
<div class="form-group">
<label for="asuransi">Asuransi</label>
<select name="asuransi" class="form-control" style="width: 100%;">
<option value="bpjs">BPJS</option>
<option value="manulife">Manulife</option>
<input type="checkbox" id="asuransi_checkbox" class="mr-2">
<select name="asuransi" class="form-control select2bs4" style="width: 100%;" id="asuransi_select" disabled>
@foreach ($asuransi as $asr)
<option value="{{ $asr->id }}">{{ $asr->nama }}</option>
@endforeach
</select>
</div>
</div>
@ -176,7 +248,7 @@
<div class="col-sm-6">
<div class="form-group">
<label for="no_asuransi">No. Asuransi</label>
<input class="form-control" type="text" name="no_asuransi">
<input class="form-control" type="text" name="no_asuransi" id="no_asuransi" disabled>
</div>
</div>
</div>
@ -207,6 +279,29 @@
"autoWidth": false,
"ordering": false,
});
$('.select2bs4').select2({
theme: 'bootstrap4'
});
});
</script>
<script>
document.getElementById('asuransi_checkbox').addEventListener('change', function() {
var asuransiSelect = document.getElementById('asuransi_select');
var noAsuransiInput = document.getElementById('no_asuransi');
if (this.checked) {
asuransiSelect.disabled = false;
noAsuransiInput.disabled = false;
asuransiSelect.setAttribute('required', 'required');
noAsuransiInput.setAttribute('required', 'required');
} else {
asuransiSelect.disabled = true;
noAsuransiInput.disabled = true;
asuransiSelect.removeAttribute('required');
noAsuransiInput.removeAttribute('required');
}
});
</script>
@endpush

View File

@ -0,0 +1,250 @@
@extends('layout.main')
@section('content')
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<a href="#" class="btn btn-success"><i class="fas fa-file-excel"></i>Unduh Excel</a>
<a href="#" class="btn btn-danger"><i class="fas fa-file-pdf"></i>Unduh PDF</a>
<button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#modal-add">Registrasi</button>
</div>
<!-- /.card-header -->
<div class="card-body">
<table id="pasien_tb" class="table table-bordered table-striped">
<thead>
<tr>
<th>No</th>
<th>Tgl Registrasi</th>
<th>Kode Registrasi</th>
<th>NIK</th>
<th>Nama Pasien</th>
<th>Tgl Lahir</th>
<th>Jenis Kelamin</th>
<th>Ruang Pelayanan</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@php
$no = 1;
@endphp
@foreach ($registrasi as $data)
<tr>
<td>{{ $no++ }}</td>
<td>{{ $data->tgl_registrasi }}</td>
<td>{{ $data->code }}</td>
<td>{{ $data->pasien->nik }}</td>
<td>{{ $data->pasien->nama }}</td>
<td>{{ $data->pasien->tgl_lahir }}</td>
<td>
@if ($data->pasien->jenis_kelamin === "male")
Laki-laki
@else
Perempuan
@endif
</td>
<td>{{ $data->ruangPelayanan->nama}}</td>
<td>
<div class="row">
<button type="button" class="btn btn-info btn-sm mr-1 mt-1" title="Detail" data-toggle="modal" data-target="#modal-detail{{ $data->id }}"><i class="fas fa-info-circle"></i></button>
@if ($data->status_tindakan === "done")
<button class="btn btn-warning btn-sm mr-1 mt-1" title="Tindakan" disabled><i class="fas fa-stethoscope"></i></button>
@else
<a href="{{ route('transaksi.tindakan', $data->id) }}" target="BLANK" class="btn btn-warning btn-sm mr-1 mt-1" title="Tindakan"><i class="fas fa-stethoscope"></i></a>
@endif
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
{{-- Modal Add --}}
<div class="modal fade" id="modal-add">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Register Pasien</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<form action="{{ route('registrasi.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="modal-body">
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="nik">NIK</label>
<div class="input-group">
<input class="form-control" type="text" name="nik" id="nik" maxlength="16" required>
<div class="input-group-append">
<button class="btn btn-secondary" type="button" id="search-nik-btn">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="form-group">
<label for="nama">Nama</label>
<input class="form-control" type="text" name="nama" required>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="tgl_lahir">Tgl Lahir</label>
<input class="form-control" type="date" name="tgl_lahir" required>
</div>
</div>
<div class="col-sm-6">
<div class="form-group">
<label for="jenis_kelamin">Jenis Kelamin</label>
<select name="jenis_kelamin" class="form-control" style="width: 100%;" required>
<option value="male">Laki-laki</option>
<option value="female">Perempuan</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="asuransi">Asuransi</label>
<input type="checkbox" id="asuransi_checkbox" class="mr-2">
<select name="asuransi" class="form-control select2bs4" style="width: 100%;" id="asuransi_select" disabled>
<option value="">Pilih Asuransi</option>
@foreach ($asuransi as $asr)
<option value="{{ $asr->id }}">{{ $asr->nama }}</option>
@endforeach
</select>
</div>
</div>
<div class="col-sm-6">
<div class="form-group">
<label for="no_asuransi">No. Asuransi</label>
<input class="form-control" type="text" name="no_asuransi" id="no_asuransi" disabled>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="ruang_pelayanan">Ruangan Pelayanan</label>
<select name="ruang_pelayanan" class="form-control select2bs4" style="width: 100%;">
@foreach ($ruangPelayanan as $rp)
<option value="{{ $rp->id }}">{{ $rp->nama }}</option>
@endforeach
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-default" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-default">Simpan</button>
</div>
</form>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
<!-- /.modal -->
</div>
</div>
</div>
</section>
@push('script')
<script>
$(function () {
$("#pasien_tb").DataTable({
"responsive": true,
"lengthChange": false,
"autoWidth": false,
"ordering": false,
});
$('.select2bs4').select2({
theme: 'bootstrap4'
});
});
</script>
<script>
document.getElementById('asuransi_checkbox').addEventListener('change', function() {
var asuransiSelect = document.getElementById('asuransi_select');
var noAsuransiInput = document.getElementById('no_asuransi');
if (this.checked) {
asuransiSelect.disabled = false;
noAsuransiInput.disabled = false;
asuransiSelect.setAttribute('required', 'required');
noAsuransiInput.setAttribute('required', 'required');
} else {
asuransiSelect.disabled = true;
noAsuransiInput.disabled = true;
asuransiSelect.removeAttribute('required');
noAsuransiInput.removeAttribute('required');
}
});
</script>
<script>
$(document).ready(function() {
$('#search-nik-btn').click(function() {
var nik = $('#nik').val();
if (nik.length !== 16) {
alert('NIK harus 16 digit.');
return;
}
$.ajax({
url: "{{ route('pasien.cek_nik') }}",
method: 'GET',
data: { nik: nik },
success: function(response) {
if (response.success) {
$('input[name="nama"]').val(response.pasien.nama).prop('readonly', true);
$('input[name="tgl_lahir"]').val(response.pasien.tgl_lahir).prop('readonly', true);
$('select[name="jenis_kelamin"]').val(response.pasien.jenis_kelamin).prop('disabled', true);
} else {
$('input[name="nama"]').val('').prop('readonly', false);
$('input[name="tgl_lahir"]').val('').prop('readonly', false);
$('select[name="jenis_kelamin"]').val('').prop('disabled', false);
alert('NIK tidak ditemukan!');
}
},
error: function(xhr) {
console.error(xhr.responseText);
alert('Terjadi kesalahan saat mencari data NIK.');
}
});
});
$('#nik').on('input', function() {
$('input[name="nama"]').prop('readonly', false);
$('input[name="tgl_lahir"]').prop('readonly', false);
$('select[name="jenis_kelamin"]').prop('disabled', false);
});
});
</script>
@endpush
@endsection

View File

@ -6,8 +6,6 @@
<div class="col-12">
<div class="card">
<div class="card-header">
<a href="#" class="btn btn-success"><i class="fas fa-file-excel"></i>Unduh Excel</a>
<a href="#" class="btn btn-danger"><i class="fas fa-file-pdf"></i>Unduh PDF</a>
<button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#modal-add"><i class="fas fa-plus"></i>Data</button>
</div>
<!-- /.card-header -->

View File

@ -6,8 +6,6 @@
<div class="col-12">
<div class="card">
<div class="card-header">
<a href="#" class="btn btn-success"><i class="fas fa-file-excel"></i>Unduh Excel</a>
<a href="#" class="btn btn-danger"><i class="fas fa-file-pdf"></i>Unduh PDF</a>
<button type="button" class="btn btn-primary float-right" data-toggle="modal" data-target="#modal-add"><i class="fas fa-plus"></i>Data</button>
</div>
<!-- /.card-header -->

View File

@ -0,0 +1,193 @@
@extends('layout.main')
@section('content')
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card card-info p-3 mb-4">
<h5>Informasi Pasien</h5>
<div class="row">
<div class="col-md-4"><b>Tgl Registrasi:</b> {{ $dataRegistrasi->tgl_registrasi }}</div>
<div class="col-md-4"><b>Kode Registrasi:</b> {{ $dataRegistrasi->code }}</div>
<div class="col-md-4"><b>Nama:</b> {{ $dataRegistrasi->pasien->nama }}</div>
</div>
<div class="row">
<div class="col-md-4"><b>Tgl Lahir:</b> {{ $dataRegistrasi->pasien->tgl_lahir }}</div>
<div class="col-md-4"><b>Jenis Kelamin:</b>
{{ $dataRegistrasi->pasien->jenis_kelamin === "male" ? "Laki-laki" : "Perempuan" }}
</div>
<div class="col-md-4"><b>Asuransi:</b> {{ $dataRegistrasi->asuransi->nama ?? '-' }}</div>
</div>
</div>
<form action="{{ route('transaksi.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="card card-primary p-3 mb-4">
<h5>Pilih Tindakan Pasien</h5>
<div class="row mb-3">
<div class="col-md-8">
<input name="id_registrasi" type="hidden" value="{{ $dataRegistrasi->id }}">
<select name="tindakan[]" id="pilihTindakan" class="form-control select2bs4" style="width: 100%;">
<option value="">-- Pilih Tindakan --</option>
@foreach ($tindakan as $td)
<option value="{{ $td->id }}" data-tarif="{{ $td->tarif }}">{{ $td->nama }}</option>
@endforeach
</select>
</div>
<div class="col-md-4">
<button type="button" id="tambahTindakan" class="btn btn-success w-100">Tambah Tindakan</button>
</div>
</div>
<div class="table-responsive">
<table class="table table-bordered" id="tabelTindakan">
<thead>
<tr>
<th>No</th>
<th>Nama Tindakan</th>
<th>Tarif</th>
<th>Jumlah</th>
<th>Subtotal</th>
<th>Potongan Asuransi</th>
<th>Jumlah Potongan</th>
<th>Total Akhir</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<!-- Data rows will be added dynamically -->
</tbody>
</table>
</div>
<div class="row mt-3">
<div class="col-md-6 offset-md-6">
<table class="table">
<tr>
<th>Subtotal:</th>
<td id="subtotal">Rp 0</td>
</tr>
<tr>
<th>Total Potongan:</th>
<td id="total_potongan">Rp 0</td>
</tr>
<tr>
<th>Jumlah yang Harus Dibayar:</th>
<td id="total">Rp 0</td>
</tr>
</table>
</div>
</div>
<div class="text-right">
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
@push('script')
<script>
$(function () {
$('.select2bs4').select2({ theme: 'bootstrap4' });
let tindakanList = [];
let no = 1;
const asuransiCover = @json($asuransiTindakan);
$('#tambahTindakan').on('click', function () {
const selected = $('#pilihTindakan option:selected');
const idTindakan = selected.val();
const nama = selected.text();
const tarif = selected.data('tarif');
if (!idTindakan) return;
const selectedAsuransi = asuransiCover.find(item => parseInt(item.id_tindakan) === parseInt(idTindakan));
const coverPercentage = selectedAsuransi ? selectedAsuransi.cover_percentage : 0;
tindakanList.push({
idTindakan,
nama,
tarif,
coverPercentage,
jumlah: 1
});
renderTabel();
});
function renderTabel() {
const tbody = $('#tabelTindakan tbody');
tbody.empty();
let subtotal = 0;
tindakanList.forEach((item, index) => {
const sub = item.tarif * item.jumlah;
const asuransiDiscount = (sub * item.coverPercentage) / 100;
const lastTotal = sub - asuransiDiscount;
subtotal += sub;
tbody.append(`
<tr>
<td>${index + 1}</td>
<td>${item.nama}</td>
<td>${formatRupiah(item.tarif)}</td>
<td><input type="number" name="jumlah_tindakan[]" class="form-control jumlahTindakan" value="${item.jumlah}" data-index="${index}" style="width: 60px;" min="1"></td>
<td>${formatRupiah(sub)}</td>
<td>${item.coverPercentage}%</td>
<td>${formatRupiah(asuransiDiscount)}</td>
<td>${formatRupiah(lastTotal)}</td>
<td><button class="btn btn-danger btn-sm" onclick="hapusTindakan(${index})">Hapus</button></td>
</tr>
<input type="hidden" name="id_tindakan[]" value="${item.idTindakan}">
<input type="hidden" name="tarif[]" value="${item.tarif}">
<input type="hidden" name="cover_percentage[]" value="${item.coverPercentage}">
<input type="hidden" name="subtotal[]" value="${sub}">
<input type="hidden" name="asuransi_discount[]" value="${asuransiDiscount}">
<input type="hidden" name="total_akhir[]" value="${lastTotal}">
`);
});
const totalAsuransiDiscount = tindakanList.reduce((total, item) => {
const sub = item.tarif * item.jumlah;
return total + (sub * item.coverPercentage) / 100;
}, 0);
const total = subtotal - totalAsuransiDiscount;
$('#subtotal').text(`Rp ${formatRupiah(subtotal)}`);
$('#total_potongan').text(`Rp ${formatRupiah(totalAsuransiDiscount)}`);
$('#total').text(`Rp ${formatRupiah(total)}`);
}
$(document).on('input', '.jumlahTindakan', function () {
const index = $(this).data('index');
const jumlah = $(this).val();
if (jumlah < 1) return;
tindakanList[index].jumlah = parseInt(jumlah);
renderTabel();
});
window.hapusTindakan = function (index) {
tindakanList.splice(index, 1);
renderTabel();
}
function formatRupiah(angka) {
return angka.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
});
</script>
@endpush
@endsection

View File

@ -4,8 +4,10 @@ use App\Http\Controllers\AsuransiController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\PasienController;
use App\Http\Controllers\RegistrasiController;
use App\Http\Controllers\RuangPelayananController;
use App\Http\Controllers\TindakanController;
use App\Http\Controllers\TransaksiController;
use Illuminate\Support\Facades\Route;
/*
@ -31,13 +33,20 @@ Route::middleware('auth:pegawai')->group(function () {
// Dashboard
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/registrasi', [RegistrasiController::class, 'index'])->name('registrasi.index');
Route::post('/registrasi', [RegistrasiController::class, 'store'])->name('registrasi.store');
// Pasien
Route::get('/pasien', [PasienController::class, 'index'])->name('pasien.index');
Route::post('/pasien', [PasienController::class, 'store'])->name('pasien.store');
Route::get('/pasien/cek_nik', [PasienController::class, 'cekNik'])->name('pasien.cek_nik');
// Asuransi
Route::get('/asuransi', [AsuransiController::class, 'index'])->name('asuransi.index');
Route::post('/asuransi', [AsuransiController::class, 'store'])->name('asuransi.store');
Route::put('/asuransi/{asuransi}', [AsuransiController::class, 'update'])->name('asuransi.update');
Route::get('/asuransi/mapping_tindakan/{asuransi}', [AsuransiController::class, 'maappingForm'])->name('asuransi.mapping.form');
Route::post('/asuransi/mapping_tindakan', [AsuransiController::class, 'mapping'])->name('asuransi.mapping');
// Ruang Pelayanan
Route::get('/ruang_pelayanan', [RuangPelayananController::class, 'index'])->name('ruang_pelayanan.index');
@ -48,4 +57,7 @@ Route::middleware('auth:pegawai')->group(function () {
Route::get('/tindakan', [TindakanController::class, 'index'])->name('tindakan.index');
Route::post('/tindakan', [TindakanController::class, 'store'])->name('tindakan.store');
Route::put('/tindakan/{tindakan}', [TindakanController::class, 'update'])->name('tindakan.update');
Route::get('/tansaksi/tindakan/{registrasi}', [TransaksiController::class, 'tindakanForm'])->name('transaksi.tindakan');
Route::post('/transaksi', [TransaksiController::class, 'store'])->name('transaksi.store');
});