Skip to content
Usuario

Businesses

Alta global de tenant

Crear negocio

Que resuelve el alta de negocio

El boton Crear negocio en /super-admin/businesses permite registrar un nuevo tenant MedSync desde Super Admin, con estado comercial inicial, plan, trial real y, opcionalmente, un administrador inicial del negocio.

Esta accion no crea pacientes, expedientes, recetas, citas clinicas, documentos, tratamientos ni odontograma. El alta prepara el tenant administrativo y configuracion operativa minima para que pueda iniciar uso.

FrontendVistaBusinessList.vue
EndpointAltaPOST /api/super-admin/businesses
AuditoriaEventoSUPER_ADMIN_BUSINESS_CREATE

Vista real de Negocios

La pantalla documentada es la vista Super Admin de negocios. En local puede verse como http://localhost:8081/super-admin/businesses si el frontend esta levantado en el puerto 8081. La ruta productiva dentro de la app es /super-admin/businesses.

ElementoArchivo realResponsabilidad
Ruta Vuesrc/router/routes/super-admin.jsDeclara path: ‘businesses’, nombre superAdminBusinesses, layout Super Admin y meta.role = ‘super_admin’.
Vista principalsrc/views/super-admin/businesses/BusinessList.vuePinta filtros, tabla, acciones por fila, modal de alta, modal de edicion, acciones comerciales y licencia.
Layoutsrc/core/layouts/super-admin.vueMuestra la navegacion lateral Super Admin y el item Negocios.
Servicio frontendsrc/services/core/superAdmin/DASuperAdminService.jsExpone getBusinesses, createBusiness, updateBusiness y acciones comerciales/licencia.
Constantes APIsrc/services/common/apiurl.jsDefine DAC_SUPER_ADMIN_BUSINESSES = “/api/super-admin/businesses”.

De donde sale la informacion que llena la tabla

Al montar la vista, mounted() ejecuta fetchBusinesses(). Esa funcion arma parametros con buildParams() y llama DASuperAdminService.getBusinesses(params). El servicio construye el query string y consume GET /api/super-admin/businesses.

GET /api/super-admin/businesses
?page=1
&pageSize=20
&search=
&active=
&status=
&subscriptionStatus=
&trialState=
&plan=
&sortBy=created_at
&sortDir=desc

El backend devuelve data y pagination. La vista asigna this.businesses = payload.data y actualiza pagina, total y totalPages. La tabla no filtra solo en memoria: busqueda, filtros, paginacion y ordenamiento son server-side.

Filtros de la vista de Negocios

Filtro UIParametro backendValores principalesQue hace
Buscar negociosearchTexto libreBusca negocios por datos administrativos soportados por el DAO.
ActivoactiveActivo, inactivo, todosFiltra por estado tecnico business.active.
Estado tecnicostatusactive, inactive, suspended, trialFiltra por campo legacy/técnico business.status.
Estado MedSyncsubscriptionStatustrial, active, past_due, suspended, cancelledFiltra por estado comercial MedSync real.
TrialtrialStateactive, expired, expiring_soonFiltra trials vigentes, vencidos o por vencer.
Planplanbasic, pro, enterpriseFiltra por plan comercial base.
Por paginapageSize10, 20, 50, 100Controla paginacion server-side.

Columnas de la tabla de Negocios

ColumnaCampo de responseQue significaOrdenable
NombrenameNombre administrativo del negocio o tenant.Si
Estado tecnicostatus, activeEstado legacy/técnico simple. No reemplaza el estado MedSync.Si
Estado MedSyncsubscription_statusEstado comercial real: trial, active, past_due, suspended o cancelled.Si
Planplan, plan_labelMuestra label amigable: Individual, Profesional o Clinica, conservando codigo interno.Si
Trial vencetrial_ends_atFecha de fin de trial si el negocio esta en prueba.Si
Dias restantestrial_days_remaining, is_trial_expiredMuestra dias restantes, trial vencido o no aplica.No
Operativois_operationalIndica si el tenant puede operar segun reglas de acceso MedSync.No
ActivoactiveEstado tecnico del negocio.Si
Usuarios totalestotal_usersCuentas de acceso asociadas al negocio.Si
Usuarios activosactive_usersCuentas activas asociadas al negocio.Si
Ultima actividadlast_activity_atUltima actividad agregada conocida para el negocio.Si
Creado / Actualizadocreated_at, updated_atFechas administrativas del negocio.Si
AccionesDerivado de getBusinessActions(business)Menu contextual por fila.No

Acciones de la tabla

Cada fila usa un menu contextual. La funcion getBusinessActions(business) decide que opciones mostrar segun subscription_status. Al elegir una accion, openBusinessAction(type, business) abre el modal correspondiente.

AccionCuando apareceEndpoint que consumeQue cambia
Editar datosSiempre.PATCH /api/super-admin/businesses/:idSolo datos administrativos: nombre, slug, razon social, email, telefono, direccion.
Ver licenciaSiempre.GET /api/super-admin/businesses/:id/license-summaryNo modifica datos. Muestra plan, uso, limites, extras y excedidos.
Extender trialSolo si subscription_status = trial.PATCH /api/super-admin/businesses/:id/trial/extendAumenta trial_ends_at. Mantiene estado trial.
Activar negocioSi esta en trial.PATCH /api/super-admin/businesses/:id/subscription-statusCambia subscription_status a active.
Reactivar negocioSi esta suspended, cancelled o past_due.PATCH /api/super-admin/businesses/:id/subscription-statusCambia a active y limpia fechas de suspension/cancelacion segun backend.
Marcar pago pendienteSi no esta past_due ni cancelled.PATCH /api/super-admin/businesses/:id/subscription-statusCambia a past_due. Actualmente bloquea tenant.
Suspender negocioSi no esta suspended ni cancelled.PATCH /api/super-admin/businesses/:id/subscription-statusCambia a suspended, marca suspended_at y bloquea tenant.
Cancelar negocioSi no esta cancelled.PATCH /api/super-admin/businesses/:id/subscription-statusCambia a cancelled, marca cancelled_at y bloquea tenant.
Cambiar planSiempre.PATCH /api/super-admin/businesses/:id/planCambia plan entre basic, pro y enterprise.

Acciones y confirmaciones

AccionConfirmacion UIMotivoDespues de exito
Editar datosModal de confirmacion con campos modificados.No aplica como obligatorio.Snackbar y fetchBusinesses().
Extender trialModal muestra fecha actual y estimada.Opcional.Refresca tabla y recalcula dias restantes.
SuspenderModal advierte bloqueo tenant.Obligatorio.Chip cambia a Suspendido y is_operational debe quedar bloqueado.
CancelarDebe escribir CANCELAR.Obligatorio.Chip cambia a Cancelado y tenant queda bloqueado.
Pago pendienteModal advierte que bloquea tenant actualmente.Obligatorio.Chip cambia a Pago pendiente.
Activar / reactivarModal explicito.Opcional.Chip cambia a Activo si backend confirma.
Cambiar planModal con selector basic/pro/enterprise.Opcional.Plan visual cambia y licencia usa nuevos limites base.
Editar extras licenciaDesde modal Ver licencia.Obligatorio si algun extra es mayor a 0.Refresca licencia y tabla.

Flujo completo desde la UI

  1. Super Admin entra a /super-admin/businesses.
  2. Presiona el boton Crear negocio.
  3. La vista abre un modal persistente con datos de negocio, estado MedSync y admin inicial.
  4. El usuario llena campos y pulsa Revisar creacion.
  5. Frontend ejecuta validaciones locales y abre modal de confirmacion.
  6. Al confirmar, confirmCreateBusiness() arma payload con buildCreatePayload().
  7. El servicio llama DASuperAdminService.createBusiness(payload).
  8. Backend valida token, sesion activa si aplica y rol super_admin.
  9. DAO valida negocio, estado MedSync, trial, plan y admin inicial.
  10. DAO ejecuta transaccion: inserta negocio, configuracion operativa minima y admin opcional.
  11. Backend registra auditoria administrativa.
  12. Frontend muestra snackbar, cierra modales, vuelve a pagina 1 y refresca la tabla.

Campos visibles en el modal

SeccionCampoUsoValidacion principal
Datos del negocioNombre del negocioNombre comercial del tenant.Obligatorio.
Datos del negocioSlugIdentificador amigable. Si va vacio, backend lo genera desde el nombre.Backend normaliza a minusculas, numeros y guiones.
Datos del negocioRazon socialNombre legal o administrativo.Opcional.
Datos del negocioTelefono, correo, direccionDatos administrativos de contacto del negocio.Email debe tener formato valido si se captura.
Estado MedSyncEstado inicialDefine si inicia como trial o active.Solo permite prueba gratis o activo.
Estado MedSyncPlanPlan comercial base.Solo basic, pro, enterprise.
Estado MedSyncDias de pruebaDuracion inicial del trial.Entero entre 1 y 365. Default UI: 60.
Admin inicialCrear usuario administrador inicialPermite crear la primera cuenta admin del tenant.Opcional.
Admin inicialNombre, telefono, correoDatos de acceso del admin inicial.Nombre y telefono obligatorios si se crea admin. Email valido si existe.
Admin inicialContrasena temporalClave inicial del admin.Minimo 8 caracteres y confirmacion exacta.
Admin inicialRolLa UI lo fija como admin.No permite super_admin.

Payload que envia el frontend

El frontend limpia strings vacios antes de enviar. Para trial agrega trial_days; para active no lo necesita.

{
"business": {
  "name": "Clinica Demo",
  "slug": "clinica-demo",
  "legalName": "Clinica Demo SA de CV",
  "phone": "5555555555",
  "email": "admin@demo.local",
  "address": "Direccion administrativa",
  "status": "active",
  "active": true,
  "plan": "basic",
  "subscription_status": "trial",
  "trial_days": 60
},
"adminUser": {
  "create": true,
  "name": "Admin Demo",
  "email": "admin@demo.local",
  "telephone": "5555555555",
  "password": "********",
  "role": "admin"
}
}

En el modal de confirmacion se muestra nombre, estado inicial, plan, dias de trial y admin inicial. Nunca debe mostrar la contrasena.

Endpoint y cadena backend

CapaArchivo o funcionResponsabilidad
Rutaroutes/mysql/super-admin.jsDeclara POST /businesses con Token.Auth y requireRole(‘super_admin’).
ControllerSuperAdminController.createBusinessPasa body y actor del token al DAO.
DAOSuperAdminDao.createBusinessValida, abre transaccion, inserta negocio/admin/configuracion y responde.
AuditoriaAdminAuditDao.recordRegistra SUPER_ADMIN_BUSINESS_CREATE con metadata segura.

Validaciones backend

ValidacionReglaError esperado
Nombrebusiness.name obligatorio.400
Estado MedSync inicialSolo trial o active.400
Dias trialSi es trial: entero entre 1 y 365. Default: 60.400
Fechas trialSi se envian, deben ser fechas validas.400
SlugSe normaliza; si no puede generarse, falla.400
Duplicado negocioNo puede existir mismo nombre o slug.409
Admin inicialNombre, telefono y password valido si create=true.400
Rol adminBackend permite admin o business_admin; UI envia admin.400 si rol invalido.
Usuario admin duplicadoNo puede existir telefono o correo activo igual.409
PermisosSin token: no autorizado. Usuario no super_admin: prohibido.401 / 403

SQL principal: insertar negocio

El alta inserta el tenant en business. El estado tecnico queda active, el estado comercial queda en subscription_status y el plan queda en plan.

INSERT INTO business (
  id_business,
  name,
  legal_name,
  slug,
  email,
  phone,
  address,
  status,
  subscription_status,
  trial_starts_at,
  trial_ends_at,
  current_period_starts_at,
  current_period_ends_at,
  plan,
  active,
  created_at,
  created_by
) VALUES (
  :id_business,
  :name,
  :legal_name,
  :slug,
  :email,
  :phone,
  :address,
  'active',
  :subscription_status,
  CASE WHEN :subscription_status = 'trial' THEN COALESCE(:trial_starts_at, NOW()) ELSE NULL END,
  CASE
    WHEN :subscription_status != 'trial' THEN NULL
    WHEN :trial_ends_at IS NOT NULL THEN :trial_ends_at
    ELSE DATE_ADD(COALESCE(:trial_starts_at, NOW()), INTERVAL :trial_days DAY)
  END,
  CASE WHEN :subscription_status = 'active' THEN NOW() ELSE NULL END,
  NULL,
  :plan,
  :active,
  NOW(),
  :created_by
);

Si nace como trial

  • subscription_status = ‘trial’.
  • trial_starts_at = NOW() si no se manda fecha.
  • trial_ends_at = trial_starts_at + trial_days.
  • current_period_starts_at = NULL.
  • El tenant opera mientras el trial este vigente.

Si nace como active

  • subscription_status = ‘active’.
  • trial_starts_at = NULL.
  • trial_ends_at = NULL.
  • current_period_starts_at = NOW().
  • Se usa si ya es cliente pagado o debe operar sin prueba.

Configuracion operativa minima creada

Ademas de business, el DAO crea configuracion administrativa minima. Esto prepara el tenant, pero no crea datos clinicos.

TablaQue insertaPara que sirve
appointment_configRegistro default con duracion 30 y timezone America/Mexico_City.Configuracion operativa base de agenda del negocio.
ui_theme_configurationTema medical-blue si existe activo en catalogo.Configuracion visual base del tenant.

Aunque existe una configuracion de agenda, esta accion no crea citas reales ni datos de pacientes.

SQL de configuracion minima

INSERT INTO appointment_config (
  id_appointment_config,
  id_business,
  enabled,
  default_appointment_duration,
  timezone,
  active,
  created_at,
  created_by
) VALUES (
  :id_business_default,
  :id_business,
  1,
  30,
  'America/Mexico_City',
  1,
  NOW(),
  :created_by
);

-- Si existe el tema activo
INSERT INTO ui_theme_configuration (
  id_ui_theme_configuration,
  id_business,
  id_cat_ui_theme,
  active,
  created_by,
  created_at
) VALUES (
  UUID(),
  :id_business,
  :id_cat_ui_theme,
  1,
  :created_by,
  NOW()
);

Admin inicial opcional

Si adminUser.create = true, el backend crea una cuenta en login asociada al nuevo negocio. La contrasena se hashea con encript() antes de guardar. El response nunca devuelve password ni hash.

INSERT INTO login (
  id_login,
  id_business,
  id_rol,
  name,
  email,
  telephone,
  password,
  locked,
  active,
  created_at,
  created_by
) VALUES (
  :id_login,
  :id_business,
  :id_rol,
  :name,
  :email,
  :telephone,
  :password_hash,
  0,
  1,
  NOW(),
  :created_by
);

Transaccion y consistencia

El alta usa una transaccion para los inserts criticos. Si falla validacion, duplicado, rol, negocio o admin, se ejecuta rollback. La auditoria se registra despues del commit siguiendo el patron del modulo.

flowchart TD
A[Confirmar crear negocio] --> B[POST /api/super-admin/businesses]
B --> C[Token.Auth]
C --> D[requireRole super_admin]
D --> E[SuperAdminController.createBusiness]
E --> F[SuperAdminDao.createBusiness]
F --> G[Validar payload]
G --> H{Valido?}
H -- No --> I[400 o 409 controlado]
H -- Si --> J[BEGIN transaction]
J --> K[INSERT business]
K --> L[INSERT appointment_config]
L --> M[INSERT ui_theme_configuration si aplica]
M --> N{Crear admin inicial?}
N -- Si --> O[Hash password + INSERT login]
N -- No --> P[SELECT business creado]
O --> P
P --> Q[COMMIT]
Q --> R[Auditoria SUPER_ADMIN_BUSINESS_CREATE]
R --> S[Response 201]
S --> T[Frontend refresca tabla]

Auditoria del alta

El evento registrado es SUPER_ADMIN_BUSINESS_CREATE. La metadata explica que se creo, si hubo admin inicial, estado MedSync, trial, plan y configuracion default.

{
"created_admin": true,
"admin_login_id": "...",
"business_name": "Clinica Demo",
"business_status": "active",
"subscription_status": "trial",
"trial_days": 60,
"trial_starts_at": "...",
"trial_ends_at": "...",
"plan": "basic",
"default_operational_config": {
  "appointment_config": true,
  "ui_theme": true
}
}

No debe guardar password, hash, token, refresh token, pacientes, expedientes, recetas, diagnosticos, notas medicas ni payloads clinicos.

Response esperado y efecto en UI

El backend responde 201. El wrapper HTTP del frontend trata respuestas 2xx como exito. Despues de crear, la tabla vuelve a pagina 1 y ejecuta de nuevo GET /api/super-admin/businesses.

{
"success": true,
"message": "Negocio creado correctamente",
"data": {
  "business": {
    "id_business": "...",
    "name": "Clinica Demo",
    "slug": "clinica-demo",
    "active": true,
    "status": "active",
    "subscription_status": "trial",
    "trial_starts_at": "...",
    "trial_ends_at": "...",
    "plan": "basic",
    "created_at": "..."
  },
  "adminUser": {
    "id_login": "...",
    "name": "Admin Demo",
    "email": "admin@demo.local",
    "telephone": "5555555555",
    "role": "admin",
    "active": true
  }
}
}

Que se refleja despues del alta

LugarQue cambiaPor que importa
Listado de negociosAparece el nuevo negocio con estado MedSync, plan, trial y operativo.Confirma que el alta fue persistida.
DashboardAumentan conteos de negocios, trial o active y posiblemente usuarios.Permite validar impacto agregado.
Usuarios Super AdminSi se creo admin inicial, aparece como usuario de acceso.Confirma creacion de cuenta tenant.
AuditoriaAparece SUPER_ADMIN_BUSINESS_CREATE.Da trazabilidad administrativa.
Login tenantEl admin inicial puede iniciar sesion si el negocio esta operativo.Valida punta a punta sin tocar datos clinicos.

Privacidad y limites del alta

  • No usa applyTenantToBody().
  • No usa default-business.
  • No usa endpoints legacy /api/business/create ni /api/user/create.
  • No crea pacientes.
  • No crea expedientes ni historias clinicas.
  • No crea recetas, citas, documentos clinicos, tratamientos ni odontograma.
  • No devuelve password, hash, token ni refresh token.
  • No permite crear super_admin desde admin inicial.

Errores comunes al crear negocio

ErrorCausa probableAccion
400Nombre faltante, estado MedSync invalido, trial_days fuera de rango o rol invalido.Revisar formulario y payload.
401Token ausente, expirado o sesion cerrada.Volver a iniciar sesion.
403Usuario no es super_admin.Validar rol y endpoint.
409Negocio duplicado o admin inicial con telefono/correo activo existente.Usar otro nombre, slug, telefono o correo.
Se creo pero UI mostro errorWrapper HTTP no aceptaba 201 en versiones anteriores.Confirmar que el wrapper acepte respuestas 2xx.