diff --git a/src/components/ui/VnLinkMail.vue b/src/components/ui/VnLinkMail.vue new file mode 100644 index 000000000..a54f463f5 --- /dev/null +++ b/src/components/ui/VnLinkMail.vue @@ -0,0 +1,16 @@ + + diff --git a/src/pages/Customer/Card/CustomerAddress.vue b/src/pages/Customer/Card/CustomerAddress.vue index 166c33e1a..294e49cc8 100644 --- a/src/pages/Customer/Card/CustomerAddress.vue +++ b/src/pages/Customer/Card/CustomerAddress.vue @@ -27,7 +27,7 @@ const addressFilter = { 'isLogifloraAllowed', 'postalCode', ], - order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'], + order: ['isDefaultAddress DESC', 'isActive DESC', 'id DESC', 'nickname ASC'], include: [ { relation: 'observations', diff --git a/src/pages/Customer/Card/CustomerBalance.vue b/src/pages/Customer/Card/CustomerBalance.vue index f148194f8..f6fc3eed2 100644 --- a/src/pages/Customer/Card/CustomerBalance.vue +++ b/src/pages/Customer/Card/CustomerBalance.vue @@ -5,7 +5,7 @@ import { useRoute } from 'vue-router'; import { useAcl } from 'src/composables/useAcl'; import axios from 'axios'; import { useQuasar } from 'quasar'; -import FetchData from 'components/FetchData.vue'; +import { getClientRisk } from '../composables/getClientRisk'; import { toCurrency, toDate, toDateHourMin } from 'src/filters'; import { useState } from 'composables/useState'; @@ -16,7 +16,7 @@ import { useVnConfirm } from 'composables/useVnConfirm'; import VnTable from 'components/VnTable/VnTable.vue'; import VnInput from 'components/common/VnInput.vue'; import VnSubToolbar from 'components/ui/VnSubToolbar.vue'; -import VnSelect from 'src/components/common/VnSelect.vue'; +import VnFilter from 'components/VnTable/VnFilter.vue'; import CustomerNewPayment from 'src/pages/Customer/components/CustomerNewPayment.vue'; import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue'; @@ -25,7 +25,7 @@ const { openConfirmationModal } = useVnConfirm(); const { sendEmail, openReport } = usePrintService(); const { t } = useI18n(); const { hasAny } = useAcl(); -const currentBalance = ref({}); + const quasar = useQuasar(); const route = useRoute(); const state = useState(); @@ -33,28 +33,53 @@ const stateStore = useStateStore(); const user = state.getUser(); const clientRisk = ref([]); -const companies = ref([]); const tableRef = ref(); -const companyId = ref(user.value.companyFk); +const companyId = ref(); +const companyUser = ref(user.value.companyFk); const balances = ref([]); const vnFilterRef = ref({}); const filter = computed(() => { return { clientId: route.params.id, - companyId: companyId.value ?? user.value.companyFk, + companyId: companyId.value ?? companyUser.value, }; }); +const companyFilterColumn = { + align: 'left', + name: 'companyId', + label: t('Company'), + component: 'select', + attrs: { + url: 'Companies', + optionLabel: 'code', + optionValue: 'id', + sortBy: 'code', + }, + columnFilter: { + event: { + remove: () => (companyId.value = null), + 'update:modelValue': (newCompanyFk) => { + if (!newCompanyFk) return; + vnFilterRef.value.addFilter(newCompanyFk); + companyUser.value = newCompanyFk; + }, + blur: () => !companyId.value && (companyId.value = companyUser.value), + }, + }, + visible: false, +}; + const columns = computed(() => [ { - align: 'right', + align: 'left', name: 'payed', label: t('Date'), format: ({ payed }) => toDate(payed), cardVisible: true, }, { - align: 'right', + align: 'left', name: 'created', label: t('Creation date'), format: ({ created }) => toDateHourMin(created), @@ -65,7 +90,12 @@ const columns = computed(() => [ label: t('Employee'), columnField: { component: 'userLink', - attrs: ({ row }) => ({ workerId: row.workerFk, name: row.userName }), + attrs: ({ row }) => { + return { + workerId: row.workerFk, + name: row.userName, + }; + }, }, cardVisible: true, }, @@ -77,13 +107,13 @@ const columns = computed(() => [ class: 'extend', }, { - align: 'right', + align: 'left', name: 'bankFk', label: t('Bank'), cardVisible: true, }, { - align: 'right', + align: 'left', name: 'debit', label: t('Debit'), format: ({ debit }) => debit && toCurrency(debit), @@ -136,20 +166,37 @@ const columns = computed(() => [ onBeforeMount(() => { stateStore.rightDrawer = true; + companyId.value = companyUser.value; }); -async function getCurrentBalance(data) { - currentBalance.value[companyId.value] = { - amount: 0, - code: companies.value.find((c) => c.id === companyId.value)?.code, +async function getClientRisks() { + const filter = { + where: { clientFk: route.params.id, companyFk: companyUser.value }, }; + const { data } = await getClientRisk(filter); + clientRisk.value = data; + return clientRisk.value; +} - for (const balance of data) { - currentBalance.value[balance.companyFk] = { - code: balance.company.code, - amount: balance.amount, - }; +async function getCurrentBalance() { + const currentBalance = (await getClientRisks()).find((balance) => { + return balance.companyFk === companyId.value; + }); + return currentBalance && currentBalance.amount; +} + +async function onFetch(data) { + balances.value = []; + for (const [index, balance] of data.entries()) { + if (index === 0) { + balance.balance = await getCurrentBalance(); + continue; + } + const previousBalance = data[index - 1]; + balance.balance = + previousBalance?.balance - (previousBalance?.debit - previousBalance?.credit); } + balances.value = data; } const showNewPaymentDialog = () => { @@ -169,43 +216,25 @@ const showBalancePdf = ({ id }) => { - + - + @@ -68,6 +68,7 @@ function handleLocation(data, location) { option-label="vat" option-value="id" v-model="data.sageTaxTypeFk" + :required="data.isTaxDataChecked" /> - - [ }, { align: 'left', - format: (row) => row.agencyMode.name, + format: (row) => dashIfEmpty(row.agencyMode?.name), columnClass: 'expand', label: t('Agency'), }, @@ -111,7 +111,11 @@ const columns = computed(() => [ { title: t('customer.summary.goToLines'), icon: 'vn:lines', - action: ({ id }) => router.push({ params: { id }, name: 'TicketSale' }), + action: ({ id }) => + window.open( + router.resolve({ params: { id }, name: 'TicketSale' }).href, + '_blank' + ), isPrimary: true, }, { @@ -150,6 +154,8 @@ const setShippedColor = (date) => { if (difference == 0) return 'warning'; if (difference < 0) return 'success'; }; +const rowClick = ({ id }) => + window.open(router.resolve({ params: { id }, name: 'TicketSummary' }).href, '_blank'); const getItemPackagingType = (ticketSales) => { if (!ticketSales?.length) return '-'; @@ -177,13 +183,15 @@ const getItemPackagingType = (ticketSales) => { :column-search="false" url="Tickets" :columns="columns" - search-url="tickets" + append-params="false" :without-header="true" auto-load + :row-click="rowClick" order="shipped DESC, id" :disable-option="{ card: true, table: true }" class="full-width" :disable-infinite-scroll="true" + search-url="tickets" >