Merge branch 'master' into hotfix-orderTickets
gitea/salix-front/pipeline/pr-master This commit looks good
Details
gitea/salix-front/pipeline/pr-master This commit looks good
Details
This commit is contained in:
commit
f3ca51aab4
|
@ -98,7 +98,7 @@ function existSummary(routes) {
|
||||||
<slot name="header" :entity="entity" dense>
|
<slot name="header" :entity="entity" dense>
|
||||||
<VnLv :label="`${entity.id} -`" :value="entity.name" />
|
<VnLv :label="`${entity.id} -`" :value="entity.name" />
|
||||||
</slot>
|
</slot>
|
||||||
<slot name="header-right">
|
<slot name="header-right" :entity="entity">
|
||||||
<span></span>
|
<span></span>
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import VnUserLink from 'src/components/ui/VnUserLink.vue';
|
import VnUserLink from 'src/components/ui/VnUserLink.vue';
|
||||||
|
|
||||||
import { toCurrency, toPercentage, toDate } from 'src/filters';
|
import { toCurrency, toPercentage, toDate, dashOrCurrency } from 'src/filters';
|
||||||
import CardSummary from 'components/ui/CardSummary.vue';
|
import CardSummary from 'components/ui/CardSummary.vue';
|
||||||
import VnLv from 'src/components/ui/VnLv.vue';
|
import VnLv from 'src/components/ui/VnLv.vue';
|
||||||
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
|
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
|
||||||
|
@ -25,16 +25,16 @@ const $props = defineProps({
|
||||||
const entityId = computed(() => $props.id || route.params.id);
|
const entityId = computed(() => $props.id || route.params.id);
|
||||||
const customer = computed(() => summary.value.entity);
|
const customer = computed(() => summary.value.entity);
|
||||||
const summary = ref();
|
const summary = ref();
|
||||||
|
const defaulterAmount = computed(() => customer.value.defaulters[0]?.amount);
|
||||||
const balanceDue = computed(() => {
|
const balanceDue = computed(() => {
|
||||||
return (
|
const amount = defaulterAmount.value;
|
||||||
customer.value &&
|
if (!amount || amount < 0) {
|
||||||
customer.value.defaulters.length &&
|
return null;
|
||||||
customer.value.defaulters[0].amount
|
}
|
||||||
);
|
return amount;
|
||||||
});
|
});
|
||||||
|
|
||||||
const balanceDueWarning = computed(() => (balanceDue.value ? 'negative' : ''));
|
const balanceDueWarning = computed(() => (defaulterAmount.value ? 'negative' : ''));
|
||||||
|
|
||||||
const claimRate = computed(() => {
|
const claimRate = computed(() => {
|
||||||
return customer.value.claimsRatio?.claimingRate ?? 0;
|
return customer.value.claimsRatio?.claimingRate ?? 0;
|
||||||
|
@ -281,7 +281,7 @@ const sumRisk = ({ clientRisks }) => {
|
||||||
<VnLv
|
<VnLv
|
||||||
v-if="entity.defaulters"
|
v-if="entity.defaulters"
|
||||||
:label="t('customer.summary.balanceDue')"
|
:label="t('customer.summary.balanceDue')"
|
||||||
:value="toCurrency(balanceDue)"
|
:value="dashOrCurrency(balanceDue)()"
|
||||||
:class="balanceDueWarning"
|
:class="balanceDueWarning"
|
||||||
:info="t('customer.summary.balanceDueInfo')"
|
:info="t('customer.summary.balanceDueInfo')"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { ref, toRefs } from 'vue';
|
import { computed, ref, toRefs } from 'vue';
|
||||||
import { useQuasar } from 'quasar';
|
import { useQuasar } from 'quasar';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
import { usePrintService } from 'composables/usePrintService';
|
import { usePrintService } from 'composables/usePrintService';
|
||||||
import SendEmailDialog from 'components/common/SendEmailDialog.vue';
|
import SendEmailDialog from 'components/common/SendEmailDialog.vue';
|
||||||
import VnConfirm from 'components/ui/VnConfirm.vue';
|
import VnConfirm from 'components/ui/VnConfirm.vue';
|
||||||
|
@ -23,7 +23,6 @@ const props = defineProps({
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const route = useRoute();
|
|
||||||
|
|
||||||
const { push, currentRoute } = useRouter();
|
const { push, currentRoute } = useRouter();
|
||||||
const { dialog, notify } = useQuasar();
|
const { dialog, notify } = useQuasar();
|
||||||
|
@ -31,7 +30,7 @@ const { t } = useI18n();
|
||||||
const { openReport, sendEmail } = usePrintService();
|
const { openReport, sendEmail } = usePrintService();
|
||||||
const ticketSummary = useArrayData('TicketSummary');
|
const ticketSummary = useArrayData('TicketSummary');
|
||||||
const { ticket } = toRefs(props);
|
const { ticket } = toRefs(props);
|
||||||
const ticketId = currentRoute.value.params.id;
|
const ticketId = computed(() => props.ticket.id ?? currentRoute.value.params.id);
|
||||||
const client = ref();
|
const client = ref();
|
||||||
const showTransferDialog = ref(false);
|
const showTransferDialog = ref(false);
|
||||||
const showTurnDialog = ref(false);
|
const showTurnDialog = ref(false);
|
||||||
|
@ -68,7 +67,7 @@ const actions = {
|
||||||
setWeight: async () => {
|
setWeight: async () => {
|
||||||
try {
|
try {
|
||||||
const invoiceIds = (
|
const invoiceIds = (
|
||||||
await axios.post(`Tickets/${ticketId}/setWeight`, {
|
await axios.post(`Tickets/${ticketId.value}/setWeight`, {
|
||||||
weight: weight.value,
|
weight: weight.value,
|
||||||
})
|
})
|
||||||
).data;
|
).data;
|
||||||
|
@ -86,7 +85,7 @@ const actions = {
|
||||||
},
|
},
|
||||||
remove: async () => {
|
remove: async () => {
|
||||||
try {
|
try {
|
||||||
await axios.post(`Tickets/${ticketId}/setDeleted`);
|
await axios.post(`Tickets/${ticketId.value}/setDeleted`);
|
||||||
|
|
||||||
notify({ message: t('Ticket deleted'), type: 'positive' });
|
notify({ message: t('Ticket deleted'), type: 'positive' });
|
||||||
notify({
|
notify({
|
||||||
|
@ -176,14 +175,14 @@ function showSmsDialog(template, customData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function showSmsDialogWithChanges() {
|
async function showSmsDialogWithChanges() {
|
||||||
const query = `TicketLogs/${ticketId}/getChanges`;
|
const query = `TicketLogs/${ticketId.value}/getChanges`;
|
||||||
const response = await axios.get(query);
|
const response = await axios.get(query);
|
||||||
|
|
||||||
showSmsDialog('orderChanges', { changes: response.data });
|
showSmsDialog('orderChanges', { changes: response.data });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendSms(body) {
|
async function sendSms(body) {
|
||||||
await axios.post(`Tickets/${ticketId}/sendSms`, body);
|
await axios.post(`Tickets/${ticketId.value}/sendSms`, body);
|
||||||
notify({
|
notify({
|
||||||
message: 'Notification sent',
|
message: 'Notification sent',
|
||||||
type: 'positive',
|
type: 'positive',
|
||||||
|
@ -256,7 +255,10 @@ async function transferClient(client) {
|
||||||
clientFk: client,
|
clientFk: client,
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data } = await axios.patch(`Tickets/${ticketId}/transferClient`, params);
|
const { data } = await axios.patch(
|
||||||
|
`Tickets/${ticketId.value}/transferClient`,
|
||||||
|
params
|
||||||
|
);
|
||||||
|
|
||||||
if (data) window.location.reload();
|
if (data) window.location.reload();
|
||||||
}
|
}
|
||||||
|
@ -296,7 +298,10 @@ async function changeShippedHour(time) {
|
||||||
shipped: time,
|
shipped: time,
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data } = await axios.post(`Tickets/${ticketId}/updateEditableTicket`, params);
|
const { data } = await axios.post(
|
||||||
|
`Tickets/${ticketId.value}/updateEditableTicket`,
|
||||||
|
params
|
||||||
|
);
|
||||||
|
|
||||||
if (data) window.location.reload();
|
if (data) window.location.reload();
|
||||||
}
|
}
|
||||||
|
@ -313,7 +318,7 @@ function openRecalculateDialog() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function recalculateComponents() {
|
async function recalculateComponents() {
|
||||||
await axios.post(`Tickets/${ticketId}/recalculateComponents`);
|
await axios.post(`Tickets/${ticketId.value}/recalculateComponents`);
|
||||||
notify({
|
notify({
|
||||||
message: t('Data saved'),
|
message: t('Data saved'),
|
||||||
type: 'positive',
|
type: 'positive',
|
||||||
|
@ -336,11 +341,11 @@ async function handleInvoiceOutData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function docuwareDownload() {
|
async function docuwareDownload() {
|
||||||
await axios.get(`Tickets/${ticketId}/docuwareDownload`);
|
await axios.get(`Tickets/${ticketId.value}/docuwareDownload`);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function hasDocuware() {
|
async function hasDocuware() {
|
||||||
const { data } = await axios.post(`Docuwares/${ticketId}/checkFile`, {
|
const { data } = await axios.post(`Docuwares/${ticketId.value}/checkFile`, {
|
||||||
fileCabinet: 'deliveryNote',
|
fileCabinet: 'deliveryNote',
|
||||||
signed: true,
|
signed: true,
|
||||||
});
|
});
|
||||||
|
@ -371,11 +376,7 @@ async function uploadDocuware(force) {
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<FetchData
|
||||||
:url="
|
:url="`Tickets/${ticketId}/isEditable`"
|
||||||
route.path.startsWith('/ticket')
|
|
||||||
? `Tickets/${ticketId}/isEditable`
|
|
||||||
: `Tickets/${ticket}/isEditable`
|
|
||||||
"
|
|
||||||
auto-load
|
auto-load
|
||||||
@on-fetch="handleFetchData"
|
@on-fetch="handleFetchData"
|
||||||
/>
|
/>
|
||||||
|
@ -396,8 +397,6 @@ async function uploadDocuware(force) {
|
||||||
<VnSelect
|
<VnSelect
|
||||||
url="Clients"
|
url="Clients"
|
||||||
:fields="['id', 'name']"
|
:fields="['id', 'name']"
|
||||||
option-label="name"
|
|
||||||
option-value="id"
|
|
||||||
v-model="client"
|
v-model="client"
|
||||||
:label="t('Client')"
|
:label="t('Client')"
|
||||||
auto-load
|
auto-load
|
||||||
|
|
|
@ -20,6 +20,7 @@ import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
|
||||||
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
|
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
import VnToSummary from 'src/components/ui/VnToSummary.vue';
|
import VnToSummary from 'src/components/ui/VnToSummary.vue';
|
||||||
|
import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { notify } = useNotify();
|
const { notify } = useNotify();
|
||||||
|
@ -116,24 +117,36 @@ function toTicketUrl(section) {
|
||||||
{{ entity.nickname }}
|
{{ entity.nickname }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #header-right>
|
<template #header-right="{ entity }">
|
||||||
<QBtnDropdown
|
<div>
|
||||||
ref="stateBtnDropdownRef"
|
<QBtnDropdown
|
||||||
color="black"
|
ref="stateBtnDropdownRef"
|
||||||
text-color="white"
|
color="black"
|
||||||
:label="t('globals.changeState')"
|
text-color="white"
|
||||||
:disable="!isEditable()"
|
:label="t('globals.changeState')"
|
||||||
>
|
:disable="!isEditable()"
|
||||||
<VnSelect
|
>
|
||||||
:options="editableStates"
|
<VnSelect
|
||||||
hide-selected
|
:options="editableStates"
|
||||||
option-label="name"
|
hide-selected
|
||||||
option-value="code"
|
option-label="name"
|
||||||
hide-dropdown-icon
|
option-value="code"
|
||||||
focus-on-mount
|
hide-dropdown-icon
|
||||||
@update:model-value="changeState"
|
focus-on-mount
|
||||||
/>
|
@update:model-value="changeState"
|
||||||
</QBtnDropdown>
|
/>
|
||||||
|
</QBtnDropdown>
|
||||||
|
<QBtn color="white" dense flat icon="more_vert" round size="md">
|
||||||
|
<QTooltip>
|
||||||
|
{{ t('components.cardDescriptor.moreOptions') }}
|
||||||
|
</QTooltip>
|
||||||
|
<QMenu>
|
||||||
|
<QList>
|
||||||
|
<TicketDescriptorMenu :ticket="entity" />
|
||||||
|
</QList>
|
||||||
|
</QMenu>
|
||||||
|
</QBtn>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<QCard class="vn-one">
|
<QCard class="vn-one">
|
||||||
|
|
Loading…
Reference in New Issue