334 lines
11 KiB
Vue
334 lines
11 KiB
Vue
<template>
|
|
<div>
|
|
<CustomSubHeader>
|
|
<CBreadcrumb class="border-0 mb-0">{{ title }}</CBreadcrumb>
|
|
<el-tag v-if="!isNew && sms._creator.first_name" type="primary" class="ml-1">
|
|
<span>ایجاد کننده: </span>
|
|
<span> {{ sms._creator.first_name + ' ' + sms._creator.last_name }} </span>
|
|
</el-tag>
|
|
<CButton size="sm" color="primary" class="mr-auto" @click="$router.go(-1)">برگشت به صفحه قبل</CButton>
|
|
</CustomSubHeader>
|
|
|
|
<CRow>
|
|
<CCol sm="12">
|
|
<CCard>
|
|
<CCardBody>
|
|
<h6>متن پیامک:</h6>
|
|
<el-divider></el-divider>
|
|
<CForm>
|
|
<CTextarea
|
|
v-model="sms.message"
|
|
label="متن"
|
|
horizontal
|
|
rows="5"
|
|
:class="validation.message && 'err'"
|
|
:disabled="!isNew"
|
|
:description="validation.message && validation.message.msg"
|
|
/>
|
|
<CInput
|
|
v-if="!isNew"
|
|
label="تاریخ ارسال"
|
|
horizontal
|
|
:value="$jDateTime(sms.create_at)"
|
|
:disabled="true"
|
|
/>
|
|
</CForm>
|
|
|
|
<div v-if="isNew" class="recievers mt-5" style="text-align: center">
|
|
<h4>
|
|
<span>تعداد مخاطبین انتخاب شده:</span>
|
|
<b>{{ contacts.length }}</b>
|
|
</h4>
|
|
<p v-if="searchInput.length" style="color: orange; font-size: 12">
|
|
*برای مشاهده نتایج دقیق فیلد "جستجو" را خالی کنید. چنانچه فیلد جستجو پر باشد فقط برای کسانی که در لیست
|
|
فیلتر شده اند و نامشان انتخاب شده پیامک خواهد رفت.
|
|
</p>
|
|
<p v-if="validation.recievers && validation.recievers.msg" style="color: red">
|
|
{{ validation.recievers.msg }}
|
|
</p>
|
|
|
|
<div class="btnRow mt-3">
|
|
<el-button class="btn btn-primary custom-el-button" :loading="posting" @click="post">ارسال</el-button>
|
|
</div>
|
|
</div>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
|
|
<CCol v-if="isNew" sm="12">
|
|
<CCard>
|
|
<CCardBody>
|
|
<h6 class="mb-2">انتخاب مخاطبین:</h6>
|
|
|
|
<div class="mb-2">
|
|
<CButtonGroup>
|
|
<CButton
|
|
:color="userType === 'all' ? 'primary' : 'light'"
|
|
:class="userType === 'all' && 'selected'"
|
|
@click="userType = 'all'"
|
|
>
|
|
<span>همه</span>
|
|
</CButton>
|
|
|
|
<CButton
|
|
:color="userType === 'customers' ? 'primary' : 'light'"
|
|
:class="userType === 'customers' && 'selected'"
|
|
@click="userType = 'customers'"
|
|
>
|
|
<span>مشتریان</span>
|
|
</CButton>
|
|
|
|
<CButton
|
|
:color="userType === 'agents' ? 'primary' : 'light'"
|
|
:class="userType === 'agents' && 'selected'"
|
|
@click="userType = 'agents'"
|
|
>
|
|
<span>نمایندگان</span>
|
|
</CButton>
|
|
</CButtonGroup>
|
|
</div>
|
|
|
|
<el-input
|
|
v-model="searchInput"
|
|
clearable
|
|
placeholder="جستجو با نام و نام خانوادگی - کد مشتری - کد ملی - شماره همراه"
|
|
/>
|
|
|
|
<el-divider></el-divider>
|
|
|
|
<div>
|
|
<el-checkbox key="checkAll_checkbox1" v-model="selectAll" label="انتخاب همه" />
|
|
</div>
|
|
<el-divider></el-divider>
|
|
<el-table :data="filteredItems" style="width: 100%">
|
|
<el-table-column type="index" label="#"> </el-table-column>
|
|
|
|
<el-table-column label="نام" width="">
|
|
<template slot-scope="scope">
|
|
{{ scope.row.first_name + ' ' + scope.row.last_name }}
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="national_code" label="کد ملی" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="mobile_number" label="شماره موبایل" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="verity_businessCode" label="کد مشتری (وریتی)" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="panatech_businessCode" label="کد مشتری (پاناتک)" width=""> </el-table-column>
|
|
|
|
<el-table-column label="وضعیت حساب" width="">
|
|
<template slot-scope="scope">
|
|
<el-tag v-if="scope.row.isAgent" type="success">نماینده</el-tag>
|
|
<el-tag v-else type="warning">مشتری</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column v-if="!selectAll" label="انتخاب" width="65" align="center">
|
|
<template slot-scope="scope">
|
|
<el-checkbox :key="scope.row._id + 'singleCheckBox'" v-model="scope.row.checked" />
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
|
|
<CCol v-else sm="12">
|
|
<CCard>
|
|
<CCardBody>
|
|
<h6 class="mb-2">لیست مخاطبین:</h6>
|
|
|
|
<el-divider></el-divider>
|
|
|
|
<el-table :data="sms.recievers" style="width: 100%">
|
|
<el-table-column type="index" label="#"> </el-table-column>
|
|
|
|
<el-table-column label="نام" width="">
|
|
<template slot-scope="scope">
|
|
{{ scope.row.user_id.first_name + ' ' + scope.row.user_id.last_name }}
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="user_id.mobile_number" label="کد ملی" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="mobile_number" label="شماره موبایل" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="user_id.verity_businessCode" label="کد مشتری (وریتی)" width=""> </el-table-column>
|
|
|
|
<el-table-column prop="user_id.panatech_businessCode" label="کد مشتری (پاناتک)" width="">
|
|
</el-table-column>
|
|
|
|
<el-table-column label="مشاهده اکانت کاربر" width="140" align="center">
|
|
<template slot-scope="scope">
|
|
<CButton
|
|
:key="scope.row._id"
|
|
color="success"
|
|
variant="outline"
|
|
:to="{ name: 'admin-customers-customer', params: { customer: scope.row.user_id._id } }"
|
|
>
|
|
<i class="fal fa-eye"></i>
|
|
</CButton>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
</CRow>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'AdminSMSBroadcastDetails',
|
|
layout: 'admin',
|
|
async asyncData({ $axios, params, error }) {
|
|
try {
|
|
if (params.item !== 'new') {
|
|
const sms = await $axios.get(`/api/admin/smsBroadcasts/${params.item}`)
|
|
return {
|
|
sms: sms.data
|
|
}
|
|
} else {
|
|
const users = await $axios.get(`/api/admin/usersForSMS`)
|
|
return {
|
|
sms: {
|
|
message: '',
|
|
recieveres: []
|
|
},
|
|
users: users.data
|
|
}
|
|
}
|
|
} catch (e) {
|
|
error({ status: 404, message: 'Page not found' })
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
sms: null,
|
|
users: null,
|
|
posting: false,
|
|
selectAll: false,
|
|
userType: 'all',
|
|
searchInput: '',
|
|
validation: {}
|
|
}
|
|
},
|
|
head() {
|
|
return {
|
|
title: this.title
|
|
}
|
|
},
|
|
computed: {
|
|
title() {
|
|
if (this.isNew) return 'ارسال پیامک گروهی برای کاربران'
|
|
else return 'مشاهده پیامک ارسال شده'
|
|
},
|
|
isNew() {
|
|
return this.$route.params.item === 'new'
|
|
},
|
|
contacts() {
|
|
if (this.selectAll) return this.filteredItems
|
|
else return this.filteredItems.filter(item => item.checked)
|
|
},
|
|
filteredItems() {
|
|
const filterUsersByType = this.users.filter(item => {
|
|
if (this.userType === 'all') return item
|
|
else if (this.userType === 'customers' && !item.isAgent) return item
|
|
else if (this.userType === 'agents' && item.isAgent) return item
|
|
else return null
|
|
})
|
|
const searchInput = this.searchInput
|
|
if (!this.searchInput.length) return filterUsersByType
|
|
else {
|
|
return filterUsersByType.filter(item => {
|
|
return (
|
|
item.first_name.includes(searchInput) ||
|
|
item.last_name.includes(searchInput) ||
|
|
item.mobile_number.includes(searchInput) ||
|
|
item.national_code.includes(searchInput) ||
|
|
item.verity_businessCode?.includes(searchInput) ||
|
|
item.panatech_businessCode?.includes(searchInput) ||
|
|
(item.first_name + ' ' + item.last_name).includes(searchInput)
|
|
)
|
|
})
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
userType(newVal, oldVal) {}
|
|
},
|
|
methods: {
|
|
async post() {
|
|
try {
|
|
if (!this.isNew) return
|
|
if (this.posting) {
|
|
return this.$message({
|
|
type: 'warning',
|
|
message: 'لطفا منتظر بمانید'
|
|
})
|
|
}
|
|
|
|
// get user confirmations
|
|
const title1 = ' هشدار - مرحله اول'
|
|
const title2 = ' هشدار - مرحله دوم'
|
|
|
|
const msg1 = 'لیست مخاطبان و متن پیام را چند بار قبل از ارسال بررسی کنید!'
|
|
const msg2 = 'پس از ارسال امکان انصراف یا بازگشت نخواهد بود!!!'
|
|
|
|
/// first step
|
|
await this.$confirm(msg1, title1, {
|
|
confirmButtonText: 'ادامه',
|
|
cancelButtonText: 'لغو',
|
|
type: 'warning'
|
|
})
|
|
/// second step
|
|
await this.$confirm(msg2, title2, {
|
|
confirmButtonText: 'ارسال',
|
|
cancelButtonText: 'لغو',
|
|
type: 'warning'
|
|
})
|
|
|
|
this.posting = true
|
|
this.validation = {}
|
|
|
|
// create recieveres array
|
|
const recievers = []
|
|
for await (const contact of this.contacts) {
|
|
recievers.push({ user_id: contact._id, mobile_number: contact.mobile_number })
|
|
}
|
|
|
|
// send request
|
|
const smsBroadcast = await this.$axios.post('/api/admin/broadcastSMS', {
|
|
message: this.sms.message,
|
|
recievers
|
|
})
|
|
|
|
// handle request response
|
|
this.posting = false
|
|
this.$message({
|
|
type: 'success',
|
|
message: smsBroadcast.data.message
|
|
})
|
|
this.$router.push({ name: 'admin-sms' })
|
|
} catch (err) {
|
|
this.posting = false
|
|
if (err.response?.status === 422) {
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'پارامتر ها رو بررسی کنید'
|
|
})
|
|
this.validation = err.response.data.validation
|
|
}
|
|
if (err.response?.status === 401)
|
|
this.$message({
|
|
type: 'error',
|
|
message: 'دوباره وارد سیستم شوید'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|