You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2019-08-19 15:04:26

mvillerot
Member
From: Chalon sur Saone
Registered: 2018-01-09
Posts: 4

GLPI 9.4.3 : Bug de transfert d'un matériel lié à un fournisseur

Bonjour,

Sous GLPI 9.4.3, nous avons rencontré un problème lorsque nous souhaitions transféré un matériel (par exemple un ordinateur) d'entité.
Nous avions le message d'erreur suivant :

[19-Aug-2019 12:00:11 Europe/Paris] PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Empty IN are not allowed' in D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php:546
Stack trace:
#0 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(516): DBmysqlIterator->analyzeCriterion(Array)
#1 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(506): DBmysqlIterator->analyseCrit(Array)
#2 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(288): DBmysqlIterator->analyseCrit(Array)
#3 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(94): DBmysqlIterator->buildQuery(Array, '', false)
#4 D:\glpi\data\www\glpitest\inc\dbmysql.class.php(580): DBmysqlIterator->execute(Array, '', false)
#5 D:\glpi\data\www\glpitest\inc\transfer.class.php(2784): DBmysql->request(Array)
#6 D:\glpi\data\www\glpitest\inc\transfer.class.php(2719): Transfer->transferSingleSupplier('1')
#7 D:\glpi\data\www\glpitest\inc\transfer.class.php(1077): Transfer->transferInfocoms('Computer', '9984', '9984')
#8 D:\glpi\data\www\glpitest\inc\transfer.class.php(203):  in D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php on line 546

Après analyse plus poussé, le problème se produit lorsque le matériel est lié à un fournisseur qui n'a pas de contrats.

En regardant le fichier transfert.class.php nous avons modifié les lignes suivantes afin que tout rentre dans l'ordre (en se basant sur d'autres lignes de cette classe) :
Dans la function transferSingleSupplier($ID)

--> ligne 2775, ajout du contrôle "if (isset($this->needtobe_transfer['Contract']) && count($this->needtobe_transfer['Contract'])) { " avant de lancer la requête avec un tableau vide

--> ligne 2792, amélioration du controle en ajoutant le count : "if (isset($this->needtobe_transfer[$itemtype]) && count($this->needtobe_transfer[$itemtype])) { "

A votre disposition si besoin de plus de précisions

Cordialement

Offline

#2 2019-08-19 15:23:35

mvillerot
Member
From: Chalon sur Saone
Registered: 2018-01-09
Posts: 4

Re: GLPI 9.4.3 : Bug de transfert d'un matériel lié à un fournisseur

Pour information, on retrouve aussi les problème pour un matériel lié à un fournisseur sans contacts.
--> fichier transfert.class.php, function transferSupplierContacts($ID, $newID) {
Ajout de la ligne

if (isset($this->needtobe_transfer['Contact']) && count($this->needtobe_transfer['Contact'])) { 

avant la requête

$iterator = $DB->request([
'FROM'   => 'glpi_contacts_suppliers',
'WHERE'  => [
   'suppliers_id' => $ID,
   'NOT'          => ['contacts_id' => $this->noneedtobe_transfer['Contact']]
]
]);

Offline

#3 2019-08-19 15:24:24

mvillerot
Member
From: Chalon sur Saone
Registered: 2018-01-09
Posts: 4

Re: GLPI 9.4.3 : Bug de transfert d'un matériel lié à un fournisseur

mvillerot wrote:

Bonjour,

Sous GLPI 9.4.3, nous avons rencontré un problème lorsque nous souhaitions transféré un matériel (par exemple un ordinateur) d'entité.
Nous avions le message d'erreur suivant :

[19-Aug-2019 12:00:11 Europe/Paris] PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Empty IN are not allowed' in D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php:546
Stack trace:
#0 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(516): DBmysqlIterator->analyzeCriterion(Array)
#1 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(506): DBmysqlIterator->analyseCrit(Array)
#2 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(288): DBmysqlIterator->analyseCrit(Array)
#3 D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php(94): DBmysqlIterator->buildQuery(Array, '', false)
#4 D:\glpi\data\www\glpitest\inc\dbmysql.class.php(580): DBmysqlIterator->execute(Array, '', false)
#5 D:\glpi\data\www\glpitest\inc\transfer.class.php(2784): DBmysql->request(Array)
#6 D:\glpi\data\www\glpitest\inc\transfer.class.php(2719): Transfer->transferSingleSupplier('1')
#7 D:\glpi\data\www\glpitest\inc\transfer.class.php(1077): Transfer->transferInfocoms('Computer', '9984', '9984')
#8 D:\glpi\data\www\glpitest\inc\transfer.class.php(203):  in D:\glpi\data\www\glpitest\inc\dbmysqliterator.class.php on line 546

Après analyse plus poussé, le problème se produit lorsque le matériel est lié à un fournisseur qui n'a pas de contrats.

En regardant le fichier transfert.class.php nous avons modifié les lignes suivantes afin que tout rentre dans l'ordre (en se basant sur d'autres lignes de cette classe) :
Dans la function transferSingleSupplier($ID)

--> ligne 2775, ajout du contrôle

if (isset($this->needtobe_transfer['Contract']) && count($this->needtobe_transfer['Contract'])) {  

avant de lancer la requête avec un tableau vide

--> ligne 2792, amélioration du controle en ajoutant le count :

if (isset($this->needtobe_transfer[$itemtype]) && count($this->needtobe_transfer[$itemtype])) { 

A votre disposition si besoin de plus de précisions

Cordialement

Offline

Board footer

Powered by FluxBB