diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 524c58e656c83e59f6058300f72e6ea0e79109aa..b730fe8bbb710249d02fb43e3252c624a7b5c060 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1116,10 +1116,15 @@ if ($_GET['action'] == 'create') // Type de facture $facids=$facturestatic->list_replacable_invoices($soc->id); + if ($facids < 0) + { + dolibarr_print_error($db,$facturestatic); + exit; + } $options=""; - foreach ($facids as $key => $value) + foreach ($facids as $facparam) { - $options.='<option value="'.$key.'">'.$value.'</option>'; + $options.='<option value="'.$facparam['id'].'">'.$facparam['ref'].'</option>'; } $facids=$facturestatic->list_qualified_avoir_invoices($soc->id); $optionsav=""; @@ -1676,15 +1681,14 @@ else */ if ($_GET['action'] == 'canceled') { - // Si il y a une facture de remplacement pas encore valid�e (etat brouillon), - // on ne permet pas de classer abandonner la facture + // S'il y a une facture de remplacement pas encore valid�e (etat brouillon), + // on ne permet pas de classer abandonner la facture. if ($facidnext) { $facturereplacement=new Facture($db); $facturereplacement->fetch($facidnext); $statusreplacement=$facturereplacement->statut; } - print "x".$statusreplacement; if ($facidnext && $statusreplacement == 0) { print '<div class="error">'.$langs->trans("ErrorCantCancelIfReplacementInvoiceNotValidated").'</div>'; diff --git a/htdocs/facture.class.php b/htdocs/facture.class.php index cb763e658530721ff5990a2063b120b7f96f0293..9c5e237c0e07858485173f56a5e17c50c0bc01c2 100644 --- a/htdocs/facture.class.php +++ b/htdocs/facture.class.php @@ -1801,10 +1801,13 @@ class Facture extends CommonObject $sql.= ' WHERE fk_facture_source = '.$this->id; $sql.= ' AND type < 2'; if ($option == 'validated') $sql.= ' AND fk_statut = 1'; - $sql.= ' ORDER BY fk_statut DESC'; // Au cas ou base corrompu et qu'il y a une - // facture de remplacement validee et une autre non - // on donne priorit� � la valid�e. Ne devrait pas arriver - + // PROTECTION BAD DATA + // Au cas ou base corrompue et qu'il y a une facture de remplacement valid�e + // et une autre non, on donne priorit� � la valid�e. + // Ne devrait pas arriver (sauf si acc�s concurrentiel et que 2 personnes + // ont cr�� en meme temps une facture de remplacement pour la meme facture) + $sql.= ' ORDER BY fk_statut DESC'; + $resql=$this->db->query($sql); if ($resql) { @@ -2240,7 +2243,7 @@ class Facture extends CommonObject * \brief Renvoi liste des factures remplacables * Statut validee + aucun paiement + non paye + pas deja remplac�es * \param socid Id societe - * \return array Tableau des factures ($id => $ref) + * \return array Tableau des factures ('id'=>id, 'ref'=>ref, 'statut'=>status) */ function list_replacable_invoices($socid=0) { @@ -2248,13 +2251,14 @@ class Facture extends CommonObject $return = array(); - $sql = "SELECT f.rowid as rowid, f.facnumber,"; + $sql = "SELECT f.rowid as rowid, f.facnumber, f.fk_statut,"; $sql.= " ff.rowid as rowidnext"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as ff ON f.rowid = ff.fk_facture_source"; $sql.= " WHERE f.fk_statut = 1 AND f.paye = 0 AND pf.fk_paiement IS NULL"; - $sql.= " AND IFNULL(ff.fk_statut,0) = 0"; // Doit renvoy� vrai si pas de jointure trouv� ou si jointure vers statut � 0 + $sql.= " AND ff.fk_statut IS NULL"; // Renvoie vrai si pas de jointure + //$sql.= " AND IFNULL(ff.fk_statut,0) = 0"; // Renvoie vrai si pas de jointure ou si jointure vers statut � 0 if ($socid > 0) $sql.=" AND f.fk_soc = ".$socid; $sql.= " ORDER BY f.facnumber"; @@ -2264,9 +2268,11 @@ class Facture extends CommonObject { while ($obj=$this->db->fetch_object($resql)) { - $return[$obj->rowid]=$obj->facnumber; + $return[$obj->rowid]=array( 'id' => $obj->rowid, + 'ref' => $obj->facnumber, + 'status' => $obj->fk_status); } - + //print_r($return); return $return; } else