ברוכים הבאים ל-CRM School: שיעורים מובנים ל-Biz1 CRM, מסמכים ו-App SDK.
1. תבניות PDF למסמכים
צרו עיצוב HTML/CSS משלכם ל-PDF של מסמכים. כשאין תבנית מותאמת נבחרת (או מוגדרת כברירת מחדל), Biz1 ממשיך להשתמש בזרימת ה-PDF הקיימת.
איפה מנהלים תבניות
פתחו: הגדרות → תבניות PDF למסמכים (/setting/document_pdf_templates).
מהעמוד אפשר:
- להוסיף תבנית
- לערוך תבנית
- לבדוק עם נתוני דמה (Test)
- לראות את רשימת התבניות
- להגדיר ברירת מחדל
- להסיר / לארכב תבנית
- לסנן לפי סוג מסמך
סוגי מסמכים נתמכים
order_proposals
purchase_orders
invoice
receipt
receipt_tax_invoice
credit_invoice
delivery_invoice
proforma_invoice
detail_orders
gi_ir
organization_receipt
איך נבחרת תבנית ביצירת מסמך
שדות אופציונליים בבקשה:
| שדה | משמעות |
|---|---|
pdf_template_id | להשתמש בתבנית זו (חייבת להיות של המשתמש ולהתאים לסוג המסמך) |
pdf_template_strict | אם 1 והתבנית לא תקינה / הרינדור נכשל → מחזירים שגיאה במקום נפילה אחורה |
התנהגות:
pdf_template_idריק → ברירת מחדל פעילה (אם קיימת)- אין ברירת מחדל → זרימת PDF ישנה / פרטית
pdf_template_idתקין → משתמשים בתבנית- מזהה לא תקין +
pdf_template_strict = 1→ שגיאה - מזהה לא תקין + strict לא
1→ נפילה ל-PDF הישן
לכל מסמך נשמרים pdf_template_id ו-pdf_template_version_id כדי לשמור את הגרסה המדויקת ששימשה ביצירה.
חלקים חובה לפני שמירה / בדיקה
| חלק חובה | placeholders מקובלים |
|---|---|
| שם חברה | {{company.company_name}}, {{company.name}}, {{owner.company_name}} |
| מזהה חברה | {{company.company_tax_id}}, {{company.company_id}}, {{owner.company_tax_number}} |
| כתובת חברה | {{company.company_address}}, {{company.address}}, {{owner.address}} |
| טלפון חברה | {{company.company_phone}}, {{company.phone}}, {{owner.phone}}, {{owner.mobile}} |
| שם לקוח | {{customer.name}} |
| תאריך מסמך | {{document.date_created}}, {{document.date}} |
| מזהה מסמך | {{document.last_documents_id}}, {{document.id}} |
| לוגו Biz1 | {{crm_logo}} |
| קרדיט Biz1 | {{crm_credit}} |
בלוק קרדיט מומלץ:
<a href="https://biz1.co.il">
<img src="{{crm_logo}}" width="48" />
<span>{{crm_credit}}</span>
</a>
HTML/CSS לא בטוחים נחסמים. חלקים חסרים מחזירים שגיאת ולידציה מפורטת.
placeholders עיקריים
מסמך
{{document.id}}
{{document.last_documents_id}}
{{document.date_created}}
{{document.date}}
{{document.due_date}}
{{document.type}}
{{document.lang}}
{{document.direction}}
{{document.coin}}
{{document.total}}
{{document.tax}}
{{document.discount}}
{{document.final_amount}}
{{document.note}}
{{document.note_html}}
{{document.payment_link}}
{{document.invoice_israel_code}}
לקוח
{{customer.name}}
{{customer.email}}
{{customer.mobile}}
{{customer.phone}}
{{customer.address}}
{{customer.company}}
{{customer.corporation}}
{{customer.cf_name}}
חברה / הגדרות חשבונית
{{company.company_name}}
{{company.company_tax_id}}
{{company.company_address}}
{{company.company_phone}}
{{company.email}}
{{company.logo}}
{{company.company_letter}}
{{company.order_letter}}
{{company.receipt_letter}}
{{company.invoice_receipt_letter}}
{{company.purchase_order_letter}}
{{company.details_order_letter}}
בעלים / משתמש
{{owner.name}}
{{owner.email}}
{{owner.phone}}
{{owner.mobile}}
{{owner.website}}
{{owner.logo}}
{{owner.invoice_logo}}
{{owner.address}}
{{owner.company_name}}
{{owner.company_tax_number}}
Biz1
{{crm_logo}}
{{crm_credit}}
{{crm_credit}} תלוי שפה.
קישור תשלום / אישור
{{payment_link}}
{{document.payment_link}}
{{payment_title}}
{{payment_text}}
{{payment_link_label}}
מתי זמין:
- order_proposals — כל עוד ההצעה לא אושרה / לא נחתמה
- invoice, detail_orders, purchase_orders — כשלא שולם וכפתור תשלום מופעל
- אחרת — מחרוזת ריקה
דוגמה:
{{#if payment_link}}
<section class="payment-cta">
<strong>{{payment_title}}</strong>
<span>{{payment_text}}</span>
<a href="{{payment_link}}">{{payment_link_label}}</a>
</section>
{{/if}}
כותרת עליונה / תחתונה חוזרות ומספרי עמוד
ברירת מחדל:
{{header}}
{{footer}}
מותאם:
{{#header}}
<div style="font-family:Arial;font-size:9px;width:100%">
{{company.company_name}} - {{document.last_documents_id}}
<span style="float:left">{{page}} / {{pages}}</span>
</div>
{{/header}}
{{#footer}}
<div style="font-family:Arial;font-size:8px;width:100%">
<a href="https://biz1.co.il">{{crm_credit}}</a>
<span style="float:left">{{page}} / {{pages}}</span>
</div>
{{/footer}}
טוקני עמוד (רק בתוך header/footer):
{{page}}
{{pages}}
{{total_pages}}
RTL ושפה
עברית ו-RTL מקבלים dir="rtl". אנגלית ותאילנדית — LTR.
.document-pdf-template-root[dir=rtl] {
direction: rtl;
text-align: right;
}
הערות וטקסט עשיר
הערה רגילה (מוברחת):
{{document.note}}
HTML בטוח (שלושה סוגריים):
{{{document.note_html}}}
{{{company.order_letter_html}}}
זמינים גם שדות הערות כותרת / מכתבים / multi-footer לפי סוג מסמך בהגדרות החשבונית.
פריטים, מוצרים, קטגוריות ואפשרויות
{{#items}}
<tr>
<td>{{item.name}}</td>
<td>{{item.qty}}</td>
<td>{{format_money(item.price, document.coin)}}</td>
<td>{{format_money(item.qty * item.price, document.coin)}}</td>
</tr>
{{/items}}
שדות פריט: name, qty, price, discount, description, notes, sku, discount_type, vat_include, line_total, options_text.
סינון לפי קטגוריה:
{{#items_by_category 123}}
...
{{/items_by_category}}
סינון כללי:
{{#items where category.id == 456}}
...
{{/items}}
אופרטורים: == != > >= < <=
תנאים, חשבון וכסף
{{#if item.discount > 0}}
<td>{{item.discount}}</td>
{{else}}
<td>-</td>
{{/if}}
כללים:
{{#if}}ברמה אחת בלבד (בלי קינון)- חשבון בביטוי אחד:
{{item.qty * item.price}} - כסף:
{{format_money(item.line_total, document.coin)}} - לא לכתוב
{{item.qty}}*{{item.price}}
שדות מותאמים
{{customer.cf_name}}
{{product.cf_color}}
{{customer_cf("cf-name")}}
{{product_cf("color")}}
{{category_cf("floor-type")}}
תמונות ו-CSS
תמונות רק ממארחי Biz1 מהימנים. Playwright תומך ב-CSS מודרני. להדפסה מומלץ break-inside: avoid על שורות.
חסום: <script>, <iframe>, <form>, אירועי JS, javascript:, תגי PHP, תמונות חיצוניות לא מוכרות.
חשבונית ישראל וחתימות
שדות Invoice Israel זמינים ({{document.invoice_israel_code}} ועוד). כרגע אין placeholder לחתימה דיגיטלית / תמונת אישור בתבניות HTML.
פתרון תקלות מהיר
| בעיה | לבדוק |
|---|---|
| תבנית לא בשימוש | בעלות, document_type, סטטוס active, ברירת מחדל או pdf_template_id |
| שגיאת שדות חסרים | כל החלקים החובה כולל {{crm_logo}} ו-{{crm_credit}} |
| קישור תשלום ריק | הצעה לא אושרה; חשבונית לא שולמה; כפתור תשלום מופעל |
| כותרת לא חוזרת | תחביר header/footer; טוקני עמוד רק בפנים |
| עברית לא RTL | document_lang=he + CSS ל-RTL |
מדריך מלא: document-pdf-template-module-help.md
2. App SDK ואפשרויות Realtime
בנו מסכי web / React / Vue / Flutter WebView / Android WebView עם ה-JavaScript SDK של Biz1. מגדירים domain פעם אחת, מתחברים פעם אחת, ומשתמשים באותו client ל-REST ול-realtime.
עזרת API חיה (כל הנתיבים): https://bull36.com/app/help
התקנה וזרימה
- כוללים
https://{domain}/app/sdk/biz1-sdk.js - יוצרים
Biz1SDK.Biz1Clientאחד בהפעלה עםdomainואובייקט storage - קוראים ל-
client.login()— הטוקן נשמר ב-biz1_sdk_bearer_token - אחרי התחברות:
client.account.basic()ושומרים משתמש, ארגון, תיקיות, סטטוסים, צוות והגדרות שדות - קוראים לנתיבים עם helpers,
client.routes.*אוclient.request() - גודל עמוד ברשימות: עד 25
- תאריכים:
Dateאו מחרוזת מקומית — ה-SDK שולח UTCY-m-d H:i:s - שומרים ids מתשובות list/add לשימוש חוזר
- ב-
401ה-SDK מוחק טוקן — מציגים התחברות מחדש
דוגמה בסיסית
const client = new Biz1SDK.Biz1Client({
domain: 'https://{user}.bull36.com',
storage: localStorage
});
await client.login({
username: 'USER EMAIL',
password: 'USER PASSWORD'
});
const user = await client.account.basic();
const customers = await client.customers.list({ folder_id: 1, length: 25 });
const total = await client.customers.count({ folder_id: 1 });
כל נתיב
await client.request('Customer.List', { folder_id: 1, length: 25 });
await client.routes.Customer.List({ folder_id: 1, length: 25 });
תאריך ושעה
await client.customers.add({
name: 'John Demo',
phone: '0500000000',
followup: new Date(2026, 6, 20, 10, 0, 0)
});
קריאה בלי helpers
POST /app/{Route.Name}
Authorization: Bearer YOUR TOKEN
התחברות דרך /app/Login (כולל OTP אם נדרש), שמירת Bearer, שליחת פרמטרים ב-POST body, מקסימום 25 שורות ברשימה, וב-401 חזרה להתחברות.
Realtime (socket)
אחרי login מחברים socket עם אותו bearer כדי לרענן מסכים בלי polling.
const socket = client.realtime.connect({
platform: 'web',
path: '/realtime/socket.io'
});
client.realtime.on('biz1:ready', (payload) => {
console.log(payload.userId, payload.events);
});
client.realtime.on('crm.lead.created', (event) => {
refreshCustomerList();
});
client.realtime.on('mission.created', (event) => {
refreshMissionList({ customer_id: event.payload.customer_id });
});
client.realtime.on('message.created', (event) => {
refreshCustomerMessages(event.payload.customer_id);
});
קבוצות אירועים עיקריות
- לקוחות / מעקב:
crm.lead.created,customer.updated,customer.followup,customer.restored - הודעות / אימייל:
message.created,chat.message.received,email.created, … - משימות / תזכורות:
mission.created,mission.updated,mission.done,mission.reminder, … - פגישות:
meeting.*,appointment.* - שיחות:
call.incoming,call.status.popup - טאבים / סטטוסים:
entries.*,statuses.*
אם תשובת נתיב כוללת socket_event, משתמשים באותו מפתח ב-client.realtime.on(...).
בניית UI עם AI
מפנים ל-https://{domain}/app/help ומזכירים שכל שדה תאריך/שעה נשלח כ-UTC Y-m-d H:i:s (ה-SDK ממיר אוטומטית מ-Date מקומי).