Applied code style

This commit is contained in:
Bernd Bestel 2023-04-01 14:30:31 +02:00
parent d3e2003dee
commit d723c44e63
No known key found for this signature in database
GPG Key ID: 71BD34C0D4891300
6 changed files with 175 additions and 167 deletions

View File

@ -517,11 +517,11 @@ class StockController extends BaseController
public function StockMetricsPurchases(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) public function StockMetricsPurchases(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
{ {
if (isset($request->getQueryParams()['start_date']) AND isset($request->getQueryParams()['end_date'])) if (isset($request->getQueryParams()['start_date']) and isset($request->getQueryParams()['end_date']))
{ {
$start_date = $request->getQueryParams()['start_date']; $startDate = $request->getQueryParams()['start_date'];
$end_date = $request->getQueryParams()['end_date']; $endDate = $request->getQueryParams()['end_date'];
$where = "purchased_date >= '$start_date' AND purchased_date <= '$end_date'"; $where = "purchased_date >= '$startDate' AND purchased_date <= '$endDate'";
} }
else else
{ {
@ -535,14 +535,14 @@ class StockController extends BaseController
$sql = " $sql = "
SELECT product_group_id as id, product_group as name, sum(quantity * price) as total SELECT product_group_id as id, product_group as name, sum(quantity * price) as total
FROM product_purchase_history FROM product_purchase_history
where $where WHERE $where
GROUP BY product_group GROUP BY product_group
ORDER BY product_group ORDER BY product_group
"; ";
} }
else else
{ {
if (isset($request->getQueryParams()['product_group']) AND $request->getQueryParams()['product_group'] != 'all') if (isset($request->getQueryParams()['product_group']) and $request->getQueryParams()['product_group'] != 'all')
{ {
$where = $where . ' AND product_group_id = ' . $request->getQueryParams()['product_group']; $where = $where . ' AND product_group_id = ' . $request->getQueryParams()['product_group'];
} }
@ -559,7 +559,7 @@ class StockController extends BaseController
return $this->renderPage($response, 'stockmetricspurchases', [ return $this->renderPage($response, 'stockmetricspurchases', [
'metrics' => $this->getDatabaseService()->ExecuteDbQuery($sql)->fetchAll(\PDO::FETCH_OBJ), 'metrics' => $this->getDatabaseService()->ExecuteDbQuery($sql)->fetchAll(\PDO::FETCH_OBJ),
'productGroups' => $this->getDatabase()->product_groups()->orderBy('name', 'COLLATE NOCASE'), 'productGroups' => $this->getDatabase()->product_groups()->orderBy('name', 'COLLATE NOCASE'),
'selectedGroup' => isset($request->getQueryParams()['product_group']) ? $request->getQueryParams()['product_group'] : null, 'selectedGroup' => isset($request->getQueryParams()['product_group']) ? $request->getQueryParams()['product_group'] : null,
'byGroup' => isset($request->getQueryParams()['byGroup']) ? $request->getQueryParams()['byGroup'] : null 'byGroup' => isset($request->getQueryParams()['byGroup']) ? $request->getQueryParams()['byGroup'] : null
]); ]);
} }

View File

@ -2,23 +2,19 @@ CREATE VIEW product_purchase_history
AS AS
SELECT SELECT
1 AS id, -- Dummy, LessQL needs an id column 1 AS id, -- Dummy, LessQL needs an id column
p.id as product_id, p.id AS product_id,
p.name as product_name, p.name AS product_name,
g.id as product_group_id, g.id AS product_group_id,
g.name as product_group, g.name AS product_group,
s.amount as quantity, s.amount AS quantity,
s.price as price, s.price AS price,
s.purchased_date as purchased_date s.purchased_date AS purchased_date
FROM FROM product_groups g
product_groups as g JOIN products p
INNER JOIN products as p
ON p.product_group_id = g.id ON p.product_group_id = g.id
INNER JOIN stock_log as s JOIN stock_log s
ON s.product_id = p.id ON s.product_id = p.id
WHERE WHERE s.transaction_type = 'purchase'
s.transaction_type = 'purchase' AND s.undone = 0
AND AND s.price IS NOT NULL
s.undone = 0 ORDER BY p.name ASC;
AND
s.price is not null
ORDER BY p.name ASC

View File

@ -1,39 +1,40 @@
/*
* Metrics Javascript
*/
/* Charting */ /* Charting */
var labels = []; var labels = [];
var data = []; var data = [];
var totalAmount = 0; var totalAmount = 0;
$("#metrics-table tbody tr").each(function () { $("#metrics-table tbody tr").each(function()
{
var self = $(this); var self = $(this);
labels.push(self.find("td:eq(0)").attr('data-chart-label')); labels.push(self.find("td:eq(0)").attr("data-chart-label"));
var itemTotalRaw = parseFloat(self.find("td:eq(1)").attr('data-chart-value')); var itemTotalRaw = Number.parseFloat(self.find("td:eq(1)").attr("data-chart-value"));
var itemTotal = parseFloat((Math.round(itemTotalRaw * 100) / 100).toFixed(2)); var itemTotal = Number.parseFloat((Math.round(itemTotalRaw * 100) / 100).toFixed(2));
data.push(itemTotal); data.push(itemTotal);
totalAmount = (parseFloat(totalAmount) + parseFloat(itemTotal)); totalAmount = (Number.parseFloat(totalAmount) + Number.parseFloat(itemTotal));
}); });
totalAmount = totalAmount.toLocaleString(undefined, { style: "currency", currency: Grocy.Currency }); totalAmount = totalAmount.toLocaleString(undefined, { style: "currency", currency: Grocy.Currency });
var backgroundColorChoices=['#6C747C', var backgroundColorChoices = [
'#BFB8A4', "#6C747C",
'#BFADA4', "#BFB8A4",
'#4F575E', "#BFADA4",
'#918B78', "#4F575E",
'#343A40', "#918B78",
'#635E4F', "#343A40",
'#63554F', "#635E4F",
'#1A1F24', "#63554F",
'#383426', "#1A1F24",
'#382C26', "#383426",
'#121B25', "#382C26",
'#383119', "#121B25",
'#382319'] "#383119",
var backgroundColors=[]; "#382319"
]
var backgroundColors = [];
var colorChoiceIndex = 0; var colorChoiceIndex = 0;
for(let i=0;i<data.length;i++){ for (i = 0; i < data.length; i++)
if ((i + 1) == (backgroundColorChoices.length)){ {
if ((i + 1) == (backgroundColorChoices.length))
{
// restart background color choices // restart background color choices
colorChoiceIndex = 1; colorChoiceIndex = 1;
} }
@ -41,105 +42,110 @@ for(let i=0;i<data.length;i++){
colorChoiceIndex++; colorChoiceIndex++;
} }
var metricsChart = new Chart('metrics-chart', { var metricsChart = new Chart("metrics-chart", {
type: 'outlabeledDoughnut', "type": "outlabeledDoughnut",
options: { "options": {
legend: { "legend": {
display: false "display": false
}, },
tooltips: { "tooltips": {
enabled: false "enabled": false
}, },
tooltips: {enabled: false}, "tooltips": { enabled: false },
plugins: { "plugins": {
outlabels: { "outlabels": {
text: '%l %p', "text": "%l %p",
backgroundColor: "#343a40", "backgroundColor": "#343a40",
color: 'white', "color": "white",
stretch: 45, "stretch": 45,
font: { "font": {
resizable: true, "resizable": true,
minSize: 12, "minSize": 12,
maxSize: 18 "maxSize": 18
} }
}, },
doughnutlabel: { "doughnutlabel": {
labels: [ "labels": [
{ {
text: totalAmount, "text": totalAmount,
font: { "font": {
size: 24, "size": 24,
weight: 'bold', "weight": "bold"
}, },
}, },
{ {
text: __t("Total"), "text": __t("Total")
} }
] ]
} }
} }
}, },
data: { "data": {
labels: labels, "labels": labels,
datasets: [{ "datasets": [{
data: data, "data": data,
backgroundColor: backgroundColors "backgroundColor": backgroundColors
}] }]
} }
}); });
/* DataTables */ /* DataTables */
var metricsTable = $('#metrics-table').DataTable({ var metricsTable = $("#metrics-table").DataTable({
"columnDefs": [ "columnDefs": [
{ "type": "num", "targets": 1 } { "type": "num", "targets": 1 }
] ].concat($.fn.dataTable.defaults.columnDefs)
}); });
$('#metrics-table tbody').removeClass("d-none"); $("#metrics-table tbody").removeClass("d-none");
metricsTable.columns.adjust().draw(); metricsTable.columns.adjust().draw();
/* DateRangePicker */ /* DateRangePicker */
const urlParams = new URLSearchParams(window.location.search); var startDate = moment().startOf("month").format("YYYY-MM-DD");
var endDate = moment().endOf("month").format("YYYY-MM-DD");
var start_date = moment().startOf("month").format('YYYY-MM-DD'); if (GetUriParam("start_date"))
var end_date = moment().endOf("month").format('YYYY-MM-DD'); {
startDate = moment(GetUriParam("start_date"));
}
if (GetUriParam("end_date"))
{
endDate = moment(GetUriParam("end_date"));
}
if (urlParams.get('start_date')) start_date = moment(urlParams.get('start_date')) ; var ranges = {};
if (urlParams.get('end_date')) end_date = moment(urlParams.get('end_date')); ranges[__t("Today")] = [moment(), moment()];
ranges[__t("Yesterday")] = [moment().subtract(1, "days"), moment().subtract(1, "days")];
ranges[__t("Last 7 Days")] = [moment().subtract(6, "days"), moment()];
ranges[__t("Last 14 Days")] = [moment().subtract(13, "days"), moment()];
ranges[__t("Last 30 Days")] = [moment().subtract(29, "days"), moment()];
ranges[__t("This Month")] = [moment().startOf("month"), moment().endOf("month")];
ranges[__t("Last Month")] = [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")];
ranges[__t("This Year")] = [moment().startOf("year"), moment().endOf("year")];
ranges[__t("Last Year")] = [moment().subtract(1, "year").startOf("year"), moment().subtract(1, "year").endOf("year")];
var _ranges = {} $("#daterange-filter").daterangepicker({
_ranges[__t("Today")] = [moment(), moment()] "showDropdowns": true,
_ranges[__t("Yesterday")] = [moment().subtract(1, 'days'), moment().subtract(1, 'days')] "startDate": startDate,
_ranges[__t("Last 7 Days")] = [moment().subtract(6, 'days'), moment()], "endDate": endDate,
_ranges[__t("Last 14 Days")] = [moment().subtract(13, 'days'), moment()], "showWeekNumbers": Grocy.CalendarShowWeekNumbers,
_ranges[__t("Last 30 Days")] = [moment().subtract(29, 'days'), moment()], "locale": {
_ranges[__t("This Month")] = [moment().startOf('month'), moment().endOf('month')], "format": "YYYY-MM-DD",
_ranges[__t("Last Month")] = [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
_ranges[__t("This Year")] = [moment().startOf('year'), moment().endOf('year')],
_ranges[__t("Last Year")] = [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year').endOf('year')]
$('#daterange-filter').daterangepicker({
showDropdowns: true,
startDate: start_date,
endDate: end_date,
showWeekNumbers: Grocy.CalendarShowWeekNumbers,
locale: {
"format": 'YYYY-MM-DD',
"firstDay": Grocy.CalendarFirstDayOfWeek "firstDay": Grocy.CalendarFirstDayOfWeek
}, },
applyLabel: __t("Apply"), "applyLabel": __t("Apply"),
cancelLabel: __t("Cancel"), "cancelLabel": __t("Cancel"),
customRangeLabel: __t("Custom Range"), "customRangeLabel": __t("Custom Range"),
ranges: _ranges "ranges": ranges
}, function(start, end, label) { }, function(start, end, label)
UpdateUriParam("start_date", start.format('YYYY-MM-DD')); {
UpdateUriParam("end_date", end.format('YYYY-MM-DD')) UpdateUriParam("start_date", start.format("YYYY-MM-DD"));
UpdateUriParam("end_date", end.format("YYYY-MM-DD"))
window.location.reload(); window.location.reload();
}); });
$('#daterange-filter').on('cancel.daterangepicker', function(ev, picker) $("#daterange-filter").on("cancel.daterangepicker", function(ev, picker)
{ {
$(this).val(start_date + ' - ' + end_date); $(this).val(start_date + " - " + end_date);
}); });
$("#clear-filter-button").on("click", function() $("#clear-filter-button").on("click", function()

View File

@ -72,7 +72,7 @@
<link href="{{ $U('/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/bootstrap-select/dist/css/bootstrap-select.min.css?v=', true) }}{{ $version }}"
rel="stylesheet"> rel="stylesheet">
<link href="{{ $U('/node_modules/daterangepicker/daterangepicker.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/daterangepicker/daterangepicker.css?v=', true) }}{{ $version }}"
rel="stylesheet"> rel="stylesheet">
<link href="{{ $U('/node_modules/@fontsource/noto-sans/latin.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/@fontsource/noto-sans/latin.css?v=', true) }}{{ $version }}"
rel="stylesheet"> rel="stylesheet">
<link href="{{ $U('/css/grocy.css?v=', true) }}{{ $version }}" <link href="{{ $U('/css/grocy.css?v=', true) }}{{ $version }}"

View File

@ -4,12 +4,12 @@
@section('activeNav', 'stockmetricspurchases') @section('activeNav', 'stockmetricspurchases')
@once @once
@push('componentScripts') @push('componentScripts')
<script src="{{ $U('/node_modules/chart.js/dist/Chart.min.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/chart.js/dist/Chart.min.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-doughnutlabel/dist/chartjs-plugin-doughnutlabel.js?v=', true) }}{{ $version }}"></script> <script src="{{ $U('/node_modules/chartjs-plugin-doughnutlabel/dist/chartjs-plugin-doughnutlabel.js?v=', true) }}{{ $version }}"></script>
<script src="{{ $U('/node_modules/chartjs-plugin-piechart-outlabels/dist/chartjs-plugin-piechart-outlabels.js?v=', true) }}{{ $version}}"></script> <script src="{{ $U('/node_modules/chartjs-plugin-piechart-outlabels/dist/chartjs-plugin-piechart-outlabels.js?v=', true) }}{{ $version}}"></script>
<script src="{{ $U('/viewjs/metrics.js', true) }}?v={{ $version }}"></script> <script src="{{ $U('/viewjs/metrics.js', true) }}?v={{ $version }}"></script>
@endpush @endpush
@endonce @endonce
@section('content') @section('content')
@ -20,26 +20,26 @@
@yield('title') @yield('title')
</h2> </h2>
<h2 class="mb-0 mr-auto order-3 order-md-1 width-xs-sm-100"> <h2 class="mb-0 mr-auto order-3 order-md-1 width-xs-sm-100">
<span id="info-current-stock" <span id="info-current-stock"
class="text-muted small"></span> class="text-muted small"></span>
</h2> </h2>
<button class="btn btn-outline-dark d-md-none mt-2 float-right order-1 order-md-3" <button class="btn btn-outline-dark d-md-none mt-2 float-right order-1 order-md-3"
type="button" type="button"
data-toggle="collapse" data-toggle="collapse"
data-target="#related-links"> data-target="#related-links">
<i class="fa-solid fa-ellipsis-v"></i> <i class="fa-solid fa-ellipsis-v"></i>
</button> </button>
<div class="related-links collapse d-md-flex order-2 width-xs-sm-100" <div class="related-links collapse d-md-flex order-2 width-xs-sm-100"
id="related-links"> id="related-links">
<a class="btn btn-outline-dark responsive-button @if(!$byGroup) active @endif m-1 mt-md-0 mb-md-0 float-right" <a class="btn btn-outline-dark responsive-button @if(!$byGroup) active @endif m-1 mt-md-0 mb-md-0 float-right"
href="{{ $U('/stockmetricspurchases') }}"> href="{{ $U('/stockmetricspurchases') }}">
{{ $__t('by Product') }} {{ $__t('by Product') }}
</a> </a>
</div> </div>
<div class="related-links collapse d-md-flex order-2 width-xs-sm-100" <div class="related-links collapse d-md-flex order-2 width-xs-sm-100"
id="related-links"> id="related-links">
<a class="btn btn-outline-dark responsive-button @if($byGroup) active @endif m-1 mt-md-0 mb-md-0 float-right" <a class="btn btn-outline-dark responsive-button @if($byGroup) active @endif m-1 mt-md-0 mb-md-0 float-right"
href="{{ $U('/stockmetricspurchases?byGroup=true') }}"> href="{{ $U('/stockmetricspurchases?byGroup=true') }}">
{{ $__t('by Group') }} {{ $__t('by Group') }}
</a> </a>
</div> </div>
@ -50,40 +50,44 @@
<hr class="my-2"> <hr class="my-2">
<div class="row collapse d-md-flex" <div class="row collapse d-md-flex"
id="table-filter-row"> id="table-filter-row">
<div class="col-sm-12 col-md-6 col-xl-4"> <div class="col-sm-12 col-md-6 col-xl-4">
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa-solid fa-clock"></i>&nbsp;{{ $__t('Date range') }}</span> <span class="input-group-text"><i class="fa-solid fa-clock"></i>&nbsp;{{ $__t('Date range') }}</span>
<input type="text" name="date-filter" id="daterange-filter" class="custom-control custom-select" value="" /> <input type="text"
name="date-filter"
id="daterange-filter"
class="custom-control custom-select"
value="" />
</div> </div>
</div> </div>
</div> </div>
@if(!$byGroup) @if(!$byGroup)
<div class="col-sm-12 col-md-6 col-xl-4"> <div class="col-sm-12 col-md-6 col-xl-4">
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text"><i class="fa-solid fa-filter"></i>&nbsp;{{ $__t('Product group') }}</span> <span class="input-group-text"><i class="fa-solid fa-filter"></i>&nbsp;{{ $__t('Product group') }}</span>
</div>
<select class="custom-control custom-select"
id="product-group-filter">
<option value="all">{{ $__t('All') }}</option>
@foreach($productGroups as $productGroup)
<option @if($selectedGroup == $productGroup->id)
selected="selected"
@endif
value="{{ $productGroup->id }}">{{ $productGroup->name }}</option>
@endforeach
</select>
</div> </div>
<select class="custom-control custom-select"
id="product-group-filter">
<option value="all">{{ $__t('All') }}</option>
@foreach($productGroups as $productGroup)
<option @if($selectedGroup==$productGroup->id)
selected="selected"
@endif
value="{{ $productGroup->id }}">{{ $productGroup->name }}</option>
@endforeach
</select>
</div> </div>
</div>
@endif @endif
<div class="col"> <div class="col">
<div class="float-right mt-1"> <div class="float-right mt-1">
<button id="clear-filter-button" <button id="clear-filter-button"
class="btn btn-sm btn-outline-info" class="btn btn-sm btn-outline-info"
data-toggle="tooltip" data-toggle="tooltip"
title="{{ $__t('Clear filter') }}"> title="{{ $__t('Clear filter') }}">
<i class="fa-solid fa-filter-circle-xmark"></i> <i class="fa-solid fa-filter-circle-xmark"></i>
</button> </button>
</div> </div>
@ -91,37 +95,39 @@
</div> </div>
<div class="row mt-2"> <div class="row mt-2">
<div id="chart-wrapper" class="col-sm-12 col-md-12 col-xl-12"> <div id="chart-wrapper"
class="col-sm-12 col-md-12 col-xl-12">
<canvas id="metrics-chart"></canvas> <canvas id="metrics-chart"></canvas>
</div> </div>
<div class="col-sm-12 col-md-12 col-xl-12"> <div class="col-sm-12 col-md-12 col-xl-12">
<table id="metrics-table" <table id="metrics-table"
class="table table-sm table-striped nowrap w-100"> class="table table-sm table-striped nowrap w-100">
<thead> <thead>
<tr> <tr>
<th>{{ $__t('Name') }}</th> <th>{{ $__t('Name') }}</th>
<th>{{ $__t('Total') }}</th> <th>{{ $__t('Total') }}</th>
@if(!$byGroup) @if(!$byGroup)
<th>{{ $__t('Product group') }}</th> <th>{{ $__t('Product group') }}</th>
@endif @endif
</tr> </tr>
</thead> </thead>
<tbody class="d-none"> <tbody class="d-none">
@foreach($metrics as $metric) @foreach($metrics as $metric)
<tr> <tr>
<td data-chart-label="{{ $metric->name }}"> <td data-chart-label="{{ $metric->name }}">
{{ $metric->name }} {{ $metric->name }}
</td> </td>
<td data-chart-value="{{ $metric->total }}" data-order="{{ $metric->total }}"> <td data-chart-value="{{ $metric->total }}"
data-order="{{ $metric->total }}">
<span class="locale-number locale-number-currency">{{ $metric->total }}</span> <span class="locale-number locale-number-currency">{{ $metric->total }}</span>
</td> </td>
@if(!$byGroup) @if(!$byGroup)
<td> <td>
{{ $metric->group_name }} {{ $metric->group_name }}
</td> </td>
@endif @endif
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -41,7 +41,7 @@
{{ $__t('Stock entries') }} {{ $__t('Stock entries') }}
</a> </a>
<a class="btn btn-outline-dark responsive-button m-1 mt-md-0 mb-md-0 float-right" <a class="btn btn-outline-dark responsive-button m-1 mt-md-0 mb-md-0 float-right"
href="{{ $U('/stockmetricspurchases') }}"> href="{{ $U('/stockmetricspurchases') }}">
{{ $__t('Metrics') }} {{ $__t('Metrics') }}
</a> </a>
@if(GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) @if(GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING)