- Migration: services.price_cents, services.availability_text
- Migration: bookings.receipt_number (trigger annuale IANNI-YYYY-NNNN) + receipt_token
- Constraint EXCLUDE bookings_no_overlap (sala unica, status confirmed/completed)
- availability.py: calcolo slot globale (non più per-provider)
- 16 servizi reali da Servizi.xls inseriti, 9 demo archiviati con FK preservata
- provider_services: 3 profili orari (lun-sab 9-19, lun-mar 9-13, lun-gio 9-13)
- Endpoint GET /api/receipts/{token} → PDF WeasyPrint
- Template HTML ricevuta con palette Ianni
- Dockerfile: deps sistema weasyprint (pango/cairo/fonts)
- requirements: +weasyprint>=63.0
- Frontend index.html: prezzo + fascia oraria nelle card servizio, link Scarica ricevuta nella conferma
17 lines
338 B
Plaintext
17 lines
338 B
Plaintext
fastapi>=0.115.0
|
|
uvicorn>=0.31.1
|
|
sqlalchemy>=2.0.35
|
|
psycopg2-binary>=2.9.9
|
|
pydantic>=2.11.0
|
|
pydantic-settings>=2.10.1
|
|
google-api-python-client>=2.149.0
|
|
google-auth-oauthlib>=1.2.1
|
|
httpx>=0.28.1
|
|
jinja2>=3.1.4
|
|
python-multipart>=0.0.12
|
|
apscheduler>=3.10.4
|
|
authlib>=1.3.0
|
|
python-jose[cryptography]>=3.3.0
|
|
itsdangerous>=2.1.0
|
|
weasyprint>=63.0
|