Aggiunta del sistema di sincronizzazione caliendario nell'API

Aggiunta del sistema di sincronizzazione del caliendario interventi all'interno dell'API, per futura integrazione completa.
This commit is contained in:
Thomas Zilio 2017-09-22 09:58:29 +02:00
parent e970cfc930
commit 12aa14d060
7 changed files with 299 additions and 26 deletions

View File

@ -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",

View File

@ -0,0 +1,47 @@
<?php
switch ($resource) {
case 'sync':
$dbo->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',
];

View File

@ -0,0 +1,148 @@
<?php
switch ($resource) {
case 'update_anagrafica':
$idtecnico = $user['idanagrafica'];
$response = file_get_contents('php:// input');
// file_put_contents('calendario.txt', $response);
// $events = iCalDecoder( $response );
$ical = new iCalEasyReader();
$events = $ical->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;$i<sizeof($rs_sessioni);$i++){
if(!in_array($rs_sessioni[$i]['id'], $allsession)){
$idintervento = $rs_sessioni[$i]['idintervento'];
$dbo->query("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',
];

60
modules/utenti/sync.php Normal file
View File

@ -0,0 +1,60 @@
<?php
include __DIR__.'/../../core.php';
?>
<div class="text-center">
<h4>Per generare il link per visualizzare il calendario su applicazioni esterne, inserisci username e password qui sotto, poi copia il link nella tua applicazione:</h4>
</div>
<br>
<div class="row fields">
<div class="col-md-offset-3 col-md-3">
<div class="form-group">
<label>Username:</label>
<input type="text" class="form-control" id="username">
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label>Password:</label>
<input type="password" class="form-control" id="password">
</div>
</div>
</div>
<div class="row fields">
<div class="col-md-offset-3 col-md-6">
<div class="form-group">
<label>LINK:</label>
<input type="text" class="form-control text-center" id="link" value="">
</div>
</div>
</div>
<div class="row fields">
<div class="col-md-offset-3 col-md-6">
Per <b>Android</b>, scarica <a href="https://play.google.com/store/apps/details?id=org.kc.and.ical&hl=it" target="_blank"><b>iCalSync2</b></a>.<br><br>
Per <b>Apple</b>, puoi configurare un nuovo calendario dall'app standard del calendario, specificando l'URL sopra.<br><br>
Per <b>PC</b>, per altri client di posta, considerare le relative funzionalit&agrave; o eventuali plugin.
</div>
</div>
<script>
$('.fields input').on('keyup change', function(){
$('#link').val( "<?php echo $rootdir ?>/modules/osmsync/sync_interventi.php?username="+$('#username').val()+"&password="+$('#password').val() );
});
$('#link').on('click', function(){
$(this).select();
});
$('.fields input').trigger('change');
</script>

View File

@ -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;
}
/**

View File

@ -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'];

View File

@ -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`;