filter data berdasarkan tanggal pada history

zelda
Akhmad Sofyan 2024-01-22 15:45:05 +07:00
parent ca06f63ca3
commit b7c408ee0a
7 changed files with 323 additions and 171 deletions

View File

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Kasir;
use App\Http\Controllers\Controller;
use App\Models\DetailPesanan;
use App\Models\Pesanan;
use Carbon\Carbon;
use Illuminate\Http\Request;
class History extends Controller
@ -14,12 +15,25 @@ class History extends Controller
return view('pages.History.index');
}
public function getDataHistory()
public function getDataHistory(Request $request)
{
$data = Pesanan::with(['detailPesanan', 'user'])->orderBy('created_at', 'desc')->get();
$nomor = 1;
$filter_tanggal_1 = $request->filter_tanggal_1;
$filter_tanggal_2 = $request->filter_tanggal_2;
$data = Pesanan::with(['detailPesanan', 'user'])
->when($filter_tanggal_1, function ($query) use ($filter_tanggal_1) {
return $query->whereDate('created_at', '>=', $filter_tanggal_1);
})
->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) {
return $query->whereDate('created_at', '<=', $filter_tanggal_2);
})
->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) {
return $query->whereDate('created_at', Carbon::today());
})
->orderBy('created_at', 'desc')
->get();
return $datatables = datatables()
return datatables()
->of($data)
->addColumn('nomor', function ($data) use (&$nomor) {
return $nomor++;
@ -42,6 +56,7 @@ class History extends Controller
})
->addColumn('ubah', function ($data) {
return '<div class="btn-group">
<a href="javascript:void(0)" onclick="detail(\'' . $data->id . '\')"><span class="btn btn-xs btn-warning mr-1"><i class="fas fa-eye"></i></span></a>
<a href="javascript:void(0)" onclick="print(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i></span></a></div>';
})
->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah'])
@ -54,4 +69,10 @@ class History extends Controller
return view('pages.Kasir.print_dapur', compact('pesanan'));
}
public function getDataDetailHistory(Request $request){
$data = DetailPesanan::with('pesanan')->where('pesanan_id', $request->id_pesanan)->get();
return response()->json(['status' => true, 'data' => $data]);
}
}

View File

@ -8,6 +8,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Sepiring Telur Keriting</title>
<!-- Google Font: Source Sans Pro -->

View File

@ -25,7 +25,22 @@
<div class="card">
<div class="card bg-warning" style="min-height:5px; border-radius:1px;"></div>
<div class="card-body">
{{-- <h5 class="card-title">Form List Data</h5> --}}
<div class="col-md-12">
<label>Filter Pencarian:</label>
<div class="row">
<div class="col-md-2">
<input type="date" class="form-control form-control-sm" id="filter_tanggal_1">
</div>
<p>s/d</p>
<div class="col-md-2">
<input type="date" class="form-control form-control-sm" id="filter_tanggal_2">
</div>
<div class="col-md-2">
<a href="javascript:void(0)" class="btn btn-sm btn-primary" id="btn_filter"><i class="fas fa-search mr-1"></i>Filter data</a>
</div>
</div>
</div>
<div class="col-md-12">
<div class="table-responsive mt-3">
<table id="tabelku" class="table table-hover display" style="width: 100%">
<thead>
@ -58,146 +73,10 @@
</div>
</div>
</div>
</div>
@include('pages.History.modal')
@endsection
@push('styles')
<!-- Toastr -->
<style>
@media only screen and (max-width : 991px) {
/* Styles */
}
@include('pages.History.style')
@include('pages.History.js')
@media only screen and (max-width : 768px) {
/* Styles */
}
@media only screen and (max-width : 414px) {
/* Styles */
}
</style>
<link rel="stylesheet" href="{{ asset('assets/plugins/toastr/toastr.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/datatables/datatables.min.css') }}">
@endpush
@push('scripts')
<script src="{{ asset('assets/datatables/datatables.min.js') }}"></script>
<script>
$(document).ready(function() {
$('#tabelku').DataTable({
processing: true,
serverSide: true,
ajax: '{{ route('history.getDataHistory') }}',
columns: [{
data: 'nomor',
name: 'nomor',
orderable: false,
className: 'text-center'
},
{
data: 'kode_pesanan',
name: 'kode_pesanan'
},
{
data: 'nama_pemesan',
name: 'nama_pemesan'
},
{
data: 'nomor_meja',
name: 'nomor_meja'
},
{
data: 'created_at',
name: 'created_at'
},
{
data: 'total_pesanan',
name: 'total_pesanan',
className: 'text-center'
},
{
data: 'total_bayar',
name: 'total_bayar',
className: 'text-right',
render: function(data) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
},
{
data: 'diskon_persen',
name: 'diskon_persen',
className: 'text-center',
render: function(data) {
return data ?? 0;
}
},
{
data: 'grand_total',
name: 'grand_total',
className: 'text-right',
render: function(data) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
},
{
data: 'ubah',
name: 'ubah',
className: 'text-center'
},
],
footerCallback: function(row, data, start, end, display) {
let api = this.api();
// Remove the formatting to get integer data for summation
let intVal = function(i) {
return typeof i === 'string' ?
i.replace(/[\$,]/g, '') * 1 :
typeof i === 'number' ?
i :
0;
};
// GrandTotal over all pages
totalAll = api
.column(8)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// GrandTotal over all pages
diskonTotal = api
.column(7)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Total over this page
pageTotal = api
.column(6, {
page: 'current'
})
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// total pesanan
totalPesanan = api
.column(5)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Update footer
api.column(5).footer().innerHTML = totalPesanan + ' Item';
api.column(6).footer().innerHTML =
'Rp. ' + pageTotal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
api.column(7).footer().innerHTML = diskonTotal + ' %';
api.column(8).footer().innerHTML =
'Rp. ' + totalAll.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
})
})
</script>
<script>
function print(id) {
var url = "{{ route('history.print', '') }}/" + id + '?print=true'
window.open(url, '_blank');
}
</script>
@endpush

View File

@ -0,0 +1,202 @@
@push('scripts')
<script src="{{ asset('assets/datatables/datatables.min.js') }}"></script>
<script>
$(document).ready(function() {
let dataTable = $('#tabelku').DataTable({
processing: true,
serverSide: true,
ajax: {
url: '{{ route('history.getDataHistory') }}',
data: function(d) {
d.filter_tanggal_1 = $("#filter_tanggal_1").val();
d.filter_tanggal_2 = $("#filter_tanggal_2").val();
}
},
columns: [{
data: 'nomor',
name: 'nomor',
orderable: false,
className: 'text-center'
},
{
data: 'kode_pesanan',
name: 'kode_pesanan'
},
{
data: 'nama_pemesan',
name: 'nama_pemesan'
},
{
data: 'nomor_meja',
name: 'nomor_meja'
},
{
data: 'created_at',
name: 'created_at'
},
{
data: 'total_pesanan',
name: 'total_pesanan',
className: 'text-center'
},
{
data: 'total_bayar',
name: 'total_bayar',
className: 'text-right',
render: function(data) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
},
{
data: 'diskon_persen',
name: 'diskon_persen',
className: 'text-center',
render: function(data) {
return data ?? 0;
}
},
{
data: 'grand_total',
name: 'grand_total',
className: 'text-right',
render: function(data) {
// change to IDR
return 'Rp. ' + data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
},
{
data: 'ubah',
name: 'ubah',
className: 'text-center'
},
],
footerCallback: function(row, data, start, end, display) {
let api = this.api();
// Remove the formatting to get integer data for summation
let intVal = function(i) {
return typeof i === 'string' ?
i.replace(/[\$,]/g, '') * 1 :
typeof i === 'number' ?
i :
0;
};
// GrandTotal over all pages
totalAll = api
.column(8)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// GrandTotal over all pages
diskonTotal = api
.column(7)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Total over this page
pageTotal = api
.column(6, {
page: 'current'
})
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// total pesanan
totalPesanan = api
.column(5)
.data()
.reduce((a, b) => intVal(a) + intVal(b), 0);
// Update footer
api.column(5).footer().innerHTML = totalPesanan + ' Item';
api.column(6).footer().innerHTML =
'Rp. ' + pageTotal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
api.column(7).footer().innerHTML = diskonTotal + ' %';
api.column(8).footer().innerHTML =
'Rp. ' + totalAll.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.');
}
})
$('#btn_filter').on('click', function() {
if($("#filter_tanggal_1").val() == "" || $("#filter_tanggal_2").val() == ""){
alert("Input pencarian tidak boleh kosong")
}else{
dataTable.ajax.reload();
}
});
})
</script>
<script>
function print(id) {
var url = "{{ route('history.print', '') }}/" + id + '?print=true'
window.open(url, '_blank');
}
</script>
<script>
function detail(id_pesanan){
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: "POST",
url: "{{ route('history.getDataDetailHistory') }}",
data: {
id_pesanan: id_pesanan,
},
success: function(result) {
$('#view_history_detail').empty()
if(result.status){
const data = result.data
let nomor = 1
// console.log(data);
data.forEach(x => {
let tr = $('<tr></tr>')
tr.append('<td class="text-center">'+nomor+'</td>')
tr.append('<td>'+x.nama_produk+'</td>')
tr.append('<td>'+formatRupiah(x.harga_produk)+'</td>')
tr.append('<td class="text-center">'+x.jumlah_produk+'</td>')
tr.append('<td>'+formatRupiah(x.total_harga_produk)+'</td>')
tr.append('<td class="text-center">'+x.diskon_persen+'%</td>')
tr.append('<td class="text-center">'+(x.keterangan_produk ?? '-')+'</td>')
$('#view_history_detail').append(tr)
nomor++
})
}
}
})
$('#modal_detail_history').modal('show')
}
</script>
{{-- <script>
$(document).ready( function () {
$('#btn_filter').on('click', function(){
let filter_tanggal_1 = $("#filter_tanggal_1").val()
let filter_tanggal_2 = $("#filter_tanggal_2").val()
// proses ajax
})
})
</script> --}}
<script>
function formatRupiah(angka) {
var bilangan = parseInt(angka);
// Cek apakah bilangan negatif atau positif
var minus = "";
if (bilangan < 0) {
minus = "-";
bilangan = Math.abs(bilangan);
}
// Konversi angka menjadi format ribuan dengan menambahkan titik
var reverse = bilangan.toString().split("").reverse().join("");
var ribuan = reverse.match(/\d{1,3}/g);
var hasil = ribuan.join(".").split("").reverse().join("");
// Gabungkan hasil dengan simbol rupiah
var rupiah = "Rp " + minus + hasil;
return rupiah;
}
</script>
@endpush

View File

@ -0,0 +1,30 @@
<div class="modal fade" id="modal_detail_history" aria-labelledby="exampleModalLabel" >
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Detail History</h5>
<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="table-responsive mt-3">
<table id="tabelku" class="table table-hover display" style="width: 100%; font-size: 14px;">
<thead>
<tr>
<th class="text-center">No</th>
<th>Nama Produk</th>
<th>Harga</th>
<th class="text-center">Jumlah Terjual</th>
<th>Total Harga</th>
<th class="text-center">Diskon(%)</th>
<th>Keterangan</th>
</tr>
</thead>
<tbody id="view_history_detail"></tbody>
</table>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,18 @@
@push('styles')
<!-- Toastr -->
<style>
@media only screen and (max-width : 991px) {
/* Styles */
}
@media only screen and (max-width : 768px) {
/* Styles */
}
@media only screen and (max-width : 414px) {
/* Styles */
}
</style>
<link rel="stylesheet" href="{{ asset('assets/plugins/toastr/toastr.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/datatables/datatables.min.css') }}">
@endpush

View File

@ -34,6 +34,7 @@ Route::group(['prefix' => 'history'], function () {
Route::get('/', [History::class, 'index'])->name('history.index');
Route::get('/getDataHistory', [History::class, 'getDataHistory'])->name('history.getDataHistory');
Route::get('/print/{id}', [History::class, 'print'])->name('history.print');
Route::post('/getDataDetailHistory', [History::class, 'getDataDetailHistory'])->name('history.getDataDetailHistory');
});
Route::group(['prefix' => 'menu'], function () {