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 }