from collections import defaultdict from datetime import date, datetime from decimal import Decimal from flask import current_app, jsonify, request, url_for from flask_login import current_user, login_required, login_user from sqlalchemy import extract from sqlalchemy.exc import IntegrityError from . import api from .common import accessible_vehicles, boolv, fail, payload, response, role_required, station_dict, user_dict, vehicle_dict from .. import THEMES from ..api_tokens import create_access_token from ..extensions import db from ..models import AppSetting, CompanySettings, FuelCard, FuelCardPolicy, FuelCardStationRule, FuelEntry, FuelStationCompany, FuelStationPoint, OrlenPrice, User, Vehicle from ..services import POLISH_REGIONS, aggregate_ure_companies, calculate_costs, fetch_orlen_price, fetch_orlen_range, fetch_ure_stations, invoice_period from ..station_catalog import sync_station_catalog FUEL_TYPES = ("PB95", "PB98", "DIESEL", "LPG") @api.get('/settings') @role_required('boss','admin') def get_settings(): s=CompanySettings.query.first();return response({'name':s.name,'entity_type':s.entity_type,'vat_rate':float(s.vat_rate),'vat_deduction_percent':float(s.vat_deduction_percent),'region':s.region,'invoice_split_day':s.invoice_split_day,'invoice_split_enabled':(db.session.get(AppSetting,'invoice_split_enabled').value=='1')}) @api.put('/settings') @role_required('boss','admin') def update_settings(): d=payload();s=CompanySettings.query.first() try: s.name=d['name'];s.entity_type=d['entity_type'];s.vat_rate=Decimal(d['vat_rate']);s.vat_deduction_percent=Decimal(d['vat_deduction_percent']);s.region=d['region'].strip().lower();s.invoice_split_day=int(d.get('invoice_split_day') or 15) db.session.merge(AppSetting(key='invoice_split_enabled',value='1' if boolv(d,'invoice_split_enabled') else '0'));db.session.commit();return response(message='Zapisano ustawienia') except Exception as exc:db.session.rollback();return fail(str(exc)) @api.get('/app-settings') @role_required('boss','admin') def get_app_settings(): return response({'theme':(db.session.get(AppSetting,'theme') or AppSetting(value='bootstrap')).value}) @api.put('/app-settings') @role_required('boss','admin') def update_app_settings(): d=payload();theme=d.get('theme','bootstrap') if theme not in THEMES:return fail('Nieprawidłowy motyw') db.session.merge(AppSetting(key='theme',value=theme));db.session.commit();return response(message='Zapisano ustawienia aplikacji')