- Recupera el trabajo revertido (doble propuesta, retainer, niveles, API Python) desde el stash de GitHub Desktop - Dockerfile multi-stage para Next.js (migraciones automáticas al arrancar, seed opcional via RUN_SEED) - docker-compose.coolify.yml: postgres + web + api con healthchecks y SERVICE_FQDN_* - Endpoint público /api/health (verifica BD) para healthchecks - seed.ts parametrizado: conexión DB_* y credenciales SEED_* por entorno (sin passwords hardcodeadas) - .env.example, .dockerignore, uvicorn con --proxy-headers - Limpieza: .xlsx y __pycache__ fuera del repo Co-Authored-By: Claude Fable 5 <[email protected]>
74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ServicioDraft(BaseModel):
|
|
nombre: str
|
|
fase: int
|
|
tipoPago: str
|
|
precio: float
|
|
tiempoEntrega: str
|
|
entregables: list[str] = Field(default_factory=list)
|
|
esPersonalizado: bool = False
|
|
horas: float | None = None
|
|
tarifaHora: float | None = None
|
|
modeloCobro: str | None = None
|
|
montoMinimo: float | None = None
|
|
horasIncluidas: float | None = None
|
|
# Doble propuesta: "1" | "2" | "ambas".
|
|
opcion: str | None = None
|
|
|
|
|
|
class MetaOpcionDraft(BaseModel):
|
|
titulo: str | None = None
|
|
descripcion: str | None = None
|
|
noIncluye: str | None = None
|
|
|
|
|
|
class ExportDraft(BaseModel):
|
|
clienteNombre: str = ""
|
|
clienteEmpresa: str = ""
|
|
asesorNombre: str = ""
|
|
fecha: str = ""
|
|
moneda: str = "MXN"
|
|
tipoCambio: str = "NA"
|
|
proyecto: str = "MKT Digital"
|
|
esquemaPago: str = "Pago Unico/Mensual"
|
|
incluirBonos: bool = False
|
|
servicios: list[ServicioDraft] = Field(default_factory=list)
|
|
planBucefaloNivel: str | None = None
|
|
observaciones: str = ""
|
|
esDoble: bool = False
|
|
opciones: dict[str, MetaOpcionDraft] | None = None
|
|
|
|
|
|
class FinanciamientoRequest(BaseModel):
|
|
monto: float = Field(..., ge=0, description="Monto total a financiar en MXN")
|
|
meses: int = Field(..., ge=3, le=12, description="Plazo en meses: 3, 6, 9, o 12")
|
|
|
|
|
|
class FinanciamientoResponse(BaseModel):
|
|
pagoMensual: float
|
|
ivaMensual: float
|
|
totalMensual: float
|
|
comisionTotal: float
|
|
granTotal: float
|
|
meses: int
|
|
tasa: float
|
|
comision: float
|
|
|
|
|
|
class BonoResponse(BaseModel):
|
|
id: str
|
|
numero: int
|
|
titulo: str
|
|
descripcion: str
|
|
activo: bool
|
|
|
|
|
|
class PlanBucefaloResponse(BaseModel):
|
|
nivel: str
|
|
label: str
|
|
precio: float
|