From 4fedd08e8ff3a77a4c2171ec0ca2e761f0a6918c Mon Sep 17 00:00:00 2001 From: "m.milnikov" Date: Mon, 8 Jun 2026 11:10:46 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- container_iso_reference.json | 176 ++-- container_reference.py | 356 +++---- criteria_interface_layout.json | 1602 ++++++++++++++++---------------- proxy.py | 83 +- shipping_types.json | 216 +++++ 5 files changed, 1299 insertions(+), 1134 deletions(-) create mode 100644 shipping_types.json diff --git a/container_iso_reference.json b/container_iso_reference.json index 6a98bdd..3b4598f 100644 --- a/container_iso_reference.json +++ b/container_iso_reference.json @@ -1,88 +1,88 @@ -{ - "meta": { - "source": "Таблица основных типов ISO-контейнеров (внешние/внутренние размеры, дверной проём, масса, объём)", - "usage": "Сверка п.21 FCL (проходимость груза в дверной проём 20DV, 40DV, 40HC) и оценка payload/объёма." - }, - "types": { - "20DV": { - "label": "20' Standard (Dry Cube) — соответствует 20DV в критериях", - "external_mm": { "length": 6058, "width": 2438, "height": 2591 }, - "internal_mm": { "length": 5905, "width": 2350, "height": 2381 }, - "door_opening_mm": { "width": 2336, "height": 2291 }, - "max_gross_kg": 30480, - "tare_kg": 2370, - "payload_kg": 28110, - "volume_m3": 33.2 - }, - "20HC": { - "label": "20' High Cube", - "external_mm": { "length": 6058, "width": 2438, "height": 2896 }, - "internal_mm": { "length": 5905, "width": 2350, "height": 2693 }, - "door_opening_mm": { "width": 2340, "height": 2597 }, - "max_gross_kg": 30480, - "tare_kg": 2340, - "payload_kg": 28140, - "volume_m3": 37.5 - }, - "20HC_PW": { - "label": "20' High Cube Pallet Wide", - "external_mm": { "length": 6058, "width": 2484, "height": 2896 }, - "internal_mm": { "length": 5898, "width": 2426, "height": 2698 }, - "door_opening_mm": { "width": 2374, "height": 2585 }, - "max_gross_kg": 30480, - "tare_kg": 2580, - "payload_kg": 27900, - "volume_m3": 38.6 - }, - "40DV": { - "label": "40' Standard (Dry Van) — соответствует 40DV в критериях", - "external_mm": { "length": 12192, "width": 2438, "height": 2591 }, - "internal_mm": { "length": 12039, "width": 2350, "height": 2372 }, - "door_opening_mm": { "width": 2336, "height": 2291 }, - "max_gross_kg": 30480, - "tare_kg": 4000, - "payload_kg": 26480, - "volume_m3": 67.8 - }, - "40HC": { - "label": "40' High Cube — соответствует 40HC в критериях", - "external_mm": { "length": 12192, "width": 2438, "height": 2896 }, - "internal_mm": { "length": 12039, "width": 2350, "height": 2693 }, - "door_opening_mm": { "width": 2340, "height": 2597 }, - "max_gross_kg": 32500, - "tare_kg": 4200, - "payload_kg": 28300, - "volume_m3": 76.5 - }, - "40HC_PW": { - "label": "40' High Cube Pallet Wide", - "external_mm": { "length": 12192, "width": 2500, "height": 2896 }, - "internal_mm": { "length": 12039, "width": 2432, "height": 2693 }, - "door_opening_mm": { "width": 2432, "height": 2597 }, - "max_gross_kg": 35000, - "tare_kg": 4400, - "payload_kg": 30600, - "volume_m3": 79.3 - }, - "45HC_PW_A": { - "label": "45' High Cube Pallet Wide (Type A)", - "external_mm": { "length": 13716, "width": 2500, "height": 2750 }, - "internal_mm": { "length": 13513, "width": 2444, "height": 2549 }, - "door_opening_mm": { "width": 2416, "height": 2439 }, - "max_gross_kg": 34000, - "tare_kg": 4180, - "payload_kg": 29820, - "volume_m3": 85.1 - }, - "45HC_PW_B": { - "label": "45' High Cube Pallet Wide (Type B)", - "external_mm": { "length": 13716, "width": 2500, "height": 2896 }, - "internal_mm": { "length": 13513, "width": 2444, "height": 2670 }, - "door_opening_mm": { "width": 2416, "height": 2580 }, - "max_gross_kg": 34000, - "tare_kg": 5080, - "payload_kg": 28920, - "volume_m3": 89.5 - } - } -} +{ + "meta": { + "source": "Таблица основных типов ISO-контейнеров (внешние/внутренние размеры, дверной проём, масса, объём)", + "usage": "Сверка п.21 FCL (проходимость груза в дверной проём 20DV, 40DV, 40HC) и оценка payload/объёма." + }, + "types": { + "20DV": { + "label": "20' Standard (Dry Cube) — соответствует 20DV в критериях", + "external_mm": { "length": 6058, "width": 2438, "height": 2591 }, + "internal_mm": { "length": 5905, "width": 2350, "height": 2381 }, + "door_opening_mm": { "width": 2336, "height": 2291 }, + "max_gross_kg": 30480, + "tare_kg": 2370, + "payload_kg": 28110, + "volume_m3": 33.2 + }, + "20HC": { + "label": "20' High Cube", + "external_mm": { "length": 6058, "width": 2438, "height": 2896 }, + "internal_mm": { "length": 5905, "width": 2350, "height": 2693 }, + "door_opening_mm": { "width": 2340, "height": 2597 }, + "max_gross_kg": 30480, + "tare_kg": 2340, + "payload_kg": 28140, + "volume_m3": 37.5 + }, + "20HC_PW": { + "label": "20' High Cube Pallet Wide", + "external_mm": { "length": 6058, "width": 2484, "height": 2896 }, + "internal_mm": { "length": 5898, "width": 2426, "height": 2698 }, + "door_opening_mm": { "width": 2374, "height": 2585 }, + "max_gross_kg": 30480, + "tare_kg": 2580, + "payload_kg": 27900, + "volume_m3": 38.6 + }, + "40DV": { + "label": "40' Standard (Dry Van) — соответствует 40DV в критериях", + "external_mm": { "length": 12192, "width": 2438, "height": 2591 }, + "internal_mm": { "length": 12039, "width": 2350, "height": 2372 }, + "door_opening_mm": { "width": 2336, "height": 2291 }, + "max_gross_kg": 30480, + "tare_kg": 4000, + "payload_kg": 26480, + "volume_m3": 67.8 + }, + "40HC": { + "label": "40' High Cube — соответствует 40HC в критериях", + "external_mm": { "length": 12192, "width": 2438, "height": 2896 }, + "internal_mm": { "length": 12039, "width": 2350, "height": 2693 }, + "door_opening_mm": { "width": 2340, "height": 2597 }, + "max_gross_kg": 32500, + "tare_kg": 4200, + "payload_kg": 28300, + "volume_m3": 76.5 + }, + "40HC_PW": { + "label": "40' High Cube Pallet Wide", + "external_mm": { "length": 12192, "width": 2500, "height": 2896 }, + "internal_mm": { "length": 12039, "width": 2432, "height": 2693 }, + "door_opening_mm": { "width": 2432, "height": 2597 }, + "max_gross_kg": 35000, + "tare_kg": 4400, + "payload_kg": 30600, + "volume_m3": 79.3 + }, + "45HC_PW_A": { + "label": "45' High Cube Pallet Wide (Type A)", + "external_mm": { "length": 13716, "width": 2500, "height": 2750 }, + "internal_mm": { "length": 13513, "width": 2444, "height": 2549 }, + "door_opening_mm": { "width": 2416, "height": 2439 }, + "max_gross_kg": 34000, + "tare_kg": 4180, + "payload_kg": 29820, + "volume_m3": 85.1 + }, + "45HC_PW_B": { + "label": "45' High Cube Pallet Wide (Type B)", + "external_mm": { "length": 13716, "width": 2500, "height": 2896 }, + "internal_mm": { "length": 13513, "width": 2444, "height": 2670 }, + "door_opening_mm": { "width": 2416, "height": 2580 }, + "max_gross_kg": 34000, + "tare_kg": 5080, + "payload_kg": 28920, + "volume_m3": 89.5 + } + } +} diff --git a/container_reference.py b/container_reference.py index bd7a45b..8d430bf 100644 --- a/container_reference.py +++ b/container_reference.py @@ -1,178 +1,178 @@ -# -*- coding: utf-8 -*- -"""Справочник ISO-контейнеров: промпт RAG и сверка п.21 FCL (дверной проём vs габариты груза).""" -from __future__ import annotations - -import json -import os -import re -from typing import Any, Dict, List, Optional, Tuple - -_DIR = os.path.dirname(os.path.abspath(__file__)) -_JSON_PATH = os.path.join(_DIR, "container_iso_reference.json") - -_iso_cache: Optional[Dict[str, Any]] = None - - -def load_iso_reference() -> Dict[str, Any]: - global _iso_cache - if _iso_cache is not None: - return _iso_cache - try: - with open(_JSON_PATH, "r", encoding="utf-8") as f: - _iso_cache = json.load(f) - except Exception: - _iso_cache = {"types": {}} - return _iso_cache - - -def iso_reference_prompt_block() -> str: - """Компактный блок для system prompt LLM (сверка п.21 и выбора контейнера).""" - data = load_iso_reference() - types = data.get("types") or {} - if not types: - return "" - lines: List[str] = [ - "СПРАВОЧНИК ISO-КОНТЕЙНЕРОВ (мм, кг, м³) — для сверки с п.21 FCL (дверной проём) и оценки объёма/полезной нагрузки. " - "Не выдумывай числа; при расчётах используй только эти значения.", - "Ключи 20DV / 40DV / 40HC соответствуют формулировкам в критериях (проём 20DV, 40DV, 40HC).", - ] - for key in ("20DV", "20HC", "20HC_PW", "40DV", "40HC", "40HC_PW", "45HC_PW_A", "45HC_PW_B"): - t = types.get(key) - if not isinstance(t, dict): - continue - door = t.get("door_opening_mm") or {} - inn = t.get("internal_mm") or {} - dw = door.get("width") - dh = door.get("height") - il = inn.get("length") - iw = inn.get("width") - ih = inn.get("height") - vol = t.get("volume_m3") - pay = t.get("payload_kg") - lines.append( - f"- {key} ({t.get('label', '')}): дверь {dw}×{dh} мм; " - f"внутри {il}×{iw}×{ih} мм; объём ~{vol} м³; payload ~{pay} кг" - ) - return "\n".join(lines) - - -def _edges_mm_from_dim(d: Dict[str, Any]) -> Optional[Tuple[float, float, float]]: - """Длина/ширина/высота груза в мм (из см в shipment).""" - if not isinstance(d, dict): - return None - - def _num(v: Any) -> Optional[float]: - if v is None: - return None - if isinstance(v, (int, float)): - return float(v) - s = str(v).strip().replace(" ", "").replace(",", ".") - try: - return float(s) - except ValueError: - return None - - l = _num(d.get("length_cm")) - w = _num(d.get("width_cm")) - h = _num(d.get("height_cm")) - if l is None or w is None or h is None: - return None - return l * 10.0, w * 10.0, h * 10.0 - - -def _box_fits_door( - edges_mm: Tuple[float, float, float], - door_w_mm: float, - door_h_mm: float, -) -> bool: - """Два наименьших ребра груза должны укладываться в ширину/высоту проёма (сортировка).""" - s0, s1, s2 = sorted(edges_mm) - dw, dh = sorted((door_w_mm, door_h_mm)) - return s0 <= dw + 0.5 and s1 <= dh + 0.5 - - -def _codes_from_container_type(ct: str) -> List[str]: - """Из строки вида «2×40HC, 1×20DC» извлекает коды из справочника.""" - if not isinstance(ct, str) or not ct.strip(): - return ["20DV", "40DV", "40HC"] - t = ct.upper() - found: List[str] = [] - - def _add(size: str, kind: Optional[str]) -> None: - k = (kind or "DV").upper() - if size == "20": - code = "20" + ("HC" if k in ("HC", "HQ") else "DV") - elif size == "40": - code = "40" + ("HC" if k in ("HC", "HQ") else "DV") - elif size == "45": - code = "45HC_PW_B" - else: - return - if code not in found: - found.append(code) - - for m in re.finditer( - r"(\d{1,3})\s*[x×х**]\s*(20|40|45)\s*(DC|DV|GP|HC|HQ|OT|FR|RF|RH)?", - t, - re.IGNORECASE, - ): - _add(m.group(2), m.group(3)) - for m in re.finditer( - r"\b(20|40|45)\s*(DC|DV|GP|HC|HQ|OT|FR|RF|RH)\b", - t, - re.IGNORECASE, - ): - _add(m.group(1), m.group(2)) - if not found: - return ["20DV", "40DV", "40HC"] - return found - - -def door_clearance_summary(shipment: Dict[str, Any]) -> str: - """ - Текст для п.21: сверка габаритов мест с дверным проёмом 20DV/40DV/40HC из справочника. - """ - data = load_iso_reference() - types = data.get("types") or {} - dims = shipment.get("dimensions") - if not isinstance(dims, list) or not dims: - return ( - "Нет габаритов грузовых мест — проверка проходимости по справочнику дверных проёмов " - "(20DV 2336×2291 мм, 40DV 2336×2291 мм, 40HC 2340×2597 мм) невозможна." - ) - - ct_raw = (shipment.get("container_type") or "").strip() - codes = _codes_from_container_type(ct_raw) - parts: List[str] = [] - for i, d in enumerate(dims, start=1): - edges = _edges_mm_from_dim(d) - if not edges: - parts.append(f"Место {i}: нет полных Д×Ш×В в см.") - continue - place_bits: List[str] = [] - for code in codes: - spec = types.get(code) - if not isinstance(spec, dict): - continue - door = spec.get("door_opening_mm") or {} - dw = float(door.get("width") or 0) - dh = float(door.get("height") or 0) - if dw <= 0 or dh <= 0: - continue - ok = _box_fits_door(edges, dw, dh) - label = spec.get("label", code) - status = "проходит" if ok else "не проходит" - place_bits.append(f"{code} ({int(dw)}×{int(dh)} мм): {status}") - if place_bits: - parts.append(f"Место {i} (рёбра {int(min(edges))}×{int(sorted(edges)[1])}×{int(max(edges))} мм): " + "; ".join(place_bits)) - else: - parts.append(f"Место {i}: нет данных дверного проёма в справочнике для кодов {', '.join(codes)}.") - - note = ( - " Оценка: два наименьших габарита сравниваются с шириной и высотой дверного проёма (ориентация коробки)." - ) - prefix = ( - f"Справочник дверных проёмов (п.21). Контейнеры в заявке: {ct_raw or 'не указаны — проверка по 20DV/40DV/40HC'}. " - ) - return prefix + " ".join(parts) + note - +# -*- coding: utf-8 -*- +"""Справочник ISO-контейнеров: промпт RAG и сверка п.21 FCL (дверной проём vs габариты груза).""" +from __future__ import annotations + +import json +import os +import re +from typing import Any, Dict, List, Optional, Tuple + +_DIR = os.path.dirname(os.path.abspath(__file__)) +_JSON_PATH = os.path.join(_DIR, "container_iso_reference.json") + +_iso_cache: Optional[Dict[str, Any]] = None + + +def load_iso_reference() -> Dict[str, Any]: + global _iso_cache + if _iso_cache is not None: + return _iso_cache + try: + with open(_JSON_PATH, "r", encoding="utf-8") as f: + _iso_cache = json.load(f) + except Exception: + _iso_cache = {"types": {}} + return _iso_cache + + +def iso_reference_prompt_block() -> str: + """Компактный блок для system prompt LLM (сверка п.21 и выбора контейнера).""" + data = load_iso_reference() + types = data.get("types") or {} + if not types: + return "" + lines: List[str] = [ + "СПРАВОЧНИК ISO-КОНТЕЙНЕРОВ (мм, кг, м³) — для сверки с п.21 FCL (дверной проём) и оценки объёма/полезной нагрузки. " + "Не выдумывай числа; при расчётах используй только эти значения.", + "Ключи 20DV / 40DV / 40HC соответствуют формулировкам в критериях (проём 20DV, 40DV, 40HC).", + ] + for key in ("20DV", "20HC", "20HC_PW", "40DV", "40HC", "40HC_PW", "45HC_PW_A", "45HC_PW_B"): + t = types.get(key) + if not isinstance(t, dict): + continue + door = t.get("door_opening_mm") or {} + inn = t.get("internal_mm") or {} + dw = door.get("width") + dh = door.get("height") + il = inn.get("length") + iw = inn.get("width") + ih = inn.get("height") + vol = t.get("volume_m3") + pay = t.get("payload_kg") + lines.append( + f"- {key} ({t.get('label', '')}): дверь {dw}×{dh} мм; " + f"внутри {il}×{iw}×{ih} мм; объём ~{vol} м³; payload ~{pay} кг" + ) + return "\n".join(lines) + + +def _edges_mm_from_dim(d: Dict[str, Any]) -> Optional[Tuple[float, float, float]]: + """Длина/ширина/высота груза в мм (из см в shipment).""" + if not isinstance(d, dict): + return None + + def _num(v: Any) -> Optional[float]: + if v is None: + return None + if isinstance(v, (int, float)): + return float(v) + s = str(v).strip().replace(" ", "").replace(",", ".") + try: + return float(s) + except ValueError: + return None + + l = _num(d.get("length_cm")) + w = _num(d.get("width_cm")) + h = _num(d.get("height_cm")) + if l is None or w is None or h is None: + return None + return l * 10.0, w * 10.0, h * 10.0 + + +def _box_fits_door( + edges_mm: Tuple[float, float, float], + door_w_mm: float, + door_h_mm: float, +) -> bool: + """Два наименьших ребра груза должны укладываться в ширину/высоту проёма (сортировка).""" + s0, s1, s2 = sorted(edges_mm) + dw, dh = sorted((door_w_mm, door_h_mm)) + return s0 <= dw + 0.5 and s1 <= dh + 0.5 + + +def _codes_from_container_type(ct: str) -> List[str]: + """Из строки вида «2×40HC, 1×20DC» извлекает коды из справочника.""" + if not isinstance(ct, str) or not ct.strip(): + return ["20DV", "40DV", "40HC"] + t = ct.upper() + found: List[str] = [] + + def _add(size: str, kind: Optional[str]) -> None: + k = (kind or "DV").upper() + if size == "20": + code = "20" + ("HC" if k in ("HC", "HQ") else "DV") + elif size == "40": + code = "40" + ("HC" if k in ("HC", "HQ") else "DV") + elif size == "45": + code = "45HC_PW_B" + else: + return + if code not in found: + found.append(code) + + for m in re.finditer( + r"(\d{1,3})\s*[x×х**]\s*(20|40|45)\s*(DC|DV|GP|HC|HQ|OT|FR|RF|RH)?", + t, + re.IGNORECASE, + ): + _add(m.group(2), m.group(3)) + for m in re.finditer( + r"\b(20|40|45)\s*(DC|DV|GP|HC|HQ|OT|FR|RF|RH)\b", + t, + re.IGNORECASE, + ): + _add(m.group(1), m.group(2)) + if not found: + return ["20DV", "40DV", "40HC"] + return found + + +def door_clearance_summary(shipment: Dict[str, Any]) -> str: + """ + Текст для п.21: сверка габаритов мест с дверным проёмом 20DV/40DV/40HC из справочника. + """ + data = load_iso_reference() + types = data.get("types") or {} + dims = shipment.get("dimensions") + if not isinstance(dims, list) or not dims: + return ( + "Нет габаритов грузовых мест — проверка проходимости по справочнику дверных проёмов " + "(20DV 2336×2291 мм, 40DV 2336×2291 мм, 40HC 2340×2597 мм) невозможна." + ) + + ct_raw = (shipment.get("container_type") or "").strip() + codes = _codes_from_container_type(ct_raw) + parts: List[str] = [] + for i, d in enumerate(dims, start=1): + edges = _edges_mm_from_dim(d) + if not edges: + parts.append(f"Место {i}: нет полных Д×Ш×В в см.") + continue + place_bits: List[str] = [] + for code in codes: + spec = types.get(code) + if not isinstance(spec, dict): + continue + door = spec.get("door_opening_mm") or {} + dw = float(door.get("width") or 0) + dh = float(door.get("height") or 0) + if dw <= 0 or dh <= 0: + continue + ok = _box_fits_door(edges, dw, dh) + label = spec.get("label", code) + status = "проходит" if ok else "не проходит" + place_bits.append(f"{code} ({int(dw)}×{int(dh)} мм): {status}") + if place_bits: + parts.append(f"Место {i} (рёбра {int(min(edges))}×{int(sorted(edges)[1])}×{int(max(edges))} мм): " + "; ".join(place_bits)) + else: + parts.append(f"Место {i}: нет данных дверного проёма в справочнике для кодов {', '.join(codes)}.") + + note = ( + " Оценка: два наименьших габарита сравниваются с шириной и высотой дверного проёма (ориентация коробки)." + ) + prefix = ( + f"Справочник дверных проёмов (п.21). Контейнеры в заявке: {ct_raw or 'не указаны — проверка по 20DV/40DV/40HC'}. " + ) + return prefix + " ".join(parts) + note + diff --git a/criteria_interface_layout.json b/criteria_interface_layout.json index f0cf032..d0f8f42 100644 --- a/criteria_interface_layout.json +++ b/criteria_interface_layout.json @@ -1,801 +1,801 @@ -{ - "version": 1, - "source_xlsx": "Запрос для ИИ Общий(3).xlsx", - "by_shipping_type": { - "Автомобильная перевозка (LTL)": { - "sheet": "Авто LTL интерфейс", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество грузовых мест и вес, объем" - }, - "right": { - "num": "7", - "label": "Габариты грузовых мест ДхШхВ" - } - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Штабелирвоание с другими отправками" - }, - "right": { - "num": "11", - "label": "Штабелирвоание между собой" - } - }, - { - "type": "pair", - "left": { - "num": "9", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "13", - "label": "MSDS" - }, - "right": { - "num": "14", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "15", - "label": "Название бренда" - }, - "right": { - "num": "16", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "17", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "18", - "label": "Требуется ли замена документов" - } - } - ] - }, - "Автомобильная перевозка (FTL)": { - "sheet": "Авто FTL интерфейс", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер машин" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "left_12", - "num": "8", - "label": "Габариты грузовых мест ДхШхВ" - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "11", - "label": "MSDS" - }, - "right": { - "num": "13", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "14", - "label": "Название бренда" - }, - "right": { - "num": "15", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "16", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "17", - "label": "Требуется ли замена документов" - } - } - ] - }, - "Морская перевозка (LCL)": { - "sheet": "Море, море+жд, жд LCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер машин" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Штабелирвоание с другими отправками" - }, - "right": { - "num": "11", - "label": "Штабелирвоание между собой" - } - }, - { - "type": "pair", - "left": { - "num": "9", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "13", - "label": "MSDS" - }, - "right": { - "num": "14", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "15", - "label": "Название бренда" - }, - "right": { - "num": "16", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "17", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "18", - "label": "Требуется ли замена документов" - } - } - ] - }, - "Железнодорожная перевозка (LCL)": { - "sheet": "Море, море+жд, жд LCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер машин" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Штабелирвоание с другими отправками" - }, - "right": { - "num": "11", - "label": "Штабелирвоание между собой" - } - }, - { - "type": "pair", - "left": { - "num": "9", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "13", - "label": "MSDS" - }, - "right": { - "num": "14", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "15", - "label": "Название бренда" - }, - "right": { - "num": "16", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "17", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "18", - "label": "Требуется ли замена документов" - } - } - ] - }, - "Мультимодальная перевозка море + ж/д (LCL)": { - "sheet": "Море, море+жд, жд LCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер машин" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Штабелирвоание с другими отправками" - }, - "right": { - "num": "11", - "label": "Штабелирвоание между собой" - } - }, - { - "type": "pair", - "left": { - "num": "9", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "13", - "label": "MSDS" - }, - "right": { - "num": "14", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "15", - "label": "Название бренда" - }, - "right": { - "num": "16", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "17", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "18", - "label": "Требуется ли замена документов" - } - } - ] - }, - "Морская перевозка (FCL)": { - "sheet": "Море, море+жд, жд FCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер контейнеров" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "left_12", - "num": "8", - "label": "Габариты грузовых мест ДхШхВ" - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "11", - "label": "MSDS" - }, - "right": { - "num": "13", - "label": "Technical Description of Goods in Railway Transport" - } - }, - { - "type": "pair", - "left": { - "num": "14", - "label": "Название бренда" - }, - "right": { - "num": "15", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "16", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "17", - "label": "Требуется ли замена документов" - } - }, - { - "type": "pair", - "left": { - "num": "18", - "label": "Место таможенного оформления при экспорте из РФ" - }, - "right": { - "num": "19", - "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" - } - }, - { - "type": "left_12", - "num": "20", - "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" - } - ] - }, - "Железнодорожная перевозка (FCL)": { - "sheet": "Море, море+жд, жд FCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер контейнеров" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "left_12", - "num": "8", - "label": "Габариты грузовых мест ДхШхВ" - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "11", - "label": "MSDS" - }, - "right": { - "num": "13", - "label": "Technical Description of Goods in Railway Transport" - } - }, - { - "type": "pair", - "left": { - "num": "14", - "label": "Название бренда" - }, - "right": { - "num": "15", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "16", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "17", - "label": "Требуется ли замена документов" - } - }, - { - "type": "pair", - "left": { - "num": "18", - "label": "Место таможенного оформления при экспорте из РФ" - }, - "right": { - "num": "19", - "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" - } - }, - { - "type": "left_12", - "num": "20", - "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" - } - ] - }, - "Мультимодальная перевозка море + ж/д (FCL)": { - "sheet": "Море, море+жд, жд FCL интерфейc", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество и типоразмер контейнеров" - }, - "right": { - "num": "7", - "label": "Количество грузовых мест и вес, объем" - } - }, - { - "type": "left_12", - "num": "8", - "label": "Габариты грузовых мест ДхШхВ" - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "12", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "11", - "label": "MSDS" - }, - "right": { - "num": "13", - "label": "Technical Description of Goods in Railway Transport" - } - }, - { - "type": "pair", - "left": { - "num": "14", - "label": "Название бренда" - }, - "right": { - "num": "15", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "16", - "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" - }, - "right": { - "num": "17", - "label": "Требуется ли замена документов" - } - }, - { - "type": "pair", - "left": { - "num": "18", - "label": "Место таможенного оформления при экспорте из РФ" - }, - "right": { - "num": "19", - "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" - } - }, - { - "type": "left_12", - "num": "20", - "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" - } - ] - }, - "Авиаперевозка": { - "sheet": "Авиа Интерфейс", - "blocks": [ - { - "type": "pair", - "left": { - "num": "4", - "label": "Страна, город, адрес забора" - }, - "right": { - "num": "19", - "label": "Страна, город, точный адрес доставки, Место ТО в РФ" - } - }, - { - "type": "pair", - "left": { - "num": "6", - "label": "Количество грузовых мест и вес, объем" - }, - "right": { - "num": "7", - "label": "Габариты грузовых мест ДхШхВ" - } - }, - { - "type": "pair", - "left": { - "num": "10", - "label": "Штабелирвоание с другими отправками" - }, - "right": { - "num": "11", - "label": "Штабелирвоание между собой" - } - }, - { - "type": "pair", - "left": { - "num": "9", - "label": "Наличие батарейк, газов, жидкостей, аэрозолей" - }, - "right": { - "num": "13", - "label": "Батарейки в составе груза / отдельно" - } - }, - { - "type": "pair", - "left": { - "num": "12", - "label": "MSDS" - }, - "right": { - "num": "14", - "label": "DGM" - } - }, - { - "type": "pair", - "left": { - "num": "15", - "label": "Название бренда" - }, - "right": { - "num": "16", - "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" - } - }, - { - "type": "pair", - "left": { - "num": "17", - "label": "Перелет через третью страну со сменой авинаклданых" - }, - "right": { - "num": "18", - "label": "Наличие экспортной лицезии у отправителя" - } - }, - { - "type": "pair", - "left": { - "num": "19", - "label": "Дополнительный сервис" - }, - "right": { - "num": "20", - "label": "Экспедирование в аэропорту назначения" - } - }, - { - "type": "pair", - "left": { - "num": "22", - "label": "Спец требования при доставке до адреса в РФ" - }, - "right": { - "num": "23", - "label": "Таможенное оформление" - } - }, - { - "type": "pair", - "left": { - "num": "24", - "label": "Место таможенного оформления при экспорте из РФ" - }, - "right": { - "num": "25", - "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" - } - } - ] - } - } -} \ No newline at end of file +{ + "version": 1, + "source_xlsx": "Запрос для ИИ Общий(3).xlsx", + "by_shipping_type": { + "Автомобильная перевозка (LTL)": { + "sheet": "Авто LTL интерфейс", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "19", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество грузовых мест и вес, объем" + }, + "right": { + "num": "7", + "label": "Габариты грузовых мест ДхШхВ" + } + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Штабелирвоание с другими отправками" + }, + "right": { + "num": "11", + "label": "Штабелирвоание между собой" + } + }, + { + "type": "pair", + "left": { + "num": "9", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "13", + "label": "MSDS" + }, + "right": { + "num": "14", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "15", + "label": "Название бренда" + }, + "right": { + "num": "16", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "17", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "18", + "label": "Требуется ли замена документов" + } + } + ] + }, + "Автомобильная перевозка (FTL)": { + "sheet": "Авто FTL интерфейс", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "19", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер машин" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "left_12", + "num": "8", + "label": "Габариты грузовых мест ДхШхВ" + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "11", + "label": "MSDS" + }, + "right": { + "num": "13", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "14", + "label": "Название бренда" + }, + "right": { + "num": "15", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "16", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "17", + "label": "Требуется ли замена документов" + } + } + ] + }, + "Морская перевозка (LCL)": { + "sheet": "Море, море+жд, жд LCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "19", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер машин" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Штабелирвоание с другими отправками" + }, + "right": { + "num": "11", + "label": "Штабелирвоание между собой" + } + }, + { + "type": "pair", + "left": { + "num": "9", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "13", + "label": "MSDS" + }, + "right": { + "num": "14", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "15", + "label": "Название бренда" + }, + "right": { + "num": "16", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "17", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "18", + "label": "Требуется ли замена документов" + } + } + ] + }, + "Железнодорожная перевозка (LCL)": { + "sheet": "Море, море+жд, жд LCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "19", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер машин" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Штабелирвоание с другими отправками" + }, + "right": { + "num": "11", + "label": "Штабелирвоание между собой" + } + }, + { + "type": "pair", + "left": { + "num": "9", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "13", + "label": "MSDS" + }, + "right": { + "num": "14", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "15", + "label": "Название бренда" + }, + "right": { + "num": "16", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "17", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "18", + "label": "Требуется ли замена документов" + } + } + ] + }, + "Мультимодальная перевозка море + ж/д (LCL)": { + "sheet": "Море, море+жд, жд LCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "19", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер машин" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Штабелирвоание с другими отправками" + }, + "right": { + "num": "11", + "label": "Штабелирвоание между собой" + } + }, + { + "type": "pair", + "left": { + "num": "9", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "13", + "label": "MSDS" + }, + "right": { + "num": "14", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "15", + "label": "Название бренда" + }, + "right": { + "num": "16", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "17", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "18", + "label": "Требуется ли замена документов" + } + } + ] + }, + "Морская перевозка (FCL)": { + "sheet": "Море, море+жд, жд FCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "18", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер контейнеров" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "left_12", + "num": "8", + "label": "Габариты грузовых мест ДхШхВ" + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "11", + "label": "MSDS" + }, + "right": { + "num": "13", + "label": "Technical Description of Goods in Railway Transport" + } + }, + { + "type": "pair", + "left": { + "num": "14", + "label": "Название бренда" + }, + "right": { + "num": "15", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "16", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "17", + "label": "Требуется ли замена документов" + } + }, + { + "type": "pair", + "left": { + "num": "19", + "label": "Место таможенного оформления при экспорте из РФ" + }, + "right": { + "num": "20", + "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" + } + }, + { + "type": "left_12", + "num": "21", + "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" + } + ] + }, + "Железнодорожная перевозка (FCL)": { + "sheet": "Море, море+жд, жд FCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "18", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер контейнеров" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "left_12", + "num": "8", + "label": "Габариты грузовых мест ДхШхВ" + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "11", + "label": "MSDS" + }, + "right": { + "num": "13", + "label": "Technical Description of Goods in Railway Transport" + } + }, + { + "type": "pair", + "left": { + "num": "14", + "label": "Название бренда" + }, + "right": { + "num": "15", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "16", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "17", + "label": "Требуется ли замена документов" + } + }, + { + "type": "pair", + "left": { + "num": "19", + "label": "Место таможенного оформления при экспорте из РФ" + }, + "right": { + "num": "20", + "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" + } + }, + { + "type": "left_12", + "num": "21", + "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" + } + ] + }, + "Мультимодальная перевозка море + ж/д (FCL)": { + "sheet": "Море, море+жд, жд FCL интерфейc", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "18", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество и типоразмер контейнеров" + }, + "right": { + "num": "7", + "label": "Количество грузовых мест и вес, объем" + } + }, + { + "type": "left_12", + "num": "8", + "label": "Габариты грузовых мест ДхШхВ" + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "12", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "11", + "label": "MSDS" + }, + "right": { + "num": "13", + "label": "Technical Description of Goods in Railway Transport" + } + }, + { + "type": "pair", + "left": { + "num": "14", + "label": "Название бренда" + }, + "right": { + "num": "15", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "16", + "label": "Требуется ли дополнительный сервис - фитоконтроль, иное" + }, + "right": { + "num": "17", + "label": "Требуется ли замена документов" + } + }, + { + "type": "pair", + "left": { + "num": "19", + "label": "Место таможенного оформления при экспорте из РФ" + }, + "right": { + "num": "20", + "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" + } + }, + { + "type": "left_12", + "num": "21", + "label": "Превышение габаритов дверного проема контейнеров 20DV, 40DV, 40HC" + } + ] + }, + "Авиаперевозка": { + "sheet": "Авиа Интерфейс", + "blocks": [ + { + "type": "pair", + "left": { + "num": "4", + "label": "Страна, город, адрес забора" + }, + "right": { + "num": "21", + "label": "Страна, город, точный адрес доставки, Место ТО в РФ" + } + }, + { + "type": "pair", + "left": { + "num": "6", + "label": "Количество грузовых мест и вес, объем" + }, + "right": { + "num": "7", + "label": "Габариты грузовых мест ДхШхВ" + } + }, + { + "type": "pair", + "left": { + "num": "10", + "label": "Штабелирвоание с другими отправками" + }, + "right": { + "num": "11", + "label": "Штабелирвоание между собой" + } + }, + { + "type": "pair", + "left": { + "num": "9", + "label": "Наличие батарейк, газов, жидкостей, аэрозолей" + }, + "right": { + "num": "13", + "label": "Батарейки в составе груза / отдельно" + } + }, + { + "type": "pair", + "left": { + "num": "12", + "label": "MSDS" + }, + "right": { + "num": "14", + "label": "DGM" + } + }, + { + "type": "pair", + "left": { + "num": "15", + "label": "Название бренда" + }, + "right": { + "num": "16", + "label": "Авторизационное письмо/разрешение на вывоз этих брендов из Китая" + } + }, + { + "type": "pair", + "left": { + "num": "17", + "label": "Перелет через третью страну со сменой авинаклданых" + }, + "right": { + "num": "18", + "label": "Наличие экспортной лицезии у отправителя" + } + }, + { + "type": "pair", + "left": { + "num": "19", + "label": "Дополнительный сервис" + }, + "right": { + "num": "20", + "label": "Экспедирование в аэропорту назначения" + } + }, + { + "type": "pair", + "left": { + "num": "22", + "label": "Спец требования при доставке до адреса в РФ" + }, + "right": { + "num": "23", + "label": "Таможенное оформление" + } + }, + { + "type": "pair", + "left": { + "num": "24", + "label": "Место таможенного оформления при экспорте из РФ" + }, + "right": { + "num": "25", + "label": "Наличие Фумигации на деревянной таре при экспорте из РФ" + } + } + ] + } + } +} diff --git a/proxy.py b/proxy.py index ae1d767..d0a011c 100644 --- a/proxy.py +++ b/proxy.py @@ -1,92 +1,41 @@ -import logging -import os from fastapi import FastAPI, Request from fastapi.responses import JSONResponse, Response import httpx -try: - from dotenv import load_dotenv - - load_dotenv() -except ImportError: - pass - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - app = FastAPI() -UPSTREAM_URL = os.getenv( - "LLM_UPSTREAM_URL", - "https://llm.corp.septem.pro/v1/chat/completions", -).strip() -OPENROUTER_KEY = os.getenv("OPENROUTER_API_KEY", "").strip() - - -def _client_timeout() -> httpx.Timeout: - total = float(os.getenv("LLM_PROXY_TIMEOUT_SECONDS", "120")) - connect = float(os.getenv("LLM_PROXY_CONNECT_TIMEOUT", "15")) - return httpx.Timeout(total, connect=connect) - +OPENROUTER_KEY = "sk-9cfed30eb6894df5b9a3ffb4b1fb956d" @app.post("/v1/chat/completions") async def proxy(req: Request): - if not OPENROUTER_KEY: - logger.error("OPENROUTER_API_KEY is not set (env or .env)") - return JSONResponse( - status_code=503, - content={ - "error": "Service unavailable", - "details": "Set OPENROUTER_API_KEY for the LLM proxy (or add it to .env).", - }, - ) + body = await req.json() - try: - body = await req.json() - except Exception as e: - return JSONResponse( - status_code=400, - content={"error": "Invalid JSON", "details": str(e)}, - ) - - verify = os.getenv("HTTPX_VERIFY", "true").lower() not in ("0", "false", "no") - - async with httpx.AsyncClient(verify=verify) as client: + async with httpx.AsyncClient() as client: try: r = await client.post( - UPSTREAM_URL, + "https://api.deepseek.com/chat/completions", headers={ "Authorization": f"Bearer {OPENROUTER_KEY}", - "HTTP-Referer": os.getenv("LLM_HTTP_REFERER", "http://localhost"), - "X-Title": os.getenv("LLM_PROXY_X_TITLE", "rag-engine"), + "HTTP-Referer": "http://localhost", + "model": "deepseek-v4-flash", + "X-Title": "rag-engine" }, json=body, - timeout=_client_timeout(), - ) - except httpx.RequestError as e: - logger.error( - "LLM upstream unreachable (%s): %s", - UPSTREAM_URL, - e, - exc_info=True, + timeout=300, ) + except httpx.HTTPError as e: + # Ошибка сети / таймаут return JSONResponse( status_code=502, - content={ - "error": "Bad gateway", - "details": str(e), - "upstream": UPSTREAM_URL, - "hint": "Проверьте VPN, DNS, доступность хоста и переменную LLM_UPSTREAM_URL.", - }, + content={"error": "Bad gateway", "details": str(e)}, ) - if r.status_code >= 500: - logger.warning( - "LLM upstream HTTP %s, body (prefix): %s", - r.status_code, - (r.text or "")[:800], - ) + print(r.text) + # Если бэкенд всегда отвечает JSON: + # return JSONResponse(status_code=r.status_code, content=r.json()) + + # Универсальный вариант — пробрасываем «как есть» return Response( content=r.content, status_code=r.status_code, diff --git a/shipping_types.json b/shipping_types.json new file mode 100644 index 0000000..79f28f5 --- /dev/null +++ b/shipping_types.json @@ -0,0 +1,216 @@ +[ + { + "id": 1, + "name": "Автомобильная перевозка (LTL)", + "employee_email": "denis.fomin@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "customs_clearance_place_export_rf" + ], + "mandatory_counterparty_criteria": "По макету интерфейса обязательно отражать в письме контрагенту и запрашивать у клиента при отсутствии: название клиента; Incoterms; характер/наименование груза и код ТН ВЭД; страна, город, адрес забора; страна, город, точный адрес доставки; место таможенного оформления в РФ; количество грузовых мест и вес; габариты грузовых мест (Д×Ш×В).", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество грузовых мест и вес\n7\tГабариты каждого грузового места в см или мм (длина × ширина × высота) и их вес и объём\n8\tХарактер груза или наименование груза, код ТН ВЭД\n9\tСодержатся ли в грузе батарейки, газы под давлением, жидкости\n10\tМожно ли штабелировать груз с другими отправками\n11\tЕсли груз нельзя штабелировать с другими грузами — можно ли штабелировать грузовые места между собой\n12\tЕсли груз — химия, литиевые батареи, жидкости, аэрозоли, газы или порошки — предоставить MSDS\n13\tЕсли есть батарейки — в составе груза или отдельно упакованы\n14\tЕсли груз из п.13 отгружается из материкового Китая авто транспортом — дополнительно DGM\n15\tНазвание бренда\n16\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n17\tДополнительные сервисы (фитоконтроль и т.п.)\n18\tТребуется ли замена документов\n19\tСтрана, город, точный адрес доставки\n20\tМесто таможенного оформления в РФ", + "keywords": [ + "ltl", + "сборный трак", + "догруз", + "группаж авто", + "less than truckload", + "неполная фура", + "авто ltl", + "мелкий груз авто", + "road ltl", + "partial truckload" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We are pleased to confirm the possibility of road freight (LTL) for your cargo under the following terms:\n\n- Route: (Pickup address) -> (Delivery address)\n- Cargo weight: (Cargo weight) kg\n- Number of packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo description: (Cargo description)\n- HS code: (HS code)\n- Dangerous properties: (Dangerous properties)\n- MSDS required: (MSDS required)\n- Freight cost: (Estimated cost)\n- Estimated transit time: (Transit time)\n\nTo confirm the order and issue the invoice, please reply to this email or contact your manager.\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nБлагодарим вас за обращение в компанию SEPTEM. Для расчёта автомобильной перевозки (LTL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nПожалуйста, дополните данные по вашему грузу. Вы можете ответить на это письмо или загрузить недостающие документы через личный кабинет.\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 2, + "name": "Автомобильная перевозка (FTL)", + "employee_email": "denis.fomin@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "vehicle_type", + "customs_clearance_place_export_rf" + ], + "mandatory_counterparty_criteria": "Обязательно в письме и при запросе клиенту: клиент; Incoterms; характер/наименование груза и ТН ВЭД; адрес забора; адрес доставки; место таможенного оформления в РФ; количество и типоразмер машин; вес груза в машине.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество и типоразмер машин\n7\tВес груза в машине и объём\n8\tЕсли нет данных о количестве машин — габариты каждого грузового места (Д×Ш×В в см или мм) и их вес и объём\n9\tХарактер груза или наименование груза, код ТН ВЭД\n10\tСодержатся ли в грузе батарейки, газы под давлением, жидкости\n11\tХимия, литиевые батареи, жидкости, аэрозоли, газы или порошки — MSDS\n12\tБатарейки — в составе груза или отдельно упакованы\n13\tОтгрузка из материкового Китая авто транспортом — DGM\n14\tНазвание бренда\n15\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n16\tДополнительные сервисы (фитоконтроль и т.п.)\n17\tТребуется ли замена документов\n18\tСтрана, город, точный адрес доставки\n19\tМесто таможенного оформления в РФ", + "keywords": [ + "ftl", + "полная фура", + "целая машина", + "full truckload", + "отдельный автомобиль", + "авто ftl", + "тент фура целиком", + "road ftl", + "exclusive truck" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We are pleased to confirm the possibility of road freight (FTL) for your cargo under the following terms:\n\n- Route: (Pickup address) -> (Delivery address)\n- Vehicle type: (Vehicle type)\n- Cargo weight: (Cargo weight) kg\n- Number of packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo description: (Cargo description)\n- HS code: (HS code)\n- Dangerous properties: (Dangerous properties)\n- MSDS required: (MSDS required)\n- Freight cost: (Estimated cost)\n- Transit time: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nБлагодарим за обращение в SEPTEM. Для расчёта автомобильной перевозки (FTL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nПожалуйста, дополните данные по грузу.\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 3, + "name": "Морская перевозка (LCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "stackable_with_others" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество мест и вес; габариты Д×Ш×В; возможность штабелирования с другими отправками.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество грузовых мест и вес с объёмом\n7\tГабариты каждого грузового места (Д×Ш×В в см или мм) и их вес и объём\n8\tХарактер груза или наименование, код ТН ВЭД\n9\tБатарейки, газы, газы под давлением, жидкости в грузе\n10\tМожно ли штабелировать груз с другими отправками\n11\tЕсли нельзя с другими — можно ли штабелировать места между собой\n12\tХимия, литиевые батареи, жидкости, аэрозоли, газы, порошки — MSDS\n13\tБатарейки — в составе или отдельно\n14\tОтгрузка из материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n15\tНазвание бренда\n16\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n17\tДополнительные сервисы (фитоконтроль и т.п.)\n18\tСтрана, город, точный адрес доставки\n\nПрименимо к морской сборной перевозке (LCL): порт погрузки/выгрузки и морской этап явно указаны в переписке; без доминирования ж/д как основного этапа.", + "keywords": [ + "море lcl", + "морская сборная", + "морской lcl", + "sea lcl", + "сборный морской", + "консолидация море", + "groupage sea", + "lcl порт", + "морской группаж", + "неполный контейнер море" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm the possibility of sea freight (LCL) under the following terms:\n\n- Route: (Port of loading) -> (Port of discharge)\n- Shipment type: LCL\n- Cargo weight: (Cargo weight) kg\n- Packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo: (Cargo description)\n- HS code: (HS code)\n- Dangerous properties: (Dangerous properties)\n- MSDS: (MSDS required)\n- Freight: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта морской сборной перевозки (LCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nПожалуйста, дополните данные.\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 4, + "name": "Железнодорожная перевозка (LCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "stackable_with_others" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество мест и вес; габариты; штабелирование с другими отправками.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество грузовых мест и вес с объёмом\n7\tГабариты каждого грузового места (Д×Ш×В в см или мм) и их вес и объём\n8\tХарактер груза или наименование, код ТН ВЭД\n9\tБатарейки, газы, газы под давлением, жидкости в грузе\n10\tМожно ли штабелировать груз с другими отправками\n11\tЕсли нельзя с другими — можно ли штабелировать места между собой\n12\tХимия, литиевые батареи, жидкости, аэрозоли, газы, порошки — MSDS\n13\tБатарейки — в составе или отдельно\n14\tОтгрузка из материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n15\tНазвание бренда\n16\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n17\tДополнительные сервисы (фитоконтроль и т.п.)\n18\tСтрана, город, точный адрес доставки\n\nПрименимо к ж/д сборной перевозке (LCL): станции/терминалы ж/д, контейнер сборный по ж/д; морской этап в запросе не основной.", + "keywords": [ + "жд lcl", + "ж/д lcl", + "rail lcl", + "сборный контейнер жд", + "сборная жд", + "lcl поезд", + "группаж жд", + "железная дорога сборный" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm rail freight (LCL) under the following terms:\n\n- Route: (Pickup address) -> (Delivery address)\n- Shipment type: LCL\n- Weight: (Cargo weight) kg\n- Packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo: (Cargo description)\n- HS: (HS code)\n- MSDS: (MSDS required)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта железнодорожной сборной перевозки (LCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 5, + "name": "Мультимодальная перевозка море + ж/д (LCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "stackable_with_others" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество мест и вес; габариты; штабелирование с другими отправками.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество грузовых мест и вес с объёмом\n7\tГабариты каждого грузового места (Д×Ш×В в см или мм) и их вес и объём\n8\tХарактер груза или наименование, код ТН ВЭД\n9\tБатарейки, газы, газы под давлением, жидкости в грузе\n10\tМожно ли штабелировать груз с другими отправками\n11\tЕсли нельзя с другими — можно ли штабелировать места между собой\n12\tХимия, литиевые батареи, жидкости, аэрозоли, газы, порошки — MSDS\n13\tБатарейки — в составе или отдельно\n14\tОтгрузка из материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n15\tНазвание бренда\n16\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n17\tДополнительные сервисы (фитоконтроль и т.п.)\n18\tСтрана, город, точный адрес доставки\n\nКритерии как для сборного груза при цепочке море и ж/д (интермодаль): в переписке явно присутствуют и морской, и железнодорожный этапы.", + "keywords": [ + "море жд", + "море+жд", + "море и жд", + "sea rail", + "интермодальн", + "multimodal lcl", + "морской и жд этап", + "порт и станция сборный" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm multimodal sea+rail (LCL) under the following terms:\n\n- Route: (Pickup address) -> (Delivery address)\n- Modes: sea + rail (LCL)\n- Weight: (Cargo weight) kg\n- Packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo: (Cargo description)\n- HS: (HS code)\n- MSDS: (MSDS required)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта мультимодальной перевозки (море + ж/д, LCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 6, + "name": "Морская перевозка (FCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "container_type" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество и типоразмер контейнеров; вес груза в контейнере.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество и типоразмер контейнеров\n7\tВес груза в контейнере и объём\n8\tЕсли нет данных о контейнерах — габариты каждого грузового места (Д×Ш×В) и их вес и объём\n9\tХарактер груза или наименование, код ТН ВЭД\n10\tБатарейки, газы, жидкости\n11\tMSDS при необходимости\n12\tБатарейки в составе или отдельно\n13\tИз материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n14\tНазвание бренда\n15\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n16\tДополнительные сервисы (крепление в контейнере, фитосанитарный контроль и т.п.)\n17\tТребуется ли замена документов\n18\tСтрана, город, точный адрес доставки\n19\tМесто таможенного оформления при экспорте из РФ\n20\tФумигация деревянной тары при экспорте из РФ\n21\tПроверка габаритов грузовых мест на проходимость в дверной проём контейнеров 20DV, 40DV, 40HC\n\nМорской FCL: ISO-контейнеры под морской фрахт и погрузку на судно.", + "keywords": [ + "морской fcl", + "море fcl", + "sea fcl", + "полный контейнер море", + "морской контейнер", + "fcl порт", + "цельный контейнер море", + "ocean fcl" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm sea freight (FCL):\n\n- Port: (Port of loading) -> (Port of discharge)\n- Container: (Container type)\n- Weight: (Cargo weight) kg\n- Cargo: (Cargo description)\n- HS: (HS code)\n- MSDS/IMDG: (MSDS required)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта морской перевозки (FCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 7, + "name": "Железнодорожная перевозка (FCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "container_type" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество и типоразмер контейнеров; вес груза в контейнере.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество и типоразмер контейнеров\n7\tВес груза в контейнере и объём\n8\tЕсли нет данных о контейнерах — габариты каждого грузового места (Д×Ш×В) и их вес и объём\n9\tХарактер груза или наименование, код ТН ВЭД\n10\tБатарейки, газы, жидкости\n11\tMSDS при необходимости\n12\tБатарейки в составе или отдельно\n13\tИз материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n14\tНазвание бренда\n15\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n16\tДополнительные сервисы (крепление в контейнере, фитосанитарный контроль и т.п.)\n17\tТребуется ли замена документов\n18\tСтрана, город, точный адрес доставки\n19\tМесто таможенного оформления при экспорте из РФ\n20\tФумигация деревянной тары при экспорте из РФ\n21\tПроверка габаритов грузовых мест на проходимость в дверной проём контейнеров 20DV, 40DV, 40HC\n\nЖ/д FCL: ISO 20'/40' на платформах/вагонных комплектах (1520 мм); без обязательного морского этапа.", + "keywords": [ + "жд fcl", + "ж/д fcl", + "rail fcl", + "контейнер по жд целый", + "полный контейнер жд", + "fcl поезд", + "вагон контейнер" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm rail freight (FCL):\n\n- Route: (Pickup address) -> (Delivery address)\n- Container: (Container type)\n- Weight: (Cargo weight) kg\n- Cargo: (Cargo description)\n- HS: (HS code)\n- MSDS: (MSDS required)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта железнодорожной перевозки (FCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 8, + "name": "Мультимодальная перевозка море + ж/д (FCL)", + "employee_email": "marina.eremina@timnet.ch, ekaterina.kochenkova@timnet.ch, Yana.Schkabrova@timnet.ch", + "extra_required_fields": [ + "hs_code", + "container_type" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество и типоразмер контейнеров; вес груза в контейнере.", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество и типоразмер контейнеров\n7\tВес груза в контейнере и объём\n8\tЕсли нет данных о контейнерах — габариты каждого грузового места (Д×Ш×В) и их вес и объём\n9\tХарактер груза или наименование, код ТН ВЭД\n10\tБатарейки, газы, жидкости\n11\tMSDS при необходимости\n12\tБатарейки в составе или отдельно\n13\tИз материкового Китая по ж/д — Technical Description of Goods in Railway Transport\n14\tНазвание бренда\n15\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n16\tДополнительные сервисы (крепление в контейнере, фитосанитарный контроль и т.п.)\n17\tТребуется ли замена документов\n18\tСтрана, город, точный адрес доставки\n19\tМесто таможенного оформления при экспорте из РФ\n20\tФумигация деревянной тары при экспорте из РФ\n21\tПроверка габаритов грузовых мест на проходимость в дверной проём контейнеров 20DV, 40DV, 40HC\n\nМультимодальная перевозка море + ж/д (FCL): в запросе явно сочетаются морской и ж/д этапы с полным контейнером (интермодаль).", + "keywords": [ + "море жд fcl", + "море+жд fcl", + "sea rail fcl", + "интермодальн fcl", + "контейнер море и жд", + "порт станция fcl" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm multimodal sea+rail (FCL):\n\n- Route: (Port of loading) / rail -> (Delivery address)\n- Container: (Container type)\n- Weight: (Cargo weight) kg\n- Cargo: (Cargo description)\n- HS: (HS code)\n- MSDS: (MSDS required)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта мультимодальной перевозки (море + ж/д, FCL) нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + }, + { + "id": 9, + "name": "Авиаперевозка", + "employee_email": "evgeniy.domashnev@timnet.ch, olga.ermakova@timnet.ch, andrey.reshetnyak@timnet.ch, anastasia.fatkina@timnet.ch", + "extra_required_fields": [ + "hs_code", + "stackable_with_others", + "total_volume_cbm", + "dangerous_goods_clarification", + "customs_clearance_place_export_rf" + ], + "mandatory_counterparty_criteria": "Обязательно: клиент; Incoterms; характер груза и ТН ВЭД; адрес забора; адрес доставки; количество мест, вес и объём; габариты Д×Ш×В; штабелирование с другими отправками; сведения о батарейках, газах, жидкостях, аэрозолях; место таможенного оформления при экспорте из РФ (и прочие пункты чек-листа авиа по полному criteria).", + "criteria": "1\tНазвание клиента\n2\tУсловия поставки Incoterms\n3\tДата готовности груза\n4\tСтрана, город, адрес забора\n5\tСтоимость груза\n6\tКоличество грузовых мест, вес, объём\n7\tГабариты каждого грузового места (Д×Ш×В в см или мм)\n8\tХарактер груза или наименование, код ТН ВЭД\n9\tБатарейки, газы, жидкости, хладоагенты, сухой лёд\n10\tШтабелирование с другими отправками\n11\tШтабелирование мест между собой\n12\tMSDS при химии, батареях, жидкостях, аэрозолях, порошках\n13\tБатарейки — в составе или отдельно\n14\tБатарейки и вылет из материкового Китая — DGM (Dangerous Goods Management) report\n15\tНазвание бренда\n16\tЕсли бренд зарегистрирован в таможенной системе Китая — есть ли у отправителя авторизационное письмо/разрешение на вывоз бренда\n17\tПерелёт через третью страну со сменой авианакладных\n18\tЭкспортная лицензия у отправителя\n19\t Дополнительные сервисы (фитоконтроль и т.п.)\n20\tКто осуществляет экспедирование в аэропорту прибытия (терминал, сборы авиакомпании)\n21\tСтрана, город, точный адрес доставки\n22\tВывоз из аэропорта — особые требования к автотранспорту, время подачи\n23\tНужно ли таможенное оформление\n24\tМесто таможенного оформления при экспорте из РФ\n25\tФумигация деревянной тары при экспорте из РФ", + "keywords": [ + "авиа", + "авиаперевозка", + "самолёт", + "air freight", + "air cargo", + "аэропорт", + "flight", + "авианакладная", + "awb" + ], + "confirmation_template": "Dear Partner!\n\nThank you for contacting SEPTEM. We confirm air freight:\n\n- Route: (Pickup address) -> (Delivery address)\n- Weight: (Cargo weight) kg\n- Packages: (Number of packages)\n- Volume: (Volume) m3\n- Dimensions: (Dimensions)\n- Cargo: (Cargo description)\n- HS: (HS code)\n- Dangerous goods: (Dangerous properties)\n- MSDS: (MSDS required)\n- DGM (при опасном грузе / вылет из материкового Китая — по правилам перевозчика)\n- Cost: (Estimated cost)\n- Transit: (Transit time)\n\nBest regards,\nSEPTEM Cargo Team", + "info_request_template": "Уважаемый (Клиент)!\n\nДля расчёта авиаперевозки нам необходима следующая информация:\n\n(Необходимая информация)\n\nС уважением,\nКоманда SEPTEM Cargo" + } +]