Skip to content

Commit 68c720a

Browse files
committed
feat: api per la verifica di modifiche sui record per app
1 parent 07a54a3 commit 68c720a

2 files changed

Lines changed: 142 additions & 1 deletion

File tree

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<?php
2+
3+
/*
4+
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
5+
* Copyright (C) DevCode s.r.l.
6+
*
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
namespace API\App\v1;
22+
23+
use API\Interfaces\RetrieveInterface;
24+
use API\Resource;
25+
use Carbon\Carbon;
26+
27+
/**
28+
* Risorsa API per verificare se ci sono aggiornamenti disponibili per tutte le risorse principali.
29+
* Permette all'app di fare una sola chiamata per sapere se ci sono record modificati da sincronizzare.
30+
*/
31+
class VerificaAggiornamenti extends Resource implements RetrieveInterface
32+
{
33+
/**
34+
* Mappa delle risorse principali da controllare.
35+
* Ogni risorsa è associata alla sua classe per poter istanziarla e controllare gli aggiornamenti.
36+
*/
37+
private const RISORSE_DA_CONTROLLARE = [
38+
'clienti' => 'API\\App\\v1\\Clienti',
39+
'tecnici' => 'API\\App\\v1\\Tecnici',
40+
'interventi' => 'API\\App\\v1\\Interventi',
41+
'articoli' => 'API\\App\\v1\\Articoli',
42+
'impianti' => 'API\\App\\v1\\Impianti',
43+
'contratti' => 'API\\App\\v1\\Contratti',
44+
'preventivi' => 'API\\App\\v1\\Preventivi',
45+
'sedi' => 'API\\App\\v1\\Sedi',
46+
'sedi-azienda' => 'API\\App\\v1\\SediAzienda',
47+
'referenti' => 'API\\App\\v1\\Referenti',
48+
'seriali' => 'API\\App\\v1\\Seriali',
49+
'sessioni' => 'API\\App\\v1\\SessioniInterventi',
50+
'righe-interventi' => 'API\\App\\v1\\RigheInterventi',
51+
'stati-intervento' => 'API\\App\\v1\\StatiIntervento',
52+
'tipi-intervento' => 'API\\App\\v1\\TipiIntervento',
53+
'tariffe-tecnici' => 'API\\App\\v1\\TariffeTecnici',
54+
'tariffe-contratti' => 'API\\App\\v1\\TariffeContratti',
55+
'aliquote-iva' => 'API\\App\\v1\\AliquoteIva',
56+
'campi-personalizzati' => 'API\\App\\v1\\CampiPersonalizzati',
57+
'campi-personalizzati-valori' => 'API\\App\\v1\\CampiPersonalizzatiValori',
58+
'checklists' => 'API\\App\\v1\\Checklists',
59+
'pagamenti' => 'API\\App\\v1\\Pagamenti',
60+
'allegati-interventi' => 'API\\App\\v1\\AllegatiInterventi',
61+
];
62+
63+
/**
64+
* Verifica se ci sono record modificati per tutte le risorse principali.
65+
*
66+
* @param array $request Richiesta contenente last_sync_at
67+
* @return array Risultato con informazioni sui record modificati disponibili
68+
*/
69+
public function retrieve($request)
70+
{
71+
$last_sync_at = $request['last_sync_at'] && $request['last_sync_at'] != 'undefined'
72+
? new Carbon($request['last_sync_at'])
73+
: null;
74+
75+
$aggiornamenti_disponibili = false;
76+
$dettagli_risorse = [];
77+
$errori = [];
78+
79+
foreach (self::RISORSE_DA_CONTROLLARE as $nome_risorsa => $classe_risorsa) {
80+
try {
81+
// Verifica se la classe esiste
82+
if (!class_exists($classe_risorsa)) {
83+
$errori[] = "Classe non trovata: {$classe_risorsa}";
84+
continue;
85+
}
86+
87+
// Istanzia la risorsa
88+
$risorsa = new $classe_risorsa();
89+
90+
// Controlla se ci sono record modificati
91+
$record_modificati = $risorsa->getModifiedRecords($last_sync_at);
92+
$ha_modifiche = !empty($record_modificati);
93+
94+
// Se ci sono modifiche, segna che ci sono aggiornamenti
95+
if ($ha_modifiche) {
96+
$aggiornamenti_disponibili = true;
97+
}
98+
99+
// Salva i dettagli per questa risorsa
100+
$dettagli_risorse[$nome_risorsa] = [
101+
'ha_modifiche' => $ha_modifiche,
102+
'numero_modifiche' => count($record_modificati),
103+
'richiede_sincronizzazione' => $ha_modifiche,
104+
];
105+
106+
} catch (\Exception $e) {
107+
// Log dell'errore e continua con le altre risorse
108+
$errori[] = "Errore nel controllare {$nome_risorsa}: " . $e->getMessage();
109+
110+
// Log dell'errore per debugging
111+
$logger = logger();
112+
$logger->addRecord(\Monolog\Level::Error, "Errore in VerificaAggiornamenti per {$nome_risorsa}: " . $e->getMessage());
113+
}
114+
}
115+
116+
// Calcola statistiche generali
117+
$risorse_con_aggiornamenti = array_filter($dettagli_risorse, function($dettagli) {
118+
return $dettagli['richiede_sincronizzazione'];
119+
});
120+
121+
$totale_modifiche = array_sum(array_column($dettagli_risorse, 'numero_modifiche'));
122+
123+
return [
124+
'aggiornamenti_disponibili' => $aggiornamenti_disponibili,
125+
'last_sync_at' => $last_sync_at ? $last_sync_at->toISOString() : null,
126+
'timestamp_controllo' => (new Carbon())->toISOString(),
127+
'statistiche' => [
128+
'totale_risorse_controllate' => count(self::RISORSE_DA_CONTROLLARE),
129+
'risorse_con_aggiornamenti' => count($risorse_con_aggiornamenti),
130+
'totale_record_modificati' => $totale_modifiche,
131+
],
132+
'risorse' => $dettagli_risorse,
133+
'errori' => $errori,
134+
];
135+
}
136+
}

update/2_10.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `ord
7171
SELECT @id_setting := MAX(`id`) FROM `zz_settings`;
7272
INSERT INTO `zz_settings_lang` (`id_lang`, `id_record`, `title`, `help`) VALUES
7373
(1, @id_setting, 'Permetti l\'inserimento di allegati in attività completate', ''),
74-
(2, @id_setting, 'Allow attachment insertion in completed activities', '');
74+
(2, @id_setting, 'Allow attachment insertion in completed activities', '');
75+
76+
-- Risorsa api per la verifica modifica record
77+
78+
INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`)
79+
VALUES (NULL, 'app-v1', 'retrieve', 'verifica-aggiornamenti', 'API\\App\\v1\\VerificaAggiornamenti', '1');

0 commit comments

Comments
 (0)