# kondorcs.schedulelibrary.aifileprocessor

Estrazione automatica di dati da PDF documentali (certificati di pagamento, SAL, PDF generici).

Componente della piattaforma open source **MyTown** (gruppo `mytown-agpl-v3`; documentazione, installazione e architettura nel repository `platform`).

Il progetto MyTown e' realizzato da **Kondor CS Srl** con il supporto di **CNA Teramo** ed e' cofinanziato dall'**Unione Europea** - PR FESR Abruzzo 2021-2027, Intervento 1.1.1.1 "Sostegno a progetti di Ricerca e Innovazione" (Det. DPH006/182 del 23/07/2024). Sito del progetto: <https://www.mytown.tech>.

**Licenza**: GNU AGPL v3 (vedi `LICENSE`). Copyright (C) Kondor Consulting & Services S.r.l. Licenze commerciali e note sui marchi: `LICENSING.md` e `TRADEMARKS.md` nel repository `platform`.

---

# KondorCS.ScheduleLibrary.AIFileProcessor

Libreria scheduler C# per l'elaborazione automatica di file con chiamate AI, implementa `ILibraryProcess`.

## Descrizione

Questa libreria gestisce l'elaborazione automatica e schedulata di file (immagini, PDF) tramite servizi di intelligenza artificiale. Segue il pattern dello scheduler KondorCS con `ILibraryProcess`.

Il processo include:
- Timer automatico ogni 5 secondi per controllare file in coda
- Recupero file dal database PostgreSQL con stato `fu_ai_status = 1` (in attesa)
- Invio del file a un servizio AI esterno
- Ricezione e salvataggio della risposta AI
- Gestione automatica degli stati di elaborazione

## Utilizzo

### Configurazione nel Servizio Scheduler

```csharp
using KondorCS.Interface;
using KondorCS.ScheduleLibrary.AIFileProcessor;

// Preparare i parametri
KCSRequest request = new KCSRequest();
request.Params = new Dictionary<string, object>
{
    ["ConnDB"] = "Host=localhost;Database=mydb;Username=user;Password=pass",
    ["ai_url"] = "https://ai-service.example.com/api/process",
    ["debug"] = true,
    ["pt_id"] = 1,
    ["user_id"] = 100,
    ["enableStartThread"] = true
};

// Creare l'istanza dello scheduler
AIFileProcessor processor = new AIFileProcessor();

// Eseguire lo scheduler
Guid instanceProcess = Guid.NewGuid();
KCSResponse response = processor.Execute(request, instanceProcess);

if (response.CommandResponse == "OK")
{
    Console.WriteLine("Scheduler avviato con successo");
}
```

### Parametri KCSRequest

**Parametri richiesti:**
- `ConnDB` (string): Connection string PostgreSQL
- `ai_url` (string): URL del servizio AI

**Parametri opzionali:**
- `debug` (bool): Abilita log dettagliati (default: false)
- `pt_id` (int): ID del tipo di progetto (default: 0)
- `user_id` (int): ID utente (default: 0)
- `enableStartThread` (bool): Abilita elaborazione (default: true)

### Preparazione File

Per far elaborare un file:

```sql
INSERT INTO file_upload (fu_fui_id, fu_ft_id, fu_path, fu_name, fu_ai_status)
VALUES (123, 5, '/path/to/document.pdf', 'document.pdf', 1);
```

Lo scheduler lo prenderà in carico automaticamente entro 5 secondi.

## Componenti

### AIFileProcessor : ILibraryProcess
- Implementa `ILibraryProcess` per integrazione con KCSScheduleService
- Timer ogni 5 secondi (`HandleTimerAsync`)
- Elabora max 20 file per ciclo
- Timeout AI: 5 minuti

### DBController
Metodi principali:
- `GetFilesToProcess()`: Recupera file con status = 1 (max 20)
- `GetFileUploadById(int fu_id)`: Dettagli file
- `SetFileUploadStatus(int fu_id, int status)`: Aggiorna stato
- `UpdateFileForm(FileUpload file)`: Salva risposta AI

### Stati File (fu_ai_status)
- `0`: Errore
- `1`: In attesa (viene elaborato dallo scheduler)
- `2`: Completato

## Database

### file_upload
```sql
CREATE TABLE public.file_upload (
    fu_id int4 GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    fu_fui_id int4,
    fu_ft_id int4,
    fu_path varchar,
    fu_ai_response json,
    fu_name varchar,
    fu_ai_status int4 DEFAULT 0
);
```

### file_type
```sql
CREATE TABLE public.file_type (
    ft_id int4 GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    ft_name varchar,
    ft_form json,
    ft_fg_id int4,
    ft_desc varchar,
    ft_multi bool,
    ft_prompt varchar,
    ft_relative_path varchar
);
```

## Formato Richiesta AI

Multipart/form-data con:
- `json`: Dati form (Content-Type: application/json)
- `image`: File binario (JPEG/PNG/PDF)
- `documento_tipo`: ID tipo documento (ft_id)

## Build

Progetto **self-contained**: si compila senza `nuget restore` e senza percorsi esterni
(tutte le DLL sono committate nel repo). Requisiti: Visual Studio 2022 / MSBuild + .NET
Framework 4.5.2 Developer Pack.

```powershell
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
  KondorCS.ScheduleLibrary.AIFileProcessor.csproj /t:Rebuild /p:Configuration=Release
```

Output: `bin\<Debug|Release>\KondorCS.ScheduleLibrary.AIFileProcessor.dll`.

## Dipendenze

- .NET Framework 4.5.2
- `lib\` (terze parti, committate nel repo): itextsharp 5.5.13, BouncyCastle.Crypto,
  Newtonsoft.Json 13.0.3, Npgsql 4.0.12 + facade `System.*`
- `reference\` (proprietarie KondorCS, committate nel repo): KondorCS.Interface,
  KondorCS.ScheduleServices.Interface, KondorCS.Utils, KondorCS.ScheduleLibrary.PdfExtractor

> `KondorCS.ScheduleLibrary.PdfExtractor` è referenziato come **DLL** (in `reference\`),
> non più come ProjectReference: non serve avere il progetto sorgente affianco.
> `bin/`, `obj/`, `.vs/`, `packages/` sono gitignored (non si versionano gli output di build).

## Autore

KondorCS - 2025
