rewrite styles

This commit is contained in:
Mateusz Gruszczyński
2026-07-14 12:12:46 +02:00
parent de7153e298
commit 1f4d459a64
4 changed files with 214 additions and 21 deletions
+131 -16
View File
@@ -4,7 +4,7 @@ from decimal import Decimal
from functools import wraps
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, abort
from flask_login import login_required, current_user
from sqlalchemy import extract
from sqlalchemy import extract, or_
from sqlalchemy.exc import IntegrityError
from .extensions import db
from .models import User, Vehicle, FuelEntry, CompanySettings, AppSetting, OrlenPrice, FuelCardPolicy, FuelStationCompany, FuelStationPoint, FuelCard, FuelCardStationRule
@@ -212,25 +212,140 @@ def orlen_price():
@login_required
def orlen_data():
settings = CompanySettings.query.first()
selected_year = request.args.get("year", type=int) or date.today().year
selected_fuels = [f.upper() for f in request.args.getlist("fuel") if f.upper() in FUEL_TYPES] or ["PB95"]
today = date.today()
mode = request.args.get("mode", "history")
if mode not in {"history", "compare"}:
mode = "history"
include_vat = request.args.get("gross") == "1"
show_lpg_regions = request.args.get('show_lpg_regions') == '1'
available_years = [
year for (year,) in db.session.query(extract("year", OrlenPrice.effective_date))
.distinct().order_by(extract("year", OrlenPrice.effective_date).desc()).all()
if year is not None
]
available_years = [int(year) for year in available_years]
if today.year not in available_years:
available_years.insert(0, today.year)
selected_year = request.args.get("year", type=int) or today.year
selected_fuels = [f.upper() for f in request.args.getlist("fuel") if f.upper() in FUEL_TYPES] or ["PB95"]
selected_regions = [r.lower() for r in request.args.getlist("region") if r.lower() in POLISH_REGIONS]
if not selected_regions: selected_regions=[settings.region.lower()]
if not show_lpg_regions: selected_regions=[settings.region.lower()]
query = OrlenPrice.query.filter(OrlenPrice.fuel_type.in_(selected_fuels), extract("year", OrlenPrice.effective_date)==selected_year)
rows = query.order_by(OrlenPrice.effective_date, OrlenPrice.fuel_type).all()
if not selected_regions:
selected_regions = [settings.region.lower()]
rows = []
chart = {}
for fuel in selected_fuels:
fuel_rows = [r for r in rows if r.fuel_type == fuel and (fuel != "LPG" or r.region in selected_regions)]
chart_key = fuel if fuel != "LPG" else None
if fuel == "LPG":
for region in selected_regions:
chart[f"LPG · {region}"] = [{"date": r.effective_date.isoformat(), "value": round(float(r.price_per_liter) * (1 + float(effective_vat_rate(settings.vat_rate, r.effective_date)) / 100 if include_vat else 1), 4)} for r in fuel_rows if r.region == region]
comparison_summary = []
comparison_type = request.args.get("comparison_type", "years")
compare_fuel = request.args.get("compare_fuel", "PB95").upper()
if compare_fuel not in FUEL_TYPES:
compare_fuel = "PB95"
compare_region = request.args.get("compare_region", settings.region).lower()
if compare_region not in POLISH_REGIONS:
compare_region = settings.region.lower()
compare_year = request.args.get("compare_year", type=int) or (selected_year - 1)
def priced_value(row):
multiplier = 1 + float(effective_vat_rate(settings.vat_rate, row.effective_date)) / 100 if include_vat else 1
return round(float(row.price_per_liter) * multiplier, 4)
def summary(label, source_rows):
values = [priced_value(row) for row in source_rows]
return {
"label": label,
"count": len(values),
"average": round(sum(values) / len(values), 4) if values else None,
"minimum": min(values) if values else None,
"maximum": max(values) if values else None,
"first": values[0] if values else None,
"last": values[-1] if values else None,
"change": round(values[-1] - values[0], 4) if len(values) > 1 else None,
}
if mode == "compare":
if comparison_type not in {"years", "periods"}:
comparison_type = "years"
base_query = OrlenPrice.query.filter_by(fuel_type=compare_fuel)
if compare_fuel == "LPG":
base_query = base_query.filter_by(region=compare_region)
if comparison_type == "years":
year_a, year_b = selected_year, compare_year
all_rows = base_query.filter(extract("year", OrlenPrice.effective_date).in_([year_a, year_b])).order_by(OrlenPrice.effective_date).all()
for year in (year_a, year_b):
period_rows = [row for row in all_rows if row.effective_date.year == year]
chart[str(year)] = [{"date": row.effective_date.strftime("%m-%d"), "value": priced_value(row)} for row in period_rows]
comparison_summary.append(summary(str(year), period_rows))
rows = all_rows
period_a_from = date(year_a, 1, 1)
period_a_to = date(year_a, 12, 31)
period_b_from = date(year_b, 1, 1)
period_b_to = date(year_b, 12, 31)
else:
chart[fuel] = [{"date": r.effective_date.isoformat(), "value": round(float(r.price_per_liter) * (1 + float(effective_vat_rate(settings.vat_rate, r.effective_date)) / 100 if include_vat else 1), 4)} for r in fuel_rows]
return render_template("orlen.html", rows=rows, chart=chart, selected_fuels=selected_fuels, selected_year=selected_year, settings=settings, fuel_types=FUEL_TYPES, include_vat=include_vat, regions=POLISH_REGIONS, selected_regions=selected_regions, show_lpg_regions=show_lpg_regions)
def parse_date_arg(name, fallback):
try:
return date.fromisoformat(request.args.get(name, ""))
except ValueError:
return fallback
period_a_from = parse_date_arg("period_a_from", today.replace(month=1, day=1))
period_a_to = parse_date_arg("period_a_to", today)
previous_year = today.year - 1
period_b_from = parse_date_arg("period_b_from", date(previous_year, period_a_from.month, min(period_a_from.day, 28)))
period_b_to = parse_date_arg("period_b_to", date(previous_year, period_a_to.month, min(period_a_to.day, 28)))
if period_a_from > period_a_to:
period_a_from, period_a_to = period_a_to, period_a_from
if period_b_from > period_b_to:
period_b_from, period_b_to = period_b_to, period_b_from
ranges = [
("Okres A", period_a_from, period_a_to),
("Okres B", period_b_from, period_b_to),
]
all_rows = base_query.filter(
or_(
OrlenPrice.effective_date.between(period_a_from, period_a_to),
OrlenPrice.effective_date.between(period_b_from, period_b_to),
)
).order_by(OrlenPrice.effective_date).all()
for label, start, end in ranges:
period_rows = [row for row in all_rows if start <= row.effective_date <= end]
chart[label] = [{"date": f"Dzień {(row.effective_date - start).days + 1:03d}", "value": priced_value(row)} for row in period_rows]
comparison_summary.append(summary(f"{label}: {start.isoformat()} {end.isoformat()}", period_rows))
rows = all_rows
else:
query = OrlenPrice.query.filter(OrlenPrice.fuel_type.in_(selected_fuels), extract("year", OrlenPrice.effective_date) == selected_year)
rows = query.order_by(OrlenPrice.effective_date, OrlenPrice.fuel_type).all()
for fuel in selected_fuels:
fuel_rows = [row for row in rows if row.fuel_type == fuel and (fuel != "LPG" or row.region in selected_regions)]
if fuel == "LPG":
for region in selected_regions:
chart[f"LPG · {region}"] = [{"date": row.effective_date.isoformat(), "value": priced_value(row)} for row in fuel_rows if row.region == region]
else:
chart[fuel] = [{"date": row.effective_date.isoformat(), "value": priced_value(row)} for row in fuel_rows]
period_a_from = period_a_to = period_b_from = period_b_to = None
summary_difference = None
if len(comparison_summary) == 2 and comparison_summary[0]["average"] is not None and comparison_summary[1]["average"] is not None:
first_average = comparison_summary[0]["average"]
second_average = comparison_summary[1]["average"]
summary_difference = {
"value": round(first_average - second_average, 4),
"percent": round((first_average - second_average) / second_average * 100, 2) if second_average else None,
}
return render_template(
"orlen.html", rows=rows, chart=chart, mode=mode,
selected_fuels=selected_fuels, selected_year=selected_year,
compare_year=compare_year, compare_fuel=compare_fuel,
comparison_type=comparison_type, comparison_summary=comparison_summary,
summary_difference=summary_difference, compare_region=compare_region,
period_a_from=period_a_from, period_a_to=period_a_to,
period_b_from=period_b_from, period_b_to=period_b_to,
settings=settings, fuel_types=FUEL_TYPES, include_vat=include_vat,
regions=POLISH_REGIONS, selected_regions=selected_regions,
available_years=available_years,
)
@main.post("/orlen/sync")
@login_required