AO
Tiempo
Asuntos, issues y registro de horas del estudio.
Entrar con Microsoft
AO
Tiempo
Registrar tiempo
Salir
Semana
Asuntos
Cuentas
Informes
‹
hoy
›
Semana
Mes
Yo
+ Añadir fila
Total:
+
Fecha
Issue
Asunto · Cuenta
Descripción
Registrado
Facturable
×
Sin registros en este período.
Issue
Total
Total
Sin registros. Usa «+ Añadir fila» para empezar.
Todos
Abiertos
Cerrados
Todas las cuentas
+ Nuevo asunto
Asunto
Cuenta
Estado
Actualizado
Sin asuntos.
Todas
Abiertas
Cerradas
Archivadas
Todas las categorías
+ Nueva cuenta
Nombre
Clave
Cliente
Responsable
Categoría
Estado
Sin cuentas.
→
Todas las cuentas
Todos los usuarios
Por cuenta
Por usuario
Por asunto
Por issue
{ if ($store.reports.mode==='resumen') $nextTick(() => renderChart()); })" class="btn btn-primary btn-sm" :disabled="$store.reports.loading || ($store.reports.mode==='cuenta' && !$store.reports.accountId)">
Exportar CSV
Exportar CSV
CSV
Exportar PDF
Facturable
Registrado
Registros
Facturable (h)
Registrado (h)
%
Registros
Elige el período y pulsa «Generar».
No facturable
Restaurar
Limpiar
Fecha
Autor
Cuenta
Issue
Descripción
Registrado
Facturable (h)
NF
↺
Total
Elige el período (y opcionalmente cuenta/usuario) y pulsa «Generar».
Total facturable:
Total registrado:
Cuenta / Asunto / Issue / Usuario / Registro de trabajo
Facturable
Registrado
Elige una cuenta y un período, luego pulsa «Generar».
×
Editar
Issues
{ name=''; $store.notifications.add('Issue creado', 'success'); }).catch(() => $store.notifications.add('Error al crear', 'error')); }">
{ name=''; $store.notifications.add('Issue creado', 'success'); }).catch(() => $store.notifications.add('Error al crear', 'error'))">+
$store.notifications.add('Estado actualizado', 'success'))">
Abierto
En curso
Cerrado
$store.notifications.add('Asignación actualizada', 'success'))">
Sin asignar
Editar
Registrar tiempo
$store.notifications.add('Issue eliminado', 'success')).catch(e => $store.notifications.add(e.response?.data?.error || 'No se pudo eliminar', 'error'))" class="btn btn-ghost btn-sm" style="color:var(--red);">×
Sin horas registradas.
×
Editar
Cliente
Responsable
Categoría
Asuntos
Sin asuntos.
Editar
×
Asunto *
Elegir asunto…
Issue *
Elegir issue…
+
Crear
Fecha *
Horas *
(1.5, 1:30, 1h 30m)
Descripción *
No facturable
Eliminar
Cancelar
Añadir
Nombre *
Cuenta *
Elegir cuenta…
Descripción
Estado
Abierto
Cerrado
{ open=false; $store.notifications.add('Asunto eliminado', 'success'); }).catch(e => $store.notifications.add(e.response?.data?.error || 'No se pudo eliminar', 'error'))" class="btn btn-danger btn-sm">Eliminar
Cancelar
{ open = false; $store.notifications.add(editing ? 'Asunto actualizado' : 'Asunto creado', 'success'); }) .catch(e => $store.notifications.add(e.response?.data?.error || 'Error al guardar', 'error')) .finally(() => saving = false); " class="btn btn-primary" :disabled="saving || !form.name.trim() || !form.accountId" x-text="saving ? 'Guardando…' : 'Guardar'">
Editar issue
Nombre *
Descripción
Estado
Abierto
En curso
Cerrado
Asignado a
Sin asignar
Cuenta de facturación
(por defecto, la del asunto)
Cancelar
{ open = false; $store.notifications.add('Issue actualizado', 'success'); }) .catch(e => $store.notifications.add(e.response?.data?.error || 'Error al guardar', 'error')) .finally(() => saving = false); " class="btn btn-primary" :disabled="saving || !form.name.trim()" x-text="saving ? 'Guardando…' : 'Guardar'">
Nombre *
Clave
(auto si vacío)
Cliente
Responsable
—
Categoría
Estado
Abierta
Cerrada
Archivada
{ open=false; $store.notifications.add('Cuenta eliminada', 'success'); }).catch(e => $store.notifications.add(e.response?.data?.error || 'No se pudo eliminar', 'error'))" class="btn btn-danger btn-sm">Eliminar
Cancelar
u.email === form.leadEmail)?.name; if (leadName) data.leadName = leadName; const p = editing ? $store.accounts.update(editing.accountId, data) : $store.accounts.create(data); p.then(() => { open = false; $store.notifications.add(editing ? 'Cuenta actualizada' : 'Cuenta creada', 'success'); }) .catch(e => $store.notifications.add(e.response?.data?.error || 'Error al guardar', 'error')) .finally(() => saving = false); " class="btn btn-primary" :disabled="saving || !form.name.trim()" x-text="saving ? 'Guardando…' : 'Guardar'">