dingdanquanliucheng/backend/app/services/arrears_service.py

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()