Баг фикс 1

This commit is contained in:
m.milnikov 2026-04-26 20:48:56 +00:00
parent 671b4c89b7
commit 14841c0835
1 changed files with 61 additions and 9 deletions

View File

@ -20,7 +20,7 @@ import mimetypes
# ЗАГРУЗКА ШАБЛОНОВ ПИСЕМ
# =============================================================================
IMAGE_EXTS = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp']
SHIPPING_TYPES_FILE = "shipping_types(1).json"
SHIPPING_TYPES_FILE = "shipping_types.json"
NO_INFO_TEXT = "Информация отсутствует"
NO_INFO_TEXT_EN = "Information not available"
_UI_DIR = os.path.dirname(os.path.abspath(__file__))
@ -356,7 +356,7 @@ def format_dangerous_goods_summary(shipment: Dict) -> str:
if yes:
return "Да: " + ", ".join(yes)
if len(explicit_no) == len(dg_keys):
return "Нет (по всем категориям в перечне)"
return "Нет"
if explicit_no:
return (
"Нет: " + ", ".join(explicit_no) + " — по остальным категориям информации нет"
@ -399,7 +399,7 @@ def format_dangerous_goods_summary_en(shipment: Dict) -> str:
if yes:
return "Yes: " + ", ".join(yes)
if len(explicit_no) == len(dg_keys):
return "No (all categories in the list)"
return "No"
if explicit_no:
return (
"No: " + ", ".join(explicit_no) + " — no information on the remaining categories"
@ -1714,6 +1714,19 @@ def render_shipment_criteria_checklist(
return "; ".join(parts) if parts else NO_INFO_TEXT
def _format_dimensions_any() -> str:
"""
Обязательный вывод для критериев с "габаритами":
сначала грузовые места, затем габариты ТС, если грузовых нет.
"""
cargo_dims = _format_dimensions(shipment.get("dimensions"))
if cargo_dims != NO_INFO_TEXT:
return cargo_dims
vehicle_dims = _format_dimensions(shipment.get("vehicle_dimensions"))
if vehicle_dims != NO_INFO_TEXT:
return vehicle_dims
return NO_INFO_TEXT
def _join_desc_and_hs(sh: Dict) -> str:
desc = (sh.get("cargo_description") or "").strip()
hs = (sh.get("hs_code") or "").strip()
@ -1818,6 +1831,10 @@ def render_shipment_criteria_checklist(
def _answer_for_criterion(criterion_text: str) -> str:
c = criterion_text.lower()
# Любой критерий с "габарит" должен в приоритете возвращать размеры, а не перехватываться ветками по весу.
if "габарит" in c:
return _format_dimensions_any()
if "название клиента" in c:
return (shipment.get("client_name") or "").strip() or NO_INFO_TEXT
if "условия поставки" in c and "incoterms" in c:
@ -1898,11 +1915,19 @@ def render_shipment_criteria_checklist(
):
return door_clearance_summary(shipment)
# Для FTL/FCL-пунктов о габаритах палет/коробок приоритетно показываем размеры грузовых мест,
# не смешивая с проверкой проёмов контейнера.
if (
("палл" in c or "палет" in c or "короб" in c or "carton" in c or "box" in c)
and ("габарит" in c or "размер" in c or "size" in c or "dimension" in c)
):
return _format_dimensions_any()
# Габариты грузовых мест (LTL, FCL «без контейнеров», и п.8 FTL: «если нет данных о количестве
# машин — габариты каждого грузового места…»). Слово «машин» здесь не про ТС — иначе ниже
# сработала бы ветка vehicle_dimensions и габариты груза не показались бы.
if "габарит" in c and "грузов" in c and "мест" in c:
return _format_dimensions(shipment.get("dimensions"))
return _format_dimensions_any()
if "габарит" in c and (
"транспортн" in c
@ -1912,10 +1937,10 @@ def render_shipment_criteria_checklist(
or "прицеп" in c
or "полуприцеп" in c
):
return _format_dimensions(shipment.get("vehicle_dimensions"))
return _format_dimensions_any()
if "габарит" in c:
return _format_dimensions(shipment.get("dimensions"))
return _format_dimensions_any()
if "характер груза" in c or "наименование груза" in c:
return _join_desc_and_hs(shipment)
@ -1953,10 +1978,15 @@ def render_shipment_criteria_checklist(
if msds_negative:
return msds_negative
if "батаре" in c and _has_batteries(shipment) is not True:
# Если батареек нет, документ по батарейкам не нужен.
if shipment.get("msds_required") is False:
return "Не нужен"
return NO_INFO_TEXT
return _required_doc(shipment.get("msds_required"), "msds")
if re.search(r"(?<![a-z])dgm(?![a-z])", c):
if "батаре" in c and _has_batteries(shipment) is not True:
if shipment.get("dgm_report_required") is False:
return "Не нужен"
return NO_INFO_TEXT
return _required_doc(shipment.get("dgm_report_required"), "dgm")
@ -2007,9 +2037,30 @@ def render_shipment_criteria_checklist(
if "дополнительный сервис" in c or "дополнительные услуги" in c or "дополнительные сервисы" in c or "сервисы" in c:
extras = shipment.get("additional_services")
if isinstance(extras, list) and extras:
return ", ".join(str(x) for x in extras if str(x).strip()) or NO_INFO_TEXT
return NO_INFO_TEXT
lines: List[str] = []
if isinstance(extras, list):
lines.extend(str(x).strip() for x in extras if str(x).strip())
# Расширение доп.сервисов: показываем штрафы и сроки доставки, если они найдены в спецтребованиях.
req = (shipment.get("special_transport_requirements") or "").strip()
if req:
chunks = [p.strip() for p in req.split("|") if p.strip()]
for chunk in chunks:
cl = chunk.lower()
if any(k in cl for k in ("штраф", "неустой", "penalty", "срок", "transit", "delivery")):
lines.append(chunk)
if not lines:
return NO_INFO_TEXT
dedup: List[str] = []
seen = set()
for line in lines:
key = line.lower()
if key in seen:
continue
seen.add(key)
dedup.append(line)
return ", ".join(dedup) or NO_INFO_TEXT
if "спецтребования" in c:
return (shipment.get("special_transport_requirements") or "").strip() or NO_INFO_TEXT
@ -2144,6 +2195,7 @@ def render_shipment_criteria_checklist(
# Для FCL по требованию: 5-й верхний столбец должен быть пунктом 9.
st_name_for_top = (shipping_type_name or "").strip()
fcl_types = {
"Автомобильная перевозка (FTL)",
"Морская перевозка (FCL)",
"Железнодорожная перевозка (FCL)",
"Мультимодальная перевозка море + ж/д (FCL)",