{{ t(`params.${tag.label}`) }}:
diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 2b41e19b1..63a37c035 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -32,6 +32,10 @@ const { t } = useI18n();
const entityId = computed(() => {
return $props.id || route.params.id;
});
+
+const debtWarning = computed(() => {
+ return customer.value?.debt > customer.value?.credit ? 'negative' : 'primary';
+});
@@ -110,7 +114,7 @@ const entityId = computed(() => {
v-if="customer.debt > customer.credit"
name="vn:risk"
size="xs"
- color="primary"
+ :color="debtWarning"
>
{{ t('customer.card.hasDebt') }}
diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue
index 46861d75e..95a162670 100644
--- a/src/pages/Customer/Card/CustomerSummary.vue
+++ b/src/pages/Customer/Card/CustomerSummary.vue
@@ -4,7 +4,7 @@ import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
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 { getUrl } from 'src/composables/getUrl';
import VnLv from 'src/components/ui/VnLv.vue';
@@ -27,21 +27,16 @@ const $props = defineProps({
const entityId = computed(() => $props.id || route.params.id);
const customer = computed(() => summary.value.entity);
const summary = ref();
-const clientUrl = ref();
-
-onMounted(async () => {
- clientUrl.value = (await getUrl('client/')) + entityId.value + '/';
-});
-
+const defaulterAmount = computed(() => customer.value.defaulters[0]?.amount);
const balanceDue = computed(() => {
- return (
- customer.value &&
- customer.value.defaulters.length &&
- customer.value.defaulters[0].amount
- );
+ const amount = defaulterAmount.value;
+ if (!amount || amount < 0) {
+ return null;
+ }
+ return amount;
});
-const balanceDueWarning = computed(() => (balanceDue.value ? 'negative' : ''));
+const balanceDueWarning = computed(() => (defaulterAmount.value ? 'negative' : ''));
const claimRate = computed(() => {
return customer.value.claimsRatio?.claimingRate ?? 0;
@@ -305,7 +300,7 @@ const sumRisk = ({ clientRisks }) => {
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index c3f4d52e8..79d48a667 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -11,10 +11,24 @@ defineProps({
required: true,
},
});
+const handleSalesModelValue = (val) => ({
+ or: [
+ { id: val },
+ { name: val },
+ { nickname: { like: '%' + val + '%' } },
+ { code: { like: `${val}%` } },
+ ],
+});
+
+const exprBuilder = (param, value) => {
+ return {
+ and: [{ active: { neq: false } }, handleSalesModelValue(value)],
+ };
+};
-
+
{{ t(`params.${tag.label}`) }}:
@@ -52,14 +66,18 @@ defineProps({
+ :input-debounce="0"
+ >
+
+
+
+ {{ opt.name }}
+
+ {{ opt.nickname }},{{ opt.code }}
+
+
+
+
diff --git a/src/pages/Customer/CustomerList.vue b/src/pages/Customer/CustomerList.vue
index fefa7d15f..3cb17332c 100644
--- a/src/pages/Customer/CustomerList.vue
+++ b/src/pages/Customer/CustomerList.vue
@@ -394,16 +394,16 @@ function handleLocation(data, location) {
-
+
diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue
index 91477e1a4..f1b4902f2 100644
--- a/src/pages/InvoiceOut/InvoiceOutList.vue
+++ b/src/pages/InvoiceOut/InvoiceOutList.vue
@@ -182,11 +182,11 @@ watchEffect(selectedRows);
-
+
@@ -203,7 +203,7 @@ watchEffect(selectedRows);
-
+
{{ row.name }}
diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue
index 84eefaed3..a8f7d0c5f 100644
--- a/src/pages/Item/ItemFixedPriceFilter.vue
+++ b/src/pages/Item/ItemFixedPriceFilter.vue
@@ -17,21 +17,6 @@ const props = defineProps({
});
const itemTypeWorkersOptions = ref([]);
-const exprBuilder = (param, value) => {
- switch (param) {
- case 'name':
- return { 'i.name': { like: `%${value}%` } };
- case 'itemFk':
- case 'warehouseFk':
- case 'rate2':
- case 'rate3':
- param = `fp.${param}`;
- return { [param]: value };
- case 'minPrice':
- param = `i.${param}`;
- return { [param]: value };
- }
-};
@@ -66,7 +51,7 @@ const exprBuilder = (param, value) => {
url="Warehouses"
auto-load
:filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }"
- :label="t('components.itemsFilterPanel.warehouseFk')"
+ :label="t('globals.warehouse')"
v-model="params.warehouseFk"
option-label="name"
option-value="id"
diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index e01790c6b..cb59d7c4a 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -1,7 +1,7 @@
@@ -194,7 +191,7 @@ onMounted(() => {
urlCreate: 'Orders/new',
title: t('module.cerateOrder'),
onDataSaved: (url) => {
- tableRef.redirect(url);
+ tableRef.redirect(`${url}/catalog`);
},
formInitialData: {
active: true,
diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue
index 8c6d454c0..1fc54f486 100644
--- a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue
+++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue
@@ -16,12 +16,9 @@ import { useAcl } from 'src/composables/useAcl';
import { useValidator } from 'src/composables/useValidator';
import { toTimeFormat } from 'filters/date.js';
-const $props = defineProps({
- formData: {
- type: Object,
- required: true,
- default: () => ({}),
- },
+const formData = defineModel({
+ type: Object,
+ required: true,
});
const emit = defineEmits(['updateForm']);
@@ -40,7 +37,6 @@ const agenciesOptions = ref([]);
const zonesOptions = ref([]);
const addresses = ref([]);
const zoneSelectRef = ref();
-const formData = ref($props.formData);
watch(
() => formData.value,
@@ -69,47 +65,28 @@ const zoneWhere = computed(() => {
: {};
});
-const getLanded = async (params) => {
- try {
- const validParams =
- shipped.value && addressId.value && agencyModeId.value && warehouseId.value;
- if (!validParams) return;
+async function getLanded(params) {
+ getDate(`Agencies/getLanded`, params);
+}
- formData.value.zoneFk = null;
- zonesOptions.value = [];
- const { data } = await axios.get(`Agencies/getLanded`, { params });
- if (data) {
- formData.value.zoneFk = data.zoneFk;
- formData.value.landed = data.landed;
- formData.value.shipped = params.shipped;
- }
- } catch (error) {
- console.error(error);
- notify(t('basicData.noDeliveryZoneAvailable'), 'negative');
+async function getShipped(params) {
+ getDate(`Agencies/getShipped`, params);
+}
+
+async function getDate(query, params) {
+ for (const param in params) {
+ if (!params[param]) return;
}
-};
-const getShipped = async (params) => {
- try {
- const validParams =
- landed.value && addressId.value && agencyModeId.value && warehouseId.value;
- if (!validParams) return;
+ formData.value.zoneFk = null;
+ zonesOptions.value = [];
+ const { data } = await axios.get(query, { params });
+ if (!data) return notify(t('basicData.noDeliveryZoneAvailable'), 'negative');
- formData.value.zoneFk = null;
- zonesOptions.value = [];
- const { data } = await axios.get(`Agencies/getShipped`, { params });
- if (data) {
- formData.value.zoneFk = data.zoneFk;
- formData.value.landed = params.landed;
- formData.value.shipped = data.shipped;
- } else {
- notify(t('basicData.noDeliveryZoneAvailable'), 'negative');
- }
- } catch (error) {
- console.error(error);
- notify(t('basicData.noDeliveryZoneAvailable'), 'negative');
- }
-};
+ formData.value.zoneFk = data.zoneFk;
+ if (data.landed) formData.value.landed = data.landed;
+ if (data.shipped) formData.value.shipped = data.shipped;
+}
const onChangeZone = async (zoneId) => {
formData.value.agencyModeFk = null;
@@ -177,18 +154,26 @@ const clientId = computed({
},
});
-const landed = computed({
- get: () => formData.value?.landed,
- set: (val) => {
- formData.value.landed = val;
- getShipped({
- landed: val,
+function addDateParams(obj) {
+ return {
+ ...obj,
+ ...{
addressFk: formData.value?.addressFk,
agencyModeFk: formData.value?.agencyModeFk,
warehouseFk: formData.value?.warehouseFk,
- });
- },
-});
+ },
+ };
+}
+
+async function setLanded(landed) {
+ if (!landed) return;
+ getShipped(addDateParams({ landed }));
+}
+
+async function setShipped(shipped) {
+ if (!shipped) return;
+ getLanded(addDateParams({ shipped }));
+}
const agencyModeId = computed({
get: () => formData.value.agencyModeFk,
@@ -236,21 +221,6 @@ const warehouseId = computed({
},
});
-const shipped = computed({
- get: () => formData.value?.shipped,
- set: (val) => {
- if (new Date(formData.value?.shipped).toDateString() != val.toDateString())
- val.setHours(0, 0, 0, 0);
- formData.value.shipped = val;
- getLanded({
- shipped: val,
- addressFk: formData.value?.addressFk,
- agencyModeFk: formData.value?.agencyModeFk,
- warehouseFk: formData.value?.warehouseFk,
- });
- },
-});
-
const onFormModelInit = () => {
if (formData.value?.clientFk) clientAddressesList(formData.value?.clientFk);
};
@@ -451,18 +421,21 @@ async function getZone(options) {
v-model="formData.shipped"
:required="true"
:rules="validate('ticketList.shipped')"
+ @update:model-value="setShipped"
/>
diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
index fb7881403..851593bff 100644
--- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
+++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
@@ -158,7 +158,7 @@ onBeforeMount(async () => await getTicketData());
(formData = $event)"
- :form-data="formData"
+ v-model="formData"
/>
diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
index bf4a1efb4..f1d30b1bd 100644
--- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue
+++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
@@ -1,9 +1,9 @@
@@ -396,8 +397,6 @@ async function uploadDocuware(force) {
-
-
-
-
+
+
+
+
+
+
+
+ {{ t('components.cardDescriptor.moreOptions') }}
+
+
+
+
+
+
+
+
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index 7f72f9862..6f1cac83b 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -47,7 +47,7 @@ const getGroupedStates = (data) => {
/>
(agencies = data)" auto-load />
(warehouses = data)" auto-load />
-
+
{{ t(`params.${tag.label}`) }}:
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index 0685217ac..aae6f80a7 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -1,7 +1,7 @@