diff --git a/htdocs/compta/propal.php b/htdocs/compta/propal.php
index ddc5b89293c..73a9e6e8148 100644
--- a/htdocs/compta/propal.php
+++ b/htdocs/compta/propal.php
@@ -125,8 +125,8 @@ if ($_GET["propalid"])
*
*/
$sql = 'SELECT s.nom, s.idp, p.price, p.fk_projet,p.remise, p.tva, p.total, p.ref,'.$db->pdate('p.datep').' as dp, c.id as statut, c.label as lst, p.note, x.firstname, x.name, x.fax, x.phone, x.email, p.fk_user_author, p.fk_user_valid, p.fk_user_cloture, p.datec, p.date_valid, p.date_cloture';
- $sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'propal as p, '.MAIN_DB_PREFIX.'c_propalst as c, '.MAIN_DB_PREFIX.'socpeople as x';
- $sql .= ' WHERE p.fk_soc = s.idp AND p.fk_statut = c.id AND x.idp = p.fk_soc_contact AND p.rowid = '.$propal->id;
+ $sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s, '.MAIN_DB_PREFIX.'propal as p, '.MAIN_DB_PREFIX.'c_propalst as c, '.MAIN_DB_PREFIX.'socpeople as x';
+ $sql.= ' WHERE p.fk_soc = s.idp AND p.fk_statut = c.id AND x.idp = p.fk_soc_contact AND p.rowid = '.$propal->id;
if ($socidp) $sql .= ' AND s.idp = '.$socidp;
$result = $db->query($sql);
@@ -431,7 +431,7 @@ if ($_GET["propalid"])
print '".$langs->trans("BuildBill")."";
}
- if ($obj->statut == 2 && $num_fac_asso)
+ if ($obj->statut == 2 && sizeof($propal->facture_liste_array()))
{
print '".$langs->trans("ClassifyBilled")."";
}
diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang
index 2943330c456..cf3e0bab56f 100644
--- a/htdocs/langs/en_US/compta.lang
+++ b/htdocs/langs/en_US/compta.lang
@@ -1,5 +1,6 @@
# Dolibarr language file - en_US - compta
Accountancy=Accountancy
+AccountancyCard=Accountancy card
Treasury=Treasury
OptionMode=Option for accountancy
OptionModeTrue=Option Recettes-Dépenses
diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang
index fea0638649f..8b2eb0f6561 100755
--- a/htdocs/langs/en_US/projects.lang
+++ b/htdocs/langs/en_US/projects.lang
@@ -9,3 +9,4 @@ ConfirmDeleteAProject=Are you sure you want to delete this project ?
LastProjects=Last %s projects
AllProjects=All projects
ShowProject=Show project
+NoProject=No project defined
\ No newline at end of file
diff --git a/htdocs/langs/en_US/propal.lang b/htdocs/langs/en_US/propal.lang
index 02130bc5984..5ceda43a8bf 100644
--- a/htdocs/langs/en_US/propal.lang
+++ b/htdocs/langs/en_US/propal.lang
@@ -27,6 +27,15 @@ PropalsOpened=Opened
PropalStatusDraft=Draft (need to be validated)
PropalStatusValidated=Validated (proposal is opened)
PropalStatusClosed=Closed
+PropalStatusSigned=Signed (need to be billed)
+PropalStatusNotSigned=Not signed (closed)
+PropalStatusBilled=Billed
+PropalStatusDraftShort=Draft
+PropalStatusValidatedShort=Validated
+PropalStatusClosedShort=Closed
+PropalStatusSignedShort=Signed
+PropalStatusClosedShort=Not signed
+PropalStatusBilledShort=Billed
ListOfProposals=List of commercial proposals
ActionsOnPropal=Tasks on proposal
NoOpenedPropals=No opened commercial proposals
@@ -38,5 +47,11 @@ FileNotUploaded=The file was not uploaded
FileUploaded=The file was successfully uploaded
AssociatedDocuments=Documents associated with the proposal:
ErrorCantOpenDir=Can't open directory
-DateEndPropal=Date fin validité
-DateEndPropalShort=Date fin
+DateEndPropal=Date end validity
+DateEndPropalShort=Date end
+ValidityDuration=Validity duration
+CloseAs=Close with status
+ClassifyBilled=Classify billed
+BuildBill=Build bill
+RelatedBill=Related bill
+RelatedBills=Related bills
\ No newline at end of file
diff --git a/htdocs/langs/fr_FR/compta.lang b/htdocs/langs/fr_FR/compta.lang
index 1c0d6ec16d9..5c7060ccb6f 100644
--- a/htdocs/langs/fr_FR/compta.lang
+++ b/htdocs/langs/fr_FR/compta.lang
@@ -1,5 +1,6 @@
# Dolibarr language file - fr_FR - compta
Accountancy=Compta
+AccountancyCard=Fiche Compta
Treasury=Tréso
OptionMode=Option de tenue de comptabilité
OptionModeTrue=Option Recettes-Dépenses
diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang
index 518ccab2944..d016b1b4563 100755
--- a/htdocs/langs/fr_FR/projects.lang
+++ b/htdocs/langs/fr_FR/projects.lang
@@ -9,3 +9,4 @@ ConfirmDeleteAProject=
LastProjects=Les %s derniers projets
AllProjects=Tous les projets
ShowProject=Afficher projet
+NoProject=Aucun projet défini
\ No newline at end of file
diff --git a/htdocs/langs/fr_FR/propal.lang b/htdocs/langs/fr_FR/propal.lang
index e914747937b..45e5e2499db 100644
--- a/htdocs/langs/fr_FR/propal.lang
+++ b/htdocs/langs/fr_FR/propal.lang
@@ -26,7 +26,16 @@ PropalsDraft=Brouillons
PropalsOpened=Ouvertes
PropalStatusDraft=Brouillon (à valider)
PropalStatusValidated=Validée (propale ouverte)
-PropalStatusClosed=Fermé
+PropalStatusClosed=Fermée
+PropalStatusSigned=Signée (à facturer)
+PropalStatusNotSigned=Non signée (fermée)
+PropalStatusBilled=Facturée
+PropalStatusDraftShort=Brouillon
+PropalStatusValidatedShort=Validée
+PropalStatusClosedShort=Fermée
+PropalStatusSignedShort=Signée
+PropalStatusClosedShort=Non signée
+PropalStatusBilledShort=Facturée
ListOfProposals=Liste des devis/propositions commerciales
ActionsOnPropal=Actions sur la proposition
NoOpenedPropals=Pas de proposition ouverte
@@ -40,3 +49,9 @@ AssociatedDocuments=Documents associ
ErrorCantOpenDir=Impossible d'ouvrir le répertoire
DateEndPropal=Date fin validité
DateEndPropalShort=Date fin
+ValidityDuration=Durée de validité
+CloseAs=Clôturer au statut
+ClassifyBilled=Classer facturée
+BuildBill=Créer facture
+RelatedBill=Facture associée
+RelatedBills=Factures associées
\ No newline at end of file
diff --git a/htdocs/propal.class.php b/htdocs/propal.class.php
index e9a8b54f9ef..c7c5d9e1373 100644
--- a/htdocs/propal.class.php
+++ b/htdocs/propal.class.php
@@ -79,10 +79,14 @@ class Propal
$langs->load("propals");
$this->labelstatut[0]=$langs->trans("PropalStatusDraft");
$this->labelstatut[1]=$langs->trans("PropalStatusValidated");
- $this->labelstatut[2]=$langs->trans("PropalStatusClosed");
- $this->labelstatut_short[0]=$langs->trans("PropalStatusDraft");
+ $this->labelstatut[2]=$langs->trans("PropalStatusSigned");
+ $this->labelstatut[3]=$langs->trans("PropalStatusNotSigned");
+ $this->labelstatut[4]=$langs->trans("PropalStatusBilled");
+ $this->labelstatut_short[0]=$langs->trans("PropalStatusDraftShort");
$this->labelstatut_short[1]=$langs->trans("Opened");
- $this->labelstatut_short[2]=$langs->trans("PropalStatusClosed");
+ $this->labelstatut_short[2]=$langs->trans("PropalStatusSignedShort");
+ $this->labelstatut_short[3]=$langs->trans("PropalStatusNotSignedShort");
+ $this->labelstatut_short[4]=$langs->trans("PropalStatusBilledShort");
}
@@ -786,45 +790,45 @@ class Propal
}
}
- /**
- * \brief Renvoie un tableau contenant les numéros de commandes associées
- *
- */
-
- function commande_liste_array ()
+ /**
+ * \brief Renvoie un tableau contenant les numéros de commandes associées
+ * \remarks Fonction plus light que associated_orders
+ * \seealso associated_orders
+ */
+ function commande_liste_array ()
{
- $ga = array();
-
- $sql = "SELECT fk_commande FROM ".MAIN_DB_PREFIX."co_pr";
- $sql .= " WHERE fk_propale = " . $this->id;
- if ($this->db->query($sql) )
- {
- $nump = $this->db->num_rows();
-
- if ($nump)
- {
- $i = 0;
- while ($i < $nump)
- {
- $obj = $this->db->fetch_object();
-
- $ga[$i] = $obj->fk_commande;
- $i++;
- }
- }
- return $ga;
- }
- else
- {
- dolibarr_print_error($this->db);
- }
+ $ga = array();
+
+ $sql = "SELECT fk_commande FROM ".MAIN_DB_PREFIX."co_pr";
+ $sql .= " WHERE fk_propale = " . $this->id;
+ if ($this->db->query($sql) )
+ {
+ $nump = $this->db->num_rows();
+
+ if ($nump)
+ {
+ $i = 0;
+ while ($i < $nump)
+ {
+ $obj = $this->db->fetch_object();
+
+ $ga[$i] = $obj->fk_commande;
+ $i++;
+ }
+ }
+ return $ga;
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
}
/**
- * \brief Renvoie un tableau contenant les commandes associées
- *
+ * \brief Renvoie un tableau contenant les commandes associées
+ * \remarks Fonction plus lourde que commande_liste_array
+ * \seealso commande_liste_array
*/
-
function associated_orders ()
{
$ga = array();
@@ -855,11 +859,42 @@ class Propal
}
}
- /*
- *
- *
+ /**
+ * \brief Renvoie un tableau contenant les numéros de factures associées
+ */
+ function facture_liste_array ()
+ {
+ $ga = array();
+
+ $sql = "SELECT fk_facture FROM ".MAIN_DB_PREFIX."fa_pr as fp";
+ $sql .= " WHERE fk_propal = " . $this->id;
+ if ($this->db->query($sql) )
+ {
+ $nump = $this->db->num_rows();
+
+ if ($nump)
+ {
+ $i = 0;
+ while ($i < $nump)
+ {
+ $obj = $this->db->fetch_object();
+
+ $ga[$i] = $obj->fk_facture;
+ $i++;
+ }
+ }
+ return $ga;
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
+ }
+
+ /**
+ * \brief Efface propal
+ * \param user Objet du user qui efface
*/
-
function delete($user)
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE fk_propal = $this->id ;";
@@ -904,55 +939,57 @@ class Propal
}
- /*
- * \brief Information sur l'objet
- *
- */
-
- function info($id)
+ /**
+ * \brief Information sur l'objet propal
+ * \param id id de la propale
+ */
+ function info($id)
{
- $sql = "SELECT c.rowid, ".$this->db->pdate("datec")." as datec";
- $sql .= ", fk_user_valid, fk_user_cloture, fk_user_author";
- $sql .= " FROM ".MAIN_DB_PREFIX."propal as c";
- $sql .= " WHERE c.rowid = $id";
-
- if ($this->db->query($sql))
- {
- if ($this->db->num_rows())
- {
- $obj = $this->db->fetch_object();
+ $sql = "SELECT c.rowid, ";
+ $sql.= $this->db->pdate("datec")." as datec, ".$this->db->pdate("date_valid")." as datev, ".$this->db->pdate("date_cloture")." as dateo";
+ $sql.= ", fk_user_author, fk_user_valid, fk_user_cloture";
+ $sql.= " FROM ".MAIN_DB_PREFIX."propal as c";
+ $sql.= " WHERE c.rowid = $id";
+
+ if ($this->db->query($sql))
+ {
+ if ($this->db->num_rows())
+ {
+ $obj = $this->db->fetch_object();
+
+ $this->id = $obj->rowid;
+
+ $this->date_creation = $obj->datec;
+ $this->date_validation = $obj->datev;
+ $this->date_cloture = $obj->dateo;
- $this->id = $obj->rowid;
-
- $this->date_creation = $obj->datec;
-
- $cuser = new User($this->db, $obj->fk_user_author);
- $cuser->fetch();
- $this->user_creation = $cuser;
-
- if ($obj->fk_user_valid)
- {
- $vuser = new User($this->db, $obj->fk_user_valid);
- $vuser->fetch();
- $this->user_validation = $vuser;
- }
-
- if ($obj->fk_user_cloture)
- {
- $cluser = new User($this->db, $obj->fk_user_cloture);
- $cluser->fetch();
- $this->user_cloture = $cluser;
- }
-
-
- }
- $this->db->free();
-
- }
- else
- {
- dolibarr_print_error($this->db);
- }
+ $cuser = new User($this->db, $obj->fk_user_author);
+ $cuser->fetch();
+ $this->user_creation = $cuser;
+
+ if ($obj->fk_user_valid)
+ {
+ $vuser = new User($this->db, $obj->fk_user_valid);
+ $vuser->fetch();
+ $this->user_validation = $vuser;
+ }
+
+ if ($obj->fk_user_cloture)
+ {
+ $cluser = new User($this->db, $obj->fk_user_cloture);
+ $cluser->fetch();
+ $this->user_cloture = $cluser;
+ }
+
+
+ }
+ $this->db->free();
+
+ }
+ else
+ {
+ dolibarr_print_error($this->db);
+ }
}