You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

487 lines
27 KiB

@extends('layouts.admin.app')
@section('title', translate('messages.food_report'))
@push('css_or_js')
@endpush
@section('content')
<div class="content container-fluid">
<!-- Page Header -->
<div class="page-header">
<h1 class="page-header-title">
<i class="tio-filter-list"></i>
<span>
{{ translate('messages.food_report') }}
@if ($from && $to)
<span class="h6 mb-0 badge badge-soft-success ml-2">
( {{ $from }} - {{ $to }} )</span>
@endif
</span>
</h1>
</div>
<!-- End Page Header -->
<div class="card mb-20">
<div class="card-body">
<h4 class="">{{ translate('Search Data') }}</h4>
<form method="get">
<div class="row g-3">
<div class="col-sm-6 col-md-3">
<select name="zone_id" class="form-control js-select2-custom"
onchange="set_zone_filter('{{ url()->full() }}',this.value)" id="zone">
<option value="all">{{ translate('messages.All Zones') }}</option>
@foreach (\App\Models\Zone::orderBy('name')->get() as $z)
<option value="{{ $z['id'] }}"
{{ isset($zone) && $zone->id == $z['id'] ? 'selected' : '' }}>
{{ $z['name'] }}
</option>
@endforeach
</select>
</div>
<div class="col-sm-6 col-md-3">
<select name="restaurant_id" onchange="set_restaurant_filter('{{ url()->full() }}',this.value)"
data-placeholder="{{ translate('messages.select') }} {{ translate('messages.restaurant') }}"
class="js-data-example-ajax form-control">
@if (isset($restaurant))
<option value="{{ $restaurant->id }}" selected>{{ $restaurant->name }}</option>
@else
<option value="all" selected>{{ translate('messages.all') }}
{{ translate('messages.restaurants') }}</option>
@endif
</select>
</div>
<div class="col-sm-6 col-md-3">
<select name="category_id" id="category_id"
onchange="set_category_filter('{{ url()->full() }}',this.value)"
class="js-select2-custom form-control" id="category_id">
<option value="all">{{ translate('messages.All Categories') }}</option>
@foreach ($categories as $category)
<option value="{{ $category['id'] }}"
{{ isset($category_id) && $category_id == $category['id'] ? 'selected' : '' }}>
{{ $category['name'] }}
</option>
@endforeach
</select>
</div>
<div class="col-sm-6 col-md-3">
@php($type= request()->type)
<!-- Veg/NonVeg filter -->
<select name="type"
onchange="set_filter('{{url()->full()}}',this.value, 'type')"
data-placeholder="{{translate('messages.select_type')}}" class="form-control js-select2-custom">
<option value="all" {{$type=='all'?'selected':''}}>{{translate('messages.all_types')}}</option>
@if ($toggle_veg_non_veg)
<option value="veg" {{$type=='veg'?'selected':''}}>{{translate('messages.veg')}}</option>
<option value="non_veg" {{$type=='non_veg'?'selected':''}}>{{translate('messages.non_veg')}}</option>
@endif
</select>
</div>
<div class="col-sm-6 col-md-3">
<select class="form-control" name="filter"
onchange="set_time_filter('{{ url()->full() }}',this.value)">
<option value="all_time" {{ isset($filter) && $filter == 'all_time' ? 'selected' : '' }}>
{{ translate('messages.All Time') }}</option>
<option value="this_year" {{ isset($filter) && $filter == 'this_year' ? 'selected' : '' }}>
{{ translate('messages.This Year') }}</option>
<option value="previous_year"
{{ isset($filter) && $filter == 'previous_year' ? 'selected' : '' }}>
{{ translate('messages.Previous Year') }}</option>
<option value="this_month"
{{ isset($filter) && $filter == 'this_month' ? 'selected' : '' }}>
{{ translate('messages.This Month') }}</option>
<option value="this_week" {{ isset($filter) && $filter == 'this_week' ? 'selected' : '' }}>
{{ translate('messages.This Week') }}</option>
<option value="custom" {{ isset($filter) && $filter == 'custom' ? 'selected' : '' }}>
{{ translate('messages.Custom') }}</option>
</select>
</div>
@if (isset($filter) && $filter == 'custom')
<div class="col-sm-6 col-md-3">
<input type="date" name="from" id="from_date" class="form-control"
placeholder="{{ translate('Start Date') }}" value={{ $from ? $from : '' }} required>
</div>
<div class="col-sm-6 col-md-3">
<input type="date" name="to" id="to_date" class="form-control"
placeholder="{{ translate('End Date') }}" value={{ $to ? $to : '' }} required>
</div>
@endif
<div class="col-sm-6 col-md-3 ml-auto">
<button type="submit"
class="btn btn-primary btn-block">{{ translate('Filter') }}</button>
</div>
</div>
</form>
</div>
</div>
<!-- End Stats -->
<div class="row gx-2 gx-lg-3">
{{-- <div class="col-lg-12 mb-3 mb-lg-12">
<!-- Card -->
<div class="card h-100">
<div class="card-header flex-wrap justify-content-evenly justify-content-lg-between border-0">
<h4 class="card-title my-2 my-md-0">
<i class="tio-chart-bar-4"></i>
{{ translate('messages.Sales_Statistics') }}
</h4>
<div class="d-flex flex-wrap my-2 my-md-0 justify-content-center align-items-center">
@php($amount = array_sum($total_food_sells))
<span class="h5 m-0 fz--11 d-flex align-items-center mb-2 mb-md-0">
{{ translate('messages.Average_Sales_Value') }} :
{{ \App\CentralLogics\Helpers::format_currency(array_sum($avg_food_sells)) }}
</span>
</div>
</div>
<!-- Body -->
<div class="card-body">
<!-- Bar Chart -->
<div class="d-flex align-items-center">
<div class="chart--extension">
{{ \App\CentralLogics\Helpers::currency_symbol() }}({{ translate('messages.currency') }})
</div>
<div class="chartjs-custom w-75 flex-grow-1">
<canvas id="updatingData" class="h-20rem"
data-hs-chartjs-options='{
"type": "bar",
"data": {
"labels": ["Jan","Feb","Mar","April","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
"datasets": [{
"data": [{{ $total_food_sells[1] }},{{ $total_food_sells[2] }},{{ $total_food_sells[3] }},{{ $total_food_sells[4] }},{{ $total_food_sells[5] }},{{ $total_food_sells[6] }},{{ $total_food_sells[7] }},{{ $total_food_sells[8] }},{{ $total_food_sells[9] }},{{ $total_food_sells[10] }},{{ $total_food_sells[11] }},{{ $total_food_sells[12] }}],
"backgroundColor": "#7ECAFF",
"hoverBackgroundColor": "#7ECAFF",
"borderColor": "#7ECAFF"
}]
},
"options": {
"scales": {
"yAxes": [{
"gridLines": {
"color": "#e7eaf3",
"drawBorder": false,
"zeroLineColor": "#e7eaf3"
},
"ticks": {
"beginAtZero": true,
"stepSize": {{ ceil($amount / 10000) * 2000 }},
"fontSize": 12,
"fontColor": "#97a4af",
"fontFamily": "Open Sans, sans-serif",
"padding": 10
}
}],
"xAxes": [{
"gridLines": {
"display": false,
"drawBorder": false
},
"ticks": {
"fontSize": 12,
"fontColor": "#97a4af",
"fontFamily": "Open Sans, sans-serif",
"padding": 5
},
"categoryPercentage": 0.3,
"maxBarThickness": "10"
}]
},
"cornerRadius": 5,
"tooltips": {
"prefix": " ",
"hasIndicator": true,
"mode": "index",
"intersect": false
},
"hover": {
"mode": "nearest",
"intersect": true
}
}
}'></canvas>
</div>
</div>
<!-- End Bar Chart -->
</div>
<!-- End Body -->
</div>
<!-- End Card -->
</div> --}}
<!-- Card -->
<div class="col-12">
<div class="card h-100">
<!-- Header -->
<div class="card-header border-0 py-2">
<div class="search--button-wrapper">
<h3 class="card-title">
{{ translate('food report table') }}<span class="badge badge-soft-secondary"
id="countfoods">{{ $foods->total() }}</span>
</h3>
<form class="search-form">
<!-- Search -->
<div class="input--group input-group">
<input id="datatableSearch" name="search" type="search" class="form-control" value="{{ request()->search ?? null }}"
placeholder="{{ translate('Search by food name') }}"
aria-label="{{ translate('messages.search_here') }}">
<button type="submit" class="btn btn--secondary"><i class="tio-search"></i></button>
</div>
<!-- End Search -->
</form> <!-- Unfold -->
<div class="hs-unfold mr-2">
<a class="js-hs-unfold-invoker btn btn-sm btn-white dropdown-toggle min-height-40"
href="javascript:;"
data-hs-unfold-options='{
"target": "#usersExportDropdown",
"type": "css-animation"
}'>
<i class="tio-download-to mr-1"></i> {{ translate('messages.export') }}
</a>
<div id="usersExportDropdown"
class="hs-unfold-content dropdown-unfold dropdown-menu dropdown-menu-sm-right">
<span class="dropdown-header">{{ translate('messages.download') }}
{{ translate('messages.options') }}</span>
<a id="export-excel" class="dropdown-item"
href="{{ route('admin.report.food-wise-report-export', ['type' => 'excel', request()->getQueryString()]) }}">
<img class="avatar avatar-xss avatar-4by3 mr-2"
src="{{ asset('public/assets/admin') }}/svg/components/excel.svg"
alt="Image Description">
{{ translate('messages.excel') }}
</a>
<a id="export-csv" class="dropdown-item"
href="{{ route('admin.report.food-wise-report-export', ['type' => 'csv', request()->getQueryString()]) }}">
<img class="avatar avatar-xss avatar-4by3 mr-2"
src="{{ asset('public/assets/admin') }}/svg/components/placeholder-csv-format.svg"
alt="Image Description">
.{{ translate('messages.csv') }}
</a>
</div>
</div>
<!-- End Unfold -->
</div>
<!-- End Row -->
</div>
<!-- End Header -->
<div class="card-body">
<!-- Table -->
<div class="table-responsive datatable-custom" id="table-div">
<table id="datatable" class="table table-borderless table-thead-bordered table-nowrap card-table"
data-hs-datatables-options='{
"columnDefs": [{
"targets": [],
"width": "5%",
"orderable": false
}],
"order": [],
"info": {
"totalQty": "#datatableWithPaginationInfoTotalQty"
},
"entries": "#datatableEntries",
"isResponsive": false,
"isShowPaging": false,
"paging":false
}'>
<thead class="thead-light">
<tr>
<th>{{ translate('sl') }}</th>
<th class="w--2">{{ translate('messages.name') }}</th>
<th class="w--2">{{ translate('messages.restaurant') }}</th>
<th>{{ translate('messages.order') }} {{ translate('messages.count') }}</th>
<th>{{ translate('messages.price') }}</th>
<th>{{ translate('messages.total_amount_sold') }}</th>
<th>{{ translate('messages.total_discount_given') }}</th>
<th>{{ translate('messages.average_sale_value') }}</th>
<th>{{ translate('messages.average_ratings') }}</th>
</tr>
</thead>
<tbody id="set-rows">
@foreach ($foods as $key => $food)
<tr>
<td>{{ $key + $foods->firstItem() }}</td>
<td>
<a class="media align-foods-center"
href="{{ route('admin.food.view', [$food['id']]) }}">
<img class="avatar avatar-lg mr-3"
src="{{ asset('storage/app/public/product') }}/{{ $food['image'] }}"
onerror="this.src='{{ asset('public/assets/admin/img/160x160/img2.jpg') }}'"
alt="{{ $food->name }} image">
<div class="media-body">
<h5 class="text-hover-primary mb-0">{{ Str::limit($food['name'], 20, '...') }}</h5>
</div>
</a>
</td>
<td>
@if ($food->restaurant)
{{ Str::limit($food->restaurant->name, 25, '...') }}
@else
{{ translate('messages.restaurant') }} {{ translate('messages.deleted') }}
@endif
</td>
<td>
{{ $food->orders_count }}
</td>
<td>
{{ \App\CentralLogics\Helpers::format_currency($food->price) }}
</td>
<td>
{{ \App\CentralLogics\Helpers::format_currency($food->orders_sum_price) }}
</td>
<td>
{{ \App\CentralLogics\Helpers::format_currency($food->orders_sum_discount_on_food) }}
</td>
<td>
{{ $food->orders_count > 0 ? \App\CentralLogics\Helpers::format_currency(($food->orders_sum_price - $food->orders_sum_discount_on_food) / $food->orders_count) : 0 }}
</td>
<td>
<div class="rating">
<span><i class="tio-star"></i></span>{{ round($food->avg_rating, 1) }}
({{ $food->rating_count }})
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
@if (count($foods) !== 0)
<hr>
@endif
<div class="page-area px-4 pb-3">
{!! $foods->links() !!}
</div>
@if (count($foods) === 0)
<div class="empty--data">
<img src="{{ asset('/public/assets/admin/svg/illustrations/sorry.svg') }}" alt="public">
<h5>
{{ translate('no_data_found') }}
</h5>
</div>
@endif
</div>
<!-- End Table -->
</div>
</div>
</div>
</div>
<!-- End Card -->
</div>
@endsection
@push('script')
<script src="{{ asset('public/assets/admin') }}/vendor/chart.js/dist/Chart.min.js"></script>
<script src="{{ asset('public/assets/admin') }}/vendor/chart.js.extensions/chartjs-extensions.js"></script>
<script
src="{{ asset('public/assets/admin') }}/vendor/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.min.js">
</script>
@endpush
@push('script_2')
<script>
// INITIALIZATION OF CHARTJS
// =======================================================
Chart.plugins.unregister(ChartDataLabels);
$('.js-chart').each(function() {
$.HSCore.components.HSChartJS.init($(this));
});
var updatingChart = $.HSCore.components.HSChartJS.init($('#updatingData'));
</script>
<script>
$(document).on('ready', function() {
$('.js-data-example-ajax').select2({
ajax: {
url: '{{ url('/') }}/admin/restaurant/get-restaurants',
data: function(params) {
return {
q: params.term, // search term
// all:true,
@if (isset($zone))
zone_ids: [{{ $zone->id }}],
@endif
page: params.page
};
},
processResults: function(data) {
return {
results: data
};
},
__port: function(params, success, failure) {
var $request = $.ajax(params);
$request.then(success);
$request.fail(failure);
return $request;
}
}
});
// $('#category_id').select2({
// ajax: {
// url: '{{ url('/') }}/admin/food/get-categories?parent_id=0',
// data: function(params) {
// return {
// q: params.term, // search term
// page: params.page
// };
// },
// processResults: function(data) {
// return {
// results: data
// };
// },
// __port: function(params, success, failure) {
// var $request = $.ajax(params);
// $request.then(success);
// $request.fail(failure);
// return $request;
// }
// }
// });
});
</script>
<script>
$('#from_date,#to_date').change(function() {
let fr = $('#from_date').val();
let to = $('#to_date').val();
if (fr != '' && to != '') {
if (fr > to) {
$('#from_date').val('');
$('#to_date').val('');
toastr.error('Invalid date range!', Error, {
CloseButton: true,
ProgressBar: true
});
}
}
})
function getRequest(route, id) {
$.get({
url: route,
dataType: 'json',
success: function(data) {
$('#' + id).empty().append(data.options);
},
});
}
</script>
@endpush