diff --git a/src/API/App/AppResource.php b/src/API/App/AppResource.php index 6d4eec101..3487908e8 100644 --- a/src/API/App/AppResource.php +++ b/src/API/App/AppResource.php @@ -200,7 +200,7 @@ abstract class AppResource extends Resource implements RetrieveInterface, Create */ protected function mapModifiedRecords($records) { - if ($records instanceof Collection){ + if ($records instanceof Collection) { return $records->mapToGroups(function ($item, $key) { return [$item['id'] => $item]; })->toArray(); @@ -210,7 +210,7 @@ abstract class AppResource extends Resource implements RetrieveInterface, Create $accumulator[$item['id']] = $item; return $accumulator; - }); + }) ?: []; } /** diff --git a/src/API/App/v1/Flash/Intervento.php b/src/API/App/v1/Flash/Intervento.php new file mode 100644 index 000000000..96a4d8721 --- /dev/null +++ b/src/API/App/v1/Flash/Intervento.php @@ -0,0 +1,96 @@ +. + */ + +namespace API\App\v1\Flash; + +use API\App\v1\AllegatiInterventi; +use API\App\v1\Clienti; +use API\App\v1\Interventi; +use API\App\v1\RigheInterventi; +use API\App\v1\SessioniInterventi; +use API\Interfaces\UpdateInterface; +use API\Resource; +use Carbon\Carbon; + +class Intervento extends Resource implements UpdateInterface +{ + public function update($request) + { + // Elenco risorse API + $risorse = [ + 'cliente' => new Clienti(), + 'intervento' => new Interventi(), + + 'righe' => new RigheInterventi(), + 'sessioni' => new SessioniInterventi(), + 'allegati' => new AllegatiInterventi(), + ]; + $sezioni = array_keys($risorse); + + // Generazione record semplificati + $records = []; + foreach ($sezioni as $sezione) { + if (isset($request[$sezione][0])) { + foreach ($request[$sezione] as $record) { + $records[] = [$record, $risorse[$sezione]]; + } + } else { + $records[] = [$request[$sezione], $risorse[$sezione]]; + } + } + + // Controlli sui conflitti + $conflict = false; + foreach ($records as $key => [$record, $risorsa]) { + $record['updated_at'] = new Carbon($record['updated_at']); + $record['last_sync_at'] = new Carbon($record['last_sync_at']); + if (!$record['updated_at']->greaterThan($record['last_sync_at'])) { + unset($records[$key]); + continue; + } + + $modifiche = $risorsa->getModifiedRecords($record['last_sync_at']); + $modifiche = array_keys($modifiche); + + if (in_array($record['id'], $modifiche)) { + $conflict = true; + break; + } + } + + // Messaggio di conflitto in caso di problematica riscontrata + if ($conflict) { + return [ + 'status' => 200, + 'message' => 'CONFLICT', + ]; + } + + // Salvataggio delle modifiche + foreach ($records as [$record, $risorsa]) { + if (!empty($record['remote_id'])) { + $risorsa->updateRecord($record); + } else { + $risorsa->createRecord($record); + } + } + + return []; + } +} diff --git a/update/2_4_22.sql b/update/2_4_22.sql index cb5b1b877..2f1e6054d 100644 --- a/update/2_4_22.sql +++ b/update/2_4_22.sql @@ -191,4 +191,7 @@ ALTER TABLE `or_ordini` ADD `codice_commessa` VARCHAR(100) NULL AFTER `updated_a UPDATE `or_ordini` SET `numero_cliente`= `id_documento_fe` WHERE `id_documento_fe`!='' AND `id_documento_fe` IS NOT NULL; -- Fix nome file con il tipo documento di vendita -UPDATE `zz_prints` SET `filename` = '{tipo_documento} num. {numero} del {data}' WHERE `zz_prints`.`name` = 'Fattura di vendita'; \ No newline at end of file +UPDATE `zz_prints` SET `filename` = '{tipo_documento} num. {numero} del {data}' WHERE `zz_prints`.`name` = 'Fattura di vendita'; +-- Risorsa API per sincronizzazione rapida di un singolo intervento +INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`) VALUES +(NULL, 'app-v1', 'update', 'intervento-flash', 'API\\App\\v1\\Flash\\Intervento', '1');