رزرو سفارش
به طور کلی برای ثبت یک سفارش در گنجه، از یکی از روشهای بستهبندی زیر استفاده میشود:
- no-packing: بدون بستهبندی
- manual-packing: بستهبندی دستی
- automatic-packing: بستهبندی خودکار
در صورتی که از سایز لاکرهای گنجه آگاهی دارید و میدانید سفارش شما مناسب کدام یک از این سایزها است، میتوانید از سرویس manual-packing استفاده کنید؛ اما در صورتی که ابعاد بسته(ها) را میدانید و میخواهید گنجه با توجه به این ابعاد، خودش لاکر مناسب را اختصاص دهد، از سرویس automatic-packing استفاده کنید. همچنین در صورتی که می خواهید از سرویس گنجدار استفاده کنید، باید از روش no-packing استفاده کنید.
موارد مشترک بین ریکوئست وب سرویسهای رزرو
هر دو API باید با متد POST و همراه با توکن معتبر فراخوانی شوند. همچنین در ادامه توضیح فیلدهای مشترک بین این دو API را در ادامه میآوریم. فیلدهای اجباری با (*) مشخص میشوند.
station(*): در این فیلد بایدuuidگنجه یا گنجدار مدنظر قرار گیرد.time_scope_date(*): اطلاعات مربوط به بازهی زمانی رزرو باید در این فیلد مشخص شود.
"time_scope_date": {
"expected_check_in_date": "2024-10-31",
"expected_duration_days": 1
}
که در آن expected_check_in_date تاریخ ورود سفارش به گنجه و expected_duration_days تعداد روزهای کاری ماندگاری سفارش در گنجه است.
لازم به ذکر است که رزرو سفارش با در نظر گرفتن روزهای کاری گنجهی انتخاب شده، صورت میگیرد. به این صورت که با توجه به تعداد روزهای مشخص شده در فیلد expected_duration_days و روزهای کاری گنجه، بازهی زمانی رزرو به صورتی در نظر گرفته میشود که تعداد روزهای مدنظر را شامل شود.
package(*): در این فیلد مشخصات سفارش قرار میگیرد اما با توجه به نوع API مدنظر، ساختار متفاوتی باید داشته باشد که در توضیحات مربوط به هر API به آن پرداخته میشود.process(*): نام سرویس مورد نظر که در بخش رزرو سفارش مربوط به هر سرویس مشخص شده است.logistic_company: در این فیلد بایدuuidشرکتی که ارسال سفارش توسط آن انجام میشود، قرار گیرد.picker: شمارهی تلفن همراه گیرندهی سفارشdropper: شمارهی تلفن همراه تحویلدهندهی سفارشpassword: کد تحویلی که گیرنده با استفاده از آن میتواند سفارش را تحویل بگیرد. (به صورت عددی و حداکثر ۵ رقم)picker_full_name: نام و نام خانوادگی گیرندهی سفارش
وب سرویس رزرو no-packing
همانطور که اشاره شد، مورد متفاوت در این API فیلد package است. این فیلد باید به صورت زیر ارسال شود:
"package": {
"external_id": "string",
"parcels": [
{
"external_id": "string",
"dimension": {
"width": 0.2,
"height": 0.1,
"length": 0.25
}
}
],
"shop": "string"
}
در ادامه توضیح مربوط به هر کدام از فیلدها آمده است:
external_id(*): شناسهی مرسوله در سرویس تامینکنندهshop: در صورتی که تامینکننده، سفارشهای مربوط به فروشگاههای متفاوتی را ارسال میکند، میتوانید در این فیلد نام فروشگاه را مشخص کنید.parcels(*): در این فیلد آرایهای از مشخصات بستههای مربوط به این مرسوله، میآید. مشخصات هر بسته شامل موارد زیر است:external_id(*): شناسهی بسته در سرویس تامینکنندهdimension: ابعاد بسته در این قسمت مشخص میشود که شامل (*)width(عرض)، (*)height(ارتفاع) و (*)length(طول) است. این ابعاد باید بر حسب متر مشخص شود.
خلاصۀ این اندپوینت به شرح زیر است:
Request Body
{
"station": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"time_scope_date": {
"expected_check_in_date": "2024-10-31",
"expected_duration_days": 1
},
"package": {
"external_id": "Example1",
"parcels": [
{
"external_id": "Example1_1",
"dimension": {
"width": 0.2,
"height": 0.1,
"length": 0.25
}
}
]
"shop": "string"
},
"process": "manual_lastmile",
"logistic_company": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"picker": "+989120000000",
"password": "12345",
"picker_full_name": "علی محمدی"
}
Response Body
{
"pk": 10000,
"uuid": "c82de21f-19b0-477e-a489-3705a6e04da9",
"verbose_id": null,
"status": "Reserved",
"process": "manual_lastmile",
"station": {
"uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "آدرس گنجه",
"location": null,
"nickname": "نام گنجه",
"postal_code": null,
"images": [],
"districts": []
},
"dates": {
"time_scope": {
"expected_check_in": "2024-10-31 08:00:00",
"expected_duration": "10:00:00"
},
"order_date": "2024-10-31 09:35:24",
"check_in": null,
"check_out": null,
"cancel_date": null,
"extend_date": null
}
}
وب سرویس رزرو manual-packing
همانطور که اشاره شد، مورد متفاوت در این API فیلد package است. این فیلد باید به صورت زیر ارسال شود:
"package": {
"external_id": "string",
"packs": [
{
"size": "small",
"parcels": [
{
"external_id": "string",
"weight": 0,
"value": 0,
"content": "string"
}
]
}
],
"shop": "string"
}
در ادامه توضیح مربوط به هر کدام از فیلدها آمده است:
external_id(*): شناسهی مرسوله در سرویس تامینکنندهshop: در صورتی که تامینکننده، سفارشهای مربوط به فروشگاههای متفاوتی را ارسال میکند، میتوانید در این فیلد نام فروشگاه را مشخص کنید.packs(*): در این فیلد باید نحوهی قرارگیری هر کدام از بستههای موجود در مرسوله را به صورت زیر مشخص کنید. مقدار این فیلد باید آرایهای از آیتمهایی به صورت زیر باشد:
{
"size": "small",
"parcels": [
{
"external_id": "string",
"weight": 0,
"value": 0,
"content": "string"
}
]
}
که در آن size، سایز لاکر مدنظر است. همچنین parcels آرایهای از مشخصات بستههای مربوط به این آیتم است که باید به صورت زیر باشد:
{
"external_id": "string",
"weight": 0,
"value": 0,
"content": "string"
}
که در آن توضیح هر فیلد مطابق زیر است:
external_id(*): شناسهی بسته در سرویس تامینکنندهweight: وزن بسته بر حسب گرمvalue: ارزش بسته بر حسب ریالcontent: محتویات بسته
توضیح تکمیلی: هر مرسوله (که متعلق به یک گیرنده است) میتواند شامل چندین بسته باشد که در این API شما باید مشخص کنید که کدام ترکیب از بستهها در کدام سایز لاکر قرار گیرد. برای مثال مرسولهای را در نظر بگیرید که شامل ۵ بسته است. با توجه به ابعاد بستهها، شما تشخیص میدهید که بستهی ۱ باید به تنهایی در لاکر large قرار گیرد، بستههای ۲ و ۳ در لاکر medium قرار گیرند و بستههای ۴ و ۵ در یک لاکر medium دیگر. در این صورت مقدار فیلد package باید به صورت زیر باشد:
{
"external_id": "Test1234",
"packs": [
{
"size": "large",
"parcels": [
{
"external_id": "Test1234_1"
}
]
},
{
"size": "medium",
"parcels": [
{
"external_id": "Test1234_2"
},
{
"external_id": "Test1234_3"
}
]
},
{
"size": "medium",
"parcels": [
{
"external_id": "Test1234_4"
},
{
"external_id": "Test1234_5"
}
]
}
]
}
خلاصۀ این اندپوینت به شرح زیر است:
Request Body
{
"station": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"time_scope_date": {
"expected_check_in_date": "2024-10-31",
"expected_duration_days": 1
},
"package": {
"external_id": "Example1",
"packs": [
{
"size": "small",
"parcels": [
{
"external_id": "Example1_1",
"weight": 250,
"value": 100000
}
]
}
],
"shop": "string"
},
"process": "lastmile",
"logistic_company": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"picker": "+989120000000",
"password": "12345",
"picker_full_name": "علی محمدی"
}
Response Body
{
"pk": 10000,
"uuid": "c82de21f-19b0-477e-a489-3705a6e04da9",
"verbose_id": null,
"status": "Reserved",
"process": "lastmile",
"station": {
"uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "آدرس گنجه",
"location": null,
"nickname": "نام گنجه",
"postal_code": null,
"images": [],
"districts": []
},
"dates": {
"time_scope": {
"expected_check_in": "2024-10-31 08:00:00",
"expected_duration": "10:00:00"
},
"order_date": "2024-10-31 09:35:24",
"check_in": null,
"check_out": null,
"cancel_date": null,
"extend_date": null
}
}
وب سرویس رزرو automatic-packing
همانطور که اشاره شد، مورد متفاوت در این API فیلد package است. این فیلد باید به صورت زیر ارسال شود:
"package": {
"parcels": [
{
"external_id": "string",
"dimension": {
"width": 0,
"height": 0,
"length": 0
}
}
],
"external_id": "string",
"shop": "string"
}
در ادامه توضیح مربوط به هر کدام از فیلدها آمده است:
external_id(*): شناسهی مرسوله در سرویس تامینکنندهshop: در صورتی که تامینکننده، سفارشهای مربوط به فروشگاههای متفاوتی را ارسال میکند، میتوانید در این فیلد نام فروشگاه را مشخص کنید.parcels(*): در این فیلد آرایهای از مشخصات بستههای مربوط به این مرسوله، میآید. مشخصات هر بسته شامل موارد زیر است:external_id(*): شناسهی بسته در سرویس تامینکنندهdimension(*): ابعاد بسته در این قسمت مشخص میشود که شامل (*)width(عرض)، (*)height(ارتفاع) و (*)length(طول) است. این ابعاد باید بر حسب متر مشخص شود.
خلاصۀ این اندپوینت به شرح زیر است:
Request Body
{
"station": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"time_scope_date": {
"expected_check_in_date": "2024-10-31",
"expected_duration_days": 1
},
"package": {
"parcels": [
{
"external_id": "Example2_1",
"dimension": {
"width": 0.1,
"height": 0.25,
"length": 0.15
}
}
],
"external_id": "Example2"
},
"process": "lastmile",
"logistic_company": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"picker": "+989120000000",
"password": "12345",
"picker_full_name": "علی محمدی"
}
Response Body
{
"pk": 10000,
"uuid": "c82de21f-19b0-477e-a489-3705a6e04da9",
"verbose_id": null,
"status": "Reserved",
"process": "lastmile",
"station": {
"uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "آدرس گنجه",
"location": null,
"nickname": "نام گنجه",
"postal_code": null,
"images": [],
"districts": []
},
"dates": {
"time_scope": {
"expected_check_in": "2024-10-31 08:00:00",
"expected_duration": "10:00:00"
},
"order_date": "2024-10-31 09:35:24",
"check_in": null,
"check_out": null,
"cancel_date": null,
"extend_date": null
}
}
رزرو به صورت ناشناس (بدون شماره تلفن)
در این نوع از رزرو، رزرو به صورت ناشناس و بدون اطلاعات شخصی مانند شماره تلفن، نام و نام خانوادگی برای گیرنده (picker) انجام میشود و با عنوان with anonymous picker شناخته میشود. در این نوع از رزرو نیازی به ارسال اطلاعات گیرنده مانند شماره تلفن نیست. در Response فراخوانی رزروهای ناشناس یک لینک با عنوان pickup_url بازگردانده میشود که کاربر با ورود این لینک میتواند به وباپ وارد شده و بسته خود را مشاهده کرده و فرایند برداشتن بسته را طی کند. همانطور که برای فرایند رزرو عادی سه روش بستهبندی دارد، این نوع از رزرو نیست شامل همان سه دسته نوع بستهبندی زیر است که توضیحات آنها کاملا به مانند رزرو عادی است:
no-packingmanual-packingautomatic-packing
برای هر کدام از این نوع از بستهبندیها برای رزرو ناشناس یک API در نظر گرفته شده است. این APIها کاملا به صورت مشابه با APIهای متناظر در رزرو عادی عمل میکنند. بهطور مثال API رزرو no-packing در رزرو عادی و رزرو به صورت ناشناس دادههای مشابه دریافت میکنند و فرمت خروجی مشابه دارند. تنها تفاوت در این است که picker و password نباید بهعنوان داده ورودی در request body ارسال شود. همچنین در پاسخ API، پراپرتی pickup_url که شامل لینک کاربر برای ورود به وباپ و برداشتن بسته است نیز ارسال میشود. ا ین API ها به صورت زیر هستند:
وب سرویس رزرو ناشناس no-packing
این API به صورت کاملا مشابه با no-packing در رزرو عادی عمل میکند. تمامی دادههای ورودی و خروجی، خطاها و status codeها یکسان است، فقط در ورودی picker دریافت نمیشود و در خروجی نیز picker_url ارسال میشود. فرمت خروجی این اندپوینت به صورت زیر است:
Request Body
{
"station": "ff64cc6c-ecda-4980-bf83-76f8793804db",
"time_scope_date": {
"expected_check_in_date": "2025-04-12",
"expected_duration_days": 2
},
"package": {
"parcels": [
{
"external_id": "313131",
"dimension": {
"width": 0.2,
"height": 0.1,
"length": 0.25
}
}
],
"external_id": "313131"
},
"process": "manual_lastmile",
}
Response Body
{
"pk": 10000,
"uuid": "c82de21f-19b0-477e-a489-3705a6e04da9",
"verbose_id": null,
"status": "Reserved",
"process": "manual_lastmile",
"station": {
"uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"address": "آدرس گنجه",
"location": null,
"nickname": "نام گنجه",
"postal_code": null,
"images": [],
"districts": []
},
"dates": {
"time_scope": {
"expected_check_in": "2024-10-31 08:00:00",
"expected_duration": "10:00:00"
},
"order_date": "2024-10-31 09:35:24",
"check_in": null,
"check_out": null,
"cancel_date": null,
"extend_date": null
},
"pickup_url": "https://app.dev.ganje.net/ext/O3vzYW_IQ_e-wvzMIfb60g"
}