feat(tareas): módulo de tablero kanban con drag & drop, comentarios y Telegram
- Modelos Tarea y TareaComentario con GORM, migración automática - Estados: por_hacer → en_progreso → revisión → hecho; prioridades: baja/media/alta/urgente - Drag & drop entre columnas via SortableJS (PUT /tarea/:id/estado) - CRUD completo: crear, editar, eliminar; asignación a usuario + fecha límite - Panel lateral de detalle: historial de comentarios, adjuntar archivos (uploads/tareas/:id) - Telegram: notifica asignación, cambio de estado y comentarios nuevos via sendTelegramAdmin - Seed automático bajo módulo "Administración", solo rol Administrador Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
0901ed0d53
commit
bc79553b7e
@@ -101,6 +101,9 @@ func Migrate() {
|
||||
// Monitor de disponibilidad de URLs
|
||||
&models.UrlMonitor{},
|
||||
&models.UrlMonitorLog{},
|
||||
// Tablero de tareas
|
||||
&models.Tarea{},
|
||||
&models.TareaComentario{},
|
||||
); err != nil {
|
||||
log.Fatalf("Error during main migration: %v", err)
|
||||
}
|
||||
@@ -1040,3 +1043,39 @@ func SeedUrlMonitor() {
|
||||
}
|
||||
log.Println("[SEED] Seed de Monitor de URLs completado.")
|
||||
}
|
||||
|
||||
// SeedTareas agrega el submódulo "Tareas" al módulo "Administración" solo para el rol Administrador. Es idempotente.
|
||||
func SeedTareas() {
|
||||
db := app.Http.Database.DB
|
||||
var modulo models.Modules
|
||||
if err := db.Where("title = ?", "Administración").First(&modulo).Error; err != nil {
|
||||
log.Println("[SEED] Módulo 'Administración' no encontrado, se omite SeedTareas")
|
||||
return
|
||||
}
|
||||
url := "/app/tareas"
|
||||
var sub models.Submodules
|
||||
if err := db.Where("url = ?", url).First(&sub).Error; err != nil {
|
||||
sub = models.Submodules{
|
||||
Title: "Tareas",
|
||||
Description: "Tablero kanban de tareas internas",
|
||||
Url: url,
|
||||
ModuleId: modulo.ID,
|
||||
ModifiedAt: time.Now(),
|
||||
}
|
||||
if err := db.Create(&sub).Error; err != nil {
|
||||
log.Printf("[SEED] Error creando submódulo 'Tareas': %v", err)
|
||||
return
|
||||
}
|
||||
log.Printf("[SEED] Submódulo 'Tareas' creado")
|
||||
} else if sub.ModuleId != modulo.ID {
|
||||
db.Model(&sub).Update("module_id", modulo.ID)
|
||||
}
|
||||
var rol models.Roles
|
||||
if err := db.Where("name = ?", "Administrador").First(&rol).Error; err != nil {
|
||||
log.Printf("[SEED] Rol 'Administrador' no encontrado, se omite asignación: %v", err)
|
||||
} else {
|
||||
db.Model(&rol).Association("Submodules").Append(&[]models.Submodules{sub})
|
||||
log.Printf("[SEED] Submódulo 'Tareas' asignado al rol 'Administrador'")
|
||||
}
|
||||
log.Println("[SEED] Seed de Tareas completado.")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user