diff --git a/htdocs/comm/addpropal.php b/htdocs/comm/addpropal.php index b92cd4d185d..d48b3a9b59d 100644 --- a/htdocs/comm/addpropal.php +++ b/htdocs/comm/addpropal.php @@ -204,7 +204,36 @@ if ($_GET["action"] == 'create') $model=new ModelePDFPropales(); $liste=$model->liste_modeles($db); $form->select_array("model",$liste,$conf->global->PROPALE_ADDON_PDF); - print ""; + print ""; + + /* + * Combobox pour la fonction de copie + */ + print ' Copier Propal depuis'; + $liste_propal = array(); + $liste_propal[0] = ''; + $sql ="SELECT p.rowid as id, CONCAT(p.ref, '-', s.nom) as lib"; + $sql.=" FROM ".MAIN_DB_PREFIX."propal p, ".MAIN_DB_PREFIX."societe s"; + $sql.=" WHERE s.idp = p.fk_soc AND fk_statut = 1 ORDER BY Id"; + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $i = 0; + while ($i < $num) + { + $row = $db->fetch_row($resql); + $liste_propal[$row[0]]=$row[1]; + $i++; + } + $form->select_array("copie_propal",$liste_propal, 0); + } + else + { + print ''; + } + print ""; + print ""; print '
'; diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 64882eee6a9..b4978534508 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -119,39 +119,68 @@ if ($_POST['action'] == 'setdate_livraison') if ($_POST['action'] == 'add') { $propal = new Propal($db, $_GET['socidp']); - $propal->datep = mktime(12, 1, 1, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); - $propal->date_livraison = $_POST['liv_year']."-".$_POST['liv_month']."-".$_POST['liv_day']; - $propal->duree_validite = $_POST['duree_validite']; - $propal->cond_reglement_id = $_POST['cond_reglement_id']; - $propal->mode_reglement_id = $_POST['mode_reglement_id']; - - $propal->contactid = $_POST['contactidp']; - $propal->projetidp = $_POST['projetidp']; - $propal->modelpdf = $_POST['model']; - $propal->author = $user->id; - $propal->note = $_POST['note']; - - $propal->ref = $_POST['ref']; - - for ($i = 1 ; $i <= PROPALE_NEW_FORM_NB_PRODUCT ; $i++) + + /* + * Si on seléctionné une propal à copier, on réalise la copie + */ + if($_POST['copie_propal']) { - if ($_POST['idprod'.$i]) - { - $xid = 'idprod'.$i; - $xqty = 'qty'.$i; - $xremise = 'remise'.$i; - $propal->add_product($_POST[$xid],$_POST[$xqty],$_POST[$xremise]); - } + if($propal->copie_from($_POST['copie_propal']) == -1) + { + //$msg = '
'.$langs->trans('ErrorMailRecipientIsEmpty').' !
'; + $msg = '
Impossible de copier la propal Id = ' . $_POST['copie_propal'] . '!
'; + } + $propal->datep = mktime(12, 1, 1, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); + $propal->date_livraison = $_POST['liv_year']."-".$_POST['liv_month']."-".$_POST['liv_day']; + $propal->duree_validite = $_POST['duree_validite']; + $propal->cond_reglement_id = $_POST['cond_reglement_id']; + $propal->mode_reglement_id = $_POST['mode_reglement_id']; + $propal->contactid = $_POST['contactidp']; + $propal->projetidp = $_POST['projetidp']; + $propal->modelpdf = $_POST['model']; + $propal->author = $user->id; + $propal->note = $_POST['note']; + $propal->ref = $_POST['ref']; + $propal->statut = 0; + + $id = $propal->create_from(); + } + else + { + $propal->datep = mktime(12, 1, 1, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); + $propal->date_livraison = $_POST['liv_year']."-".$_POST['liv_month']."-".$_POST['liv_day']; + $propal->duree_validite = $_POST['duree_validite']; + $propal->cond_reglement_id = $_POST['cond_reglement_id']; + $propal->mode_reglement_id = $_POST['mode_reglement_id']; + + $propal->contactid = $_POST['contactidp']; + $propal->projetidp = $_POST['projetidp']; + $propal->modelpdf = $_POST['model']; + $propal->author = $user->id; + $propal->note = $_POST['note']; + + $propal->ref = $_POST['ref']; + + for ($i = 1 ; $i <= PROPALE_NEW_FORM_NB_PRODUCT ; $i++) + { + if ($_POST['idprod'.$i]) + { + $xid = 'idprod'.$i; + $xqty = 'qty'.$i; + $xremise = 'remise'.$i; + $propal->add_product($_POST[$xid],$_POST[$xqty],$_POST[$xremise]); + } + } + + $id = $propal->create(); } - - $id = $propal->create(); - /* * Generation */ if ($id > 0) { propale_pdf_create($db, $id, $_POST['model']); + Header ('Location: propal.php?propalid='.$id); exit; } diff --git a/htdocs/propal.class.php b/htdocs/propal.class.php index 997ac72922b..48aaab35d55 100644 --- a/htdocs/propal.class.php +++ b/htdocs/propal.class.php @@ -150,7 +150,7 @@ class Propal if ($idproduct) { - $prod = new Product($this->db, $idproduct); + $prod = new Product($this->db, $idproduct); if ($prod->fetch($idproduct) > 0) { $p_product_desc = $prod->description; @@ -1480,7 +1480,135 @@ class Propal return -1; } } + + /** + * \brief Copie un objet propal dont l'id est passé en premier argument dans l'objet courant, en mémoire + * \param $src_propal_id Id de la propal à copier + * \return int >0 si ok, <0 si ko + * \see fetch + */ + function copie_from($src_propal_id) + { + $src_propal = new Propal($this->db); + if($src_propal->fetch($src_propal_id) < 0) + { + dolibarr_syslog("Propal::Copie_from Erreur de lecture de la propal source."); + return -1; + } + $this->datep = $src_propal->datep; + $this->fin_validite = $src_propal->fin_validite; + $this->date = $src_propal->date; + $this->ref = $src_propal->ref; + $this->price = $src_propal->price; + $this->remise = $src_propal->remise; + $this->remise_percent = $src_propal->remise_percent; + $this->total = $src_propal->total; + $this->total_ht = $src_propal->total_ht; + $this->total_tva = $src_propal->total_tva; + $this->total_ttc = $src_propal->total_ttc; + $this->socidp = $src_propal->socidp; + $this->soc_id = $src_propal->soc_id; + $this->projetidp = $src_propal->projetidp; + $this->contactid = $src_propal->contactid; + $this->modelpdf = $src_propal->modelpdf; + $this->note = $src_propal->note; + $this->note_public = $src_propal->note_public; + $this->statut = $src_propal->statut; + $this->statut_libelle = $src_propal->statut_libelle; + $this->cond_reglement_id = $src_propal->cond_reglement_id; + $this->mode_reglement_id = $src_propal->mode_reglement_id; + $this->date_livraison = $src_propal->date_livraison; + $this->user_author_id = $src_propal->user_author_id; + + $this->cond_reglement = $src_propal->cond_reglement; + $this->cond_reglement_code=$src_propal->cond_reglement_code; + $this->ref_url = $src_propal->ref_url; + $this->lignes = $src_propal->lignes; + return 1; + } + /** + * \brief Insert en base un objet propal complétement définie par ses données membres (resultant d'une copie par exemple). + * \return int l'id du nouvel objet propal en base si ok, <0 si ko + * \see create + */ + function create_from() + { + + $this->db->begin(); + + $this->fin_validite = $this->datep + ($this->duree_validite * 24 * 3600); + // Insertion dans la base + $sql = "INSERT INTO ".MAIN_DB_PREFIX."propal (fk_soc, fk_soc_contact, price, remise, tva, total, datep, datec, ref, fk_user_author, note, note_public, model_pdf, fin_validite, fk_cond_reglement, fk_mode_reglement, date_livraison) "; + $sql.= " VALUES ($this->socidp, $this->contactid, 0, $this->remise, 0,0,".$this->db->idate($this->datep).", now(), '$this->ref', $this->author,"; + $sql.= "'".addslashes($this->note)."',"; + $sql.= "'".addslashes($this->note_public)."',"; + $sql.= "'$this->modelpdf',".$this->db->idate($this->fin_validite).","; + $sql.= " $this->cond_reglement_id, $this->mode_reglement_id, '".$this->date_livraison."')"; + + $resql=$this->db->query($sql); + if ($resql) + { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."propal"); + + if ($this->id) + { + /* + * Insertion du detail des produits dans la base + */ + foreach($this->lignes as $ligne) + { + if($ligne->product_id != 0) + { + $result=$this->insert_product($ligne->product_id, + $ligne->qty, + $ligne->remise_percent, $ligne->product_desc); + } + else + { + $this->insert_product_generic($ligne->desc, $ligne->price, + $ligne->qty, $ligne->tva_tx, $ligne->remise_percent); + } + } + + // Affectation au projet + if ($this->projetidp) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."propal SET fk_projet=$this->projetidp WHERE ref='$this->ref'"; + $result=$this->db->query($sql); + } + + $resql=$this->update_price(); + if ($resql) + { + // Appel des triggers + include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php"); + $interface=new Interfaces($this->db); + $result=$interface->run_triggers('PROPAL_CREATE',$this,$user,$langs,$conf); + // Fin appel triggers + + $this->db->commit(); + return $this->id; + } + else + { + $this->error=$this->db->error(); + dolibarr_syslog("Propal::Create -2 ".$this->error); + $this->db->rollback(); + return -2; + } + } + } + else + { + $this->error=$this->db->error(); + dolibarr_syslog("Propal::Create -1 ".$this->error); + $this->db->rollback(); + return -1; + } + + return $this->id; + } }