Initial commit: locoutil — gestion de location d'outils

This commit is contained in:
2026-04-30 21:19:11 +02:00
commit 54b39dd669
15 changed files with 1546 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from datetime import datetime, date
import os
from .database import init_db, get_db
from .routers import tools, clients, rentals, platforms
app = FastAPI(title="LocOutil")
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
UPLOAD_DIR = os.environ.get("UPLOAD_DIR", "/uploads")
app.mount("/static", StaticFiles(directory=os.path.join(BASE_DIR, "static")), name="static")
app.mount("/uploads", StaticFiles(directory=UPLOAD_DIR), name="uploads")
templates = Jinja2Templates(directory=os.path.join(BASE_DIR, "templates"))
app.include_router(tools.router)
app.include_router(clients.router)
app.include_router(rentals.router)
app.include_router(platforms.router)
@app.on_event("startup")
def startup():
os.makedirs(os.path.join(UPLOAD_DIR, "tools"), exist_ok=True)
os.makedirs(os.path.join(UPLOAD_DIR, "clients"), exist_ok=True)
init_db()
@app.get("/", response_class=HTMLResponse)
def index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.get("/api/dashboard")
def dashboard():
today = date.today().isoformat()
month = today[:7]
with get_db() as conn:
active = conn.execute("SELECT COUNT(*) FROM rentals WHERE status IN ('confirmed','ongoing') AND end_date >= ?", (today,)).fetchone()[0]
revenue_month = conn.execute("SELECT COALESCE(SUM(price),0) FROM rentals WHERE status != 'cancelled' AND start_date LIKE ?", (f"{month}%",)).fetchone()[0]
revenue_total = conn.execute("SELECT COALESCE(SUM(price),0) FROM rentals WHERE status != 'cancelled'").fetchone()[0]
returning_soon = conn.execute("""
SELECT r.*, t.name as tool_name, c.name as client_name
FROM rentals r JOIN tools t ON t.id=r.tool_id JOIN clients c ON c.id=r.client_id
WHERE r.status IN ('confirmed','ongoing') AND r.end_date >= ? AND r.end_date <= date(?, '+7 days')
ORDER BY r.end_date
""", (today, today)).fetchall()
tools_count = conn.execute("SELECT COUNT(*) FROM tools").fetchone()[0]
clients_count = conn.execute("SELECT COUNT(*) FROM clients").fetchone()[0]
pending_deposit = conn.execute("SELECT COUNT(*) FROM rentals WHERE status != 'cancelled' AND deposit_collected=1 AND deposit_returned=0 AND end_date < ?", (today,)).fetchone()[0]
return {
"active_rentals": active,
"revenue_month": revenue_month,
"revenue_total": revenue_total,
"returning_soon": [dict(r) for r in returning_soon],
"tools_count": tools_count,
"clients_count": clients_count,
"pending_deposit_return": pending_deposit,
"current_month": month
}