diff --git a/composer.json b/composer.json index 40bbdd085..62b3a8db9 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,7 @@ "type": "project", "require": { "php": ">=5.4", + "aluguest/ical-easy-reader": "^1.5", "danielstjules/stringy": "^3.1", "ezyang/htmlpurifier": "^4.8", "filp/whoops": "^2.1", diff --git a/modules/interventi/api/retrieve.php b/modules/interventi/api/retrieve.php new file mode 100644 index 000000000..878ad06e0 --- /dev/null +++ b/modules/interventi/api/retrieve.php @@ -0,0 +1,47 @@ +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=''"); + $dbo->query("UPDATE in_interventi_tecnici SET uid=id WHERE uid=''"); + + if ($idtecnico != '0') { + $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 CAST(orario_inizio AS DATE) BETWEEN CURDATE()-INTERVAL 7 DAY AND CURDATE()+INTERVAL 3 MONTH AND in_interventi_tecnici.idtecnico="'.$idtecnico.'" AND deleted=0'; + } else { + $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 CAST(orario_inizio AS DATE) BETWEEN CURDATE()-INTERVAL 7 DAY AND CURDATE()+INTERVAL 3 MONTH AND deleted=0'; + } + $rs = $dbo->fetchArray($query); + + $results = []; + $results['custom'] = ''; + + $results['custom'] .= "BEGIN:VCALENDAR\n"; + $results['custom'] .= "VERSION:2.0\n"; + $results['custom'] .= "PRODID:-// OpenSTAManager\n"; + + for ($i = 0; $i < sizeof($rs); ++$i) { + $richiesta = str_replace("\r\n", "\n", $rs[$i]['richiesta']); + $richiesta = str_replace("\r", "\n", $richiesta); + $richiesta = str_replace("\n", '\\n', $richiesta); + + $oggetto = str_replace("\r\n", "\n", $rs[$i]['oggetto']); + + $results['custom'] .= "BEGIN:VEVENT\n"; + $results['custom'] .= 'UID:'.$rs[$i]['idriga']."\n"; + $results['custom'] .= 'DTSTAMP:'.date('Ymd').'T'.date('His')."\n"; + $results['custom'] .= 'ORGANIZER;CN='.$azienda.':MAILTO:'.$email."\n"; + $results['custom'] .= 'DTSTART:'.date('Ymd', strtotime($rs[$i]['orario_inizio'])).'T'.date('His', strtotime($rs[$i]['orario_inizio']))."\n"; + $results['custom'] .= 'DTEND:'.date('Ymd', strtotime($rs[$i]['orario_fine'])).'T'.date('His', strtotime($rs[$i]['orario_fine']))."\n"; + $results['custom'] .= 'SUMMARY:'.html_entity_decode($rs[$i]['summary'])."\n"; + $results['custom'] .= 'DESCRIPTION:'.html_entity_decode($richiesta, ENT_QUOTES, 'UTF-8')."\n"; + $results['custom'] .= "END:VEVENT\n"; + } + + $results['custom'] .= "END:VCALENDAR\n"; + + break; +} + +return [ + 'sync', +]; diff --git a/modules/interventi/api/update.php b/modules/interventi/api/update.php new file mode 100644 index 000000000..3486378ee --- /dev/null +++ b/modules/interventi/api/update.php @@ -0,0 +1,148 @@ +load($response); + + // file_put_contents('calendario.txt', print_r($events, 1)); + + for ($j = 0; $j < sizeof($events['VEVENT']); ++$j) { + $description = $events['VEVENT'][$j]['DESCRIPTION']; + // file_put_contents('cal.txt', $description, FILE_APPEND); + // idriga di in_interventi_tecnici + if (strstr($events['VEVENT'][$j]['UID'], '-')) { + $idriga = 'NEW'; + } else { + $idriga = $events['VEVENT'][$j]['UID']; + } + + // Data-ora inizio + $dataora = explode('T', $events['VEVENT'][$j]['DTSTART']); + $data = $dataora[0]; + $ora = $dataora[1]; + + $Y = substr($data, 0, 4); + $m = substr($data, 4, 2); + $d = substr($data, 6, 2); + + $H = substr($ora, 0, 2); + $i = substr($ora, 2, 2); + + $orario_inizio = "$Y-$m-$d $H:$i:00"; + + // Data-ora fine + $dataora = explode('T', $events['VEVENT'][$j]['DTEND']); + $data = $dataora[0]; + $ora = $dataora[1]; + + $Y = substr($data, 0, 4); + $m = substr($data, 4, 2); + $d = substr($data, 6, 2); + + $H = substr($ora, 0, 2); + $i = substr($ora, 2, 2); + + $orario_fine = "$Y-$m-$d $H:$i:00"; + + // Descrizione + $richiesta = $events['VEVENT'][$j]['DESCRIPTION']; + $richiesta = str_replace('\\r\\n', "\n", $richiesta); + $richiesta = str_replace('\\n', "\n", $richiesta); + + $oggetto = trim($events['VEVENT'][$j]['SUMMARY']); + $richiesta = str_replace('\\r\\n', "\n", $richiesta); + $richiesta = str_replace('\\n', "\n", $richiesta); + + // Nuova attività + if ($idriga == 'NEW') { + // Data-ora inizio + $dataora = explode('T', $events['VEVENT'][$j]['DTSTART']['value']); + $data = $dataora[0]; + $ora = $dataora[1]; + + $Y = substr($data, 0, 4); + $m = substr($data, 4, 2); + $d = substr($data, 6, 2); + + $H = substr($ora, 0, 2); + $i = substr($ora, 2, 2); + + $orario_inizio = "$Y-$m-$d $H:$i:00"; + + // Data-ora fine + $dataora = explode('T', $events['VEVENT'][$j]['DTEND']['value']); + $data = $dataora[0]; + $ora = $dataora[1]; + + $Y = substr($data, 0, 4); + $m = substr($data, 4, 2); + $d = substr($data, 6, 2); + + $H = substr($ora, 0, 2); + $i = substr($ora, 2, 2); + + $orario_fine = "$Y-$m-$d $H:$i:00"; + + $rs_copie = $dbo->fetchArray("SELECT * FROM in_interventi_tecnici WHERE uid='".$events['VEVENT'][$j]['UID']."'"); + + if (sizeof($rs_copie) > 0) { + $query = 'UPDATE in_interventi_tecnici SET orario_inizio="'.$orario_inizio.'", orario_fine="'.$orario_fine.'", summary="'.prepare($oggetto).'" WHERE uid="'.$events['VEVENT'][$j]['UID'].'" AND idtecnico="'.$idtecnico.'"'; + $dbo->query($query); + + $query = 'UPDATE in_interventi SET richiesta="'.prepare($richiesta).'", oggetto="'.prepare($oggetto)."\" WHERE idintervento=(SELECT idintervento FROM in_interventi_tecnici WHERE idintervento='".$rs_copie[0]['idintervento']."' AND idtecnico=\"".$idtecnico.'" LIMIT 0,1)'; + $dbo->query($query); + + $idriga = $rs_copie[0]['id']; + } else { + $idintervento = get_new_idintervento(); + $query = 'INSERT INTO in_interventi( idintervento, idanagrafica, data_richiesta, richiesta, idtipointervento, idstatointervento, oggetto ) VALUES( "'.$idintervento."\", (SELECT valore FROM zz_impostazioni WHERE nome='Azienda predefinita'), NOW(), \"".prepare($richiesta).'", 0, "CALL", "'.prepare($oggetto).'" )'; + $dbo->query($query); + + $query = 'INSERT INTO in_interventi_tecnici( idintervento, idtecnico, orario_inizio, orario_fine, summary, uid ) VALUES( "'.$idintervento.'", "'.$idtecnico.'", "'.$orario_inizio.'", "'.$orario_fine.'", "'.$oggetto.'", "'.$events['VEVENT'][$j]['UID'].'" )'; + $dbo->query($query); + + $idriga = $dbo->last_inserted_id(); + } + } + + // Modifica attività esistente + else { + $query = 'UPDATE in_interventi_tecnici SET orario_inizio="'.$orario_inizio.'", orario_fine="'.$orario_fine.'", summary="'.prepare($oggetto).'" WHERE id="'.$idriga.'" AND idtecnico="'.$idtecnico.'"'; + $dbo->query($query); + + $query = 'UPDATE in_interventi SET richiesta="'.prepare($richiesta).'", oggetto="'.prepare($oggetto).'" WHERE idintervento=(SELECT idintervento FROM in_interventi_tecnici WHERE id="'.$idriga.'" AND idtecnico="'.$idtecnico.'" LIMIT 0,1)'; + $dbo->query($query); + } + + array_push($allsession, $idriga); + } + + // Eliminazione attività + /* + $rs_sessioni = $dbo->fetchArray("SELECT * FROM in_interventi_tecnici"); + for($i=0;$iquery("DELETE FROM in_interventi_tecnici WHERE id='".$rs_sessioni[$i]['id']."'"); + $rs_per_intervento = $dbo->fetchArray("SELECT * FROM in_interventi_tecnici WHERE idintervento='".$idintervento."'"); + if(sizeof($rs_per_intervento)==0){ + $dbo->query("UPDATE in_interventi SET deleted=1 WHERE idintervento='".$idintervento."'"); + } + } + } + */ + + break; +} + +return [ + 'syncs', +]; diff --git a/modules/utenti/sync.php b/modules/utenti/sync.php new file mode 100644 index 000000000..9686adac0 --- /dev/null +++ b/modules/utenti/sync.php @@ -0,0 +1,60 @@ + +
+

Per generare il link per visualizzare il calendario su applicazioni esterne, inserisci username e password qui sotto, poi copia il link nella tua applicazione:

+
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ Per Android, scarica iCalSync2.

+ + Per Apple, puoi configurare un nuovo calendario dall'app standard del calendario, specificando l'URL sopra.

+ + Per PC, per altri client di posta, considerare le relative funzionalità o eventuali plugin. +
+
+ + + + diff --git a/src/API.php b/src/API.php index 7c983e5a5..a769fd881 100644 --- a/src/API.php +++ b/src/API.php @@ -59,6 +59,13 @@ class API extends \Util\Singleton { $user = Auth::user(); + // Controllo sulla compatibilità dell'API + if (!self::isCompatible()) { + return self::response([ + 'status' => self::$status['incompatible']['code'], + ]); + } + $table = ''; $select = '*'; $where = []; @@ -183,6 +190,13 @@ class API extends \Util\Singleton { $user = Auth::user(); + // Controllo sulla compatibilità dell'API + if (!self::isCompatible()) { + return self::response([ + 'status' => self::$status['incompatible']['code'], + ]); + } + $resources = self::getResources()[$kind]; $resource = $request['resource']; @@ -280,33 +294,32 @@ class API extends \Util\Singleton */ public static function response($array) { - // Controllo sulla compatibilità dell'API - if (!self::isCompatible()) { - $array = [ - 'status' => self::$status['incompatible']['code'], - ]; + if (empty($array['custom'])) { + // Agiunta dello status di default + if (empty($array['status'])) { + $array['status'] = self::$status['ok']['code']; + } + + // Aggiunta del messaggio in base allo status + if (empty($array['message'])) { + $codes = array_column(self::$status, 'code'); + $messages = array_column(self::$status, 'message'); + + $array['message'] = $messages[array_search($array['status'], $codes)]; + } + + $flags = JSON_FORCE_OBJECT; + // Beautify forzato dei risultati + if (get('beautify') !== null) { + $flags |= JSON_PRETTY_PRINT; + } + + $result = json_encode($array, $flags); + } else { + $result = $array['custom']; } - // Agiunta dello status di default - if (empty($array['status'])) { - $array['status'] = self::$status['ok']['code']; - } - - // Aggiunta del messaggio in base allo status - if (empty($array['message'])) { - $codes = array_column(self::$status, 'code'); - $messages = array_column(self::$status, 'message'); - - $array['message'] = $messages[array_search($array['status'], $codes)]; - } - - $flags = JSON_FORCE_OBJECT; - // Beautify forzato dei risultati - if (get('beautify') !== null) { - $flags |= JSON_PRETTY_PRINT; - } - - return json_encode($array, $flags); + return $result; } /** diff --git a/src/Auth.php b/src/Auth.php index f79f1c329..709ebff9e 100644 --- a/src/Auth.php +++ b/src/Auth.php @@ -90,7 +90,7 @@ class Auth extends \Util\Singleton $database = Database::getConnection(); $log = []; - $log['username'] = $username; + $log['username'] = (string) $username; $log['ip'] = get_client_ip(); $log['stato'] = self::$status['failed']['code']; diff --git a/update/2_3.sql b/update/2_3.sql index ade2aa2d4..6276ae15d 100644 --- a/update/2_3.sql +++ b/update/2_3.sql @@ -964,3 +964,7 @@ UPDATE `zz_modules` SET `title` = `name` WHERE `title` = ''; -- Nuova struttura per i plugin Ddt del cliente e Impianti del cliente in Anagrafiche UPDATE `zz_plugins` SET `script` = '', `options` = ' { "main_query": [ { "type": "table", "fields": "Numero, Data, Descrizione, Qtà", "query": "SELECT dt_ddt.id, (SELECT `id` FROM `zz_modules` WHERE `name` = \'Ddt di vendita\') AS _link_module_, dt_ddt.id AS _link_record_, IF(dt_ddt.numero_esterno = \'\', dt_ddt.numero, dt_ddt.numero_esterno) AS Numero, DATE_FORMAT(dt_ddt.data, ''%d/%m/%Y'') AS Data, dt_righe_ddt.descrizione AS `Descrizione`, CONCAT(REPLACE(REPLACE(REPLACE(FORMAT(dt_righe_ddt.qta, 2), \',\', \'#\'), \'.\', \',\'), \'#\', \'.\'), \' \', dt_righe_ddt.um) AS `Qtà` FROM dt_ddt JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.idanagrafica=|idanagrafica| HAVING 2=2 ORDER BY dt_ddt.id DESC"} ]}', `directory` = '', `version` = '2.3', `compatibility` = '2.*' WHERE `name` = 'Ddt del cliente'; UPDATE `zz_plugins` SET `script` = '', `options` = ' { "main_query": [ { "type": "table", "fields": "Matricola, Nome, Data, Descrizione", "query": "SELECT id, (SELECT `id` FROM `zz_modules` WHERE `name` = \'MyImpianti\') AS _link_module_, id AS _link_record_, matricola AS Matricola, nome AS Nome, DATE_FORMAT(data, ''%d/%m/%Y'') AS Data, descrizione AS Descrizione FROM my_impianti WHERE idanagrafica=|idanagrafica| HAVING 2=2 ORDER BY id DESC"} ]}', `directory` = '', `version` = '2.3', `compatibility` = '2.*' WHERE `name` = 'Impianti del cliente'; + +-- Aggiunta del supporto alla sincronizzazione interventi +ALTER TABLE `in_interventi_tecnici` ADD `uid` VARCHAR(255) NOT NULL AFTER `prezzo_dirittochiamata_tecnico`, ADD `summary` VARCHAR(255) NOT NULL AFTER `uid`; +ALTER TABLE `in_interventi` ADD `deleted` TINYINT NOT NULL DEFAULT '0' AFTER `data_invio`;