diff --git a/public/config/settings.dev.json b/public/config/settings.dev.json index ece01fd..2d72db1 100644 --- a/public/config/settings.dev.json +++ b/public/config/settings.dev.json @@ -28,7 +28,7 @@ }, "incomes": { "all": "/incomes", - "withNames": "/incomes/with-names", + "withInfo": "/incomes/with-info", "mine": "/incomes/mine", "byId": "/incomes/:incomeId" }, @@ -37,7 +37,8 @@ "byId": "/expenses/:expenseId" }, "balance": { - "all": "/balance" + "all": "/balance", + "withTotals": "/balance/with-totals" }, "announcements": { "all": "/announcements", diff --git a/public/config/settings.prod.json b/public/config/settings.prod.json index ae335ee..30c5038 100644 --- a/public/config/settings.prod.json +++ b/public/config/settings.prod.json @@ -6,7 +6,8 @@ "auth": { "login": "/auth/login", "refreshToken": "/auth/refresh", - "changePassword": "/auth/change-password" + "changePassword": "/auth/change-password", + "validateToken": "/auth/validate" }, "users": { "all": "/users", @@ -27,7 +28,7 @@ }, "incomes": { "all": "/incomes", - "withNames": "/incomes/with-names", + "withInfo": "/incomes/with-info", "mine": "/incomes/mine", "byId": "/incomes/:incomeId" }, @@ -36,7 +37,8 @@ "byId": "/expenses/:expenseId" }, "balance": { - "all": "/balance" + "all": "/balance", + "withTotals": "/balance/with-totals" }, "announcements": { "all": "/announcements", diff --git a/src/components/Ingresos/IngresoCard.jsx b/src/components/Ingresos/IngresoCard.jsx index c34a8d9..4e9a2ca 100644 --- a/src/components/Ingresos/IngresoCard.jsx +++ b/src/components/Ingresos/IngresoCard.jsx @@ -64,6 +64,8 @@ const IngresoCard = ({ type: income.type ?? CONSTANTS.PAYMENT_TYPE_CASH, frequency: income.frequency ?? CONSTANTS.PAYMENT_FREQUENCY_YEARLY, memberNumber: income.memberNumber, + userId: income.userId, + displayName: income.displayName || '', createdAt: income.createdAt?.slice(0, 16) || (isNew ? getNowAsLocalDatetime() : ''), }); @@ -74,14 +76,29 @@ const IngresoCard = ({ amount: income.amount || 0, type: income.type ?? CONSTANTS.PAYMENT_TYPE_CASH, frequency: income.frequency ?? CONSTANTS.PAYMENT_FREQUENCY_YEARLY, - displayName: income.displayName, + userId: income.userId, memberNumber: income.memberNumber, + displayName: income.displayName || '', createdAt: income.createdAt?.slice(0, 16) || (isNew ? getNowAsLocalDatetime() : ''), }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [income, editMode]); + useEffect(() => { + if (formData.memberNumber && !formData.userId) { + const member = members.find(m => m.memberNumber === formData.memberNumber); + if (member) { + setFormData(prev => ({ + ...prev, + userId: member.userId, + displayName: member.displayName + })); + } + } + }, [formData.memberNumber, formData.userId, members]); + + const handleChange = (field, value) => setFormData(prev => ({ ...prev, [field]: value })); @@ -167,13 +184,20 @@ const IngresoCard = ({ handleChange('memberNumber', parseInt(e.target.value))} - style={{ maxWidth: '300px', display: 'inline-block' }} + value={formData.memberNumber ?? ""} + onChange={(e) => { + const memberNumber = parseInt(e.target.value); + const member = members.find(m => m.memberNumber === memberNumber); + + handleChange('memberNumber', memberNumber); + handleChange('userId', member?.userId ?? null); + handleChange('displayName', member?.displayName ?? ""); + }} > - {uniqueMembers.map((m) => ( - + {uniqueMembers.map((i) => ( + ))} diff --git a/src/components/Socios/SocioCard.jsx b/src/components/Socios/SocioCard.jsx index 063e84d..302f170 100644 --- a/src/components/Socios/SocioCard.jsx +++ b/src/components/Socios/SocioCard.jsx @@ -128,7 +128,7 @@ const SocioCard = ({ identity, isNew = false, onCreate, onUpdate, onDelete, onCa plotNumber: identity.metadata.plotNumber, notes: identity.metadata.notes || '', status: identity.account.status, - type: identity.metadat.type, + type: identity.metadata.type, createdAt: identity.metadata.createdAt?.slice(0, 16) || (isNew ? getNowAsLocalDatetime() : ''), assignedAt: identity.metadata.assignedAt?.slice(0, 16) || undefined, deactivatedAt: identity.metadata.deactivatedAt?.slice(0, 16) || undefined, diff --git a/src/components/Socios/SociosPDF.jsx b/src/components/Socios/SociosPDF.jsx index 9873968..b2c6371 100644 --- a/src/components/Socios/SociosPDF.jsx +++ b/src/components/Socios/SociosPDF.jsx @@ -97,7 +97,7 @@ export const SociosPDF = ({ socios }) => ( Tipo - {socios.map((socio, idx) => ( + {socios.map((identity, idx) => ( ( { borderBottomRightRadius: idx === socios.length - 1 ? 10 : 0 }, ]} > - {socio?.memberNumber} - {socio?.plotNumber} - {socio?.displayName} - {socio?.dni} - {socio?.phone} - {socio?.email || ''} - {parseDate(socio?.createdAt?.split('T')[0] || '')} + {identity?.metadata?.memberNumber} + {identity?.metadata?.plotNumber} + {identity?.user?.displayName} + {identity?.metadata?.dni} + {identity?.metadata?.phone} + {identity?.account?.email || ''} + {parseDate(identity?.metadata?.createdAt?.split('T')[0] || '')} {(() => { - switch (socio?.type) { + switch (identity?.metadata?.type) { case 0: return 'L. Espera'; case 1: return 'Hortelano'; case 2: return 'Invernadero'; diff --git a/src/components/Solicitudes/SolicitudCard.jsx b/src/components/Solicitudes/SolicitudCard.jsx index f960d26..cb6b19b 100644 --- a/src/components/Solicitudes/SolicitudCard.jsx +++ b/src/components/Solicitudes/SolicitudCard.jsx @@ -35,15 +35,15 @@ const getPFP = (tipo) => { }; const renderDescripcionSolicitud = (data, onProfile) => { - const { type, status, requestedByName, preDisplayName } = data; + console.log(data); - switch (type) { + switch (data.requestType) { case 0: - if (requestedByName) { - return `${requestedByName} quiere darse de alta.`; - } else if (status !== 1 && preDisplayName) { - return `${preDisplayName} quiere darse de alta.`; - } else if (status !== 1) { + if (data.requestedByName) { + return `${data.requestedByName} quiere darse de alta.`; + } else if (data.requestStatus !== 1 && data.preDisplayName) { + return `${data.preDisplayName} quiere darse de alta.`; + } else if (data.requestStatus !== 1) { return `Alguien quiere darse de alta.`; } else { return `Se ha aceptado esta solicitud de alta.`; @@ -52,30 +52,30 @@ const renderDescripcionSolicitud = (data, onProfile) => { case 1: return onProfile ? "Has solicitado darte de baja." - : requestedByName - ? `${requestedByName} quiere darse de baja.` - : status !== 1 + : data.requestedByName + ? `${data.requestedByName} quiere darse de baja.` + : data.requestStatus !== 1 ? `Alguien quiere darse de baja.` : `Se ha aceptado esta solicitud de baja.`; case 2: if (onProfile) { - switch (status) { + switch (data.requestStatus) { case 0: return "Has solicitado añadir un colaborador."; case 1: return "Tu solicitud de colaborador ha sido aceptada."; case 2: return "Tu solicitud de colaborador ha sido rechazada."; default: return "Solicitud de colaborador desconocida."; } } else { - switch (status) { + switch (data.requestStatus) { case 0: - return requestedByName - ? `${requestedByName} quiere añadir a ${preDisplayName || "un colaborador"} como colaborador.` - : `Alguien quiere añadir a ${preDisplayName || "un colaborador"} como colaborador.`; + return data.requestedByName + ? `${data.requestedByName} quiere añadir a ${data.preDisplayName || "un colaborador"} como colaborador.` + : `Alguien quiere añadir a ${data.preDisplayName || "un colaborador"} como colaborador.`; case 1: - return `La solicitud de colaborador de ${requestedByName || "alguien"} ha sido aceptada.`; + return `La solicitud de colaborador de ${data.requestedByName || "alguien"} ha sido aceptada.`; case 2: - return `La solicitud de colaborador de ${requestedByName || "alguien"} ha sido rechazada.`; + return `La solicitud de colaborador de ${data.requestedByName || "alguien"} ha sido rechazada.`; default: return "Solicitud de colaborador desconocida."; } @@ -84,27 +84,27 @@ const renderDescripcionSolicitud = (data, onProfile) => { case 3: return onProfile ? "Has solicitado quitar tu colaborador." - : requestedByName - ? `${requestedByName} quiere quitar su colaborador.` - : status !== 1 + : data.requestedByName + ? `${data.requestedByName} quiere quitar su colaborador.` + : data.requestStatus !== 1 ? `Alguien quiere quitar su colaborador.` : `Se ha aceptado esta solicitud de baja de colaborador.`; case 4: return onProfile ? "Has solicitado una parcela en el invernadero." - : requestedByName - ? `${requestedByName} quiere una parcela en el invernadero.` - : status !== 1 + : data.requestedByName + ? `${data.requestedByName} quiere una parcela en el invernadero.` + : data.requestStatus !== 1 ? `Alguien quiere una parcela en el invernadero.` : `Se ha aceptado esta solicitud de parcela en el invernadero.`; case 5: return onProfile ? "Has solicitado dejar tu parcela del invernadero." - : requestedByName - ? `${requestedByName} quiere dejar su parcela del invernadero.` - : status !== 1 + : data.requestedByName + ? `${data.requestedByName} quiere dejar su parcela del invernadero.` + : data.requestStatus !== 1 ? `Alguien quiere dejar su parcela del invernadero.` : `Se ha aceptado esta solicitud de salida del invernadero.`; @@ -123,9 +123,9 @@ const SolicitudCard = ({ data, onAccept, onReject, onDelete, editable = true, on PFP
- Solicitud #{data.requestId} - {getTipoSolicitud(data.type)} + Solicitud #{data.idx} - {getTipoSolicitud(data.requestType)} - Estado: {getEstadoSolicitud(data.status)} + Estado: {getEstadoSolicitud(data.requestStatus)}
@@ -147,7 +147,7 @@ const SolicitudCard = ({ data, onAccept, onReject, onDelete, editable = true, on - Fecha de solicitud: {parseDate(data.request_createdAt)} + Fecha de solicitud: {parseDate(data.createdAt)} @@ -174,7 +174,7 @@ const SolicitudCard = ({ data, onAccept, onReject, onDelete, editable = true, on )} - {editable && data.status === 0 && ( + {editable && data.requestStatus === 0 && (
diff --git a/src/pages/Balance.jsx b/src/pages/Balance.jsx index 8f48c2e..d07efcc 100644 --- a/src/pages/Balance.jsx +++ b/src/pages/Balance.jsx @@ -13,7 +13,7 @@ const Balance = () => { if (configLoading || !config) return

; const reqConfig = { - baseUrl: config.apiConfig.baseUrl + "/v1/balance/with-totals" + baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.balance.withTotals }; return ( diff --git a/src/pages/Ingresos.jsx b/src/pages/Ingresos.jsx index 8895912..5f10996 100644 --- a/src/pages/Ingresos.jsx +++ b/src/pages/Ingresos.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useConfig } from '../hooks/useConfig'; import { DataProvider } from '../context/DataContext'; import { useDataContext } from '../hooks/useDataContext'; @@ -29,9 +29,9 @@ const Ingresos = () => { if (configLoading) return

; const reqConfig = { - baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.allWithNames, + baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.withInfo, rawUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.all, - membersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.members.all, + usersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.users.all, params: { _sort: 'createdAt', _order: 'desc' @@ -46,26 +46,24 @@ const Ingresos = () => { }; const IngresosContent = ({ reqConfig }) => { - const { data, dataLoading, dataError, getData, postData, putData, deleteData } = useDataContext(); + const { data, dataLoading, dataError, postData, putData, deleteData } = useDataContext(); const [showPDFModal, setShowPDFModal] = useState(false); const [creatingIngreso, setCreatingIngreso] = useState(false); const [tempIngreso, setTempIngreso] = useState(null); const [error, setError] = useState(null); const [deleteTargetId, setDeleteTargetId] = useState(null); - const [members, setMembers] = useState([]); - useEffect(() => { - const fetchMembers = async () => { - try { - const membersData = await getData(reqConfig.membersUrl, { params: { _sort: 'name', _order: 'asc' } }); - setMembers(membersData.data); - } catch (err) { - setError(errorParser(err)); - } - }; - - fetchMembers(); - }, [reqConfig.membersUrl, getData]); + const members = data + ? Array.from( + new Map( + data.map(i => [i.memberNumber, { + memberNumber: i.memberNumber, + displayName: i.displayName, + userId: i.userId + }]) + ).values() + ).sort((a, b) => a.memberNumber - b.memberNumber) + : []; const { filtered, @@ -104,16 +102,18 @@ const IngresosContent = ({ reqConfig }) => { }); const handleCreate = () => { + const firstMember = members[0]; + setCreatingIngreso(true); setTempIngreso({ incomeId: null, - memberNumber: 0, + memberNumber: firstMember?.memberNumber ?? null, + userId: firstMember?.userId ?? null, concept: '', amount: 0.0, frequency: CONSTANTS.PAYMENT_FREQUENCY_YEARLY, type: CONSTANTS.PAYMENT_TYPE_BANK }); - document.querySelector('.cards-grid')?.scrollTo({ top: 0, behavior: 'smooth' }); }; const handleCancelCreate = () => { @@ -150,7 +150,7 @@ const IngresosContent = ({ reqConfig }) => { if (dataLoading) return

; if (dataError) return

{dataError}

; - + return ( diff --git a/src/pages/Socios.jsx b/src/pages/Socios.jsx index a545e62..a25148d 100644 --- a/src/pages/Socios.jsx +++ b/src/pages/Socios.jsx @@ -29,7 +29,7 @@ const Socios = () => { const reqConfig = { baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.all}`, - incomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.payments}`, + incomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.incomesPreview}`, rawIncomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.incomes.all}`, params: { _sort: "memberNumber", @@ -164,7 +164,7 @@ const SociosContent = ({ reqConfig }) => { try { const url = reqConfig.incomesUrl.replace(":memberNumber", memberNumber); const res = await getData(url); - setIncomes(res.data); + setIncomes(res); } catch (err) { setIncomesError(err.message); } finally { @@ -217,19 +217,19 @@ const SociosContent = ({ reqConfig }) => { onClearError={() => setError(null)} /> )} - renderCard={(socio) => { - const position = socio.type === 0 - ? listaEsperaOrdenada.findIndex(s => s.userId === socio.userId) + 1 + renderCard={(identity) => { + const position = identity.metadata.type === 0 + ? listaEsperaOrdenada.findIndex(i => i.user.userId === identity.user.userId) + 1 : null; return ( handleViewIncomes(socio.memberNumber)} + onViewIncomes={() => handleViewIncomes(identity.metadata.memberNumber)} error={error} onClearError={() => setError(null)} positionIfWaitlist={position} diff --git a/src/pages/Solicitudes.jsx b/src/pages/Solicitudes.jsx index 04de347..e6dd4a5 100644 --- a/src/pages/Solicitudes.jsx +++ b/src/pages/Solicitudes.jsx @@ -21,7 +21,7 @@ const Solicitudes = () => { if (configLoading || !config) return

; const reqConfig = { - baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.allWithPreUsers, + baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.full, rawUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.all, acceptUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.accept, rejectUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.reject, @@ -103,10 +103,10 @@ const SolicitudesContent = ({ reqConfig }) => { ( + renderCard={(entry, idx) => ( handleAccept(entry)} onReject={() => handleReject(entry)} onDelete={handleDelete}