هیچ متغیری برای این قالب تعریف نشده است. پیامک بدون متغیر ارسال خواهد شد.
@@ -87,13 +87,13 @@
-
-
{{ vIdx + 1 }}.
+
+ مقدار ارسالی از سیستم:
-
-
-
-
+
+
نام متغیر در sms.ir:
+
+
+
+
+
@@ -278,6 +281,45 @@ const selectedFileName = ref('');
const isImporting = ref(false);
const importResult = ref(null);
+const TEMPLATE_SLOT_DEFS = {
+ accountCreated: [
+ { slot: 'username', label: 'نام کاربری', defaultName: 'user' },
+ { slot: 'password', label: 'رمز عبور', defaultName: 'password' },
+ { slot: 'fullName', label: 'نام و نام خانوادگی', defaultName: 'name' },
+ { slot: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' }
+ ],
+ classRegistered: [
+ { slot: 'className', label: 'نام کلاس', defaultName: 'className' },
+ { slot: 'courseName', label: 'نام دوره', defaultName: 'courseName' },
+ { slot: 'fullName', label: 'نام کارآموز', defaultName: 'fullName' },
+ { slot: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' }
+ ],
+ classReminder: [
+ { slot: 'className', label: 'نام کلاس', defaultName: 'className' },
+ { slot: 'time', label: 'ساعت برگزاری', defaultName: 'time' },
+ { slot: 'place', label: 'مکان برگزاری', defaultName: 'place' },
+ { slot: 'courseName', label: 'نام دوره', defaultName: 'courseName' },
+ { slot: 'fullName', label: 'نام کاربر', defaultName: 'fullName' },
+ { slot: 'phoneNumber', label: 'شماره همراه', defaultName: 'mobile' }
+ ],
+ invoiceCreated: [
+ { slot: 'amount', label: 'مبلغ صورتحساب (تومان)', defaultName: 'PAYMENT_PRICE' },
+ { slot: 'fullName', label: 'نام کارآموز', defaultName: 'FULLNAME' },
+ { slot: 'course', label: 'نام دوره / کلاس', defaultName: 'COURSE' },
+ { slot: 'phoneNumber', label: 'شماره همراه', defaultName: 'MOBILE' }
+ ]
+};
+
+const getAvailableSlots = (templateKey) => {
+ return TEMPLATE_SLOT_DEFS[templateKey] || [];
+};
+
+const getSlotDefaultName = (templateKey, slotKey) => {
+ const slots = getAvailableSlots(templateKey);
+ const found = slots.find((s) => s.slot === slotKey);
+ return found?.defaultName || '';
+};
+
const lockedAtLabel = computed(() => {
if (!lockedAt.value) return '';
const date = new Date(lockedAt.value);
@@ -285,30 +327,24 @@ const lockedAtLabel = computed(() => {
return `قفل شده در ${date.toLocaleString('fa-IR')}`;
});
-const getSlotDefaultName = (template, slotKey) => {
- const slot = (template?.availableSlots || []).find((s) => s.slot === slotKey);
- return slot?.defaultName || '';
-};
-
const onSlotChange = (templateKey, vIdx) => {
const form = templateForm.value[templateKey];
if (!form || !form.variables[vIdx]) return;
- const template = smsTemplates.value.find((t) => t.key === templateKey);
const currentVar = form.variables[vIdx];
- if (!currentVar.name) {
- currentVar.name = getSlotDefaultName(template, currentVar.slot);
+ const defaultName = getSlotDefaultName(templateKey, currentVar.slot);
+ if (!currentVar.name || currentVar.name === 'param') {
+ currentVar.name = defaultName;
}
};
const addVariable = (templateKey) => {
const form = templateForm.value[templateKey];
if (!form) return;
- const template = smsTemplates.value.find((t) => t.key === templateKey);
- const availableSlots = template?.availableSlots || [];
+ const availableSlots = getAvailableSlots(templateKey);
const existingSlots = new Set((form.variables || []).map((v) => v.slot));
const unusedSlot = availableSlots.find((s) => !existingSlots.has(s.slot));
- const selectedSlot = unusedSlot || availableSlots[0] || { slot: 'param', defaultName: 'param' };
+ const selectedSlot = unusedSlot || availableSlots[0] || { slot: 'amount', defaultName: 'PAYMENT_PRICE' };
form.variables.push({
id: `var_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
@@ -408,16 +444,28 @@ const confirmImport = () => {
});
};
-const emptyFormEntry = (template) => ({
- templateId: template?.templateId || '',
- variables: Array.isArray(template?.variables)
- ? template.variables.map((variable) => ({
- id: `var_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
- slot: variable.slot,
- name: variable.name || ''
- }))
- : []
-});
+const emptyFormEntry = (template) => {
+ const slots = getAvailableSlots(template?.key);
+ let vars = [];
+ if (Array.isArray(template?.variables) && template.variables.length > 0) {
+ vars = template.variables.map((variable) => ({
+ id: `var_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
+ slot: variable.slot || slots[0]?.slot || 'amount',
+ name: variable.name || getSlotDefaultName(template?.key, variable.slot) || ''
+ }));
+ } else if (!template?.variables) {
+ vars = slots.map((s) => ({
+ id: `var_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`,
+ slot: s.slot,
+ name: s.defaultName
+ }));
+ }
+
+ return {
+ templateId: template?.templateId || '',
+ variables: vars
+ };
+};
const applySmsTemplates = (payload) => {
const data = payload?.data?.data || payload?.data || payload || {};
@@ -449,12 +497,12 @@ const saveSmsTemplates = async () => {
smsTemplates.value.forEach((template) => {
const entry = templateForm.value[template.key] || emptyFormEntry(template);
smsTemplatesPayload[template.key] = {
- templateId: entry.templateId || '',
+ templateId: String(entry.templateId || '').trim(),
variables: (entry.variables || [])
- .filter((v) => v.slot)
+ .filter((v) => v.slot && String(v.name || '').trim())
.map((v) => ({
slot: v.slot,
- name: v.name || getSlotDefaultName(template, v.slot) || v.slot
+ name: String(v.name).trim().replace(/^#+|#+$/g, '')
}))
};
});