Added: mileage, average fuel consumption
All checks were successful
Build and Deploy Zola Website / build_and_deploy (push) Successful in 12s

This commit is contained in:
Filip Rojek 2025-01-27 01:57:31 +01:00
parent 64c7fd15a1
commit ba11c41147
7 changed files with 60 additions and 13 deletions

View File

@ -10,21 +10,17 @@ class DashboardController extends Controller {
$data = [ $data = [
"date" => [], "date" => [],
"price" => [], "price" => [],
"mileage" => [],
"liters" => []
]; ];
$raw_data = $refuel->latest_data($default_car['id'], 5); $raw_data = $refuel->latest_data($default_car['id'], 5);
foreach($raw_data as $one) { foreach($raw_data as $one) {
array_push($data['date'], date('d. m.', strtotime($one['created_at']))); array_push($data['date'], date('d. m.', strtotime($one['created_at'])));
array_push($data['price'], $one['price_per_liter']); array_push($data['price'], $one['price_per_liter']);
array_push($data['mileage'], $one['mileage']);
array_push($data['liters'], $one['liters']);
} }
$latest_record = [
'name',
'liters',
'price_per_liter',
'total_price',
'created_at'
];
$latest_record = $refuel->latest_one($_SESSION['user']['id'])[0]; $latest_record = $refuel->latest_one($_SESSION['user']['id'])[0];
$this->view('dashboard/index', [ $this->view('dashboard/index', [

View File

@ -18,6 +18,7 @@ class RefuelController extends Controller {
$liters = $_POST['liters'] ?? ''; $liters = $_POST['liters'] ?? '';
$price_per_liter = $_POST['price_per_liter'] ?? ''; $price_per_liter = $_POST['price_per_liter'] ?? '';
$total_price = $_POST['total_price'] ?? ''; $total_price = $_POST['total_price'] ?? '';
$mileage = $_POST['mileage'] ?? '';
$note = $_POST['note'] ?? ''; $note = $_POST['note'] ?? '';
$validator = new Validator(); $validator = new Validator();
@ -29,6 +30,7 @@ class RefuelController extends Controller {
$validator->number('liters', $liters); $validator->number('liters', $liters);
$validator->number('price_per_liter', $price_per_liter); $validator->number('price_per_liter', $price_per_liter);
$validator->number('total_price', $total_price); $validator->number('total_price', $total_price);
$validator->number('mileage', $mileage);
if (round($liters * $price_per_liter, 2) != $total_price) { if (round($liters * $price_per_liter, 2) != $total_price) {
$validator->setErrors(["total_price" => "Price calculation is wrong"]); $validator->setErrors(["total_price" => "Price calculation is wrong"]);
@ -57,6 +59,7 @@ class RefuelController extends Controller {
'liters' => $liters, 'liters' => $liters,
'price_per_liter' => $price_per_liter, 'price_per_liter' => $price_per_liter,
'total_price' => $total_price, 'total_price' => $total_price,
'mileage' => $mileage,
]); ]);
if ($result === true) { if ($result === true) {

View File

@ -10,12 +10,12 @@ class Refuel {
public function create($data) { public function create($data) {
try{ try{
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
INSERT INTO refueling_records (user_id, vehicle_id, fuel_type, note, liters, price_per_liter, total_price, created_at) INSERT INTO refueling_records (user_id, vehicle_id, fuel_type, note, liters, price_per_liter, total_price, mileage, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?, NOW()) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())
"); ");
$stmt->bind_param( $stmt->bind_param(
"iissddd", "iissdddi",
$data['user_id'], $data['user_id'],
$data['vehicle_id'], $data['vehicle_id'],
$data['fuel_type'], $data['fuel_type'],
@ -23,6 +23,7 @@ class Refuel {
$data['liters'], $data['liters'],
$data['price_per_liter'], $data['price_per_liter'],
$data['total_price'], $data['total_price'],
$data['mileage'],
); );
if ($stmt->execute()) { if ($stmt->execute()) {
@ -38,7 +39,7 @@ class Refuel {
public function latest_data($vehicle_id, $record_count) { public function latest_data($vehicle_id, $record_count) {
try { try {
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
SELECT `liters`, `price_per_liter`, `total_price`, `created_at` SELECT `liters`, `price_per_liter`, `total_price`, `mileage`, `created_at`
FROM `refueling_records` FROM `refueling_records`
WHERE `vehicle_id` = ? WHERE `vehicle_id` = ?
ORDER BY created_at DESC ORDER BY created_at DESC
@ -68,6 +69,7 @@ class Refuel {
`r`.`liters`, `r`.`liters`,
`r`.`price_per_liter`, `r`.`price_per_liter`,
`r`.`total_price`, `r`.`total_price`,
`r`.`mileage`,
`r`.`created_at` `r`.`created_at`
FROM `refueling_records` AS `r` FROM `refueling_records` AS `r`
JOIN `vehicles` AS `v` ON `r`.`vehicle_id` = `v`.`id` JOIN `vehicles` AS `v` ON `r`.`vehicle_id` = `v`.`id`

View File

@ -23,6 +23,8 @@
<p><?= $data['latest_record']['price_per_liter'] ?>,-/liter</p> <p><?= $data['latest_record']['price_per_liter'] ?>,-/liter</p>
<b>Total price:</b> <b>Total price:</b>
<p><?= $data['latest_record']['total_price'] ?>,-</p> <p><?= $data['latest_record']['total_price'] ?>,-</p>
<b>Mileage:</b>
<p><?= $data['latest_record']['mileage'] ?> km</p>
</div> </div>
</section> </section>
@ -45,6 +47,13 @@
<p><?= $data['default_car']['name'] . " | " . $data['default_car']['registration_plate']?></p> <p><?= $data['default_car']['name'] . " | " . $data['default_car']['registration_plate']?></p>
<canvas id="chart-gas-price"></canvas> <canvas id="chart-gas-price"></canvas>
</section> </section>
<section class="card history-graph">
<h2>Average fuel consumption</h2>
<hr>
<p><?= $data['default_car']['name'] . " | " . $data['default_car']['registration_plate']?></p>
<b id="avg-fl-cnsmp"></b>
</section>
</div> </div>
</section> </section>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
@ -64,4 +73,28 @@
}, },
}); });
</script> </script>
<script>
const data2 = <?= json_encode($data['date_price_data']); ?>;
let cnt_ltr = 0
let cnt_km = 0
let first_km = 0
console.log(data2)
for(let i = 0; i < data2['liters'].length; i++) {
if(i == 0) {
first_km = data2['mileage'][i]
}
cnt_ltr += data2['liters'][i]
cnt_km =+ data2['mileage'][i]
}
console.log("Liters", cnt_ltr, cnt_km, first_km)
console.log("Avg", (cnt_km - first_km) / cnt_ltr)
document.querySelector("#avg-fl-cnsmp").textContent = Math.floor((cnt_km - first_km) / cnt_ltr) + " l/100km"
</script>
<script defer src="/js/offline-records.js"></script> <script defer src="/js/offline-records.js"></script>

View File

@ -52,6 +52,12 @@
<small class="error"><?= $this->get('validationErrors')['total_price'] ?></small> <small class="error"><?= $this->get('validationErrors')['total_price'] ?></small>
<?php endif; ?> <?php endif; ?>
<label for="mileage">Mileage</label>
<input type="number" name="mileage" id="mileage" min="0" step="1" value="<?= htmlspecialchars($_POST['mileage'] ?? '0') ?>">
<?php if (isset($this->get('validationErrors')['mileage'])): ?>
<small class="error"><?= $this->get('validationErrors')['mileage'] ?></small>
<?php endif; ?>
<label for="note">Note</label> <label for="note">Note</label>
<input type="text" name="note" id="note" value="<?= htmlspecialchars($_POST['note'] ?? '') ?>"> <input type="text" name="note" id="note" value="<?= htmlspecialchars($_POST['note'] ?? '') ?>">
<?php if (isset($this->get('validationErrors')['note'])): ?> <?php if (isset($this->get('validationErrors')['note'])): ?>

View File

@ -63,7 +63,6 @@ class Database {
username VARCHAR(50) NOT NULL, username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL,
points INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;"; ) ENGINE=InnoDB;";
@ -99,6 +98,7 @@ class Database {
liters DOUBLE(10, 2) NOT NULL, liters DOUBLE(10, 2) NOT NULL,
price_per_liter DOUBLE(10, 2) NOT NULL, price_per_liter DOUBLE(10, 2) NOT NULL,
total_price DOUBLE(10, 2) NOT NULL, total_price DOUBLE(10, 2) NOT NULL,
mileage INT UNSIGNED NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (vehicle_id) REFERENCES vehicles(id) ON DELETE CASCADE, FOREIGN KEY (vehicle_id) REFERENCES vehicles(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE

View File

@ -204,6 +204,12 @@ btnOffline.addEventListener("click", async (e) => {
<!-- <small class="error"><?= $this->get('validationErrors')['total_price'] ?></small> --> <!-- <small class="error"><?= $this->get('validationErrors')['total_price'] ?></small> -->
<!-- <?php endif; ?> --> <!-- <?php endif; ?> -->
<label for="mileage">Mileage</label>
<input type="number" name="mileage" id="mileage" min="0" step="1" value="0">
<!-- <?php if (isset($this->get('validationErrors')['mileage'])): ?> -->
<!-- <small class="error"><?= $this->get('validationErrors')['mileage'] ?></small> -->
<!-- <?php endif; ?> -->
<label for="note">Note</label> <label for="note">Note</label>
<input type="text" name="note" id="note"> <input type="text" name="note" id="note">
<!-- <?php if (isset($this->get('validationErrors')['note'])): ?> --> <!-- <?php if (isset($this->get('validationErrors')['note'])): ?> -->
@ -229,6 +235,7 @@ btnOffline.addEventListener("click", async (e) => {
total_price: document.querySelector( total_price: document.querySelector(
"form#offline_refuel_add #total_price", "form#offline_refuel_add #total_price",
).value, ).value,
mileage: document.querySelector("form#offline_refuel_add #mileage").value,
note: document.querySelector("form#offline_refuel_add #note").value, note: document.querySelector("form#offline_refuel_add #note").value,
}; };