75 lines
4.4 KiB
Python
75 lines
4.4 KiB
Python
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('/vehicles')
|
|
@login_required
|
|
def get_vehicles(): return response([vehicle_dict(v) for v in accessible_vehicles()])
|
|
|
|
@api.post('/vehicles')
|
|
@login_required
|
|
def create_vehicle():
|
|
d=payload()
|
|
try:
|
|
card_id=int(d['fuel_card_id']) if d.get('fuel_card_id') else None
|
|
owner_id=int(d.get('owner_id') or current_user.id);owner=db.session.get(User,owner_id)
|
|
if not owner: return fail('Nie znaleziono właściciela',404)
|
|
if current_user.role not in ('boss','admin') and owner.id!=current_user.id:return fail('Brak uprawnień',403)
|
|
if current_user.role=='boss' and owner.company_id!=current_user.company_id:return fail('Użytkownik jest w innej firmie',403)
|
|
v=Vehicle(name=d['name'].strip(),make=d['make'].strip(),model=d['model'].strip(),registration=d['registration'].strip().upper(),fuel_type=d['fuel_type'],owner_id=owner.id,company_id=owner.company_id,has_fuel_card=bool(card_id),fuel_card_id=card_id,current_odometer=int(d.get('current_odometer') or 0))
|
|
db.session.add(v); db.session.commit(); return response(vehicle_dict(v),'Dodano pojazd',201)
|
|
except (KeyError,ValueError,IntegrityError) as exc: db.session.rollback(); return fail(str(getattr(exc,'orig',exc)),400)
|
|
|
|
@api.put('/vehicles/<int:vehicle_id>/fuel-card')
|
|
@login_required
|
|
def assign_vehicle_fuel_card(vehicle_id):
|
|
v=Vehicle.query.get_or_404(vehicle_id)
|
|
if current_user.role not in ('boss','admin') and v.owner_id!=current_user.id:return fail('Brak uprawnień',403)
|
|
d=payload();card_id=int(d['fuel_card_id']) if d.get('fuel_card_id') else None
|
|
card=db.session.get(FuelCard,card_id) if card_id else None
|
|
if card_id and not card:return fail('Nie znaleziono karty paliwowej',404)
|
|
if card and v.company_id and card.company_id!=v.company_id:return fail('Karta należy do innej firmy',400)
|
|
v.fuel_card_id=card_id;v.has_fuel_card=bool(card_id);db.session.commit();return response(vehicle_dict(v),'Zapisano kartę pojazdu')
|
|
|
|
@api.post('/vehicles/<int:vehicle_id>/shares')
|
|
@login_required
|
|
def share_vehicle(vehicle_id):
|
|
v=Vehicle.query.get_or_404(vehicle_id)
|
|
if current_user.role!='admin' and v.owner_id!=current_user.id: return fail('Brak uprawnień',403)
|
|
d=payload(); u=User.query.filter_by(email=(d.get('email') or '').strip().lower()).first()
|
|
if not u:return fail('Nie znaleziono użytkownika',404)
|
|
if u not in v.drivers:v.drivers.append(u);db.session.commit();return response(vehicle_dict(v),'Udostępniono pojazd')
|
|
|
|
@api.delete('/vehicles/<int:vehicle_id>/shares/<int:user_id>')
|
|
@login_required
|
|
def unshare_vehicle(vehicle_id,user_id):
|
|
v=Vehicle.query.get_or_404(vehicle_id)
|
|
if current_user.role!='admin' and v.owner_id!=current_user.id:return fail('Brak uprawnień',403)
|
|
u=User.query.get_or_404(user_id)
|
|
if u in v.drivers:v.drivers.remove(u);db.session.commit();return response(vehicle_dict(v),'Odebrano dostęp')
|
|
|
|
@api.put('/vehicles/<int:vehicle_id>/card-policy')
|
|
@login_required
|
|
def card_policy(vehicle_id):
|
|
v=Vehicle.query.get_or_404(vehicle_id)
|
|
if current_user.role!='admin' and v.owner_id!=current_user.id:return fail('Brak uprawnień',403)
|
|
d=payload();p=v.fuel_card_policy or FuelCardPolicy(vehicle=v)
|
|
p.use_orlen_last_price=False;p.discount_percent=Decimal(d.get('discount_percent') or 0);p.surcharge_per_liter=Decimal(d.get('surcharge_per_liter') or 0);p.description=(d.get('description') or '').strip() or None
|
|
db.session.add(p);db.session.commit();return response(message='Zapisano zasady rozliczeń')
|