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:
parent
e970cfc930
commit
12aa14d060
|
@ -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",
|
||||
|
|
|
@ -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',
|
||||
];
|
|
@ -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',
|
||||
];
|
|
@ -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à 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>
|
63
src/API.php
63
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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'];
|
||||
|
||||
|
|
|
@ -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`;
|
||||
|
|
Loading…
Reference in New Issue