feat(sms): send class start date, days, and course time

Expose schedule fields on class and invoice templates so SMS can include Jalali start date, weekdays, and hour range.
This commit is contained in:
2026-08-15 23:09:04 +03:30
parent 366cd41bb7
commit 0cdb9cec20
9 changed files with 226 additions and 14 deletions
+12 -3
View File
@@ -20,7 +20,10 @@ const SMS_TEMPLATE_DEFS = [
{ key: 'className', label: 'نام کلاس', defaultName: 'className' },
{ key: 'courseName', label: 'نام دوره', defaultName: 'courseName' },
{ key: 'fullName', label: 'نام کارآموز', defaultName: 'fullName' },
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' }
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' },
{ key: 'classStartDate', label: 'تاریخ شروع کلاس', defaultName: 'classStartDate' },
{ key: 'classDays', label: 'روزهای برگزاری', defaultName: 'classDays' },
{ key: 'courseTime', label: 'ساعت دوره', defaultName: 'courseTime' }
]
},
{
@@ -33,7 +36,10 @@ const SMS_TEMPLATE_DEFS = [
{ key: 'time', label: 'ساعت', defaultName: 'time' },
{ key: 'place', label: 'مکان', defaultName: 'place' },
{ key: 'fullName', label: 'نام کاربر', defaultName: 'fullName' },
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' }
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' },
{ key: 'classStartDate', label: 'تاریخ شروع کلاس', defaultName: 'classStartDate' },
{ key: 'classDays', label: 'روزهای برگزاری', defaultName: 'classDays' },
{ key: 'courseTime', label: 'ساعت دوره', defaultName: 'courseTime' }
]
},
{
@@ -44,7 +50,10 @@ const SMS_TEMPLATE_DEFS = [
{ key: 'fullName', label: 'نام کارآموز', defaultName: 'FULLNAME' },
{ key: 'amount', label: 'مبلغ', defaultName: 'PAYMENT_PRICE' },
{ key: 'course', label: 'نام دوره', defaultName: 'COURSE' },
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'MOBILE' }
{ key: 'phoneNumber', label: 'شماره همراه', defaultName: 'MOBILE' },
{ key: 'classStartDate', label: 'تاریخ شروع کلاس', defaultName: 'classStartDate' },
{ key: 'classDays', label: 'روزهای برگزاری', defaultName: 'classDays' },
{ key: 'courseTime', label: 'ساعت دوره', defaultName: 'courseTime' }
]
}
];
+11
View File
@@ -58,4 +58,15 @@ describe('SMS template variables', () => {
assert.deepEqual(merged.variables.map((item) => item.slot), ['amount', 'fullName', 'course']);
assert.deepEqual(merged.variables.map((item) => item.name), ['PAYMENT_PRICE', 'FULLNAME', 'COURSE']);
});
it('exposes class start date, class days, and course time slots', () => {
const expected = ['classStartDate', 'classDays', 'courseTime'];
for (const key of ['classRegistered', 'classReminder', 'invoiceCreated']) {
const def = SMS_TEMPLATE_DEFS.find((item) => item.key === key);
const slots = (def?.slots || []).map((slot) => slot.key);
for (const slot of expected) {
assert.ok(slots.includes(slot), `${key} is missing slot ${slot}`);
}
}
});
});