Files
soft_usite/pkg/models/tarea.go
T
Lizandro GuarnizoandClaude Sonnet 4.6 bc79553b7e 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>
2026-07-06 20:18:26 -05:00

86 lines
2.6 KiB
Go

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" }
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
}