Files
kaunter/resources/views/pembiayaan_online/operasi/batch.blade.php
T
2026-09-22 10:34:22 +08:00

345 lines
19 KiB
PHP

@extends('layouts.app_operasi')
@section('content')
@php
$pendingCount = collect($lines)->whereIn('status', ['IN_BATCH', 'OPS_REVIEW'])->count();
$approvedCount = collect($lines)->where('status', 'APPROVED')->count();
$cawName = $cawangan_info['details_caw'] ?? $cawangan_info['namacaw'] ?? $kodcaw;
@endphp
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-md-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb pb-3">
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
<li class="breadcrumb-item"><a href="{{ route('pembiayaan.online.operasi') }}">Pembiayaan Online</a></li>
<li class="breadcrumb-item active" aria-current="page">Batch</li>
</ol>
</nav>
@if(session()->has('message'))
<div class="alert alert-success">{{ session('message') }}</div>
@endif
@if(session()->has('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
<div class="card mb-3">
<div class="card-body">
<div class="row">
<div class="col-md-3"><b>Batch No</b><br>{{ $batch['batch_no'] ?? '-' }}</div>
<div class="col-md-3"><b>Cawangan</b><br>{{ $cawName }} <small class="text-muted">({{ $kodcaw }})</small></div>
<div class="col-md-2"><b>Tarikh</b><br>{{ $batch['tarikh'] ?? '-' }}</div>
<div class="col-md-2"><b>Slot</b><br>{{ $batch['slot'] ?? '-' }}</div>
<div class="col-md-2"><b>Status</b><br>{{ $batch['status'] ?? '-' }}</div>
</div>
<div class="row mt-3">
<div class="col-md-3"><b>Bilangan</b><br>{{ $batch['bilangan'] ?? count($lines) }}</div>
<div class="col-md-3"><b>Jumlah</b><br>RM {{ number_format((float)($batch['jumlah_keseluruhan'] ?? 0), 2) }}</div>
<div class="col-md-3"><b>Dihantar Oleh</b><br>{{ $batch['pc_submitted_by'] ?? '-' }}</div>
<div class="col-md-3"><b>Dihantar Pada</b><br>{{ $batch['submitted_at'] ?? '-' }}</div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-header d-flex justify-content-between align-items-center flex-wrap">
<h5 class="mb-0">Senarai Dalam Batch</h5>
<div class="mt-2 mt-md-0">
<a href="{{ route('pembiayaan.online.operasi.batch.print', ['kodcaw' => $kodcaw, 'batchId' => $batch['id']]) }}"
class="btn btn-outline-dark btn-sm"
target="_blank">
Cetak Borang
</a>
<a href="{{ route('pembiayaan.online.operasi') }}" class="btn btn-secondary btn-sm">Kembali</a>
@if($pendingCount > 0)
<form method="post"
action="{{ route('pembiayaan.online.operasi.approve.batch', ['kodcaw' => $kodcaw, 'batchId' => $batch['id']]) }}"
class="d-inline js-swal-confirm"
data-title="Lulus Semua Menunggu?"
data-html="Luluskan semua <b>{{ $pendingCount }}</b> rekod menunggu dalam batch <b>{{ $batch['batch_no'] ?? '-' }}</b>?"
data-confirm="Ya, Lulus Semua">
@csrf
<button type="submit" class="btn btn-success btn-sm">Lulus Semua Menunggu ({{ $pendingCount }})</button>
</form>
@endif
@if($approvedCount > 0)
<button type="button" class="btn btn-dark btn-sm" data-toggle="modal" data-target="#paidBatchModal">
Tanda semua sebagai dibayar ({{ $approvedCount }})
</button>
@endif
</div>
</div>
<div class="card-body">
<x-datatable
id="batch_lines"
class="table-sm text-center"
:filename="'Batch_' . ($batch['batch_no'] ?? $batch['id'])"
:columns="['Bil', 'Status', 'SAG', 'Pelanggan', 'No KP', 'Bank', 'No Akaun', 'Nama Akaun', 'Pinjaman (RM)', 'Rujukan Bayaran', 'Dokumen', 'Tindakan']"
:skipExport="['Dokumen', 'Tindakan']"
>
@foreach($lines as $line)
@php
$st = $line['status'] ?? '';
$badge = 'badge-secondary';
if ($st === 'APPROVED') $badge = 'badge-success';
elseif ($st === 'PAID') $badge = 'badge-dark';
elseif ($st === 'REJECTED_PC') $badge = 'badge-danger';
elseif (in_array($st, ['IN_BATCH', 'OPS_REVIEW'], true)) $badge = 'badge-primary';
@endphp
<tr>
<td>{{ $loop->iteration }}</td>
<td><span class="badge {{ $badge }}">{{ $st ?: '-' }}</span></td>
<td>{{ $line['norujukan'] ?? '-' }}</td>
<td class="text-left">{{ $line['nama_pelanggan'] ?? '-' }}</td>
<td>{{ $line['nokp'] ?? '-' }}</td>
<td>{{ $line['nama_bank'] ?? $line['kodbank'] ?? '-' }}</td>
<td>{{ $line['noakaun'] ?? '-' }}</td>
<td class="text-left">{{ $line['nama_akaun'] ?? '-' }}</td>
<td class="text-right">{{ number_format((float)($line['pinjaman'] ?? 0), 2) }}</td>
<td>{{ $line['no_rujukan_bayaran'] ?? '-' }}</td>
<td class="text-nowrap">
<button type="button"
class="btn btn-sm btn-outline-dark btn-preview-sag"
data-url="{{ route('pembiayaan.online.operasi.sag', ['kodcaw' => $kodcaw, 'id' => $line['id']]) }}"
data-norujukan="{{ $line['norujukan'] ?? '' }}">
SAG
</button>
@if(!empty($line['bukti_akaun_file_id']))
<a class="btn btn-sm btn-outline-primary"
href="{{ route('pembiayaan.online.operasi.bukti.akaun', ['kodcaw' => $kodcaw, 'id' => $line['id']]) }}"
target="_blank">
Slip Bank
</a>
@else
<span class="text-muted small">Tiada slip</span>
@endif
</td>
<td class="text-nowrap">
@if(in_array($st, ['IN_BATCH', 'OPS_REVIEW'], true))
<form method="post"
action="{{ route('pembiayaan.online.operasi.approve', ['kodcaw' => $kodcaw, 'id' => $line['id']]) }}"
class="d-inline js-swal-confirm"
data-title="Luluskan Rekod?"
data-html="Luluskan rekod <b>{{ $line['norujukan'] ?? '-' }}</b>?"
data-confirm="Ya, Lulus">
@csrf
<input type="hidden" name="batch_id" value="{{ $batch['id'] }}">
<button type="submit" class="btn btn-success btn-sm">Lulus</button>
</form>
<button type="button"
class="btn btn-danger btn-sm btn-reject"
data-id="{{ $line['id'] }}"
data-norujukan="{{ $line['norujukan'] ?? '' }}">
Tolak
</button>
@elseif($st === 'APPROVED')
<button type="button"
class="btn btn-dark btn-sm btn-paid"
data-id="{{ $line['id'] }}"
data-norujukan="{{ $line['norujukan'] ?? '' }}">
Tanda sebagai dibayar
</button>
<button type="button"
class="btn btn-outline-danger btn-sm btn-reject"
data-id="{{ $line['id'] }}"
data-norujukan="{{ $line['norujukan'] ?? '' }}">
Tolak
</button>
@elseif($st === 'PAID')
<span class="text-muted small">Selesai</span>
@else
<span class="text-muted small">-</span>
@endif
</td>
</tr>
@endforeach
</x-datatable>
</div>
</div>
</div>
</div>
</div>
{{-- SAG preview modal --}}
<div class="modal fade" id="sagPreviewModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-xl" role="document" style="max-width:1140px;">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Pratinjau SAG — <span id="sagPreviewTitle"></span></h5>
<button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
</div>
<div class="modal-body p-2">
<iframe id="sagPreviewFrame" title="Pratinjau SAG" src="about:blank"
style="width:100%;height:75vh;border:1px solid #dee2e6;background:#f8f9fa;"></iframe>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
{{-- Reject modal --}}
<div class="modal fade" id="rejectModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<form method="post" id="rejectForm" action="">
@csrf
<input type="hidden" name="batch_id" value="{{ $batch['id'] }}">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tolak Rekod — <span id="rejectNorujukan"></span></h5>
<button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Sebab Tolak <span class="text-danger">*</span></label>
<textarea name="reject_reason" id="rejectReason" class="form-control" rows="3" required
placeholder="Contoh: No akaun tidak sepadan / dokumen tidak lengkap"></textarea>
</div>
<p class="small text-muted mb-0">Rekod akan dikembalikan ke queue PC untuk semakan semula.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-danger">Tolak</button>
</div>
</div>
</form>
</div>
</div>
{{-- Paid line modal --}}
<div class="modal fade" id="paidModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<form method="post" id="paidForm" action="" enctype="multipart/form-data">
@csrf
<input type="hidden" name="batch_id" value="{{ $batch['id'] }}">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tanda sebagai dibayar — <span id="paidNorujukan"></span></h5>
<button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
</div>
<div class="modal-body">
<div class="form-group">
<label>No. Rujukan Bayaran <span class="text-danger">*</span></label>
<input type="text" name="no_rujukan_bayaran" class="form-control" required>
</div>
<div class="form-group">
<label>Tarikh Bayaran</label>
<input type="date" name="tarikh_bayaran" class="form-control" value="{{ date('Y-m-d') }}">
</div>
<div class="form-group">
<label>Bukti Bayaran <span class="text-danger">*</span></label>
<input type="file" name="bukti" class="form-control-file" accept=".pdf,.jpg,.jpeg,.png,.gif" required>
<small class="text-muted">PDF / imej slip bank</small>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-dark">Simpan</button>
</div>
</div>
</form>
</div>
</div>
{{-- Paid batch modal --}}
<div class="modal fade" id="paidBatchModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<form method="post"
action="{{ route('pembiayaan.online.operasi.paid.batch', ['kodcaw' => $kodcaw, 'batchId' => $batch['id']]) }}"
enctype="multipart/form-data">
@csrf
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Tanda semua sebagai dibayar ({{ $approvedCount }})</h5>
<button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
</div>
<div class="modal-body">
<p class="small text-muted">Satu no. rujukan + bukti akan diguna untuk semua rekod APPROVED dalam batch ini.</p>
<div class="form-group">
<label>No. Rujukan Bayaran <span class="text-danger">*</span></label>
<input type="text" name="no_rujukan_bayaran" class="form-control" required>
</div>
<div class="form-group">
<label>Tarikh Bayaran</label>
<input type="date" name="tarikh_bayaran" class="form-control" value="{{ date('Y-m-d') }}">
</div>
<div class="form-group">
<label>Bukti Bayaran <span class="text-danger">*</span></label>
<input type="file" name="bukti" class="form-control-file" accept=".pdf,.jpg,.jpeg,.png,.gif" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-dark">Simpan</button>
</div>
</div>
</form>
</div>
</div>
<script>
var table = initErahnDatatable('#batch_lines', {
columnDefs: [
{ targets: 0, orderable: false, searchable: false, width: '40px' },
{ targets: [10, 11], orderable: false, searchable: false }
]
});
table.on('draw.dt', function () {
table.column(0, { search: 'applied', order: 'applied' }).nodes().each(function (cell, i) {
cell.innerHTML = i + 1;
});
}).draw();
$('#batch_lines').on('click', '.btn-preview-sag', function () {
$('#sagPreviewTitle').text($(this).data('norujukan') || '');
$('#sagPreviewFrame').attr('src', $(this).data('url'));
$('#sagPreviewModal').modal('show');
});
$('#sagPreviewModal').on('hidden.bs.modal', function () {
$('#sagPreviewFrame').attr('src', 'about:blank');
});
$('#batch_lines').on('click', '.btn-reject', function () {
var id = $(this).data('id');
$('#rejectForm').attr(
'action',
"{{ url('/pembiayaan-online/operasi/' . $kodcaw . '/lines') }}/" + id + "/reject"
);
$('#rejectNorujukan').text($(this).data('norujukan'));
$('#rejectReason').val('');
$('#rejectModal').modal('show');
});
$('#batch_lines').on('click', '.btn-paid', function () {
var id = $(this).data('id');
$('#paidForm').attr(
'action',
"{{ url('/pembiayaan-online/operasi/' . $kodcaw . '/lines') }}/" + id + "/paid"
);
$('#paidNorujukan').text($(this).data('norujukan'));
$('#paidModal').modal('show');
});
$(document).on('submit', '.js-swal-confirm', function (e) {
e.preventDefault();
var form = this;
Swal.fire({
title: $(form).attr('data-title') || 'Pengesahan',
html: $(form).attr('data-html') || 'Teruskan tindakan ini?',
icon: 'question',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: $(form).attr('data-confirm') || 'Ya',
cancelButtonText: 'Batal',
allowOutsideClick: false
}).then(function (result) {
if (result.isConfirmed) {
form.submit();
}
});
});
</script>
@endsection