From 3c6a4c1e168d4a0535faba6a54eea65d3aea21f0 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 20 Jan 2025 14:07:05 +0100 Subject: [PATCH] feat: refs #7984 add currency in ticket basic-data --- src/components/common/VnSelectCurrency.vue | 15 +++- src/components/ui/VnCurrency.vue | 24 ++++--- src/composables/useVnConfirm.js | 2 +- src/pages/Order/Card/OrderBasicData.vue | 32 +-------- src/pages/Order/Card/OrderCard.vue | 30 +++++++- .../Ticket/Card/BasicData/TicketBasicData.vue | 68 ++++++++++++++----- .../Card/BasicData/TicketBasicDataForm.vue | 9 ++- .../Card/BasicData/TicketBasicDataView.vue | 8 ++- src/pages/Ticket/TicketList.vue | 68 ++++++++++--------- 9 files changed, 155 insertions(+), 101 deletions(-) diff --git a/src/components/common/VnSelectCurrency.vue b/src/components/common/VnSelectCurrency.vue index ae3066bcb..4968fe677 100644 --- a/src/components/common/VnSelectCurrency.vue +++ b/src/components/common/VnSelectCurrency.vue @@ -6,7 +6,7 @@ import { ref } from 'vue'; import { watch } from 'vue'; const model = defineModel({ - type: [String, Number, Object], + type: Number, default: null, }); @@ -16,8 +16,12 @@ const clientId = defineModel('clientId', { }); const currencyList = ref([]); + +const emit = defineEmits(['newValue']); + onMounted(async () => { currencyList.value = (await axios.get('Currencies')).data; + emitCurrency(model.value); }); watch( @@ -30,6 +34,14 @@ watch( model.value = data.defaultCurrencyFk; } ); + +function emitCurrency(id) { + if (!id) return; + emit( + 'newValue', + currencyList.value?.find((c) => c.id == id) + ); +} diff --git a/src/components/ui/VnCurrency.vue b/src/components/ui/VnCurrency.vue index b2ad67736..b4b7622b0 100644 --- a/src/components/ui/VnCurrency.vue +++ b/src/components/ui/VnCurrency.vue @@ -27,26 +27,28 @@ const $props = defineProps({ description: 'find currency code in array data model', }, }); - +const arrayData = $props.arrayDataModel && useArrayData($props.arrayDataModel); const foreignValue = computed(() => $props.model?.[$props.foreignField]); const localValue = computed(() => $props.model?.[$props.localField]); -const currency = computed(() => $props.currencyCode ?? currencyCodeModel.value); +const currency = computed( + () => $props.currencyCode ?? arrayData.store.data?.currency?.code +); const toCurrencyLabel = computed(() => toCurrency(foreignValue.value ?? localValue.value, currency.value) ); const currencyCodeModel = ref(); -onMounted(() => { - if ($props.arrayDataModel) { - const arrayData = useArrayData($props.arrayDataModel); - currencyCodeModel.value = arrayData.store.data?.currency?.code; - } -}); +// onMounted(() => { +// if ($props.arrayDataModel) { +// currencyCodeModel.value = arrayData.store.data?.currency?.code; +// } +// }); diff --git a/src/composables/useVnConfirm.js b/src/composables/useVnConfirm.js index 4438ad11d..f334b4eec 100644 --- a/src/composables/useVnConfirm.js +++ b/src/composables/useVnConfirm.js @@ -22,7 +22,7 @@ export function useVnConfirm() { { customHTML: () => h(component, props) } ), }).onOk(async () => { - if (successFn) successFn(); + if (successFn) await successFn(); }); }; diff --git a/src/pages/Order/Card/OrderBasicData.vue b/src/pages/Order/Card/OrderBasicData.vue index 5fb5a4e15..c9d0f6ca6 100644 --- a/src/pages/Order/Card/OrderBasicData.vue +++ b/src/pages/Order/Card/OrderBasicData.vue @@ -16,7 +16,7 @@ import VnSelectCurrency from 'src/components/common/VnSelectCurrency.vue'; const { t } = useI18n(); const route = useRoute(); const state = useState(); -const ORDER_MODEL = 'order'; +const ORDER_MODEL = 'Order'; const isNew = Boolean(!route.params.id); const clientList = ref([]); @@ -56,33 +56,6 @@ const fetchOrderDetails = (order) => { fetchAgencyList(order?.landed, order?.addressFk); }; -const orderFilter = { - include: [ - { relation: 'agencyMode', scope: { fields: ['name'] } }, - { - relation: 'address', - scope: { fields: ['nickname'] }, - }, - { relation: 'rows', scope: { fields: ['id'] } }, - { - relation: 'client', - scope: { - fields: [ - 'salesPersonFk', - 'name', - 'isActive', - 'isFreezed', - 'isTaxDataChecked', - ], - include: { - relation: 'salesPersonUser', - scope: { fields: ['id', 'name'] }, - }, - }, - }, - ], -}; - const onClientChange = async (clientId) => { const { data } = await axios.get(`Clients/${clientId}`); await fetchAddressList(data.defaultAddressFk); @@ -93,12 +66,9 @@ const onClientChange = async (clientId) => {
diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicData.vue b/src/pages/Ticket/Card/BasicData/TicketBasicData.vue index c6a85c287..8c1ab43ed 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicData.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicData.vue @@ -9,6 +9,7 @@ import FetchData from 'components/FetchData.vue'; import { useStateStore } from 'stores/useStateStore'; import { toCurrency } from 'filters/index'; import { useRole } from 'src/composables/useRole'; +import VnCurrency from 'src/components/ui/VnCurrency.vue'; const haveNegatives = defineModel('haveNegatives', { type: Boolean, required: true }); const formData = defineModel({ type: Object, required: true }); @@ -18,7 +19,7 @@ const { t } = useI18n(); const { hasAny } = useRole(); const ticketUpdateActions = ref(null); -const rows = computed(() => formData.value?.sale?.items || []); +const rows = computed(() => formData.value?.ticket?.sales || []); const columns = computed(() => [ { @@ -83,20 +84,6 @@ const loadDefaultTicketAction = () => { formData.value.option = isSalesAssistant ? 'mana' : 'renewPrices'; }; -const totalPrice = computed(() => { - return rows.value.reduce((acc, item) => acc + item.price * item.quantity, 0); -}); - -const totalNewPrice = computed(() => { - return rows.value.reduce( - (acc, item) => acc + item.component.newPrice * item.quantity, - 0 - ); -}); - -const totalDifference = computed(() => { - return rows.value.reduce((acc, item) => acc + item.component?.difference || 0, 0); -}); const showMovableColumn = computed(() => (haveDifferences.value > 0 ? ['movable'] : [])); const haveDifferences = computed(() => formData.value.sale?.haveDifferences); async function ticketHaveNegatives() { @@ -141,17 +128,34 @@ onMounted(async () => { {{ t('basicData.price') }}: - {{ toCurrency(totalPrice) }} + - {{ t('basicData.newPrice') }}: {{ toCurrency(totalNewPrice) }} + {{ t('basicData.newPrice') }}: + - {{ t('basicData.difference') }}: {{ toCurrency(totalDifference) }} + {{ t('basicData.difference') }}: + @@ -244,5 +248,33 @@ onMounted(async () => { /> + + + diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue index cf4481537..7ee52f852 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue @@ -15,6 +15,7 @@ import useNotify from 'src/composables/useNotify.js'; import { useAcl } from 'src/composables/useAcl'; import { useValidator } from 'src/composables/useValidator'; import { toTimeFormat } from 'filters/date.js'; +import VnSelectCurrency from 'src/components/common/VnSelectCurrency.vue'; const formData = defineModel({ type: Object, @@ -357,7 +358,7 @@ async function getZone(options) { :rules="validate('basicData.alias')" /> - + + + + { zoneId: formData.value.zoneFk, warehouseId: formData.value.warehouseFk, shipped: formData.value.shipped, + currencyId: formData.value.currencyFk, }; const { data } = await axios.post( `tickets/${formData.value.id}/priceDifference`, params ); - formData.value.sale = data; + formData.value.ticket = data; }; const submit = async () => { @@ -102,6 +103,7 @@ const submit = async () => { option: formData.value.option, isWithoutNegatives: formData.value.withoutNegatives, withWarningAccept: formData.value.withWarningAccept, + currencyFk: formData.value.currencyFk, keepPrice: false, }; @@ -119,7 +121,7 @@ const submit = async () => { const submitWithNegatives = async () => { formData.value.withWarningAccept = true; - submit(); + await submit(); }; const onNextStep = async () => { @@ -136,7 +138,7 @@ const onNextStep = async () => { t('basicData.negativesConfirmMessage'), submitWithNegatives ); - else submit(); + else await submit(); } }; diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue index 64cf3d649..5ea0e619c 100644 --- a/src/pages/Ticket/TicketList.vue +++ b/src/pages/Ticket/TicketList.vue @@ -22,6 +22,8 @@ import { toTimeFormat } from 'src/filters/date'; import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue'; import TicketProblems from 'src/components/TicketProblems.vue'; import VnSection from 'src/components/common/VnSection.vue'; +import VnSelectCompany from 'src/components/common/VnSelectCompany.vue'; +import VnSelectCurrency from 'src/components/common/VnSelectCurrency.vue'; const route = useRoute(); const router = useRouter(); @@ -636,43 +638,45 @@ function setReference(data) { -
- -
+
-
- -
+
-
- -
+
+ +