CRM School

ברוכים הבאים ל-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 והתבנית לא תקינה / הרינדור נכשל → מחזירים שגיאה במקום נפילה אחורה

התנהגות:

  1. pdf_template_id ריק → ברירת מחדל פעילה (אם קיימת)
  2. אין ברירת מחדל → זרימת PDF ישנה / פרטית
  3. pdf_template_id תקין → משתמשים בתבנית
  4. מזהה לא תקין + pdf_template_strict = 1 → שגיאה
  5. מזהה לא תקין + 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; טוקני עמוד רק בפנים
עברית לא RTLdocument_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

התקנה וזרימה

  1. כוללים https://{domain}/app/sdk/biz1-sdk.js
  2. יוצרים Biz1SDK.Biz1Client אחד בהפעלה עם domain ואובייקט storage
  3. קוראים ל-client.login() — הטוקן נשמר ב-biz1_sdk_bearer_token
  4. אחרי התחברות: client.account.basic() ושומרים משתמש, ארגון, תיקיות, סטטוסים, צוות והגדרות שדות
  5. קוראים לנתיבים עם helpers, client.routes.* או client.request()
  6. גודל עמוד ברשימות: עד 25
  7. תאריכים: Date או מחרוזת מקומית — ה-SDK שולח UTC Y-m-d H:i:s
  8. שומרים ids מתשובות list/add לשימוש חוזר
  9. ב-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 מקומי).

→ חזרה למרכז הידע

וואטסאפ