package models import ( "time" "github.com/sujit-baniya/fiber-boilerplate/app" "gorm.io/gorm" ) type Tarea struct { gorm.Model Titulo string `json:"titulo" gorm:"column:titulo;size:200"` Descripcion string `json:"descripcion" gorm:"column:descripcion;type:text"` Estado string `json:"estado" gorm:"column:estado;default:'por_hacer';index"` Prioridad string `json:"prioridad" gorm:"column:prioridad;default:'media'"` AsignadoID *uint `json:"asignado_id" gorm:"column:asignado_id;index"` Asignado *Users `json:"asignado" gorm:"foreignKey:AsignadoID"` CreadoPorID uint `json:"creado_por_id" gorm:"column:creado_por_id"` CreadoPor *Users `json:"creado_por" gorm:"foreignKey:CreadoPorID"` FechaLimite *time.Time `json:"fecha_limite" gorm:"column:fecha_limite"` Orden int `json:"orden" gorm:"column:orden;default:0"` } func (Tarea) TableName() string { return "tarea" } // RepararEstadosTareaInvalidos corrige tareas que quedaron con un estado que el // tablero Kanban no reconoce (columnas válidas: por_hacer, en_progreso, revision, // hecho). El agente de Telegram creó tareas con "pendiente"/"completada"/ // "cancelada" antes de esta corrección: se guardaban bien en la base de datos // pero no aparecían en ninguna columna del listado. Es idempotente — una vez // corregidas, no vuelve a tocarlas. func RepararEstadosTareaInvalidos() (int64, error) { db := app.Http.Database.DB var total int64 mapa := map[string]string{ "pendiente": "por_hacer", "completada": "hecho", "cancelada": "hecho", } for viejo, nuevo := range mapa { result := db.Model(&Tarea{}).Where("estado = ?", viejo).Update("estado", nuevo) if result.Error != nil { return total, result.Error } total += result.RowsAffected } return total, nil } type TareaComentario struct { ID uint `json:"id" gorm:"primaryKey;autoIncrement"` TareaID uint `json:"tarea_id" gorm:"column:tarea_id;index"` AutorID uint `json:"autor_id" gorm:"column:autor_id"` Autor *Users `json:"autor" gorm:"foreignKey:AutorID"` Contenido string `json:"contenido" gorm:"column:contenido;type:text"` Archivos string `json:"archivos" gorm:"column:archivos;type:text"` CreatedAt time.Time `json:"created_at"` } func (TareaComentario) TableName() string { return "tarea_comentario" } func GetAllTareas() ([]Tarea, error) { var items []Tarea err := app.Http.Database.DB. Preload("Asignado"). Preload("CreadoPor"). Order("estado ASC, orden ASC, created_at ASC"). Find(&items).Error return items, err } func GetTareaByID(id uint) (*Tarea, error) { var t Tarea err := app.Http.Database.DB. Preload("Asignado"). Preload("CreadoPor"). First(&t, id).Error return &t, err } func CreateTarea(t *Tarea) error { return app.Http.Database.DB.Create(t).Error } func SaveTarea(t *Tarea) error { return app.Http.Database.DB.Save(t).Error } func DeleteTarea(id uint) error { return app.Http.Database.DB.Delete(&Tarea{}, id).Error } func CambiarEstadoTarea(id uint, estado string) error { return app.Http.Database.DB.Model(&Tarea{}).Where("id = ?", id).Update("estado", estado).Error } func GetComentariosByTarea(tareaID uint) ([]TareaComentario, error) { var items []TareaComentario err := app.Http.Database.DB. Preload("Autor"). Where("tarea_id = ?", tareaID). Order("created_at ASC"). Find(&items).Error return items, err } func CreateComentario(c *TareaComentario) error { return app.Http.Database.DB.Create(c).Error }