דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

כלי הצעות מחיר

עודכן 31.08.2026

הצעת מחיר היא מסמך HTML עם placeholders, שמור כשורה ב‑PDFTemplate. ההפקה ממזגת לתוכו רשומת Sales, שורות המכירה שלה והלקוח שהיא מצביעה אליו, ומייצרת PDF לשליחה ולחתימה.

בלי פרמטרים. מחזיר objectId ו‑Name לכל תבנית, ולא את ה‑HTML.

JSON
[ { "objectId": "pdft012345", "Name": "הצעת מחיר כולל מע\"מ" },
{ "objectId": "pdft067890", "Name": "תבנית קלאסית-מקצועית" } ]

לקריאת התוכן עצמו — Get-Data על טבלת PDFTemplate:

JSON
{ "table": "PDFTemplate", "objectId": "pdft012345" }

המשאב price-quote-example (URI: price-quote-example://main, מתגלה ב‑resources/list, נקרא ב‑resources/read) מחזיר תבנית לדוגמה עם כל ה‑placeholders: כ‑4KB של HTML עם windowDiv, בלוק חתימה, data-repeat על <tr> ובלי <script>. קריאת משאבים: כלי קבצים.

יוצר תבנית חדשה, או מעדכן קיימת כשמעבירים objectId.

הפרמטר טיפוס חובה המשמעות
templateName String ✔ שם התבנית כפי שיופיע ברשימה
templateContent String ✔ ה‑HTML המלא
objectId String מזהה תבנית קיימת ⇒ עדכון. בלעדיו — נוצרת תבנית חדשה

התשובה ביצירה: { "objectId": "CdbeHAOSBL", "createdAt": "…" }; בעדכון: { "objectId": "…", "updatedAt": "…" }. objectId שאינו קיים ⇒ Error: Object not found.. תבנית מהכלי מקבלת אוטומטית TypeId של “הצעות מחיר”, ולכן מופיעה מיד ב‑Get-Price-Quote-Templates.

חוזה ה‑HTML — ארבעה כללים מחייבים

Section titled “חוזה ה‑HTML — ארבעה כללים מחייבים”

האלמנט החיצוני חייב להיות div עם id="windowDiv":

HTML
<div id="windowDiv" class="rtl"
style="height: auto; padding: 20px 50px; direction: rtl;
-webkit-print-color-adjust: exact;
font-family: 'Noto Sans Hebrew', sans-serif;">
<!-- כל תוכן המסמך -->
</div>

2 · בלוק החתימה מנוהל על ידי המערכת

Section titled “2 · בלוק החתימה מנוהל על ידי המערכת”
HTML
<div id="sigDiv" style="text-align: center; margin-top: 30px;">
<div id="Signature">חתימה</div>
<div id="SignatureName">שם חתום</div>
<div id="SignatureDate">תאריך חתימה</div>
</div>

שלושת המזהים הפנימיים מחויבים בסכימה. העטיפה sigDiv היא מה שהמערכת מסתירה לפני החתימה וחושפת אחריה (בעמוד PriceQuoteSign: לפני החתימה sigDiv מקבל display: none; את שדות החתימה עצמם — תאריך, שם חותם, אימייל, קנבס חתימה — העמוד מוסיף בעצמו). אל תסתירו את הבלוק ב‑CSS (display:none שובר את הזרימה) ואל תשנו את שמות המזהים, אחרת הבלוק מוצג ללקוח לפני שחתם.

אחרי חתימה מוצלחת רשומת ה‑PriceQuotes מתעדכנת: StatusId עובר ל‑“אושרה”, ונכתבים SignedAt, SignedByName, SignedByEmail ו‑SignedPdf (שדה PrivateFile, חוזר ב‑Get-Data כ‑resource_link עם URI מסוג file-storage:///…/PriceQuotes/<id>/SignedPdf — ראו המשאב get-file).

3 · שורות חוזרות — data-repeat

Section titled “3 · שורות חוזרות — data-repeat”

התכונה יושבת על ה‑<tr>. לא על ה‑<table> ולא על ה‑<td>:

HTML
<table style="width:100%; border-collapse:collapse;">
<tr class="brand-thead">
<td>מוצר</td><td>תיאור</td><td>כמות</td><td>מחיר ליחידה</td><td>סה"כ</td>
</tr>
<tr data-repeat="SaleRows">
<td>{{SaleRows.ProductId.Name}}</td>
<td>{{SaleRows.Description}}</td>
<td>{{SaleRows.Quantity}}</td>
<td>{{SaleRows.PricePerUnit}} &#8362;</td>
<td>{{SaleRows.Total}} &#8362;</td>
</tr>
</table>

שתי שורות SaleRows ⇒ שני <tr data-repeat="SaleRows"> בפלט, כל אחד עם הערכים של השורה שלו (הסדר אינו בהכרח סדר היצירה). מכירה בלי שורות ⇒ הטבלה נשארת עם כותרת בלבד, בלי שגיאה. מוצג רק מוצר אחד — ה‑data-repeat על האלמנט הלא נכון.

סוגריים כפולים. מנוע שונה לגמרי מזה של הטריגרים וההודעות, שמשתמש בסוגריים משולשים.

הרמה Placeholders מה חוזר בפועל
ההצעה עצמה {{number}} · {{date}} · {{Vat}} · {{totalIncludingVat}} 10017 (מספר רץ) · 23-08-2026 (DD‑MM‑YYYY) · 180.00 — סכום המע“מ, לא אחוז · 1180.00
המכירה {{Sales.Total}} · {{Sales.TotalBeforeDiscount}} · {{Sales.DiscountValue}} הערכים כפי שהם ברשומה, בלי עיצוב (1000, 1100, 100)
הלקוח (דרך Pointer) {{Sales.AccountId.Name}} · {{Sales.AccountId.Address}} · {{Sales.AccountId.PhoneNumber}} · {{Sales.AccountId.Email}} כל שדה של Accounts לפי שמו בסכימה. Phone שבתיאור הכלי אינו שדה במערכת vanilla — השדה הוא PhoneNumber, ו‑{{Sales.AccountId.Phone}} מודפס ריק
שורת מוצר {{SaleRows.ProductId.Name}} · {{SaleRows.Description}} · {{SaleRows.Quantity}} · {{SaleRows.PricePerUnit}} · {{SaleRows.Total}} שורה לכל רשומת SaleRows של המכירה

כל placeholder הוא שם שדה בסכימה (או מסלול דרך Pointer), וכל מה שלא קיים מודפס ריק: Get-Schema על Sales ועל Accounts לפני שכותבים תבנית. {{Sales.Probability}}, {{Sales.ReasonForLost}}, {{Sales.NextStepDate}} קיימים ויעבדו; IsWon / IsLost אינם שדות של Sales במערכת vanilla (הסטטוס הוא SaleStatusId).

<input> ששמו מתחיל ב‑Accounts. או ב‑Sales. נשמר בחזרה לרשומה כשהלקוח שולח את המסמך החתום:

HTML
<input name="Accounts.Address" type="text" />
<input name="Sales.Comment" type="text" />

Accounts.Address ו‑Accounts.City נכתבים ל‑Accounts, Sales.Comment נכתב ל‑Sales, ו‑input בשם אחר (למשל FreeText) לא נשמר בשום מקום. הכתיבה מתבצעת רק כחלק מהחתימה, לא בצפייה במסמך. value="{{…}}" על ה‑input לא מונע את השמירה, רק מציג את הערך הנוכחי כברירת מחדל. שם השדה אחרי הקידומת חייב להיות שם שדה אמיתי בסכימה של Accounts / Sales.

הנושא הכלל
מיקום ב‑RTL ה‑<td> הראשון בשורה מרונדר מימין — הלוגו בתא הראשון
גודל width: 240px; height: auto. לא max-width / max-height — הם מרנדרים לוגו זעיר כשל‑PNG יש שוליים שקופים
הקובץ חתכו את השוליים השקופים לפני העלאה
העלאה Upload-Public-File, ומשם ה‑URL לתוך ה‑HTML

מפיק מסמך ממכירה קיימת.

הפרמטר טיפוס חובה המשמעות
saleId String ✔ מזהה רשומת ה‑Sales. המכירה חייבת להתקיים
templateId String ✔ מזהה התבנית מ‑Get-Price-Quote-Templates
status Enum ✔ אחד מארבעה, ראו למטה
includeVAT Boolean ברירת מחדל true. עם false: vat: 0 ו‑{{Vat}} מודפס 0.00
siteId String מזהה האתר (siteId מ‑Get-Sites). ראו למטה
JSON
{ "saleId": "V0sVNyS45K", "templateId": "pdft012345",
"status": "טיוטה", "includeVAT": true }

התשובה:

JSON
{ "objectId": "91ksfWWkpM",
"link": "https://<sub>.mbapps.co.il/apps/mybusiness/PriceQuoteSign?oid=91ksfWWkpM",
"total": 1000, "totalWithVat": 1180, "vat": 180 }

objectId הוא רשומה חדשה ב‑PriceQuotes (עם Number רץ, Content — ה‑HTML הממוזג, ו‑Pointers ל‑SaleId, AccountId, TemplateId, StatusId). saleId או templateId שאינם קיימים ⇒ Error: Object not found.. הכלי אינו בודק שהתבנית היא מסוג “הצעות מחיר”: תבנית Invoice של MyBooks מתקבלת ומופקת כהצעה.

ה‑enum של הסטטוסים — ארבע מחרוזות עבריות מדויקות

Section titled “ה‑enum של הסטטוסים — ארבע מחרוזות עבריות מדויקות”
הערך המשמעות
טיוטה טיוטה
נשלחה - בהמתנה לאישור נשלחה, ממתינה לאישור הלקוח. הסטטוס היחיד שבו קישור החתימה נפתח ללא התחברות
בוטלהמושהית בוטלה / מושהית
אושרה אושרה

הערך הוא ה‑siteId שמחזיר Get-Sites (מחרוזת hex של 24 תווים); במערכת עם אתר אחד אין לו השפעה נראית.

תקלות נפוצות — טבלת אבחון

Section titled “תקלות נפוצות — טבלת אבחון”
התסמין הבדיקה הראשונה
המסמך “עובד במסך” אבל ה‑PDF שונה חפשו <script ב‑HTML של התבנית והסירו הכול — JS רץ רק בדפדפן
בלוק החתימה מוצג לפני שחתמו id="sigDiv" ושלושת המזהים הפנימיים — בדיוק כך
ה‑PDF יוצא בלי צבעים, המסך תקין חסר בלוק @media print עם !important
אין צבע גם במסך חסר style inline (צריך גם מחלקה וגם inline)
מוצג רק מוצר אחד data-repeat="SaleRows" לא על ה‑<tr>
טבלת המוצרים ריקה למכירה אין רשומות SaleRows
ערך חסר במסמך (תווית בלי ערך) שגיאת כתיב במסלול · שדה שאינו בסכימה (למשל Phone במקום PhoneNumber) · השדה ריק ברשומה
מודפס {ערך} עם סוגריים סוגריים משולשים במקום כפולים
Error: Object not found. saleId / templateId / objectId שאינו קיים
Cannot read properties of undefined (reading 'includes') siteId שגוי — השמיטו אותו
הלוגו זעיר או הכותרת ענקית PNG עם שוליים שקופים · max-width במקום width
Get-Data על PDFTemplate חוזר בלי HTML הוסיפו HTML ל‑keys, או הורידו את הפרמטר
הלקוח רואה “המסמך לא נמצא” ההצעה אינה בסטטוס נשלחה - בהמתנה לאישור — רק בו הקישור נפתח ללא התחברות