Perbaikan Menu Laporan per pintu pos

This commit is contained in:
pand03
2026-04-17 11:17:53 +07:00
parent c73adb3c6b
commit 6b3a2ca72e
5 changed files with 336 additions and 16 deletions

View File

@@ -88,7 +88,7 @@
<div class="submenu">
<ul>
<li class="nav-item"><a class="nav-link" href="/tools/stiker-extend">Perpanjang Stiker Otomatis</a></li>
{{-- <li class="nav-item"><a class="nav-link" href="pages/ui-features/typography.html">Typography</a></li> --}}
<li class="nav-item"><a class="nav-link" href="/tools/change-trans">Koreksi Transaksi</a></li>
</ul>
</div>
</li>

View File

@@ -56,6 +56,7 @@
<div class="card">
<div class="card-header">
<h4 class="card-title laporan">Laporan Per Pintu ({{ $locationSettings->namalokasi }})</h4>
<div id="user-profile" data-user-id="{{ auth()->user()->nama }}"></div>
<form id="fromByGate">
@csrf
<div class="form-group">
@@ -214,7 +215,12 @@
<script>
$(document).ready(function () {
let location = @json(collect($locationSettings ?? [])->except('logo'));
let user = $('#user-profile').data('user-id');
console.log(user);
let tanggal = '';
let pdfData = [];
const title = $('.laporan').val();
$('.select2').select2({
theme: 'bootstrap-5',
@@ -227,6 +233,15 @@
$('#tanggalMulai').val(new Date().toISOString().split('T')[0]);
$('#tanggalSelesai').val(new Date().toISOString().split('T')[0]);
let startDate = $('#tanggalMulai').val();
let endDate = $('#tanggalSelesai').val();
if ( startDate !== endDate ) {
tanggal = startDate + ' s/d ' + endDate;
} else {
tanggal = endDate;
}
$('#btnProses').on('click', function () {
let formData = $('#fromByGate').serialize();
@@ -567,7 +582,10 @@ function formatRupiah(angka) {
};
}
let operator = item.petugas;
// let operator = item.petugas;
let operator = (item.petugas && item.petugas.trim() !== null)
? item.petugas
: 'NO-OP';
if (!grouped[gate].operators[operator]) {
grouped[gate].operators[operator] = {
@@ -578,16 +596,16 @@ function formatRupiah(angka) {
// 🔥 HITUNG TOTAL
if (item.status_transaksi == 0) {
casualJml++;
casualJml += parseFloat(item.jumlah_transaksi || 0);
casualIncome += parseFloat(item.income_transaksi || 0);
}
if (item.status_transaksi == 3) {
memberJml++;
memberJml += parseFloat(item.jumlah_transaksi || 0);
memberIncome += parseFloat(item.income_transaksi || 0);
}
totalTrans++;
totalTrans += parseFloat(item.jumlah_transaksi || 0);
totalIncome += parseFloat(item.income_transaksi || 0);
let kendaraan = item.kendaraan;
@@ -756,7 +774,10 @@ function kendaraanLabel(kode) {
};
}
let operator = item.petugas;
// let operator = item.petugas || 'NO-OP';
let operator = (item.petugas && item.petugas.trim() !== '')
? item.petugas
: 'NO-OP';
if (!grouped[gate].operators[operator]) {
grouped[gate].operators[operator] = {
@@ -847,7 +868,6 @@ function kendaraanLabel(kode) {
$('.btn-export-pdf').on('click', function () {
const title = $('.laporan').val();
const { jsPDF } = window.jspdf;
const doc = new jsPDF({
@@ -865,16 +885,16 @@ function kendaraanLabel(kode) {
pdfData.forEach(row => {
totalTrans++;
totalTrans += parseFloat(row.jumlah_transaksi || 0);
totalIncome += parseFloat(row.income_transaksi || 0);
if (row.status_transaksi == 0) {
jmlCasual++;
jmlCasual += parseFloat(row.jumlah_transaksi || 0);
incomeCasual += parseFloat(row.income_transaksi || 0);
}
if (row.status_transaksi == 3) {
jmlMember++;
jmlMember += parseFloat(row.jumlah_transaksi || 0);
incomeMember += parseFloat(row.income_transaksi || 0);
}
@@ -894,7 +914,7 @@ function kendaraanLabel(kode) {
pdfData.forEach(row => {
let gate = row.gate || '-';
let operator = row.petugas || '-';
let operator = row.petugas || 'NO-OP';
if (!grouped[gate]) grouped[gate] = {};
if (!grouped[gate][operator]) grouped[gate][operator] = [];
@@ -924,7 +944,8 @@ function kendaraanLabel(kode) {
operatorFirst ? operator : '',
row.kendaraan ?? '-',
row.status_transaksi == 0 ? 'Casual' : 'Member',
'', // ❌ jumlah dihapus biar ga ngulang
// '', // ❌ jumlah dihapus biar ga ngulang
row.jumlah_transaksi ?? 0,
formatRupiah(row.income_transaksi ?? 0),
]);
@@ -995,14 +1016,18 @@ function kendaraanLabel(kode) {
doc.setFont('helvetica', 'bold');
doc.setFontSize(14);
doc.text(String(title || 'LAPORAN'), pageWidth / 2, 15, { align: 'center' });
doc.text(String('LAPORAN TRANSAKSI PER PINTU'), pageWidth / 2, 15, { align: 'center' });
doc.setFontSize(12);
doc.setFont('helvetica', 'normal');
doc.text(String(tanggal || '-'), pageWidth / 2, 20, { align: 'center' });
doc.setFontSize(10);
doc.setFont('helvetica', 'normal');
doc.text(String(location?.namaperusahaan || '-'), pageWidth / 2, 22, { align: 'center' });
doc.text(String(location?.namaperusahaan || '-'), pageWidth / 2, 25, { align: 'center' });
doc.setFontSize(9);
doc.text(`Periode : `, marginLeft, 32);
doc.text(`Lokasi : ` + location?.namalokasi, marginLeft, 32);
doc.line(marginLeft, 40, pageWidth - marginRight, 40);
}
@@ -1049,6 +1074,9 @@ function kendaraanLabel(kode) {
}
doc.setFontSize(9);
doc.text(`Dicetak oleh : ${user}`, marginLeft, finalY);
doc.text(`Tanggal cetak : ${new Date().toISOString().split('T')[0]}`, marginLeft, finalY + 6);
doc.text(`Casual : ${jmlCasual} (${formatRupiah(incomeCasual)})`, pageWidth - marginRight, finalY + 12, { align: 'right' });
doc.text(`Member : ${jmlMember} (${formatRupiah(incomeMember)})`, pageWidth - marginRight, finalY + 18, { align: 'right' });
@@ -1056,7 +1084,7 @@ function kendaraanLabel(kode) {
doc.text(`Total Pendapatan : ${formatRupiah(totalIncome)}`, pageWidth - marginRight, finalY + 6, { align: 'right' });
doc.save(`${title}.pdf`);
doc.save(`Laporan_per_pintu.pdf`);
});
// function renderGateData(data) {

View File

@@ -0,0 +1,205 @@
@extends('layouts.master')
@section('styles')
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="{{ asset('vendors/select2/select2.min.css') }}">
<style>
.select2-container .select2-selection--single {
height: 48px;
}
.select2-container--default
.select2-selection--single
.select2-selection__rendered {
line-height: 38px;
}
.select2-container--default
.select2-selection--single
.select2-selection__arrow {
height: 38px;
}
.container {
max-width: 1400px; /* default sekitar 11401320 */
}
/* .table th {
text-align: center;
}
.table td {
text-align: right;
} */
</style>
@endsection
@section('content')
<div class="container-scroller">
<div class="container-fluid page-body-wrapper full-page-wrapper">
<div class="main-panel">
<div class="content-wrapper d-flex align-items-center auth px-0">
<div class="row w-100 mx-0">
<div class="col-lg-4 mx-auto">
<div class="auth-form-light text-left py-5 px-4 px-sm-5">
<h4 class="text-center fw-bold">All New Manufacture</h4>
<div class="card mb-0 h-auto">
<div class="card-body">
<div class="form-group">
<div class="col-sm-12 col-md-6">
<label>No. Trans : </label> <!-- biar sejajar -->
<input class="form-control" type="text" name="idtrans" id="idtrans" placeholder="Masuk kan nomer transaksi">
</div>
</div>
<div class="form-group">
<label>Periode : </label>
<div class="d-flex gap-2">
<input type="date" class="form-control" id="tanggalMulai" name="tanggal_mulai">
<input type="date" class="form-control" id="tanggalSelesai" name="tanggal_selesai">
</div>
</div>
<div class="form-group">
<button type="button" id="btnProses" class="btn btn-outline-secondary btn-lg btn-block">Proses</button>
</div>
<div id="progressBox" class="mt-3 d-none">
<div class="progress">
<div id="progressBar"
class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar"
style="width: 0%">
</div>
</div>
<small id="progressText" class="text-muted d-block mt-2">
Memulai proses...
</small>
</div>
<div id="alertSuccess" class="alert alert-success d-none" role="alert">
<span class="alert-inner--icon">
<i class="fe fe-thumbs-up"></i>
</span>
<span class="alert-inner--text">
<strong>Success!</strong> Stiker berhasil diproses.
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('javascript')
<script src="{{ asset('vendors/select2/select2.min.js') }}"></script>
<script src="{{ asset('js/select2.js') }}"></script>
<script>
$(document).ready(function () {
$('#jenisLangganan').on('change', function () {
// const selected = $(this).val();
console.log(selected);
if (!selected || selected.length == 0) {
alert('Tidak ada yang dipilih');
return
}
$.ajax({
url: "{{ url('tools/stiker-extend') }}/" + selected,
type: 'GET',
// data: {
// pilihannya : selected,
// },
success: function(res) {
console.log(res);
},
error: function (xhr) {
console.error(xhr.responseText);
}
})
});
$('#modeTanggal').on('change', function () {
const isRange = $(this).val() === 'range';
$('#tanggalMulai').toggleClass('d-none', isRange);
$('#tanggalSelesai').toggleClass('d-none', !isRange);
console.log(isRange);
});
const now = new Date();
// $('#tanggalSingle').val(formatDateTime(now));
const startDay = new Date(now);
// startDay.setHours(0,0,0,0);
$('#tanggalMulai').val();
$('#tanggalSelesai').val();
$('#btnProses').on('click', function () {
const jenisLangganan = $('#jenisLangganan').val();
const mulai = $('#tanggalMulai').val();
const selesai = $('#tanggalSelesai').val();
if (!jenisLangganan || jenisLangganan.length === 0) {
alert('Pilih minimal 1 jenis langganan');
return;
}
if (!mulai || !selesai) {
alert('Periode harus diisi');
return;
}
const btn = $(this);
btn.prop('disabled', true).text('Memproses...');
$('#alertSuccess').addClass('d-none');
// 🔥 TAMPILKAN PROGRESS
$('#progressBox').removeClass('d-none');
setProgress(15, 'Menyiapkan data...');
$.ajax({
url: "{{ route('stiker-extend.store') }}",
type: "POST",
data: {
jenis_langganan: jenisLangganan,
tanggal_mulai: mulai,
tanggal_selesai: selesai,
_token: "{{ csrf_token() }}"
},
success: function (res) {
setProgress(100, 'Proses selesai ✔️');
// ⏳ kasih jeda dikit biar user lihat 100%
setTimeout(function () {
$('#progressBox').addClass('d-none');
btn.prop('disabled', false).text('Proses');
$('#alertSuccess')
.removeClass('d-none')
.hide()
.fadeIn(300);
}, 700);
console.log(res);
},
error: function (xhr) {
alert(xhr.responseText);
}
});
});
function setProgress(val, text) {
$('#progressBar').css('width', val + '%');
$('#progressText').text(text);
}
});
</script>
@endsection