hesabixCore/webUI/src/views/acc/commodity/mod.vue
2025-07-20 13:18:37 +00:00

515 lines
22 KiB
Vue
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<v-toolbar color="toolbar" :title="$t('dialog.commodity_info')">
<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-btn :loading="loading" @click="save()" icon="" color="green">
<v-tooltip activator="parent" :text="$t('dialog.save')" location="bottom" />
<v-icon icon="mdi-content-save"></v-icon>
</v-btn>
<template v-slot:extension>
<v-tabs color="primary" class="bg-light" grow v-model="tabs">
<v-tab value="0">
{{ $t('dialog.general') }}
</v-tab>
<v-tab value="1">
{{ $t('dialog.prices') }}
</v-tab>
<v-tab value="2">
{{ $t('dialog.existly') }}
</v-tab>
<v-tab value="3">
{{ $t('dialog.tax') }}
</v-tab>
</v-tabs>
</template>
</v-toolbar>
<v-row class="pa-1">
<v-col>
<v-tabs-window v-model="tabs">
<v-tabs-window-item value="0">
<v-card>
<v-card-text>
<div class="row py-3">
<div class="col-sm-6 col-md-6 mb-1">
<div>
<label class="me-4 text-primary">نوع کالا یا خدمات</label>
<div class="form-check form-check-inline">
<input v-model="this.data.khadamat" class="form-check-input" type="radio" value="true">
<label class="form-check-label" for="inlineCheckbox1">خدمات</label>
</div>
<div class="form-check form-check-inline">
<input v-model="this.data.khadamat" class="form-check-input" type="radio" value="false">
<label class="form-check-label" for="inlineCheckbox2">کالا و اقلام فیزیکی</label>
</div>
</div>
</div>
<div class="col-sm-6 col-md-6 mb-1">
<div class="space-y-2">
<div class="form-check form-switch">
<input v-model="this.data.speedAccess" class="form-check-input" type="checkbox">
<label class="form-check-label">دسترسی سریع</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-6">
<div class="form-floating mb-4">
<input v-model="data.name" class="form-control" type="text">
<label class="form-label"><span class="text-danger">(لازم)</span> نام کالا/خدمات</label>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="form-floating mb-4">
<select v-model="data.unit" class="form-select">
<option v-for="option in units" :key="option.name" :value="option.name">
{{ option.name }}
</option>
</select>
<label class="form-label">واحد شمارش</label>
</div>
</div>
<div class="col-sm-12 col-md-12 mb-4">
<small class="mb-2">دسته بندی</small>
<select class="form-select" aria-label="دسته‌بندی" v-model="this.data.cat">
<option v-for="(item, index) in listCats" :value="item.id">{{ item.name }}</option>
</select>
</div>
<div class="col-sm-12 col-md-12 mb-4">
<v-dialog>
<template v-slot:activator="{ props: activatorProps }">
<v-btn v-bind="activatorProps" prepend-icon="mdi-wizard-hat" color="surface-variant"
:text="$t('dialog.barcodes_generate')" class="mb-2"></v-btn>
</template>
<template v-slot:default="{ isActive }">
<v-card :text="$t('dialog.barcodes_generate')">
<v-card-text>
<v-number-input :min="1" :max="400" v-model="barcode.count" :label="$t('dialog.count')"
prepend-inner-icon="mdi-barcode"></v-number-input>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn :text="$t('dialog.generate')" color="success" variant="flat"
@click="isActive.value = false; generateBarcode();"></v-btn>
<v-btn :text="$t('dialog.close')" color="secondary" variant="flat"
@click="isActive.value = false"></v-btn>
</v-card-actions>
</v-card>
</template>
</v-dialog>
<v-textarea class="text-left" v-model="data.barcodes" :label="$t('dialog.barcodes')"
:placeholder="$t('dialog.barcodes_info')" prepend-inner-icon="mdi-barcode"></v-textarea>
</div>
<div class="col-sm-12 col-md-12">
<div class="form-floating mb-4">
<input v-model="data.des" class="form-control" type="text">
<label class="form-label">توضیحات</label>
</div>
</div>
</div>
</v-card-text>
</v-card>
</v-tabs-window-item>
<v-tabs-window-item value="1">
<v-card>
<v-card-text>
<div class="row">
<div class="col-sm-12 col-md-6">
<div class="form-floating mb-4">
<money3 v-bind="currencyConfig" min=0 class="form-control" v-model="data.priceBuy" />
<label class="form-label">قیمت خرید</label>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="form-floating mb-4">
<money3 v-bind="currencyConfig" min=0 class="form-control" v-model="data.priceSell" />
<label class="form-label">قیمت فروش</label>
</div>
</div>
<div v-if="isPluginActive('accpro')" class="col-sm-12 col-md-6" v-for="price in data.prices">
<div class="form-floating mb-4">
<money3 v-bind="currencyConfig" min=0 class="form-control" v-model="price.priceSell" />
<label class="form-label">{{ price.list.label }}</label>
</div>
</div>
</div>
</v-card-text>
</v-card>
</v-tabs-window-item>
<v-tabs-window-item value="2">
<v-card>
<v-card-text>
<div class="col-sm-12 col-md-12">
<b class="text-primary-dark me-3">موجودی کالا</b>
<label class="text-muted">تنظیمات بخش موجودی کالا تنها برای نوع کالا اعمال می‌شود و برای نوع خدمات
نادیده
گرفته می‌شود.</label>
<div class="space-y-2">
<div class="form-check form-switch">
<input v-model="data.commodityCountCheck" class="form-check-input" type="checkbox">
<label class="form-check-label">کنترل موجودی</label>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-4 mt-2">
<div class="form-floating mb-4">
<input v-model="data.minOrderCount"
@blur="(event) => { if (this.data.minOrderCount === '' || this.data.minOrderCount === 0) { this.data.minOrderCount = 1 } }"
@keypress="this.$filters.onlyNumber($event)" class="form-control" type="number" min="1">
<label class="form-label">حداقل سفارش</label>
</div>
</div>
<div class="col-sm-12 col-md-4 mt-2">
<div class="form-floating mb-4">
<input v-model="data.orderPoint" @keypress="this.$filters.onlyNumber($event)" class="form-control"
type="number" min="1">
<label class="form-label">نقطه سفارش</label>
</div>
</div>
<div class="col-sm-12 col-md-4 mt-2">
<div class="form-floating mb-4">
<input v-model="data.dayLoading" @keypress="this.$filters.onlyNumber($event)" class="form-control"
type="number">
<label class="form-label">زمان انتظار(روز)</label>
</div>
</div>
</div>
</div>
</v-card-text>
</v-card>
</v-tabs-window-item>
<v-tabs-window-item value="3">
<v-card>
<v-card-text>
<div class="col-sm-6 col-md-6 mb-1">
<div class="space-y-2">
<div class="form-check form-switch">
<input v-model="this.data.withoutTax" class="form-check-input" type="checkbox">
<label class="form-check-label">معاف از مالیات</label>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-4">
<div class="form-floating mb-4">
<input v-model="data.taxCode" class="form-control" type="text">
<label class="form-label">کد مالیاتی</label>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="form-floating mb-4">
<select v-model="data.taxType" class="form-select">
<option value="" disabled selected>انتخاب کنید</option>
<option value="1">۱- دارو</option>
<option value="2">۲- دخانیات</option>
<option value="3">۳- موبایل</option>
<option value="4">۴- لوازم خانگی برقی</option>
<option value="5">۵- قطعات مصرفی و یدکی وسایل نقلیه</option>
<option value="6">۶- فراورده ها و مشتقات نفتی و گازی و پتروشیمیایی</option>
<option value="7">۷- طلا اعم از شمش ،مسکوکات و مصنوعات زینتی</option>
<option value="8">۸- منسوجات و پوشاک</option>
<option value="9">۹- اسباب بازی</option>
<option value="10">۱۰- دام زنده، گوشت سفید و قرمز</option>
<option value="11">۱۱- محصولات اساسی کشاورزی</option>
<option value="12">۱۲- سایر کالا ها</option>
</select>
<label class="form-label">نوع مالیاتی</label>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="form-floating mb-4">
<select v-model="data.taxUnit" class="form-select">
<option value="" disabled selected>انتخاب کنید</option>
<option value="1611">لنگه</option>
<option value="1612">عدل</option>
<option value="1613">جعبه</option>
<option value="1618">توپ</option>
<option value="1619">ست</option>
<option value="1620">دست</option>
<option value="1624">کارتن</option>
<option value="1627">عدد</option>
<option value="1628">بسته</option>
<option value="1629">پاکت</option>
<option value="1631">دستگاه</option>
<option value="1640">تخته</option>
<option value="1641">رول</option>
<option value="1642">طاقه</option>
<option value="1643">جفت</option>
<option value="1645">مترمربع</option>
<option value="1649">پالت</option>
<option value="1661">دوجین</option>
<option value="1668">رینگ حلقه</option>
<option value="1673">قراص</option>
<option value="1694">قراصه bundle</option>
<option value="1637">لیتر</option>
<option value="1650">ساشه</option>
<option value="1683">کپسول</option>
<option value="1656">بندیل</option>
<option value="1630">رول حلقه</option>
<option value="163">قالب</option>
<option value="1660">شانه</option>
<option value="1647">مترمکعب</option>
<option value="1689">ثوب</option>
<option value="1690">نیم دو جین</option>
<option value="1635">قرقره</option>
<option value="164">کیلوگرم</option>
<option value="1638">بطری</option>
<option value="161">برگ</option>
<option value="1625">سطل</option>
<option value="1654">ورق</option>
<option value="1646">شاخه</option>
<option value="1644">قوطی</option>
<option value="1617">جلد</option>
<option value="162">تیوب</option>
<option value="165">متر</option>
<option value="1610">کلاف</option>
<option value="1615">کیسه</option>
<option value="1680">طغرا</option>
<option value="1639">بشکه</option>
<option value="1614">گالن</option>
<option value="1687">فاقد بسته بندی</option>
<option value="1693">کارتن master case</option>
<option value="166">صفحه</option>
<option value="1666">مخزن</option>
<option value="1626">تانکر</option>
<option value="1648">دبه</option>
<option value="1684">سبد</option>
<option value="169">تن</option>
<option value="1651">بانکه</option>
<option value="1633">سیلندر</option>
<option value="1679">فوت مربع</option>
<option value="168">حلب</option>
<option value="1665">شیت</option>
<option value="1659">چلیک</option>
<option value="1636">جام</option>
<option value="1622">گرم</option>
<option value="1616">نخ</option>
<option value="1652">شعله</option>
<option value="1678">قیراط</option>
<option value="16100">میلی لیتر</option>
<option value="16101">میلی متر</option>
<option value="16102">میلی گرم</option>
<option value="16103">ساعت</option>
<option value="16104">روز</option>
<option value="16105">تن کیلومتر</option>
<option value="1669">کیلووات ساعت</option>
<option value="1676">نفر</option>
<option value="16110">ثانیه</option>
<option value="16111">دقیقه</option>
<option value="16112">ماه</option>
<option value="16113">سال</option>
<option value="16114">قطعه</option>
<option value="16115">سانتی متر</option>
<option value="16116">سانتی متر مربع</option>
<option value="1632">فروند</option>
<option value="1653">واحد</option>
<option value="16108">لیوان</option>
<option value="16117">نوبت</option>
<option value="16118">مگا وات ساعت</option>
<option value="16119">گیگا بایت بر ثانیه</option>
<option value="1681">ویال</option>
<option value="1667">حلقه (دیسک)</option>
<option value="16120">نسخه (جلد)</option>
<option value="16121">نفر-ساعت</option>
<option value="16122">کیلومتر</option>
<option value="16125">آمپر</option>
<option value="16126">میلی آمپر</option>
<option value="16127">مثقال</option>
<option value="16128">سیر</option>
<option value="16129">دفعه (time)</option>
<option value="16130">مگایونیت</option>
<option value="16131">کادر</option>
<option value="16132">پرس</option>
<option value="16133">بلوک</option>
<option value="16134">نفر-ماه</option>
</select>
<label class="form-label">واحد مالیاتی</label>
</div>
</div>
</div>
</v-card-text>
</v-card>
</v-tabs-window-item>
</v-tabs-window>
</v-col>
</v-row>
</template>
<script>
import axios from "axios";
import Swal from "sweetalert2";
import Loading from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/css/index.css';
import { Money3 } from "v-money3";
import Treeselect from 'vue3-treeselect'
// import the styles
import 'vue3-treeselect/dist/vue3-treeselect.css'
export default {
name: "mod",
components: {
Treeselect: Treeselect,
Loading,
Money3
},
data: () => {
return {
tabs: 0,
loading: false,
plugins: [],
units: '',
barcode: {
count: 1,
},
priceList: [],
data: {
name: '',
priceSell: 0,
priceBuy: 0,
des: '',
unit: 'عدد',
code: 0,
khadamat: false,
cat: null,
orderPoint: 0,
commodityCountCheck: false,
minOrderCount: 1,
dayLoading: 0,
speedAccess: false,
withoutTax: false,
barcodes: '',
prices: [],
taxCode: '',
taxType: '',
taxUnit: ''
},
listCats: [],
currencyConfig: {
masked: false,
prefix: '',
suffix: 'ریال',
thousands: ',',
decimal: '.',
precision: 0,
disableNegative: false,
disabled: false,
min: 0,
max: null,
allowBlank: false,
minimumNumberOfCharacters: 0,
shouldRound: true,
focusOnRight: false,
},
}
},
mounted() {
this.loadData(this.$route.params.id);
},
beforeRouteUpdate(to, from) {
this.loadData(to.params.id);
},
methods: {
generateBarcode() {
for (let index = 0; index < this.barcode.count; index++) {
let x = Math.random() * 1000000000000000000;
this.data.barcodes = this.data.barcodes + ';' + x
}
},
isPluginActive(plugName) {
return this.plugins[plugName] !== undefined;
},
loadData(id = '') {
this.loading = true;
//get active plugins
axios.post('/api/plugin/get/actives',).then((response) => {
this.plugins = response.data;
});
axios.post('/api/commodity/units').then((response) => {
this.units = response.data;
});
if (id == '') {
axios.post('/api/commodity/pricelist/list').then((response) => {
if (response.data.length == 0) {
this.data.prices = [];
}
else {
this.priceList = response.data;
this.priceList.forEach((item) => {
this.data.prices.push({
id: 0,
priceBuy: 0,
priceSell: 0,
list: item
});
});
}
});
}
axios.post('/api/commodity/cat/get/line').then((response) => {
this.listCats = response.data;
if (!this.$route.params.id) {
this.data.cat = response.data[1]
}
});
if (id != '') {
//load info
this.loading = true;
axios.post('/api/commodity/info/' + id).then((response) => {
this.data = response.data;
if (this.data.prices.length == 0) {
this.data.prices = this.priceList;
}
});
}
this.loading = false;
},
save() {
if (this.data.name.length === 0)
Swal.fire({
text: 'نام کالا یا خدمات الزامی است.',
icon: 'error',
confirmButtonText: 'قبول'
});
else {
this.loading = true;
axios.post('/api/commodity/mod/' + this.data.code, this.data).then((response) => {
this.loading = false;
if (response.data.result == 2) {
Swal.fire({
text: 'قبلا ثبت شده است.',
icon: 'error',
confirmButtonText: 'قبول'
});
} else {
Swal.fire({
text: 'مشخصات کالا و خدمات ثبت شد.',
icon: 'success',
confirmButtonText: 'قبول'
}).then(() => {
this.$router.push('/acc/commodity/list')
});
}
})
}
}
}
}
</script>
<style scoped></style>