feat: Complete Phase 2 with explicit expense states

This commit finalizes Phase 2 by introducing an `ExpenseStatus` enum to formally define the lifecycle of an expense.

- Adds an `ExpenseStatus` enum in `src/data_models.py` with states like `RECEIVED`, `AWAITING_CONFIRMATION`, and `CONFIRMED`.
- Updates the `ProvisionalExpense` and `FinalExpense` models to use the new enum for their `status` fields, improving type safety and clarity.
- Marks all of Phase 2 as complete in `tasks.md`.
This commit is contained in:
google-labs-jules[bot]
2025-12-16 16:04:37 +00:00
parent 2bd49e8802
commit b1f9f8da69
2 changed files with 17 additions and 4 deletions

View File

@@ -1,6 +1,19 @@
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Optional, List from typing import Optional, List
from datetime import datetime, date from datetime import datetime, date
from enum import Enum
class ExpenseStatus(str, Enum):
"""
Defines the explicit states an expense can be in throughout its lifecycle.
"""
RECEIVED = "RECEIVED"
ANALYZED = "ANALYZED"
AWAITING_CONFIRMATION = "AWAITING_CONFIRMATION"
CONFIRMED = "CONFIRMED"
CORRECTED = "CORRECTED"
STORED = "STORED"
class RawInput(BaseModel): class RawInput(BaseModel):
""" """
@@ -39,7 +52,7 @@ class ProvisionalExpense(BaseModel):
confidence_score: float confidence_score: float
processing_method: str = Field(..., description="How the expense was classified, e.g., 'provider_match', 'keyword_match', 'ai_inference'") processing_method: str = Field(..., description="How the expense was classified, e.g., 'provider_match', 'keyword_match', 'ai_inference'")
validation_notes: List[str] = [] validation_notes: List[str] = []
status: str = "AWAITING_CONFIRMATION" status: ExpenseStatus = ExpenseStatus.AWAITING_CONFIRMATION
timestamp: datetime = Field(default_factory=datetime.now) timestamp: datetime = Field(default_factory=datetime.now)
class FinalExpense(BaseModel): class FinalExpense(BaseModel):
@@ -64,4 +77,4 @@ class FinalExpense(BaseModel):
confirmed_at: datetime = Field(default_factory=datetime.now) confirmed_at: datetime = Field(default_factory=datetime.now)
audit_log: List[str] = [] audit_log: List[str] = []
status: str = "CONFIRMED" status: ExpenseStatus = ExpenseStatus.CONFIRMED

View File

@@ -36,8 +36,8 @@ Principio rector:
- [x] **2.1 Modelos Pydantic** - [x] **2.1 Modelos Pydantic**
- [x] Crear modelos: `RawInput`, `ExtractedExpense`, `ProvisionalExpense`, `FinalExpense`. - [x] Crear modelos: `RawInput`, `ExtractedExpense`, `ProvisionalExpense`, `FinalExpense`.
- [ ] **2.2 Estados del Gasto** - [x] **2.2 Estados del Gasto**
- [ ] Definir estados explícitos: `RECEIVED`, `ANALYZED`, `AWAITING_CONFIRMATION`, `CONFIRMED`, `CORRECTED`, `STORED`. - [x] Definir estados explícitos: `RECEIVED`, `ANALYZED`, `AWAITING_CONFIRMATION`, `CONFIRMED`, `CORRECTED`, `STORED`.
--- ---