diff --git a/web_ui(1).py b/web_ui(1).py index 271daed..e00a1c9 100644 --- a/web_ui(1).py +++ b/web_ui(1).py @@ -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"(?