Class PHP

Fermé
Augustin_couval Messages postés 20 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 18 février 2021 - 2 févr. 2021 à 10:06
Augustin_couval Messages postés 20 Date d'inscription mercredi 6 janvier 2021 Statut Membre Dernière intervention 18 février 2021 - 3 févr. 2021 à 10:09
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 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 févr. 2021 à 00:32
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 mercredi 6 janvier 2021 Statut Membre Dernière intervention 18 février 2021
3 févr. 2021 à 10:09
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