כיצד מייצרים חשבונית דינמית באינטגרומט?

כיצד מייצרים חשבונית דינמית באינטגרומט

אחד הדברים השימושיים ביותר באינטגרומט היא היכולת לייצר מסמכים חשבונאים דינמים באופן אוטומטי. כשאני אומר דינמי, אני מתכוון לכך שיש מספר משתנה של פריטים, מחירים שונים, מאחר ואנחנו לא רוצים לעבוד קשה, יש ליצור מנגנון מסודר שיידע לייצר את המסמכים בין אם יש לנו פריט אחד או מאה פריטים.

קצת תיאוריה

על מנת להבין את הפתרון יש להבין את הבעיה. כל מערכת איקומרס\סליקה שמכבדת את עצמה מסוגלת לשלוח קריאת שרת שמכילה את המידע של אותה רכישה\סליקה. הדבר יכול להתבצע  במתודות ובתצורות שונות. היופי של אינטגרומט הוא שהמידע נקרא ומפורמט בצורה אוטומטית למשהו שנראה ככה:

json purchase example

אחד הפורמטים הנפוצים ביותר הוא JSON שזה קיצור של Javascript Object Notation כמו בדוגמה מעל. 

ניתן לראות את המשתנים: שם, אימייל, סכום כולל של רכישה. לאחר מכן משתנה בשם Items, חדי העין יבחינו כי הוא קצת שונה כי הוא מכיל בתוכו מערך של אובייקטים. הדרך הכי קלה לתאר מערך היא להסתכל עליו כאל ארונית עם מגירות כאשר כל מגירה מכילה מידע. במקרה שלנו items זו הארונית וכל אובייקט שמכיל את המשתנים item_name, item_price, item_amount ו – item_description היא מגירה.

הבעיה

בבנית תרחיש באינטגרומט מתחילים לרוב בטריגר. הטריגר מקבל את קריאת השרת המכילה את המידע.  המידע מופנה לתוך מודול יצירת מסמך. במידה ומדובר במוצר אחד, אין בעיה, פשוט מגדירים מוצר אחד כמו בדוגמאות הבאות:

מודול של Icount באינטגרומט

icountmanually

מודול של חשבונית ירוקה באינטגרומט

greeeninvoicemanually

במידה ויש פריט אחד במסמך, כמו בדוגמאות מעלה, אין בעיה פשוט ממפים את איבר מספר 1. אבל אם יש מספר אייטמים במסמך, עלינו לאגד את כל המוצרים בצורה דינמית למבנה הספציפי שהמודול מצפה לקבל. אני יודע שלחלקכם זה נשמע כמו סינית אבל אתם לא חייבים להבין את זה ב 100% אלא רק כיצד עושים זאת בעזרת אינטגרומט.

הפתרון

כדי לפתור את האתגר הזה אנחנו משתמשים ב – 2 אפליקציות בילט אין של אינטגרומט שנקראות Iterator ו Array Aggregator.

Iterator – אפליקציה שיודעת לקבל מערך ולרוץ על כל הפריטים אחד אחרי השני. לדוגמא אם אני שולח מערך בשם items שמכיל 4 פריטים כמו בדוגמה הראשונה שלי, התוצאה שלו תהיה 4 באנדלים (ריצות) של מידע, אחת לכל פריט. 

בדוגמה הזו אני מראה כיצד אני ממפה את המערך של items שקיבלתי לתוך ה Iterator.

 

iterator

Array Aggregator – אפליקציה שלוקחת באנדלים נפרדים ומייצרת מהם מערך אחד שמכיל את כל הנתונים.

לאחר שמיפינו את המערך שמכיל את ה – items לתוך האיטרטור הוא בעצם מייצר לנו באנדלים שמכילים את המוצרים. כדי שנוכל לייצר מסמך חשבונאי עם כמות פריטים דינמית, נצטרך למלא את הפריטים במסמך בצורה דינמית. מאחר ואנו לא יודעים תמיד כמה פריטים נקבל, בעזרת שילוב של ה – Iterator וה – Array Aggregator נוכל לבצע זאת.

חשוב מאוד – בניגוד לרוב הפעמים, שאנו מוסיפים אפליקציות ומודולים אחד אחרי השני, כאשר אנו מוסיפים את המודול של Array Aggregator, יש לוודא כי יש אחריו מודול של יצירת מסמך (של חשבונית ירוקה, אייקאונט, איזיקאונט וכו') והוא צריך להראות כך לפני שאנו מגדירים את ה Array Aggregator:

scenario

ועכשיו להגדרת ה Aggergator עצמו. אנו צריכים להגדיר את ה source module כ Webhook או כטריגר שמתחיל את הסנריו. תחת Target structure type לבחור Income rows (אם מדובר בחשבונית מס לדוגמה). לאחר מכן יש למפות את המידע שקיבלנו מה Iterator לתוך השדות המתאימים.

מודול של חשבונית ירוקה באינטגרומט

aggregatorgi

יש למפות את התוצאה של ה Array Aggregator לתוך ה – Income rows כמו בדוגמה הבאה:

אתם בטח חושבים לעצמכם "זהו?" אז התשובה היא לא :), מכיוון שאנו משתמשים במודול Array Aggregator, כל המידע שרץ לפני ה Aggregator כבר לא ניתן לשימוש מאיר ועבר אגרגציה. בעצם אם אני רוצה להשתמש במידע כמו: המייל של הלקוח, או השם של הלקוח (שנמצא מחוץ למערך שמכיל את הפריטים) אין לי אפשרות לעשות זאת. 

הפתרון הוא להשתמש במודולים: Set Variable ו Get Variable המאפשרים לי לקבוע משתנה שאוכל למשוך ממנו מידע גם אם מדובר בהתפצלות אליה הוא לא מחובר.

הסנריו שלכם צריך להראות כך:

אני אסביר מה שקורה כאן בקצרה:

1. אני מפצל את סנריו ל – 2 ואני שומר את מה שאני רוצה בתור משתנה לפני שהוא עובר אגרגציה בעזרת Set Variable, במקרה שלי קראתי למשתנה שלי בשם name ששומר את שם הלקוח שממופה מהשלב הראשון.

 

set variable

2. אני מושך את המשתנה בעזרת המודול Get Variable, כל מה שעלי לעשות זה להקליד את שם המשתנה.

 

get variable

3. אני ממפה את התוצאה של ה Get Variable לתוך השדה שמכיל את שם הלקוח במודול שמייצר לי את המסמך (חשבונית מס, קבלה וכו')

 

getvariablemap

מאוד חשוב – לאחר הטריגר שלנו, כשאנו מפצלים את הסנריו ל – 2 יש לוודא כי אתם מחברים את המודול של Set Variable ל – Router ורק אז מחברים את ה – Iterator. ה – Router רץ לפי הסדר אליו חיברנו את המודולים אז אנו חייבים לוודא שה – Set Variable ירוץ כדי שהמשתנה שלנו יהיה קיים כאשר ה – Get Variable רץ.

התוצאה הסופית שאנו צריכים לקבל באינטגרומט היא זו:

final result

והמסמך שלנו נראה כך:

document demo

אני מבין שזה עלול להיות קצת קשה לעיקול, את מה שביצעתי כאן על המודול של חשבונית ירוקה ניתן לעשות גם באייקאונט ובאיזי קאונט (אפליקציות שאני כתבתי) וגם במודולים של חברות אחרות. ה Best Practice לעשות דברים כאלו זה לעבוד בסביבת Sandbox ולא להוציא מסמכים חשבונאים שתצטרכו לבטל. מהצד השני גם לא תרצו לבצע רכישה בכל פעם שתרצו לבדוק אם הסנריו שלכם מוגדר בצורה הנכונה אבל כיצד עושים זאת אני אשמור לפוסט הבא :).

הירשמו לרשימת הדיוור שלנו

קבלו עדכונים וחדשות מעולם האוטומציה

תחלקו את הפוסט הזה - מה אכפת לכם ?

שיתוף ב facebook
שיתוף ב linkedin
שיתוף ב twitter
שיתוף ב email

לפוסט הזה יש 8 תגובות

  1. היי תודה על המדריך!
    אני לא מוצאת את האפשרות לחבר בכלל את חשבונית ירוקה לאינטגרומט. יכול להיות שזה הוסר?

      1. מה בדיוק עושים עם הקישור הזה, הוא לא מאפשר להתקין שום דבר בשום מקום, ואני לא מוצא את התוסף בmake

  2. היי, עשיתי בדיוק לפי ההדרכה פה, באיזיקאונט עבד יפה עם כמות של פריטים, אבל בחשבונית ירוקה- מורנינג הגיעה לי רק שורה אחת, מה יכולה להיות הסיבה?

    1. היי יעל,
      נשמע כאילו משהו מתפספס, אני רוצה לעזור לך לכן אני ממליץ לך מחר לעלות לוובינר שאלות ותשובות ולקבל מענה בלייב.
      הצטרפי לקבוצת "מקצועני האוטומציה" בפייסבוק ושם כ 45 דקות לפני עולה קישור להצטרף ללייב.

  3. אוייש פיספסתי, ואני מנסה בסאמיט להעלות ככה את האריי כמו שהעלתי באיזיקאונט, וזה מגיע רק הפריט הראשון, בחשבונית ירוקה בסוף כן הצלחתי, אבל במודולים שלא אתה בנית- זה מתפספס,

  4. תודה אייל
    יכול להיות שחסר משהו במודול של איזיקאונט?
    אני מקבל את השגיאה הזו
    [200] 'created_by_api_key' is a mandatory key for distributors users (error code: 1)
    ואני לא מוצא שום מקום להכניס את הנתון הזה?

כתיבת תגובה

תוכן נוסף