Creation trigger

Dolibarr V19.0.4
PHP8

Bonjour la communauté,
Je viens de découvrir les triggers dans Dolibarr.
J’aimerais créer une expédition losque la facture passe à payé.

J’ai créé un fichier dolibarr/core/triggers/interface_99_modFacture_CreateShipment.class.php

J’arrive bien à créer mon expédition, la lier à la commande, les différentes lignes… par contre je bloque sur les batchs.
J’ai essayé de passer par une requete sql mais sans succès…
Sauriez vous m’aider à reconstituer la variable detail_batch le plus proprement possible ?
Un grand merci !
Alexandre

public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf)
	{  
		if ($action == 'BILL_PAYED')
		{
          dol_syslog("Well done Alex : Trigger for action '$action' launched. id=".$object->id);

$facture = $object; // Vérification que c'est bien un objet Facture
    if (empty($facture->id)) {
        dol_syslog("Erreur : objet facture non valide", LOG_ERR);
        return -1;
    }
dol_syslog("Debug ALex: ".var_export($object, true), LOG_DEBUG);
	  $result = $facture->fetchObjectLinked();
	  dol_syslog("Debug Alex - linkedObjects: " . var_export($facture->linkedObjects, true), LOG_DEBUG);


	  if (!empty($facture->linkedObjects['commande'])) {
    foreach ($facture->linkedObjects['commande'] as $commande) {
        dol_syslog("Commande trouvée ID: ".$commande->id, LOG_DEBUG);

        if (!empty($commande->id)) {
        dol_syslog("Alex creeation expe commande : ".$commande->id, LOG_DEBUG);
        dol_syslog("Alex pour le client : ".$commande->socid, LOG_DEBUG);

// Initialiser l'expédition
$shipment = new Expedition($this->db);
$shipment->origin = 'commande';
$shipment->origin_id = $commande->id;
$shipment->date_creation = dol_now();
$shipment->socid = $commande->socid;

// Vérifier si les lignes de commande sont bien chargées
if (empty($commande->lines)) {
    dol_syslog("Alex: Les lignes ne sont pas chargées, on les récupère.", LOG_DEBUG);
    $commande->fetch_lines();
}


// Transformer les lignes de commande en objets compatibles avec Expedition
$shipment->lines = array();
foreach ($commande->lines as $line) {
    if ($line->product_type == 1) {
        dol_syslog("Alex: Ligne ignorée (service) - ID: " . $line->id, LOG_DEBUG);
        continue; // On ignore les services
    }

    $expeditionLine = new ExpeditionLigne($this->db);
    $expeditionLine->origin_line_id = $line->id; // Lien avec la ligne de commande
    $expeditionLine->fk_product = $line->fk_product;
    $expeditionLine->qty = $line->qty;
    //$expeditionLine->entrepot_id = 5; // Entrepôt par défaut à 1 si non défini

// Vérifier dans quel entrepôt on a du stock disponible
//$sql = "SELECT fk_entrepot FROM llx_product_stock WHERE fk_product = ".(int) $line->fk_product." AND reel > 0 ORDER BY reel DESC LIMIT 1";
$sql = "SELECT fk_entrepot,pb.rowid FROM llx_product_stock ps LEFT JOIN llx_product_batch pb on ps.rowid=pb.fk_product_stock WHERE ps.fk_product = ".(int) $line->fk_product."  AND ps.reel > 0 ORDER BY ps.reel DESC LIMIT 1;";
dol_syslog("Alex - Requête entrepôt : ".$sql, LOG_DEBUG);

$resql = $this->db->query($sql);

if ($resql && $this->db->num_rows($resql) > 0) {
    $obj = $this->db->fetch_object($resql);
    $expeditionLine->entrepot_id = $obj->fk_entrepot;
    $expeditionLine->detail_batch = $obj->rowid;
} else {
    $expeditionLine->entrepot_id = 5; // Entrepôt par défaut si aucun stock trouvé
}


    $shipment->lines[] = $expeditionLine;
}

dol_syslog("Alex: Transformation des lignes terminée. Nombre de lignes après filtre: " . count($shipment->lines), LOG_DEBUG);

// Assigner un entrepôt (par défaut à 1 si non défini)
$shipment->array_options['entrepot_id'] = !empty($commande->warehouse_id) ? $commande->warehouse_id : 1;
dol_syslog("Alex: Entrepôt défini: " . $shipment->array_options['entrepot_id'], LOG_DEBUG);

// Créer l'expédition
$res = $shipment->create($user);


if ($res > 0) {
    dol_syslog("Alex Erreur lors de la création de l'expédition : ".$shipment->error, LOG_ERR);
} else {
    $result = $shipment->add_object_linked('commande',$commande->id,$user);
    dol_syslog("Alex Expédition créée avec succès, ID et retour du link: ".$result, LOG_DEBUG);
}


	}
    }
} else {
    dol_syslog("Aucune commande liée trouvée pour cette facture.", LOG_WARNING);
}

      		}
	 	return 0;
	}

j’ai dailleurs essayé d’utiliser la fonction fetch de la classe productbatch.class.php
Mais elle envoie toujours une erreur 500,

require_once DOL_DOCUMENT_ROOT.'/product/class/productbatch.class.php';
$batch = new Productbatch($obj->rowid);
$rebatch = $batch->fetch($obj->rowid);

Est-ce normal ?

Lorsque je fais la requete à la main avec le numéro de batch en question la base retourne bien une ligne

SELECT
t.rowid,
t.tms,
t.fk_product_stock,
t.sellby as oldsellby,
t.eatby as oldeatby,
t.batch,
t.qty,
t.import_key,
w.fk_entrepot,
w.fk_product,
pl.eatby,
pl.sellby
FROM llx_product_batch as t
INNER JOIN llx_product_stock w on t.fk_product_stock = w.rowid
LEFT JOIN llx_product_lot as pl on pl.fk_product = w.fk_product and pl.batch = t.batch
WHERE t.rowid = 3754;

bonjour @Ouikeep
Est-tu sur que tu n’as pas fait d’erreur dans ta requête Php? Peut-être tu pourrais faire un print de ta requête et vérifier, des fois, un espace, une , mal placée…
Voila, déjà une piste. Parce que si ta requête fonctionne quand tu la tape dans ta base de donnée, il n’y a pas de raison pour qu’elle ne fonctionne pas avec php.
Bonne journée.
Christophe

Bonjour @Ouikeep

si il y a une erreur 500 c’est dans les log apache, à regarder et à copier ici avec l’erreur précise pour que quelqu’un puisse vous aider

@+