fix: tareas del agente invisibles en el Kanban + facturas de compra por Telegram

- 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>
This commit is contained in:
Lizandro GD
2026-08-03 14:53:47 +00:00
co-authored by Claude Opus 5
parent c8e5afceb2
commit 5ac70a4d6e
10 changed files with 181 additions and 7 deletions
+24
View File
@@ -23,6 +23,30 @@ type Tarea struct {
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"`