1103 lines
39 KiB
Vue
1103 lines
39 KiB
Vue
<template>
|
|
<user-dashboard-container page-class="agent-reports" panel-title="گزارش گیری">
|
|
<div class="filter mb-5">
|
|
<div class="mb-3">
|
|
<h4>تهیه گزارش از:</h4>
|
|
</div>
|
|
<div class="reportTypes">
|
|
<button class="switchBtns btn" :class="type === 'inbox' && 'btn-primary'" @click="type = 'inbox'">
|
|
صندوق ورودی گارانتی
|
|
</button>
|
|
<button class="switchBtns btn" :class="type === 'pr' && 'btn-primary'" @click="type = 'pr'">
|
|
درخواست های قطعه
|
|
</button>
|
|
<button class="switchBtns btn" :class="type === 'opr' && 'btn-primary'" @click="type = 'opr'">
|
|
درخواست های قطعه داغی
|
|
</button>
|
|
<button class="switchBtns btn" :class="type === 'br' && 'btn-primary'" @click="type = 'br'">
|
|
درخواست های کالای بافر
|
|
</button>
|
|
<button class="switchBtns btn" :class="type === 'gr' && 'btn-primary'" @click="type = 'gr'">
|
|
گزارش های عملکرد گارانتی
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="type" v-loading="fetchingData" class="reportOptions">
|
|
<el-form :model="reportParams" :class="type">
|
|
<div class="seprator">
|
|
<p>فیلتر مربوط به فرم ها</p>
|
|
</div>
|
|
|
|
<el-form-item label="از تاریخ (تاریخ ارسال فرم)" class="fromDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.fromDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="تا تاریخ (تاریخ ارسال فرم)" class="toDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.toDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
:min="reportParams.fromDate"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
@change="validateDateRange('toDate')"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item v-if="type !== 'gr'" label="وضعیت فرم" class="formStatus">
|
|
<el-select v-model="reportParams.formStatus" filterable clearable style="width: 100%" placeholder="اختیاری">
|
|
<template v-if="type === 'inbox'">
|
|
<el-option value="saved" label="دریافتی"></el-option>
|
|
<el-option value="recieved" label="پذیرش شده"></el-option>
|
|
</template>
|
|
<template v-else>
|
|
<el-option value="sent" label="ارسال شده"></el-option>
|
|
</template>
|
|
<el-option value="ongoing" label="در دست اقدام"></el-option>
|
|
<el-option value="waiting" label="در انتظار قطعه"></el-option>
|
|
<el-option value="delivered" label="تحویل شده"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<div class="seprator">
|
|
<p>فیلتر مربوط به آیتم ها</p>
|
|
</div>
|
|
<el-form-item label="نام کالا" class="selectedItem">
|
|
<el-select v-model="selectedItem" filterable clearable style="width: 100%" placeholder="اختیاری">
|
|
<el-option-group label="لوازم جانبی کامپیوتر و موبایل">
|
|
<el-option
|
|
v-for="item in verityProducts"
|
|
:key="item.ItemID + '_V'"
|
|
:value="item.ItemID + '__v'"
|
|
:label="item.ItemName"
|
|
></el-option>
|
|
</el-option-group>
|
|
|
|
<el-option-group label="لوازم صوتی و تصویری خودرو">
|
|
<el-option
|
|
v-for="item in panatechProducts"
|
|
:key="item.ItemID + '_P'"
|
|
:value="item.ItemID + '__p'"
|
|
:label="item.ItemName"
|
|
></el-option>
|
|
</el-option-group>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item v-if="type === 'pr'" label="وضعیت گارانتی" class="gStatus">
|
|
<el-select v-model="reportParams.gStatus" style="width: 100%" clearable placeholder="اختیاری">
|
|
<el-option :value="true" label="دارد"></el-option>
|
|
<el-option :value="false" label="ندارد"></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item v-if="type === 'pr' || type === 'opr'" label="نام قطعه" class="pieceId">
|
|
<el-select v-model="reportParams.pieceId" filterable clearable style="width: 100%" placeholder="اختیاری">
|
|
<el-option
|
|
v-for="item in pieces"
|
|
:key="item._id"
|
|
:value="item._id"
|
|
:label="item.name + ` ( کد: ${item.code} ) `"
|
|
></el-option>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<template v-if="type === 'pr' || type === 'opr'">
|
|
<el-form-item label="از تاریخ (تاریخ پذیرش کالا)" class="fromItemReceptionTransDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.fromItemReceptionTransDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="تا تاریخ (تاریخ پذیرش کالا)" class="toItemReceptionTransDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.toItemReceptionTransDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
:min="reportParams.fromItemReceptionTransDate"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
@change="validateDateRange('toItemReceptionTransDate')"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
</template>
|
|
|
|
<template v-if="type === 'gr'">
|
|
<el-form-item label="از تاریخ (تاریخ دریافت از مشتری)" class="fromRecieveDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.fromRecieveDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="تا تاریخ (تاریخ دریافت از مشتری)" class="toRecieveDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.toRecieveDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
:min="reportParams.fromRecieveDate"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
@change="validateDateRange('toRecieveDate')"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="از تاریخ (تاریخ تحویل به مشتری)" class="fromDeliverDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.fromDeliverDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="تا تاریخ (تاریخ تحویل به مشتری)" class="toDeliverDate">
|
|
<div class="datePickerWrapper">
|
|
<persian-date-picker
|
|
v-model="reportParams.toDeliverDate"
|
|
display-format="jYYYY/jMM/jDD"
|
|
:min="reportParams.fromDeliverDate"
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
placeholder="اختیاری"
|
|
color="#065495"
|
|
clearable
|
|
append-to="body"
|
|
@change="validateDateRange('toDeliverDate')"
|
|
/>
|
|
</div>
|
|
</el-form-item>
|
|
</template>
|
|
</el-form>
|
|
|
|
<div v-if="type" class="btnRow">
|
|
<el-button class="btn btn-primary custom-el-button" :loading="reporting" @click="getReport"
|
|
>تهیه گزارش</el-button
|
|
>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="reportIsReady" class="reportResult mt-5">
|
|
<el-divider></el-divider>
|
|
<div class="infoCharts mb-5 mt-3">
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<!-- forms -->
|
|
<div class="col-6">
|
|
<CChartDoughnut :datasets="formsChartData.datasets" :labels="formsChartData.labels" />
|
|
<div class="mt-3">
|
|
<p>
|
|
<span>تعداد کل فرم ها:</span>
|
|
<b>{{ result.totalFormsCount }}</b>
|
|
</p>
|
|
<p>
|
|
<span>تعداد فرم های فیلتر شده:</span>
|
|
<b>{{ result.filteredFormsCount }}</b>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<!-- items -->
|
|
<div class="col-6">
|
|
<CChartDoughnut :datasets="itemsChartData.datasets" :labels="itemsChartData.labels" />
|
|
<div class="mt-3">
|
|
<p>
|
|
<span>تعداد کل آیتم های داخل فرم ها:</span>
|
|
<b>{{ result.totalItemsCount }}</b>
|
|
</p>
|
|
<p>
|
|
<span>تعداد آیتم های فیلتر شده داخل فرم ها:</span>
|
|
<b>{{ result.filteredItemsCount }}</b>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="resultList">
|
|
<el-divider></el-divider>
|
|
<div class="filter mb-5">
|
|
<h4 style="display: inline-block; margin-left: 15px">مشاهده لیست:</h4>
|
|
<button class="switchBtns btn" :class="result.mode === 'item' && 'btn-primary'" @click="result.mode = 'item'">
|
|
آیتم ها
|
|
</button>
|
|
<button class="switchBtns btn" :class="result.mode === 'form' && 'btn-primary'" @click="result.mode = 'form'">
|
|
فرم ها
|
|
</button>
|
|
</div>
|
|
|
|
<el-table v-if="result.mode === 'form'" key="ffsTable" :data="result.ffs" :lazy="true" style="width: 100%">
|
|
<el-table-column type="index" label="#"> </el-table-column>
|
|
|
|
<template v-if="type === 'inbox'">
|
|
<el-table-column prop="Description" label="توضیحات" width="">
|
|
<template slot-scope="scope">
|
|
<span class="singleLineTxt" :title="scope.row.Description"> {{ scope.row.Description || '-' }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column
|
|
prop="TempReceiptTransNumber"
|
|
label="شماره پذیرش موقت"
|
|
width=""
|
|
align="center"
|
|
></el-table-column>
|
|
|
|
<el-table-column prop="ItemReceptionTransNumber" label="شماره پذیرش دائم" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span> {{ scope.row.ItemReceptionTransNumber || '-' }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="TempReceiptTransDate" label="تاریخ ارسال فرم" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span> {{ $jDate(scope.row.TempReceiptTransDate) }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="ItemReceptionTransDate" label="تاریخ پذیرش" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span> {{ $jDate(scope.row.ItemReceptionTransDate) }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="db_name" label="برند" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<i
|
|
v-if="scope.row.db_name === 'verity'"
|
|
class="fas fa-phone-laptop"
|
|
title="لوازم جانبی کامپیوتر و موبایل"
|
|
></i>
|
|
<i
|
|
v-if="scope.row.db_name === 'panatech'"
|
|
class="fas fa-photo-video"
|
|
title="لوازم صوتی و تصویری خودرو"
|
|
></i>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="status" label="وضعیت" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.status === 'saved'">دریافتی</span>
|
|
<span v-if="scope.row.status === 'recieved'">پذیرش شده</span>
|
|
<span v-if="scope.row.status === 'ongoing'">در دست اقدام</span>
|
|
<span v-if="scope.row.status === 'waiting'">در انتظار قطعه</span>
|
|
<span v-if="scope.row.status === 'delivered'">تحویل شده</span>
|
|
</template>
|
|
</el-table-column>
|
|
</template>
|
|
|
|
<template v-else>
|
|
<el-table-column prop="description" label="توضیحات" width="">
|
|
<template slot-scope="scope">
|
|
<span class="singleLineTxt"> {{ scope.row.description || '-' }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="trackingCode" label="کد پیگیری" width="" align="center"> </el-table-column>
|
|
<el-table-column prop="sendDate" label="کد پیگیری" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span>{{ scope.row.trackingCode }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="sendDate" label="تاریخ ارسال" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span>{{ $jDate(scope.row.sendDate) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="status" label="وضعیت" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.status === 'sent'">ارسال شده</span>
|
|
<span v-if="scope.row.status === 'ongoing'">در دست اقدام</span>
|
|
<span v-if="scope.row.status === 'waiting'">در انتظار قطعه</span>
|
|
<span v-if="scope.row.status === 'delivered'">تحویل شده</span>
|
|
</template>
|
|
</el-table-column>
|
|
</template>
|
|
|
|
<el-table-column label="اطلاعات" width="70" align="center">
|
|
<template slot-scope="scope">
|
|
<nuxt-link :to="formViewLink(type === 'inbox' ? scope.row : scope.row._id)" target="_blank">
|
|
<button class="showDetailsBtn" title="مشاهده فرم">
|
|
<i class="fas fa-info"></i>
|
|
</button>
|
|
</nuxt-link>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<!-- item table -->
|
|
<el-table
|
|
v-if="result.mode === 'item'"
|
|
key="itemsListTable"
|
|
:data="result.list"
|
|
:lazy="true"
|
|
style="width: 100%"
|
|
>
|
|
<el-table-column type="index" label="#"> </el-table-column>
|
|
|
|
<template v-if="type === 'inbox'">
|
|
<el-table-column prop="ItemName" label="نام کالا" width="">
|
|
<template slot-scope="scope">
|
|
<span> {{ getItemName(scope.row.ItemID, scope.row.db_name) }} </span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="MjQty" label="تعداد" width=""> </el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type !== 'inbox'">
|
|
<el-table-column prop="ItemName" label="نام کالا" width="450px"></el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type === 'br'">
|
|
<el-table-column prop="bufferQuantity" label="تعداد" width="" align="center"> </el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type === 'pr'">
|
|
<el-table-column prop="gStatus" label="وضعیت گارانتی" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span v-if="scope.row.gStatus">دارد</span>
|
|
<span v-else>ندارد</span>
|
|
</template>
|
|
</el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type === 'pr' || type === 'opr'">
|
|
<el-table-column prop="ItemReceptionTransDate" label="تاریخ پذیرش" width="">
|
|
<template slot-scope="scope">
|
|
<span>{{ $jDate(scope.row.ItemReceptionTransDate) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="pieceName" label="نام قطعه" width="" align="center"> </el-table-column>
|
|
<el-table-column prop="pieceCode" label="کد قطعه" width="" align="center"> </el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type === 'pr'">
|
|
<el-table-column prop="pieceQuantity" label="تعداد قطعه" width="" align="center"> </el-table-column>
|
|
</template>
|
|
|
|
<template v-if="type === 'gr'">
|
|
<el-table-column prop="recieveDate" label="تاریخ دریافت" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span>{{ $jDate(scope.row.recieveDate) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="deliverDate" label="تاریخ تحویل" width="" align="center">
|
|
<template slot-scope="scope">
|
|
<span>{{ $jDate(scope.row.deliverDate) }}</span>
|
|
</template>
|
|
</el-table-column>
|
|
</template>
|
|
|
|
<el-table-column label="اطلاعات" width="70" align="center">
|
|
<template slot-scope="scope">
|
|
<nuxt-link :to="formViewLink(type === 'inbox' ? scope.row : scope.row.formId)" target="_blank">
|
|
<button class="showDetailsBtn" title="مشاهده فرم مربوطه">
|
|
<i class="fas fa-info"></i>
|
|
</button>
|
|
</nuxt-link>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</div>
|
|
</div>
|
|
</user-dashboard-container>
|
|
</template>
|
|
|
|
<script>
|
|
import moment from 'moment-jalaali'
|
|
export default {
|
|
name: 'AccountAgentReports',
|
|
layout: 'user',
|
|
data() {
|
|
return {
|
|
type: '',
|
|
reporting: false,
|
|
reportIsReady: false,
|
|
fetchingData: false,
|
|
rawData: [],
|
|
pieces: [],
|
|
result: {
|
|
mode: 'item',
|
|
list: [],
|
|
ffs: [],
|
|
totalFormsCount: 0,
|
|
filteredFormsCount: 0,
|
|
totalItemsCount: 0,
|
|
filteredItemsCount: 0
|
|
},
|
|
selectedItem: '',
|
|
reportParams: {
|
|
// form filters
|
|
fromDate: '',
|
|
toDate: '',
|
|
formStatus: '',
|
|
|
|
// items filters
|
|
ItemID: '',
|
|
ItemCode: '',
|
|
pieceId: '',
|
|
gStatus: '',
|
|
|
|
// pr | opr
|
|
fromItemReceptionTransDate: '',
|
|
toItemReceptionTransDate: '',
|
|
|
|
// gr
|
|
fromRecieveDate: '',
|
|
toRecieveDate: '',
|
|
fromDeliverDate: '',
|
|
toDeliverDate: ''
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
formsChartData() {
|
|
const totalFormsLabel = 'کل فرم ها'
|
|
const filteredFormsLabel = 'فرم های فیلتر شده'
|
|
|
|
const totalFormsPercentage = 100
|
|
const filteredFormsPercentage = Number(
|
|
((this.result.filteredFormsCount * 100) / this.result.totalFormsCount).toFixed(2)
|
|
)
|
|
return {
|
|
labels: [totalFormsLabel, filteredFormsLabel],
|
|
datasets: [
|
|
{
|
|
backgroundColor: ['#4e80a9', '#79aeba'],
|
|
data: [totalFormsPercentage - filteredFormsPercentage, filteredFormsPercentage]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
itemsChartData() {
|
|
const totalFormsLabel = 'کل آیتم ها'
|
|
const filteredFormsLabel = 'آیتم های فیلتر شده'
|
|
|
|
const totalItemsPercentage = 100
|
|
const filteredItemsPercentage = Number(
|
|
((this.result.filteredItemsCount * 100) / this.result.totalItemsCount).toFixed(2)
|
|
)
|
|
return {
|
|
labels: [totalFormsLabel, filteredFormsLabel],
|
|
datasets: [
|
|
{
|
|
backgroundColor: ['#4e80a9', '#79aeba'],
|
|
data: [totalItemsPercentage - filteredItemsPercentage, filteredItemsPercentage]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
verityProducts() {
|
|
return this.$store.state.front.verityProducts
|
|
},
|
|
panatechProducts() {
|
|
return this.$store.state.front.panatechProducts
|
|
},
|
|
/// ///// 'from' range dates for watch and reset 'to' dates
|
|
fromDate() {
|
|
return this.reportParams.fromDate
|
|
},
|
|
fromItemReceptionTransDate() {
|
|
return this.reportParams.fromItemReceptionTransDate
|
|
},
|
|
fromRecieveDate() {
|
|
return this.reportParams.fromRecieveDate
|
|
},
|
|
fromDeliverDate() {
|
|
return this.reportParams.fromDeliverDate
|
|
}
|
|
},
|
|
watch: {
|
|
async type(newVal, oldVal) {
|
|
try {
|
|
// change states
|
|
this.fetchingData = true
|
|
// reset report params
|
|
this.reportParams.fromDate = ''
|
|
this.reportParams.toDate = ''
|
|
this.reportParams.formStatus = ''
|
|
|
|
this.reportParams.ItemID = ''
|
|
this.reportParams.ItemCode = ''
|
|
this.reportParams.pieceId = ''
|
|
this.reportParams.gStatus = ''
|
|
|
|
this.reportParams.fromItemReceptionTransDate = ''
|
|
this.reportParams.toItemReceptionTransDate = ''
|
|
this.reportParams.fromRecieveDate = ''
|
|
this.reportParams.toRecieveDate = ''
|
|
this.reportParams.fromDeliverDate = ''
|
|
this.reportParams.toDeliverDate = ''
|
|
|
|
// reset results
|
|
this.reportIsReady = false
|
|
this.result.mode = 'item'
|
|
this.result.list = []
|
|
this.result.ffs = []
|
|
this.result.totalFormsCount = 0
|
|
this.result.filteredFormsCount = 0
|
|
this.result.totalItemsCount = 0
|
|
this.result.filteredItemsCount = 0
|
|
|
|
// fetch data
|
|
if (newVal === 'inbox') {
|
|
const transactions = await this.$axios.get('/api/agent/inbox')
|
|
this.rawData = transactions.data
|
|
}
|
|
if (newVal === 'pr') {
|
|
const pieceRequests = await this.$axios.get('/api/agent/prList')
|
|
const sentForms = []
|
|
for await (const item of pieceRequests.data) {
|
|
if (item.status !== 'temp') sentForms.push(item)
|
|
}
|
|
this.rawData = sentForms
|
|
}
|
|
if (newVal === 'opr') {
|
|
const oldPieceRequests = await this.$axios.get('/api/agent/oprList')
|
|
const sentForms = []
|
|
for await (const item of oldPieceRequests.data) {
|
|
if (item.status !== 'temp') sentForms.push(item)
|
|
}
|
|
this.rawData = sentForms
|
|
}
|
|
if (newVal === 'br') {
|
|
const bufferRequests = await this.$axios.get('/api/agent/brList')
|
|
const sentForms = []
|
|
for await (const item of bufferRequests.data) {
|
|
if (item.status !== 'temp') sentForms.push(item)
|
|
}
|
|
this.rawData = sentForms
|
|
}
|
|
if (newVal === 'gr') {
|
|
const guaranteeReports = await this.$axios.get('/api/agent/grList')
|
|
const sentForms = []
|
|
for await (const item of guaranteeReports.data) {
|
|
if (item.status !== 'temp') sentForms.push(item)
|
|
}
|
|
this.rawData = sentForms
|
|
}
|
|
this.fetchingData = false
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
},
|
|
selectedItem() {
|
|
const selectedItem = this.selectedItem
|
|
let ItemID, db_name
|
|
if (selectedItem.includes('__v')) {
|
|
ItemID = selectedItem.replace('__v', '')
|
|
db_name = 'verity'
|
|
} else if (selectedItem.includes('__p')) {
|
|
ItemID = selectedItem.replace('__p', '')
|
|
db_name = 'panatech'
|
|
} else {
|
|
this.reportParams.ItemID = ''
|
|
this.reportParams.ItemCode = ''
|
|
return
|
|
}
|
|
|
|
// find product
|
|
let products
|
|
if (db_name === 'verity') products = this.verityProducts
|
|
if (db_name === 'panatech') products = this.panatechProducts
|
|
|
|
const item = products.find(item => item.ItemID === ItemID)
|
|
this.reportParams.ItemID = item?.ItemID
|
|
this.reportParams.ItemCode = item?.ItemCode
|
|
},
|
|
/// /// watch these to reset 'to' patam
|
|
fromDate() {
|
|
this.reportParams.toDate = ''
|
|
},
|
|
fromItemReceptionTransDate() {
|
|
this.reportParams.toItemReceptionTransDate = ''
|
|
},
|
|
fromRecieveDate() {
|
|
this.reportParams.toRecieveDate = ''
|
|
},
|
|
fromDeliverDate() {
|
|
this.reportParams.toDeliverDate = ''
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$axios
|
|
.get('/api/agent/pieces')
|
|
.then(res => {
|
|
this.fetchingPieces = false
|
|
this.pieces = res.data
|
|
})
|
|
.catch(err => {
|
|
console.log(err)
|
|
})
|
|
},
|
|
methods: {
|
|
getItemName(ItemID, db_name) {
|
|
let products
|
|
if (db_name === 'verity') products = this.verityProducts
|
|
if (db_name === 'panatech') products = this.panatechProducts
|
|
return products.find(item => item.ItemID === ItemID)?.ItemName
|
|
},
|
|
async getReport() {
|
|
try {
|
|
this.reporting = true
|
|
this.reportIsReady = false
|
|
|
|
// converts date to timeStamp
|
|
async function timeStamp(date) {
|
|
try {
|
|
return Number(await moment(date).format('x'))
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
}
|
|
|
|
// report params reference
|
|
const rep = this.reportParams
|
|
|
|
/// ///////////////// filter date ranges
|
|
// form date ranges
|
|
const fromDate = await timeStamp(rep.fromDate)
|
|
const toDate = (await timeStamp(rep.toDate)) + 1000 * 60 * 60 * 24
|
|
|
|
// trnx item date ranges
|
|
const fromRTRXDate = await timeStamp(rep.fromItemReceptionTransDate)
|
|
const toRTRXDate = (await timeStamp(rep.toItemReceptionTransDate)) + 1000 * 60 * 60 * 24
|
|
|
|
// gr item date ranges
|
|
const fromGrR_Date = await timeStamp(rep.fromRecieveDate)
|
|
const toGrR_Date = (await timeStamp(rep.toRecieveDate)) + 1000 * 60 * 60 * 24
|
|
|
|
const fromGrD_Date = await timeStamp(rep.fromDeliverDate)
|
|
const toGrD_Date = (await timeStamp(rep.toDeliverDate)) + 1000 * 60 * 60 * 24
|
|
|
|
// filtered forms & items at the beginning
|
|
let filteredForms = this.rawData
|
|
let formFilteredItems = []
|
|
|
|
// calculate total forms & items counts
|
|
this.result.totalFormsCount = this.rawData.length
|
|
let totalItemsCount = 0
|
|
for await (const _form of this.rawData) {
|
|
/* eslint-disable-next-line no-unused-vars */
|
|
for await (const item of _form.items) {
|
|
totalItemsCount++
|
|
}
|
|
}
|
|
this.result.totalItemsCount = totalItemsCount
|
|
|
|
// filtered forms count
|
|
const FFS = new Set()
|
|
|
|
/// ////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// ///////////////////////////////////// forms
|
|
// filter forms by transaction status
|
|
if (rep.formStatus) {
|
|
const temp = [...filteredForms]
|
|
filteredForms = []
|
|
for await (const item of temp) {
|
|
if (item.status === rep.formStatus) filteredForms.push(item)
|
|
}
|
|
}
|
|
|
|
// filter forms grater than fromDate
|
|
if (rep.fromDate) {
|
|
const temp = [...filteredForms]
|
|
filteredForms = []
|
|
for await (const item of temp) {
|
|
const sendDate = this.type === 'inbox' ? item.TempReceiptTransDate : item.sendDate
|
|
if ((await timeStamp(sendDate)) >= fromDate) filteredForms.push(item)
|
|
}
|
|
}
|
|
|
|
// filter forms less than toDate
|
|
if (rep.toDate) {
|
|
const temp = [...filteredForms]
|
|
filteredForms = []
|
|
for await (const item of temp) {
|
|
const sendDate = this.type === 'inbox' ? item.TempReceiptTransDate : item.sendDate
|
|
if ((await timeStamp(sendDate)) < toDate) filteredForms.push(item)
|
|
}
|
|
}
|
|
|
|
/// ///////////////////////////////////// items
|
|
/// ////////// generate report for inbox
|
|
if (this.type === 'inbox') {
|
|
/// ///////////////// items in forms
|
|
// create array of individual items from all filtered forms
|
|
for await (const trsx of filteredForms) {
|
|
FFS.add(trsx._id)
|
|
for await (const item of trsx.items) {
|
|
formFilteredItems.push({
|
|
ItemID: item.ItemID,
|
|
ItemCode: item.ItemCode,
|
|
MjQty: item.MjQty,
|
|
db_name: trsx.db_name,
|
|
tid: trsx._id,
|
|
ttn: trsx.TempReceiptTransNumber,
|
|
atn: trsx.ItemReceptionTransNumber
|
|
})
|
|
}
|
|
}
|
|
|
|
// filter items array by selectedItem
|
|
if (rep.ItemID && rep.ItemCode) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if (item.ItemID === rep.ItemID && item.ItemCode === rep.ItemCode) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.tid)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// ////////// genereate report for others
|
|
else {
|
|
/// ///////////////// items in forms
|
|
// create array of individual items from all filtered forms
|
|
for await (const form of filteredForms) {
|
|
FFS.add(form._id)
|
|
for await (const item of form.items) {
|
|
const data = {
|
|
ItemName: item.ItemName,
|
|
ItemID: item.ItemID,
|
|
ItemCode: item.ItemCode,
|
|
formId: form._id
|
|
}
|
|
if (this.type === 'pr' || this.type === 'opr') {
|
|
data.pieceName = item.pieceName
|
|
data.pieceCode = item.pieceCode
|
|
data.pieceQuantity = item.pieceQuantity
|
|
data.pieceId = item.pieceId
|
|
data.ItemReceptionTransDate = item.ItemReceptionTransDate
|
|
}
|
|
if (this.type === 'pr') {
|
|
data.gStatus = item.gStatus
|
|
}
|
|
if (this.type === 'br') {
|
|
data.bufferQuantity = item.bufferQuantity
|
|
}
|
|
if (this.type === 'gr') {
|
|
data.recieveDate = item.recieveDate
|
|
data.deliverDate = item.deliverDate
|
|
}
|
|
|
|
formFilteredItems.push(data)
|
|
}
|
|
}
|
|
|
|
// filter items array by selectedItem
|
|
if (rep.ItemID && rep.ItemCode) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if (item.ItemID === rep.ItemID && item.ItemCode === rep.ItemCode) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected piece
|
|
if (rep.pieceId) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if (item.pieceId === rep.pieceId) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected item gStatus
|
|
if (rep.gStatus !== '') {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if (item.gStatus === rep.gStatus) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected fromItemReceptionTransDate
|
|
if (rep.fromItemReceptionTransDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.ItemReceptionTransDate)) >= fromRTRXDate) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected toItemReceptionTransDate
|
|
if (rep.toItemReceptionTransDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.ItemReceptionTransDate)) < toRTRXDate) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected fromRecieveDate
|
|
if (rep.fromRecieveDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.recieveDate)) >= fromGrR_Date) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected toRecieveDate
|
|
if (rep.toRecieveDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.recieveDate)) < toGrR_Date) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected fromDeliverDate
|
|
if (rep.fromDeliverDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.deliverDate)) >= fromGrD_Date) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter items array by selected toDeliverDate
|
|
if (rep.toDeliverDate) {
|
|
const temp = [...formFilteredItems]
|
|
formFilteredItems = []
|
|
FFS.clear()
|
|
for await (const item of temp) {
|
|
if ((await timeStamp(item.deliverDate)) < toGrD_Date) {
|
|
formFilteredItems.push(item)
|
|
FFS.add(item.formId)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// filter forms by IDs in FFS
|
|
const ffsDetails = [...filteredForms]
|
|
filteredForms = []
|
|
for await (const _form of ffsDetails) {
|
|
if (FFS.has(_form._id)) filteredForms.push(_form)
|
|
}
|
|
|
|
/// ////////////////////////////////////////////////////////////////////////////////////
|
|
this.result.filteredFormsCount = FFS.size
|
|
this.result.filteredItemsCount = formFilteredItems.length
|
|
this.result.list = formFilteredItems
|
|
this.result.ffs = filteredForms
|
|
this.reporting = false
|
|
this.reportIsReady = true
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
},
|
|
formViewLink(id) {
|
|
if (this.type === 'inbox') {
|
|
if (this.result.mode === 'item') {
|
|
return {
|
|
name: 'account-agents-inbox-view',
|
|
query: {
|
|
tid: id.tid,
|
|
ttn: id.ttn,
|
|
atn: id.atn || undefined,
|
|
db_name: id.db_name
|
|
}
|
|
}
|
|
}
|
|
if (this.result.mode === 'form') {
|
|
return {
|
|
name: 'account-agents-inbox-view',
|
|
query: {
|
|
tid: id._id,
|
|
ttn: id.TempReceiptTransNumber,
|
|
atn: id.ItemReceptionTransNumber || undefined,
|
|
db_name: id.db_name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.type === 'pr') {
|
|
return {
|
|
name: 'account-agents-pieces-pr',
|
|
params: {
|
|
pr: id
|
|
}
|
|
}
|
|
}
|
|
if (this.type === 'opr') {
|
|
return {
|
|
name: 'account-agents-ops-op',
|
|
params: {
|
|
op: id
|
|
}
|
|
}
|
|
}
|
|
if (this.type === 'br') {
|
|
return {
|
|
name: 'account-agents-buffer-br',
|
|
params: {
|
|
br: id
|
|
}
|
|
}
|
|
}
|
|
if (this.type === 'gr') {
|
|
return {
|
|
name: 'account-agents-guaranteeReports-gr',
|
|
params: {
|
|
gr: id
|
|
}
|
|
}
|
|
}
|
|
},
|
|
async validateDateRange(type) {
|
|
async function timeStamp(date) {
|
|
try {
|
|
return Number(await moment(date).format('x'))
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
}
|
|
try {
|
|
if (type === 'toDate') {
|
|
if (this.reportParams.fromDate) {
|
|
const start = await timeStamp(this.reportParams.fromDate)
|
|
const end = await timeStamp(this.reportParams.toDate)
|
|
if (end < start) {
|
|
this.reportParams.toDate = ''
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'تاریخ پایان بازه نباید از شروع بازه بزرگتر باشد"'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
if (type === 'toItemReceptionTransDate') {
|
|
if (this.reportParams.fromItemReceptionTransDate) {
|
|
const start = await timeStamp(this.reportParams.fromItemReceptionTransDate)
|
|
const end = await timeStamp(this.reportParams.toItemReceptionTransDate)
|
|
if (end < start) {
|
|
this.reportParams.toItemReceptionTransDate = ''
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'تاریخ پایان بازه نباید از شروع بازه بزرگتر باشد"'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
if (type === 'toRecieveDate') {
|
|
if (this.reportParams.fromRecieveDate) {
|
|
const start = await timeStamp(this.reportParams.fromRecieveDate)
|
|
const end = await timeStamp(this.reportParams.toRecieveDate)
|
|
if (end < start) {
|
|
this.reportParams.toRecieveDate = ''
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'تاریخ پایان بازه نباید از شروع بازه بزرگتر باشد"'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
if (type === 'toDeliverDate') {
|
|
if (this.reportParams.fromDeliverDate) {
|
|
const start = await timeStamp(this.reportParams.fromDeliverDate)
|
|
const end = await timeStamp(this.reportParams.toDeliverDate)
|
|
if (end < start) {
|
|
this.reportParams.toDeliverDate = ''
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'تاریخ پایان بازه نباید از شروع بازه بزرگتر باشد"'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|