82 lines
4.3 KiB
Python
82 lines
4.3 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('/fuel-cards')
|
|
@login_required
|
|
def get_fuel_cards():
|
|
rows=FuelCard.query.order_by(FuelCard.name).all()
|
|
return response([{'id':x.id,'name':x.name,'provider':x.provider,'active':x.active,'description':x.description} for x in rows])
|
|
|
|
@api.post('/fuel-cards')
|
|
@role_required('boss','admin')
|
|
def create_fuel_card():
|
|
d=payload()
|
|
try:
|
|
company_id=int(d.get('company_id') or current_user.company_id or CompanySettings.query.first().id)
|
|
if current_user.role=='boss' and company_id!=current_user.company_id:return fail('Brak uprawnień',403)
|
|
card=FuelCard(name=d['name'].strip(),provider=d['provider'].strip(),description=(d.get('description') or '').strip() or None,active=True,company_id=company_id)
|
|
db.session.add(card);db.session.commit();return response({'id':card.id},'Dodano kartę paliwową',201)
|
|
except Exception as exc:db.session.rollback();return fail(str(getattr(exc,'orig',exc)))
|
|
|
|
@api.put('/fuel-cards/<int:card_id>')
|
|
@role_required('boss','admin')
|
|
def update_fuel_card(card_id):
|
|
card=FuelCard.query.get_or_404(card_id);d=payload();card.name=d.get('name',card.name).strip();card.provider=d.get('provider',card.provider).strip();card.description=(d.get('description') or '').strip() or None;card.active=boolv(d,'active');db.session.commit();return response(message='Zapisano kartę')
|
|
|
|
@api.delete('/fuel-cards/<int:card_id>')
|
|
@role_required('boss','admin')
|
|
def delete_fuel_card(card_id):
|
|
card = FuelCard.query.get_or_404(card_id)
|
|
if current_user.role == 'boss' and card.company_id != current_user.company_id:
|
|
return fail('Brak uprawnień', 403)
|
|
|
|
users_count = User.query.filter_by(fuel_card_id=card.id).count()
|
|
vehicles_count = Vehicle.query.filter_by(fuel_card_id=card.id).count()
|
|
entries_count = FuelEntry.query.filter_by(fuel_card_id=card.id).count()
|
|
blockers = []
|
|
if users_count:
|
|
blockers.append(f'{users_count} użytkowników')
|
|
if vehicles_count:
|
|
blockers.append(f'{vehicles_count} pojazdów')
|
|
if entries_count:
|
|
blockers.append(f'{entries_count} tankowań')
|
|
if blockers:
|
|
return fail(
|
|
'Nie można usunąć karty, ponieważ jest przypisana do: ' + ', '.join(blockers) +
|
|
'. Najpierw odłącz kartę od użytkowników i pojazdów. Karty użytej w tankowaniach nie można usunąć; możesz ją wyłączyć.',
|
|
409,
|
|
)
|
|
|
|
company_id = card.company_id
|
|
db.session.delete(card)
|
|
db.session.commit()
|
|
return response(
|
|
{'redirect':url_for('main.admin_companies', company_id=company_id)},
|
|
'Usunięto kartę flotową',
|
|
)
|
|
|
|
@api.put('/fuel-cards/<int:card_id>/stations/<int:station_id>')
|
|
@role_required('boss','admin')
|
|
def update_card_station_rule(card_id,station_id):
|
|
FuelCard.query.get_or_404(card_id);FuelStationCompany.query.get_or_404(station_id);d=payload()
|
|
rule=FuelCardStationRule.query.filter_by(fuel_card_id=card_id,station_company_id=station_id).first() or FuelCardStationRule(fuel_card_id=card_id,station_company_id=station_id)
|
|
rule.allowed=boolv(d,'allowed');rule.use_orlen_last_price=boolv(d,'use_orlen_last_price');rule.discount_net_percent=Decimal(d.get('discount_net_percent') or 0);rule.surcharge_net_per_liter=Decimal(d.get('surcharge_net_per_liter') or 0)
|
|
db.session.add(rule);db.session.commit();return response(message='Zapisano warunki karty dla stacji')
|