Skip to content

Commit 950016b

Browse files
feat: migliorie API calendar
1 parent 8c2dbd8 commit 950016b

2 files changed

Lines changed: 88 additions & 67 deletions

File tree

modules/interventi/src/API/v1/Sync.php

Lines changed: 83 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
use API\Interfaces\UpdateInterface;
2525
use API\Resource;
2626
use Carbon\Carbon;
27+
use Modules\Anagrafiche\Anagrafica;
28+
use Modules\Interventi\Components\Sessione;
29+
use Modules\Interventi\Intervento;
2730
use Modules\Interventi\Stato;
31+
use Modules\TipiIntervento\Tipo as TipoSessione;
2832

2933
class Sync extends Resource implements RetrieveInterface, UpdateInterface
3034
{
@@ -33,12 +37,32 @@ public function retrieve($request)
3337
$database = database();
3438
$user = $this->getUser();
3539

40+
// Controllo permessi per il modulo Interventi
41+
$module = \Models\Module::where('name', 'Interventi')->first();
42+
$permission = \Modules::getPermission($module->id);
43+
44+
// Verifica se l'utente ha permessi di lettura per il modulo Interventi
45+
if (!in_array($permission, ['r', 'rw']) || (!$user->anagrafica->isTipo('Tecnico') && !$user->anagrafica->isTipo('Cliente'))) {
46+
return [
47+
'custom' => '',
48+
];
49+
}
50+
3651
// Normalizzazione degli interventi a database
3752
$database->query('UPDATE in_interventi_tecnici SET summary = (SELECT ragione_sociale FROM an_anagrafiche INNER JOIN in_interventi ON an_anagrafiche.idanagrafica=in_interventi.idanagrafica WHERE in_interventi.id=in_interventi_tecnici.idintervento) WHERE summary IS NULL');
3853
$database->query('UPDATE in_interventi_tecnici SET uid = id WHERE uid IS NULL');
54+
$database->query('UPDATE in_interventi_tecnici SET description = (SELECT richiesta FROM in_interventi WHERE in_interventi.id=in_interventi_tecnici.idintervento) WHERE description=""');
3955

4056
// Individuazione degli interventi
41-
$query = 'SELECT in_interventi_tecnici.id AS idriga, in_interventi_tecnici.idintervento, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=in_interventi.idanagrafica) AS cliente, richiesta, orario_inizio, orario_fine, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS nome_tecnico, summary FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE DATE(orario_inizio) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() + INTERVAL 3 MONTH AND deleted_at IS NULL';
57+
$query = 'SELECT
58+
in_interventi_tecnici.id AS idriga, in_interventi_tecnici.idintervento, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=in_interventi.idanagrafica) AS cliente, in_interventi_tecnici.description, orario_inizio, orario_fine, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=idtecnico) AS nome_tecnico, summary
59+
FROM
60+
in_interventi_tecnici
61+
INNER JOIN
62+
in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id
63+
LEFT JOIN `in_tipiintervento` ON `in_interventi_tecnici`.`idtipointervento` = `in_tipiintervento`.`id`
64+
WHERE
65+
DATE(orario_inizio) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() + INTERVAL 3 MONTH AND in_interventi.deleted_at IS NULL';
4266

4367
if ($user->anagrafica->isTipo('Tecnico')) {
4468
$query .= ' AND in_interventi_tecnici.idtecnico = '.prepare($user['idanagrafica']);
@@ -55,9 +79,9 @@ public function retrieve($request)
5579
$result .= "PRODID:-// OpenSTAManager\n";
5680

5781
foreach ($rs as $r) {
58-
$richiesta = str_replace("\r\n", "\n", strip_tags((string) $r['richiesta']));
59-
$richiesta = str_replace("\r", "\n", $richiesta);
60-
$richiesta = str_replace("\n", '\\n', $richiesta);
82+
$description = str_replace("\r\n", "\n", strip_tags((string) $r['description']));
83+
$description = str_replace("\r", "\n", $description);
84+
$description = str_replace("\n", '\\n', $description);
6185

6286
$r['summary'] = str_replace("\r\n", "\n", $r['summary']);
6387

@@ -72,7 +96,7 @@ public function retrieve($request)
7296
$result .= 'DTSTART:'.$inizio->format('Ymd\THis')."\n";
7397
$result .= 'DTEND:'.$fine->format('Ymd\THis')."\n";
7498
$result .= 'SUMMARY:'.html_entity_decode($r['summary'])."\n";
75-
$result .= 'DESCRIPTION:'.html_entity_decode($richiesta, ENT_QUOTES, 'UTF-8')."\n";
99+
$result .= 'DESCRIPTION:'.html_entity_decode($description, ENT_QUOTES, 'UTF-8')."\n";
76100
$result .= "END:VEVENT\n";
77101
}
78102

@@ -88,102 +112,95 @@ public function update($request)
88112
$database = database();
89113
$user = $this->getUser();
90114

115+
// Controllo permessi per il modulo Interventi
116+
$module = \Models\Module::where('name', 'Interventi')->first();
117+
$permission = \Modules::getPermission($module->id);
118+
119+
// Verifica se l'utente ha permessi di scrittura per il modulo Interventi
120+
if (!in_array($permission, ['rw'])) {
121+
return;
122+
}
123+
91124
// Normalizzazione degli interventi a database
92125
$database->query('UPDATE in_interventi_tecnici SET summary = (SELECT ragione_sociale FROM an_anagrafiche INNER JOIN in_interventi ON an_anagrafiche.idanagrafica=in_interventi.idanagrafica WHERE in_interventi.id=in_interventi_tecnici.idintervento) WHERE summary IS NULL');
93126
$database->query('UPDATE in_interventi_tecnici SET uid = id WHERE uid IS NULL');
127+
$database->query('UPDATE in_interventi_tecnici SET description = (SELECT richiesta FROM in_interventi WHERE in_interventi.id=in_interventi_tecnici.idintervento) WHERE description=""');
94128

95129
// Interpretazione degli eventi
96130
$idtecnico = $user['idanagrafica'];
97131

98-
$response = API\Response::getRequest(true);
132+
$response = \API\Response::getRequest(true);
99133

100134
$ical = new \iCalEasyReader();
101135
$events = $ical->load($response);
102136

103137
foreach ($events['VEVENT'] as $event) {
104-
$description = $event['DESCRIPTION'];
105-
106138
// Individuazione idriga di in_interventi_tecnici
107139
if (string_contains($event['UID'], '-')) {
108140
$idriga = 'NEW';
109141
} else {
110142
$idriga = $event['UID'];
111143
}
112144

145+
$start = is_array($event['DTSTART']) ? $event['DTSTART']['VALUE'] : $event['DTSTART'];
146+
$end = is_array($event['DTEND']) ? $event['DTEND']['VALUE'] : $event['DTEND'];
147+
113148
// Timestamp di inizio
114-
$orario_inizio = \DateTime::createFromFormat('Ymd\\THi', $event['DTSTART'])->format(Intl\Formatter::getStandardFormats()['timestamp']);
149+
$orario_inizio = \DateTime::createFromFormat('Ymd\\THis', $start)->format(\Intl\Formatter::getStandardFormats()['timestamp']);
115150

116151
// Timestamp di fine
117-
$orario_fine = \DateTime::createFromFormat('Ymd\\THi', $event['DTEND'])->format(Intl\Formatter::getStandardFormats()['timestamp']);
152+
$orario_fine = \DateTime::createFromFormat('Ymd\\THis', $end)->format(\Intl\Formatter::getStandardFormats()['timestamp']);
118153

119154
// Descrizione
120-
$richiesta = $event['DESCRIPTION'];
121-
$richiesta = str_replace('\\r\\n', "\n", $richiesta);
122-
$richiesta = str_replace('\\n', "\n", $richiesta);
155+
$description = is_array($event['DESCRIPTION']) ? $event['DESCRIPTION']['VALUE']: $event['DESCRIPTION'];
156+
// Rimozione prefisso tipo "text/html,2":TESTO per ottenere solo TESTO
157+
if (preg_match('/^[^:]+:(.*)$/', $description, $matches)) {
158+
$description = $matches[1];
159+
}
160+
$description = str_replace('\\r\\n', "\n", $description);
161+
$description = str_replace('\\n', "\n", $description);
123162

124163
$summary = trim((string) $event['SUMMARY']);
125164
$summary = str_replace('\\r\\n', "\n", $summary);
126165
$summary = str_replace('\\n', "\n", $summary);
127166

128-
// Nuova attività
167+
// Creazione nuova attività o modifica attività creata dal calendario
129168
if ($idriga == 'NEW') {
130-
$rs_copie = $database->fetchArray('SELECT * FROM in_interventi_tecnici WHERE uid = '.prepare($event['UID']));
131-
132-
if (!empty($rs_copie)) {
133-
$idintervento = $rs_copie[0]['idintervento'];
134-
135-
$database->update('in_interventi_tecnici', [
136-
'orario_inizio' => $orario_inizio,
137-
'orario_fine' => $orario_fine,
138-
'summary' => $summary,
139-
], [
140-
'uid' => $event['UID'],
141-
'idtecnico' => $idtecnico,
142-
]);
143-
144-
$database->query('UPDATE in_interventi SET richiesta='.prepare($richiesta).', oggetto='.prepare($summary).' WHERE idintervento = (SELECT idintervento FROM in_interventi_tecnici WHERE idintervento = '.prepare($idintervento).' AND idtecnico = '.prepare($idtecnico).' LIMIT 0,1)');
145-
146-
$idriga = $rs_copie[0]['id'];
169+
$sessione = Sessione::where('uid', $event['UID'])->first();
170+
171+
if ($sessione) {
172+
$sessione->orario_inizio = $orario_inizio;
173+
$sessione->orario_fine = $orario_fine;
174+
$sessione->summary = $summary;
175+
$sessione->description = $description;
176+
$sessione->save();
147177
} else {
148-
$idintervento = get_new_idintervento();
149-
$stato = Stato::where('name', 'Chiamato')->first()->id;
150-
151-
$database->insert('in_interventi', [
152-
'idintervento' => $idintervento,
153-
'idanagrafica' => setting('Azienda predefinita'),
154-
'data_richiesta' => Carbon::now(),
155-
'richiesta' => $richiesta,
156-
'idtipointervento' => 0,
157-
'idstatointervento' => $stato,
158-
'oggetto' => $summary,
159-
]);
160-
161-
$database->insert('in_interventi', [
162-
'idintervento' => $idintervento,
163-
'idtecnico' => $idtecnico,
164-
'orario_inizio' => $orario_inizio,
165-
'orario_fine' => $orario_fine,
166-
'summary' => $summary,
167-
'uid' => $event['UID'],
168-
]);
169-
170-
$idriga = $database->lastInsertedID();
178+
$anagrafica = Anagrafica::find(setting('Azienda predefinita'));
179+
$tipo = $anagrafica->idtipointervento_default ?: TipoSessione::first();
180+
$stato = Stato::find(setting('Stato predefinito dell\'attività'));
181+
$data_richiesta = Carbon::now();
182+
183+
$intervento = Intervento::build($anagrafica, $tipo, $stato, $data_richiesta);
184+
$intervento->richiesta = $description;
185+
$intervento->save();
186+
187+
add_tecnico($intervento->id, $idtecnico, $orario_inizio, $orario_fine);
188+
$sessione = Sessione::where('idintervento', $intervento->id)->get()->last();
189+
$sessione->summary = $summary;
190+
$sessione->description = $description;
191+
$sessione->uid = $event['UID'];
192+
$sessione->save();
171193
}
172194
}
173195

174-
// Modifica attività esistente
196+
// Modifica attività creata in OSM
175197
else {
176-
$database->update('in_interventi_tecnici', [
177-
'orario_inizio' => $orario_inizio,
178-
'orario_fine' => $orario_fine,
179-
'summary' => $summary,
180-
], [
181-
'id' => $idriga,
182-
'idtecnico' => $idtecnico,
183-
]);
184-
185-
$query = 'UPDATE in_interventi SET richiesta='.prepare($richiesta).', oggetto='.prepare($summary).' WHERE idintervento = (SELECT idintervento FROM in_interventi_tecnici WHERE id = '.prepare($idriga).' AND idtecnico = '.prepare($idtecnico).' LIMIT 0,1)';
186-
$database->query($query);
198+
$sessione = Sessione::find($idriga);
199+
$sessione->orario_inizio = $orario_inizio;
200+
$sessione->orario_fine = $orario_fine;
201+
$sessione->summary = $summary;
202+
$sessione->description = $description;
203+
$sessione->save();
187204
}
188205
}
189206
}

update/2_11.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALU
3434

3535
INSERT INTO `zz_settings_lang` (`id_lang`, `id_record`, `title`, `help`) VALUES
3636
(1, (SELECT MAX(`id`) FROM `zz_settings`), 'Limita conteggio ore ad oggi nell''intestazione', 'Conteggia nell''intestazione attività solo le ore di lavoro dall''inizio al giorno corrente; se disabilitato conteggia tutte le ore collegate a un documento.'),
37-
(2, (SELECT MAX(`id`) FROM `zz_settings`), 'Limita conteggio ore ad oggi nell''intestazione', 'Conteggia nell''intestazione attività solo le ore di lavoro dall''inizio al giorno corrente; se disabilitato conteggia tutte le ore collegate a un documento.');
37+
(2, (SELECT MAX(`id`) FROM `zz_settings`), 'Limita conteggio ore ad oggi nell''intestazione', 'Conteggia nell''intestazione attività solo le ore di lavoro dall''inizio al giorno corrente; se disabilitato conteggia tutte le ore collegate a un documento.');
38+
39+
40+
-- Aggiunta campo per calendario
41+
ALTER TABLE `in_interventi_tecnici` ADD `description` TEXT NOT NULL AFTER `summary`;

0 commit comments

Comments
 (0)