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:
co-authored by
Claude Opus 5
parent
c8e5afceb2
commit
5ac70a4d6e
@@ -3,6 +3,7 @@ package models
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/sujit-baniya/fiber-boilerplate/app"
|
||||
@@ -93,6 +94,11 @@ type CuentaPagar struct {
|
||||
TransaccionID *uint `json:"transaccion_id" gorm:"column:transaccion_id"`
|
||||
Transaccion *Transaccion `json:"transaccion" gorm:"foreignKey:TransaccionID"`
|
||||
Notas string `json:"notas" gorm:"column:notas;type:text"`
|
||||
// Soporte de la factura de compra (el documento del proveedor), igual que
|
||||
// Factura.Archivo para las facturas de venta.
|
||||
Archivo string `json:"archivo" gorm:"column:archivo"`
|
||||
OriginalName string `json:"original_name" gorm:"column:original_name"`
|
||||
TipoMime string `json:"tipo_mime" gorm:"column:tipo_mime"`
|
||||
}
|
||||
|
||||
func (CuentaPagar) TableName() string { return "contab_cuentas_pagar" }
|
||||
@@ -190,6 +196,26 @@ func CreateEntidad(e *Entidad) error {
|
||||
return app.Http.Database.DB.Create(e).Error
|
||||
}
|
||||
|
||||
// GetOrCreateEntidadProveedor busca un proveedor por nombre (sin distinguir
|
||||
// mayúsculas) y lo crea si no existe. Se usa para registrar facturas de compra
|
||||
// sin obligar a dar de alta al proveedor manualmente primero.
|
||||
func GetOrCreateEntidadProveedor(nombre string) (*Entidad, error) {
|
||||
nombre = strings.TrimSpace(nombre)
|
||||
if nombre == "" {
|
||||
return nil, fmt.Errorf("nombre de proveedor requerido")
|
||||
}
|
||||
var e Entidad
|
||||
err := app.Http.Database.DB.Where("LOWER(nombre) = LOWER(?)", nombre).First(&e).Error
|
||||
if err == nil {
|
||||
return &e, nil
|
||||
}
|
||||
e = Entidad{Nombre: nombre, Tipo: "proveedor", Activo: true}
|
||||
if err := app.Http.Database.DB.Create(&e).Error; err != nil {
|
||||
return nil, fmt.Errorf("no se pudo crear el proveedor: %w", err)
|
||||
}
|
||||
return &e, nil
|
||||
}
|
||||
|
||||
func UpdateEntidad(e *Entidad) error {
|
||||
return app.Http.Database.DB.Model(&Entidad{}).Where("id = ?", e.ID).Updates(map[string]interface{}{
|
||||
"nombre": e.Nombre,
|
||||
@@ -582,6 +608,14 @@ func DeleteCuentaCobro(id uint) error {
|
||||
// ─── CRUD: CuentaPagar ──────────────────────────────────────────────────────
|
||||
// =============================================================================
|
||||
|
||||
func GetCuentaPagarByID(id uint) (*CuentaPagar, error) {
|
||||
var item CuentaPagar
|
||||
if err := app.Http.Database.DB.First(&item, id).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &item, nil
|
||||
}
|
||||
|
||||
func GetAllCuentasPagar(limit, offset int, search string, estado string) ([]CuentaPagar, int64, error) {
|
||||
var items []CuentaPagar
|
||||
var total int64
|
||||
|
||||
@@ -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"`
|
||||
|
||||
Reference in New Issue
Block a user