Add a new report to an existing domain in the email-worker. Use when: adding report, new SQL query, new Excel file, new CSV file, new XLSX output, new email report, extend domain with report, create report config.
finance | operations | compliancetriggerType المناسب: FIN_CLOSE | OPS_CLOSE | CMP_CLOSEالمكان: src/core/<domain>/sql/<reportName>.sql
قواعد إلزامية (راجع skill sql-conventions):
:close_date; في النهاية:close_date بيكون NUMBER بصيغة YYYYMMDDback_office.<TABLE>-- <Report display name>
-- Domain: <domain>
-- Trigger: <TRIGGER_TYPE>
-- close_date filter: YYYYMMDD NUMBER
SELECT
COL_ONE,
COL_TWO,
...
FROM back_office.<TABLE_NAME>
WHERE SOME_DATE = :close_date
ORDER BY COL_ONE
المكان: src/core/<domain>/reports/<reportName>.report.js
export const <reportName> = {
// Identity
id: '<domain-prefix>-<report-slug>', // e.g. 'fin-settlement'
name: '<Report Display Name>',
// Data source
sql: 'core/<domain>/sql/<reportName>.sql',
requiredParams: ['close_date'], // أو [] لو مش محتاج bind
// Trigger routing — يطابق ClassName في trigger plugin
triggerType: '<TRIGGER_TYPE>', // 'FIN_CLOSE' | 'OPS_CLOSE' | 'CMP_CLOSE'
// Output
format: 'xlsx', // 'xlsx' | 'csv'
sheetName: '<Sheet Name>', // xlsx فقط
fileName: '<ReportName>_{CLOSE_DATE}.xlsx',
// Path — اختر واحد منهم:
useDateFolder: true, // يحط في data/reports/YYYYMMDD/<domain>/
// customPath: 'export/<Folder Name>', // أو مسار مخصص
// Email
subject: '<Report Name> - {CLOSE_DATE}',
recipients: [], // بيتجاهل — mail rules بتتحكم
// Behavior
exportWhenEmpty: true,
enabled: true,
};
مهم: {CLOSE_DATE} في fileName و subject بيتحول أوتوماتيك لـ YYYYMMDD.
افتح src/core/<domain>/reports/index.js لو موجود، أو تأكد إن domainLoader بيـ wildcard-import.
الـ
domainLoaderبيـ glob*.report.jsتلقائياً — مش محتاج تسجيل يدوي.
add-mail-rule)-- DATA rule
INSERT INTO back_office.WORKER_MAIL_RULES
(RULE_ID, DOMAIN, REPORT_CODE, EVENT_TYPE, IS_ACTIVE, NOTIFY_ENABLED,
SUBJECT_SUFFIX, TEMPLATE_KEY, SIGNATURE_KEY, FROM_ADDRESS)
VALUES
(<ID>, '<domain>', '<report-id>', 'DATA', 'Y', 'Y',
NULL, 'data_v1', 'default_v1', '[email protected]');
-- NO_DATA rule
INSERT INTO back_office.WORKER_MAIL_RULES
(RULE_ID, DOMAIN, REPORT_CODE, EVENT_TYPE, IS_ACTIVE, NOTIFY_ENABLED,
SUBJECT_SUFFIX, TEMPLATE_KEY, SIGNATURE_KEY, FROM_ADDRESS)
VALUES
(<ID+1>, '<domain>', '<report-id>', 'NO_DATA', 'Y', 'Y',
' - No Data', 'no_data_v1', 'default_v1', '[email protected]');
-- Recipients
INSERT INTO back_office.WORKER_MAIL_RECIPIENTS
(ID, RULE_ID, RECIPIENT_TYPE, EMAIL_ADDRESS)
VALUES (<ID>, <RULE_ID_DATA>, 'TO', '[email protected]');
COMMIT;
pm2 restart email-worker
# أو
sudo systemctl restart email-worker
الـ domainLoader بيـ auto-discover الـ ملفات الجديدة عند الـ startup.
src/core/sql field في report config يبدأ بـ core/ (مش src/core/)triggerType مطابق بالظبط لاسم الـ trigger (FIN_CLOSE etc.)id فريد — مفيش report تانية بنفس الـ idDATA و NO_DATA| Error | Cause | Fix |
|---|---|---|
SQL_FILE_MISSING | مسار الـ SQL غلط | تأكد إن sql field يبدأ بـ core/ |
ORA-01036 | bind variable في SQL غير موجود في requiredParams | أضفه في requiredParams |
| Report لا تتشغل | triggerType غلط | تأكد من الاسم بالظبط |
| إيميل مش بيتبعت | mail rule مش موجود | اتبع Step 4 |