
Features: - JWT authentication with user registration and login - Customer management with full CRUD operations - Invoice management with automatic calculations - Multi-tenant data isolation by user - SQLite database with Alembic migrations - RESTful API with comprehensive documentation - Tax calculations and invoice status tracking - Code formatted with Ruff linting
101 lines
3.0 KiB
Python
101 lines
3.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status, Query
|
|
from sqlalchemy.orm import Session
|
|
from typing import List
|
|
from app.db.session import get_db
|
|
from app.services.invoice_service import InvoiceService
|
|
from app.schemas.invoice import Invoice, InvoiceCreate, InvoiceUpdate
|
|
from app.core.deps import get_current_user
|
|
from app.models.user import User
|
|
from app.models.invoice import InvoiceStatus
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", response_model=List[Invoice])
|
|
def get_invoices(
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=100),
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
return invoice_service.get_invoices(current_user.id, skip, limit)
|
|
|
|
|
|
@router.post("/", response_model=Invoice, status_code=status.HTTP_201_CREATED)
|
|
def create_invoice(
|
|
invoice_data: InvoiceCreate,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
return invoice_service.create_invoice(invoice_data, current_user.id)
|
|
|
|
|
|
@router.get("/{invoice_id}", response_model=Invoice)
|
|
def get_invoice(
|
|
invoice_id: int,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
invoice = invoice_service.get_invoice(invoice_id, current_user.id)
|
|
|
|
if not invoice:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found"
|
|
)
|
|
|
|
return invoice
|
|
|
|
|
|
@router.put("/{invoice_id}", response_model=Invoice)
|
|
def update_invoice(
|
|
invoice_id: int,
|
|
invoice_data: InvoiceUpdate,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
invoice = invoice_service.update_invoice(invoice_id, invoice_data, current_user.id)
|
|
|
|
if not invoice:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found"
|
|
)
|
|
|
|
return invoice
|
|
|
|
|
|
@router.delete("/{invoice_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
def delete_invoice(
|
|
invoice_id: int,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
success = invoice_service.delete_invoice(invoice_id, current_user.id)
|
|
|
|
if not success:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found"
|
|
)
|
|
|
|
|
|
@router.patch("/{invoice_id}/status", response_model=Invoice)
|
|
def update_invoice_status(
|
|
invoice_id: int,
|
|
status: InvoiceStatus,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
invoice_service = InvoiceService(db)
|
|
invoice = invoice_service.update_invoice_status(invoice_id, status, current_user.id)
|
|
|
|
if not invoice:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found"
|
|
)
|
|
|
|
return invoice
|