Perbaikan Menu Laporan per pintu pos
This commit is contained in:
85
app/Http/Controllers/Tools/TransactionChangeController.php
Normal file
85
app/Http/Controllers/Tools/TransactionChangeController.php
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Tools;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TransactionChangeController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view ('tools.koreksi-transaksi');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
205
resources/views/tools/koreksi-transaksi.blade.php
Normal file
205
resources/views/tools/koreksi-transaksi.blade.php
Normal 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 1140–1320 */
|
||||
}
|
||||
/* .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
|
||||
@@ -18,6 +18,7 @@
|
||||
use App\Http\Controllers\StikerController;
|
||||
use App\Http\Controllers\StreamerController;
|
||||
use App\Http\Controllers\Tools\StikerExtendedController;
|
||||
use App\Http\Controllers\Tools\TransactionChangeController;
|
||||
use App\Http\Controllers\VerifyTransController;
|
||||
|
||||
use App\Services\BcaSignatureTest;
|
||||
@@ -78,6 +79,7 @@
|
||||
});
|
||||
Route::prefix('/tools')->group(function () {
|
||||
Route::resource('stiker-extend', StikerExtendedController::class);
|
||||
Route::resource('change-trans', TransactionChangeController::class);
|
||||
});
|
||||
|
||||
// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
|
||||
|
||||
Reference in New Issue
Block a user