Class PHP

Augustin_couval Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -  
Augustin_couval Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'essaie d'utiliser une classe de création (pour créer une commande sur le logiciel ERP Dolibarr).

Voici le code de la classe :

 public function create($user, $notrigger = 0)
    {
        global $langs, $conf, $hookmanager;

        $this->db->begin();

		$error = 0;
        $now = dol_now();

		// $date_commande is deprecated
		$date = ($this->date_commande ? $this->date_commande : $this->date); // in case of date is set
		if(empty($date)) $date = $now;

        // Clean parameters
        if (empty($this->source)) $this->source = 0;

		// Multicurrency (test on $this->multicurrency_tx because we should take the default rate only if not using origin rate)
		if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) list($this->fk_multicurrency, $this->multicurrency_tx) = MultiCurrency::getIdAndTxFromCode($this->db, $this->multicurrency_code, $date);
		else $this->fk_multicurrency = MultiCurrency::getIdFromCode($this->db, $this->multicurrency_code);
		if (empty($this->fk_multicurrency))
		{
			$this->multicurrency_code = $conf->currency;
			$this->fk_multicurrency = 0;
			$this->multicurrency_tx = 1;
		}

        // We set order into draft status
        $this->brouillon = 1;

        $sql = "INSERT INTO ".MAIN_DB_PREFIX."commande_fournisseur (";
        $sql .= "ref";
        $sql .= ", ref_supplier";
        $sql .= ", note_private";
        $sql .= ", note_public";
        $sql .= ", entity";
        $sql .= ", fk_soc";
        $sql .= ", fk_projet";
        $sql .= ", date_creation";
		$sql .= ", date_livraison";
        $sql .= ", fk_user_author";
        $sql .= ", fk_statut";
        $sql .= ", source";
        $sql .= ", model_pdf";
        $sql .= ", fk_mode_reglement";
		$sql .= ", fk_cond_reglement";
        $sql .= ", fk_account";
		$sql .= ", fk_incoterms, location_incoterms";
        $sql .= ", fk_multicurrency";
        $sql .= ", multicurrency_code";
        $sql .= ", multicurrency_tx";
        $sql .= ") ";
        $sql .= " VALUES (";
        $sql .= "''";
        $sql .= ", '".$this->db->escape($this->ref_supplier)."'";
        $sql .= ", '".$this->db->escape($this->note_private)."'";
        $sql .= ", '".$this->db->escape($this->note_public)."'";
        $sql .= ", ".$conf->entity;
        $sql .= ", ".$this->socid;
        $sql .= ", ".($this->fk_project > 0 ? $this->fk_project : "null");
        $sql .= ", '".$this->db->idate($date)."'";
		$sql .= ", ".($this->date_livraison ? "'".$this->db->idate($this->date_livraison)."'" : "null");
        $sql .= ", ".$user->id;
        $sql .= ", ".self::STATUS_DRAFT;
        $sql .= ", ".$this->db->escape($this->source);
        $sql .= ", '".$conf->global->COMMANDE_SUPPLIER_ADDON_PDF."'";
        $sql .= ", ".($this->mode_reglement_id > 0 ? $this->mode_reglement_id : 'null');
        $sql .= ", ".($this->cond_reglement_id > 0 ? $this->cond_reglement_id : 'null');
        $sql .= ", ".($this->fk_account > 0 ? $this->fk_account : 'NULL');
        $sql .= ", ".(int) $this->fk_incoterms;
        $sql .= ", '".$this->db->escape($this->location_incoterms)."'";
		$sql .= ", ".(int) $this->fk_multicurrency;
		$sql .= ", '".$this->db->escape($this->multicurrency_code)."'";
		$sql .= ", ".(double) $this->multicurrency_tx;
        $sql .= ")";

        dol_syslog(get_class($this)."::create", LOG_DEBUG);
        if ($this->db->query($sql))
        {
            $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."commande_fournisseur");

			if ($this->id) {
				$num = count($this->lines);

	            // insert products details into database
	            for ($i = 0; $i < $num; $i++)
	            {
	                $this->special_code = $this->lines[$i]->special_code; // TODO : remove this in 9.0 and add special_code param to addline()

                    // This include test on qty if option SUPPLIER_ORDER_WITH_NOPRICEDEFINED is not set
                    $result = $this->addline(
	                    $this->lines[$i]->desc,
	                    $this->lines[$i]->subprice,
	                    $this->lines[$i]->qty,
	                    $this->lines[$i]->tva_tx,
	                    $this->lines[$i]->localtax1_tx,
	                    $this->lines[$i]->localtax2_tx,
	                    $this->lines[$i]->fk_product,
	                    0,
	                    $this->lines[$i]->ref_fourn, // $this->lines[$i]->ref_fourn comes from field ref into table of lines. Value may ba a ref that does not exists anymore, so we first try with value of product
	                    $this->lines[$i]->remise_percent,
	                    'HT',
	                    0,
	                    $this->lines[$i]->product_type,
	                    $this->lines[$i]->info_bits,
                        false,
	                    $this->lines[$i]->date_start,
                        $this->lines[$i]->date_end,
                        $this->lines[$i]->array_options,
                        $this->lines[$i]->fk_unit
	                );
	                if ($result < 0)
	                {
	                    dol_syslog(get_class($this)."::create ".$this->error, LOG_WARNING); // do not use dol_print_error here as it may be a functionnal error
	                    $this->db->rollback();
	                    return -1;
	                }
	            }

	            $sql = "UPDATE ".MAIN_DB_PREFIX."commande_fournisseur";
	            $sql .= " SET ref='(PROV".$this->id.")'";
	            $sql .= " WHERE rowid=".$this->id;
	            dol_syslog(get_class($this)."::create", LOG_DEBUG);
	            if ($this->db->query($sql))
	            {
					// Add link with price request and supplier order
					if ($this->id)
					{
						$this->ref = "(PROV".$this->id.")";

						if (!empty($this->linkedObjectsIds) && empty($this->linked_objects))	// To use new linkedObjectsIds instead of old linked_objects
						{
							$this->linked_objects = $this->linkedObjectsIds; // TODO Replace linked_objects with linkedObjectsIds
						}

						// Add object linked
						if (!$error && $this->id && is_array($this->linked_objects) && !empty($this->linked_objects))
						{
							foreach ($this->linked_objects as $origin => $tmp_origin_id)
							{
							    if (is_array($tmp_origin_id))       // New behaviour, if linked_object can have several links per type, so is something like array('contract'=>array(id1, id2, ...))
							    {
							        foreach ($tmp_origin_id as $origin_id)
							        {
							            $ret = $this->add_object_linked($origin, $origin_id);
							            if (!$ret)
							            {
							                dol_print_error($this->db);
							                $error++;
							            }
							        }
							    }
							    else                                // Old behaviour, if linked_object has only one link per type, so is something like array('contract'=>id1))
							    {
							        $origin_id = $tmp_origin_id;
									$ret = $this->add_object_linked($origin, $origin_id);
									if (!$ret)
									{
										dol_print_error($this->db);
										$error++;
									}
							    }
							}
						}
					}

	                if (!$error)
                    {
                    	$result = $this->insertExtraFields();
	                    if ($result < 0) $error++;
                    }

					if (!$error && !$notrigger)
	                {
						// Call trigger
						$result = $this->call_trigger('ORDER_SUPPLIER_CREATE', $user);
						if ($result < 0)
	                    {
	                        $this->db->rollback();
	                        return -1;
	                    }
						// End call triggers
	                }

	                $this->db->commit();
	                return $this->id;
	            }
	            else
	            {
	                $this->error = $this->db->lasterror();
	                $this->db->rollback();
	                return -2;
	            }
            }
        }
        else
        {
            $this->error = $this->db->lasterror();
            $this->db->rollback();
            return -1;
        }
    }


Je voudrais créer un trigger pour Créer une commande fournisseur si un devis est signée, il y a déjà un trigger utiliser pour créer une commande client depuis un devis signé, voici son code :

// Proposals to order
        if ($action == 'PROPAL_CLOSE_SIGNED')
        {
        	dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
           
                include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
                $newobject = new Commande($this->db);

                $newobject->context['createfrompropal'] = 'createfrompropal';
                $newobject->context['origin'] = $object->element;
                $newobject->context['origin_id'] = $object->id;

                $ret = $newobject->createFromProposal($object, $user);
                if ($ret < 0) { $this->error = $newobject->error; $this->errors[] = $newobject->error; }
                return $ret;
            
        }



je voudrais faire la même chose mais pour créer une commande fournisseur, j'ai donc repris le modèle ci-dessus, j'ai donc ça :

	if ($action == 'PROPAL_CLOSE_SIGNED')
        {
        	dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
           
                include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
                $object = new CommandeFournisseur($this->db);

                $object->create($user)


                $ret = $newobject->create($object, $user);
                if ($ret < 0) { $this->error = $newobject->error; $this->errors[] = $newobject->error; }
                return $ret;
    
        }



cependant j'ai une erreur de syntaxe sql.

Avez vous idée de comment je doit utiliser la class create(), j'ai bien évidement rechercher sur internet mais aucune doc...



Configuration: Windows / Chrome 88.0.4324.104
A voir également:

2 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Si tu as une erreur de syntaxe SQL ... il faudrait nous la donner ...

A savoir que si c'est bien un souci de syntaxe sql... le message devrait te permettre de trouver où se situe l'erreur...
Tu pourrais, pour commencer, afficher la variable $sql .. histoire de voir quelle requête est générée lorsque tu fais appel à ta fonction
   $sql = "INSERT INTO ".MAIN_DB_PREFIX."commande_fournisseur (";
        $sql .= "ref";
        $sql .= ", ref_supplier";
        $sql .= ", note_private";
        $sql .= ", note_public";
        $sql .= ", entity";
        $sql .= ", fk_soc";
        $sql .= ", fk_projet";
        $sql .= ", date_creation";
		$sql .= ", date_livraison";
        $sql .= ", fk_user_author";
        $sql .= ", fk_statut";
        $sql .= ", source";
        $sql .= ", model_pdf";
        $sql .= ", fk_mode_reglement";
		$sql .= ", fk_cond_reglement";
        $sql .= ", fk_account";
		$sql .= ", fk_incoterms, location_incoterms";
        $sql .= ", fk_multicurrency";
        $sql .= ", multicurrency_code";
        $sql .= ", multicurrency_tx";
        $sql .= ") ";
        $sql .= " VALUES (";
        $sql .= "''";
        $sql .= ", '".$this->db->escape($this->ref_supplier)."'";
        $sql .= ", '".$this->db->escape($this->note_private)."'";
        $sql .= ", '".$this->db->escape($this->note_public)."'";
        $sql .= ", ".$conf->entity;
        $sql .= ", ".$this->socid;
        $sql .= ", ".($this->fk_project > 0 ? $this->fk_project : "null");
        $sql .= ", '".$this->db->idate($date)."'";
		$sql .= ", ".($this->date_livraison ? "'".$this->db->idate($this->date_livraison)."'" : "null");
        $sql .= ", ".$user->id;
        $sql .= ", ".self::STATUS_DRAFT;
        $sql .= ", ".$this->db->escape($this->source);
        $sql .= ", '".$conf->global->COMMANDE_SUPPLIER_ADDON_PDF."'";
        $sql .= ", ".($this->mode_reglement_id > 0 ? $this->mode_reglement_id : 'null');
        $sql .= ", ".($this->cond_reglement_id > 0 ? $this->cond_reglement_id : 'null');
        $sql .= ", ".($this->fk_account > 0 ? $this->fk_account : 'NULL');
        $sql .= ", ".(int) $this->fk_incoterms;
        $sql .= ", '".$this->db->escape($this->location_incoterms)."'";
		$sql .= ", ".(int) $this->fk_multicurrency;
		$sql .= ", '".$this->db->escape($this->multicurrency_code)."'";
		$sql .= ", ".(double) $this->multicurrency_tx;
        $sql .= ")";

       echo $sql; /
       dol_syslog($sql, LOG_DEBUG); / et si le echo ne t'affiche rien... le faire via la fonction de log ...


Une fois le contenu de ta variable $sql obtenu .. tu n'as plus qu'à te connecter à ta bdd via le logiciel d'administration de ta bdd ( phpmyadmin si mysql.. )
Et à exécuter la requête DIRECTEMENT via ce logiciel pour voir si elle fonctionne...
0
Augustin_couval Messages postés 20 Date d'inscription   Statut Membre Dernière intervention  
 
Merci, J'ai afficher la requête en question et je vois bien que les champ qui sont obligatoire ne sont pas présent dans la requête,

Voici la requête :
INSERT INTO llx_commande_fournisseur (ref, ref_supplier, note_private, note_public, entity, fk_soc, fk_projet, date_creation, date_livraison, fk_user_author, fk_statut, source, model_pdf, fk_mode_reglement, fk_cond_reglement, fk_account, fk_incoterms, location_incoterms, fk_multicurrency, multicurrency_code, multicurrency_tx) VALUES ('', '', '', '', 1, , null, '2021-02-03 09:04:28', null, 87, 0, 0, 'muscadet', null, null, NULL, 0, '', 0, 'EUR', 1)



Ici, les champ obligatoire sont :

ref, entity, fk_soc, Source
Il n'y a que entity qui est renseigner.

Je ne vois pas trop comment renseigner les autres champ car il faudrait, pour FK_soc, récuperer le fournisseur qui vend le produit le moins cher.
0