diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index e27a7f69b84..1d0ccf5953e 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -947,13 +947,13 @@ if ($_GET['propalid'] > 0)
print '
';
if ($i > 0)
{
- print 'id.'&action=up&rowid='.$objp->rowid.'">';
+ print 'id.'&action=up&rowid='.$objp->rowid.'">';
print img_up();
print '';
}
if ($i < $num_lignes-1)
{
- print 'id.'&action=down&rowid='.$objp->rowid.'">';
+ print 'id.'&action=down&rowid='.$objp->rowid.'">';
print img_down();
print '';
}
diff --git a/htdocs/commande/commande.class.php b/htdocs/commande/commande.class.php
index ac8565a890b..8029dc8d831 100644
--- a/htdocs/commande/commande.class.php
+++ b/htdocs/commande/commande.class.php
@@ -635,6 +635,130 @@ class Commande
**/
}
}
+
+ /**
+ * \brief Stocke un numéro de rang pour toutes les lignes de
+ * detail d'une commande qui n'en ont pas.
+ */
+ function line_order()
+ {
+ $sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.'commandedet';
+ $sql .= ' WHERE fk_commande='.$this->id;
+ $sql .= ' AND rang = 0';
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $nl = $row[0];
+ }
+ if ($nl > 0)
+ {
+ $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'commandedet';
+ $sql .= ' WHERE fk_commande='.$this->id;
+ $sql .= ' ORDER BY rang ASC, rowid ASC';
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num)
+ {
+ $row = $this->db->fetch_row($resql);
+ $li[$i] = $row[0];
+ $i++;
+ }
+ }
+ for ($i = 0 ; $i < sizeof($li) ; $i++)
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'commandedet SET rang = '.($i+1);
+ $sql .= ' WHERE rowid = '.$li[$i];
+ if (!$this->db->query($sql) )
+ {
+ dolibarr_syslog($this->db->error());
+ }
+ }
+ }
+ }
+
+ function line_up($rowid)
+ {
+ $this->line_order();
+
+ /* Lecture du rang de la ligne */
+ $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.'commandedet';
+ $sql .= ' WHERE rowid ='.$rowid;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $rang = $row[0];
+ }
+
+ if ($rang > 1 )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'commandedet SET rang = '.$rang ;
+ $sql .= ' WHERE fk_commande = '.$this->id;
+ $sql .= ' AND rang = '.($rang - 1);
+ if ($this->db->query($sql) )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'commandedet SET rang = '.($rang - 1);
+ $sql .= ' WHERE rowid = '.$rowid;
+ if (! $this->db->query($sql) )
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ }
+
+ function line_down($rowid)
+ {
+ $this->line_order();
+
+ /* Lecture du rang de la ligne */
+ $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.'commandedet';
+ $sql .= ' WHERE rowid ='.$rowid;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $rang = $row[0];
+ }
+
+ /* Lecture du rang max de la facture */
+ $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.'commandedet';
+ $sql .= ' WHERE fk_commande ='.$this->id;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $max = $row[0];
+ }
+
+ if ($rang < $max )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'commandedet SET rang = '.$rang;
+ $sql .= ' WHERE fk_commande = '.$this->id;
+ $sql .= ' AND rang = '.($rang+1);
+ if ($this->db->query($sql) )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'commandedet SET rang = '.($rang+1);
+ $sql .= ' WHERE rowid = '.$rowid;
+ if (! $this->db->query($sql) )
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ }
/**
* Lit une commande
@@ -720,7 +844,7 @@ class Commande
$sql.= ' FROM '.MAIN_DB_PREFIX.'commandedet as l';
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON l.fk_product=p.rowid';
$sql.= ' WHERE l.fk_commande = '.$this->id;
- $sql.= ' ORDER BY l.rowid';
+ $sql.= ' ORDER BY l.rang';
$result = $this->db->query($sql);
if ($result)
{
diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php
index 9d752bef6de..9275e3fd511 100644
--- a/htdocs/commande/fiche.php
+++ b/htdocs/commande/fiche.php
@@ -296,6 +296,22 @@ if ($_GET['action'] == 'modif' && $user->rights->commande->creer)
$commande->reopen($user->id);
}
+/*
+ * Ordonnancement des lignes
+ */
+
+if ($_GET['action'] == 'up' && $user->rights->commande->creer)
+{
+ $commande = new Commande($db);
+ $commande->line_up($_GET['rowid']);
+}
+
+if ($_GET['action'] == 'down' && $user->rights->commande->creer)
+{
+ $commande = new Commande($db);
+ $commande->line_down($_GET['rowid']);
+}
+
if ($_REQUEST['action'] == 'builddoc') // En get ou en post
{
/*
@@ -1090,13 +1106,24 @@ else
print ' | ';
print img_delete();
print ' | ';
- print ' | ';
+ print '';
+ if ($i > 0)
+ {
+ print 'id.'&action=up&rowid='.$objp->rowid.'">';
+ print img_up();
+ print '';
+ }
+ if ($i < $num_lignes-1)
+ {
+ print 'id.'&action=down&rowid='.$objp->rowid.'">';
+ print img_down();
+ print '';
+ }
+ print ' | ';
}
else
{
- print ' | ';
- print ' | ';
- print ' | ';
+ print ' | ';
}
print '';
}
diff --git a/htdocs/propal.class.php b/htdocs/propal.class.php
index 08089deff75..71809ac3a71 100644
--- a/htdocs/propal.class.php
+++ b/htdocs/propal.class.php
@@ -548,6 +548,130 @@ class Propal
}
+ /**
+ * \brief Stocke un numéro de rang pour toutes les lignes de
+ * detail d'une propale qui n'en ont pas.
+ */
+ function line_order()
+ {
+ $sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.'propaldet';
+ $sql .= ' WHERE fk_propal='.$this->id;
+ $sql .= ' AND rang = 0';
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $nl = $row[0];
+ }
+ if ($nl > 0)
+ {
+ $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'propaldet';
+ $sql .= ' WHERE fk_propal='.$this->id;
+ $sql .= ' ORDER BY rang ASC, rowid ASC';
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $num = $this->db->num_rows($resql);
+ $i = 0;
+ while ($i < $num)
+ {
+ $row = $this->db->fetch_row($resql);
+ $li[$i] = $row[0];
+ $i++;
+ }
+ }
+ for ($i = 0 ; $i < sizeof($li) ; $i++)
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'propaldet SET rang = '.($i+1);
+ $sql .= ' WHERE rowid = '.$li[$i];
+ if (!$this->db->query($sql) )
+ {
+ dolibarr_syslog($this->db->error());
+ }
+ }
+ }
+ }
+
+ function line_up($rowid)
+ {
+ $this->line_order();
+
+ /* Lecture du rang de la ligne */
+ $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.'propaldet';
+ $sql .= ' WHERE rowid ='.$rowid;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $rang = $row[0];
+ }
+
+ if ($rang > 1 )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'propaldet SET rang = '.$rang ;
+ $sql .= ' WHERE fk_propal = '.$this->id;
+ $sql .= ' AND rang = '.($rang - 1);
+ if ($this->db->query($sql) )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'propaldet SET rang = '.($rang - 1);
+ $sql .= ' WHERE rowid = '.$rowid;
+ if (! $this->db->query($sql) )
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ }
+
+ function line_down($rowid)
+ {
+ $this->line_order();
+
+ /* Lecture du rang de la ligne */
+ $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.'propaldet';
+ $sql .= ' WHERE rowid ='.$rowid;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $rang = $row[0];
+ }
+
+ /* Lecture du rang max de la facture */
+ $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.'propaldet';
+ $sql .= ' WHERE fk_propal ='.$this->id;
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $row = $this->db->fetch_row($resql);
+ $max = $row[0];
+ }
+
+ if ($rang < $max )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'propaldet SET rang = '.$rang;
+ $sql .= ' WHERE fk_propal = '.$this->id;
+ $sql .= ' AND rang = '.($rang+1);
+ if ($this->db->query($sql) )
+ {
+ $sql = 'UPDATE '.MAIN_DB_PREFIX.'propaldet SET rang = '.($rang+1);
+ $sql .= ' WHERE rowid = '.$rowid;
+ if (! $this->db->query($sql) )
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+ }
+
/**
* \brief Recupère de la base les caractéristiques d'une propale
* \param rowid id de la propal à récupérer
@@ -653,7 +777,7 @@ class Propal
$sql.= " p.rowid, p.label, p.description as product_desc, p.ref";
$sql.= " FROM ".MAIN_DB_PREFIX."propaldet as d, ".MAIN_DB_PREFIX."product as p";
$sql.= " WHERE d.fk_propal = ".$this->id ." AND d.fk_product = p.rowid";
- $sql.= " ORDER by d.rowid ASC";
+ $sql.= " ORDER by d.rang";
$result = $this->db->query($sql);
if ($result)
diff --git a/mysql/migration/2.0.0-2.1.0.sql b/mysql/migration/2.0.0-2.1.0.sql
index 3733c6bb491..a2ed9720d6f 100644
--- a/mysql/migration/2.0.0-2.1.0.sql
+++ b/mysql/migration/2.0.0-2.1.0.sql
@@ -203,6 +203,7 @@ ALTER TABLE llx_facture_rec ADD CONSTRAINT fk_facture_rec_fk_projet FORE
ALTER TABLE llx_facture_rec ADD UNIQUE INDEX idx_facture_rec_uk_titre (titre);
alter table llx_commandedet add column coef real;
+alter table llx_propaldet add colmun coef real;
create table llx_livraison
(
@@ -257,3 +258,5 @@ rename table llx_accountingsystem_det to llx_accountingaccount;
insert into llx_rights_def (id, libelle, module, type, bydefault, subperms, perms) values (262,'Consulter tous les clients','commercial','r',1,'voir','client');
insert into llx_user_rights(fk_user,fk_id) select distinct fk_user, '262' from llx_user_rights where fk_id = 261;
+alter table llx_commandedet add column rang integer DEFAULT 0;
+alter table llx_propaldet add column rang integer DEFAULT 0;
\ No newline at end of file
diff --git a/mysql/tables/llx_commandedet.sql b/mysql/tables/llx_commandedet.sql
index e4c9aa77d2d..0d7623a884c 100644
--- a/mysql/tables/llx_commandedet.sql
+++ b/mysql/tables/llx_commandedet.sql
@@ -32,5 +32,6 @@ create table llx_commandedet
remise real DEFAULT 0, -- montant de la remise
subprice real, -- prix avant remise
price real, -- prix final
- coef real -- coefficient de marge
+ coef real, -- coefficient de marge
+ rang integer DEFAULT 0
)type=innodb;
diff --git a/mysql/tables/llx_propaldet.sql b/mysql/tables/llx_propaldet.sql
index 8614512b7c1..c7dfbb218db 100644
--- a/mysql/tables/llx_propaldet.sql
+++ b/mysql/tables/llx_propaldet.sql
@@ -30,5 +30,7 @@ create table llx_propaldet
remise_percent real DEFAULT 0, -- pourcentage de remise
remise real DEFAULT 0, -- montant de la remise
subprice real, -- prix avant remise
- price real -- prix final
+ price real, -- prix final
+ coef real, -- coefficient de marge
+ rang integer DEFAULT 0
)type=innodb;