from datetime import date, timedelta from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from backend.app.repositories.config_repository import ConfigRepository from backend.app.repositories.reminder_repository import ReminderRepository class ArrearsService: def __init__(self) -> None: self.config_repository = ConfigRepository() self.reminder_repository = ReminderRepository() def sync_order_arrears(self, session: Session, order) -> None: trigger_mode = self._get_config_value(session, "arrears_generate_mode", "delivered") if not self._should_generate(trigger_mode, order.order_status): return existed = self.reminder_repository.get_arrears_by_order_id(session, order.id) if existed is not None: return settlement_days = 0 customer = None if order.customer_id: customer = self.reminder_repository.get_customer(session, order.customer_id) settlement_days = int(customer.settlement_days or 0) if customer else 0 settlement_start_date = date.today() due_date = settlement_start_date + timedelta(days=max(settlement_days, 0)) arrears_amount = float(order.sale_price_total or 0) if arrears_amount <= 0: return self.reminder_repository.create_arrears( session, { "customer_id": order.customer_id or 0, "order_id": order.id, "arrears_amount": arrears_amount, "settlement_start_date": settlement_start_date, "due_date": due_date, "status": "pending", }, ) def _get_config_value(self, session: Session, config_key: str, default: str) -> str: config = self.config_repository.get_by_key(session, config_key) return config.config_value if config is not None and config.config_value else default def _should_generate(self, trigger_mode: str, order_status: str) -> bool: if trigger_mode == "shipped": return order_status in {"shipped", "delivered", "completed", "settled"} return order_status in {"delivered", "completed", "settled"} arrears_service = ArrearsService()