addons-cm/website_sale_aplicoop/controllers/website_sale_pickup.py

157 lines
5 KiB
Python

import logging
from datetime import datetime
from datetime import timedelta
from odoo import fields
from odoo.http import request
_logger = logging.getLogger(__name__)
def _get_day_names(self, env=None, request_obj=None):
"""Get translated day names list (0=Monday to 6=Sunday)."""
req = request_obj or request
if env is None:
env = req.env
context_lang = env.context.get("lang", "NO_LANG")
_logger.info("📅 _get_day_names called with context lang: %s", context_lang)
group_order_model = env["group.order"]
fields_def = group_order_model.fields_get(["pickup_day"])
selection_options = fields_def.get("pickup_day", {}).get("selection", [])
day_names = [name for value, name in selection_options]
_logger.info(
"📅 Returning day names: %s",
day_names[:3] if len(day_names) >= 3 else day_names,
)
return day_names
def _get_next_date_for_weekday(self, weekday_num, start_date=None):
if start_date is None:
start_date = datetime.now().date()
target_weekday = int(weekday_num)
current_weekday = start_date.weekday()
days_ahead = target_weekday - current_weekday
if days_ahead <= 0:
days_ahead += 7
return start_date + timedelta(days=days_ahead)
def _slot_time_label(self, slot):
try:
if slot.label:
return slot.label
sh = float(slot.start_hour or 0.0)
eh = float(slot.end_hour or 0.0)
sh_h = int(sh)
sh_m = int(round((sh - sh_h) * 60))
eh_h = int(eh)
eh_m = int(round((eh - eh_h) * 60))
return f"{sh_h:02d}:{sh_m:02d}-{eh_h:02d}:{eh_m:02d}"
except Exception as exc:
_logger.debug(
"_slot_time_label: failed for slot %s: %s", getattr(slot, "id", None), exc
)
return ""
def _format_datetime_to_str(self, dt_val):
if not dt_val:
return ""
try:
if isinstance(dt_val, str):
dt = fields.Datetime.to_datetime(dt_val)
return dt.strftime("%d/%m/%Y")
if hasattr(dt_val, "strftime"):
return dt_val.strftime("%d/%m/%Y")
return str(dt_val)
except Exception:
return str(dt_val)
def _format_slot_pickup_info(self, group_order, slot, request_obj=None):
pickup_day_name = ""
pickup_date_str = ""
pickup_day_index = None
try:
pickup_day_index = int(slot.weekday)
except Exception:
pickup_day_index = None
if pickup_day_index is not None:
try:
req = request_obj or request
day_names = _get_day_names(self, env=req.env, request_obj=req)
pickup_day_name = day_names[pickup_day_index % len(day_names)]
except Exception:
pickup_day_name = ""
time_label = _slot_time_label(self, slot)
dt_val = getattr(group_order, "next_pickup_datetime", None) or getattr(
group_order, "pickup_date", None
)
pickup_date_str = _format_datetime_to_str(self, dt_val)
if time_label:
pickup_day_name = (
f"{pickup_day_name} {time_label}" if pickup_day_name else time_label
)
return pickup_day_name, pickup_date_str, pickup_day_index
def _format_legacy_pickup_info(self, group_order, is_delivery, request_obj=None):
pickup_day_name = ""
pickup_date_str = ""
pickup_day_index = None
try:
pickup_day_index = int(group_order.pickup_day)
except Exception:
pickup_day_index = None
if pickup_day_index is not None:
try:
req = request_obj or request
day_names = _get_day_names(self, env=req.env, request_obj=req)
pickup_day_name = day_names[pickup_day_index % len(day_names)]
except Exception:
pickup_day_name = ""
if group_order.pickup_date:
if is_delivery:
if group_order.delivery_date:
pickup_date_str = group_order.delivery_date.strftime("%d/%m/%Y")
if pickup_day_index is not None:
try:
req = request_obj or request
day_names = _get_day_names(self, env=req.env, request_obj=req)
next_day_index = (pickup_day_index + 1) % 7
pickup_day_name = day_names[next_day_index]
except Exception:
pickup_day_name = ""
else:
pickup_date_str = group_order.pickup_date.strftime("%d/%m/%Y")
else:
pickup_date_str = group_order.pickup_date.strftime("%d/%m/%Y")
return pickup_day_name, pickup_date_str, pickup_day_index
def _format_pickup_info(self, group_order, is_delivery, request_obj=None):
slot = getattr(group_order, "next_pickup_slot_id", False) or False
if slot:
return _format_slot_pickup_info(
self,
group_order,
slot,
request_obj=request_obj,
)
return _format_legacy_pickup_info(
self,
group_order,
is_delivery,
request_obj=request_obj,
)