Cargando indicadores…
{{ fmtCount(stats.totalClients) }}
Total clientes
todos los registros
{{ fmtCount(stats.newClientsThisMonth) }}
Nuevos este mes
registros del mes actual
{{ fmtCount(stats.activeClients) }}
Paquetes activos
ACTIVE + TRIAL
${{ fmtMoney(stats.mrr) }}
MRR (USD)
solo ACTIVE no-complimentary
{{ fmtCount(stats.trialClients) }}
En periodo de prueba
Terminan en <7 días: {{ fmtCount(stats.trialEndingSoon) }}
{{ fmtCount((stats.pastDueClients ?? 0) + (stats.suspendedClients ?? 0)) }}
En mora / suspendidos
PAST_DUE: {{ fmtCount(stats.pastDueClients) }} · SUSPENDED: {{ fmtCount(stats.suspendedClients) }}
{{ fmtCount(stats.noSubscriptionClients) }}
Sin suscripción
CANCELLED / sin registro
📊 Gráficas de MRR y crecimiento
Próximamente — usa las secciones de Planes y Clientes para gestionar cuentas.
Planes y precios
Cargando planes…
No hay planes registrados.
{{ p.planName }}
{{ p.active ? 'Activo' : 'Archivado' }}
${{ fmtMoney(Number(planAmt(p, 'cuotaBase'))) }}– {{ priceCcy }}/mes
+ ${{ fmtMoney(Number(planAmt(p, 'pricePerUnit'))) }}– /prop/mes
${{ fmtMoney(Number(planAmt(p, 'fixedPrice'))) }}–
{{ priceCcy }}/mes{{ p.priceType === 'FIXED' ? ' · fijo' : '' }}
Cotización
Propiedades
{{ planRangeLabel(p) }}
Miembros
{{ p.maxMembers == null ? 'Ilimitados' : p.maxMembers }}
{{ p.priceType === 'PER_UNIT' ? 'Anual / propiedad' : 'Precio anual' }}
${{ fmtMoney(planAnnualPrice(p)) }}/mes
Cuota base anual
${{ fmtMoney(planAnnualCuotaBase(p)) }}/mes
- {{ f }}
Nuevo plan
Complementos
{{ a.name }}INACTIVO
{{ a.description }}
Se cobra a los planes que NO lo incluyen
${{ fmtMoney(addonAmt(a)) }}– {{ priceCcy }}/mes
Mensual {{ priceCcy }}
Anual {{ priceCcy }}/mes
Sin complementos en el catálogo.
Planes personalizados
{{ p.planName }}
Personalizado
${{ fmtMoney(Number(p.cuotaBase)) }} USD/mes
+ ${{ fmtMoney(Number(p.pricePerUnit)) }} /prop/mes
${{ fmtMoney(planDisplayPrice(p)) }}
USD/mes{{ p.priceType === 'FIXED' ? ' · fijo' : '' }}
Cotización
Propiedades{{ planRangeLabel(p) }}
Miembros{{ p.maxMembers == null ? 'Ilimitados' : p.maxMembers }}
Cargando clientes…
{{ clients.length ? 'Sin resultados para los filtros aplicados.' : 'No hay clientes registrados.' }}
| Empresa{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Plan{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Propiedades{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Miembros{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | MRR{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Estado{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Día de cobro{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Registro{{ sortDir === 'asc' ? ' ▲' : ' ▼' }} | Acciones | Historial | |
|---|---|---|---|---|---|---|---|---|---|---|
|
{{ c.userName || c.email || '—' }}
{{ c.email || '—' }}
|
{{ planBadgeText(c) }} |
{{ c.propertiesUsed }} / ∞
{{ c.propertiesUsed }} / {{ c.maxProperties }}
0
|
{{ c.membersUsed ?? 0 }} / {{ c.maxMembers == null ? '∞' : c.maxMembers }} | {{ Number(c.mrr) > 0 ? '$' + fmtMoney(c.mrr) : '—' }} | {{ statusLabel(c) }} | {{ billingDayLabel(c) }} | {{ fmtDateOnly(c.registrationDate) }} |
Mostrando {{ pageRangeStart }}–{{ pageRangeEnd }} de {{ filteredClients.length }}
Correo SMTP
Los cambios aplican al reiniciar el contenedor Docker. El servicio de correo no recarga la configuración en caliente.
Cargando configuración…
Los valores se almacenan en la tabla parameter bajo las claves
MAIL_SMTP_SERVER, MAIL_SMTP_PORT,
MAIL_USER, MAIL_PASSWORD,
MAIL_DISPLAY_NAME.
Proveedores populares
{{ prov.name }}
{{ prov.host }} · {{ prov.port }}
Configuración avanzada de correo remitentes · rebotes
Destinatarios de notificaciones
Estos correos reciben las notificaciones de la plataforma: cancelaciones de servicio, registro de planes y eventos operativos de IDARI.
Los SUPER_ADMIN activos siempre reciben estas notificaciones; esta lista agrega destinatarios extra.
Cargando…
Respuesta y rebotes
Las respuestas de los clientes a los correos llegarán aquí.
Los correos no entregados (hard bounce) se reportan a esta dirección.
INPC / Incrementos de renta
El INPC se baja automáticamente de la fuente pública cuando el motor lo necesita. Aquí puedes consultarlo o capturarlo manualmente si la fuente aún no lo publica. El aumento de rentas corre el día 11 de cada mes (o manualmente con el botón de arriba).
Omitidos/con error — corrida del {{ fmtDateTime(incLastSweepAt) }}:
Contrato {{ d.contractId ?? '—' }} — {{ d.reason }}
{{ d.companyName || 'Arrendatario n/d' }} · {{ d.realEstateName || 'Inmueble n/d' }} · {{ d.accountEmail || 'Cuenta n/d' }}
{{ inpcMsg }}
Parametros
Incrementos en contratos
Usa este botón cuando el INEGI publique el dato de inflación después del día 11 y el aumento no se haya aplicado en automático. El sistema tomará el INPC más reciente y aplicará los incrementos pendientes a todos los contratos que les corresponda ese mes.
Omitidos/con error — corrida del {{ fmtDateTime(incLastSweepAt) }}:
Contrato {{ d.contractId ?? '—' }} — {{ d.reason }}
{{ d.companyName || 'Arrendatario n/d' }} · {{ d.realEstateName || 'Inmueble n/d' }} · {{ d.accountEmail || 'Cuenta n/d' }}
Avisos de vencimiento de contratos
{{ expiryStatus.enabled ? 'Automático: ACTIVO' : 'Automático: apagado' }} · ventana {{ expiryStatus.noticeDays }} días
En automático, el sistema avisa por correo (al administrador, al inmueble y a los miembros con acceso) cuando un contrato está dentro de la ventana de vencimiento — tres meses antes de su terminación. Cada contrato se avisa una sola vez. Usa este botón para correr la revisión a mano y verificar a quién le llegaría el aviso.
Salud de datos — Plazas sin propietario
Detecta y corrige plazas (inmuebles) cuyo propietario en la BD no corresponde a un usuario ADMIN activo. Esto hace que las propiedades de esa plaza sean invisibles al administrador. Reparar automáticamente corrige los casos donde el propietario registrado es un Miembro (lo reasigna a su Admin) o no existe en la tabla de usuarios (lo deriva del único contrato activo del inmueble).
Sin plazas huérfanas detectadas.
| Plaza | ID | userId actual | Problema | Correo usuario | userId sugerido | Correo sugerido | Props | Contratos |
|---|---|---|---|---|---|---|---|---|
| {{ o.realEstateName }} | {{ o.realEstateId }} | {{ o.currentUserId }} |
Usuario no existe Usuario eliminado Es Miembro (no Admin) | {{ o.ownerEmail || '—' }} | {{ o.suggestedUserId }}Sin sugerencia |
{{ o.suggestedUserEmail || '—' }} | {{ o.propertyCount }} | {{ o.contractCount }} |
Reparación completada: {{ orphanRepairResult.fixed }} plaza(s) corregida(s).
Diagnóstico de ownership de plazas
Muestra qué plazas tienen problemas de ownership (usuario eliminado, MEMBER, etc.), qué contratos están desincronizados, y qué plazas están correctamente asignadas al admin del correo indicado. Filtra por correo para revisar una cuenta específica.
Plazas asignadas correctamente{{ diagEmail ? ' a ' + diagEmail : '' }} ({{ diagResult.adminEstates.length }})
Sin plazas asignadas a ese correo.
| Plaza | Admin | Propiedades | Contratos |
|---|---|---|---|
| {{ r.realEstateName }} | {{ r.ownerEmail }} | {{ r.propertyCount }} | {{ r.contractCount }} |
Plazas con ownership roto ({{ diagResult.brokenEstates.length }})
Ninguna plaza con problemas.
| Plaza | userId actual | Problema | Admin probable |
|---|---|---|---|
| {{ r.realEstateName }} | {{ r.currentUserEmail || r.currentUserId }} ({{ r.currentUserType || '—' }}) | {{ r.problem }} | {{ r.likelyAdminEmail || (r.likelyAdminId ? '#' + r.likelyAdminId : 'desconocido') }} |
Contratos con ownership roto ({{ diagResult.brokenContracts.length }})
Ningún contrato con problemas.
| Plaza | Contrato # | userId contrato | userId plaza | Problema |
|---|---|---|---|---|
| {{ r.realEstateName || '(sin plaza)' }} | {{ r.contractId }} | {{ r.contractUserEmail || r.contractUserId }} | {{ r.estateUserEmail || r.estateUserId || '—' }} | {{ r.problem }} |
Propiedades ocultas en contratos activos ({{ diagResult.hiddenContractProperties.length }})
Propiedades que aparecen en contratos activos pero son invisibles en el grid de Inmuebles. Causas: soft-deleted mientras estaban rentadas (SOFT_DELETED_IN_CONTRACT), realEstateId apuntando a la plaza equivocada (REALESTATE_MISMATCH) o disponibilidad incorrecta (DISPO_NOT_RENTED). La migración 1781379800000 y el endpoint de reparación corrigen esto automáticamente.
Ninguna propiedad oculta detectada.
| Propiedad | Plaza del contrato | Plaza de la propiedad | Arrendatario | Admin | Problema |
|---|---|---|---|---|---|
| {{ r.propertyName }} #{{ r.propertyNumber }} · {{ r.floor }} | {{ r.contractEstate || '—' }} | {{ r.propertyInEstate || '(sin plaza)' }} | {{ r.companyName || '—' }} | {{ r.adminEmail }} | {{ r.problem }} |
Facturación global
Datos fiscales de IDARI como emisor de las facturas que se cobran a los clientes por su suscripción (distinto del ContPaq de cada cliente, que sirve para que ellos facturen a sus inquilinos). El timbrado real (CFDI con XML/PDF) se habilita al conectar el PAC de la plataforma; por ahora solo se captura el emisor.
Datos del emisor
Parámetros SAT del CFDI
G03 = Gastos en general
81112501 = Licencias de software
04 = Tarjeta de crédito
PUE = Pago en una exhibición
Completa RFC, razón social, régimen y CP.
Emisor completo · falta conectar el PAC para timbrar.
Pendiente (PAC): subir los certificados CSD/FIEL de la plataforma y las credenciales del PAC para emitir el CFDI real. Hasta entonces, cada cobro genera un comprobante de pago (no fiscal).