rewrite styles
This commit is contained in:
+131
-16
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user