Introdotto login amministratore da app

This commit is contained in:
Matteo 2023-10-05 16:10:54 +02:00
parent a8df2fcb08
commit ff55cd430f
5 changed files with 290 additions and 125 deletions

131
src/API/App/v1/Checklists.php Normal file → Executable file
View File

@ -22,8 +22,8 @@ namespace API\App\v1;
use API\App\AppResource;
use Auth;
use Carbon\Carbon;
use Models\User;
use Modules\Checklists\Check;
use Models\User;
class Checklists extends AppResource
{
@ -37,7 +37,6 @@ class Checklists extends AppResource
// Informazioni sull'utente
$user = Auth::user();
$id_tecnico = $user->id_anagrafica;
// Elenco di interventi di interesse
$risorsa_interventi = $this->getRisorsaInterventi();
@ -46,24 +45,46 @@ class Checklists extends AppResource
// Elenco sessioni degli interventi da rimuovere
$da_interventi = [];
if (!empty($interventi)) {
$query = 'SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND
zz_check_user.id_utente = :id_tecnico
AND
in_interventi.id IN ('.implode(',', $interventi).')
OR (orario_fine NOT BETWEEN :period_start AND :period_end)';
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
':id_tecnico' => $user->id,
]);
if($user->is_admin){
$query = '
SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND
in_interventi.id IN ('.implode(',', $interventi).')
OR (orario_fine NOT BETWEEN :period_start AND :period_end)';
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
]);
}else{
$query = '
SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND
zz_check_user.id_utente = :id_tecnico
AND
in_interventi.id IN ('.implode(',', $interventi).')
OR (orario_fine NOT BETWEEN :period_start AND :period_end)';
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
':id_tecnico' => $user->id
]);
}
$da_interventi = array_column($records, 'id');
}
@ -90,30 +111,47 @@ class Checklists extends AppResource
}
$user = Auth::user();
$id_tecnico = $user->id_anagrafica;
$id_interventi = array_keys($interventi);
$query = 'SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND zz_check_user.id_utente = :id_tecnico
AND in_interventi.id IN ('.implode(',', $id_interventi).')
AND (orario_fine BETWEEN :period_start AND :period_end)';
if($user->is_admin){
$query = 'SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND in_interventi.id IN ('.implode(',', $id_interventi).')';
// Filtro per data
if ($last_sync_at) {
$query .= ' AND zz_checks.updated_at > '.prepare($last_sync_at);
// Filtro per data
if ($last_sync_at) {
$query .= ' AND zz_checks.updated_at > '.prepare($last_sync_at);
}
$records = database()->fetchArray($query);
}else{
$query = 'SELECT zz_checks.id
FROM zz_checks
INNER JOIN in_interventi ON zz_checks.id_record = in_interventi.id
INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id
INNER JOIN zz_modules ON zz_checks.id_module = zz_modules.id
INNER JOIN zz_check_user ON zz_checks.id = zz_check_user.id_check
WHERE
zz_modules.name="Interventi"
AND zz_check_user.id_utente = :id_tecnico
AND in_interventi.id IN ('.implode(',', $id_interventi).')
AND (orario_fine BETWEEN :period_start AND :period_end)';
// Filtro per data
if ($last_sync_at) {
$query .= ' AND zz_checks.updated_at > '.prepare($last_sync_at);
}
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico' => $user->id
]);
}
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico' => $user->id,
]);
return $this->mapModifiedRecords($records);
}
@ -121,17 +159,16 @@ class Checklists extends AppResource
public function retrieveRecord($id)
{
// Gestione della visualizzazione dei dettagli del record
$query = 'SELECT zz_checks.id,
$query = "SELECT zz_checks.id,
zz_checks.id_record AS id_intervento,
zz_checks.checked_at,
zz_checks.content,
zz_checks.note,
IF(zz_checks.id_parent IS NULL, 0, zz_checks.id_parent) AS id_parent,
zz_checks.checked_by,
zz_checks.order AS ordine,
zz_checks.is_titolo
zz_checks.order AS ordine
FROM zz_checks
WHERE zz_checks.id = '.prepare($id);
WHERE zz_checks.id = ".prepare($id);
$record = database()->fetchOne($query);
@ -142,11 +179,11 @@ class Checklists extends AppResource
{
$check = Check::find($data['id']);
$check->checked_at = (!empty($data['checked_at']) ? $data['checked_at'] : null);
$check->checked_at = (!empty($data['checked_at']) ? $data['checked_at'] : NULL);
$check->content = $data['content'];
$check->note = $data['note'];
$user = User::where('idanagrafica', $data['checked_by'])->first();
if (!empty($user)) {
if(!empty($user)){
$check->checked_by = $user->id;
}
@ -159,4 +196,4 @@ class Checklists extends AppResource
{
return new Interventi();
}
}
}

22
src/API/App/v1/Impianti.php Normal file → Executable file
View File

@ -22,6 +22,7 @@ namespace API\App\v1;
use API\App\AppResource;
use Illuminate\Database\Eloquent\Builder;
use Modules\Impianti\Impianto;
use Auth;
class Impianti extends AppResource
{
@ -32,11 +33,26 @@ class Impianti extends AppResource
public function getModifiedRecords($last_sync_at)
{
$statement = Impianto::select('id', 'updated_at')
$statement = Impianto::select('id', 'updated_at', 'idtecnico')
->whereHas('anagrafica.tipi', function (Builder $query) {
$query->where('descrizione', '=', 'Cliente');
});
//Limite impianti visualizzabili dal tecnico
$limite_impianti = setting("Limita la visualizzazione degli impianti a quelli gestiti dal tecnico");
if($limite_impianti == 1 && !Auth::user()->is_admin){
$id_tecnico = Auth::user()->id_anagrafica;
// Elenco di interventi di interesse
$risorsa_interventi = $this->getRisorsaInterventi();
// Da applicazione, i Clienti sono sincronizzati prima degli Interventi: last_sync_at permette di identificare le stesse modifiche
$interventi = $risorsa_interventi->getModifiedRecords(null);
$id_interventi = array_keys($interventi);
$statement->where('idtecnico', $id_tecnico)->orWhere('id', 'IN', ('SELECT idimpianto FROM my_impianti_interventi WHERE idintervento IN ('.implode(',', $id_interventi).')'));
}
// Filtro per data
if ($last_sync_at) {
$statement = $statement->where('updated_at', '>', $last_sync_at);
@ -73,4 +89,8 @@ class Impianti extends AppResource
return $record;
}
protected function getRisorsaInterventi()
{
return new Interventi();
}
}

218
src/API/App/v1/Interventi.php Normal file → Executable file
View File

@ -58,7 +58,31 @@ class Interventi extends AppResource
// Informazioni sull'utente
$id_tecnico = Auth::user()->id_anagrafica;
$query = 'SELECT in_interventi.id FROM in_interventi WHERE
if(Auth::user()->is_admin){
$query = 'SELECT in_interventi.id FROM in_interventi WHERE
deleted_at IS NOT NULL
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
)
AND in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :remove_period_start AND :remove_period_end
)
)';
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
':remove_period_end' => $remove_end,
':remove_period_start' => $remove_start,
]);
}else{
$query = 'SELECT in_interventi.id FROM in_interventi WHERE
deleted_at IS NOT NULL
OR (
in_interventi.id NOT IN (
@ -74,15 +98,17 @@ class Interventi extends AppResource
AND in_interventi_tecnici.idtecnico = :id_tecnico_q2
)
)';
$records = database()->fetchArray($query, [
$records = database()->fetchArray($query, [
':period_end' => $end,
':period_start' => $start,
':remove_period_end' => $remove_end,
':remove_period_start' => $remove_start,
':id_tecnico_q1' => $id_tecnico,
':id_tecnico_q2' => $id_tecnico,
]);
]);
}
$interventi = array_column($records, 'id');
$mancanti = $this->getMissingIDs('in_interventi', 'id', $last_sync_at);
@ -100,52 +126,96 @@ class Interventi extends AppResource
$id_tecnico = Auth::user()->id_anagrafica;
if (setting('Visualizza solo promemoria assegnati') == 1) {
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (
in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
AND in_interventi_tecnici.idtecnico = :id_tecnico_q1
)
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0 AND in_interventi.id IN (
SELECT id_intervento FROM in_interventi_tecnici_assegnati WHERE in_interventi_tecnici_assegnati.id_tecnico = :id_tecnico_q2)
)
)
)';
} else {
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (
in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
AND in_interventi_tecnici.idtecnico = :id_tecnico_q1
)
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
if(Auth::user()->is_admin){
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento = in_interventi.id AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0)
)
)';
}
OR (
in_interventi.id NOT IN ( SELECT idintervento FROM in_interventi_tecnici
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0)
)
)';
}else{
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (
in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
AND in_interventi_tecnici.idtecnico = :id_tecnico_q1
)
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0) AND in_interventi.id IN (
SELECT id_intervento FROM in_interventi_tecnici_assegnati WHERE in_interventi_tecnici_assegnati.id_tecnico = :id_tecnico_q2
)
)
)';
}
} else {
if(Auth::user()->is_admin){
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (
in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
)
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0)
)
)';
}else{
$query = '
SELECT
in_interventi.id,
in_interventi.updated_at
FROM
in_interventi
WHERE
deleted_at IS NULL AND (
in_interventi.id IN (
SELECT idintervento FROM in_interventi_tecnici
WHERE in_interventi_tecnici.idintervento = in_interventi.id
AND in_interventi_tecnici.orario_fine BETWEEN :period_start AND :period_end
AND in_interventi_tecnici.idtecnico = :id_tecnico_q1
)
OR (
in_interventi.id NOT IN (
SELECT idintervento FROM in_interventi_tecnici
)
AND in_interventi.idstatointervento IN (SELECT idstatointervento FROM in_statiintervento WHERE is_completato = 0)
)
)';
}
}
// Filtro per data
// Gestione di tecnici assegnati o impianti modificati
@ -161,18 +231,32 @@ class Interventi extends AppResource
}
if (setting('Visualizza solo promemoria assegnati') == 1) {
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico_q1' => $id_tecnico,
':id_tecnico_q2' => $id_tecnico,
]);
if(Auth::user()->is_admin){
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
]);
} else {
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico_q1' => $id_tecnico,
':id_tecnico_q2' => $id_tecnico,
]);
}
} else {
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico_q1' => $id_tecnico,
]);
if(Auth::user()->is_admin){
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
]);
} else {
$records = database()->fetchArray($query, [
':period_start' => $start,
':period_end' => $end,
':id_tecnico_q1' => $id_tecnico,
]);
}
}
return $this->mapModifiedRecords($records);
@ -269,10 +353,12 @@ class Interventi extends AppResource
// Aggiornamento degli impianti collegati
$database->query('DELETE FROM my_impianti_interventi WHERE idintervento = '.prepare($record->id));
foreach ($data['impianti'] as $id_impianto) {
$database->insert('my_impianti_interventi', [
'idimpianto' => $id_impianto,
'idintervento' => $record->id,
]);
if(!empty($id_impianto)){
$database->insert('my_impianti_interventi', [
'idimpianto' => $id_impianto,
'idintervento' => $record->id,
]);
}
}
// Aggiornamento dei tecnici assegnati
@ -283,6 +369,10 @@ class Interventi extends AppResource
], [
'id_tecnico' => $tecnici_assegnati,
]);
if(!empty($data['idrichiesta'])){
database()->query('UPDATE in_richieste SET idintervento = '.prepare($record->id).', updated_at=NOW() WHERE id = '.prepare($data['idrichiesta']));
}
}
protected function salvaFirma($firma_base64)

39
src/API/App/v1/Login.php Normal file → Executable file
View File

@ -35,18 +35,32 @@ class Login extends Resource implements CreateInterface
if (auth()->attempt($request['username'], $request['password'])) {
$user = $this->getUser();
$token = auth()->getToken();
// Informazioni sull'utente, strettamente collegato ad una anagrafica di tipo Tecnico
$utente = $database->fetchOne("SELECT
`an_anagrafiche`.`idanagrafica` AS id_anagrafica,
`an_anagrafiche`.`ragione_sociale`
FROM `zz_users`
INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica`
INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica = an_anagrafiche.idanagrafica
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica = an_tipianagrafiche.idtipoanagrafica
WHERE an_tipianagrafiche.descrizione = 'Tecnico' AND `an_anagrafiche`.`deleted_at` IS NULL AND `id` = :id", [
':id' => $user['id'],
]);
if(setting("Permetti l'accesso agli amministratori")){
$utente = $database->fetchOne("SELECT
`an_anagrafiche`.`idanagrafica` AS id_anagrafica,
`an_anagrafiche`.`ragione_sociale`,
zz_groups.nome AS gruppo
FROM `zz_users`
INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica`
INNER JOIN zz_groups ON zz_users.idgruppo=zz_groups.id
WHERE `an_anagrafiche`.`deleted_at` IS NULL AND `zz_users`.`id` = :id", [
':id' => $user['id'],
]);
}else{
$utente = $database->fetchOne("SELECT
`an_anagrafiche`.`idanagrafica` AS id_anagrafica,
`an_anagrafiche`.`ragione_sociale`,
zz_groups.nome AS gruppo
FROM `zz_users`
INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica`
INNER JOIN an_tipianagrafiche_anagrafiche ON an_tipianagrafiche_anagrafiche.idanagrafica = an_anagrafiche.idanagrafica
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica = an_tipianagrafiche.idtipoanagrafica
INNER JOIN zz_groups ON zz_users.idgruppo=zz_groups.id
WHERE an_tipianagrafiche.descrizione = 'Tecnico' AND `an_anagrafiche`.`deleted_at` IS NULL AND `id` = :id", [
':id' => $user['id'],
]);
}
if (!empty($utente)) {
// Informazioni da restituire tramite l'API
@ -54,6 +68,7 @@ class Login extends Resource implements CreateInterface
'id_anagrafica' => (string) $utente['id_anagrafica'],
'ragione_sociale' => $utente['ragione_sociale'],
'token' => $token,
'gruppo' => $utente['gruppo'],
'version' => Update::getVersion(),
];
} else {

View File

@ -289,7 +289,10 @@ class Manager
// Operazioni della risorsa
$response = $object->{$method}($request);
$database->commitTransaction();
try{
$database->commitTransaction();
} catch (PDOException $e) {
}
// Operazioni di completamento
$object->close($request, $response);