דוח עסקאות קריפטו מול משווקים
הדוח מחשב את התגמול המגיע למשווקים (Affiliates) על פי אחוז קבוע מהרווח התפעולי בכל עסקה או על פי קוד (Code Script) שבאפשרותך לכתוב על גבי הייפר.הסריקה מתבצעת על טבלת העסקאות
hyp_CryptoCurr Exchange Trades
, בעסקאות מסוג: קניה או מכירה של מטבע דיגיטלי מבוזר.
לכל עסקה יש לקוח הרשום בתוכה. ללקוח יש קישור למשווק (ספק) שהביא אותו לחברה, ברשומת הספק יש שדה "עמלה קבועה".
מעקב על שינוי שיוך לקוח למשווק נעשה דרך "יומן השינויים". מנגנון זה בודק היסטורית מי היה המתווך ואיש הקשר של הלקוח בנקודת הזמן המדויקת שבה נרשמה העסקה (מותנה בסימון שדות החיתוך המתאימים).
הוראות הפעלה
ראשית עליך למלא את שדות החיתוך בראש העמוד. לאחר הפעלת הדוח, הייפר תשמור את הפרמטרים הנ"ל לשימוש חוזר בעתיד.| שם השדה | תיאור |
|---|---|
|
החל מתאריך
ועד לתאריך |
שדות חובה, חותכים את הפעילות ע"פ תאריך רישום העסקה (בלי קשר לזמני הביצוע בבורסה). |
| חשב מחדש את העמלות |
|
| הקצאה מחדש של מתווך |
שדה זה פועל בשילוב עם "חשב מחדש את העמלות".
כאשר שניהם מסומנים כ-"כן", הדוח יסרוק את יומן השינויים ויקצה לעסקה את המתווך שהיה משויך ללקוח ביום ושעת ביצוע העסקה, במקום המתווך שמשויך אליו כיום. |
כעת נסקור את לחצני ההפעלה:
| הדוח יפעל על כל העסקאות (BUY + SELL) לפי טווח התאריכים מהכותרת. | |
| ראשית יופעל אשף החיפוש אשר יבנה רשימת לקוחות לבחינה. אח"כ המנוע של הדוח יחפש עסקאות (כמו בלחצן הקודם) רק עבור הלקוחות מהרשימה. | |
| יצוא של טבלת התוצאה לפי העיצוב שלה (סדר העמודות) על המסך. | |
|
הלחצן הזה הוא חלק ממוצר המדף.
מכיל מנגנון סנכרון חד ערכי, עבור כל עסקה בעלת תגמול בדוח - יוצר או מעדכן רשומה אחת בטבלה hyp_Supplier Commission List. את התוצאה ניתן לראות בתיק הספק > מודולים > עמלות לתשלום. שימו לב:
|
|
|
הדוח הזה מחייב כתיבת קוד, אין אפשרות להשתמש בו אחרת. הסבר על כתיבת הקוד, בהמשך העמוד.
הלחצן הזה זמין רק למנהל הבכיר של הייפר. |
טבלת התוצאות של הדוח
הטבלה מבוססת על hyp_CryptoCurr Exchange Trades אבל נוספים אליה שדות רבים ממקורות אחרים (לקוחות, ספקים) ושדות מחושבים (וירטואלים).| שם השדה | תיאור |
|---|---|
|
מספר עסקה בהייפר
תאריך רישום (אסמכתא) ושאר השדות של העסקה עצמה |
ההסבר אודות השדות הללו נמצא בעמודים קודמים (ראה סימניה מימין).
קליק כפול או Enter על שדה של העסקה, פותח את עמוד העסקה על המסך. |
|
מספר חשבון לקוח (בהייפר)
שם הלקוח איש קשר (מבצע הפעולה) |
שם הלקוח ואיש קשר כפי שנרשמו בעסקה (ללא רענון מול טבלת הלקוחות).
קליק כפול או Enter על שדה של הלקוח, פותח את עמוד הלקוח על המסך. |
|
שווי העסקה USD
שווי העסקה יציג ₪ רווח חדר עסקאות במטבע 2 שער ההמרה ממטבע 2 לשקלים עלויות ביצוע ₪ |
אלו השדות מהם מתחיל חישוב התגמול, להלן "המקור". כולם מגיעים מטבלת העסקאות, הדוח אינו מחשב / מעדכן אותם. |
| מספר חשבון מתווך | חשבון המתווך כפי שנרשם בעסקה (או חושב עכשיו מחדש). |
| שם המתווך | השדה עובר רענון מול טבלת הספקים. |
| איש קשר/סוכן מטעם המתווך |
מגיע מטבלת הלקוחות, לאחר קישור לקוח אל משווק (ספק) ניתן לבחור איש קשר מתוך אותו תיק ספק.
איש הקשר יכול להוות אינדיקטור ל- "משפיען רשת" או פלטפורמת תוכן ספציפית תחת הספק הכללי. |
| רווח תפעולי ₪ | שדה מחושב בדוח = [רווח חדר עסקאות בשקלים] מינוס [עלויות ביצוע]. |
| עמלה למשווק ₪ |
זהו סכום התגמול למשווק בעבור העסקה הזאת, בשקלים (מטבע ניהול ספרים).
תוכנת המדף (לפני התסריט) מחשבת את הנוסחא = [רווח תפעולי ₪] * [עמלת תיווך באחוזים מרשומת הספק]. עבור ספקים שאינם מקבלים תגמול או שהחישוב שלהם יבוצע דרך תסריט - יש להגדיר אפס בשדה "עמלת תיווך באחוזים" (החישוב האוטומטי מתעלם מכל ערך הקטן מ-0.1%). |
| רווח נקי ₪ | שדה המחושב אחרי שכל הדוח מוכן (גם אחרי התסריט) שווה = [רווח תפעולי ₪] מינוס [עמלה למשווק ₪]. |
| הערות | הטקסט כאן בשליטת התסריט (קוד) שנכתב על גבי הייפר. חישוב של תוכנת המדף רושם את הטקסט: "% מהרווח הגולמי" |
| התראות |
המשווק הוא ספק, רשום בטבלת הספקים. ההתראות כאן נוצרות בעזרת בחינת רשומת הספק, כל התראה עומדת בפני עצמה:
|
|
מועד יצירת הלקוח
תאריך אישור הלקוח תאריך עסקה ראשונה של הלקוח סניף הלקוח |
מגיעים מרשומת הלקוח בזמן הפעלת הדוח. השדות הללו מאפשרים לנו לכתוב קוד לחישוב תגמול עבור עסקה ראשונה וכו'. |
כתיבת קוד תסריט
| אירוע המופעל על ידי הדוח | הסבר |
|---|---|
| Procedure Init; |
כאשר המשתמש מפעיל את המודול (דוח), האירוע הזה מופעל בטרם העמוד מופיע על המסך. זה המקום המומלץ לטפל ברשימת השדות (הוספה ושינוי כותרות).
האירוע מופעל לאחר החיבור למערכת העיצוב וההרשאות. |
| Procedure After_Showing; | האירוע הזה מופעל לאחר שהדוח מופיע על המסך (ריק). אין לנו רעיון טוב מה לעשות איתו... אבל הוא קיים. |
| Procedure Calc_Fields_For_Report_View; | האירוע מופעל בסוף יצירת הדוח, כאשר השדה "חשב מחדש את העמלות" = "לא". כאן יש לטפל רק בשדות המחושבים (אם הוספתם כאלו). |
| Function Process_Report_Data: Boolean; |
האירוע מופעל בסוף יצירת הדוח, כאשר השדה "חשב מחדש את העמלות" = "כן".
ראשית מדובר בפונקציה שאם אינה קיימת או שמחזירה False - הפקת הדוח מוכרזת ככישלון וטבלת התוצאות תאופס ! כלומר גם בכדי להשתמש במוצר המדף בלבד חייבים לשים את הפונקציה הזאת ריקה ולו רק שתחזיר True. כמו בדוגמה בהמשך, זה האירוע לחשב בו תגמולים לפי שיטות שונות (אפשר לכתוב הכל ולגשת עצמאית לטבלאות נוספות). לאחר האירוע הזה, השדה [רווח נקי ₪] מחושב עצמאית על ידי תוכנת המדף ואין צורך לכתוב קוד עבורו. |
להלן דוגמה לתסריט עם כל האלמנטים הנ"ל:
{==================================================================================================}
// אתחולים
{==================================================================================================}
Procedure After_Showing;
Begin
Main_BA.Set_Button_State('dynamic_1', True, False) {שמור שינויים לעסקאות עצמן};
PopupMessage('חלק מהספקים שלכם עובדים בחישוב שנתי ולכן יש להפעיל את הדוח מה 1.1 לשנה הזאת כאשר רוצים לחשב ולשמור את בעמלות.'+#13#10+
'אם קראת פה סינית - אז טלפני לשלומי / יניב להסבר');
PopupMessage('איך מריצים את הדוח?' +#13#10+
'יש עמוד הדרכה On-Line שהוכן עבורך!' +#13#10+
'בכל מקרה, על מנת להציג נתוני מתווכים לחודש ספציפי יש להריץ את הדוח מתחילת השנה' +#13#10+
'כשאר בחרת "כן" בשני השדות למעלה ולאחר שהדוח חישב מחדש עמלות, יש לבצע שמירת נתונים לעסקאות.' +#13#10+
'רק לאחר שבוצע חישוב מחדש ונשמרו הנתונים - הרץ שוב את הדוח עם "לא" בשדות והוסף נתוני מתווכים בסיום.');
End;
Procedure Init;
Begin
ReportTb.FldSet.Set_VisualName('Gross Profit LC', 'רווח בניכוי עלויות ₪', he_Hebrew);
ReportTb.Add_DB_Field('Broker Fee %', '');
ReportTb.Add_Field('Broker Cost %', '% עלות ביצוע', he_Money, False, 0, he_Edit);
ReportTb.Add_Field('Broker Fee ILS', 'רווח חדר עסקאות ₪', he_Money, False, 0, he_Edit);
ReportTb.Add_Field('Broker Commission', '% עמלת משווק', he_Money, False, 0, he_Edit);
ReportTb.Add_Field('Broker ID', 'זהות\ח.פ. מתווך', he_String, False, 60, he_Edit); //הוסף ע"י יניב לבקשת רננה 07/05/2025
ReportTb.GlobalInit;
End;
{==================================================================================================}
// 'Broker ID' מופעל בסוף הדוח הרגיל - ללא חישוב מחדש. משלים עמודות ידניות שנוצרו כאן, מלבד
{==================================================================================================}
Procedure Calc_Fields_For_Report_View;
VAR Y: Integer;
D: Double;
Begin
For Y:= 0 to ReportTb.Rowcount-1 Do
Begin
//Calc the Broker Fee in ILS
D:= RoundNum(ReportTb.RField['Broker Fee ccy2',Y] * ReportTb.RField['Execution ccy2 to LC Exch Rate',Y], 2);
ReportTb.RField['Broker Fee ILS',Y]:= D;
ReportTb.RField['Broker Cost %',Y]:= RoundNum(ReportTb.RField['Broker Cost LC',Y] / D, 2);
//Calc the Broker Fee % (for export to excel by user)
ReportTb.RField['Broker Commission',Y]:= RoundNum(Safe_Div(ReportTb.RField['Broker Marketing Cost LC',Y],
ReportTb.RField['Gross Profit LC',Y]) * 100, 2);
End;
End;
{==================================================================================================}
// "מופעל רק כאשר השדה הבוליאני בדוח "חשב מחדש את העמלות
// מופעל כאשר הדוח צריך לחשב מתחילת השנה (1.1) חוזים מיוחדים שהספק מקבל על פי מדרגות או לוגיקה אחרת
{==================================================================================================}
Function Process_Report_Data: Boolean;
VAR Y, FromDate, UntilDate, Z: Integer;
D,P: Double;
Flag: Boolean;
Begin
//======// HOT cut 0.1% from volume !
For Y:= 0 to ReportTb.Rowcount-1 Do
IF ReportTb.ICell[18,Y]{Middleman Account} = 10196 Then
Begin
ReportTb.RField['Broker Marketing Cost LC',Y]:= ReportTb.RField['Trade Volume LC',Y] * 0.001;
ReportTb.Field['Notes',Y]:= '0.1% ממחזור העסקה בשקלים';
End;
//======// שאולי רגואן - wtf 38K from ? מה קורה בעסקה בה חוצים את השווי
FromDate:= EnDate(2025,6,1); // החל מתאריך זה עובר לקבל עמלות רגילות לפי אחוז
D:= 0;
For Y:= 0 to ReportTb.Rowcount-1 Do
IF (ReportTb.ICell[18,Y]{Middleman Account} = 10016) AND (ReportTb.ICell[1,Y]{BK Entry Date} < FromDate) Then
Begin
D:= D + ReportTb.RField['Gross Profit LC',Y];
IF D <= 38000 Then
Begin
ReportTb.RField['Broker Marketing Cost LC',Y]:= ReportTb.RField['Gross Profit LC',Y]
ReportTb.Field['Notes',Y]:= 'מקבל את כל הרווח הגולמי'
End
Else
Begin
ReportTb.RField['Broker Marketing Cost LC',Y]:= 0;
ReportTb.Field['Notes',Y]:= 'סיים מכסה שנתית'
End
End;
//======// קריפטוסי מדרגות לפי ווליום בדולר
FromDate:= EnDate(2024,8,1); // החוזה נחתם החל מתאריך הזה
UntilDate:= EnDate(2026,3,22); // והסתיים בתאריך הזה ולאחריו העמלה תהיה על פי כרטיס הלקוח שצריך להיות 0
D:= 0;
For Y:= 0 to ReportTb.Rowcount-1 Do
IF (ReportTb.ICell[18,Y]{Middleman Account} = 10187) AND
(ReportTb.ICell[1,Y]{BK Entry Date} >= FromDate) AND
(ReportTb.ICell[1,Y]{BK Entry Date} <= UntilDate) Then
Begin
D:= D + ReportTb.RField['Trade Volume USD',Y]; // D = מונה מחזור
P:= 18.5; // P = אחוז עמלה מרווח תפעולי
IF D > 1000000 Then P:= 22.5;
IF D > 5000000 Then P:= 25;
ReportTb.RField['Broker Marketing Cost LC',Y]:= ReportTb.RField['Gross Profit LC',Y] * (P/100);
ReportTb.Field['Notes',Y]:= _Money_To_Str(P, False) + '% עמלה מדורגת לפי מחזור בדולר: '+_Money_To_Str(D,False);
End;
//======// רובינזון מולי - תגמול על עסקה ראשונה מאז ההצטרפות של הלקוח
For Y:= 0 to ReportTb.Rowcount-1 Do
IF (ReportTb.ICell[18,Y]{Middleman Account} = 10137) Then
Begin
Flag:= ReportTb.IField['Client First Transaction Date',Y] = ReportTb.IField['BK Entry Date',Y];
IF Flag Then
For Z:= 0 to Y-1 Do
IF ReportTb.ICell[8,Z]{Client Number} = ReportTb.ICell[8,Y] Then
Begin
Flag:= False; // מצאתי עסקה קודמת של הלקוח ולכן אין צורך לשלם למשווק
BREAK;
End;
IF Flag Then
Begin
ReportTb.RField['Broker Marketing Cost LC',Y]:= 450;
ReportTb.Field['Notes',Y]:= '450 שח עמלה לעסקה ראשונה';
End
Else
Begin
ReportTb.RField['Broker Marketing Cost LC',Y]:= 0;
ReportTb.Field['Notes',Y]:= 'העסקה נבדקה. אין צורך לשלם עמלה.'
End;
End;
//======// נאמברז עמית דרור (10307) - חישוב עמלות לפי מדרגות. הוסף על ידי יניב - לבקשת רננה מתאריך 14/06/2026
D:= 0; // D = מונה מחזור עסקאות נטו USD
For Y:= 0 to ReportTb.Rowcount-1 Do
IF ReportTb.ICell[18,Y]{Middleman Account} = 10307 Then
Begin
P:= 15; // P = אחוז עמלה מסך ההכנסות
D:= D + ReportTb.RField['Trade Volume USD',Y];
IF D >= 5000000 Then P:= 20;
IF D >= 10000000 Then P:= 25;
ReportTb.RField['Broker Marketing Cost LC',Y]:= ReportTb.RField['Gross Profit LC',Y] * (P/100);
ReportTb.Field['Notes',Y]:= _Money_To_Str(P, False) + '% עמלה מדורגת לפי מחזור עסקאות נטו בדולר: ' +
_Money_To_Str(D, False);
End;
Calc_Fields_For_Report_View; // Calculate the Broker Fees and Commission data
Result:= True; // survived to this point...
Main_BA.Set_Button_State('dynamic_1', True, True) {שמור שינויים לעסקאות עצמן};
End;
{==================================================================================================}
// הוריזון לא עובדים עם מערכת ההתחשבנות של הייפר. אלא שומרים ישירות בעסקה את העמלה לספק
{==================================================================================================}
Procedure Main_BA_Dynamic_1; // שמור שינויים לעסקאות עצמן
Begin
DBconn.Reset;
DBconn.Update_Exist_Records(ReportTb,
['Hyper Trade ID','Broker Marketing Cost LC','Broker Profit LC','Middleman Account','Middleman Name','Middleman Contact Person','Notes'],
'N');
DBconn.Execute;
End;
Procedure Main_BA_Dynamic_2; // מחק שורות ללא עמלות
Begin
ReportTb.Delete(['Broker Marketing Cost LC'], [], [0], he_AND);
Report_Title.Set_Search_Results_Caption(ReportTb);
End;
{==================================================================================================}
//=== הוסף נתוני מתווכים ===//
// 16/09/2025 - הוסף ע"י יניב כי אם לא מבצעים חישוב עמלות מחדש הדוח לא מייבא את נתוני הספקים
{==================================================================================================}
Procedure Add_Middle_Man_IDs_And_ContactName;
VAR ClientsQry, AffQry, TempCl, TempAff: ThPrvTable;
Y: Integer;
Begin
IF ReportTb.Empty(0) Then EXIT;
//Create Private Tables to extract data
AffQry:= Fman.Create_PrvTable('hyp_Suppliers', 'AffQry', ['Supplier Number','ID Number'], False);
TempAff:= Fman.Create_PrvTable('hyp_Suppliers', 'TempAff', ['Supplier Number'], False);
ClientsQry:= Fman.Create_PrvTable('hyp_Clients', 'ClientsQry', ['Client Number','Middleman Contact Person'], False);
TempCl:= Fman.Create_PrvTable('hyp_Clients', 'TempCl', ['Client Number'], False);
AffQry.Clear;
TempAff.Clear;
ClientsQry.Clear;
TempCl.Clear;
//extract all trades with middleman account number to prv tables
For Y:=0 to ReportTb.Rowcount-1 Do
IF ReportTb.BField['Middleman Account',Y] Then //אם יש מספר חשבון מתווך בשורה
Begin
TempAff.Add;
TempAff.IField['Supplier Number',-1]{מספר ספק}:= ReportTb.IField['Middleman Account',Y];{מספר חשבון מתווך}
TempCl.Add;
TempCl.IField['Client Number',-1]{מספר לקוח}:= ReportTb.IField['Client Number',Y];{מספר חשבון לקוח (בהייפר)}
End;
//Sort by acount number and remove dups
TempAff.Sort(['Supplier Number']);
TempAff.Duplicity(he_Remove_Dups_From_2nd_Row, ['Supplier Number']);
TempCl.Sort(['Client Number']);
TempCl.Duplicity(he_Remove_Dups_From_2nd_Row, ['Client Number']);
//query for each middleman id number
IF NOT DBconn.Reset Then EXIT;
DBconn.Query(AffQry, True, '', 'N');
For Y:=0 to TempAff.Rowcount-1 DO
DBconn.Where_SameVal('Supplier Number', TempAff.IField['Supplier Number',Y]{מספר ספק}, he_AND);
DBconn.Close_Query;
DBconn.Execute; {this is a boolean function}
//query for every client record that has a middleman
IF NOT DBconn.Reset Then EXIT;
DBconn.Query(ClientsQry, True, '', 'N');
For Y:=0 to TempCl.Rowcount-1 DO
DBconn.Where_SameVal('Client Number', TempCl.IField['Client Number',Y]{מספר לקוח}, he_AND);
DBconn.Close_Query;
DBconn.Execute; {this is a boolean function}
For Y:= 0 to ReportTb.Rowcount-1 Do
Begin
//Pull middleman IDnum from AffQry to the report
IF AffQry.Search_By_Col(0, '', ReportTb.IField['Middleman Account',Y]{מספר חשבון מתווך}, [he_First_Check_Row]) Then
ReportTb.Field['Broker ID',Y]{זהות\ח.פ. מתווך}:= AffQry.Cell[1,-1]{מספר זהות / ח.פ};
//Pull Middleman Contact Person from Client record
IF ClientsQry.Search_By_Col(0, '', ReportTb.IField['Client Number',Y]{מספר לקוח}, [he_First_Check_Row]) Then
ReportTb.Field['Middleman Contact Person',Y]{איש קשר/סוכן מטעם המתווך}:= ClientsQry.Cell[1,-1]{איש קשר/סוכן מטעם המתווך};
End;
//שיחרור פלומבות
Fman.Free_Table('AffQry');
Fman.Free_Table('TempAff');
Fman.Free_Table('ClientsQry');
Fman.Free_Table('TempCl');
End;
Procedure Main_BA_Dynamic_3;
Begin
Add_Middle_Man_IDs_And_ContactName;
End;