Upate for Moadian plugin
This commit is contained in:
parent
68ef03e863
commit
21aaad7ef1
|
@ -1,173 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-toolbar color="toolbar" title="صورتحسابهای ارسالی به سامانه مودیان مالیاتی">
|
||||
<template v-slot:prepend>
|
||||
<v-tooltip text="بازگشت" location="bottom">
|
||||
<template v-slot:activator="{ props }">
|
||||
<v-btn v-bind="props" @click="$router.back()" class="d-none d-sm-flex" variant="text"
|
||||
icon="mdi-arrow-right" />
|
||||
</template>
|
||||
</v-tooltip>
|
||||
</template>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn :loading="loading" @click="loadData()" icon="" color="primary">
|
||||
<v-tooltip activator="parent" text="بازخوانی" location="bottom" />
|
||||
<v-icon icon="mdi-refresh"></v-icon>
|
||||
</v-btn>
|
||||
</v-toolbar>
|
||||
|
||||
<v-container>
|
||||
<v-card :loading="loading" :disabled="loading">
|
||||
<v-card-text>
|
||||
<v-alert type="info" color="blue" class="mb-4" icon="mdi-information">
|
||||
<span class="font-weight-bold">این بخش برای نمایش لیست صورتحسابهایی است که به سامانه مودیان مالیاتی ارسال شدهاند.</span>
|
||||
</v-alert>
|
||||
|
||||
<v-data-table
|
||||
:headers="headers"
|
||||
:items="invoices"
|
||||
:loading="loading"
|
||||
class="elevation-1"
|
||||
:items-per-page="10"
|
||||
:items-per-page-options="[10, 25, 50, 100]"
|
||||
>
|
||||
<template v-slot:item.status="{ item }">
|
||||
<v-chip
|
||||
:color="getStatusColor(item.status)"
|
||||
:text="getStatusText(item.status)"
|
||||
size="small"
|
||||
></v-chip>
|
||||
</template>
|
||||
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn
|
||||
icon="mdi-eye"
|
||||
variant="text"
|
||||
size="small"
|
||||
@click="viewInvoice(item)"
|
||||
color="primary"
|
||||
></v-btn>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
|
||||
<v-snackbar
|
||||
v-model="snackbar.show"
|
||||
:color="snackbar.color"
|
||||
:timeout="3000"
|
||||
>
|
||||
{{ snackbar.text }}
|
||||
<template v-slot:actions>
|
||||
<v-btn
|
||||
color="white"
|
||||
variant="text"
|
||||
@click="snackbar.show = false"
|
||||
>
|
||||
بستن
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-snackbar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
|
||||
export default {
|
||||
name: 'TaxInvoicesList',
|
||||
data: () => ({
|
||||
loading: false,
|
||||
invoices: [],
|
||||
headers: [
|
||||
{ title: 'شماره فاکتور', key: 'invoiceNumber', sortable: true },
|
||||
{ title: 'تاریخ', key: 'date', sortable: true },
|
||||
{ title: 'مشتری', key: 'customerName', sortable: true },
|
||||
{ title: 'مبلغ کل', key: 'totalAmount', sortable: true },
|
||||
{ title: 'وضعیت ارسال', key: 'status', sortable: true },
|
||||
{ title: 'تاریخ ارسال', key: 'sentDate', sortable: true },
|
||||
{ title: 'عملیات', key: 'actions', sortable: false }
|
||||
],
|
||||
snackbar: {
|
||||
show: false,
|
||||
text: '',
|
||||
color: 'success'
|
||||
}
|
||||
}),
|
||||
methods: {
|
||||
async loadData() {
|
||||
this.loading = true;
|
||||
try {
|
||||
// اینجا باید API مربوط به دریافت لیست صورتحسابهای ارسالی را فراخوانی کنید
|
||||
// const response = await axios.get('/api/plugins/tax-settings/invoices');
|
||||
// this.invoices = response.data;
|
||||
|
||||
// فعلاً دادههای نمونه
|
||||
this.invoices = [
|
||||
{
|
||||
id: 1,
|
||||
invoiceNumber: 'INV-001',
|
||||
date: '1402/12/15',
|
||||
customerName: 'شرکت نمونه',
|
||||
totalAmount: '1,500,000',
|
||||
status: 'sent',
|
||||
sentDate: '1402/12/16'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
invoiceNumber: 'INV-002',
|
||||
date: '1402/12/14',
|
||||
customerName: 'فروشگاه نمونه',
|
||||
totalAmount: '2,300,000',
|
||||
status: 'pending',
|
||||
sentDate: '-'
|
||||
}
|
||||
];
|
||||
} catch (error) {
|
||||
this.showSnackbar('خطا در بارگذاری دادهها', 'error');
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
getStatusColor(status) {
|
||||
switch (status) {
|
||||
case 'sent':
|
||||
return 'success';
|
||||
case 'pending':
|
||||
return 'warning';
|
||||
case 'failed':
|
||||
return 'error';
|
||||
default:
|
||||
return 'grey';
|
||||
}
|
||||
},
|
||||
getStatusText(status) {
|
||||
switch (status) {
|
||||
case 'sent':
|
||||
return 'ارسال شده';
|
||||
case 'pending':
|
||||
return 'در انتظار';
|
||||
case 'failed':
|
||||
return 'ناموفق';
|
||||
default:
|
||||
return 'نامشخص';
|
||||
}
|
||||
},
|
||||
viewInvoice(item) {
|
||||
// اینجا میتوانید به صفحه جزئیات فاکتور بروید
|
||||
this.showSnackbar('نمایش جزئیات فاکتور: ' + item.invoiceNumber);
|
||||
},
|
||||
showSnackbar(text, color = 'success') {
|
||||
this.snackbar = {
|
||||
show: true,
|
||||
text,
|
||||
color
|
||||
};
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadData();
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -1,321 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-toolbar color="toolbar" title="تنظیمات مالیاتی">
|
||||
<template v-slot:prepend>
|
||||
<v-tooltip text="بازگشت" location="bottom">
|
||||
<template v-slot:activator="{ props }">
|
||||
<v-btn v-bind="props" @click="$router.back()" class="d-none d-sm-flex" variant="text"
|
||||
icon="mdi-arrow-right" />
|
||||
</template>
|
||||
</v-tooltip>
|
||||
</template>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn :loading="loading" @click="saveSettings()" icon="" color="green">
|
||||
<v-tooltip activator="parent" text="ذخیره تنظیمات" location="bottom" />
|
||||
<v-icon icon="mdi-content-save"></v-icon>
|
||||
</v-btn>
|
||||
</v-toolbar>
|
||||
|
||||
<v-container>
|
||||
<v-card :loading="loading" :disabled="loading">
|
||||
<v-card-text>
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<v-btn
|
||||
color="primary"
|
||||
@click="showCSRDialog = true"
|
||||
prepend-icon="mdi-key-plus"
|
||||
>
|
||||
ساخت کلید و CSR
|
||||
</v-btn>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field
|
||||
v-model="settings.taxMemoryId"
|
||||
label="شناسه یکتای حافظه مالیاتی"
|
||||
hide-details
|
||||
density="compact"
|
||||
></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<v-text-field
|
||||
v-model="settings.economicCode"
|
||||
label="کد اقتصادی"
|
||||
hide-details
|
||||
density="compact"
|
||||
></v-text-field>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-row class="mt-4">
|
||||
<v-col cols="12">
|
||||
<v-textarea
|
||||
v-model="settings.privateKey"
|
||||
label="Private Key"
|
||||
rows="15"
|
||||
variant="outlined"
|
||||
hide-details
|
||||
placeholder="کلید خصوصی اینجا قرار میگیرد..."
|
||||
></v-textarea>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
|
||||
<!-- Dialog برای ساخت کلید و CSR -->
|
||||
<v-dialog v-model="showCSRDialog" max-width="600px">
|
||||
<v-card>
|
||||
<v-card-title class="text-h6">
|
||||
ساخت کلید و CSR
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-form ref="csrForm">
|
||||
<div class="mb-4">
|
||||
<div class="text-subtitle-2 mb-2">شخص</div>
|
||||
<v-radio-group
|
||||
v-model="csrData.personType"
|
||||
inline
|
||||
hide-details
|
||||
>
|
||||
<v-radio
|
||||
v-for="type in personTypes"
|
||||
:key="type.value"
|
||||
:label="type.title"
|
||||
:value="type.value"
|
||||
:disabled="type.value === 'natural'"
|
||||
></v-radio>
|
||||
</v-radio-group>
|
||||
</div>
|
||||
|
||||
<v-text-field
|
||||
v-model="csrData.nationalId"
|
||||
label="شناسه ملی"
|
||||
hide-details
|
||||
class="mb-4"
|
||||
></v-text-field>
|
||||
|
||||
<v-text-field
|
||||
v-model="csrData.nameFa"
|
||||
label="نام (فارسی)"
|
||||
hide-details
|
||||
class="mb-4"
|
||||
></v-text-field>
|
||||
|
||||
<v-text-field
|
||||
v-model="csrData.nameEn"
|
||||
label="نام (انگلیسی)"
|
||||
hide-details
|
||||
class="mb-4"
|
||||
></v-text-field>
|
||||
|
||||
<v-text-field
|
||||
v-model="csrData.email"
|
||||
label="ایمیل"
|
||||
type="email"
|
||||
hide-details
|
||||
class="mb-4"
|
||||
></v-text-field>
|
||||
</v-form>
|
||||
</v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn @click="showCSRDialog = false" variant="text">
|
||||
انصراف
|
||||
</v-btn>
|
||||
<v-btn @click="generateCSR()" color="primary" :loading="csrLoading">
|
||||
تایید
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<v-dialog v-model="showResultDialog" max-width="900px">
|
||||
<v-card>
|
||||
<v-card-title class="text-h6 pb-0">ساخت کلید و CSR</v-card-title>
|
||||
<v-card-text>
|
||||
<v-alert type="info" color="blue" class="mb-4" icon="mdi-alert">
|
||||
<span class="font-weight-bold">توجه: لطفا این اطلاعات را دانلود کنید و در یک جای امن نگهداری کنید. به دلایل امنیتی اطلاعات شما را نگهداری نمیکنیم، در صورتی که این اطلاعات را گم کنید، امکان بازیابی آن وجود ندارد.</span>
|
||||
</v-alert>
|
||||
<v-row>
|
||||
<v-col cols="12" md="4">
|
||||
<div class="mb-2 font-weight-bold">CSR</div>
|
||||
<v-textarea readonly rows="10" :value="resultData.csr" variant="outlined"></v-textarea>
|
||||
<v-row class="mt-2">
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="copyToClipboard(resultData.csr)"><v-icon start>mdi-content-copy</v-icon>کپی</v-btn>
|
||||
</v-col>
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="downloadFile(resultData.csr, 'csr.txt')"><v-icon start>mdi-download</v-icon>دانلود</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-col>
|
||||
<v-col cols="12" md="4">
|
||||
<div class="mb-2 font-weight-bold">Public Key</div>
|
||||
<v-textarea readonly rows="10" :value="resultData.publicKey" variant="outlined"></v-textarea>
|
||||
<v-row class="mt-2">
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="copyToClipboard(resultData.publicKey)"><v-icon start>mdi-content-copy</v-icon>کپی</v-btn>
|
||||
</v-col>
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="downloadFile(resultData.publicKey, 'public_key.txt')"><v-icon start>mdi-download</v-icon>دانلود</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-col>
|
||||
<v-col cols="12" md="4">
|
||||
<div class="mb-2 font-weight-bold">Private Key</div>
|
||||
<v-textarea readonly rows="10" :value="resultData.privateKey" variant="outlined"></v-textarea>
|
||||
<v-row class="mt-2">
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="copyToClipboard(resultData.privateKey)"><v-icon start>mdi-content-copy</v-icon>کپی</v-btn>
|
||||
</v-col>
|
||||
<v-col cols="6">
|
||||
<v-btn color="success" block @click="downloadFile(resultData.privateKey, 'private_key.txt')"><v-icon start>mdi-download</v-icon>دانلود</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn @click="showResultDialog = false" color="primary">بستن</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<v-snackbar
|
||||
v-model="snackbar.show"
|
||||
:color="snackbar.color"
|
||||
:timeout="3000"
|
||||
>
|
||||
{{ snackbar.text }}
|
||||
<template v-slot:actions>
|
||||
<v-btn
|
||||
color="white"
|
||||
variant="text"
|
||||
@click="snackbar.show = false"
|
||||
>
|
||||
بستن
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-snackbar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import Swal from 'sweetalert2';
|
||||
|
||||
export default {
|
||||
name: 'TaxSettings',
|
||||
data: () => ({
|
||||
loading: false,
|
||||
csrLoading: false,
|
||||
showCSRDialog: false,
|
||||
showResultDialog: false,
|
||||
settings: {
|
||||
taxMemoryId: '',
|
||||
economicCode: '',
|
||||
privateKey: '',
|
||||
},
|
||||
csrData: {
|
||||
personType: 'legal',
|
||||
nationalId: '',
|
||||
nameFa: '',
|
||||
nameEn: '',
|
||||
email: '',
|
||||
},
|
||||
resultData: {
|
||||
csr: '',
|
||||
publicKey: '',
|
||||
privateKey: ''
|
||||
},
|
||||
personTypes: [
|
||||
{ title: 'حقیقی', value: 'natural' },
|
||||
{ title: 'حقوقی', value: 'legal' }
|
||||
],
|
||||
snackbar: {
|
||||
show: false,
|
||||
text: '',
|
||||
color: 'success'
|
||||
}
|
||||
}),
|
||||
methods: {
|
||||
async loadSettings() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const response = await axios.get('/api/plugins/tax-settings/get');
|
||||
this.settings = {
|
||||
...this.settings,
|
||||
...response.data
|
||||
};
|
||||
} catch (error) {
|
||||
this.showSnackbar('خطا در بارگذاری تنظیمات', 'error');
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async saveSettings() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const dataToSave = { ...this.settings };
|
||||
await axios.post('/api/plugins/tax-settings/save', dataToSave);
|
||||
this.showSnackbar('تنظیمات با موفقیت ذخیره شد', 'success');
|
||||
} catch (error) {
|
||||
this.showSnackbar('خطا در ذخیره تنظیمات', 'error');
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async generateCSR() {
|
||||
this.csrLoading = true;
|
||||
try {
|
||||
const response = await axios.post('/api/plugins/tax-settings/generate-csr', this.csrData);
|
||||
|
||||
if (response.data.success) {
|
||||
// this.settings.privateKey = response.data.privateKey;
|
||||
// نمایش دیالوگ نتیجه
|
||||
this.resultData.csr = response.data.csr;
|
||||
this.resultData.privateKey = response.data.privateKey;
|
||||
this.resultData.publicKey = response.data.publicKey || '';
|
||||
this.showResultDialog = true;
|
||||
this.showCSRDialog = false;
|
||||
this.showSnackbar('کلید و CSR با موفقیت تولید شد', 'success');
|
||||
} else {
|
||||
this.showSnackbar(response.data.message || 'خطا در تولید کلید و CSR', 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
this.showSnackbar('خطا در تولید کلید و CSR', 'error');
|
||||
} finally {
|
||||
this.csrLoading = false;
|
||||
}
|
||||
},
|
||||
copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text);
|
||||
this.showSnackbar('کپی شد');
|
||||
},
|
||||
downloadFile(content, filename) {
|
||||
const blob = new Blob([content], { type: 'text/plain' });
|
||||
const link = document.createElement('a');
|
||||
link.href = URL.createObjectURL(blob);
|
||||
link.download = filename;
|
||||
link.click();
|
||||
URL.revokeObjectURL(link.href);
|
||||
},
|
||||
showSnackbar(text, color = 'success') {
|
||||
this.snackbar = {
|
||||
show: true,
|
||||
text,
|
||||
color
|
||||
};
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadSettings();
|
||||
}
|
||||
};
|
||||
</script>
|
Loading…
Reference in a new issue