1איזה חלק שלכם
| אתם בונים | לקרוא | הזדהות | מה זה עושה |
|---|---|---|---|
| מערכת קופה (POS) ששולחת ל‑RazGaz את הזמנות המשלוח של מסעדה | פרק 2 וחלק א (§3–§9) | מפתח API אחד לכל התקנת קופה, וקוד לכל סניף | קריאה אחת לכל הזמנה, POST /ingestOrder. דבר לא חוזר: לא סטטוס ולא פרטי שליח |
| מערכת ניהול של המסעדה עצמה שמנהלת את המשלוחים שלה בעצמה, במקום פורטל האינטרנט של RazGaz | פרק 2 וחלק ב (§10–§17) | חשבון המסעדה של הסניף: אימייל וסיסמה, שמוחלפים בטוקן | פתיחת הזמנות, מענה על זמן הכנה, תזמון למועד מאוחר, קריאת לוח ההזמנות והשליח, סימון "האוכל מוכן", ביטול |
| פלטפורמת משלוחים או הזמנות שצריכה עדכוני סטטוס חוזרים, תזמון או ביטול דרך מפתח | לא המסמך הזה | — | אלה חוזי שותפים עם תנאים משלהם. בקשו מאיתנו את שלכם |
שני החלקים אינם חלופיים זה לזה:
- חלק א דוחף הזמנות פנימה ולא מקבל דבר בחזרה. מפתח אחד משרת כל מספר של סניפים. אתם בוחרים את מזהה ההזמנה.
- חלק ב שולט בכל מחזור החיים של ההזמנה ורואה עליה הכול. הוא עובד לסניף אחד לכל חשבון. RazGaz בוחרת את מזהה ההזמנה.
הזמנות שמערכת קופה שולחת בחלק א מופיעות גם בלוח ההזמנות של הסניף בחלק ב. המסעדה קוראת אותן כמו את שלה.
2משותף לשני החלקים
2.1כתובות ותעבורה
| קריאות ל‑RazGaz | https://api.raz-gaz.com |
| תעבורה | HTTPS בלבד. Content-Type: application/json, UTF-8 |
| בחלק ב בלבד | כתובות ההתחברות של Google וכתובת מסד הנתונים, §11 ו‑§14 |
2.2סטטוסים של הזמנה
חלק א אינו יכול לקרוא את הסטטוס של הזמנה. הטבלה היא בכל זאת השפה שבה מוקדן של RazGaz מדבר כשאתם פונים אליו. חלק ב קורא את הסטטוס בכל הזמנה, §14.
status | משמעות |
|---|---|
awaiting_prep_time | מוחזקת. RazGaz ממתינה שהמטבח יגיד מתי האוכל יהיה מוכן. לא מוצעת לאף שליח, §2.3 |
awaiting_location | מוחזקת. לא הצלחנו למקם את כתובת המסירה על המפה, ומוקדן של RazGaz ימקם אותה. לא מוצעת לאף שליח |
held | מוחזקת אצל מוקדן של RazGaz, שמשחרר אותה ידנית. זה קורה כשהסניף מוגדר לפרסום ידני, כשהכתובת לא התאימה לאף מחיר משלוח, או כשההזמנה סומנה לבדיקה. לא מוצעת לאף שליח. למטבח אין מה לעשות — מבשלים כרגיל |
scheduled | מתוזמנת למועד מאוחר, ממתינה לשחרור אוטומטי, §13.3 |
pending | שוחררה. עדיין לא הוצעה לשליחים |
broadcasting | מוצעת לשליחים באזור |
accepted | שליח לקח אותה והוא בדרך לסניף |
arrived_at_pickup | השליח בסניף |
picked_up | האוכל אצל השליח, בדרך ללקוח |
arrived_at_delivery | השליח אצל הלקוח |
delivered | נמסרה. סופי |
cancelled | בוטלה. סופי |
הזמנה מתקדמת בסדר הזה, אבל לא כל מצב נראה לקורא. שני מצבים יכולים לעבור בין שתי קריאות. התייחסו לסטטוס כמצב נוכחי ולא כאירוע, ואל תבנו דבר שצריך לראות כל מצב.
2.3זמן הכנה
זמן ההכנה הוא מספר הדקות מעכשיו ועד שהאוכל מוכן. בזכותו RazGaz מתזמנת את השליח
להגיע לדלפק כשהאוכל יוצא, במקום שיחכה שם. שני החלקים שולחים אותו בשדה
estimatedReadyMinutes: מספר שלם, גדול מ‑0 ולא יותר מ‑240.
כשלא שולחים אותו, RazGaz משתמשת במה שהיא יודעת על הסניף. כל סניף נמצא באחד משלושה מצבים:
| הסניף | הזמנה בלי זמן הכנה |
|---|---|
| מוגדר לתת זמן לכל הזמנה | מוחזקת ב‑awaiting_prep_time ולא מוצעת לאף שליח עד שמישהו עונה. שום דבר לא משחרר אותה אוטומטית. כך גם כשלסניף יש גם זמן הכנה ממוצע רשום |
| יש לו זמן הכנה ממוצע רשום | משתמשת בממוצע ויוצאת מיד |
| אין לו אף אחד מהם | יוצאת מיד, בלי זמן מוכנות בכלל |
המצב הראשון הוא הסיבה שמערכת שיודעת את זמן ההכנה צריכה לשלוח אותו תמיד. כך נחסך שלב ידני שאחרת מעכב כל הזמנה.
המינימום של האזור. כשאזור עמוס, RazGaz קובעת לו זמן הכנה מינימלי (Busy Lag). כל חלק מטפל אחרת בזמן שנמוך מהמינימום:
- חלק א מעלה אותו למינימום בלי לומר לכם.
- חלק ב דוחה אותו ב‑
400(§12.6). המינימום הנוכחי ניתן לקריאה, §14.4.
זמן הכנה שלא שלחתם, שנלקח מהממוצע של הסניף, מועלה למינימום בשני החלקים.
2.4כתובות
שורת הכתובת היא רחוב, מספר בית ועיר, ולא יותר.
- לקומה, לדירה ולכניסה יש שדות משלהן. בחלק א הן בתוך
deliveryAddressParts. בחלק ב הן שדות ברמה העליונה. הן מוצגות לשליח בהגעה לבניין. - אל תכניסו את הקומה לשורת הכתובת. כשלא נשלחות קואורדינטות, את השורה הזו מחפשים על המפה, וקומה בתוכה פוגעת בחיפוש.
- קוד שער וכדומה נכנסים ל‑
notes. - קומה, דירה או כניסה עם הערך
"0"נקראות כ"לא צוין" ולא מוצגות — מערכות קופה שולחות"0"לבית פרטי. קומת קרקע אמיתית כתבו במילים.
שלחו קואורדינטות בכל פעם שיש לכם אותן. נקודה שהמערכת שלכם אישרה עדיפה על נקודה שאנחנו מחפשים. בלי קואורדינטות, RazGaz מחפשת את הכתובת בעצמה.
2.5כסף
| שדה | משמעות |
|---|---|
paymentMethod | "cash" פירושו שהשליח גובה תשלום מהלקוח. כל ערך אחר, וגם שדה חסר, נרשמים כ‑"card", והשליח לא גובה דבר |
orderAmount | מה שהלקוח משלם על ההזמנה, בשקלים, כמספר ב‑JSON. ערך שאינו מספר נרשם כ‑0 |
חלק א — מערכות קופה: שליחת הזמנות פנימה
3מה RazGaz מנפיקה לכם
שני דברים מקבלים מ‑RazGaz לפני ההזמנה הראשונה:
| מה זה | היקף | |
|---|---|---|
| מפתח API | מחרוזת סודית: rg_live_ ואחריה 48 תווים הקסדצימליים | מפתח אחד לכל התקנת קופה, לכל מספר של מסעדות שהיא שולחת בעבורן |
| קוד מסעדה | הקוד שמזהה סניף אחד בבקשות שלכם, נשלח בשדה externalId | אחד לכל סניף. זה המזהה שלכם לסניף. RazGaz רושמת אותו מול הסניף, כך שאין צורך לאמץ את המזהים שלנו |
המפתח מוצג פעם אחת, כשהוא נוצר, ואי אפשר לשחזר אותו אחר כך. שמרו אותו כסוד.
RazGaz יכולה לבטל כל מפתח בכל עת. מאז, כל בקשה שמציגה אותו נענית ב‑401, בתוך
דקה מהביטול.
4הזדהות
הציגו את המפתח בכל בקשה, באחת משתי דרכים:
| שיטה | היכן |
|---|---|
| כותרת (מועדף) | x-api-key: <key> |
| פרמטר בשאילתה | ?apiKey=<key> |
אם שתיהן נשלחו, הכותרת קובעת.
בקשה בלי מפתח, עם מפתח לא מוכר או עם מפתח מבוטל נענית ב‑401, ודבר אינו נרשם.
לא נוצרת הזמנה, ו‑RazGaz לא מקבלת התראה פנימית. בסביבת ייצור, 401 פירושו
שהאינטגרציה לא מספקת דבר בלי שאיש שם לב. התייחסו אליו ככשל מוחלט והסלימו אותו,
במקום לחזור על הבקשה בלי סוף.
5הקריאה: הוספת הזמנה
POST https://api.raz-gaz.com/ingestOrder
5.1בקשה — מה חייב להופיע
| שדה | טיפוס | תיאור |
|---|---|---|
orderId | מחרוזת | המזהה שלכם להזמנה. הוא הופך לזהות ההזמנה ב‑RazGaz ולמפתח ה‑idempotency, §7. שמרו אותו יציב בין ניסיונות חוזרים של אותה הזמנה. ודאו שמערכת אחרת לא יכולה לשלוח את אותו מזהה: הוסיפו לו קידומת של שם המערכת ושל הסניף, למשל "acme-102-58817". מרחב המזהים משותף עם מערכות קופה אחרות, ואותו מזהה משתי מערכות נחשב להזמנה אחת |
externalId | מחרוזת | קוד המסעדה ש‑RazGaz הנפיקה לכם (§3). הוא מזהה מאיזה סניף אוספים את ההזמנה |
מיקום. כל הזמנה צריכה גם נקודת מסירה, באחת משתי דרכים:
deliveryLocationכקואורדינטות, אוdeliveryAddressלא ריק, ש‑RazGaz תחפש.
אפשר להשמיט את pickupLocation. אז משמש המיקום השמור של הסניף. הוא חובה רק לסניף
שאין לו מיקום שמור, וזו תקלת הגדרה שיש להעלות מולנו.
כל קואורדינטה שנשלחת חייבת להיות מספר ב‑JSON, לא מחרוזת. בקשה שלא עומדת באחד
הכללים האלה נענית ב‑400 ולא נוצרת הזמנה.
5.2בקשה — כתובת ומיקום
| שדה | טיפוס | תיאור |
|---|---|---|
deliveryLocation | אובייקט | נקודת המסירה. { "latitude": number, "longitude": number }. כשהיא נשלחת, משתמשים בה בדיוק כפי שנשלחה |
deliveryAddress | מחרוזת | כתובת המסירה בשורה קריאה אחת: רחוב, מספר בית, עיר (§2.4). השליח קורא אותה. בלי deliveryLocation, את השורה הזו מחפשים על המפה, והיא גם קובעת את מחיר המשלוח, ולכן הקומה והדירה לא נכנסות אליה |
deliveryAddressParts | אובייקט | הכתובת בחלקים, כולם אופציונליים: { "city", "street", "homeNumber", "floor", "apartment", "entrance" }, כל אחד מחרוזת. floor, apartment ו‑entrance מוצגים לשליח בהגעה לבניין. city היא העיר שלפיה מתומחר המשלוח — שלחו אותה בכל פעם שיש לכם אותה. city ו‑street גם עוזרים לאתר כתובת שנשלחה בלי קואורדינטות. שלחו אותו לצד deliveryAddress: השורה אף פעם לא נבנית מהחלקים |
pickupLocation | אובייקט | נקודת האיסוף. { "latitude": number, "longitude": number }. בדרך כלל משמיטים אותו (§5.1) |
pickupAddress | מחרוזת | כתובת הסניף בשורה קריאה אחת |
כתובת שלא ניתן למקם על המפה עדיין מתקבלת (201). ההזמנה ממתינה אז
ב‑awaiting_location עד שמוקדן של RazGaz ימקם אותה. שום דבר בתשובה לא מספר שזה קרה.
5.3בקשה — שדות אופציונליים
| שדה | טיפוס | תיאור |
|---|---|---|
estimatedReadyMinutes | מספר שלם | דקות מעכשיו ועד שהאוכל מוכן, גדול מ‑0 ולא יותר מ‑240, §2.3. שלחו אותו בכל פעם שמערכת הקופה יודעת אותו, §8 |
customerName | מחרוזת | שם הלקוח, כפי שהשליח צריך לבקש אותו |
customerPhone | מחרוזת | מספר שהשליח יכול להתקשר אליו בהגעה |
notes | מחרוזת | טקסט חופשי שמוצג לשליח: הוראות מסירה, קודי שער, "להשאיר בדלת" |
items | מערך | פריטי ההזמנה, כל אחד { "name": string, "qty": number }. RazGaz שומרת את המערך כפי שנשלח, וכל מסך קורא בדיוק את שני המפתחות האלה. כמות שנשלחת במפתח אחר לא תוצג. אפשר להשמיט את השדה כולו — שליחים לא צריכים פירוט פריטים כדי למסור |
orderAmount | מספר | §2.5 |
paymentMethod | מחרוזת | §2.5 |
placedAt | מספר | מחרוזת | מתי הלקוח ביצע את ההזמנה: אלפיות שנייה מ‑epoch, או חותמת זמן ISO-8601. אם חסר או לא קריא, נרשם זמן הבקשה |
5.4שדות שמורים — אין לשלוח
נקודת הקצה מקבלת עוד כמה שדות ששייכים לתפעול של RazGaz. שליחתם ממערכת קופה אינה נתמכת. חלקם משנים את שכר השליח ואת המרחק שבו ההזמנה מוצעת, ו‑RazGaz לא בודקת אותם מול המשלוח:
estimatedPayout, broadcastRadius, platformOrderRef, regionId,
restaurantId.
scheduledFor אינו חלק מהאינטגרציה הזו. הוא נשמר ואין לו השפעה: הזמנה שנשלחת
עם שעה עתידית יוצאת מיד. אל תשלחו הזמנה למועד מאוחר לפני שהגיע זמנה.
restaurantName מתקבל כגיבוי לזיהוי הסניף כשלא נשלח externalId או שהקוד לא
מתאים לדבר. אז הוא חייב להיות זהה, תו בתו, לאיות של שם הסניף אצל RazGaz (הנוכחי או
שם קודם). אל תסתמכו עליו — שלחו externalId.
5.5תשובה
| HTTP | משמעות |
|---|---|
201 | ההזמנה נוצרה |
200 | הזמנה עם orderId זה כבר הייתה קיימת ועודכנה, §7 |
שתיהן חוזרות עם אותו גוף:
{ "success": true, "orderId": "acme-102-58817", "created": true }
orderId הוא המזהה ששלחתם, מוחזר כפי שהוא. created הוא true ב‑201 ו‑false
ב‑200.
התייחסו לכל 2xx כהצלחה. created: false היא תשובה רגילה ומוצלחת, לא שגיאת כפילות.
5.6שגיאות
גוף כל שגיאה הוא { "error": "<message>" }.
| HTTP | הודעה | סיבה | מה לעשות |
|---|---|---|---|
400 | orderId and (externalId or restaurantName) are required | §5.1 | לתקן את הבקשה. שליחה חוזרת בלי שינוי לא תצליח. RazGaz מקבלת התראה פנימית על כל 400 |
400 | deliveryLocation or deliveryAddress is required | אין נקודת מסירה משום סוג | כנ"ל |
400 | pickupLocation and deliveryLocation must each have numeric latitude and longitude | קואורדינטה נשלחה כמחרוזת, או חסר חצי ממנה | כנ"ל |
400 | pickupLocation is required: the restaurant has no stored position | לסניף אין מיקום שמור | לשלוח pickupLocation, ולעדכן אותנו |
400 | משפט בעברית על זמן ההכנה | estimatedReadyMinutes אינו מספר חיובי, או גדול מ‑240 | לתקן את הערך |
401 | Invalid API key | אין מפתח, מפתח לא מוכר, או מפתח מבוטל | לעצור ולהסלים. לא נשלחת התראה פנימית, כך ש‑RazGaz לא תשים לב בשבילכם |
405 | Method not allowed | הבקשה לא הייתה POST | לתקן את השיטה |
409 | orderId belongs to an order another sender created | ה‑orderId הזה שייך להזמנה ששותף משלוחים יצר. דבר לא שונה | לא לחזור על הבקשה. לפנות ל‑RazGaz |
500 | Internal error ingesting order | תקלה בצד של RazGaz | לחזור על הבקשה. RazGaz מקבלת התראה פנימית על כל 500 |
תום זמן ברשת בלי תשובה לא ניתן להבחנה מ‑500. טפלו בו באותה דרך: חזרו על הבקשה.
חזרה על בקשה תמיד בטוחה, §7.
6זיהוי המסעדה
שלחו externalId בכל הזמנה. RazGaz שומרת את הקוד שלכם לכל סניף מול אותו סניף,
ומקושר למפתח ה‑API שלכם, ולכן:
- הקודים שלכם לא צריכים שום קשר למזהים או לשמות של RazGaz;
- שתי מערכות קופה יכולות להשתמש בקודים שונים לאותו סניף בלי להפריע זו לזו.
סניף שלא קיבלתם עבורו קוד עדיין אינו מחובר. הזמנה עם קוד לא מוכר עדיין מתקבלת
ב‑201. היא מגיעה בלי שום מסעדה מקושרת, ו‑RazGaz לא מקבלת התראה. זה הכשל שצריך
לבדוק בהזמנה הראשונה מכל סניף חדש: הבקשה נראית מוצלחת לגמרי.
אם מפתח ה‑API שלכם מוחלף, יש לרשום את קודי הסניפים מול המפתח החדש לפני שמשתמשים בו. תאמו החלפת מפתח עם RazGaz; אל תחליפו מפתחות על דעת עצמכם.
7Idempotency, ניסיונות חוזרים ותיקונים
ה‑orderId ששלחתם הוא זהות ההזמנה ב‑RazGaz. בקשה שנייה עם orderId שכבר קיים היא
עדכון, אף פעם לא משלוח שני.
מה עדכון עושה:
- הוא כותב מחדש את פרטי ההזמנה ששייכים לכם: שתי הכתובות והחלקים שלהן, שני זוגות הקואורדינטות, שם הלקוח והטלפון שלו, הפריטים, הסכום, אמצעי התשלום, ההערות, זמן ההכנה והזמן שבו ההזמנה בוצעה.
- הוא מתמחר את המשלוח מחדש לפי הפרטים החדשים: שכר השליח והחיוב של המסעדה. לכן כתובת ששונתה משנה את מחיר המשלוח, גם אם שליח כבר בדרך.
- הוא לעולם לא נוגע בשיוך לשליח, בסטטוס של המשלוח או בחותמות הזמן של
ההתקדמות שלו. החריג היחיד: הזמנה שממתינה ב‑
awaiting_locationמשתחררת ברגע שכתובת שנשלחה מחדש ניתנת למיקום על המפה.
שלחו את ההזמנה המלאה בכל פעם. עדכון חלקי אינו נתמך. שדה שהושמט בשליחה החוזרת נכתב כריק, ולא נשאר כפי שהיה, מלבד החריגים האלה:
- זמן הכנה שהמטבח כבר ענה עליו בעצמו נשמר;
- מחיר שמנהל ב‑RazGaz קבע נשמר;
- אם את הכתובת שנשלחה מחדש לא ניתן למקם על המפה, הנקודה והמחיר הקודמים נשמרים;
-
placedAtשהושמט נקבע לזמן השליחה החוזרת.
מה זה אומר למערכת הקופה:
- חזרה על בקשה תמיד בטוחה, בכל מרווח ולכל משך שנדרש. שום ניסיון חוזר לא יכול ליצור משלוח שני או להחזיר אחורה משלוח שבדרך.
- תיקון נשלח באותה דרך: שלחו שוב את ההזמנה המלאה עם אותו
orderIdוהערכים המתוקנים. משלוח שכבר בדרך מנוהל על ידי אדם, ולכן התקשרו גם ל‑RazGaz במקום להניח שהשליח ראה את השינוי. - ביטול אינו חלק מהאינטגרציה הזו. כדי לבטל הזמנה שכבר נשלחה, פנו ל‑RazGaz.
8זמן הכנה
estimatedReadyMinutes הוא השדה האופציונלי השימושי ביותר. בזכותו RazGaz מתזמנת את
הגעת השליח למטבח, במקום לשלוח אותו לעמוד ליד הדלפק.
כשהוא מושמט, ההגדרות של הסניף קובעות (§2.3). המקרה שמזיק הוא סניף שמוגדר לתת זמן לכל הזמנה. ההזמנות שלו מוחזקות, בלי שליח, עד שמישהו במטבח עונה בפורטל של RazGaz, ושום דבר לא משחרר אותן אוטומטית. מערכת קופה שמכירה את המטבח שלה צריכה לשלוח את השדה תמיד.
דרכים נוספות שבהן הזמנה ממתינה. 201 אומר שההזמנה נרשמה. הוא לא אומר שהיא
הוצעה לשליחים. שלושה מצבים נוספים מרחיקים הזמנה משליחים, והתשובה לא מזכירה אף אחד
מהם (§2.2):
awaiting_location— לא ניתן היה למקם את הכתובת על המפה;held— הסניף מפרסם ידנית, הכתובת לא התאימה לאף מחיר משלוח, או שההזמנה סומנה;awaiting_prep_time— הסניף נותן זמן לכל הזמנה, ולא נשלח זמן.
מוקדן של RazGaz רואה את שלושתם.
9לפני העלייה לאוויר
- RazGaz הנפיקה את מפתח ה‑API וקוד מסעדה אחד לכל סניף.
- ה‑
orderIdשלכם לא יכול להתנגש במזהה של מערכת אחרת (§5.1). - בכל הזמנה יש נקודת מסירה. קואורדינטות נשלחות כמספרים, או ששורת הכתובת היא רחוב,
מספר בית ועיר, והקומה והדירה ב‑
deliveryAddressParts. - נשלחה הזמנה אמיתית אחת מכל סניף, ווידאתם עם RazGaz שהיא הגיעה מקושרת למסעדה הנכונה. פרק 6 מסביר למה תשובת ה‑HTTP לבדה לא מאשרת זאת.
-
estimatedReadyMinutesנשלח בכל פעם שמערכת הקופה יכולה להפיק אותו. - יש ניסיונות חוזרים על
500ועל תום זמן. על400ו‑401לא חוזרים באופן עיוור, אלא מציגים אותם למי שיכול לטפל.
חלק ב — מערכות מסעדה: ניהול המשלוחים בעצמכם
10מה RazGaz מנפיקה לכם
פורטל האינטרנט של RazGaz הוא לקוח של ממשק ציבורי: דרכו הוא פותח הזמנות, קורא את הלוח ומעדכן הזמנות. מערכת הניהול של המסעדה יכולה לקרוא לאותו ממשק לכל מה שבחלק הזה.
שלושה דברים מקבלים מ‑RazGaz לפני ההזמנה הראשונה:
| מה זה | |
|---|---|
| אימייל וסיסמה | חשבון המסעדה של הסניף. חשבון אחד לכל סניף. אין חשבון אחד שמנהל כמה סניפים, ולכן מערכת שמשרתת שני סניפים מחזיקה שני חשבונות ומתחברת לכל אחד בנפרד |
| מפתח Web API | מזהה הפרויקט הציבורי שנדרש כדי להחליף את הסיסמה בטוקן (§11). הוא אינו סוד ולא מעניק דבר בעצמו — הסיסמה היא הסוד |
| מזהה המסעדה | המזהה של הסניף ב‑RazGaz. לפיו מסננים כשקוראים הזמנות (§14). אותו ערך נמצא גם בתוך הטוקן שלכם, ב‑claim בשם restaurantId |
אין כאן קוד סניף ואין מפתח API כמו של מערכת קופה. בממשק הזה החשבון הוא הזהות, והסניף
נגזר ממנו. סניף ש‑RazGaz סימנה כלא פעיל לא יכול לפתוח הזמנות (403). ההזמנות
הקיימות שלו נשארות קריאות וממשיכות להתעדכן.
11הזדהות
11.1קבלת טוקן
POST https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=<WEB_API_KEY>
{
"email": "branch@example.com",
"password": "…",
"returnSecureToken": true
}
שמרו שלושה שדות מהתשובה:
| שדה | מה עושים איתו |
|---|---|
idToken | הטוקן עצמו. נשלח בכל בקשה, §11.3 |
refreshToken | מחליף טוקן שפג, §11.2. לא פג בעצמו |
expiresIn | משך החיים בשניות — 3600, שעה |
11.2רענון
POST https://securetoken.googleapis.com/v1/token?key=<WEB_API_KEY>, עם
grant_type=refresh_token&refresh_token=<refreshToken> בקידוד
application/x-www-form-urlencoded. התשובה מכילה id_token חדש.
אל תתחברו עם הסיסמה בכל בקשה. החזיקו את הטוקן בזיכרון ורעננו אותו לפני שהוא פג;
דקה של מרווח מספיקה. טוקן שפג נענה ב‑401, וחזרה עם אותו טוקן תקבל את אותה תשובה
לנצח.
11.3שימוש בטוקן
בכל בקשה, לכל כתובת:
Authorization: Bearer <idToken>
בקשה בלי טוקן, עם טוקן שפג, או עם טוקן של חשבון אחר נענית ב‑401 או ב‑403, ודבר
אינו נרשם. לא נפתחת הזמנה ושום דבר לא מתעדכן. בסביבת ייצור, שגיאה כזו פירושה
שהאינטגרציה לא מספקת דבר בלי שאיש שם לב. הסלימו אותה במקום לחזור על הבקשה.
12פתיחת הזמנה
POST https://api.raz-gaz.com/createRestaurantOrder
הקריאה פותחת הזמנת משלוח לסניף שהחשבון מקושר אליו. נקודת האיסוף לא נשלחת ואי אפשר לשלוט בה: זה המיקום השמור של הסניף. RazGaz מתמחרת את שכר השליח, מציעה את ההזמנה לשליחים באזור, ומנהלת את השליח מהשיוך ועד המסירה.
12.1בקשה — שדה החובה
| שדה | טיפוס | תיאור |
|---|---|---|
deliveryAddress | מחרוזת | כתובת המסירה בשורה קריאה אחת: רחוב, מספר בית ועיר (§2.4). השליח קורא אותה. בלי קואורדינטות, את השורה הזו מחפשים על המפה |
זה שדה החובה היחיד. כל השאר — כולל רשימת הפריטים והקואורדינטות — אופציונלי.
12.2בקשה — נקודת המסירה על המפה
| שדה | טיפוס | תיאור |
|---|---|---|
deliveryLocation | אובייקט | { "latitude": number, "longitude": number }, שני הערכים מספרים ב‑JSON |
מומלץ, לא חובה. אם יש למערכת שלכם קואורדינטות, שלחו אותן.
בלעדיהן, אנחנו מאתרים את הכתובת בעצמנו. אם הכתובת לא מציינת עיר, אנחנו מוסיפים את העיר של הסניף עצמו: "הרצל 5" מסניף ברעננה הוא הרצל שברעננה. הכתובת השמורה שומרת את המילים שלכם ומוסיפה את העיר, כך שהשליח קורא כתובת מלאה.
שלושה מקרים שכדאי לתכנן סביבם:
- כתובת שאי אפשר לאתר כלל היא
400, עם הודעה בעברית. - כתובת שמזוהה רק ברמת העיר מקבלת נקודה במרכז העיר במקום בבניין, וההזמנה נפתחת כרגיל. שום דבר בתשובה לא מבדיל בין השניים. אם הדיוק הזה חשוב לכם, שלחו קואורדינטות.
- נקודה בעיר אחרת מזו שהכתובת מציינת נזרקת. אז מחפשים את הכתובת לפי המילים שלה. סומכים על נקודה רק כשהיא מתאימה לכתובת.
12.3בקשה — שדות אופציונליים
| שדה | טיפוס | תיאור |
|---|---|---|
items | מערך | פריטי ההזמנה, כל אחד { "name": string, "qty": number }. השליח רואה את הרשימה, ומולה בודקים איסוף בדלפק. הזמנה בלי פריטים, או עם מערך ריק, נפתחת כרגיל. ערך שאינו מערך הוא 400. כמות חסרה, 0, או כזו שאינה מספר מוצגת כ‑1 |
estimatedReadyMinutes | מספר שלם | דקות מעכשיו ועד שהאוכל מוכן, גדול מ‑0, לא יותר מ‑240, ולא פחות מהמינימום של האזור (§2.3). שלחו אותו בכל פעם שהמערכת שלכם יודעת את המספר. בהזמנה מתוזמנת שלחו אותו תמיד: אחרי התזמון שום דבר לא שואל עליו שוב |
scheduledFor | מספר | מחרוזת | תזמון: מתי השליח צריך להגיע למסעדה לאסוף את ההזמנה, באלפיות שנייה מ‑epoch או ב‑ISO-8601. ההזמנה מוחזקת ב‑scheduled, לא מוצעת לאף שליח, ומשתחררת 20 דקות לפני השעה הזו. היא חייבת להיות בעתיד ולא יותר מ‑7 ימים קדימה, אחרת הקריאה היא 400 |
customerName | מחרוזת | שם הלקוח, כפי שהשליח צריך לבקש אותו |
customerPhone | מחרוזת | מספר שהשליח יכול להתקשר אליו בהגעה. נבדק: נייד ישראלי בן 10 ספרות (05…), קו נייח בן 9 (03…), מספר +972, או מספר של מדינה אחרת שמתחיל ב‑+. כל דבר אחר הוא 400. הוא נשמר בצורה מנורמלת |
floor | מחרוזת | הקומה, מוצגת לשליח בהגעה לבניין |
apartment | מחרוזת | הדירה |
entrance | מחרוזת | הכניסה |
notes | מחרוזת | טקסט חופשי שמוצג לשליח: הוראות מסירה, "להשאיר בדלת" |
orderAmount | מספר | §2.5 |
paymentMethod | מחרוזת | §2.5 |
bigOrder | בוליאני | true להזמנה גדולה מדי לקטנוע אחד. היא מוצעת קודם לרכבים, עשויה להתחלק בין שני שליחים, ומחויבת כשני משלוחים. אי אפשר לשנות את זה אחרי שההזמנה נפתחה |
orderSize | מספר | 2 שקול ל‑bigOrder: true. כל ערך אחר הוא הזמנה רגילה |
12.4שדות שמורים — אין לשלוח
נקודת האיסוף, שכר השליח, רדיוס ההצעה לשליחים, אזור התמחור ומספר ההזמנה שמוצג לאנשים נקבעים כולם ב‑RazGaz. אף אחד מהם לא נלקח מהבקשה.
12.5תשובה
201 עם:
{ "success": true, "orderId": "…" }
orderId הוא זהות ההזמנה ב‑RazGaz, ושאר החלק הזה משתמש בו. שמרו אותו לצד ההזמנה
במערכת שלכם. אין דרך אחרת להפנות להזמנה, ואין חיפוש לפי מזהה שלכם.
12.6שגיאות
גוף כל שגיאה הוא { "error": "<message>" }.
| HTTP | מתי |
|---|---|
400 | deliveryAddress is required · items must be an array |
400 (עברית) | זמן ההכנה אינו מספר חיובי או גדול מ‑240; scheduledFor לא תקין, בעבר, או יותר מ‑7 ימים קדימה; מספר טלפון לא תקין |
400 (עברית) | זמן ההכנה המינימלי של האזור. estimatedReadyMinutes נמוך ממנו. ההודעה מציינת את המינימום: שלחו לפחות את המספר הזה |
400 (עברית) | כתובת שנשלחה בלי קואורדינטות ולא ניתן היה למקם אותה על המפה כלל (§12.2) |
400 | Restaurant is missing a pickup location — תקלת הגדרה; פנו אלינו |
401 | הטוקן חסר, פג או לא תקין (§11) |
403 | No restaurant is linked to this account · Restaurant is not active |
405 | לא POST |
12.7קריאה חוזרת פותחת הזמנה שנייה
לקריאה הזו אין idempotency. RazGaz יוצרת מזהה הזמנה חדש בכל קריאה, ואין שדה למזהה שלכם. לכן RazGaz לא יכולה לדעת ששתי בקשות מתארות את אותה הזמנה. אם חוזרים על הקריאה אחרי תום זמן והבקשה הראשונה כן נקלטה, נפתח משלוח שני, ושני שליחים מגיעים לאותו סניף.
ניסיון חוזר אוטומטי על הקריאה הזו הוא באחריות המערכת שלכם, והוא בטוח רק כשידוע שהבקשה הראשונה לא נכתבה. כדי לבדוק, קראו את ההזמנות הפעילות (§14.1) וחפשו אחת עם אותה כתובת, אותו טלפון ואותה שעה. הזמנה שנפתחה פעמיים בטעות מבטלים לפי §15.2.
13זמן הכנה ותזמון
13.1איך הזמנה חדשה מתחילה
| ההזמנה | הסטטוס הראשון שלה |
|---|---|
נשלחה עם scheduledFor | scheduled, משתחררת 20 דקות לפני שעת האיסוף |
נשלחה עם estimatedReadyMinutes, או שלסניף יש ממוצע והוא לא מוגדר לתת זמן לכל הזמנה | pending, ומוצעת לשליחים מיד |
| אין לה זמן הכנה והסניף מוגדר לתת זמן לכל הזמנה | awaiting_prep_time — מוחזקת עד שעונים לפי §13.2 או §13.3 |
| כל אחד מהמקרים האלה, כש‑RazGaz מחזיקה את ההזמנה אצל מוקדן | held (§2.2). אין לכם מה לעשות |
אין שחרור אוטומטי מ‑awaiting_prep_time. להציע הזמנה לשליחים על סמך ניחוש גרוע יותר
מלחכות. הדרך הפשוטה להימנע מההחזקה היא לשלוח תמיד estimatedReadyMinutes.
13.2"מוכן בעוד N דקות"
POST https://api.raz-gaz.com/submitPrepTime
{ "orderId": "…", "minutes": 20 }
minutes הוא מספר דקות מעכשיו: גדול מ‑0, לא יותר מ‑240, ולא פחות מהמינימום של האזור
(§2.3).
הקריאה עושה אחד משני דברים, לפי מצב ההזמנה. אין צורך לבחור ביניהם:
| מצב ההזמנה | מה קורה |
|---|---|
awaiting_prep_time | משחררת את ההזמנה. היא עוברת ל‑pending ושעון ההכנה מתחיל עכשיו. אם RazGaz מחזיקה את הזמנות הסניף אצל מוקדן, היא עוברת במקום זה ל‑held — אין לכם מה לעשות |
| כל מצב פעיל אחר | מעדכנת את זמן ההכנה. הסטטוס לא משתנה. זה המסלול של "האוכל יתעכב בעשר דקות", ושליח שכבר שובץ מקבל הודעה |
delivered / cancelled | 409 — ההזמנה הסתיימה |
בשחרור אפשר לשלוח גם paymentMethod ("cash" או "card") ו‑orderAmount (חובה
במזומן, גדול מ‑0) כדי לציין את התשלום באותה קריאה.
תשובה:
{ "success": true, "orderId": "…", "minutes": 20, "released": true,
"readyAt": 1762520400000, "paymentMethod": "card" }
released אומר אם הקריאה שחררה את ההזמנה או עדכנה אותה. readyAt הוא באלפיות שנייה
מ‑epoch בשחרור, ו‑null בעדכון.
| HTTP | מתי |
|---|---|
400 | orderId is required; minutes מחוץ לטווח או מתחת למינימום של האזור; תשובת תשלום לא תקינה |
403 | Not your order · No restaurant is linked to this account |
404 | Order not found |
409 | Order is already finished |
13.3תזמון הזמנה שכבר פתוחה
אם אתם יודעים את השעה כשאתם פותחים את ההזמנה, שלחו scheduledFor
ב‑createRestaurantOrder (§12.3) וזהו. הקריאה הזו מיועדת להזמנה שכבר פתוחה
ומוחזקת ב‑awaiting_prep_time.
POST https://api.raz-gaz.com/scheduleRestaurantOrder
{ "orderId": "…", "scheduledFor": "2026-11-08T20:30:00+02:00", "minutes": 25 }
זו תשובה אחרת לאותה שאלה. במקום כמה זמן האוכל לוקח מעכשיו, אומרים מתי השליח צריך
לבוא לקחת אותו. RazGaz מחזיקה את ההזמנה ב‑scheduled ומציעה אותה לשליחים 20 דקות
לפני השעה הזו.
| שדה | טיפוס | תיאור |
|---|---|---|
orderId | מחרוזת | ההזמנה. היא חייבת להיות ב‑awaiting_prep_time |
scheduledFor | מספר | מחרוזת | מתי השליח צריך להגיע למסעדה, באלפיות שנייה מ‑epoch או ב‑ISO-8601. חייב להיות בעתיד ולא יותר מ‑7 ימים קדימה |
minutes | מספר שלם | זמן ההכנה: 1–240, ולא פחות מהמינימום של האזור. חובה |
paymentMethod, orderAmount | אופציונליים, כמו ב‑§13.2 |
תשובה:
{ "success": true, "orderId": "…", "scheduledFor": 1762626600000,
"releaseAt": 1762625400000, "minutes": 25, "paymentMethod": null }
שתי השעות באלפיות שנייה מ‑epoch. releaseAt הוא הרגע שבו ההזמנה תוצע לשליחים.
| HTTP | מתי |
|---|---|
400 | שעה לא תקינה, בעבר, או יותר מ‑7 ימים קדימה; minutes מחוץ לטווח או מתחת למינימום של האזור; תשובת תשלום לא תקינה |
403 | Not your order |
404 | Order not found |
409 | ההזמנה לא ב‑awaiting_prep_time (הגוף מכיל את ה‑status שלה), או שעדיין אין לה נקודה על המפה |
הזמנה שכבר הוצעה לשליחים אי אפשר לתזמן מהממשק הזה. אם הלקוח מזיז את השעה אחרי השחרור, בטלו (§15.2) ופתחו הזמנה חדשה לשעה הנכונה.
14קריאת ההזמנות שלכם
כל מה שהפורטל מציג נקרא כאן: הסטטוס, השליח, המיקום שלו על המפה וזמני ההגעה. הקריאות האלה הולכות לכתובת מסד הנתונים של Google, עם אותו טוקן (§11.3). כל קריאה בפרק הזה מתחילה מ:
https://firestore.googleapis.com/v1/projects/razgaz-f7295/databases/(default)/documents
מגבלות התשאול הן חלק מהחוזה. תשאול הוא הדרך היחידה לדעת מה קרה להזמנה, אלא אם משתמשים במאזין (§14.6), ולכן הקצב שלו אינו עניין של נימוס:
| קצב מותר | בקשה אחת בדקה לכל סניף, לכל היותר |
| כשאין הזמנה פעילה | לא לתשאל בכלל |
| מספר המתשאלים | אחד לכל סניף — לא אחד לכל קופה או מסך |
כל אחת מהמגבלות האלה כבר נשברה באינטגרציה אחרת. מערכת אחת תשאלה אותנו כל 0.37 שניות, מסביב לשעון, מכמה עמדות, בשביל מסעדה אחת.
שום דבר לא דוחה בקשה בודדת על חריגה מהמגבלות. נתיב הקריאה הוא שירות של Google, בלי שכבה שלנו לפניו. אנחנו עוקבים אחרי נפח הקריאות הכולל. אם סניף ממשיך לחרוג, ניצור איתכם קשר. אם זה נמשך, חשבון הסניף מושבת. זה הכלי היחיד שיש לנו כאן, והוא עוצר גם את פתיחת ההזמנות. מאזין (§14.6) חוסך את כל השאלה.
14.1ההזמנות הפעילות
POST …/documents:runQuery
{
"structuredQuery": {
"from": [{ "collectionId": "orders" }],
"where": { "compositeFilter": { "op": "AND", "filters": [
{ "fieldFilter": {
"field": { "fieldPath": "restaurantId" },
"op": "EQUAL",
"value": { "stringValue": "<restaurant id>" } } },
{ "fieldFilter": {
"field": { "fieldPath": "status" },
"op": "IN",
"value": { "arrayValue": { "values": [
{ "stringValue": "scheduled" },
{ "stringValue": "awaiting_prep_time" },
{ "stringValue": "awaiting_location" },
{ "stringValue": "held" },
{ "stringValue": "pending" },
{ "stringValue": "broadcasting" },
{ "stringValue": "accepted" },
{ "stringValue": "arrived_at_pickup" },
{ "stringValue": "picked_up" },
{ "stringValue": "arrived_at_delivery" }
] } } } }
] } }
}
}
<restaurant id> הוא הערך מפרק 10. סננו תמיד לפי restaurantId. שאילתה שלא ניתן
להוכיח שהיא נוגעת רק בהזמנות שלכם נדחית כולה, בשגיאת הרשאה ולא בתוצאה מסוננת.
השאילתה לפי שם הסניף שהופיעה בגרסאות קודמות של המסמך נדחית גם היא, מחוסר אינדקס:
העבירו אותה ל‑restaurantId.
14.2הזמנה בודדת
GET …/documents/orders/<orderId>, עם הטוקן בכותרת.
השתמשו בזה כדי לעקוב אחרי הזמנה אחת בלי לקרוא את כל הלוח, ובמיוחד כדי לוודא שקריאה מפרק 12 או 13 שלא קיבלה תשובה אכן נקלטה. הזמנה של סניף אחר, או מזהה שלא קיים, נענים בשגיאת הרשאה.
14.3היסטוריה
הזמנות לעולם לא נמחקות. הזמנה שנמסרה או בוטלה נשארת קריאה. להיסטוריה, קראו את הזמנות הסניף מהחדשה לישנה ועצרו איפה שצריך:
{
"structuredQuery": {
"from": [{ "collectionId": "orders" }],
"where": { "fieldFilter": {
"field": { "fieldPath": "restaurantId" },
"op": "EQUAL",
"value": { "stringValue": "<restaurant id>" } } },
"orderBy": [{ "field": { "fieldPath": "createdAt" }, "direction": "DESCENDING" }],
"limit": 50
}
}
14.4השדות שחוזרים
התשובה היא מסמך Firestore, ולכן כל ערך עטוף בטיפוס שלו (stringValue,
integerValue, doubleValue, timestampValue, nullValue, geoPointValue,
mapValue, arrayValue). אלה השדות שמעניינים מערכת מסעדה. להזמנה יש שדות נוספים,
כולם פנימיים ל‑RazGaz:
| שדה | מה זה |
|---|---|
status | מצב ההזמנה, §2.2 |
platformOrderRef | מספר ההזמנה לאנשים — מה שאומרים בטלפון |
estimatedReadyMinutes | זמן ההכנה הרשום, בדקות |
readyAt | מתי האוכל צפוי להיות מוכן, לפי זמן ההכנה |
markedReadyAt | מתי מישהו אמר שהאוכל מוכן. ריק עד אז, §15.1 |
carrierId | המזהה של השליח, או null עד שמשובץ שליח. המפתח ל‑§14.5 |
eta | מפה, קיימת מרגע ששובץ שליח. eta.pickupArrivalAt הוא זמן ההגעה המשוער של השליח לסניף, ו‑eta.deliveryArrivalAt זמן ההגעה המשוער שלו ללקוח, שניהם חותמות זמן. הם מחושבים מחדש כל שתי דקות כל עוד השליח על ההזמנה |
scheduledFor | בהזמנה מתוזמנת, השעה שבה השליח מגיע למסעדה, §13.3 |
cancelledAt, cancellationReason | הביטול: מתי, ומה נכתב עליו |
deliveredAt | רגע המסירה ללקוח |
deliveryAddress, customerName, customerPhone, items, orderAmount, paymentMethod, notes | כפי שנשלחו בפרק 12. הטלפון בצורתו המנורמלת, וייתכן שלכתובת נוספה העיר |
זמן ההכנה המינימלי של האזור (§2.3) ניתן לקריאה ב‑GET …/documents/regions/<regionId>,
בשדה busyLagMinutes. ה‑regionId של הסניף נמצא במסמך שלו,
GET …/documents/restaurants/<restaurant id>. שדה חסר או 0 פירושו שאין מינימום.
14.5מעקב אחרי השליח
GET …/documents/carrierPublic/<carrierId>, מרגע שלהזמנה יש carrierId.
| שדה | מה זה |
|---|---|
displayName | שם השליח |
phone | מספר הטלפון שלו, למי שרוצה כפתור חיוג |
currentLocation | המיקום שלו על המפה, geoPointValue, מתעדכן כל עוד הוא במשמרת |
currentLocationUpdatedAt | מתי המיקום הזה נרשם |
vehicleType | כלי הרכב |
זה כל מה שמסעדה יכולה לקרוא על שליח. הרשומה של השליח עצמו (carriers/<carrierId>)
פרטית ונענית בשגיאת הרשאה.
14.6בלי תשאול בכלל — הדרך המומלצת
ל‑Firestore יש ערוץ האזנה. פותחים חיבור אחד ומקבלים כל שינוי ברגע שהוא קורה. כך עובד הפורטל של RazGaz עצמו, וזו הדרך המומלצת גם כאן. שינויים מגיעים מיד ולא בתוך דקה, והערוץ לא עולה דבר כשלא קורה דבר, ולכן המגבלות שלמעלה לא חלות עליו.
ערוץ ההאזנה עובד ב‑gRPC ולא קיים ב‑REST, ולכן הוא דורש את ה‑SDK של Firebase. ב‑Node:
const { initializeApp } = require('firebase/app');
const { getAuth, signInWithEmailAndPassword } = require('firebase/auth');
const { getFirestore, collection, query, where, onSnapshot } = require('firebase/firestore');
const app = initializeApp({ apiKey: '<WEB_API_KEY>', projectId: 'razgaz-f7295' });
const { user } = await signInWithEmailAndPassword(getAuth(app), 'branch@example.com', '…');
const { restaurantId } = (await user.getIdTokenResult()).claims;
onSnapshot(
query(
collection(getFirestore(app), 'orders'),
where('restaurantId', '==', restaurantId),
where('status', 'in', ['scheduled', 'awaiting_prep_time', 'awaiting_location', 'held',
'pending', 'broadcasting', 'accepted', 'arrived_at_pickup', 'picked_up',
'arrived_at_delivery']),
),
(snap) => {
for (const change of snap.docChanges()) {
// 'added' — an order joined the board · 'modified' — status, carrier or ETA changed
console.log(change.type, change.doc.id, change.doc.data().status);
}
},
);
השאילתה וההרשאות שלה זהות לאלה של §14.1. ה‑SDK מחזיק ומרענן את הטוקן בעצמו, כך ש‑§11.2 לא נדרש במסלול הזה. השדות הם אלה של §14.4, ומגיעים כערכים פשוטים ולא עטופים בטיפוסי Firestore.
כל שינוי במסמך מגיע, לא רק שינויי סטטוס. זמן ההגעה, למשל, נכתב מחדש כל שתי דקות כל עוד ההזמנה בדרך. בזכות זה אפשר להציג זמן הגעה שזז. זה גם מה שקובע את העלות: כמה עשרות שינויים להזמנה, ושום דבר בין הזמנות.
מתי בכל זאת לתשאל. השתמשו בתשאול של §14.1 כשאין SDK, למשל בסביבת PHP או .NET ישנה שלא יכולה להחזיק חיבור פתוח. אז חלות המגבלות שבראש פרק 14.
15פעולות על הזמנה קיימת
שתי הפעולות הן POST …/documents:commit לכתובת מסד הנתונים מפרק 14, עם אותו טוקן,
בדיוק בצורה שמוצגת. רק השדות האלה ניתנים לכתיבה בהזמנה מהממשק הזה, ורק בהזמנות
של הסניף שלכם. שדה שאינו ברשימה, או הזמנה של סניף אחר, מקבלים שגיאת הרשאה ולא כתיבה
חלקית.
בכל בקשה, <orderId> הוא המזהה מ‑§12.5.
15.1האוכל מוכן
{ "writes": [ {
"update": {
"name": "projects/razgaz-f7295/databases/(default)/documents/orders/<orderId>",
"fields": { "readySource": { "nullValue": null } }
},
"updateMask": { "fieldPaths": ["markedReadyAt", "readySource"] },
"updateTransforms": [
{ "fieldPath": "markedReadyAt", "setToServerValue": "REQUEST_TIME" }
]
} ] }
זו ההודעה לשליח שאין יותר על מה לחכות. markedReadyAt נכתב בזמן השרת ולא בשעון של
המערכת שלכם, כי כל מה שבצד השני קורא אותו כזמן RazGaz. שעון שסוטה בכמה דקות היה מזיז
את ההודעה.
שום דבר אחר לא כותב אותו. זמן הכנה הוא הערכה, והערכה שנגמרת לא מסמנת את האוכל כמוכן. אם הקריאה הזו לא נעשית, השליח לא מקבל את ההודעה לעולם. ההזמנה עדיין משובצת, נאספת ונמסרת כרגיל. שלחו אותה כשהשקית על הדלפק, לא לפני. קראו לה פעם אחת; קריאה שנייה רק כותבת זמן חדש על הראשון.
כדי לשנות את זמן ההכנה, השתמשו ב‑§13.2 ולא בכתיבה ישירה. submitPrepTime גם מודיע
לשליח שכבר שובץ; כתיבה ישירה לא מודיעה לאיש.
15.2ביטול
{ "writes": [ {
"update": {
"name": "projects/razgaz-f7295/databases/(default)/documents/orders/<orderId>",
"fields": {
"status": { "stringValue": "cancelled" },
"cancellationReason": { "stringValue": "הלקוח ביטל" },
"cancelledBy": { "stringValue": "restaurant" }
}
},
"updateMask": { "fieldPaths": ["status", "cancelledAt", "cancellationReason", "cancelledBy"] },
"updateTransforms": [
{ "fieldPath": "cancelledAt", "setToServerValue": "REQUEST_TIME" }
]
} ] }
"cancelled" הוא הערך היחיד של status שהממשק הזה רשאי לכתוב. את הסטטוסים
האחרים כותבת RazGaz, כי הם מתארים מה קורה עם השליח. הזמנה שמסומנת מבחוץ למצב שלא תואם
את המציאות מתרחקת ממה שהמוקדן והשליח רואים.
cancellationReason נקרא על ידי אדם, אז כתבו סיבה ממשית — "הלקוח ביטל", "הסניף
סגור" — ולא ריק.
ביטול הוא סופי. הזמנה שבוטלה לא מוצעת שוב לשליחים ואי אפשר להחיות אותה. אם צריך, פותחים הזמנה חדשה (פרק 12).
cancelledBy: "restaurant" הוא מה שמודיע לשליח. איתו, RazGaz שולחת את הביטול
לשליח שעל ההזמנה — או, כל עוד היא מוצעת, לכל השליחים שהיא הוצעה להם. זה הערך היחיד
שמתקבל בשדה הזה, ורק בכתיבה שמבטלת. ביטול בלעדיו עדיין מתקבל אבל לא מודיע לאף
שליח, ולכן שלחו אותו תמיד.
ביטול הזמנה שהשליח כבר אסף לא מחזיר את האוכל. מ‑picked_up ואילך, התקשרו גם למוקד
של RazGaz.
16מה אין בממשק הזה
כדאי לדעת לפני שמתכננים, כדי ששום דבר לא יהיה תלוי בזה:
| קריאה חוזרת מ‑RazGaz | אין. אין webhook ואין דחיפה למערכת שלכם. את השינויים קוראים, §14 |
| מזהה הזמנה משלכם | אין. המזהה הוא של RazGaz, ואין חיפוש לפי מזהה שלכם — §12.5, §12.7 |
| שינוי כתובת או פרטי לקוח אחרי הפתיחה | אין. הזמנה שנפתחה עם כתובת שגויה מבוטלת ונפתחת מחדש |
| בחירת שליח, או שינוי אזור או מחיר | אין. שיבוץ השליח, השכר שלו ורדיוס ההצעה שייכים ל‑RazGaz |
| תזמון הזמנה שכבר שוחררה | אין. תזמון אפשרי רק מ‑awaiting_prep_time — §13.3 |
| חשבון אחד לכמה סניפים | אין. חשבון אחד לכל סניף, פרק 10 |
17לפני העלייה לאוויר
בסדר הזה, מול סניף אמיתי אחד:
- ההתחברות מחזירה טוקן, והרענון עובד. בדקו גם את המסלול אחרי שעה, לא רק את ההתחברות: בסביבת ייצור זה המסלול שפוגשים כל הזמן.
- הזמנת בדיקה נפתחת ומחזירה
201ו‑orderId, והמערכת שלכם שומרת את ה‑orderIdלצד ההזמנה. - השאילתה של §14.1 מחזירה בדיוק את ההזמנה הזו. שגיאה כאן פירושה שהשאילתה לא
מסננת לפי ה‑
restaurantIdשלכם בדיוק כפי שמוצג. - הסטטוס זז. הוא עובר מ‑
pendingל‑broadcasting, ואז ל‑acceptedכששליח לוקח את ההזמנה. בשלב הזהcarrierIdמתמלא ו‑§14.5 מחזיר את המיקום של השליח. - "האוכל מוכן" (§15.1) נכתב.
markedReadyAtמתמלא בקריאה הבאה. - הביטול (§15.2) עובד על הזמנת הבדיקה וסוגר אותה, עם
cancelledByבכתיבה. סיימו בשלב הזה, כדי שמשלוח בדיקה לא יישאר מוצע לשליחים. -
estimatedReadyMinutesנשלח בכל הזמנה, במינימום של האזור או מעליו. אחרת, ודאו עם RazGaz שהסניף לא מוגדר לתת זמן לכל הזמנה; אם הוא כן, ההזמנה הראשונה בסביבת ייצור תישאר מוחזקת (§13.1).
לשאלות ולתקלות אינטגרציה, פנו למי שמסר לכם את המסמך. שגיאה שחוזרת בסביבת ייצור —
במיוחד 401, 403, או קריאה שחוזרת ריקה — פירושה שהאינטגרציה לא מספקת דבר בלי שאיש
שם לב. הסלימו אותה מיד, במקום לחכות להזמנה הבאה.