- El agente creaba tareas con estado='pendiente' (default), pero el tablero Kanban del dashboard solo reconoce por_hacer/en_progreso/revision/hecho. La tarea se guardaba bien (por eso llegaba el correo de notificación) pero no aparecía en ninguna columna. Se corrigen los enums y el default de las tools crear_tarea/actualizar_estado_tarea, y se agrega una reparación única al arranque que corrige las tareas ya creadas con el estado inválido. - adjuntar_factura siempre asumía factura de VENTA (ligada a un cliente). Se agrega adjuntar_factura_compra: cuando un proveedor le factura a U-SITE (no al revés), busca/crea la Entidad proveedor y registra una cuenta por pagar con el documento adjunto (se agregan campos archivo/original_name/tipo_mime a CuentaPagar, que no los tenía). El prompt del sistema instruye a Claude a decidir la dirección leyendo quién emite y quién recibe el documento. De paso: endpoint de descarga del soporte de la factura de compra, expuesto también en el dashboard (/app/contabilidad/cuentas-pagar). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
110 lines
3.5 KiB
Go
110 lines
3.5 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" }
|
|
|
|
// 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
|
|
}
|