diff --git a/modules/anagrafiche/ajax/select.php b/modules/anagrafiche/ajax/select.php index 3a2071819..3ae085018 100755 --- a/modules/anagrafiche/ajax/select.php +++ b/modules/anagrafiche/ajax/select.php @@ -272,8 +272,9 @@ switch ($resource) { $where[] = 'idanagrafica='.prepare($id_azienda); //admin o utente senza una sede prefissata, avrà accesso a tutte le sedi - if (!empty($user->sedi) and !$user->is_admin) { - $where[] = 'id IN('.implode(',', $user->sedi).')'; + $id_sedi_abilitate = $user->sediAbilitate->pluck('id')->all(); + if (!empty($id_sedi_abilitate) && !$user->is_admin) { + $where[] = 'id IN('.implode(',', $id_sedi_abilitate).')'; } if (!empty($search)) { diff --git a/modules/ddt/edit.php b/modules/ddt/edit.php index 6c4f93c9f..63475bc80 100755 --- a/modules/ddt/edit.php +++ b/modules/ddt/edit.php @@ -522,7 +522,8 @@ if (!empty($elementi)) { sedi)) { +$id_sedi_abilitate = $user->sediAbilitate->pluck('id')->all(); +if (in_array($record[$field_name], $id_sedi_abilitate)) { ?> diff --git a/modules/ddt/init.php b/modules/ddt/init.php index ec4d64fbc..ac1f0d258 100755 --- a/modules/ddt/init.php +++ b/modules/ddt/init.php @@ -53,7 +53,8 @@ if (isset($id_record)) { // Se la sede del ddt non è di mia competenza, blocco il ddt in modifica $field_name = ($dir == 'entrata') ? 'idsede_partenza' : 'idsede_destinazione'; - if (!Auth::admin() && !in_array($record[$field_name], $user->sedi)) { + $id_sedi_abilitate = $user->sediAbilitate->pluck('id')->all(); + if (!Auth::admin() && !in_array($record[$field_name], $id_sedi_abilitate)) { $record['flag_completato'] = 1; } } diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index ea76f5584..0c77347b1 100755 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -102,9 +102,9 @@ class DDT extends Document // Imposto, come sede aziendale, la prima sede disponibile come utente if ($direzione == 'entrata') { - $model->idsede_partenza = $user->sedi[0]; + $model->idsede_partenza = $user->id_sede_principale; } else { - $model->idsede_destinazione = $user->sedi[0]; + $model->idsede_destinazione = $user->id_sede_principale; } $model->save(); diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index e782b20fb..66e9efc48 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -858,7 +858,8 @@ if (!empty($note_accredito)) { sedi)) { +$id_sedi_abilitate = $user->sediAbilitate->pluck('id')->all(); +if (in_array($record[$field_name], $id_sedi_abilitate)) { ?> diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 4a932ad12..c82277e6e 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -128,7 +128,7 @@ class Fattura extends Document } // Sede aziendale scelta tra le sedi disponibili per l'utente - $id_sede = $user->sedi[0]; + $id_sede = $user->id_sede_principale; if ($direzione == 'entrata') { $model->idsede_destinazione = $id_sede; } else { diff --git a/modules/utenti/actions.php b/modules/utenti/actions.php index 5f8392ac4..3cf8c7cbb 100755 --- a/modules/utenti/actions.php +++ b/modules/utenti/actions.php @@ -79,23 +79,17 @@ switch (filter('op')) { // Foto if (!empty($_FILES['photo']['tmp_name'])) { - $utente->photo = $_FILES['photo']; + $utente->setPhoto($_FILES['photo']); } // Anagrafica - $id_anagrafica = filter('idanag'); - $utente->id_anagrafica = $id_anagrafica; - + $utente->id_anagrafica = filter('id_anagrafica'); $utente->save(); - $dbo->query('DELETE FROM zz_user_sedi WHERE id_user = '.prepare($id_utente)); - $sedi = post('idsede'); - if (empty($sedi)) { - $sedi = [0]; - } - foreach ($sedi as $id_sede) { - $dbo->query('INSERT INTO `zz_user_sedi` (`id_user`,`idsede`) VALUES ('.prepare($id_utente).', '.prepare($id_sede).')'); - } + // Aggiornamento sede collegata + $id_sedi_abilitate = (array) post('id_sedi_abilitate'); + $id_sedi_abilitate = array_diff($id_sedi_abilitate, [0]); // Rimozione sede legale + $utente->sediAbilitate()->sync($id_sedi_abilitate); } else { flash()->error(tr('Utente già esistente!')); } @@ -111,7 +105,7 @@ switch (filter('op')) { if (!empty($password)) { $utente->password = $password; } elseif (!empty($_FILES['photo']['tmp_name'])) { - $utente->photo = $_FILES['photo']; + $utente->setPhoto($_FILES['photo']); } $utente->save(); diff --git a/modules/utenti/components/base.php b/modules/utenti/components/base.php index bf9d108df..33a474bbb 100755 --- a/modules/utenti/components/base.php +++ b/modules/utenti/components/base.php @@ -28,37 +28,30 @@ echo '
{[ "type": "text", "label": "'.tr('Username').'", "name": "username", "required": 1, "value": "'.$utente['username'].'", "validation": "username||'.($utente['id'] ?: 0).'" ]}
- '; - -echo ' +
{[ "type": "text", "label": "'.tr('Email').'", "name": "email", "required": 0, "value": "'.$utente['email'].'" ]}
-
'; - - echo ' +
- {[ "type": "select", "label": "'.tr('Collega ad una anagrafica').'", "name": "idanag", "required": 1, "ajax-source": "anagrafiche_utenti", "value": "'.$utente['id_anagrafica'].'", "icon-after": "add|'.Modules::get('Anagrafiche')['id'].(isset($gruppo) ? '|tipoanagrafica='.$gruppo : '').'" ]} + {[ "type": "select", "label": "'.tr('Anagrafica collegata').'", "name": "id_anagrafica", "required": 1, "ajax-source": "anagrafiche_utenti", "value": "'.$utente['id_anagrafica'].'", "icon-after": "add|'.Modules::get('Anagrafiche')['id'].(isset($gruppo) ? '|tipoanagrafica='.$gruppo : '').'" ]}
- {[ "type": "select", "label": "'.tr('Sede').'", "name": "idsede[]", "ajax-source": "sedi_azienda", "multiple": "1", "value":"'.($sedi ?: '').'", "help": "'.tr('Sede Azienda abilitata per la movimentazione degli articoli.').'" ]} + {[ "type": "select", "label": "'.tr('Sedi abilitate').'", "name": "id_sedi_abilitate[]", "ajax-source": "sedi_azienda", "value": "'.implode(',', $id_sedi_abilitate).'", "multiple": 1, "help": "'.tr('Sede Azienda abilitata per la movimentazione degli articoli.').'" ]}
-
'; + -echo ' '; diff --git a/modules/utenti/edit.php b/modules/utenti/edit.php index 530dc9a0e..dbeb7e28b 100755 --- a/modules/utenti/edit.php +++ b/modules/utenti/edit.php @@ -69,10 +69,10 @@ if (!empty($utenti)) { -'; } - $sedi = $dbo->fetchOne('SELECT GROUP_CONCAT(nomesede SEPARATOR ", " ) as nomesede FROM zz_user_sedi INNER JOIN ((SELECT "0" AS id, "Sede legale" AS nomesede) UNION (SELECT id, nomesede FROM an_sedi)) sedi ON zz_user_sedi.idsede=sedi.id WHERE id_user='.prepare($utente['id']).' GROUP BY id_user ')['nomesede']; + $elenco_sedi = $dbo->fetchOne('SELECT GROUP_CONCAT(nomesede SEPARATOR ", ") AS elenco FROM zz_user_sede INNER JOIN ((SELECT "0" AS id, "Sede legale" AS nomesede) UNION (SELECT id, nomesede FROM an_sedi)) sedi ON zz_user_sede.id_sede = sedi.id WHERE id_utente = '.prepare($utente['id']).' GROUP BY id_utente')['elenco']; echo ' - '.$sedi.''; + '.$elenco_sedi.''; echo ' '; diff --git a/modules/utenti/user.php b/modules/utenti/user.php index 95865ee3e..4c382a130 100755 --- a/modules/utenti/user.php +++ b/modules/utenti/user.php @@ -40,9 +40,10 @@ if (!empty($id_record)) { $gruppo = $gruppi[$gruppo_utente]; } -// Lettura sedi dell'utente già impostate +// Lettura delle sedi abilitate per l'utente +$id_sedi_abilitate = []; if (!empty($user)) { - $sedi = $dbo->fetchOne('SELECT GROUP_CONCAT(idsede) as sedi FROM zz_user_sedi WHERE id_user='.prepare($id_utente).' GROUP BY id_user')['sedi']; + $id_sedi_abilitate = $user->sediAbilitate->pluck('id')->all(); } echo ' @@ -64,13 +65,13 @@ if (!empty($user)) { '; diff --git a/plugins/sedi/edit.php b/plugins/sedi/edit.php index 47faa461e..4dc887754 100755 --- a/plugins/sedi/edit.php +++ b/plugins/sedi/edit.php @@ -148,7 +148,7 @@ if (!empty($google)) { } // Permetto eliminazione tipo sede solo se non è utilizzata da nessun'altra parte nel gestionale -$elementi = $dbo->fetchArray('SELECT `zz_user_sedi`.`id_user` AS `id` FROM `zz_user_sedi` WHERE `zz_user_sedi`.`idsede` = '.prepare($id_record).' +$elementi = $dbo->fetchArray('SELECT `zz_user_sede`.`id_utente` AS `id` FROM `zz_user_sede` WHERE `zz_user_sede`.`id_sede` = '.prepare($id_record).' UNION SELECT `an_referenti`.`id` AS `id` FROM `an_referenti` WHERE `an_referenti`.`idsede` = '.prepare($id_record).' UNION diff --git a/src/Models/User.php b/src/Models/User.php index fe7f4cc82..aff5e0ce0 100755 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -23,6 +23,7 @@ use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Model; use Intervention\Image\ImageManagerStatic; use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Sede; class User extends Model { @@ -33,6 +34,8 @@ class User extends Model protected $appends = [ 'is_admin', 'gruppo', + 'nome_completo', + 'id_sede_principale', 'id_anagrafica', ]; @@ -111,19 +114,11 @@ class User extends Model return $this->gruppo; } - public function getSediAttribute() + public function getIdSedePrincipaleAttribute() { - $database = database(); + $sede_principale = $this->sediAbilitate()->first(); - // Estraggo le sedi dell'utente loggato - $sedi = $database->fetchArray('SELECT idsede FROM zz_user_sedi WHERE id_user='.prepare($this->id)); - - // Se l'utente non ha sedi, è come se ce le avesse tutte disponibili per retrocompatibilità - if (empty($sedi)) { - $sedi = $database->fetchArray('SELECT "0" AS idsede UNION SELECT id AS idsede FROM an_sedi WHERE idanagrafica='.prepare($this->idanagrafica)); - } - - return array_column($sedi, 'idsede'); + return $sede_principale ? $sede_principale->id : 0; } public function setPasswordAttribute($value) @@ -142,7 +137,19 @@ class User extends Model return base_path().'/'.$image->filepath; } - public function setPhotoAttribute($value) + public function getNomeCompletoAttribute() + { + $anagrafica = $this->anagrafica; + if (empty($anagrafica)) { + return $this->username; + } + + return $anagrafica->ragione_sociale.' ('.$this->username.')'; + } + + // Funzioni + + public function setPhoto($upload_data) { $module = \Modules::get('Utenti e permessi'); @@ -155,8 +162,8 @@ class User extends Model $old_photo = Upload::where($data)->get(); // Informazioni sull'immagine - $filepath = is_array($value) ? $value['tmp_name'] : $value; - $info = Upload::getInfo(is_array($value) ? $value['name'] : $value); + $filepath = is_array($upload_data) ? $upload_data['tmp_name'] : $upload_data; + $info = Upload::getInfo(is_array($upload_data) ? $upload_data['name'] : $upload_data); $file = base_dir().'/files/temp_photo.'.$info['extension']; // Ridimensionamento @@ -182,16 +189,6 @@ class User extends Model $this->image_file_id = $upload->id; } - public function getNomeCompletoAttribute() - { - $anagrafica = $this->anagrafica; - if (empty($anagrafica)) { - return $this->username; - } - - return $anagrafica->ragione_sociale.' ('.$this->username.')'; - } - public function getApiTokens() { $query = 'SELECT * FROM `zz_tokens` WHERE `enabled` = 1 AND `id_utente` = '.prepare($this->id); @@ -223,7 +220,7 @@ class User extends Model return $this->hasMany(Log::class, 'id_utente'); } - public function notes() + public function note() { return $this->hasMany(Note::class, 'id_utente'); } @@ -233,6 +230,11 @@ class User extends Model return $this->belongsTo(Anagrafica::class, 'idanagrafica'); } + public function sediAbilitate() + { + return $this->belongsToMany(Sede::class, 'zz_user_sede', 'id_utente', 'id_sede'); + } + public function image() { return $this->belongsTo(Upload::class, 'image_file_id'); diff --git a/update/2_4_25.sql b/update/2_4_25.sql new file mode 100644 index 000000000..8fd5daa80 --- /dev/null +++ b/update/2_4_25.sql @@ -0,0 +1,8 @@ +-- Aggiornamento associazione utente - sede aziendale +ALTER TABLE `zz_user_sedi` RENAME `zz_user_sede`; +ALTER TABLE `zz_user_sede` CHANGE `id_user` `id_utente` INT(11) NOT NULL, CHANGE `idsede` `id_sede` INT(11) NOT NULL; + +DELETE FROM `zz_user_sede` WHERE `id_sede` NOT IN (SELECT `id` FROM `an_sedi`); +DELETE FROM `zz_user_sede` WHERE `id_utente` NOT IN (SELECT `id` FROM `zz_users`); + +ALTER TABLE `zz_user_sede` ADD FOREIGN KEY (`id_utente`) REFERENCES `zz_users`(`id`) ON DELETE CASCADE, ADD FOREIGN KEY (`id_sede`) REFERENCES `an_sedi`(`id`) ON DELETE CASCADE; diff --git a/update/tables.php b/update/tables.php index 02a575ca8..c7ca59ccc 100755 --- a/update/tables.php +++ b/update/tables.php @@ -128,7 +128,7 @@ return [ 'zz_tasks_logs', 'zz_tokens', 'zz_users', - 'zz_user_sedi', + 'zz_user_sede', 'zz_views', 'zz_widgets', ];