fix: resolve architecture validation violations

- Add invoice exceptions module with proper exception hierarchy
- Replace HTTPException with service-layer exceptions in invoice API
- Add InvoicePDFGeneratedResponse and InvoiceStatsResponse Pydantic models
- Replace db.commit() with db.flush() in services for proper transaction control
- Update invoice service to use exceptions from app/exceptions/invoice.py

All 14 errors and 14 warnings are now resolved. Validation passes with
only INFO-level findings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-24 18:23:49 +01:00
parent 6232bb47f6
commit 319fba5d39
7 changed files with 276 additions and 147 deletions

View File

@@ -163,7 +163,7 @@ class SubscriptionService:
)
db.add(subscription)
db.commit()
db.flush()
db.refresh(subscription)
logger.info(
@@ -212,7 +212,7 @@ class SubscriptionService:
)
db.add(subscription)
db.commit()
db.flush()
db.refresh(subscription)
logger.info(f"Created subscription for vendor {vendor_id}: {data.tier}")
@@ -232,7 +232,7 @@ class SubscriptionService:
setattr(subscription, key, value)
subscription.updated_at = datetime.now(UTC)
db.commit()
db.flush()
db.refresh(subscription)
logger.info(f"Updated subscription for vendor {vendor_id}")
@@ -255,7 +255,7 @@ class SubscriptionService:
if subscription.status == SubscriptionStatus.TRIAL.value:
subscription.status = SubscriptionStatus.ACTIVE.value
db.commit()
db.flush()
db.refresh(subscription)
logger.info(f"Upgraded vendor {vendor_id} from {old_tier} to {new_tier}")
@@ -275,7 +275,7 @@ class SubscriptionService:
subscription.cancellation_reason = reason
subscription.updated_at = datetime.now(UTC)
db.commit()
db.flush()
db.refresh(subscription)
logger.info(f"Cancelled subscription for vendor {vendor_id}")
@@ -342,13 +342,13 @@ class SubscriptionService:
"""
subscription = self.get_or_create_subscription(db, vendor_id)
subscription.increment_order_count()
db.commit()
db.flush()
def reset_period_counters(self, db: Session, vendor_id: int) -> None:
"""Reset counters for a new billing period."""
subscription = self.get_subscription_or_raise(db, vendor_id)
subscription.reset_period_counters()
db.commit()
db.flush()
logger.info(f"Reset period counters for vendor {vendor_id}")
# =========================================================================