59 lines
2.2 KiB
Python
59 lines
2.2 KiB
Python
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()
|