- 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>
63 lines
2.0 KiB
Go
63 lines
2.0 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
|
)
|
|
|
|
// AdjuntarFacturaCompra toma el documento pendiente de Telegram para este chat
|
|
// y lo registra como una cuenta por pagar (factura de compra: un proveedor le
|
|
// factura a U-SITE), a diferencia de AdjuntarFacturaVenta que crea una Factura
|
|
// ligada a un cliente (U-SITE factura al cliente).
|
|
//
|
|
// El proveedor se busca por nombre y se crea si no existe, para no obligar a
|
|
// darlo de alta manualmente antes de poder registrar la primera compra.
|
|
func AdjuntarFacturaCompra(chatID int64, proveedorNombre, descripcion string, monto float64) (*models.CuentaPagar, error) {
|
|
if proveedorNombre == "" {
|
|
return nil, fmt.Errorf("nombre del proveedor requerido")
|
|
}
|
|
if monto <= 0 {
|
|
return nil, fmt.Errorf("monto debe ser mayor a cero")
|
|
}
|
|
att, ok := PopTelegramAttachment(chatID)
|
|
if !ok {
|
|
return nil, fmt.Errorf("no hay ningún documento pendiente en este chat; pide al usuario que lo envíe de nuevo")
|
|
}
|
|
|
|
entidad, err := models.GetOrCreateEntidadProveedor(proveedorNombre)
|
|
if err != nil {
|
|
_ = os.Remove(att.Path)
|
|
return nil, err
|
|
}
|
|
|
|
dir := "uploads/cuentas_pagar"
|
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
|
_ = os.Remove(att.Path)
|
|
return nil, fmt.Errorf("no se pudo crear el directorio: %w", err)
|
|
}
|
|
ext := filepath.Ext(att.OriginalName)
|
|
finalPath := filepath.Join(dir, fmt.Sprintf("%d_%s%s", entidad.ID, time.Now().Format("20060102150405"), ext))
|
|
if err := os.Rename(att.Path, finalPath); err != nil {
|
|
return nil, fmt.Errorf("no se pudo guardar el archivo: %w", err)
|
|
}
|
|
|
|
cp := &models.CuentaPagar{
|
|
EntidadID: entidad.ID,
|
|
Fecha: time.Now(),
|
|
Descripcion: descripcion,
|
|
Valor: monto,
|
|
Estado: "pendiente",
|
|
Archivo: finalPath,
|
|
OriginalName: att.OriginalName,
|
|
TipoMime: att.MimeType,
|
|
}
|
|
if err := models.CreateCuentaPagar(cp); err != nil {
|
|
return nil, fmt.Errorf("no se pudo registrar la cuenta por pagar: %w", err)
|
|
}
|
|
return cp, nil
|
|
}
|