بازه‌های زمانی ارسال و ثبت دو مرحله‌ای (Shipping Time Window)

۴ از ۱۱v1.2.0

پیش‌نیاز: داشتن access_token و در اختیار داشتن اطلاعات زمان آماده‌سازی مرسوله، مبدأ، مقصد و برآورد فیزیکی محموله.

خروجی مرحله اول: دریافت یک یا چند بازه قابل ارائه برای جمع‌آوری و تحویل، به همراه یک token اختصاصی برای هر گزینه.

خروجی مرحله دوم: ثبت قطعی مرسوله از طریق API اصلی ثبت سفارش با استفاده از توکن گزینه انتخاب‌شده.

سرویس Shipping Time Window برای کانساینرهایی طراحی شده است که می‌خواهند پیش از ثبت نهایی مرسوله، بازه‌های واقعی و قابل ارائه دیجی‌اکسپرس را به مشتری نهایی خود نمایش دهند تا مشتری بتواند زمان تحویل را انتخاب کند.

این API به‌تنهایی هیچ Shipment یا Parcel جدیدی ایجاد نمی‌کند و جایگزین API ثبت سفارش نیست. این سرویس صرفاً بر اساس اطلاعاتی مانند زمان آماده بودن بار، مبدأ، مقصد، ماهیت فیزیکی مرسوله، ظرفیت عملیاتی و روزهای تعطیل کانساینر، گزینه‌های قابل ارائه را محاسبه می‌کند.

برای هر گزینه، یک توکن اختصاصی در پاسخ برگردانده می‌شود. پس از انتخاب بازه توسط مشتری، کانساینر باید توکن همان گزینه را همراه با اطلاعات ثبت سفارش به API اصلی Register Shipment ارسال کند.

تفاوت ثبت تک‌مرحله‌ای و ثبت با انتخاب بازه زمانی

۳ ردیف
مدل پیاده‌سازیاطلاعات ارسالی توسط کانساینررفتار سیستم
ثبت بدون نمایش بازه زمانی فقط با Ready Dateکانساینر فقط cargo_ready_date_time را ارسال می‌کند.سیستم بر اساس زمان آماده‌سازی، مبدأ، مقصد و ظرفیت عملیاتی، اولین بازه ممکن برای جمع‌آوری و تحویل را انتخاب می‌کند. نتیجه نهایی مسیریابی از طریق وب‌هوک اطلاع‌رسانی می‌شود.
ثبت بدون نمایش بازه زمانی با Ready Date و Promise Dateکانساینر علاوه بر cargo_ready_date_time، بازه promise_start_date_time و promise_end_date_time موردنظر خود را نیز ارسال می‌کند.سیستم بررسی می‌کند که آیا با توجه به زمان آماده‌سازی، مبدأ، مقصد و ظرفیت موجود، امکان تحویل در بازه درخواستی وجود دارد یا خیر. در صورت وجود مسیر، نتیجه موفق و در صورت نبود مسیر یا ظرفیت، نتیجه ناموفق از طریق وب‌هوک اعلام می‌شود.
ثبت با نمایش بازه‌های واقعی دیجی‌اکسپرسابتدا API مربوط به Shipping Time Window فراخوانی می‌شود و بازه‌های واقعی به مشتری نمایش داده می‌شوند.پس از انتخاب یک بازه توسط مشتری، توکن همان گزینه در API ثبت سفارش استفاده شده و مسیر انتخاب‌شده به‌صورت همزمان نهایی می‌شود.

در دو حالت اول، مشتری نهایی الزاماً بازه‌های واقعی دیجی‌اکسپرس را مشاهده نمی‌کند و فرآیند یافتن مسیر پس از ثبت سفارش انجام می‌شود.

در حالت سوم، مشتری پیش از ثبت نهایی سفارش یکی از بازه‌های واقعی قابل ارائه را انتخاب می‌کند و توکن گزینه انتخاب‌شده مبنای ثبت نهایی قرار می‌گیرد.

فرآیند کلی ثبت با Shipping Time Window

فرآیند ثبت سفارش با انتخاب بازه زمانی شامل مراحل زیر است:

  • کانساینر اطلاعات زمان آماده‌سازی، مبدأ، مقصد و برآورد فیزیکی مرسوله را به API مربوط به Shipping Time Window ارسال می‌کند.
  • دیجی‌اکسپرس یک یا چند گزینه قابل ارائه را در آرایه options برمی‌گرداند.
  • کانساینر بازه تحویل هر گزینه، یعنی promise_start_date_time و promise_end_date_time، را به مشتری نهایی نمایش می‌دهد.
  • مشتری یکی از گزینه‌ها را انتخاب می‌کند.
  • کانساینر token، همان گزینه را در API اصلی ثبت سفارش ارسال می‌کند.
  • در مرحله ثبت نهایی، کانساینر باید یکی از دو روش زیر را انتخاب کند:
  • ثبت با پارسل‌های مشخص یا Specified Parcels
  • ثبت با ظرفیت تخمینی یا Estimated Capacity

دریافت بازه‌های زمانی قابل ارسال

Get Shipping Time Windows

POSThttps://api-demo.digiexpress.ir/api/v2/shipping-time-window-request

این API یک سرویس استعلامی است. فراخوانی موفق آن به معنی ثبت سفارش نیست و هیچ shipment_id یا parcel_id جدیدی ایجاد نمی‌کند.

هر بار فراخوانی این API توکن‌‌های جدیدی تولید می‌کند؛ بنابراین کانساینر باید توکن همان گزینه‌ای را ذخیره کند که مشتری در آخرین استعلام معتبر انتخاب کرده است.

ساختار درخواست Shipping Time Window

ساختار زیر تمام فیلدهای قابل استفاده را نمایش می‌دهد. در درخواست واقعی:

برای مبدأ فقط یکی از origin_point_id یا origin_address ارسال شود.

برای مقصد فقط یکی از destination_point_id یا destination_address ارسال شود.

json
{
  "cargo_ready_date_time": "string",
  "origin_point_id": "string",
  "origin_address": {
    "city_id": "string",
    "full_address": "string",
    "building_number": "string",
    "unit": "string",
    "postal_code": "string",
    "latitude": "string",
    "longitude": "string",
    "description": "string"
  },
  "destination_point_id": "string",
  "destination_address": {
    "city_id": "string",
    "full_address": "string",
    "building_number": "string",
    "unit": "string",
    "postal_code": "string",
    "latitude": "string",
    "longitude": "string",
    "description": "string"
  },
  "all_parcels_as_single_box_estimated_max_dimensions_cm": [
    "string",
    "string",
    "string"
  ],
  "all_parcels_as_single_box_estimated_max_weight_grams": "string",
  "each_parcel_size_tier": "NORMAL",
  "off_day_dates": [
    "YYYY-MM-DD"
  ]
}

جدول پارامترهای اصلی درخواست

۹ ردیف
cargo_ready_date_time
نوع دادهstringوضعیتاجباری
توضیح فنی
زمان آماده بودن بسته زمان ارسال شده نمی‌تواند در گذشته باشد. (فرمت: YYYY-MM-DD HH:MM:SS)
توضیح بیزینسی
زمان دقیق آماده بودن بسته در انبار فرستنده؛ سیستم دیجی‌اکسپرس اولین بازه جمع آوری ممکن بعد از این تاریخ را برای شما پیدا می‌کند.
origin_point_id
نوع دادهstringوضعیتاجباری مشروط
توضیح فنی
ID هاب دیجی‌اکسپرس (در صورت تحویل مستقیم به هاب، با تیم دیجی‌اکسپرس هماهنگ کنید). برای تعیین مبدأ، فقط یکی از origin_point_id یا origin_address باید ارسال شود. ارسال همزمان هر دو مجاز نیست.
توضیح بیزینسی
در صورتی که بار را خودتان مستقیماً به یکی از هاب‌های شناخته‌شده دیجی‌اکسپرس تحویل می‌دهید، آیدی آن هاب را وارد می‌کنید تا فرآیند جمع‌آوری (پیکاپ) سیستماتیک حذف شود.
origin_address
نوع دادهobjectوضعیتاجباری مشروط
توضیح فنی
اطلاعات کامل آدرس مبدأ. در محیط دمو مبدأ باید همیشه تهران باشد. (جزییات بیشتر در جدول پارامترها در ادامه ) برای تعیین مبدأ، فقط یکی از origin_point_id یا origin_address باید ارسال شود. ارسال همزمان هر دو مجاز نیست.
توضیح بیزینسی
محل دقیق جمع‌آوری سفارش توسط راننده دیجی‌اکسپرس (لوکیشن انبار یا مغازه شما) هر شیپمنت باید یک آدرس جمع‌آوری مشخص داشته باشد.
destination_point_id
نوع دادهstringوضعیتاجباری مشروط
توضیح فنی
مشابه origin_point_id برای مقصد. برای تعیین مقصد نیز فقط یکی از destination_point_id یا destination_address باید ارسال شود. ارسال همزمان هر دو مجاز نیست.
توضیح بیزینسی
در موارد خاص لجستیکی که مقصد نهایی تحویل، یکی از لاکرها یا هاب‌های مشخص دیجی‌اکسپرس باشد استفاده می‌شود.
destination_address
نوع دادهobjectوضعیتاجباری مشروط
توضیح فنی
اطلاعات کامل آدرس مقصد. در محیط دمو مقصد باید همیشه چیتگر باشد. (جزییات بیشتر در جدول پارامترها در ادامه ) برای تعیین مقصد نیز فقط یکی از destination_point_id یا destination_address باید ارسال شود. ارسال همزمان هر دو مجاز نیست.
توضیح بیزینسی
محل دقیق تحویل نهایی سفارش به مشتری هر شیپمنت باید یک آدرس تحویل مشخص داشته باشد.
all_parcels_as_single_box_estimated_max_dimensions_cm
نوع دادهarray[string]وضعیتاجباری
توضیح فنی
آرایه سه‌عضوی ابعاد تخمینی کل مرسوله به‌صورت [طول، عرض، ارتفاع] بر حسب سانتی‌متر.
توضیح بیزینسی
تمام کالاهای سفارش به‌صورت یک جعبه فرضی واحد در نظر گرفته می‌شوند تا فضای کلی موردنیاز مرسوله تخمین زده شود.
all_parcels_as_single_box_estimated_max_weight_grams
نوع دادهstringوضعیتاجباری
توضیح فنی
وزن کل تخمینی تمام پارسل‌ها بر حسب گرم.
توضیح بیزینسی
وزن تقریبی کل کالاهایی که قرار است در این Shipment ارسال شوند. این مقدار در کنترل ظرفیت روزهای قابل ارائه استفاده می‌شود.
each_parcel_size_tier
نوع دادهstringوضعیتاجباری
توضیح فنی
گروه سایز هر پارسل. مقادیر مجاز فعلی: NORMAL، MEDIUM و LARGE.
توضیح بیزینسی
سیستم بر اساس این مقدار نوع مسیر، ظرفیت و ناوگان مناسب را بررسی می‌کند. پارسل‌های ثبت‌شده در مرحله بعد باید با این گروه سایز سازگار باشند.
off_day_dates
نوع دادهarray[string]وضعیتاختیاری
توضیح فنی
آرایه تاریخ‌هایی با فرمت YYYY-MM-DD.
توضیح بیزینسی
روزهایی که کانساینر در مبدأ امکان تحویل بار به ناوگان یا انجام پیکاپ را ندارد. سیستم این روزها را در محاسبه زمان جمع‌آوری و در نتیجه زمان تحویل لحاظ می‌کند.

جدول پارامترهای هر آیتم در origin_address - destination_address

۸ ردیف
city_id
نوعstringوضعیتاجباری
توضیح
شناسه شهر (از API get_cities دریافت کنید).
توضیح بیزینس
کد سیستمی شهر مبدأ یا مقصد. برای جلوگیری از خطا، حتماً ابتدا سرویس عمومی دریافت شهرها را صدا بزنید و آیدی دقیق همان شهر را اینجا بفرستید.
full_address
نوعstringوضعیتاجباری
توضیح
آدرس کامل متنی
توضیح بیزینس
نشانی دقیق پستی که راننده برای پیدا کردن محل جمع‌آوری (مبدا) یا تحویل (مقصد) روی نقشه و به صورت فیزیکی به آن مراجعه می‌کند.
latitude
نوعstringوضعیتاختیاری
توضیح
عرض جغرافیایی آدرس مبدأ. این فیلد اختیاری است، اما در صورت در دسترس بودن مختصات دقیق مبدأ، قویاً توصیه می‌شود ارسال شود تا محل Pickup با دقت بیشتری شناسایی شود.
توضیح بیزینس
لوکیشن دقیق روی نقشه. اگر این فیلد را نفرستید، سیستم لوکیشن متنی شما را به مختصات تبدیل می‌کند؛ اما ارسال آن به مسیریابی دقیق‌تر راننده کمک پیش‌فرض می‌کند.
longitude
نوعstringوضعیتاختیاری
توضیح
طول جغرافیایی آدرس مبدأ. این فیلد اختیاری است، اما در صورت در دسترس بودن مختصات دقیق مبدأ، قویاً توصیه می‌شود همراه با latitude ارسال شود تا محل Pickup با دقت بیشتری شناسایی شود.
توضیح بیزینس
لوکیشن دقیق روی نقشه (مکمل فیلد latitude) جهت ناوبری دقیق‌تر رانندگان لجستیک.
postal_code
نوعstringوضعیتاختیاری
توضیح
کد پستی
توضیح بیزینس
کد پستی محل مبدأ یا مقصد که جهت صحه‌گذاری روی آدرس استفاده می‌شود، اما برای ثبت سفارش الزامی و اجباری نیست.
building_number
نوعstringوضعیتاختیاری
توضیح
شماره پلاک
توضیح بیزینس
شماره پلاک ملک جهت تفکیک دقیق ساختمان در کوچه یا خیابان اصلی.
unit
نوعstringوضعیتاختیاری
توضیح
شماره واحد
توضیح بیزینس
شماره واحد یا طبقه در ساختمان‌های چندواحدی جهت دسترسی سریع‌تر توزیع‌کننده.
description
نوعstringوضعیتاختیاری
توضیح
توضیحات تکمیلی آدرس
توضیح بیزینس
کروکی متنی یا نکات خاص آدرس (مانند: "زنگ سمت راست"، "مغازه نبش کوچه" یا "تحویل به نگهبانی") جهت راهنمایی راننده.

جدول ماتریس سایزبندی بسته‌ها (Parcel Size Tier)

۳ ردیف
دسته سایز (Tier)محدودیت‌های ابعادی فیزیکیمحدودیت وزنیتوضیح لجستیکی و بیزینسی
NORMAL• بزرگ‌ترین ضلع: حداکثر 64 سانتی‌متر • ضلع دوم: حداکثر 44 سانتی‌متر • ضلع سوم: حداکثر 34 سانتی‌مترحداکثر 14,999 گرم (کمتر از 15 کیلوگرم)بسته‌های استاندارد و کوچک‌سایز که معمولاً ظرفیت حمل آن‌ها با موتور یا خودروهای سواری کوچک وجود دارد.
MEDIUMهر بسته‌ای که شرایط NORMAL را نداشته باشد و در محدوده خط‌قرمزهای LARGE نیز قرار نگیرد.هر بسته‌ای که از نظر وزن در محدوده NORMAL نباشد، اما طبق قوانین سیستم در دسته LARGE هم قرار نگیرد.بسته‌های متوسط که فراتر از ابعاد موتور سیکلت هستند اما نیاز به تجهیزات حمل کالاهای فوق‌سنگین (Large) ندارند.
LARGE• حداقل یکی از ابعاد بیشتر از 140 سانتی‌متر باشد؛ یا• وزن Parcel بیشتر از 40 کیلوگرم باشد.کالاهای فوق سنگین، حجیم یا با ابعاد نامتعارف (کالای بزرگ‌سایز) که حمل آن‌ها نیازمند خودروهای باری اختصاصی (مانند وانت) است.

یک Parcel در صورتی در دسته LARGE قرار می‌گیرد که حداقل یکی از شرایط زیر برقرار باشد: حداقل یکی از ابعاد بیشتر از 140 سانتی‌متر باشد؛ یا وزن Parcel بیشتر از 40 کیلوگرم باشد.

نکته درباره برآورد فیزیکی مرسوله

برآورد وزن و ابعاد در این API برای تعیین موارد زیر استفاده می‌شود:

  • تشخیص ماهیت و گروه سایز مرسوله
  • بررسی ظرفیت وزنی و حجمی مسیرها
  • حذف روزهایی که ظرفیت کافی برای مرسوله وجود ندارد
  • تعیین بازه‌های واقعی قابل ارائه به مشتری

این اطلاعات باعث ایجاد پارسل نمی‌شوند. در مرحله ثبت نهایی همچنان باید یکی از این دو روش استفاده شود:

  • ارسال مشخصات واقعی تمام پارسل‌ها در آرایه parcels
  • ارسال ظرفیت تخمینی در max_shipment_capacity_estimation_for_pre_reservation

همچنین گروه سایز اعلام‌شده باید با پارسل‌های مرحله ثبت نهایی سازگار باشد. برای مثال، اگر در مرحله دریافت Time Window مقدار NORMAL اعلام شده باشد، نباید در مرحله ثبت یا افزودن پارسل، بسته‌ای با مشخصات گروه LARGE برای همان مرسوله ارسال شود.

ساختار پاسخ موفق Shipping Time Window

Response Body (HTTP 200)

json
{
  "options": [
    {
      "token": "string",
      "promise_start_date_time": "string",
      "promise_end_date_time": "string",
      "pickup_start_date_time": "string",
      "pickup_end_date_time": "string",
      "expires_at_date_time": "string",
      "route_start_date_time_cut_off": "string",
      "service_level": "STANDARD"
    }
  ]
}

جدول پارامترهای خروجی Shipping Time Window

۹ ردیف
options
نوع دادهarray
توضیح فنی
آرایه گزینه‌های قابل ارائه برای مرسوله.
توضیح بیزینسی
تمام زمان‌هایی که دیجی‌اکسپرس در لحظه استعلام و با توجه به اطلاعات درخواست می‌تواند ارائه کند.
token
نوع دادهstring
توضیح فنی
توکن اختصاصی گزینه.
توضیح بیزینسی
نماینده همان ترکیب زمان تحویل، زمان پیکاپ، مسیر و سطح سرویس است. این مقدار باید در API ثبت سفارش استفاده شود.
promise_start_date_time
نوع دادهstring
توضیح فنی
شروع بازه تعهد تحویل به گیرنده.
توضیح بیزینسی
اولین زمان قابل تعهد برای تحویل سفارش به مشتری نهایی.
promise_end_date_time
نوع دادهstring
توضیح فنی
پایان بازه تعهد تحویل به گیرنده.
توضیح بیزینسی
آخرین زمان بازه‌ای که سفارش در آن به مشتری تحویل داده خواهد شد.
pickup_start_date_time
نوع دادهstring
توضیح فنی
شروع بازه جمع‌آوری مرسوله از مبدأ.
توضیح بیزینسی
اولین زمان برنامه‌ریزی‌شده برای مراجعه ناوگان به محل کانساینر.
pickup_end_date_time
نوع دادهstring
توضیح فنی
پایان بازه جمع‌آوری مرسوله از مبدأ.
توضیح بیزینسی
پایان بازه‌ای که پیکاپ در آن انجام می‌شود.
expires_at_date_time
نوع دادهstring
توضیح فنی
زمان دقیق انقضای توکن.
توضیح بیزینسی
پس از این زمان، توکن برای ثبت سفارش قابل اتکا نیست و باید استعلام جدید انجام شود.
.route_start_date_time_cut_off
نوع دادهstring
توضیح فنی
حد زمانی عملیاتی مربوط به نهایی‌سازی گزینه و شروع روت.
توضیح بیزینسی
کانساینر باید این زمان را در فرآیند خود رعایت کند. پس از عبور از این محدودیت، امکان حفظ همان گزینه تضمین نمی‌شود.
service_level
نوع دادهstring
توضیح فنی
سطح سرویس گزینه، مانند STANDARD.
توضیح بیزینسی
نوع سرویس حملی که زمان‌های اعلام‌شده بر اساس آن محاسبه شده‌اند. همین مقدار باید در ثبت نهایی سفارش ارسال شود.

قوانین اعتبار و مصرف توکن

  • هر گزینه در آرایه options دارای یک token مستقل است.
  • توکن فقط تا زمان اعلام‌شده در expires_at_date_time معتبر است.
  • سیستم کانساینر نباید برای اعتبار توکن یک مدت ثابت، مانند 24 ساعت، در نظر بگیرد؛ همیشه باید زمان دقیق برگشتی در expires_at_date_time ملاک قرار گیرد.
  • محدودیت route_start_date_time_cut_off نیز باید در کنار زمان انقضای توکن رعایت شود.
  • در صورت منقضی شدن توکن یا عبور از محدودیت عملیاتی گزینه، API مربوط به Shipping Time Window باید مجدداً فراخوانی شود.
  • هر فراخوانی جدید ممکن است توکن‌های جدیدی تولید کند؛ بنابراین از ذخیره یا استفاده طولانی‌مدت از توکن‌های قدیمی خودداری شود.
  • دریافت توکن به‌تنهایی به معنی ثبت یا رزرو نهایی Shipment نیست. ثبت قطعی فقط پس از فراخوانی موفق API ثبت سفارش انجام می‌شود.
  • پس از ثبت موفق سفارش با یک توکن، همان توکن نباید برای ایجاد Shipment دیگری استفاده شود.
۳ ردیف
token
وضعیت در Final Registerاجباری
نحوه مقداردهی
توکن گزینه انتخاب‌شده در Shipping Time Window
parcels
وضعیت در Final Registerاجباری فقط در روش Specified Parcels
نحوه مقداردهی
مشخصات واقعی تمام پارسل‌ها
max_shipment_capacity_estimation_for_pre_reservation
وضعیت در Final Registerاجباری فقط در روش Estimated Capacity
نحوه مقداردهی
ظرفیت تخمینی مرسوله

اطلاعاتی که در مرحله Shipping Time Window داخل Token ثبت و Lock شده‌اند، در Final Register نباید مجددا در Body ارسال شوند. این موارد شامل cargo_ready_date_time، اطلاعات مبدأ، اطلاعات مقصد، promise_start_date_time، promise_end_date_time و service_level هستند.

در Final Register، علاوه بر اطلاعات عمومی موردنیاز ثبت سفارش، token گزینه انتخاب‌شده ارسال می‌شود و بر اساس روش ثبت، فقط یکی از parcels یا max_shipment_capacity_estimation_for_pre_reservation مقداردهی می‌شود.

ارسال همزمان parcels و max_shipment_capacity_estimation_for_pre_reservation مجاز نیست؛ این دو روش در ساختار فعلی ثبت سفارش نیز به‌عنوان روش‌های مجزا تعریف شده‌اند.

نهایی‌سازی سفارش با توکن انتخاب‌شده

پس از انتخاب گزینه توسط مشتری، کانساینر باید API اصلی ثبت سفارش را فراخوانی کند:

text
Method: POST
Endpoint: https://api-demo.digiexpress.ir/api/v2/shipments
Authorization: <access_token>

در این مرحله، اطلاعات پایه ثبت سفارش مطابق بخش اصلی Register Shipment ارسال می‌شوند. علاوه بر آن، فیلدهای زیر باید بر اساس گزینه انتخاب‌شده مقداردهی شوند:

روش اول: ثبت با پارسل‌های مشخص و Time Window

Register with Specified Parcels and Selected Time Window

این روش زمانی استفاده می‌شود که در لحظه ثبت نهایی، تعداد، وزن، ابعاد و مشخصات تمام پارسل‌ها معلوم است.

در این حالت:

  • آرایه parcels باید ارسال شود.
  • آبجکت max_shipment_capacity_estimation_for_pre_reservation نباید ارسال شود.
  • توکن و زمان‌های گزینه انتخاب‌شده باید در همان درخواست قرار گیرند.
  • پس از ثبت موفق، امکان اضافه یا حذف کردن پارسل‌های این Shipment وجود ندارد.

ساختار درخواست

فیلدهای Token-bound در این ساختار ارسال نمی‌شوند؛ زمان آماده‌سازی، اطلاعات مبدأ، اطلاعات مقصد، بازه تعهد و service_level داخل token قرار دارند.

json
{
  "consignor_unique_reference_id": "string",
  "revive_if_already_registered_and_failed": true,
  "order_number": "string",
  "cargo_submitter_person": {
    "first_name": "string",
    "last_name": "string",
    "national_code": "string",
    "first_mobile": "string",
    "second_mobile": "string",
    "phone": "string"
  },
  "recipient_person": {
    "first_name": "string",
    "last_name": "string",
    "national_code": "string",
    "first_mobile": "string",
    "second_mobile": "string",
    "phone": "string"
  },
  "constant_proof_of_delivery_code_for_all_parcels": "string",
  "parcels": [
    {
      "dimensionsInCMs": [
        "string",
        "string",
        "string"
      ],
      "content_value_price_rials": "string",
      "description": "string",
      "items_description": "string",
      "weight_grams": "string",
      "consignor_reference_id": "string",
      "payable_price_rials_by_recipient": "string",
      "scannable_codes": [
        "string"
      ],
      "characteristics": [
        "string"
      ],
      "packaging_type": "string"
    }
  ],
  "token": "string"
}

رفتار سیستم

در صورت معتبر بودن توکن و تطابق اطلاعات ثبت با گزینه انتخاب‌شده، دریافت HTTP 200 به معنی ثبت موفق و قطعی Shipment در همان لحظه است.

از آنجا که پارسل‌های واقعی در همین درخواست ایجاد شده‌اند، کانساینر می‌تواند بلافاصله پس از دریافت پاسخ موفق، API دریافت لیبل را برای parcel_id یا parcel_codeهای برگشتی فراخوانی کند.

ساختار پاسخ این روش همان ساختار پاسخ موفق Specified Parcels در بخش اصلی ثبت سفارش است.

روش دوم: ثبت با ظرفیت تخمینی و Time Window

Register with Estimated Capacity and Selected Time Window

این روش زمانی استفاده می‌شود که مشتری بازه تحویل خود را انتخاب کرده است، اما در لحظه ثبت نهایی هنوز تعداد یا مشخصات دقیق پارسل‌های فیزیکی معلوم نیست.

در این حالت:

  • آبجکت max_shipment_capacity_estimation_for_pre_reservation باید ارسال شود.
  • آرایه parcels نباید ارسال شود.
  • توکن و زمان‌های گزینه انتخاب‌شده باید در همان درخواست قرار گیرند.
  • پس از ثبت موفق، پارسل‌های واقعی از طریق APIهای Add Parcel و Delete Parcel مدیریت می‌شوند.

ساختار درخواست

json
{
  "consignor_unique_reference_id": "string",
  "select_random_found_route": true,
  "revive_if_already_registered_and_failed": true,
  "order_number": "string",
  "cargo_submitter_person": {
    "first_name": "string",
    "last_name": "string",
    "national_code": "string",
    "first_mobile": "string",
    "second_mobile": "string",
    "phone": "string"
  },
  "recipient_person": {
    "first_name": "string",
    "last_name": "string",
    "national_code": "string",
    "first_mobile": "string",
    "second_mobile": "string",
    "phone": "string"
  },
  "constant_proof_of_delivery_code_for_all_parcels": "string",
  "max_shipment_capacity_estimation_for_pre_reservation": {
    "parcels_total_estimated_weight_grams": "string",
    "each_parcel_size_tier": "NORMAL",
    "all_parcels_as_single_box_estimated_max_dimensions_cm": [
      "string",
      "string",
      "string"
    ]
  },
  "token": "string"
}

رفتار سیستم

در صورت معتبر بودن توکن و تطابق اطلاعات درخواست با گزینه انتخاب‌شده، دریافت HTTP 200 به معنی ثبت قطعی Shipment و نهایی شدن مسیر است.

با این حال، در این مرحله هنوز پارسل فیزیکی ایجاد نشده است؛ بنابراین امکان دریافت لیبل پارسل بلافاصله پس از ثبت اولیه وجود ندارد.

کانساینر باید پس از آماده شدن هر بسته، API مربوط به Add Parcel را فراخوانی کند. پس از دریافت پاسخ موفق HTTP 200 از متد افزودن پارسل، parcel_id و parcel_code ایجاد می‌شوند و لیبل همان پارسل بلافاصله قابل دریافت خواهد بود.

ساختار پاسخ این روش همان ساختار پاسخ موفق Estimated Capacity در بخش اصلی ثبت سفارش است.

نتیجه ثبت و زمان دریافت لیبل

۲ ردیف
روش ثبت با Time Windowوضعیت پاسخ Registerوضعیت پارسل‌هازمان امکان دریافت لیبل
Time Window + Specified Parcelsهمزمان یا Sync؛ پاسخ HTTP 200 به معنی ثبت قطعی است.پارسل‌ها در همان درخواست ایجاد شده‌اند.بلافاصله پس از دریافت پاسخ موفق Register.
Time Window + Estimated Capacityهمزمان یا Sync؛ پاسخ HTTP 200 به معنی ثبت قطعی Shipment است.در لحظه ثبت اولیه هیچ پارسل فیزیکی ایجاد نشده است.پس از هر فراخوانی موفق Add Parcel، برای پارسل اضافه‌شده.

ارسال وب‌هوک‌های عملیاتی و تغییرات وضعیت در هر دو روش همچنان ادامه خواهد داشت. همزمان بودن Register به معنی حذف وب‌هوک نیست؛ بلکه فقط به این معناست که نتیجه ثبت اولیه و انتخاب مسیر در همان پاسخ API قطعی شده است.

نکات و قوانین مهم فلو Shipping Time Window

  • API مربوط به Shipping Time Window یک API استعلامی است و به‌تنهایی هیچ سفارشی ثبت نمی‌کند.
  • زمان‌های برگشتی بر اساس اطلاعات همان درخواست، ظرفیت لحظه‌ای و روزهای قابل ارائه محاسبه می‌شوند.
  • هر گزینه دارای توکن مستقل است.
  • توکن گزینه انتخاب‌شده باید در فیلد token درخواست Register قرار گیرد.
  • promise_start_date_time، promise_end_date_time و service_level جزئی از اطلاعات گزینه انتخاب‌شده هستند و داخل Token ذخیره می‌شوند؛ بنابراین در Final Register نباید مجددا ارسال شوند.
  • pickup_start_date_time و pickup_end_date_time فقط خروجی سرویس Time Window هستند و لازم نیست در Register ارسال شوند.
  • اطلاعات مبدأ، مقصد و زمان آماده‌سازی ثبت نهایی باید با اطلاعاتی که گزینه‌ها بر اساس آن‌ها محاسبه شده‌اند سازگار باشند.
  • اطلاعات تخمینی مرحله Time Window جایگزین مشخصات واقعی یا ظرفیت تخمینی مرحله Register نمی‌شوند.
  • در ثبت با پارسل مشخص، parcels اجباری است و ظرفیت تخمینی نباید ارسال شود.
  • در ثبت با ظرفیت تخمینی، آبجکت ظرفیت اجباری است و parcels نباید ارسال شود.
  • پارسل‌های نهایی باید با each_parcel_size_tier اعلام‌شده در مرحله Time Window سازگار باشند.
  • off_day_dates مربوط به روزهای عدم امکان پیکاپ از مبدأ کانساینر است، نه روزهای عدم حضور مشتری در مقصد.
  • سیستم کانساینر باید زمان دقیق expires_at_date_time را ملاک قرار دهد و نباید مدت اعتبار توکن را به‌صورت ثابت در کد خود پیاده‌سازی کند.
  • در صورت انقضای توکن، استعلام Shipping Time Window باید مجدداً انجام شود.
  • در صورت ثبت با ظرفیت تخمینی، تمام قوانین فعلی Add Parcel و Delete Parcel بدون تغییر برقرار هستند.