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;
}