PR-CUSTOMER #186
|
@ -134,6 +134,13 @@ export default {
|
|||
creditContracts: 'Credit contracts',
|
||||
creditOpinion: 'Credit opinion',
|
||||
others: 'Others',
|
||||
samples: 'Samples',
|
||||
consumption: 'Consumption',
|
||||
mandates: 'Mandates',
|
||||
contacts: 'Contacts',
|
||||
webPayment: 'Web payment',
|
||||
fileManagement: 'File management',
|
||||
unpaid: 'Unpaid',
|
||||
},
|
||||
list: {
|
||||
phone: 'Phone',
|
||||
|
|
|
@ -134,6 +134,13 @@ export default {
|
|||
creditContracts: 'Contratos de crédito',
|
||||
creditOpinion: 'Opinión de crédito',
|
||||
others: 'Otros',
|
||||
samples: 'Plantillas',
|
||||
consumption: 'Consumo',
|
||||
mandates: 'Mandatos',
|
||||
contacts: 'Contactos',
|
||||
webPayment: 'Pago web',
|
||||
fileManagement: 'Getión documental',
|
||||
unpaid: 'Impago',
|
||||
},
|
||||
list: {
|
||||
phone: 'Teléfono',
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
<script setup>
|
||||
|
||||
import { computed, ref } from 'vue';
|
||||
import { computed, onBeforeMount, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import { date, QCheckbox, QBtn, useQuasar } from 'quasar';
|
||||
|
||||
import { useState } from 'src/composables/useState';
|
||||
import { toCurrency } from 'src/filters';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
|
||||
|
@ -17,68 +18,68 @@ const { t } = useI18n();
|
|||
const route = useRoute();
|
||||
const quasar = useQuasar();
|
||||
const stateStore = useStateStore();
|
||||
const state = useState();
|
||||
const user = state.getUser();
|
||||
|
||||
const clientRisks = ref(null);
|
||||
const companiesOptions = ref([]);
|
||||
const companyId = ref(442);
|
||||
const rows = ref(null);
|
||||
const workerId = ref(0);
|
||||
const receiptsRef = ref(null);
|
||||
const clientRisksRef = ref(null);
|
||||
const companiesOptions = ref([]);
|
||||
const companyId = ref(null);
|
||||
const receiptsRef = ref(null);
|
||||
const rows = ref([]);
|
||||
const workerId = ref(null);
|
||||
|
||||
const filterCompanies = { order: ['code'] };
|
||||
const params = {
|
||||
clientId: `${route.params.id}`,
|
||||
companyId: companyId.value,
|
||||
companyId: user.value.companyFk,
|
||||
filter: { limit: 20 },
|
||||
};
|
||||
const filter = {
|
||||
include: { relation: 'company', scope: { fields: ['code'] } },
|
||||
where: { clientFk: `${route.params.id}`, companyFk: companyId.value },
|
||||
where: { clientFk: `${route.params.id}`, companyFk: user.value.companyFk },
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
payed: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
created: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
userName: {
|
||||
component: QBtn,
|
||||
props: () => ({ flat: true, color: 'blue' }),
|
||||
event: (prop) => {
|
||||
workerId.value = prop.row.clientFk;
|
||||
},
|
||||
event: ({ row }) => (workerId.value = row.clientFk),
|
||||
},
|
||||
description: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
bankFk: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
debit: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
credit: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
balance: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
isConciliate: {
|
||||
component: QCheckbox,
|
||||
|
@ -86,7 +87,7 @@ const tableColumnComponents = {
|
|||
disable: true,
|
||||
'model-value': Boolean(prop.value),
|
||||
}),
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -151,8 +152,12 @@ const columns = computed(() => [
|
|||
},
|
||||
]);
|
||||
|
||||
const getData = () => {
|
||||
onBeforeMount(() => {
|
||||
stateStore.rightDrawer = true;
|
||||
companyId.value = user.value.companyFk;
|
||||
});
|
||||
|
||||
const getData = () => {
|
||||
receiptsRef.value?.fetch();
|
||||
jgallego
commented
no se porque el conciliado al lado del checkbox tiene un 1, http://localhost:9000/#/customer/1101/balance no se porque el conciliado al lado del checkbox tiene un 1, http://localhost:9000/#/customer/1101/balance
cfonseca
commented
Corregido: Corregido: d74119f433
jsegarra
commented
Yo lo he visto OK Yo lo he visto OK
|
||||
clientRisksRef.value?.fetch();
|
||||
};
|
||||
|
@ -169,7 +174,11 @@ const showNewPaymentDialog = () => {
|
|||
};
|
||||
|
||||
const updateCompanyId = (id) => {
|
||||
if (id) companyId.value = id;
|
||||
if (id) {
|
||||
companyId.value = id;
|
||||
params.companyId = id;
|
||||
filter.where.companyFk = id;
|
||||
}
|
||||
getData();
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
<script setup>
|
||||
import { onMounted, ref } from 'vue';
|
||||
import { ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import axios from 'axios';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
|
|
|
@ -140,6 +140,7 @@ const toCustomerConsigneeEdit = (consigneeId) => {
|
|||
</template>
|
||||
jgallego
commented
error que no pertenece a esta linea, pero sí al fichero: error que no pertenece a esta linea, pero sí al fichero:
En la linea
`<QIcon name="star" size="md" color="primary" />`
se muestra el icono de la estrella, debe estar marcado si el campos isDefaultAddress es <> false
se puede observar un ejemplo en http://localhost:5000/#!/client/1110/address/index
cfonseca
commented
Corregido: Corregido: 86199d8197
jsegarra
commented
@jgallego Yo lo he visto OK @jgallego Yo lo he visto OK
|
||||
</VnPaginate>
|
||||
</QCard>
|
||||
|
||||
<QPageSticky :offset="[18, 18]">
|
||||
<QBtn @click.stop="toCustomerConsigneeCreate()" color="primary" fab icon="add" />
|
||||
<QTooltip>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
<script setup>
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h5 class="flex justify-center label-color">
|
||||
{{ t('Enter a new search') }}
|
||||
</h5>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.label-color {
|
||||
color: var(--vn-label);
|
||||
}
|
||||
</style>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Enter a new search: Introduce una nueva búsqueda
|
||||
</i18n>
|
|
@ -0,0 +1,147 @@
|
|||
<script setup>
|
||||
import { onBeforeMount, reactive, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import axios from 'axios';
|
||||
|
||||
import useNotify from 'src/composables/useNotify';
|
||||
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const { notify } = useNotify();
|
||||
|
||||
let notes = reactive([]);
|
||||
|
||||
const isLoading = ref(false);
|
||||
|
||||
onBeforeMount(() => {
|
||||
getData();
|
||||
});
|
||||
|
||||
const getData = async () => {
|
||||
const filter = {
|
||||
fields: ['id', 'name', 'phone', 'clientFk'],
|
||||
where: { clientFk: route.params.id },
|
||||
};
|
||||
const { data } = await axios.get('ClientContacts', {
|
||||
params: { filter: JSON.stringify(filter) },
|
||||
});
|
||||
notes.length = 0;
|
||||
data.forEach((element) => {
|
||||
element.isNew = false;
|
||||
addNote(element);
|
||||
});
|
||||
};
|
||||
|
||||
const addNote = ({ id, name, phone, isNew }) => {
|
||||
if (!notes.some((note) => note.id === id)) {
|
||||
notes.push({
|
||||
id,
|
||||
$isNew: isNew,
|
||||
name,
|
||||
phone,
|
||||
$oldData: null,
|
||||
$orgIndex: null,
|
||||
clientFk: route.params.id,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const deleteNote = (index) => {
|
||||
notes.splice(index, 1);
|
||||
};
|
||||
|
||||
const onSubmit = async () => {
|
||||
isLoading.value = true;
|
||||
const payload = {
|
||||
creates: notes.filter((element) => element.$isNew),
|
||||
};
|
||||
try {
|
||||
await axios.post('ClientContacts/crud', payload);
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
No hay notificación de guardado? No hay notificación de guardado?
cfonseca
commented
Corregido: Corregido: ab20ec1738
|
||||
notes = [];
|
||||
await getData();
|
||||
} catch (error) {
|
||||
notify('errors.create', 'negative');
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QCard class="q-pa-lg">
|
||||
<QCardSection>
|
||||
<QForm @submit.prevent="onSubmit">
|
||||
<VnRow
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
Falta clearable Falta clearable
cfonseca
commented
Corregido: Corregido: 7f1c4690e8
|
||||
:key="index"
|
||||
class="row q-gutter-md q-mb-md"
|
||||
v-for="(note, index) in notes"
|
||||
>
|
||||
<div class="col">
|
||||
<VnInput :label="t('Name')" v-model="note.name" />
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<VnInput :label="t('Phone')" v-model="note.phone" />
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Te deja cualquier cosa Te deja cualquier cosa
cfonseca
commented
Corregido: Corregido: ab20ec1738
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
No funciona si has dado a guardar. No funciona si has dado a guardar.
Puedes eliminar la primera pero si añades una fila y le das a guardar, reaparece.
cfonseca
commented
Corregido: Corregido: d0e98010a5
|
||||
<QIcon
|
||||
@click.stop="deleteNote(index)"
|
||||
class="cursor-pointer"
|
||||
color="primary"
|
||||
name="delete"
|
||||
size="sm"
|
||||
>
|
||||
<QTooltip>
|
||||
{{ t('Remove contact') }}
|
||||
</QTooltip>
|
||||
</QIcon>
|
||||
</div>
|
||||
</VnRow>
|
||||
|
||||
<div class="flex justify-between q-mt-xl">
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Comportamiento anómalo, y muy similar a remove, combinando acciones de crear, guardar, eliminar. Comportamiento anómalo, y muy similar a remove, combinando acciones de crear, guardar, eliminar.
cfonseca
commented
Corregido: Corregido: d0e98010a5
jsegarra
commented
Me acaba de pasar que he creado una linea, he guardado y no me ha dejado volver a darle a guardar hasta hacer F5 Me acaba de pasar que he creado una linea, he guardado y no me ha dejado volver a darle a guardar hasta hacer F5
cfonseca
commented
Corregido: Corregido: bb10714824
jsegarra
commented
Revisar Revisar
|
||||
<div class="flex items-center">
|
||||
<QIcon
|
||||
@click.stop="addNote({ name: '', phone: '', isNew: true })"
|
||||
class="cursor-pointer add-icon"
|
||||
name="add"
|
||||
size="sm"
|
||||
>
|
||||
<QTooltip>
|
||||
{{ t('Add contact') }}
|
||||
</QTooltip>
|
||||
</QIcon>
|
||||
</div>
|
||||
|
||||
<QBtn
|
||||
:label="t('globals.save')"
|
||||
type="submit"
|
||||
color="primary"
|
||||
:disabled="isLoading"
|
||||
:loading="isLoading"
|
||||
/>
|
||||
</div>
|
||||
</QForm>
|
||||
</QCardSection>
|
||||
</QCard>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.add-icon {
|
||||
background-color: $primary;
|
||||
border-radius: 50px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Name: Nombre
|
||||
Phone: Teléfono
|
||||
Remove contact: Eliminar contacto
|
||||
Add contact: Añadir contacto
|
||||
</i18n>
|
|
@ -1,3 +1,217 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { useQuasar } from 'quasar';
|
||||
|
||||
import VnPaginate from 'src/components/ui/VnPaginate.vue';
|
||||
import ModalCloseContract from 'src/pages/Customer/components/ModalCloseContract.vue';
|
||||
import { toDate } from 'src/filters';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const quasar = useQuasar();
|
||||
|
||||
const vnPaginateRef = ref(null);
|
||||
const showQPageSticky = ref(true);
|
||||
|
||||
const filter = {
|
||||
order: 'finished ASC, started DESC',
|
||||
include: [
|
||||
{
|
||||
relation: 'insurances',
|
||||
scope: {
|
||||
fields: ['id', 'credit', 'created', 'grade'],
|
||||
order: 'created DESC',
|
||||
limit: 2,
|
||||
},
|
||||
},
|
||||
],
|
||||
where: { client: `${route.params.id}` },
|
||||
};
|
||||
|
||||
const fetch = (data) => {
|
||||
data.forEach((element) => {
|
||||
if (!element.finished) {
|
||||
showQPageSticky.value = false;
|
||||
return;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const toCustomerCreditContractsCreate = () => {
|
||||
router.push({ name: 'CustomerCreditContractsCreate' });
|
||||
};
|
||||
|
||||
const openDialog = (item) => {
|
||||
quasar.dialog({
|
||||
component: ModalCloseContract,
|
||||
componentProps: {
|
||||
id: item.id,
|
||||
promise: updateData,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const openViewCredit = (credit) => {
|
||||
router.push({
|
||||
name: 'CustomerCreditContractsInsurance',
|
||||
params: {
|
||||
creditId: credit.id,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const updateData = () => {
|
||||
vnPaginateRef.value?.fetch();
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex justify-center">Customer credit contracts</div>
|
||||
<QCard class="q-pa-lg">
|
||||
<VnPaginate
|
||||
:filter="filter"
|
||||
@on-fetch="fetch"
|
||||
auto-load
|
||||
data-key="CustomerCreditContracts"
|
||||
order="id DESC"
|
||||
ref="vnPaginateRef"
|
||||
url="CreditClassifications"
|
||||
jgallego
commented
cuando en la tabla creditClassification no hay dateEnd no muestra resultados, en salix sí lo hace. Además en este escenario es donde aparece en salix un candado para cerrar el contrato, cuando en la tabla creditClassification no hay dateEnd no muestra resultados, en salix sí lo hace. Además en este escenario es donde aparece en salix un candado para cerrar el contrato,
ejectura este update, ir a salix y copiar el funcionamiento en lilium
UPDATE vn.creditClassification
SET dateEnd=NULL
WHERE id=5
cfonseca
commented
Después de la prueba que hicimos en el daily todo funcionó correctamente, quedo pendiente por si debo hacer alguna corrección Después de la prueba que hicimos en el daily todo funcionó correctamente, quedo pendiente por si debo hacer alguna corrección
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<div v-if="rows.length">
|
||||
<QCard
|
||||
v-for="(item, index) in rows"
|
||||
:key="index"
|
||||
:class="{
|
||||
'customer-card': true,
|
||||
'q-mb-md': index < rows.length - 1,
|
||||
'is-active': !item.finished,
|
||||
}"
|
||||
>
|
||||
<QCardSection class="flex q-py-none">
|
||||
<div
|
||||
class="flex items-center q-ml-md cursor-pointer"
|
||||
v-if="!item.finished"
|
||||
>
|
||||
<QIcon
|
||||
@click.stop="openDialog(item)"
|
||||
color="primary"
|
||||
name="lock"
|
||||
size="md"
|
||||
>
|
||||
<QTooltip>{{ t('Close contract') }}</QTooltip>
|
||||
</QIcon>
|
||||
</div>
|
||||
|
||||
<div class="q-ml-lg">
|
||||
<div class="flex q-mb-xs">
|
||||
<div class="q-mr-sm label-color">
|
||||
{{ t('Since') }}:
|
||||
</div>
|
||||
<div class="text-weight-bold">
|
||||
{{ toDate(item.started) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="q-mr-sm label-color">{{ t('To') }}:</div>
|
||||
<div class="text-weight-bold">
|
||||
{{ toDate(item.finished) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</QCardSection>
|
||||
|
||||
<QSeparator class="q-mx-lg" vertical />
|
||||
|
||||
<div class="flex">
|
||||
<div class="flex items-center">
|
||||
<div class="flex q-mr-xl">
|
||||
<div class="q-mr-sm label-color">
|
||||
{{ t('Credit') }}:
|
||||
</div>
|
||||
<div class="text-weight-bold">
|
||||
{{ item.insurances[0].credit }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex q-mr-xl">
|
||||
<div class="q-mr-sm label-color">
|
||||
{{ t('Grade') }}:
|
||||
</div>
|
||||
<div class="text-weight-bold">
|
||||
{{ item.insurances[0].grade }}
|
||||
</div>
|
||||
</div>
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Si no tiene valor aparece vacío. En Salix aparece un "-" Si no tiene valor aparece vacío. En Salix aparece un "-"
cfonseca
commented
Corregido: Corregido: c0a9835e80
|
||||
<div class="flex">
|
||||
<div class="q-mr-sm label-color">
|
||||
{{ t('Date') }}:
|
||||
</div>
|
||||
<div class="text-weight-bold">
|
||||
{{ toDate(item.insurances[0].created) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center q-ml-lg q-mr-md cursor-pointer">
|
||||
<QIcon
|
||||
@click.stop="openViewCredit(item)"
|
||||
color="primary"
|
||||
name="preview"
|
||||
size="md"
|
||||
>
|
||||
<QTooltip>{{ t('View credits') }}</QTooltip>
|
||||
</QIcon>
|
||||
</div>
|
||||
</div>
|
||||
</QCard>
|
||||
</div>
|
||||
<h5 class="flex justify-center label-color" v-else>
|
||||
{{ t('globals.noResults') }}
|
||||
</h5>
|
||||
</template>
|
||||
</VnPaginate>
|
||||
</QCard>
|
||||
|
||||
<QPageSticky :offset="[18, 18]" v-if="showQPageSticky">
|
||||
<QBtn
|
||||
@click.stop="toCustomerCreditContractsCreate()"
|
||||
color="primary"
|
||||
fab
|
||||
icon="add"
|
||||
/>
|
||||
<QTooltip>
|
||||
{{ t('New contract') }}
|
||||
</QTooltip>
|
||||
</QPageSticky>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.label-color {
|
||||
color: var(--vn-label);
|
||||
}
|
||||
.customer-card {
|
||||
border: 2px solid var(--vn-light-gray);
|
||||
border-radius: 10px;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.is-active {
|
||||
background-color: var(--vn-light-gray);
|
||||
}
|
||||
</style>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Close contract: Cerrar contrato
|
||||
Since: Desde
|
||||
To: Hasta
|
||||
Credit: Crédito
|
||||
Grade: Grade
|
||||
Date: Fecha
|
||||
View credits: Ver créditos
|
||||
Created: Fecha creación
|
||||
New contract: Nuevo contrato
|
||||
</i18n>
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
<template>
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
No identifico el nuevo componente, sin embargo, faltan clearables No identifico el nuevo componente, sin embargo, faltan clearables
cfonseca
commented
Componente eliminado hace varios días Componente eliminado hace varios días
|
||||
<div class="flex justify-center">Credit management</div>
|
||||
</template>
|
|
@ -1,3 +1,75 @@
|
|||
<script setup>
|
||||
import { reactive, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
|
||||
const informationOptions = ref([]);
|
||||
|
||||
const filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'worker',
|
||||
scope: {
|
||||
fields: ['id'],
|
||||
include: { relation: 'user', scope: { fields: ['nickname'] } },
|
||||
},
|
||||
},
|
||||
],
|
||||
where: { clientFk: `${route.params.id}` },
|
||||
order: ['created DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const initialData = reactive({
|
||||
rating: null,
|
||||
recommendedCredit: null,
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex justify-center">Customer credit opinion</div>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (informationOptions = data)"
|
||||
auto-load
|
||||
url="ClientInformas"
|
||||
/>
|
||||
|
||||
<FormModel
|
||||
:form-initial-data="initialData"
|
||||
:observe-form-changes="false"
|
||||
:url-create="`Clients/${route.params.id}/setRating`"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<VnInput
|
||||
:label="t('Rating')"
|
||||
type="number"
|
||||
v-model.number="data.rating"
|
||||
/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInput
|
||||
jgallego
commented
no inserta, en salix añado una clasificacion ej: 234 sin credito recomendado, lo inserta y lo muestra bajo, no inserta, en salix añado una clasificacion ej: 234 sin credito recomendado, lo inserta y lo muestra bajo,
en lilium da un error y no lo muestra, aun teniendo datos en la tabla insertados via salix no son mostrados en lilium
cfonseca
commented
Hice la prueba y me muestra este error: message: "La razón social debe ir en mayúscula", fui a la pantalla de Datos fiscales y modifique el campo de Razón social y Dirección fiscal y ya con estos cambios se pudo guardar el valor de Clasificación en la pantalla de Opinión de crédito sin problemas, por favor revisar, quedo pendiente Hice la prueba y me muestra este error: **message: "La razón social debe ir en mayúscula"**, fui a la pantalla de **Datos fiscales** y modifique el campo de **Razón social** y **Dirección fiscal** y ya con estos cambios se pudo guardar el valor de **Clasificación** en la pantalla de **Opinión de crédito** sin problemas, por favor revisar, quedo pendiente
jsegarra
commented
@cfonseca Esto es lo que vimos en la daily antes de Luciano no? Puedes confirmar? Gracias @cfonseca Esto es lo que vimos en la daily antes de Luciano no? Puedes confirmar? Gracias
|
||||
:label="t('Recommended credit')"
|
||||
type="number"
|
||||
v-model.number="data.recommendedCredit"
|
||||
/>
|
||||
</div>
|
||||
</VnRow>
|
||||
</template>
|
||||
</FormModel>
|
||||
</template>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Rating: Clasificación
|
||||
Recommended credit: Crédito recomendado
|
||||
</i18n>
|
||||
|
|
|
@ -1,65 +1,52 @@
|
|||
<script setup>
|
||||
import { ref, computed, onBeforeMount } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { date, QBtn } from 'quasar';
|
||||
|
||||
import { toCurrency } from 'src/filters';
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const stateStore = useStateStore();
|
||||
|
||||
const arrayData = ref(null);
|
||||
const workerId = ref(0);
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
const workerId = ref(null);
|
||||
const rows = ref([]);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'worker',
|
||||
scope: {
|
||||
fields: ['id'],
|
||||
include: { relation: 'user', scope: { fields: ['name'] } },
|
||||
},
|
||||
const filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'worker',
|
||||
scope: {
|
||||
fields: ['id'],
|
||||
include: { relation: 'user', scope: { fields: ['name'] } },
|
||||
},
|
||||
],
|
||||
where: { clientFk: `${route.params.id}` },
|
||||
order: ['created DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
arrayData.value = useArrayData('CustomerCreditsCard', {
|
||||
url: 'ClientCredits',
|
||||
filter,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
},
|
||||
],
|
||||
where: { clientFk: `${route.params.id}` },
|
||||
order: ['created DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
created: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
employee: {
|
||||
component: QBtn,
|
||||
props: () => ({ flat: true, color: 'blue' }),
|
||||
event: (prop) => {
|
||||
selectWorkerId(prop.row.clientFk);
|
||||
},
|
||||
event: ({ row }) => (workerId.value = row.clientFk),
|
||||
},
|
||||
amount: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -86,16 +73,19 @@ const columns = computed(() => [
|
|||
},
|
||||
]);
|
||||
|
||||
const selectWorkerId = (id) => {
|
||||
workerId.value = id;
|
||||
};
|
||||
|
||||
const toCustomerCreditCreate = () => {
|
||||
router.push({ name: 'CustomerCreditCreate' });
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="ClientCredits"
|
||||
/>
|
||||
|
||||
<QPage class="column items-center q-pa-md">
|
||||
<QTable
|
||||
:columns="columns"
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<template>
|
||||
<div class="flex justify-center">Customer file management</div>
|
||||
</template>
|
|
@ -1,87 +1,70 @@
|
|||
<script setup>
|
||||
import { ref, computed, onBeforeMount } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { date, QBtn } from 'quasar';
|
||||
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { toCurrency } from 'src/filters';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const stateStore = useStateStore();
|
||||
|
||||
const arrayData = ref(null);
|
||||
const rows = ref([]);
|
||||
const totalAmount = ref(0);
|
||||
const workerId = ref(0);
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
const workerId = ref(null);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'greugeType',
|
||||
scope: {
|
||||
fields: ['id', 'name'],
|
||||
},
|
||||
const filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'greugeType',
|
||||
scope: {
|
||||
fields: ['id', 'name'],
|
||||
},
|
||||
{
|
||||
relation: 'user',
|
||||
scope: {
|
||||
fields: ['id', 'name'],
|
||||
},
|
||||
},
|
||||
],
|
||||
order: 'shipped DESC, amount',
|
||||
where: {
|
||||
clientFk: `${route.params.id}`,
|
||||
},
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
arrayData.value = useArrayData('CustomerGreugesCard', {
|
||||
url: 'greuges',
|
||||
filter,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
totalAmount.value = arrayData.value.store.data.reduce((accumulator, currentValue) => {
|
||||
return accumulator + currentValue.amount;
|
||||
}, 0);
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
{
|
||||
relation: 'user',
|
||||
scope: {
|
||||
fields: ['id', 'name'],
|
||||
},
|
||||
},
|
||||
],
|
||||
order: 'shipped DESC, amount',
|
||||
where: {
|
||||
clientFk: `${route.params.id}`,
|
||||
},
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
date: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
createdBy: {
|
||||
component: QBtn,
|
||||
props: () => ({ flat: true, color: 'blue' }),
|
||||
event: (prop) => {
|
||||
selectWorkerId(prop.row.clientFk);
|
||||
},
|
||||
event: ({ row }) => (workerId.value = row.clientFk),
|
||||
},
|
||||
comment: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
type: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
amount: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -120,8 +103,11 @@ const columns = computed(() => [
|
|||
},
|
||||
]);
|
||||
|
||||
const selectWorkerId = (id) => {
|
||||
workerId.value = id;
|
||||
const setRows = (data) => {
|
||||
rows.value = data;
|
||||
totalAmount.value = data.reduce((accumulator, currentValue) => {
|
||||
return accumulator + currentValue.amount;
|
||||
}, 0);
|
||||
};
|
||||
|
||||
const toCustomerGreugeCreate = () => {
|
||||
|
@ -130,6 +116,8 @@ const toCustomerGreugeCreate = () => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData :filter="filter" @on-fetch="setRows" auto-load url="greuges" />
|
||||
|
||||
<QPage class="column items-center q-pa-md">
|
||||
<QCard class="full-width" v-if="totalAmount">
|
||||
<h6 class="flex justify-end q-my-lg q-pr-lg">
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<script setup>
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
Revisar comentario. Revisar comentario.
Si este componente, está así porque no hay datos, utilizar el cliente 1102
cfonseca
commented
Corrección: Corrección: 08e072100b
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h5 class="flex justify-center label-color">
|
||||
{{ t('globals.noResults') }}
|
||||
</h5>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.label-color {
|
||||
color: var(--vn-label);
|
||||
}
|
||||
</style>
|
|
@ -1,3 +0,0 @@
|
|||
<template>
|
||||
<div class="flex justify-center">Others</div>
|
||||
</template>
|
|
@ -1,39 +1,24 @@
|
|||
<script setup>
|
||||
import { ref, computed, onBeforeMount } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { date, QBtn } from 'quasar';
|
||||
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { toCurrency } from 'src/filters';
|
||||
|
||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const stateStore = useStateStore();
|
||||
const rows = ref([]);
|
||||
|
||||
const arrayData = ref(null);
|
||||
const workerId = ref(0);
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const filter = {
|
||||
where: { clientFk: `${route.params.id}` },
|
||||
order: ['started DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
arrayData.value = useArrayData('CustomerRecoveriesCard', {
|
||||
url: 'Recoveries',
|
||||
filter,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
const filter = {
|
||||
where: { clientFk: `${route.params.id}` },
|
||||
order: ['started DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
since: {
|
||||
|
@ -94,6 +79,13 @@ const toCustomerRecoverieCreate = () => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="Recoveries"
|
||||
/>
|
||||
|
||||
<QPage class="column items-center q-pa-md">
|
||||
<QTable
|
||||
:columns="columns"
|
||||
|
@ -113,7 +105,6 @@ const toCustomerRecoverieCreate = () => {
|
|||
@click="tableColumnComponents[props.col.name].event(props)"
|
||||
>
|
||||
{{ props.value }}
|
||||
<WorkerDescriptorProxy :id="workerId" />
|
||||
</component>
|
||||
</QTr>
|
||||
</QTd>
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
<script setup>
|
||||
import { ref, computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import { date, QBtn } from 'quasar';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
const workerId = ref(null);
|
||||
const rows = ref([]);
|
||||
|
||||
const filter = {
|
||||
include: [
|
||||
{ relation: 'type', scope: { fields: ['code', 'description'] } },
|
||||
{ relation: 'user', scope: { fields: ['id', 'name'] } },
|
||||
{ relation: 'company', scope: { fields: ['code'] } },
|
||||
],
|
||||
where: { clientFk: route.params.id },
|
||||
order: ['created DESC'],
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
sent: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
description: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
worker: {
|
||||
component: QBtn,
|
||||
props: () => ({ flat: true, color: 'blue' }),
|
||||
event: ({ row }) => (workerId.value = row.clientFk),
|
||||
},
|
||||
company: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => (workerId.value = null),
|
||||
},
|
||||
};
|
||||
|
||||
const columns = computed(() => [
|
||||
{
|
||||
align: 'left',
|
||||
field: 'created',
|
||||
label: t('Sent'),
|
||||
name: 'sent',
|
||||
format: (value) => date.formatDate(value, 'DD/MM/YYYY hh:mm'),
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Duda, cuando actualicemos con dev no tendremos conflicto? Duda, cuando actualicemos con dev no tendremos conflicto?
wbuezas
commented
Se reemplazo Commit: Se reemplazo `toDateHourMinSec` por las nuevas utils ubicadas en `date.js`
Commit: https://gitea.verdnatura.es/verdnatura/salix-front/commit/c856adc8d0defb6c5574f9d6198ddcf2a28356c4
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
field: (value) => value.type.description,
|
||||
label: t('Description'),
|
||||
name: 'description',
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
field: (value) => value.user.name,
|
||||
label: t('Worker'),
|
||||
name: 'worker',
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
field: (value) => value.company.code,
|
||||
label: t('Company'),
|
||||
name: 'company',
|
||||
},
|
||||
]);
|
||||
|
||||
const toCustomerSamplesCreate = () => {
|
||||
router.push({ name: 'CustomerSamplesCreate' });
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="ClientSamples"
|
||||
/>
|
||||
|
||||
<QPage class="column items-center q-pa-md">
|
||||
<QTable
|
||||
:columns="columns"
|
||||
:pagination="{ rowsPerPage: 12 }"
|
||||
:rows="rows"
|
||||
class="full-width q-mt-md"
|
||||
row-key="id"
|
||||
v-if="rows?.length"
|
||||
>
|
||||
<template #body-cell="props">
|
||||
<QTd :props="props">
|
||||
<QTr :props="props" class="cursor-pointer">
|
||||
<component
|
||||
:is="tableColumnComponents[props.col.name].component"
|
||||
class="col-content"
|
||||
v-bind="tableColumnComponents[props.col.name].props(props)"
|
||||
@click="tableColumnComponents[props.col.name].event(props)"
|
||||
>
|
||||
{{ props.value }}
|
||||
<WorkerDescriptorProxy :id="workerId" />
|
||||
</component>
|
||||
</QTr>
|
||||
</QTd>
|
||||
</template>
|
||||
</QTable>
|
||||
|
||||
<QCard class="full-width" v-else>
|
||||
<h5 class="flex justify-center label-color">
|
||||
{{ t('globals.noResults') }}
|
||||
</h5>
|
||||
</QCard>
|
||||
</QPage>
|
||||
|
||||
<QPageSticky :offset="[18, 18]">
|
||||
<QBtn @click.stop="toCustomerSamplesCreate()" color="primary" fab icon="add" />
|
||||
<QTooltip>
|
||||
{{ t('Send sample') }}
|
||||
</QTooltip>
|
||||
</QPageSticky>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.consignees-card {
|
||||
border: 2px solid var(--vn-light-gray);
|
||||
border-radius: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.label-color {
|
||||
color: var(--vn-label);
|
||||
}
|
||||
</style>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Sent: Enviado
|
||||
Description: Descripción
|
||||
Worker: Trabajador
|
||||
Company: Empresa
|
||||
Send sample: Enviar plantilla
|
||||
</i18n>
|
|
@ -0,0 +1,3 @@
|
|||
<template>
|
||||
<div class="flex justify-center">Customer unpaid</div>
|
||||
</template>
|
|
@ -21,40 +21,42 @@ const filter = { where: { id: `${route.params.id}` } };
|
|||
model="client"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<div
|
||||
v-for="(item, index) in data"
|
||||
:key="index"
|
||||
:class="{
|
||||
'q-mb-md': index < data.length - 1,
|
||||
}"
|
||||
>
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<QCheckbox
|
||||
:label="t('Enable web access')"
|
||||
v-model="item.active"
|
||||
/>
|
||||
</div>
|
||||
</VnRow>
|
||||
<div v-if="data?.length">
|
||||
<div
|
||||
v-for="(item, index) in data"
|
||||
:key="index"
|
||||
:class="{
|
||||
'q-mb-md': index < data.length - 1,
|
||||
}"
|
||||
>
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<QCheckbox
|
||||
:label="t('Enable web access')"
|
||||
v-model="item.active"
|
||||
/>
|
||||
</div>
|
||||
</VnRow>
|
||||
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<VnInput :label="t('User')" v-model="item.name" />
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInput :label="t('Recovery email')" v-model="item.email">
|
||||
<template #append>
|
||||
<QIcon name="info" class="cursor-pointer">
|
||||
<QTooltip>{{
|
||||
t(
|
||||
'This email is used for user to regain access their account'
|
||||
)
|
||||
}}</QTooltip>
|
||||
</QIcon>
|
||||
</template>
|
||||
</VnInput>
|
||||
</div>
|
||||
</VnRow>
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<VnInput :label="t('User')" v-model="item.name" />
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInput :label="t('Recovery email')" v-model="item.email">
|
||||
<template #append>
|
||||
<QIcon name="info" class="cursor-pointer">
|
||||
<QTooltip>{{
|
||||
t(
|
||||
'This email is used for user to regain access their account'
|
||||
)
|
||||
}}</QTooltip>
|
||||
</QIcon>
|
||||
</template>
|
||||
</VnInput>
|
||||
</div>
|
||||
</VnRow>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</FormModel>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<script setup>
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
Usar el cliente 1101 Usar el cliente 1101
cfonseca
commented
Corrección: Corrección: 08e072100b
jsegarra
commented
Los iconos de la columna estado, al hacer hover cambia el cursor induciendo a error al usuario porque parece que se pueda hacer una acción. Los iconos de la columna estado, al hacer hover cambia el cursor induciendo a error al usuario porque parece que se pueda hacer una acción.
El tooltip de icono de la ultima columna( mas a la derecha), no corresponde. en salix es "confirmar transaccion" y en la PR es Transacción confirmada"
cfonseca
commented
Corregido: Corregido: bb10714824
jsegarra
commented
Revisar Revisar
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h5 class="flex justify-center label-color">
|
||||
{{ t('globals.noResults') }}
|
||||
</h5>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
.label-color {
|
||||
color: var(--vn-label);
|
||||
}
|
||||
</style>
|
|
@ -1,13 +1,12 @@
|
|||
<script setup>
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
En el formulario de crear customer o basic-data, hemos encontrado que el campo email permite añadir cualquier formato. Propuesta, añadir type="email" En el formulario de crear customer o basic-data, hemos encontrado que el campo email permite añadir cualquier formato. Propuesta, añadir type="email"
Este campo email, tampoco tiene el icono de info
cfonseca
commented
Corregido: Corregido: 3cf3687b84
jsegarra
commented
El formulario de crear customer no tiene el mismo formato que en Salix El formulario de crear customer no tiene el mismo formato que en Salix
cfonseca
commented
Corregido: Corregido: 17a0afda73
|
||||
import { ref, computed, onBeforeMount } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
En customer/1112/summary, en el componente descriptor tenemos:
En esa misma ruta pero en la parte central, no se visualiza la tabla de "Últimos tickets" En customer/1112/summary, en el componente descriptor tenemos:
1. Falta el icono de Sin acceso web
2. Riesgo debería tener un icono de información.
3. Faltan los botones de hacer nueva compra y añadir usuario.
4. Los 3 puntos con las acciones
En esa misma ruta pero en la parte central, no se visualiza la tabla de "Últimos tickets"
cfonseca
commented
Corregido: Corregido: 17a0afda73
jsegarra
commented
El icono de información de riesgo, no lo veo añadido...es correcto? El icono de información de riesgo, no lo veo añadido...es correcto?
cfonseca
commented
Se agrega icono faltante: Se agrega icono faltante: d0cf13d0af
jsegarra
commented
Riesgo está repetido 2 veces. En uno está el icono y el otro no. quitar el que corresponda Riesgo está repetido 2 veces. En uno está el icono y el otro no. quitar el que corresponda
|
||||
import { useI18n } from 'vue-i18n';
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
En el formulario de basic-data: En el formulario de basic-data:
El campo cliente anterior no aparece
cfonseca
commented
Corregido: Corregido: 3cf3687b84
|
||||
|
||||
import { QBtn, QCheckbox, useQuasar } from 'quasar';
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
En fiscal-data, los campos: razón social, vies y recargo de equivalencia deberían tener el icono de info. En billing-data, iban tampoco tiene. En fiscal-data, los campos: razón social, vies y recargo de equivalencia deberían tener el icono de info.
En billing-data, iban tampoco tiene.
cfonseca
commented
Corregido: Corregido: 11eb597fa3
jsegarra
commented
Carlos, en el comentario anterior indicaba sugerencias para fiscal-data y billing-data. Carlos, en el comentario anterior indicaba sugerencias para fiscal-data y billing-data.
Billing-data, el campo IBAN sigue sin tener icono
cfonseca
commented
No se hace ninguna corrección, se hace el commit: No se hace ninguna corrección, se hace el commit: 6bf9b7c0c8 solo deshaciendo los cambios que se hicieron en el commit 11eb597fa3, quedando exactamente igual que antes del comentario.
|
||||
|
||||
import { toCurrency, toDate } from 'filters/index';
|
||||
jsegarra
commented
Revisar los campos de los formularios de datos básicos, datos fiscales, formas de pago y consignatarios porque hay muchos campos que no tienen añadida la funcionalidad de clearable. Revisar los campos de los formularios de datos básicos, datos fiscales, formas de pago y consignatarios porque hay muchos campos que no tienen añadida la funcionalidad de clearable.
No pongo el nombre de cada campo de cada vista porque, como digo, son muchos.
cfonseca
commented
Corregidos todos los de Customer: Corregidos todos los de Customer: 7f1c4690e8
jsegarra
commented
Basic-data: comercialm canal de contacto, tipo de negocio. Son desplegables y otro campos similares si que tienen esa acción. Basic-data: comercialm canal de contacto, tipo de negocio. Son desplegables y otro campos similares si que tienen esa acción.
Habria que revisar porque en VnSelectAction/VnSelectCreate/VnSelectDialog lo añadimos pero no funciona, pero creo que esa pelota no está en vuestro tejado.
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import CustomerNotificationsFilter from './CustomerDefaulterFilter.vue';
|
||||
import CustomerBalanceDueTotal from './CustomerBalanceDueTotal.vue';
|
||||
import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
|
||||
|
@ -16,16 +15,13 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
|||
import CustomerDefaulterAddObservation from './CustomerDefaulterAddObservation.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const stateStore = useStateStore();
|
||||
const quasar = useQuasar();
|
||||
|
||||
const arrayData = ref(null);
|
||||
const balanceDueTotal = ref(0);
|
||||
const customerId = ref(0);
|
||||
const selected = ref([]);
|
||||
const workerId = ref(0);
|
||||
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
const rows = ref([]);
|
||||
|
||||
const tableColumnComponents = {
|
||||
client: {
|
||||
|
@ -156,23 +152,11 @@ const columns = computed(() => [
|
|||
},
|
||||
]);
|
||||
|
||||
onBeforeMount(() => {
|
||||
getArrayData();
|
||||
});
|
||||
|
||||
const getArrayData = async () => {
|
||||
arrayData.value = useArrayData('CustomerDefaulter', {
|
||||
url: 'Defaulters/filter',
|
||||
limit: 0,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
balanceDueTotal.value = arrayData.value.store.data.reduce(
|
||||
(accumulator, currentValue) => {
|
||||
return accumulator + (currentValue['amount'] || 0);
|
||||
},
|
||||
0
|
||||
);
|
||||
stateStore.rightDrawer = true;
|
||||
const setRows = (data) => {
|
||||
rows.value = data;
|
||||
balanceDueTotal.value = data.reduce((accumulator, currentValue) => {
|
||||
return accumulator + (currentValue['amount'] || 0);
|
||||
}, 0);
|
||||
};
|
||||
|
||||
const selectCustomerId = (id) => {
|
||||
|
@ -196,12 +180,19 @@ const viewAddObservation = (rowsSelected) => {
|
|||
};
|
||||
|
||||
const refreshData = () => {
|
||||
getArrayData();
|
||||
setRows();
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="Defaulters/filter"
|
||||
/>
|
||||
|
||||
<QDrawer side="right" :width="256" show-if-above>
|
||||
<QScrollArea class="fit text-grey-8">
|
||||
<CustomerNotificationsFilter data-key="CustomerDefaulter" />
|
||||
</QScrollArea>
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
<script setup>
|
||||
import { ref, computed, onBeforeMount, onMounted } from 'vue';
|
||||
import { ref, computed, onMounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
import { QBtn, QIcon } from 'quasar';
|
||||
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { dashIfEmpty, toDate } from 'src/filters';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
|
||||
import CustomerExtendedListActions from './CustomerExtendedListActions.vue';
|
||||
|
@ -11,24 +16,15 @@ import CustomerExtendedListFilter from './CustomerExtendedListFilter.vue';
|
|||
import TableVisibleColumns from 'src/components/common/TableVisibleColumns.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
import { dashIfEmpty, toDate } from 'src/filters';
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
const stateStore = useStateStore();
|
||||
|
||||
const arrayData = ref(null);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
arrayData.value = useArrayData('CustomerExtendedList', {
|
||||
url: 'Clients/extendedListFilter',
|
||||
limit: 0,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
const allColumnNames = ref([]);
|
||||
const rows = ref([]);
|
||||
const selectedCustomerId = ref(0);
|
||||
const selectedSalesPersonId = ref(0);
|
||||
const visibleColumns = ref([]);
|
||||
|
||||
onMounted(() => {
|
||||
const filteredColumns = columns.value.filter(
|
||||
|
@ -37,13 +33,6 @@ onMounted(() => {
|
|||
allColumnNames.value = filteredColumns.map((col) => col.name);
|
||||
});
|
||||
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
|
||||
const selectedCustomerId = ref(0);
|
||||
const selectedSalesPersonId = ref(0);
|
||||
const allColumnNames = ref([]);
|
||||
const visibleColumns = ref([]);
|
||||
|
||||
const tableColumnComponents = {
|
||||
customerStatus: {
|
||||
component: QIcon,
|
||||
|
@ -491,6 +480,13 @@ const selectSalesPersonId = (id) => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="Clients/extendedListFilter"
|
||||
/>
|
||||
|
||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||
<QScrollArea class="fit text-grey-8">
|
||||
<CustomerExtendedListFilter
|
||||
|
|
|
@ -1,32 +1,17 @@
|
|||
<script setup>
|
||||
import { ref, computed, onBeforeMount } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import { QBtn } from 'quasar';
|
||||
|
||||
import { useArrayData } from 'composables/useArrayData';
|
||||
import { useStateStore } from 'stores/useStateStore';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import CustomerNotificationsFilter from './CustomerNotificationsFilter.vue';
|
||||
import CustomerDescriptorProxy from '../Card/CustomerDescriptorProxy.vue';
|
||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const stateStore = useStateStore();
|
||||
|
||||
const arrayData = ref(null);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
arrayData.value = useArrayData('CustomerNotifications', {
|
||||
url: 'Clients',
|
||||
limit: 0,
|
||||
});
|
||||
await arrayData.value.fetch({ append: false });
|
||||
stateStore.rightDrawer = true;
|
||||
});
|
||||
|
||||
const rows = computed(() => arrayData.value.store.data);
|
||||
|
||||
const rows = ref([]);
|
||||
const selected = ref([]);
|
||||
const selectedCustomerId = ref(0);
|
||||
|
||||
|
@ -97,7 +82,14 @@ const selectCustomerId = (id) => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="Clients"
|
||||
/>
|
||||
|
||||
<QDrawer side="right" :width="256" show-if-above>
|
||||
<QScrollArea class="fit text-grey-8">
|
||||
<CustomerNotificationsFilter data-key="CustomerNotifications" />
|
||||
</QScrollArea>
|
||||
|
|
|
@ -321,7 +321,7 @@ const onDataSaved = () => {
|
|||
size="sm"
|
||||
>
|
||||
<QTooltip>
|
||||
{{ t('Remove') }}
|
||||
{{ t('Remove note') }}
|
||||
</QTooltip>
|
||||
</QIcon>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
<script setup>
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
En customer/1112/credits , el descriptor de la columna empleado, no está cogiendo el código del empleado sino del cliente. En customer/1112/credits , el descriptor de la columna empleado, no está cogiendo el código del empleado sino del cliente.
Para el mismo cliente, en salix, está llamando a /api/Workers/100
cfonseca
commented
Corregido: Corregido: 11eb597fa3
|
||||
import { reactive } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
const initialData = reactive({
|
||||
clientFK: Number(route.params.id),
|
||||
});
|
||||
|
||||
const onDataSaved = () => {
|
||||
router.push({ name: 'CustomerCreditContractsCreate' });
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FormModel
|
||||
:form-initial-data="initialData"
|
||||
:observe-form-changes="false"
|
||||
:default-actions="true"
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
Por defecto, el valor es true, así que creo que no es necesario definirla Por defecto, el valor es true, así que creo que no es necesario definirla
cfonseca
commented
Corregido: Corregido: 38d3d49ecb
|
||||
url-create="creditClassifications/createWithInsurance"
|
||||
@on-data-saved="onDataSaved()"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Los campos nos son clearables Los campos nos son clearables
cfonseca
commented
Corregido: Corregido: 7f1c4690e8
|
||||
<div class="col">
|
||||
<VnInput
|
||||
:label="t('Credit')"
|
||||
type="number"
|
||||
v-model.number="data.credit"
|
||||
/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInput
|
||||
:label="t('Grade')"
|
||||
type="number"
|
||||
v-model.number="data.grade"
|
||||
/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInputDate :label="t('Since')" v-model="data.started" />
|
||||
</div>
|
||||
</VnRow>
|
||||
</template>
|
||||
</FormModel>
|
||||
</template>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Credit: Crédito
|
||||
Grade: Grade
|
||||
Since: Desde
|
||||
</i18n>
|
|
@ -0,0 +1,105 @@
|
|||
<script setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import { date } from 'quasar';
|
||||
|
||||
import { toCurrency } from 'src/filters';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
|
||||
const rows = ref([]);
|
||||
|
||||
const filter = {
|
||||
where: {
|
||||
creditClassificationFk: `${route.params.creditId}`,
|
||||
},
|
||||
limit: 20,
|
||||
};
|
||||
|
||||
const tableColumnComponents = {
|
||||
created: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
},
|
||||
grade: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
},
|
||||
credit: {
|
||||
component: 'span',
|
||||
props: () => {},
|
||||
event: () => {},
|
||||
},
|
||||
};
|
||||
|
||||
const columns = computed(() => [
|
||||
{
|
||||
align: 'left',
|
||||
field: 'created',
|
||||
format: (value) => date.formatDate(value, 'DD/MM/YYYY'),
|
||||
label: t('Created'),
|
||||
name: 'created',
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
field: 'grade',
|
||||
label: t('Grade'),
|
||||
name: 'grade',
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
field: 'credit',
|
||||
format: (value) => toCurrency(value),
|
||||
label: t('Credit'),
|
||||
name: 'credit',
|
||||
},
|
||||
]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<FetchData
|
||||
:filter="filter"
|
||||
@on-fetch="(data) => (rows = data)"
|
||||
auto-load
|
||||
url="CreditInsurances"
|
||||
/>
|
||||
|
||||
<QPage class="column items-center q-pa-md">
|
||||
<QTable
|
||||
:columns="columns"
|
||||
:pagination="{ rowsPerPage: 12 }"
|
||||
:rows="rows"
|
||||
class="full-width q-mt-md"
|
||||
row-key="id"
|
||||
>
|
||||
<template #body-cell="props">
|
||||
<QTd :props="props">
|
||||
<QTr :props="props" class="cursor-pointer">
|
||||
<component
|
||||
:is="tableColumnComponents[props.col.name].component"
|
||||
class="col-content"
|
||||
v-bind="tableColumnComponents[props.col.name].props(props)"
|
||||
@click="tableColumnComponents[props.col.name].event(props)"
|
||||
>
|
||||
{{ props.value }}
|
||||
</component>
|
||||
</QTr>
|
||||
</QTd>
|
||||
</template>
|
||||
</QTable>
|
||||
</QPage>
|
||||
</template>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Created: Fecha creación
|
||||
Grade: Grade
|
||||
Credit: Crédito
|
||||
</i18n>
|
|
@ -1,5 +1,5 @@
|
|||
<script setup>
|
||||
import { reactive, ref } from 'vue';
|
||||
import { reactive } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
|
|
|
@ -3,6 +3,8 @@ import { onBeforeMount, reactive, ref } from 'vue';
|
|||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import { useDialogPluginComponent } from 'quasar';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
|
@ -12,6 +14,7 @@ import VnInput from 'src/components/common/VnInput.vue';
|
|||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const { dialogRef } = useDialogPluginComponent();
|
||||
|
||||
const $props = defineProps({
|
||||
companyId: {
|
||||
|
|
|
@ -0,0 +1,240 @@
|
|||
<script setup>
|
||||
jsegarra
commented
Revisar fecha de enviado y worker descriptor Revisar fecha de enviado y worker descriptor
En el create, revisar clearable
cfonseca
commented
Corregido: Corregido: 7f1c4690e8
jsegarra
commented
Aparece el botón de vista previa, sin embargo, el formato del layout no es el estándar Aparece el botón de vista previa, sin embargo, el formato del layout no es el estándar
cfonseca
commented
Corregido: Corregido: ebd1ee07f4
jsegarra
commented
@alexm @jgallego El funcionamiento del botón de restaurar, es correcto? cuando le pulsas, te elimina los campos del destinatario y responder a. Esta funcionalidad no está en Salix, por lo que quedaría por validar @alexm @jgallego El funcionamiento del botón de restaurar, es correcto? cuando le pulsas, te elimina los campos del destinatario y responder a. Esta funcionalidad no está en Salix, por lo que quedaría por validar
jgallego
commented
Restaurar debe dejar el formulario como estaba cuando el usuario lo abrió, no se si con esto respondo a la pregunta. Restaurar debe dejar el formulario como estaba cuando el usuario lo abrió, no se si con esto respondo a la pregunta.
jsegarra
commented
@cfonseca Revisar restaurar en Consignees(customer/1101/adrress/create porque el campo Ubicación nose refresca. Antes si que iba bien, pero trayéndote los cambios se ha quedado por validar esto. Hay 4 ocurrencias de ese mismo componente, revisa las 4 y volvemos a revisar, ok? @cfonseca Revisar restaurar en Consignees(customer/1101/adrress/create porque el campo Ubicación nose refresca.
Antes si que iba bien, pero trayéndote los cambios se ha quedado por validar esto.
Hay 4 ocurrencias de ese mismo componente, revisa las 4 y volvemos a revisar, ok?
jsegarra
commented
Sigue sin ir del todo fino, adjunto video por el grupo. Sigue sin ir del todo fino, adjunto video por el grupo.
cfonseca
commented
Corregido: Corregido: 5ff90d127b
jsegarra
commented
Hay veces que los botones desaparecen, cambias de sección y sale error. Hay veces que los botones desaparecen, cambias de sección y sale error.
Siempre me sale en vista previa, el documento de Incoterms
wbuezas
commented
Problema de error al cambiar sección y desaparición de botones resuelto. Se fixea la vista previa del documento. Problema de error al cambiar sección y desaparición de botones resuelto.
Commit: https://gitea.verdnatura.es/verdnatura/salix-front/commit/87f376464b7da1309d1ce2fb98adc1d043458570
Se fixea la vista previa del documento.
Commit: https://gitea.verdnatura.es/verdnatura/salix-front/commit/ec2604b9abf3e8d6ee137e2e3f61491078c29456
|
||||
import { onBeforeMount, reactive, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import axios from 'axios';
|
||||
|
||||
import { useState } from 'src/composables/useState';
|
||||
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import FormModel from 'components/FormModel.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const state = useState();
|
||||
const user = state.getUser();
|
||||
|
||||
const optionsEmailUsers = ref([]);
|
||||
const optionsClientsAddressess = ref([]);
|
||||
const optionsCompanies = ref([]);
|
||||
const optionsSamplesVisible = ref([]);
|
||||
const sampleType = ref(0);
|
||||
|
||||
const filterEmailUsers = { where: { userFk: user.value.id } };
|
||||
const filterClientsAddresses = {
|
||||
include: [
|
||||
{ relation: 'province', scope: { fields: ['name'] } },
|
||||
{ relation: 'agencyMode', scope: { fields: ['name'] } },
|
||||
],
|
||||
};
|
||||
const filterCompanies = { order: ['code'] };
|
||||
const filterSamplesVisible = {
|
||||
fields: [
|
||||
'id',
|
||||
'code',
|
||||
'description',
|
||||
'model',
|
||||
'hasCompany',
|
||||
'hasAddress',
|
||||
'hasPreview',
|
||||
'datepickerEnabled',
|
||||
],
|
||||
order: ['description'],
|
||||
};
|
||||
const initialData = reactive({});
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const { companyFk } = user.value;
|
||||
const { data } = await axios.get(`Clients/1/getCard`);
|
||||
initialData.addressId = data.defaultAddressFk;
|
||||
initialData.clientFk = route.params.id;
|
||||
initialData.companyFk = companyFk;
|
||||
initialData.companyId = companyFk;
|
||||
initialData.recipient = data.email;
|
||||
});
|
||||
|
||||
const setEmailUser = (data) => {
|
||||
optionsEmailUsers.value = data;
|
||||
initialData.replyTo = data[0]?.email;
|
||||
};
|
||||
|
||||
const setSampleType = (sampleId) => {
|
||||
sampleType.value = optionsSamplesVisible.value.find(
|
||||
(option) => option.id === sampleId
|
||||
);
|
||||
};
|
||||
|
||||
const onDataSaved = async ({
|
||||
addressId,
|
||||
companyFk,
|
||||
companyId,
|
||||
from,
|
||||
recipient,
|
||||
replyTo,
|
||||
}) => {
|
||||
await axios.post(`Clients/${route.params.id}/incoterms-authorization-email`, {
|
||||
addressId,
|
||||
companyFk,
|
||||
companyId,
|
||||
from,
|
||||
recipient,
|
||||
replyTo,
|
||||
});
|
||||
router.push({ name: 'CustomerSamples' });
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<fetch-data
|
||||
:filter="filterEmailUsers"
|
||||
@on-fetch="setEmailUser"
|
||||
auto-load
|
||||
url="EmailUsers"
|
||||
/>
|
||||
<fetch-data
|
||||
:filter="filterClientsAddresses"
|
||||
:url="`Clients/${route.params.id}/addresses`"
|
||||
@on-fetch="(data) => (optionsClientsAddressess = data)"
|
||||
auto-load
|
||||
/>
|
||||
<fetch-data
|
||||
:filter="filterCompanies"
|
||||
@on-fetch="(data) => (optionsCompanies = data)"
|
||||
auto-load
|
||||
url="Companies"
|
||||
/>
|
||||
<fetch-data
|
||||
:filter="filterSamplesVisible"
|
||||
@on-fetch="(data) => (optionsSamplesVisible = data)"
|
||||
auto-load
|
||||
jgallego
commented
abrir como en salix que es mas ancho, mas similar a un dina4 que es lo que intuitivamente espera el usuario abrir como en salix que es mas ancho, mas similar a un dina4 que es lo que intuitivamente espera el usuario
cfonseca
commented
Corregido: Corregido: 90ee50eab5
jsegarra
commented
Yo lo veo OK Yo lo veo OK
|
||||
url="Samples/visible"
|
||||
/>
|
||||
|
||||
<FormModel
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
No hay botón de vista previa No hay botón de vista previa
cfonseca
commented
Corregido: Corregido: d0e98010a5
jsegarra
commented
Aparece el botón de vista previa, sin embargo, el formato del layout no es el estándar Aparece el botón de vista previa, sin embargo, el formato del layout no es el estándar
cfonseca
commented
Corregido: Corregido: ebd1ee07f4
jsegarra
commented
Revisar ya que el boton de vista previa está activo a pesar de no tener seleccionada la plantilla. Revisar ya que el boton de vista previa está activo a pesar de no tener seleccionada la plantilla.
Si haces F5, el campo plantilla, por defecto no está seleccionada y el boton desactivado, eso está OK.
|
||||
:form-initial-data="initialData"
|
||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
Cuando se muestra el campo dirección,. no muestra el nombre del consignatario sino otro valor Cuando se muestra el campo dirección,. no muestra el nombre del consignatario sino otro valor
La label del campo debería ser consignatario
¿Debería tener el icono del lápiz para editar dirección? @alexm
cfonseca
commented
Corrección: Corrección: 08e072100b
|
||||
:observe-form-changes="false"
|
||||
@on-data-saved="onDataSaved"
|
||||
model="client"
|
||||
url-create="ClientSamples"
|
||||
>
|
||||
<template #form="{ data }">
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<VnSelectFilter
|
||||
:label="t('Sample')"
|
||||
:options="optionsSamplesVisible"
|
||||
@update:model-value="setSampleType"
|
||||
hide-selected
|
||||
option-label="description"
|
||||
option-value="id"
|
||||
required="true"
|
||||
v-model="data.typeFk"
|
||||
/>
|
||||
</div>
|
||||
</VnRow>
|
||||
|
||||
<VnRow class="row q-gutter-md q-mb-md">
|
||||
<div class="col">
|
||||
<VnInput
|
||||
:label="t('Recipient')"
|
||||
required="true"
|
||||
v-model="data.recipient"
|
||||
>
|
||||
<template #append>
|
||||
<QIcon name="info" class="cursor-pointer">
|
||||
<QTooltip>{{
|
||||
t('Its only used when sample is sent')
|
||||
}}</QTooltip>
|
||||
</QIcon>
|
||||
</template>
|
||||
</VnInput>
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnInput
|
||||
:label="t('Reply to')"
|
||||
required="true"
|
||||
v-model="data.replyTo"
|
||||
>
|
||||
<template #append>
|
||||
<QIcon name="info" class="cursor-pointer">
|
||||
<QTooltip>{{
|
||||
t('To who should the recipient replay?')
|
||||
}}</QTooltip>
|
||||
</QIcon>
|
||||
</template>
|
||||
</VnInput>
|
||||
</div>
|
||||
</VnRow>
|
||||
|
||||
<VnRow
|
||||
class="row q-gutter-md q-mb-md"
|
||||
v-if="sampleType.hasCompany || sampleType.datepickerEnabled"
|
||||
>
|
||||
<div class="col">
|
||||
<VnSelectFilter
|
||||
:label="t('Company')"
|
||||
:options="optionsCompanies"
|
||||
hide-selected
|
||||
option-label="code"
|
||||
option-value="id"
|
||||
required="true"
|
||||
v-model="data.companyFk"
|
||||
v-if="sampleType.hasCompany"
|
||||
/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<VnSelectFilter
|
||||
:label="t('Address')"
|
||||
:options="optionsClientsAddressess"
|
||||
hide-selected
|
||||
option-label="nickname"
|
||||
option-value="id"
|
||||
required="true"
|
||||
v-model="data.addressId"
|
||||
v-if="sampleType.id === 20"
|
||||
>
|
||||
<template #option="scope">
|
||||
<QItem v-bind="scope.itemProps">
|
||||
<QItemSection>
|
||||
<QItemLabel>
|
||||
{{
|
||||
`${scope.opt.nickname}, ${scope.opt.street}, ${scope.opt.city}, ${scope.opt.province.name} - ${scope.opt.agencyMode.name}`
|
||||
}}
|
||||
</QItemLabel>
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
</template>
|
||||
</VnSelectFilter>
|
||||
</div>
|
||||
</VnRow>
|
||||
|
||||
<VnRow class="row q-gutter-md q-mb-md" v-if="sampleType.datepickerEnabled">
|
||||
<div class="col">
|
||||
<VnInputDate
|
||||
:label="t('Since')"
|
||||
required="true"
|
||||
v-model="data.from"
|
||||
/>
|
||||
</div>
|
||||
</VnRow>
|
||||
</template>
|
||||
</FormModel>
|
||||
</template>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Sample: Plantilla
|
||||
Recipient: Destinatario
|
||||
Reply to: Responder a
|
||||
Company: Empresa
|
||||
Address: Dirección
|
||||
Since: Desde
|
||||
Its only used when sample is sent: Se utiliza únicamente cuando se envía la plantilla
|
||||
To who should the recipient replay?: ¿A quien debería responder el destinatario?
|
||||
</i18n>
|
|
@ -0,0 +1,73 @@
|
|||
<script setup>
|
||||
jsegarra marked this conversation as resolved
jsegarra
commented
Se que no es este archivo, pero está relacionado. Se que no es este archivo, pero está relacionado.
El candado de "cerrar contrato" no está en línea con el texto y le falta el relleno.
Ver adjunto
cfonseca
commented
Corregido: Corregido: 38d3d49ecb
|
||||
import { ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
import axios from 'axios';
|
||||
import { useDialogPluginComponent } from 'quasar';
|
||||
|
||||
const { t } = useI18n();
|
||||
const { dialogRef } = useDialogPluginComponent();
|
||||
|
||||
const closeButton = ref(null);
|
||||
|
||||
const $props = defineProps({
|
||||
id: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
promise: {
|
||||
type: Function,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
const isLoading = ref(false);
|
||||
|
||||
const saveData = async () => {
|
||||
const timestamp = new Date().getTime();
|
||||
const payload = {
|
||||
finished: timestamp,
|
||||
};
|
||||
await axios.patch(`CreditClassifications/${$props.id}`, payload);
|
||||
$props.promise();
|
||||
closeButton.value.click();
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QDialog ref="dialogRef">
|
||||
<QCard class="q-pa-sm">
|
||||
<span
|
||||
ref="closeButton"
|
||||
class="flex justify-end cursor-pointer q-mb-sm"
|
||||
v-close-popup
|
||||
>
|
||||
<QIcon name="close" size="sm" />
|
||||
</span>
|
||||
|
||||
<QCardSection>
|
||||
<div class="text-h6 q-mb-sm">
|
||||
{{ t('Are you sure you want to close this contract?') }}
|
||||
</div>
|
||||
<div class="q-mb-sm">{{ t('Close contract') }}</div>
|
||||
</QCardSection>
|
||||
|
||||
<QCardActions align="right">
|
||||
<QBtn :label="t('globals.cancel')" color="primary" flat v-close-popup />
|
||||
<QBtn
|
||||
:label="t('globals.confirm')"
|
||||
color="primary"
|
||||
:loading="isLoading"
|
||||
@click="saveData"
|
||||
unelevated
|
||||
/>
|
||||
</QCardActions>
|
||||
</QCard>
|
||||
</QDialog>
|
||||
</template>
|
||||
|
||||
<i18n>
|
||||
es:
|
||||
Are you sure you want to close this contract?: ¿Seguro que quieres cerrar este contrato?
|
||||
Close contract: Cerrar contrato
|
||||
</i18n>
|
|
@ -365,8 +365,6 @@ export default {
|
|||
},
|
||||
],
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerCreditManagement.vue'),
|
||||
children: [
|
||||
{
|
||||
path: 'credit-contracts',
|
||||
|
@ -380,6 +378,41 @@ export default {
|
|||
'src/pages/Customer/Card/CustomerCreditContracts.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'credit-contracts',
|
||||
name: 'CreditContractsCard',
|
||||
redirect: { name: 'CustomerCreditContracts' },
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
name: 'CustomerCreditContracts',
|
||||
meta: {
|
||||
title: 'creditContracts',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/Card/CustomerCreditContracts.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'create',
|
||||
name: 'CustomerCreditContractsCreate',
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/components/CustomerCreditContractsCreate.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'insurance/:creditId',
|
||||
name: 'CustomerCreditContractsInsurance',
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/components/CustomerCreditContractsInsurance.vue'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'credit-opinion',
|
||||
name: 'CustomerCreditOpinion',
|
||||
|
@ -394,15 +427,178 @@ export default {
|
|||
},
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
path: 'others',
|
||||
name: 'CustomerOthers',
|
||||
meta: {
|
||||
jgallego
commented
en salix al abrir este menu el scroll baja para poder ver directamente las opciones desplegadas, copiar funcionamiento. en salix al abrir este menu el scroll baja para poder ver directamente las opciones desplegadas, copiar funcionamiento.
cfonseca
commented
Corregido: Corregido: c767bcde7d
|
||||
title: 'others',
|
||||
icon: 'pending',
|
||||
menuChildren: [
|
||||
{
|
||||
name: 'CustomerSamples',
|
||||
title: 'samples',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
jgallego
commented
salix tiene otro icono salix tiene otro icono
cfonseca
commented
Corregido: Corregido: 3bcd4984f5
jsegarra
commented
Yo lo veo OK Yo lo veo OK
|
||||
name: 'CustomerConsumption',
|
||||
title: 'consumption',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
name: 'CustomerMandates',
|
||||
title: 'mandates',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
name: 'CustomerContacts',
|
||||
title: 'contacts',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
name: 'CustomerWebPayment',
|
||||
title: 'webPayment',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
name: 'CustomerFileManagement',
|
||||
title: 'fileManagement',
|
||||
icon: 'pending',
|
||||
},
|
||||
{
|
||||
jgallego
commented
salix tiene otro icono salix tiene otro icono
cfonseca
commented
Corregido: Corregido: 9ae0874ccf
jsegarra
commented
Lo veo OK Lo veo OK
|
||||
name: 'CustomerUnpaid',
|
||||
title: 'unpaid',
|
||||
icon: 'pending',
|
||||
},
|
||||
],
|
||||
},
|
||||
component: () => import('src/pages/Customer/Card/CustomerOthers.vue'),
|
||||
children: [
|
||||
{
|
||||
path: 'samples',
|
||||
name: 'CustomerSamples',
|
||||
meta: {
|
||||
title: 'samples',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerSamples.vue'),
|
||||
},
|
||||
{
|
||||
path: 'samples',
|
||||
name: 'CustomerSamplesCard',
|
||||
redirect: { name: 'CustomerSamples' },
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
name: 'CustomerSamples',
|
||||
meta: {
|
||||
title: 'samples',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/Card/CustomerSamples.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'create',
|
||||
name: 'CustomerSamplesCreate',
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/components/CustomerSamplesCreate.vue'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'consumption',
|
||||
name: 'CustomerConsumption',
|
||||
meta: {
|
||||
title: 'consumption',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerConsumption.vue'),
|
||||
},
|
||||
{
|
||||
path: 'mandates',
|
||||
name: 'CustomerMandates',
|
||||
meta: {
|
||||
title: 'mandates',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerMandates.vue'),
|
||||
},
|
||||
{
|
||||
path: 'contacts',
|
||||
name: 'CustomerContacts',
|
||||
meta: {
|
||||
title: 'contacts',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerContacts.vue'),
|
||||
},
|
||||
jgallego
commented
si estoy en el cliente 1110 que no tiene pagos web, y en el buscador superior me muevo al 1101 que sí los tiene en salix me aparecen en lilium tengo que hacer f5 para que acceda a la información, no pasa en esta seccion solamente, tal vez alguien de vuestro o nuestro equipo esto ya lo haya solucionado en algun otro formulario..preguntar a ver. si estoy en el cliente 1110 que no tiene pagos web, y en el buscador superior me muevo al 1101 que sí los tiene en salix me aparecen en lilium tengo que hacer f5 para que acceda a la información, no pasa en esta seccion solamente, tal vez alguien de vuestro o nuestro equipo esto ya lo haya solucionado en algun otro formulario..preguntar a ver.
cfonseca
commented
Corregido: Corregido: b12968f982
jsegarra
commented
@jgallego Tenemos un comportamiento similar en el resto de la aplicación. @jgallego Tenemos un comportamiento similar en el resto de la aplicación.
Ya tenemos un redmine abierto https://gitea.verdnatura.es/verdnatura/salix-front/pulls/186#issuecomment-43382
La solución de Carlos es similar a la que se ha aplicado en el redmine
|
||||
{
|
||||
path: 'web-payment',
|
||||
name: 'CustomerWebPayment',
|
||||
meta: {
|
||||
title: 'webPayment',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerWebPayment.vue'),
|
||||
},
|
||||
{
|
||||
path: 'file-management',
|
||||
name: 'CustomerFileManagement',
|
||||
meta: {
|
||||
title: 'fileManagement',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/Card/CustomerFileManagement.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'file-management',
|
||||
name: 'CustomerFileManagementCard',
|
||||
redirect: { name: 'CustomerFileManagement' },
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
name: 'CustomerFileManagement',
|
||||
meta: {
|
||||
title: 'fileManagement',
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/Card/CustomerFileManagement.vue'
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'create',
|
||||
name: 'CustomerFileManagementCreate',
|
||||
component: () =>
|
||||
import(
|
||||
'src/pages/Customer/components/CustomerFileManagementCreate.vue'
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: 'unpaid',
|
||||
name: 'CustomerUnpaid',
|
||||
meta: {
|
||||
title: 'unpaid',
|
||||
jsegarra marked this conversation as resolved
Outdated
jgallego
commented
esta seccion da fallo simplemente al entrar esta seccion da fallo simplemente al entrar
cfonseca
commented
Corregido: Corregido: 3bcd4984f5
jsegarra
commented
@jgallego Este método también falla en Salix, lo que pasa es que no se muestra mensaje de error @jgallego Este método también falla en Salix, lo que pasa es que no se muestra mensaje de error
URL=> http://localhost:5000/api/ClientUnpaids/1112?filter=%7B%7D
jgallego
commented
Lo arregla verdnatura Lo arregla verdnatura
jsegarra
commented
Negativo! Negativo!
@cfonseca, la manera correcta de hacer uso de esta tabla no es mediante el path "/ClientUnpaid/:id", sino pasándole el clientFk como filter
Ten en cuenta que tendrás que añadir registros a la tabla vn.clientUnpaid. bien lo puedes hacer desde la extensión de vscode que comentamos, desde DBeaver o desde fixtures.before.sql...si ves que no, apúntatelo para verlo en la daily
cfonseca
commented
Corregido: Corregido: e56aa6587f
jsegarra
commented
He añadido un comentario a este código. He añadido un comentario a este código.
Tras llamada, Carlos va a hacer unos cambios ya que la implementación estaba bien orientada pero la ejecución no era la correcta,
|
||||
icon: 'paid',
|
||||
},
|
||||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerUnpaid.vue'),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
Errores:
Corregido:
3cf3687b84
Revisamos porque la columna referencia no tiene el mismo formato. El campo, debería ser descriptor, si procede
Corregido:
17a0afda73
Revisar porque lago raro pasa
@wbuezas y yo hemos visto que las filas no siempre aparecen ordenadas con los customer 1102 y 1103.
He eliminado el "order:id DESC" y parece que va mejor, pero alguna vez aparece en otro orden
Pasaban 2 cosas:
Ambas cosas quedaron fixeadas en este commit:
1cff622898
Aquí también hay un error en los datos que vienen del back porque el campo payed y created, tiene la misma fecha y hora para los registros con id 1