redesign some parts

This commit is contained in:
Hesabix 2025-04-03 22:43:29 +00:00
parent f14bfa9e96
commit 0c40629df2
6 changed files with 351 additions and 209 deletions

View file

@ -1,145 +1,123 @@
<template>
<div class="block block-content-full ">
<div id="fixed-header" class="block-header block-header-default bg-gray-light pt-2 pb-1">
<h3 class="block-title text-primary-dark">
<button @click="$router.back()" type="button" class="float-start d-none d-sm-none d-md-block btn btn-sm btn-link text-warning">
<i class="fa fw-bold fa-arrow-right"></i>
</button>
سند حسابداری</h3>
<div class="block-options">
<archive-upload v-if="this.item.doc.id != 0" :docid="this.item.doc.id" doctype="accounting" cat="accounting"></archive-upload>
<documentLogButton :doc-code="this.$route.params.id" />
<button type="button" class="btn btn-sm btn-warning text-light me-2" data-bs-toggle="modal" data-bs-target="#notesModal">
<span class="badge text-bg-dark me-2">{{ this.notes.count }}</span>
<i class="fa-regular fa-note-sticky me-1"></i>
<span class="d-none d-sm-inline-block">یادداشتها</span>
</button>
<notes :stat="notes" :code="this.$route.params.id" typeNote="accounting" />
<button class="btn btn-sm btn-primary mx-2" onclick="Dashmix.helpers('dm-print');" type="button">
<i class="si si-printer me-1"></i>
<span class="d-none d-sm-inline-block">چاپ سند</span>
</button>
</div>
</div>
<div id="dm-print" class="block-content py-3 px-0 vl-parent">
<loading color="blue" loader="dots" v-model:active="isLoading" :is-full-page="false"/>
<div class="container-fluid">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="fw-bold">مشخصات سند</div>
<div class="row">
<div class="col-sm-6 col-md-4">
<div class="form-floating mb-3">
<input v-model="item.doc.code" type="text" class="form-control" disabled readonly>
<label for="floatingInput">شماره سند</label>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="form-floating mb-3">
<input v-model="item.doc.date" type="text" class="form-control" disabled readonly>
<label for="floatingInput">تاریخ</label>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="form-floating mb-3">
<input v-model="item.doc.amount" type="text" class="form-control" disabled readonly>
<label for="floatingInput">تراز تجمیعی(بستانکار / بدهکار )</label>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="form-floating mb-3">
<input v-model="item.doc.des" type="text" class="form-control" disabled readonly>
<label for="floatingInput">شرح</label>
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-12">
<div class="table-responsive">
<table class="table table-sm table-bordered table-striped table-vcenter">
<thead>
<div>
<v-toolbar color="toolbar" title="سند حسابداری">
<template v-slot:prepend>
<v-tooltip :text="$t('dialog.back')" 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-toolbar-items>
<archive-upload v-if="item.doc.id != 0" :docid="item.doc.id" doctype="accounting" cat="accounting" />
<notes :stat="notes" :code="$route.params.id" type-note="accounting" />
<document-log-button :doc-code="$route.params.id" />
<v-btn icon color="primary" class="ml-2" @click="print">
<v-icon>mdi-printer</v-icon>
<v-tooltip activator="parent" location="bottom">چاپ سند</v-tooltip>
</v-btn>
</v-toolbar-items>
</v-toolbar>
<div id="dm-print" class="pa-4">
<v-row>
<v-col cols="12" md="4">
<v-skeleton-loader v-if="isLoading" type="text" />
<v-text-field v-else v-model="item.doc.code" label="شماره سند" readonly variant="outlined"></v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-skeleton-loader v-if="isLoading" type="text" />
<v-text-field v-else v-model="item.doc.date" label="تاریخ" readonly variant="outlined"></v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-skeleton-loader v-if="isLoading" type="text" />
<v-text-field v-else v-model="item.doc.amount" label="تراز تجمیعی(بستانکار / بدهکار)" readonly
variant="outlined"></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<v-skeleton-loader v-if="isLoading" type="text" />
<v-text-field v-else v-model="item.doc.des" label="شرح" readonly variant="outlined"></v-text-field>
</v-col>
</v-row>
<v-data-table
:headers="headers"
:items="item.rows"
:loading="isLoading"
class="mt-4"
:header-props="{ class: 'custom-header' }"
hide-default-footer
:items-per-page="-1"
>
<template v-slot:item="{ item, index }">
<tr>
<th class="text-center">#</th>
<th>حساب</th>
<th>تفضیل</th>
<th>شرح</th>
<th>بدهکار</th>
<th>بستانکار</th>
<td class="text-center">{{ index + 1 }}</td>
<td>{{ item.table }}</td>
<td>{{ item.refCode + '-' + item.ref }}</td>
<td>{{ item.des }}</td>
<td>{{ proxy.$filters.formatNumber(item.bd) }}</td>
<td>{{ proxy.$filters.formatNumber(item.bs) }}</td>
</tr>
</thead>
<tbody>
<tr v-for="(row, index) in item.rows">
<td>{{index}}</td>
<td>{{ row.table }}</td>
<td>{{ row.refCode + '-' + row.ref }}</td>
<td>{{ row.des }}</td>
<td>{{ $filters.formatNumber(row.bd) }}</td>
<td>{{ $filters.formatNumber(row.bs) }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
</v-data-table>
</div>
</div>
</template>
<script>
import axios from "axios";
import Swal from "sweetalert2";
import {ref} from "vue";
import Loading from "vue-loading-overlay";
import ArchiveUpload from "../component/archive/archiveUpload.vue";
import documentLogButton from "../component/documentLogButton.vue";
import notes from "../component/notes.vue";
<script setup>
import { ref, onBeforeMount } from 'vue'
import { useRoute } from 'vue-router'
import axios from 'axios'
import ArchiveUpload from '../component/archive/archiveUpload.vue'
import DocumentLogButton from '../component/documentLogButton.vue'
import Notes from '../component/notes.vue'
import { getCurrentInstance } from 'vue'
export default {
name: "viewDoc",
components: {
ArchiveUpload,
Loading,
documentLogButton,
notes
},
data: ()=>{return {
notes: {
count: 0
},
isLoading: true,
item:{
const { proxy } = getCurrentInstance()
const route = useRoute()
const notes = ref({ count: 0 })
const isLoading = ref(true)
const item = ref({
doc: {
id: 0,
code: ''
}
},
}},
methods: {
loadData(){
axios.post('/api/accounting/doc/get',{
code: this.$route.params.id
}).then((response)=>{
this.item = response.data;
this.item.doc.amount = this.$filters.formatNumber(this.item.doc.amount);
this.isLoading = false;
})
}
},
beforeMount() {
this.loadData();
const headers = [
{ title: 'ردیف', key: 'index', align: 'center', sortable: false },
{ title: 'حساب', key: 'table', sortable: false },
{ title: 'تفضیل', key: 'refCode', sortable: false },
{ title: 'شرح', key: 'des', sortable: false },
{ title: 'بدهکار', key: 'bd', sortable: false },
{ title: 'بستانکار', key: 'bs', sortable: false }
]
const loadData = async () => {
try {
const response = await axios.post('/api/accounting/doc/get', {
code: route.params.id
})
item.value = response.data
item.value.doc.amount = proxy.$filters.formatNumber(item.value.doc.amount)
isLoading.value = false
} catch (error) {
console.error('Error loading data:', error)
}
}
const print = () => {
window.print()
}
onBeforeMount(() => {
loadData()
})
</script>
<style scoped>
th,td{
text-align: center;
}
td{
font-weight: lighter;
}
</style>
<style scoped></style>

View file

@ -8,16 +8,16 @@ export default defineComponent({
docCode: String
},
data: ()=>{return {
logPermision : ref(false),
itemsSelected: [],
searchValue: '',
dialog: false,
loading: ref(true),
items:[],
headers: [
{ text: "تاریخ", value: "date"},
{ text: "کاربر", value: "user"},
{ text: "شرح", value: "des"},
]
{ title: "تاریخ", key: "date", align: "center" as const},
{ title: "کاربر", key: "user", align: "center" as const},
{ title: "شرح", key: "des", align: "center" as const},
],
searchValue: '',
logPermision: ref(false)
}},
methods:{
loadData(){
@ -31,7 +31,6 @@ export default defineComponent({
});
}
});
}
},
mounted(){
@ -41,47 +40,56 @@ export default defineComponent({
</script>
<template>
<!-- Button trigger modal -->
<button v-show="this.logPermision" title="تاریخچه سند" type="button" class="btn btn-sm btn-info mx-2" data-bs-toggle="modal" data-bs-target="#staticBackdrop" >
<i class="fa fa-history me-2" aria-hidden="true"></i>
<span class="">تاریخچه</span>
</button>
<!-- دکمه در تولبار -->
<v-btn v-show="logPermision" icon color="info" class="ml-2" @click="dialog = true">
<v-icon>mdi-history</v-icon>
<v-tooltip activator="parent" location="bottom">تاریخچه سند</v-tooltip>
</v-btn>
<!-- Modal -->
<div class="modal modal-lg fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-info-light text-dark">
<h1 class="modal-title fs-5" id="staticBackdropLabel">
<i class="fa fa-history me-2" aria-hidden="true"></i>
<!-- دیالوگ تاریخچه -->
<v-dialog v-model="dialog" max-width="800" persistent>
<v-card>
<v-toolbar color="toolbar" flat dark>
<v-toolbar-title>
<v-icon color="info" left>mdi-history</v-icon>
تاریخچه تغییرات سند
</h1>
<div class="block-options">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
<div class="modal-body">
<EasyDataTable table-class-name="customize-table"
show-index
alternating
:search-value="searchValue"
</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon @click="dialog = false">
<v-icon>mdi-close</v-icon>
</v-btn>
</v-toolbar>
<v-card-text class="pa-0">
<v-data-table
:headers="headers"
:items="items"
theme-color="#1d90ff"
header-text-direction="center"
body-text-direction="center"
rowsPerPageMessage="تعداد سطر"
emptyMessage="اطلاعاتی برای نمایش وجود ندارد"
rowsOfPageSeparatorMessage="از"
:loading="loading"
:search="searchValue"
density="compact"
hover
class="elevation-1"
>
</EasyDataTable>
</div>
</div>
</div>
<template v-slot:loading>
<v-progress-circular
indeterminate
color="primary"
></v-progress-circular>
</template>
<template v-slot:no-data>
<div class="text-center py-4">
اطلاعاتی برای نمایش وجود ندارد
</div>
</template>
</v-data-table>
</v-card-text>
</v-card>
</v-dialog>
</template>
<style scoped>
.v-data-table {
--v-table-header-height: 40px;
--v-table-row-height: 40px;
}
</style>

View file

@ -129,16 +129,21 @@ export default defineComponent({
:disabled="loading"
@keyup.enter="save"
:loading="loading"
></v-text-field>
>
<template v-slot:append>
<v-btn
color="success"
@click="save"
class="mt-2"
:loading="loading"
icon
variant="text"
density="comfortable"
>
<v-icon left>mdi-content-save</v-icon>
ثبت یادداشت
<v-icon>mdi-content-save</v-icon>
<v-tooltip activator="parent" location="bottom">ثبت یادداشت</v-tooltip>
</v-btn>
</template>
</v-text-field>
</v-col>
</v-row>

View file

@ -69,7 +69,7 @@
</v-tooltip>
</v-toolbar>
<v-text-field :loading="loading" color="green" class="mb-0 pt-0 rounded-0" hide-details="auto" density="compact"
<v-text-field :rounded="false" :loading="loading" color="green" class="mb-0 pt-0 rounded-0" hide-details="auto" density="compact"
:placeholder="$t('dialog.search_txt')" v-model="searchQuery" type="text" clearable>
<template v-slot:prepend-inner>
<v-tooltip location="bottom" :text="$t('dialog.search')">

View file

@ -11,7 +11,6 @@
</template>
<v-spacer></v-spacer>
<archive-upload v-if="$route.params.id" :docid="$route.params.id" doctype="cost" cat="cost" />
<v-menu>
<template v-slot:activator="{ props }">
@ -53,11 +52,13 @@
</v-list-item>
</v-list>
</v-menu>
<archive-upload v-if="$route.params.id" :docid="$route.params.id" doctype="cost" cat="cost" />
<v-btn color="primary" :disabled="!canSubmit" @click="save()" class="ms-2">
<v-icon>mdi-content-save</v-icon>
ثبت
</v-btn>
<v-tooltip :text="$t('dialog.save')" location="bottom">
<template v-slot:activator="{ props }">
<v-btn v-bind="props" color="primary" :disabled="!canSubmit" @click="save()" class="ms-2" icon="mdi-content-save" />
</template>
</v-tooltip>
</v-toolbar>
<!-- محتوا -->
@ -176,6 +177,156 @@
</v-card>
</template>
<!-- صندوق -->
<template v-for="(item, index) in cashdesks" :key="'cashdesk'+index">
<v-card class="mb-4">
<v-toolbar color="grey-lighten-3" density="compact">
<v-toolbar-title>
<span class="me-2">{{ index + 1 }}</span>
<v-icon>mdi-cash-register</v-icon>
صندوق
</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon color="error" @click="removeCashdesk(index)">
<v-icon>mdi-delete</v-icon>
</v-btn>
</v-toolbar>
<v-card-text>
<v-row>
<v-col cols="12" md="4">
<v-autocomplete
v-model="item.person"
:items="listCashdesks"
item-title="name"
item-value="id"
label="صندوق"
variant="outlined"
density="compact"
></v-autocomplete>
</v-col>
<v-col cols="12" md="4">
<Hnumberinput
v-model="item.amount"
label="مبلغ"
variant="outlined"
density="compact"
@update:model-value="calc"
/>
</v-col>
<v-col cols="12" md="4">
<v-text-field
v-model="item.des"
label="شرح"
variant="outlined"
density="compact"
></v-text-field>
</v-col>
</v-row>
</v-card-text>
</v-card>
</template>
<!-- تنخواه گردان -->
<template v-for="(item, index) in salarys" :key="'salary'+index">
<v-card class="mb-4">
<v-toolbar color="grey-lighten-3" density="compact">
<v-toolbar-title>
<span class="me-2">{{ index + 1 }}</span>
<v-icon>mdi-wallet</v-icon>
تنخواه گردان
</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon color="error" @click="removeSalary(index)">
<v-icon>mdi-delete</v-icon>
</v-btn>
</v-toolbar>
<v-card-text>
<v-row>
<v-col cols="12" md="4">
<v-autocomplete
v-model="item.person"
:items="listSalarys"
item-title="name"
item-value="id"
label="تنخواه گردان"
variant="outlined"
density="compact"
></v-autocomplete>
</v-col>
<v-col cols="12" md="4">
<Hnumberinput
v-model="item.amount"
label="مبلغ"
variant="outlined"
density="compact"
@update:model-value="calc"
/>
</v-col>
<v-col cols="12" md="4">
<v-text-field
v-model="item.des"
label="شرح"
variant="outlined"
density="compact"
></v-text-field>
</v-col>
</v-row>
</v-card-text>
</v-card>
</template>
<!-- شخص -->
<template v-for="(item, index) in persons" :key="'person'+index">
<v-card class="mb-4">
<v-toolbar color="grey-lighten-3" density="compact">
<v-toolbar-title>
<span class="me-2">{{ index + 1 }}</span>
<v-icon>mdi-account</v-icon>
شخص
</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon color="error" @click="removePerson(index)">
<v-icon>mdi-delete</v-icon>
</v-btn>
</v-toolbar>
<v-card-text>
<v-row>
<v-col cols="12" md="4">
<v-autocomplete
v-model="item.person"
:items="listPersons"
item-title="name"
item-value="id"
label="شخص"
variant="outlined"
density="compact"
></v-autocomplete>
</v-col>
<v-col cols="12" md="4">
<Hnumberinput
v-model="item.amount"
label="مبلغ"
variant="outlined"
density="compact"
@update:model-value="calc"
/>
</v-col>
<v-col cols="12" md="4">
<v-text-field
v-model="item.des"
label="شرح"
variant="outlined"
density="compact"
></v-text-field>
</v-col>
</v-row>
</v-card-text>
</v-card>
</template>
<!-- سایر بخشها به همین صورت -->
</v-container>
@ -457,17 +608,17 @@ export default {
}
});
this.salarys.forEach((item) => {
if (item.id == null || item.id == '') {
if (item.person == null || item.person == '') {
sideOK = false;
}
})
this.cashdesks.forEach((item) => {
if (item.id == null || item.id == '') {
if (item.person == null || item.person == '') {
sideOK = false;
}
})
this.persons.forEach((item) => {
if (item.id == null || item.id == '') {
if (item.person == null || item.person == '') {
sideOK = false;
}
})
@ -510,7 +661,7 @@ export default {
this.banks.forEach((item) => {
if (item.des == '') item.des = 'هزینه'
rows.push({
id: item.id.id,
id: item.id,
bs: parseInt(item.amount),
bd: 0,
des: item.des,
@ -522,7 +673,7 @@ export default {
this.salarys.forEach((item) => {
if (item.des == '') item.des = 'هزینه'
rows.push({
id: item.id.id,
id: item.person,
bs: parseInt(item.amount),
bd: 0,
des: item.des,
@ -534,7 +685,7 @@ export default {
this.cashdesks.forEach((item) => {
if (item.des == '') item.des = 'هزینه'
rows.push({
id: item.id.id,
id: item.person,
bs: parseInt(item.amount),
bd: 0,
des: item.des,
@ -546,7 +697,7 @@ export default {
this.persons.forEach((item) => {
if (item.des == '') item.des = 'هزینه'
rows.push({
id: item.id.id,
id: item.person,
bs: parseInt(item.amount),
bd: 0,
des: item.des,

View file

@ -58,16 +58,16 @@
</v-list-item>
</v-list>
</v-menu>
<v-tooltip :text="$t('dialog.column_settings')" location="bottom">
<template v-slot:activator="{ props }">
<v-btn v-bind="props" icon="mdi-table-cog" color="primary" @click="dialogColumns = true" />
</template>
</v-tooltip>
<v-tooltip :text="$t('dialog.delete_group')" location="bottom">
<template v-slot:activator="{ props }">
<v-btn v-bind="props" icon="mdi-trash-can" color="red" @click="deleteGroup" />
</template>
</v-tooltip>
<v-tooltip :text="$t('dialog.column_settings')" location="bottom">
<template v-slot:activator="{ props }">
<v-btn v-bind="props" icon="mdi-table-cog" color="primary" @click="dialogColumns = true" />
</template>
</v-tooltip>
</v-toolbar>
<v-text-field :loading="loading" color="green" class="mb-0 pt-0 rounded-0" hide-details="auto" density="compact"