Cliente
Ruta /pimia/clientes/[customerId] · componentes, campos y acciones del checkout documentado.
Ruta y puntos de edición
Ruta: /pimia/clientes/[customerId]. Revisión: 2aec1b16cc01.
Esta ficha procede de lectura estática del código. Los componentes asociados pueden incluir diálogos cerrados y bloques condicionales. Las expresiones dinámicas se conservan como código; no equivalen a campos siempre visibles ni a permisos concedidos.
Vista en el tenant de referencia

Captura de escritorio del tenant de demostración Reformas Vera, S.L., tomada el 10 de septiembre de 2026. Los datos ilustran la composición de la pantalla y pueden cambiar.
| Capa | Archivo relativo al repositorio |
|---|---|
| Ruta | src/app/pimia/clientes/[customerId]/page.tsx |
| Adaptador Next.js | src/host/screens/PimiaClientScreens.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaCustomerScreen.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaStates.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaScreenShell.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaPageHeader.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaCustomerIdentity.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaAmountCell.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaCustomerVolume.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaInvoiceList.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaEstimateList.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaCustomerDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaConnectDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaSortableHead.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaStatusBadge.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaInvoiceActions.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaEstimateDocument.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaEstimateActions.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaAddressFields.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaCompanyDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaInvoiceSendDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaInvoicePaymentDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaDocumentParts.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaEstimateRejectDialog.tsx |
| Vista o componente asociado | src/features/pimia/ui/PimiaEstimateSendDialog.tsx |
PimiaCustomerScreen
Fuente: src/features/pimia/ui/PimiaCustomerScreen.tsx.
Columnas declaradas
- Concepto
- Cantidad
- Facturado
- Nombre
- Rol
- Teléfono
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Reintentar | onRetry | No declarado en este nodo | 295 |
| Editar | () => setIsEditOpen(true) | No declarado en este nodo | 531 |
| Nuevo presupuesto | () => void goPimiaPath( `/pimia/presupuestos/nuevo?cliente=${encodeURIComponent(customer.id)}`, ) | No declarado en este nodo | 539 |
| Clientes | () => void goPimiaPath("/pimia/clientes") | No declarado en este nodo | 553 |
| Nuevo presupuesto | () => void goPimiaPath( `/pimia/presupuestos/nuevo?cliente=${encodeURIComponent(customer.id)}`, ) | No declarado en este nodo | 746 |
Estados reutilizados
-
PimiaNotConnected -
PimiaErrorState -
PimiaRowsSkeleton -
PimiaEmpty
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
text-2xs, text-muted-foreground, text-2xl, text-foreground, text-xs, text-sm, bg-muted, gap-3, sm:grid-cols-3, gap-2, bg-primary/10, text-primary, text-base, overflow-x-auto, overflow-y-hidden, hover:bg-transparent, text-right, overflow-hidden, bg-primary.
PimiaStates
Fuente: src/features/pimia/ui/PimiaStates.tsx.
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Conectar una empresa | () => setIsConnectOpen(true) | No declarado en este nodo | 99 |
| Rótulo dinámico / icono | () => void goPimiaPath(notFound.listPath) | No declarado en este nodo | 233 |
| Rótulo dinámico / icono | delegado al contenedor | No declarado en este nodo | 247 |
| Rótulo dinámico / icono | () => void goPimiaPath( closedDoor.action?.kind === "plan" ? PLAN_PATH : MODULES_SETTINGS_PATH, ) | No declarado en este nodo | 257 |
| Volver a conectar | () => setIsConnectOpen(true) | No declarado en este nodo | 273 |
| Reintentar | onRetry | No declarado en este nodo | 279 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-4, p-8, text-center, text-base, text-foreground, text-sm, text-muted-foreground, gap-2, overflow-hidden, bg-muted/40.
PimiaCustomerIdentity
Fuente: src/features/pimia/ui/PimiaCustomerIdentity.tsx.
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => { void openExternalUrl(href).catch((error: unknown) => { toast.error( error instanceof Error ? error.message : "No se pudo abrir la web del cliente", ); }); } | No declarado en este nodo | 148 |
| revealed ? "Ocultar el IBAN" : "Mostrar el IBAN" | () => setRevealed((current) => !current) | No declarado en este nodo | 260 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-2.5, text-muted-foreground/70, text-2xs, text-muted-foreground, text-left, text-primary, gap-1.5, text-sm, text-foreground, gap-3, bg-muted, text-xs, overflow-hidden, bg-card, overflow-x-auto, overflow-y-hidden.
PimiaCustomerVolume
Fuente: src/features/pimia/ui/PimiaCustomerVolume.tsx.
Columnas declaradas
- Mes
- Facturado
- Cobrado
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
bg-card, p-4, sm:p-5, text-sm, text-foreground, text-xs, text-muted-foreground, gap-1.5, gap-x-6, gap-y-3, gap-x-4, gap-y-1, bg-primary, bg-primary/40, gap-2, text-2xs, gap-px, text-center.
PimiaInvoiceList
Fuente: src/features/pimia/ui/PimiaInvoiceList.tsx.
Columnas declaradas
- Cliente
- Cobro
- Acciones
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => onOpen(invoice.id) | No declarado en este nodo | 237 |
| Sin numerar | onOpen ? () => onOpen(invoice.id) : undefined | No declarado en este nodo | 253 |
| Ver la factura | () => onOpen(invoice.id) | No declarado en este nodo | 406 |
| Ver el cliente | () => onOpenCustomer(customerId) | No declarado en este nodo | 412 |
| Copiar el número | () => { void navigator.clipboard?.writeText( invoice.invoiceNumber as string, ); } | No declarado en este nodo | 418 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
hover:bg-transparent, text-foreground, text-muted-foreground, text-2xs, text-xs, text-right.
PimiaEstimateList
Fuente: src/features/pimia/ui/PimiaEstimateList.tsx.
Columnas declaradas
- Destinatario
- Acciones
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => onOpen(estimate.id) | No declarado en este nodo | 276 |
| Ver el presupuesto | () => onOpen(estimate.id) | No declarado en este nodo | 401 |
| Ver el cliente | () => onOpenCustomer(customerId) | No declarado en este nodo | 407 |
| Copiar el número | () => { void navigator.clipboard?.writeText(estimate.estimateNumber); } | No declarado en este nodo | 412 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
hover:bg-transparent, text-foreground, gap-2, text-muted-foreground, text-right, text-xs.
PimiaCustomerDialog
Fuente: src/features/pimia/ui/PimiaCustomerDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Nombre (obligatorio) | Input | form.name | No declaradas en este nodo | 274 |
| Persona de contacto | Input | form.contactName | No declaradas en este nodo | 296 |
| NIF / CIF | Input | form.taxId | No declaradas en este nodo | 306 |
Input | form.email | No declaradas en este nodo | 332 | |
| Teléfono | Input | form.phone | No declaradas en este nodo | 357 |
| Web | Input | form.website | No declaradas en este nodo | 376 |
| Sin etiqueta literal resoluble | Select | form.currencyId === null ? SIN_MONEDA : String(form.currencyId) | No declaradas en este nodo | 395 |
| Sin etiqueta literal resoluble | Select | form.paymentMethodId === null ? SIN_FORMA : String(form.paymentMethodId) | No declaradas en este nodo | 436 |
| Prefijo de numeración | Input | form.prefix | No declaradas en este nodo | 470 |
| Notas internas | Textarea | form.notes | No declaradas en este nodo | 482 |
| Dirección de envío: tiene una distinta de la de facturación | Switch | form.hasShipping | No declaradas en este nodo | 516 |
| IBAN | Input | form.iban | No declaradas en este nodo | 563 |
| BIC / SWIFT | Input | form.bic | No declaradas en este nodo | 581 |
| Referencia del mandato | Input | form.sepaMandateId | No declaradas en este nodo | 601 |
| Fecha de firma del mandato | Input | form.sepaMandateDate | type=date | 613 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 636 |
| Rótulo dinámico / icono | submit del formulario | No declarado en este nodo | 643 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
overflow-y-auto, text-sm, text-foreground, text-muted-foreground, text-xs, text-destructive, grid-cols-1, gap-4, sm:grid-cols-2, bg-destructive/5, bg-muted/40.
PimiaConnectDialog
Fuente: src/features/pimia/ui/PimiaConnectDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Tu empresa | Input | baseUrl | disabled=connect.isPending | 114 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => handleOpenChange(false) | No declarado en este nodo | 155 |
| Rótulo dinámico / icono | submit del formulario | !canSubmit | 162 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
text-sm, text-foreground, gap-2, text-muted-foreground, text-xs, text-destructive.
PimiaSortableHead
Fuente: src/features/pimia/ui/PimiaSortableHead.tsx.
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => onSortChange({ direction: isActive && sort.direction === "desc" ? "asc" : ("desc" as const), field, }) | No declarado en este nodo | 61 |
PimiaInvoiceActions
Fuente: src/features/pimia/ui/PimiaInvoiceActions.tsx.
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => { if (primary === "publish") { pedirEmision("publish"); } else if (primary === "send") { pedirEmision("send"); } else { requestPayment(); } } | isBusy | 356 |
| `Acciones de ${invoice.invoiceNumber ?? "la factura sin numerar"}` | delegado al contenedor | isBusy | 391 |
| Editar | () => void goPimiaPath( `/pimia/facturas/${encodeURIComponent(invoice.id)}/editar`, ) | No declarado en este nodo | 409 |
| Publicar | () => pedirEmision("publish") | No declarado en este nodo | 421 |
| Rótulo dinámico / icono | () => pedirEmision("send") | No declarado en este nodo | 426 |
| Marcar como enviada | () => pedirEmision("markSent") | No declarado en este nodo | 436 |
| Registrar cobro | requestPayment | No declarado en este nodo | 444 |
| Crear rectificativa | () => setConfirmation("creditNote") | No declarado en este nodo | 454 |
| Duplicar | () => setConfirmation("clone") | No declarado en este nodo | 459 |
| Descargar el PDF | () => void handlePdf() | No declarado en este nodo | 467 |
| Copiar el enlace para el cliente | () => void handleCopyLink() | No declarado en este nodo | 478 |
| Publicar | () => void handlePublish() | No declarado en este nodo | 509 |
| Marcar como enviada | () => void handleMarkSent() | No declarado en este nodo | 539 |
| Duplicar | () => void handleClone() | No declarado en este nodo | 558 |
| Crear rectificativa | () => void handleCreditNote() | No declarado en este nodo | 584 |
| Volver a conectar | () => { setConfirmation(null); setIsReconnectOpen(true); } | No declarado en este nodo | 604 |
| Rellenar los datos de mi empresa | () => { setConfirmation(null); setIsCompanyOpen(true); } | No declarado en este nodo | 634 |
PimiaEstimateDocument
Fuente: src/features/pimia/ui/PimiaEstimateDocument.tsx.
Columnas declaradas
- Concepto
- Importe
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
text-xs, text-base, text-foreground, text-muted-foreground, gap-x-6, gap-y-2, text-2xs, text-lg, text-2xl, grid-cols-1, gap-5, sm:grid-cols-3, bg-primary, gap-7, xl:grid-cols-2, overflow-x-auto, text-left, text-sm, gap-2, sm:text-right.
PimiaEstimateActions
Fuente: src/features/pimia/ui/PimiaEstimateActions.tsx.
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Rótulo dinámico / icono | () => { if (primary === "send") { setIsSendOpen(true); } else if (primary === "convert") { requestConvert(); } else if (primary === "clone") { setConfirmation("clone"); } else { void handleStatus(primary); } } | isBusy | 311 |
| `Acciones de ${estimate.estimateNumber}` | delegado al contenedor | isBusy | 355 |
| Editar | () => void goPimiaPath( `/pimia/presupuestos/${encodeURIComponent(estimate.id)}/editar`, ) | No declarado en este nodo | 379 |
| Rótulo dinámico / icono | () => setIsSendOpen(true) | No declarado en este nodo | 390 |
| Rótulo dinámico / icono | () => { if (status === "REJECTED") { setIsRejectOpen(true); return; } void handleStatus(status); } | No declarado en este nodo | 401 |
| Duplicar | () => setConfirmation("clone") | No declarado en este nodo | 422 |
| Convertir en factura | requestConvert | No declarado en este nodo | 426 |
| Descargar el PDF | () => void handlePdf() | No declarado en este nodo | 437 |
| Copiar el enlace para el cliente | () => void handleCopyLink() | No declarado en este nodo | 450 |
| Duplicar | () => void handleClone() | No declarado en este nodo | 484 |
| Convertir en factura | () => void handleConvert() | No declarado en este nodo | 507 |
| Volver a conectar | () => { setConfirmation(null); setIsReconnectOpen(true); } | No declarado en este nodo | 528 |
PimiaAddressFields
Fuente: src/features/pimia/ui/PimiaAddressFields.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| A nombre de | Input | form.name | No declaradas en este nodo | 70 |
| Dirección | Input | form.street1 | No declaradas en este nodo | 79 |
| Segunda línea | Input | form.street2 | No declaradas en este nodo | 89 |
| Código postal | Input | form.zip | No declaradas en este nodo | 99 |
| Ciudad | Input | form.city | No declaradas en este nodo | 108 |
| Provincia | Input | form.state | No declaradas en este nodo | 116 |
| Teléfono de esta dirección | Input | form.phone | No declaradas en este nodo | 126 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
text-xs, text-muted-foreground, grid-cols-1, gap-4, sm:grid-cols-3.
PimiaCompanyDialog
Fuente: src/features/pimia/ui/PimiaCompanyDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Razón social | Input | form.name | required=true | 182 |
| Nombre comercial | Input | form.tradeName | No declaradas en este nodo | 205 |
| NIF / CIF | Input | form.taxId | No declaradas en este nodo | 219 |
| Correo | Input | form.email | type=email | 249 |
| Teléfono | Input | form.phone | No declaradas en este nodo | 265 |
| Sin etiqueta literal resoluble | Select | form.address.countryId | No declaradas en este nodo | 292 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 349 |
| Guardar | submit del formulario | !puedeGuardar | 356 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
overflow-y-auto, text-sm, text-foreground, text-xs, text-muted-foreground, grid-cols-1, gap-4, sm:grid-cols-2, text-destructive.
PimiaInvoiceSendDialog
Fuente: src/features/pimia/ui/PimiaInvoiceSendDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Para | Input | to | type=email | 190 |
| Asunto | Input | subject | No declaradas en este nodo | 204 |
| Mensaje | textarea | body | No declaradas en este nodo | 216 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 244 |
| Rótulo dinámico / icono | submit del formulario | !canSend | 251 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-2.5, bg-destructive/10, text-sm, text-foreground, text-destructive, bg-muted/40, text-muted-foreground, gap-1.5, text-2xs, bg-background, text-xs.
PimiaInvoicePaymentDialog
Fuente: src/features/pimia/ui/PimiaInvoicePaymentDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Importe cobrado | Input | amount | No declaradas en este nodo | 198 |
| Fecha del cobro | Input | date | type=date | 243 |
| Sin etiqueta literal resoluble | Select | methodId | No declaradas en este nodo | 272 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 307 |
| Registrar cobro | submit del formulario | !canRecord | 314 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-1.5, text-2xs, text-muted-foreground, text-xs, text-destructive, text-sm.
PimiaEstimateRejectDialog
Fuente: src/features/pimia/ui/PimiaEstimateRejectDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Motivo (opcional) | textarea | reason | No declaradas en este nodo | 129 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 155 |
| Marcar como rechazado | submit del formulario | changeStatus.isPending | 162 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-1.5, text-2xs, text-muted-foreground, bg-background, text-sm, text-foreground, text-xs, text-destructive.
PimiaEstimateSendDialog
Fuente: src/features/pimia/ui/PimiaEstimateSendDialog.tsx.
Campos y controles
La columna «Reglas JSX» recoge propiedades explícitas; la validación adicional vive en los helpers y en el servidor. El enlace de estado indica dónde se lee el valor.
| Etiqueta o pista | Control | Enlace de estado | Reglas JSX | Línea |
|---|---|---|---|---|
| Para | Input | to | type=email | 309 |
| Asunto | Input | subject | No declaradas en este nodo | 331 |
| Mensaje | textarea | body | No declaradas en este nodo | 343 |
Acciones
| Rótulo literal | Handler o envío | Deshabilitado cuando | Línea |
|---|---|---|---|
| Cancelar | () => onOpenChange(false) | No declarado en este nodo | 371 |
| Enviar | submit del formulario | !canSend | 378 |
Clases de presentación locales
Selección de clases literales; las clases condicionales y los estilos de los primitivos se consultan en el archivo.
gap-2.5, bg-destructive/10, text-sm, text-foreground, text-destructive, bg-muted/40, text-muted-foreground, gap-1.5, text-2xs, text-xs, bg-background.
Hooks, adaptadores y utilidades relacionados
-
src/features/pimia/api/addresses.ts -
src/features/pimia/api/auth.ts -
src/features/pimia/api/company.ts -
src/features/pimia/api/customerEditor.ts -
src/features/pimia/api/customers.ts -
src/features/pimia/api/estimateSharedLink.ts -
src/features/pimia/api/estimates.ts -
src/features/pimia/api/invoiceSharedLink.ts -
src/features/pimia/api/invoices.ts -
src/features/pimia/api/pimiaClient.ts -
src/features/pimia/api/shell.ts -
src/features/pimia/hooks/usePimiaAuth.ts -
src/features/pimia/hooks/usePimiaClientes.ts -
src/features/pimia/hooks/usePimiaCorreo.ts -
src/features/pimia/hooks/usePimiaCustomerStats.ts -
src/features/pimia/hooks/usePimiaEmpresa.ts -
src/features/pimia/hooks/usePimiaProveedores.ts -
src/features/pimia/hooks/usePimiaResources.ts -
src/features/pimia/hooks/usePimiaVerifactuConfig.ts -
src/features/pimia/lib/calendar.ts -
src/features/pimia/lib/closedDoors.ts -
src/features/pimia/lib/companyDraft.ts -
src/features/pimia/lib/customerDraft.ts -
src/features/pimia/lib/customers.ts -
src/features/pimia/lib/documentActivity.ts -
src/features/pimia/lib/documentSeries.ts -
src/features/pimia/lib/estimates.ts -
src/features/pimia/lib/invoiceIssuer.ts -
src/features/pimia/lib/invoices.ts -
src/features/pimia/lib/mailConfig.ts -
src/features/pimia/lib/missingRecord.ts -
src/features/pimia/lib/money.ts -
src/features/pimia/lib/payments.ts -
src/features/pimia/lib/pdfPropio.ts -
src/features/pimia/lib/scopeDenial.ts -
src/features/pimia/lib/series.ts -
src/features/pimia/lib/taxes.ts -
src/features/pimia/lib/verifactuPublicacion.ts
Antes de entregar un retoque
- Revisa los archivos de formulario y sus helpers antes de cambiar tipos, obligatoriedad o valores iniciales.
- Prueba carga, error, vacío, permisos insuficientes y guardado pendiente en las variantes que usa esta pantalla.
- Comprueba escritorio, móvil, teclado, tema oscuro y scroll con suficientes filas.
- Conserva los handlers y la invalidación de datos al modificar la presentación.