PR-CUSTOMER #186

Merged
jsegarra merged 105 commits from :PR-CUSTOMER into dev 2024-04-19 15:55:53 +00:00
31 changed files with 1538 additions and 246 deletions
Showing only changes of commit a88b1137dc - Show all commits

View File

@ -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',

View File

@ -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',

View File

@ -1,10 +1,11 @@
<script setup>
Review

Errores:

  1. Columna fecha
  2. Worker descriptor
  3. Referencia descriptor
  4. Referencia puede ser editable
Errores: 1. Columna fecha 2. Worker descriptor 3. Referencia descriptor 4. Referencia puede ser editable
Review

Corregido: 3cf3687b84

Corregido: 3cf3687b84
Review

Revisamos porque la columna referencia no tiene el mismo formato. El campo, debería ser descriptor, si procede

Revisamos porque la columna referencia no tiene el mismo formato. El campo, debería ser descriptor, si procede
Review

Corregido: 17a0afda73

Corregido: 17a0afda73
Review

Revisar porque lago raro pasa

Revisar porque lago raro pasa
Review

@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

@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
Review

Pasaban 2 cosas:

  • Estaba mal el orden en la request como vimos
  • Había también un error en el calculo del balance

Ambas cosas quedaron fixeadas en este commit: 1cff622898

Pasaban 2 cosas: - Estaba mal el orden en la request como vimos - Había también un error en el calculo del balance Ambas cosas quedaron fixeadas en este commit: https://gitea.verdnatura.es/verdnatura/salix-front/commit/1cff622898264123e0135ec6dfff44ce0d0b6fb8
Review

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

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
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();

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

Corregido: d74119f433

Corregido: d74119f433

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>

View File

@ -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';

View File

@ -140,6 +140,7 @@ const toCustomerConsigneeEdit = (consigneeId) => {
</template>

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

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

Corregido: 86199d8197

Corregido: 86199d8197

@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>

View File

@ -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>

View File

@ -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

No hay notificación de guardado?

No hay notificación de guardado?

Corregido: ab20ec1738

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
Review

Falta clearable

Falta clearable
Review

Corregido: 7f1c4690e8

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

Te deja cualquier cosa

Te deja cualquier cosa

Corregido: ab20ec1738

Corregido: ab20ec1738
</div>
<div class="flex items-center">
jsegarra marked this conversation as resolved Outdated

No funciona si has dado a guardar.
Puedes eliminar la primera pero si añades una fila y le das a guardar, reaparece.

No funciona si has dado a guardar. Puedes eliminar la primera pero si añades una fila y le das a guardar, reaparece.

Corregido: d0e98010a5

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

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.

Corregido: d0e98010a5

Corregido: d0e98010a5

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

Corregido: bb10714824

Corregido: bb10714824

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>

View File

@ -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"

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

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

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

Si no tiene valor aparece vacío. En Salix aparece un "-"

Si no tiene valor aparece vacío. En Salix aparece un "-"

Corregido: c0a9835e80

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>

View File

@ -1,3 +0,0 @@
<template>
jsegarra marked this conversation as resolved Outdated

No identifico el nuevo componente, sin embargo, faltan clearables

No identifico el nuevo componente, sin embargo, faltan clearables

Componente eliminado hace varios días

Componente eliminado hace varios días
<div class="flex justify-center">Credit management</div>
</template>

View File

@ -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

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

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

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

@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>

View File

@ -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"

View File

@ -0,0 +1,3 @@
<template>
<div class="flex justify-center">Customer file management</div>
</template>

View File

@ -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">

View File

@ -0,0 +1,17 @@
<script setup>
jsegarra marked this conversation as resolved
Review

Revisar comentario.
Si este componente, está así porque no hay datos, utilizar el cliente 1102

Revisar comentario. Si este componente, está así porque no hay datos, utilizar el cliente 1102
Review

Corrección: 08e072100b

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>

View File

@ -1,3 +0,0 @@
<template>
<div class="flex justify-center">Others</div>
</template>

View File

@ -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>

View File

@ -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

Duda, cuando actualicemos con dev no tendremos conflicto?

Duda, cuando actualicemos con dev no tendremos conflicto?

Se reemplazo toDateHourMinSec por las nuevas utils ubicadas en date.js

Commit: c856adc8d0

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>

View File

@ -0,0 +1,3 @@
<template>
<div class="flex justify-center">Customer unpaid</div>
</template>

View File

@ -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>

View File

@ -0,0 +1,17 @@
<script setup>
jsegarra marked this conversation as resolved
Review

Usar el cliente 1101

Usar el cliente 1101
Review

Corrección: 08e072100b

Corrección: 08e072100b
Review

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"

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"
Review

Corregido: bb10714824

Corregido: bb10714824
Review

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>

View File

@ -1,13 +1,12 @@
<script setup>
jsegarra marked this conversation as resolved
Review

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

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
Review

Corregido: 3cf3687b84

Corregido: 3cf3687b84
Review

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
Review

Corregido: 17a0afda73

Corregido: 17a0afda73
import { ref, computed, onBeforeMount } from 'vue';
import { ref, computed } from 'vue';
jsegarra marked this conversation as resolved
Review

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"

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"
Review

Corregido: 17a0afda73

Corregido: 17a0afda73
Review

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?
Review

Se agrega icono faltante: d0cf13d0af

Se agrega icono faltante: d0cf13d0af
Review

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
Review

En el formulario de basic-data:
El campo cliente anterior no aparece

En el formulario de basic-data: El campo cliente anterior no aparece
Review

Corregido: 3cf3687b84

Corregido: 3cf3687b84
import { QBtn, QCheckbox, useQuasar } from 'quasar';
jsegarra marked this conversation as resolved
Review

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.
Review

Corregido: 11eb597fa3

Corregido: 11eb597fa3
Review

Carlos, en el comentario anterior indicaba sugerencias para fiscal-data y billing-data.
Billing-data, el campo IBAN sigue sin tener icono

Carlos, en el comentario anterior indicaba sugerencias para fiscal-data y billing-data. Billing-data, el campo IBAN sigue sin tener icono
Review

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.

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';
Review

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.

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.
Review

Corregidos todos los de Customer: 7f1c4690e8

Corregidos todos los de Customer: 7f1c4690e8
Review

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.

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>

View File

@ -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

View File

@ -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>

View File

@ -321,7 +321,7 @@ const onDataSaved = () => {
size="sm"
>
<QTooltip>
{{ t('Remove') }}
{{ t('Remove note') }}
</QTooltip>
</QIcon>
</div>

View File

@ -0,0 +1,61 @@
<script setup>
jsegarra marked this conversation as resolved
Review

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

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
Review

Corregido: 11eb597fa3

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
Review

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
Review

Corregido: 38d3d49ecb

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

Los campos nos son clearables

Los campos nos son clearables

Corregido: 7f1c4690e8

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>

View File

@ -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>

View File

@ -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';

View File

@ -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: {

View File

@ -0,0 +1,240 @@
<script setup>
Review

Revisar fecha de enviado y worker descriptor
En el create, revisar clearable

Revisar fecha de enviado y worker descriptor En el create, revisar clearable
Review

Corregido: 7f1c4690e8

Corregido: 7f1c4690e8
Review

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
Review

Corregido: ebd1ee07f4

Corregido: ebd1ee07f4
Review

@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
Review

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.
Review

@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?
Review

Sigue sin ir del todo fino, adjunto video por el grupo.

Sigue sin ir del todo fino, adjunto video por el grupo.
Review

Corregido: 5ff90d127b

Corregido: 5ff90d127b
Review

Hay veces que los botones desaparecen, cambias de sección y sale error.
Siempre me sale en vista previa, el documento de Incoterms

Hay veces que los botones desaparecen, cambias de sección y sale error. Siempre me sale en vista previa, el documento de Incoterms
Review

Problema de error al cambiar sección y desaparición de botones resuelto.
Commit: 87f376464b

Se fixea la vista previa del documento.
Commit: ec2604b9ab

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

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

Corregido: 90ee50eab5

Corregido: 90ee50eab5

Yo lo veo OK

Yo lo veo OK
url="Samples/visible"
/>
<FormModel
jsegarra marked this conversation as resolved Outdated

No hay botón de vista previa

No hay botón de vista previa

Corregido: d0e98010a5

Corregido: d0e98010a5

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

Corregido: ebd1ee07f4

Corregido: ebd1ee07f4

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.

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

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

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

Corrección: 08e072100b

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>

View File

@ -0,0 +1,73 @@
<script setup>
jsegarra marked this conversation as resolved
Review

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

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
Review

Corregido: 38d3d49ecb

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>

View File

@ -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: {

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.

Corregido: c767bcde7d

Corregido: c767bcde7d
title: 'others',
icon: 'pending',
menuChildren: [
{
name: 'CustomerSamples',
title: 'samples',
icon: 'pending',
},
{

salix tiene otro icono

salix tiene otro icono

Corregido: 3bcd4984f5

Corregido: 3bcd4984f5

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',
},
{

salix tiene otro icono

salix tiene otro icono

Corregido: 9ae0874ccf

Corregido: 9ae0874ccf

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'),
},
Review

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.
Review

Corregido: b12968f982

Corregido: b12968f982
Review

@jgallego Tenemos un comportamiento similar en el resto de la aplicación.
Ya tenemos un redmine abierto #186 (comment)
La solución de Carlos es similar a la que se ha aplicado en el redmine

@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

esta seccion da fallo simplemente al entrar

esta seccion da fallo simplemente al entrar

Corregido: 3bcd4984f5

Corregido: 3bcd4984f5

@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 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

Lo arregla verdnatura

Lo arregla verdnatura

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

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

Corregido: e56aa6587f

Corregido: e56aa6587f

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,

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'),
},
],
},
],
},