From 30a5111c683800123df486fee8adab8b4b681569 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 21 Feb 2015 15:18:05 +0100 Subject: [PATCH] Work on expense report module --- htdocs/compta/deplacement/card.php | 2 +- htdocs/core/class/html.formprojet.class.php | 20 ++-- .../core/modules/modExpenseReport.class.php | 39 +++++-- htdocs/expensereport/card.php | 82 +++++++------- .../class/expensereport.class.php | 103 ++++++++++-------- .../class/expensereportstats.class.php | 20 ++-- htdocs/expensereport/synchro_compta.php | 6 +- .../install/mysql/migration/3.7.0-3.8.0.sql | 24 ++-- .../mysql/tables/llx_expensereport.sql | 21 ++-- htdocs/langs/en_US/trips.lang | 5 + htdocs/projet/class/project.class.php | 4 +- htdocs/projet/element.php | 87 ++++++++++----- 12 files changed, 243 insertions(+), 170 deletions(-) diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php index bdde060f448..bd4a4555fb7 100644 --- a/htdocs/compta/deplacement/card.php +++ b/htdocs/compta/deplacement/card.php @@ -128,7 +128,7 @@ else if ($action == 'add' && $user->rights->deplacement->creer) setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Date")), 'errors'); $error++; } - if ($object->type == '-1') // Otherwise it is TF_LUNCH,... + if ($object->type == '-1') { setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")), 'errors'); $error++; diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php index 86d46f3b9b5..85c9ffbb241 100644 --- a/htdocs/core/class/html.formprojet.class.php +++ b/htdocs/core/class/html.formprojet.class.php @@ -87,7 +87,7 @@ class FormProjets if ($resql) { $minmax=''; - + // Use select2 selector $nodatarole=''; if (! empty($conf->use_javascript_ajax)) @@ -219,6 +219,11 @@ class FormProjets $sql = "SELECT id as rowid, label as ref"; $projectkey="fk_project"; break; + case "expensereport_det": + return ''; + /*$sql = "SELECT rowid, '' as ref"; // table is llx_expensereport_det + $projectkey="fk_projet"; + break;*/ default: $sql = "SELECT rowid, ref"; break; @@ -226,10 +231,8 @@ class FormProjets $sql.= " FROM ".MAIN_DB_PREFIX.$table_element; $sql.= " WHERE ".$projectkey." is null"; - if (!empty($socid)) { - $sql.= " AND fk_soc=".$socid; - } - $sql.= ' AND entity='.getEntity('project'); + if (!empty($socid)) $sql.= " AND fk_soc=".$socid; + if (! in_array($table_element, array('expensereport_det'))) $sql.= ' AND entity='.getEntity('project'); $sql.= " ORDER BY ref DESC"; dol_syslog(get_class($this).'::select_element', LOG_DEBUG); @@ -260,9 +263,12 @@ class FormProjets }*/ $this->db->free($resql); - return $sellist ; - }else { + return $sellist; + } + else + { $this->error=$this->db->lasterror(); + $this->errors[]=$this->db->lasterror(); dol_syslog(get_class($this) . "::select_element " . $this->error, LOG_ERR); return -1; } diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index edee0952b00..b5b45ea23f8 100755 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -224,8 +224,8 @@ class modExpenseReport extends DolibarrModules 'url'=>'/expensereport/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -234,12 +234,12 @@ class modExpenseReport extends DolibarrModules 'type'=>'left', // This is a Left menu entry 'titre'=>'New', 'mainmenu'=>'accountancy', - 'leftmenu'=>'expensereport_detail', + 'leftmenu'=>'expensereport_detailnew', 'url'=>'/expensereport/card.php?action=create', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->creer', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -248,12 +248,26 @@ class modExpenseReport extends DolibarrModules 'type'=>'left', // This is a Left menu entry 'titre'=>'List', 'mainmenu'=>'accountancy', - 'leftmenu'=>'expensereport_detail', + 'leftmenu'=>'expensereport_detaillist', 'url'=>'/expensereport/list.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + $r++; + + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport_detaillist', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) + 'type'=>'left', // This is a Left menu entry + 'titre'=>'ListToApprove', + 'mainmenu'=>'accountancy', + 'leftmenu'=>'expensereport_detaillist_approve', + 'url'=>'/expensereport/list.php?search_state=2', + 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>100, + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -266,13 +280,14 @@ class modExpenseReport extends DolibarrModules 'url'=>'/expensereport/stats/index.php', 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, - 'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; + // Disabled, not yet stable $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=accountancy,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) 'type'=>'left', // This is a Left menu entry 'titre'=>'ExportTripCSV', @@ -282,7 +297,7 @@ class modExpenseReport extends DolibarrModules 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; @@ -296,7 +311,7 @@ class modExpenseReport extends DolibarrModules 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>100, 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + 'perms'=>'$user->rights->expensereport->lire', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules 'target'=>'', 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both $r++; diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 871cbe22990..cfe3c86058b 100755 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -105,7 +105,7 @@ if ($action == 'add' && $user->rights->expensereport->creer) $object->fk_user_validator = GETPOST('fk_user_validator','int'); $object->note = GETPOST('note'); - if ($object->periode_existe($user,dol_print_date($object->date_debut, 'dayrfc'),dol_print_date($object->date_fin, 'dayrfc'))) + if ($object->periode_existe($user,$object->date_debut,$object->date_fin)) { $error++; setEventMessage($langs->trans("ErrorDoubleDeclaration"),'errors'); @@ -398,8 +398,8 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user { $object = new ExpenseReport($db); $object->fetch($id); - - $result = $object->set_refuse($user,GETPOST('detail_refuse')); + + $result = $object->setDeny($user,GETPOST('detail_refuse')); if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) @@ -456,34 +456,34 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user } //var_dump($user->id == $object->fk_user_validator);exit; -if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['detail_cancel']) && $id > 0 && $user->rights->expensereport->creer) +if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_cancel') && $id > 0 && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); $object->fetch($id); - + if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) { - $result = $object->set_cancel($user,$_POST['detail_cancel']); - + $result = $object->set_cancel($user,GETPOST('detail_cancel')); + if ($result > 0) { if (! empty($conf->global->DEPLACEMENT_TO_CLEAN)) { // Send mail - + // TO $destinataire = new User($db); $destinataire->fetch($object->fk_user_author); $emailTo = $destinataire->email; - + // FROM $expediteur = new User($db); $expediteur->fetch($object->fk_user_cancel); $emailFrom = $expediteur->email; - + // SUBJECT $subject = "' ERP - Note de frais annulée"; - + // CONTENT $message = "Bonjour {$destinataire->firstname},\n\n"; $message.= "Votre note de frais \"{$object->ref}\" vient d'être annulée.\n"; @@ -491,10 +491,10 @@ if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['d $message.= "- Motif d'annulation : {$_POST['detail_cancel']}\n"; $message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n"; $message.= "Bien cordialement,\n' SI"; - + // PREPARE SEND $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message); - + if(!$mailfile->error) { // SEND @@ -523,10 +523,10 @@ if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && !empty($_POST['d } } -if ($action == "confirm_paid" && $_GET['confirm']=="yes" && $id > 0 && $user->rights->expensereport->to_paid) +if ($action == "confirm_paid" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->to_paid) { $object = new ExpenseReport($db); - $object->fetch($id,$user); + $object->fetch($id); $result = $object->setPaid($user); if ($result > 0) @@ -665,7 +665,7 @@ if ($action == "addline") $vatrate=GETPOST('vatrate'); $object_ligne->fk_c_tva = $vatrate; $object_ligne->vatrate = $vatrate; - + $object_ligne->fk_projet = $fk_projet; if (! GETPOST('fk_c_type_fees') > 0) @@ -1129,22 +1129,24 @@ else if ($ret == 'html') print '
'; endif; - if ($action == 'cancel'): - $array_input = array(array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_cancel",'size'=>"50",'value'=>"")); - $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("ConfirmCancelTrip"),"","confirm_cancel",$array_input,"",0); - if ($ret == 'html') print '
'; - endif; + if ($action == 'cancel') + { + $array_input = array('text'=>$langs->trans("ConfirmCancelTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_cancel",'size'=>"50",'value'=>"")); + $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Cancel"),"","confirm_cancel",$array_input,"",1); + if ($ret == 'html') print '
'; + } if ($action == 'brouillonner'): $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("BrouillonnerTrip"),$langs->trans("ConfirmBrouillonnerTrip"),"confirm_brouillonner","","",1); if ($ret == 'html') print '
'; endif; - if ($action == 'refuse'): - $array_input = array('text'=>$langs->trans("ConfirmRefuseTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_refuse",'size'=>"50",'value'=>"")); - $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Deny"),'',"confirm_refuse",$array_input,"yes",1); - if ($ret == 'html') print '
'; - endif; + if ($action == 'refuse') // Deny + { + $array_input = array('text'=>$langs->trans("ConfirmRefuseTrip"), array('type'=>"text",'label'=>$langs->trans("Comment"),'name'=>"detail_refuse",'size'=>"50",'value'=>"")); + $ret=$form->form_confirm($_SEVER["PHP_SELF"]."?id=".$id,$langs->trans("Deny"),'',"confirm_refuse",$array_input,"yes",1); + if ($ret == 'html') print '
'; + } if ($action == 'delete_line') { @@ -1211,7 +1213,7 @@ else print ''; print ''.$langs->trans("DATE_SAVE").''; - print ''.$object->date_create.''; + print ''.dol_print_date($object->date_create,'dayhour').''; print ''; if($object->fk_c_expensereport_statuts==6) { @@ -1227,8 +1229,8 @@ else print ''.$object->date_paiement.''; print ''; } - - if($object->fk_c_expensereport_statuts<3) + + if($object->fk_c_expensereport_statuts<3) // informed { print ''; print ''.$langs->trans("VALIDATOR").''; @@ -1259,24 +1261,24 @@ else print ''; print ''; print ''.$langs->trans("DATE_CANCEL").''; - print ''.$object->date_cancel.''; + print ''.dol_print_date($object->date_cancel,'dayhour').''; print ''; } else { print ''; - print ''.$langs->trans("VALIDOR").''; + print ''.$langs->trans("Approbator").''; print ''; - if ($object->fk_user_valid > 0) + if ($object->fk_user_approve > 0) { - $userfee=new User($db); - $userfee->fetch($object->fk_user_valid); - print $userfee->getNomUrl(1); + $userapp=new User($db); + $userapp->fetch($object->fk_user_approve); + print $userapp->getNomUrl(1); } print ''; print ''; - print ''.$langs->trans("DATE_VALIDE").''; - print ''.$object->date_valide.''; + print ''.$langs->trans("DateApprove").''; + print ''.dol_print_date($object->date_approve,'dayhour').''; print ''; } @@ -1291,7 +1293,7 @@ else print ''; print ''; print ''.$langs->trans("DATE_REFUS").''; - print ''.$object->date_refuse; + print ''.dol_print_date($object->date_refuse,'dayhour'); if ($object->detail_refuse) print ' - '.$object->detail_refuse; print ''; print ''; @@ -1398,7 +1400,7 @@ else } print ''; } - + if ($action == 'editline' && $objp->rowid == GETPOST('rowid')) { //modif ligne!!!!! @@ -1681,7 +1683,7 @@ if ($action != 'create' && $action != 'edit') { print ''.$langs->trans('Cancel').''; } - + if($user->rights->expensereport->supprimer) { // Supprimer diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 76534e94c2a..40be7298a1c 100755 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -54,10 +54,14 @@ class ExpenseReport extends CommonObject var $fk_user_cancel; // Validation - var $date_valide; + var $date_valid; var $fk_user_valid; var $user_valid_infos; + // Approve + var $date_approve; + var $fk_user_approve; + // Paiement var $date_paiement; var $fk_user_paid; @@ -257,9 +261,9 @@ class ExpenseReport extends CommonObject $sql.= " d.detail_refuse, d.detail_cancel, d.fk_user_refuse, d.fk_user_cancel,"; // ACTIONS $sql.= " d.date_refuse, d.date_cancel,"; // ACTIONS $sql.= " d.total_ht, d.total_ttc, d.total_tva,"; // TOTAUX (int) - $sql.= " d.date_debut, d.date_fin, d.date_create, d.date_valide, d.date_paiement,"; // DATES (datetime) + $sql.= " d.date_debut, d.date_fin, d.date_create, d.date_valid, d.date_approve, d.date_paiement,"; // DATES (datetime) $sql.= " d.fk_user_author, d.fk_user_validator, d.fk_c_expensereport_statuts as status, d.fk_c_paiement,"; - $sql.= " d.fk_user_valid, d.fk_user_paid,"; // FOREING KEY 2 (int) + $sql.= " d.fk_user_valid, d.fk_user_approve, d.fk_user_paid,"; $sql.= " dp.libelle as libelle_paiement, dp.code as code_paiement"; // INNER JOIN paiement $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element." d LEFT JOIN ".MAIN_DB_PREFIX."c_paiement dp ON d.fk_c_paiement = dp.id"; if ($ref) $sql.= " WHERE d.ref = '".$this->db->escape($ref)."'"; @@ -282,20 +286,22 @@ class ExpenseReport extends CommonObject $this->detail_refuse = $obj->detail_refuse; $this->detail_cancel = $obj->detail_cancel; - $this->date_debut = $obj->date_debut; - $this->date_fin = $obj->date_fin; - $this->date_paiement = $obj->date_paiement; - $this->date_valide = $obj->date_valide; - $this->date_create = $obj->date_create; - $this->date_refuse = $obj->date_refuse; - $this->date_cancel = $obj->date_cancel; + $this->date_debut = $this->db->jdate($obj->date_debut); + $this->date_fin = $this->db->jdate($obj->date_fin); + $this->date_paiement = $this->db->jdate($obj->date_paiement); + $this->date_valid = $this->db->jdate($obj->date_valid); + $this->date_approve = $this->db->jdate($obj->date_approve); + $this->date_create = $this->db->jdate($obj->date_create); + $this->date_refuse = $this->db->jdate($obj->date_refuse); + $this->date_cancel = $this->db->jdate($obj->date_cancel); $this->fk_user_author = $obj->fk_user_author; $this->fk_user_validator = $obj->fk_user_validator; $this->fk_user_valid = $obj->fk_user_valid; - $this->fk_user_paid = $obj->fk_user_paid; $this->fk_user_refuse = $obj->fk_user_refuse; $this->fk_user_cancel = $obj->fk_user_cancel; + $this->fk_user_approve = $obj->fk_user_approve; + $this->fk_user_paid = $obj->fk_user_paid; $user_author = new User($this->db); if ($this->fk_user_author > 0) $user_author->fetch($this->fk_user_author); @@ -404,10 +410,12 @@ class ExpenseReport extends CommonObject $sql = "SELECT f.rowid,"; $sql.= " f.date_create as datec,"; $sql.= " f.tms as date_modification,"; - $sql.= " f.date_valide as datev,"; - $sql.= " f.fk_user_author,"; + $sql.= " f.date_valid as datev,"; + $sql.= " f.date_approve as datea,"; + $sql.= " f.fk_user_author as fk_user_creation,"; $sql.= " f.fk_user_modif as fk_user_modification,"; - $sql.= " f.fk_user_validator"; + $sql.= " f.fk_user_valid,"; + $sql.= " f.fk_user_approve"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as f"; $sql.= " WHERE f.rowid = ".$id; $sql.= " AND f.entity = ".$conf->entity; @@ -424,11 +432,18 @@ class ExpenseReport extends CommonObject $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = $this->db->jdate($obj->date_modification); $this->date_validation = $this->db->jdate($obj->datev); + $this->date_approbation = $this->db->jdate($obj->datea); $cuser = new User($this->db); $cuser->fetch($obj->fk_user_author); $this->user_creation = $cuser; + if ($obj->fk_user_creation) + { + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_creation); + $this->user_creation = $cuser; + } if ($obj->fk_user_valid) { $vuser = new User($this->db); @@ -739,14 +754,14 @@ class ExpenseReport extends CommonObject $sql.= ' WHERE rowid = '.$this->id; $result = $this->db->query($sql); $objp = $this->db->fetch_object($result); - $this->date_debut = $objp->date_debut; - $expld_date_debut = explode("-",$this->date_debut); - $this->date_debut = $expld_date_debut[0].$expld_date_debut[1].$expld_date_debut[2]; + $this->date_debut = $this->db->jdate($objp->date_debut); // Création du ref_number suivant if($ref_next) { - $this->ref = strtoupper($user->login).$expld_car."NDF".$this->ref.$expld_car.$this->date_debut; + $prefix="ER"; + if (! empty($conf->global->EXPENSE_REPORT_PREFIX)) $prefix=$conf->global->EXPENSE_REPORT_PREFIX; + $this->ref = strtoupper($user->login).$expld_car.$prefix.$this->ref.$expld_car.dol_print_date($this->date_debut,'%y%m%d'); } if ($this->fk_c_expensereport_statuts != 2) @@ -793,9 +808,7 @@ class ExpenseReport extends CommonObject $objp = $this->db->fetch_object($result); - $this->date_debut = $objp->date_debut; - $expld_date_debut = explode("-",$this->date_debut); - $this->date_debut = $expld_date_debut[0].$expld_date_debut[1].$expld_date_debut[2]; + $this->date_debut = $this->db->jdate($objp->date_debut); if ($this->fk_c_expensereport_statuts != 2) { @@ -829,13 +842,15 @@ class ExpenseReport extends CommonObject */ function setApproved($user) { - // date de validation - $this->date_valide = $this->db->idate(gmmktime()); + $now=dol_now(); + + // date approval + $this->date_approve = $this->db->idate($now); if ($this->fk_c_expensereport_statuts != 5) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 5, fk_user_approve = ".$user->id.","; - $sql.= " date_valide='".$this->date_valide."'"; + $sql.= " date_approve='".$this->date_approve."'"; $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql)) { @@ -854,15 +869,15 @@ class ExpenseReport extends CommonObject } /** - * set_refuse + * setDeny * * @param User $user User * @param Details $details Details */ - function set_refuse($user,$details) + function setDeny($user,$details) { $now = dol_now(); - + // date de refus if ($this->fk_c_expensereport_statuts != 99) { @@ -870,6 +885,7 @@ class ExpenseReport extends CommonObject $sql.= " SET ref = '".$this->ref."', fk_c_expensereport_statuts = 99, fk_user_refuse = ".$user->id.","; $sql.= " date_refuse='".$this->db->idate($now)."',"; $sql.= " detail_refuse='".$this->db->escape($details)."'"; + $sql.= " fk_user_approve=NULL,"; $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql)) { @@ -887,7 +903,7 @@ class ExpenseReport extends CommonObject } else { - dol_syslog(get_class($this)."::set_refuse expensereport already with refuse status", LOG_WARNING); + dol_syslog(get_class($this)."::setDeny expensereport already with refuse status", LOG_WARNING); } } @@ -899,16 +915,17 @@ class ExpenseReport extends CommonObject */ function setPaid($user) { - $this->date_paiement = $this->db->idate(gmmktime()); + $now= dol_now(); + + $this->date_paiement = $this->db->idate($now); if ($this->fk_c_expensereport_statuts != 6) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET fk_c_expensereport_statuts = 6, fk_user_paid = ".$user->id.","; - $sql.= " date_paiement='".$this->date_paiement."'"; + $sql.= " date_paiement='".$this->db->idate($this->date_paiement)."'"; $sql.= ' WHERE rowid = '.$this->id; dol_syslog(get_class($this)."::setPaid sql=".$sql, LOG_DEBUG); - if ($this->db->query($sql)) { return 1; @@ -1236,9 +1253,9 @@ class ExpenseReport extends CommonObject * @param Date $date_fin End date * @return int <0 if KO, >0 if OK */ - function periode_existe($user,$date_debut,$date_fin) + function periode_existe($user, $date_debut, $date_fin) { - $sql = "SELECT rowid,date_debut,date_fin"; + $sql = "SELECT rowid, date_debut, date_fin"; $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element; $sql.= " WHERE fk_user_author = '{$user->id}'"; @@ -1250,10 +1267,8 @@ class ExpenseReport extends CommonObject if ($num_lignes>0) { - $date_d_form = explode("-",$date_debut); // 1 - $date_f_form = explode("-",$date_fin); // 2 - $date_d_form = mktime(12,0,0,$date_d_form[1],$date_d_form[2],$date_d_form[0]); - $date_f_form = mktime(12,0,0,$date_f_form[1],$date_f_form[2],$date_f_form[0]); + $date_d_form = $date_debut; + $date_f_form = $date_fin; $existe = false; @@ -1261,12 +1276,10 @@ class ExpenseReport extends CommonObject { $objp = $this->db->fetch_object($result); - $date_d_req = explode("-",$objp->date_debut); // 3 - $date_f_req = explode("-",$objp->date_fin); // 4 - $date_d_req = mktime(12,0,0,$date_d_req[1],$date_d_req[2],$date_d_req[0]); - $date_f_req = mktime(12,0,0,$date_f_req[1],$date_f_req[2],$date_f_req[0]); + $date_d_req = $this->db->jdate($objp->date_debut); // 3 + $date_f_req = $this->db->jdate($objp->date_fin); // 4 - if(!($date_f_form < $date_d_req OR $date_d_form > $date_f_req)) $existe = true; + if (!($date_f_form < $date_d_req || $date_d_form > $date_f_req)) $existe = true; $i++; } @@ -1374,14 +1387,12 @@ class ExpenseReportLine function fetch($rowid) { $sql = 'SELECT fde.rowid, fde.fk_expensereport, fde.fk_c_type_fees, fde.fk_projet, fde.date,'; - $sql.= ' fde.fk_c_tva, fde.comments, fde.qty, fde.value_unit, fde.total_ht, fde.total_tva, fde.total_ttc,'; + $sql.= ' fde.fk_c_tva as tva_taux, fde.comments, fde.qty, fde.value_unit, fde.total_ht, fde.total_tva, fde.total_ttc,'; $sql.= ' ctf.code as type_fees_code, ctf.label as type_fees_libelle,'; - $sql.= ' pjt.rowid as projet_id, pjt.title as projet_title, pjt.ref as projet_ref,'; - $sql.= ' tva.rowid as tva_id, tva.taux as tva_taux'; + $sql.= ' pjt.rowid as projet_id, pjt.title as projet_title, pjt.ref as projet_ref'; $sql.= ' FROM '.MAIN_DB_PREFIX.'expensereport_det fde'; $sql.= ' INNER JOIN '.MAIN_DB_PREFIX.'c_type_fees ctf ON fde.fk_c_type_fees=ctf.id'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'projet pjt ON fde.fk_projet=pjt.rowid'; - $sql.= ' INNER JOIN '.MAIN_DB_PREFIX.'c_tva tva ON fde.fk_c_tva=tva.rowid'; $sql.= ' WHERE fde.rowid = '.$rowid; $result = $this->db->query($sql); diff --git a/htdocs/expensereport/class/expensereportstats.class.php b/htdocs/expensereport/class/expensereportstats.class.php index 64d0aaf01ed..e12b4ed2a79 100644 --- a/htdocs/expensereport/class/expensereportstats.class.php +++ b/htdocs/expensereport/class/expensereportstats.class.php @@ -59,7 +59,7 @@ class ExpenseReportStats extends Stats $this->from = MAIN_DB_PREFIX.$object->table_element; $this->field='total_ht'; - $this->where = " fk_c_expensereport_statuts > 0 and date_valide > '2000-01-01'"; + $this->where = " fk_c_expensereport_statuts > 0 and date_valid > '2000-01-01'"; //$this->where.= " AND entity = ".$conf->entity; if ($this->socid) { @@ -70,13 +70,13 @@ class ExpenseReportStats extends Stats /** - * Renvoie le nombre de facture par annee + * Return nb of expense report per year * * @return array Array of values */ function getNbByYear() { - $sql = "SELECT YEAR(date_valide) as dm, count(*)"; + $sql = "SELECT YEAR(date_valid) as dm, count(*)"; $sql.= " FROM ".$this->from; $sql.= " GROUP BY dm DESC"; $sql.= " WHERE ".$this->where; @@ -93,9 +93,9 @@ class ExpenseReportStats extends Stats */ function getNbByMonth($year) { - $sql = "SELECT MONTH(date_valide) as dm, count(*)"; + $sql = "SELECT MONTH(date_valid) as dm, count(*)"; $sql.= " FROM ".$this->from; - $sql.= " WHERE YEAR(date_valide) = ".$year; + $sql.= " WHERE YEAR(date_valid) = ".$year; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -114,9 +114,9 @@ class ExpenseReportStats extends Stats */ function getAmountByMonth($year) { - $sql = "SELECT date_format(date_valide,'%m') as dm, sum(".$this->field.")"; + $sql = "SELECT date_format(date_valid,'%m') as dm, sum(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(date_valide,'%Y') = '".$year."'"; + $sql.= " WHERE date_format(date_valid,'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -134,9 +134,9 @@ class ExpenseReportStats extends Stats */ function getAverageByMonth($year) { - $sql = "SELECT date_format(date_valide,'%m') as dm, avg(".$this->field.")"; + $sql = "SELECT date_format(date_valid,'%m') as dm, avg(".$this->field.")"; $sql.= " FROM ".$this->from; - $sql.= " WHERE date_format(date_valide,'%Y') = '".$year."'"; + $sql.= " WHERE date_format(date_valid,'%Y') = '".$year."'"; $sql.= " AND ".$this->where; $sql.= " GROUP BY dm"; $sql.= $this->db->order('dm','DESC'); @@ -151,7 +151,7 @@ class ExpenseReportStats extends Stats */ function getAllByYear() { - $sql = "SELECT date_format(date_valide,'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; + $sql = "SELECT date_format(date_valid,'%Y') as year, count(*) as nb, sum(".$this->field.") as total, avg(".$this->field.") as avg"; $sql.= " FROM ".$this->from; $sql.= " WHERE ".$this->where; $sql.= " GROUP BY year"; diff --git a/htdocs/expensereport/synchro_compta.php b/htdocs/expensereport/synchro_compta.php index 211f5c4cc0a..11c91d314fb 100755 --- a/htdocs/expensereport/synchro_compta.php +++ b/htdocs/expensereport/synchro_compta.php @@ -137,12 +137,12 @@ else: print ' '; print ""; - $sql = "SELECT d.fk_bank_account, d.ref, d.rowid, d.date_valide, d.fk_user_author, d.total_ttc, d.integration_compta, d.fk_c_expensereport_statuts"; + $sql = "SELECT d.fk_bank_account, d.ref, d.rowid, d.date_valid, d.fk_user_author, d.total_ttc, d.integration_compta, d.fk_c_expensereport_statuts"; $sql.= " ,CONCAT(u.firstname,' ',u.lastname) as declarant_NDF"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport d"; $sql.= " INNER JOIN ".MAIN_DB_PREFIX."user u ON d.fk_user_author = u.rowid"; $sql.= " WHERE d.fk_c_expensereport_statuts = 6"; - $sql.= " ORDER BY d.date_valide DESC"; + $sql.= " ORDER BY d.date_valid DESC"; $resql=$db->query($sql); if ($resql): @@ -170,7 +170,7 @@ else: $var=!$var; print ""; print ''.$objp->ref.''; - print ''.dol_print_date($db->jdate($objp->date_valide),'day').''; + print ''.dol_print_date($db->jdate($objp->date_valid),'day').''; print ''.img_object($langs->trans("ShowUser"),"user").' '.$objp->declarant_NDF.''; print ''.$objp->total_ttc.' '.$langs->trans("EURO").''; diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index a697096874a..13c948bea56 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -118,10 +118,9 @@ ALTER TABLE llx_stock_mouvement ADD COLUMN sellby date DEFAULT NULL; - CREATE TABLE llx_expensereport ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, - ref varchar(50) NOT NULL, + ref varchar(50) NOT NULL, entity integer DEFAULT 1 NOT NULL, -- multi company id ref_number_int integer DEFAULT NULL, ref_ext integer, @@ -132,30 +131,33 @@ CREATE TABLE llx_expensereport ( total_ttc double(24,8) DEFAULT 0, date_debut date NOT NULL, date_fin date NOT NULL, - date_paiement datetime, - date_valide datetime, date_create datetime NOT NULL, + date_valid datetime, + date_approve datetime, + date_refuse datetime, + date_cancel datetime, + date_paiement datetime, tms timestamp, fk_user_author integer NOT NULL, fk_user_modif integer DEFAULT NULL, + fk_user_valid integer DEFAULT NULL, fk_user_validator integer DEFAULT NULL, + fk_user_approve integer DEFAULT NULL, + fk_user_refuse integer DEFAULT NULL, + fk_user_cancel integer DEFAULT NULL, + fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, note text, note_private text, - fk_user_valid integer DEFAULT NULL, - fk_user_paid integer DEFAULT NULL, detail_refuse varchar(255) DEFAULT NULL, - date_cancel datetime, - date_refuse datetime, detail_cancel varchar(255) DEFAULT NULL, - fk_user_cancel integer DEFAULT NULL, - fk_user_refuse integer DEFAULT NULL, - integration_compta integer DEFAULT NULL, + integration_compta integer DEFAULT NULL, -- not used fk_bank_account integer DEFAULT NULL, model_pdf varchar(50) DEFAULT NULL ) ENGINE=innodb; + CREATE TABLE llx_expensereport_det ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, diff --git a/htdocs/install/mysql/tables/llx_expensereport.sql b/htdocs/install/mysql/tables/llx_expensereport.sql index 5fd3d2a3998..7224ec38b61 100755 --- a/htdocs/install/mysql/tables/llx_expensereport.sql +++ b/htdocs/install/mysql/tables/llx_expensereport.sql @@ -29,27 +29,28 @@ CREATE TABLE llx_expensereport ( total_ttc double(24,8) DEFAULT 0, date_debut date NOT NULL, date_fin date NOT NULL, - date_paiement datetime, - date_valide datetime, date_create datetime NOT NULL, + date_valid datetime, + date_approve datetime, + date_refuse datetime, + date_cancel datetime, + date_paiement datetime, tms timestamp, fk_user_author integer NOT NULL, fk_user_modif integer DEFAULT NULL, + fk_user_valid integer DEFAULT NULL, fk_user_validator integer DEFAULT NULL, + fk_user_approve integer DEFAULT NULL, + fk_user_refuse integer DEFAULT NULL, + fk_user_cancel integer DEFAULT NULL, + fk_user_paid integer DEFAULT NULL, fk_c_expensereport_statuts integer NOT NULL, -- 1=brouillon, 2=validé (attente approb), 4=annulé, 5=approuvé, 6=payed, 99=refusé fk_c_paiement integer DEFAULT NULL, note text, note_private text, - fk_user_valid integer DEFAULT NULL, - fk_user_approve integer DEFAULT NULL, - fk_user_paid integer DEFAULT NULL, detail_refuse varchar(255) DEFAULT NULL, - date_cancel datetime, - date_refuse datetime, detail_cancel varchar(255) DEFAULT NULL, - fk_user_cancel integer DEFAULT NULL, - fk_user_refuse integer DEFAULT NULL, - integration_compta integer DEFAULT NULL, + integration_compta integer DEFAULT NULL, -- not used fk_bank_account integer DEFAULT NULL, model_pdf varchar(50) DEFAULT NULL ) ENGINE=innodb; diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index b5e950b6a0c..c31b902805e 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -1,4 +1,6 @@ # Dolibarr language file - Source file is en_US - trips +ExpenseReport=Expense report +ExpenseReports=Expense reports Trip=Expense report Trips=Expense reports TripsAndExpenses=Expenses reports @@ -14,6 +16,7 @@ FeesKilometersOrAmout=Amount or kilometers DeleteTrip=Delete expense report ConfirmDeleteTrip=Are you sure you want to delete this expense report ? ListTripsAndExpenses=List of expense reports +ListToApprove=Waiting for approval ExpensesArea=Expense reports area SearchATripAndExpense=Search an expense report ClassifyRefunded=Classify 'Refunded' @@ -28,10 +31,12 @@ DeleteLine=Delete a ligne of the expense report ConfirmDeleteLine=Are you sure you want to delete this line ? TF_OTHER=Other +TF_TRANSPORTATION=Transportation TF_LUNCH=Lunch TF_METRO=Metro TF_TRAIN=Train TF_BUS=Bus +TF_CAR=Car TF_PEAGE=Toll TF_ESSENCE=Fuel TF_HOTEL=Hostel diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 0b80c7b9cd7..d73187ce822 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -421,7 +421,7 @@ class Project extends CommonObject } if ($type == 'expensereport') { - $sql = "SELECT e.rowid FROM " . MAIN_DB_PREFIX . "expensereport as e, " . MAIN_DB_PREFIX . "expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND ed.fk_projet=" . $this->id; + $sql = "SELECT ed.rowid FROM " . MAIN_DB_PREFIX . "expensereport as e, " . MAIN_DB_PREFIX . "expensereport_det as ed WHERE e.rowid = ed.fk_expensereport AND ed.fk_projet=" . $this->id; } if ($dates > 0) { @@ -511,7 +511,7 @@ class Project extends CommonObject break; } } - + // Delete tasks if (! $error) { diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 226f4afb573..68978cc671f 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -44,11 +44,12 @@ if (! empty($conf->agenda->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/ $langs->load("projects"); $langs->load("companies"); $langs->load("suppliers"); -if (! empty($conf->facture->enabled)) $langs->load("bills"); -if (! empty($conf->commande->enabled)) $langs->load("orders"); -if (! empty($conf->propal->enabled)) $langs->load("propal"); -if (! empty($conf->ficheinter->enabled)) $langs->load("interventions"); -if (! empty($conf->deplacement->enabled)) $langs->load("trips"); +if (! empty($conf->facture->enabled)) $langs->load("bills"); +if (! empty($conf->commande->enabled)) $langs->load("orders"); +if (! empty($conf->propal->enabled)) $langs->load("propal"); +if (! empty($conf->ficheinter->enabled)) $langs->load("interventions"); +if (! empty($conf->deplacement->enabled)) $langs->load("trips"); +if (! empty($conf->expensereport->enabled)) $langs->load("trips"); $projectid=GETPOST('id','int'); $ref=GETPOST('ref','alpha'); @@ -237,10 +238,10 @@ $listofreferent=array( 'name'=>"ExpenseReports", 'title'=>"ListExpenseReportsAssociatedProject", 'class'=>'ExpenseReportLine', - 'table'=>'expensereport', + 'table'=>'expensereport_det', 'datefieldname'=>'date', 'margin'=>'minus', - 'disableamount'=>1, + 'disableamount'=>0, 'test'=>$conf->expensereport->enabled && $user->rights->expensereport->lire), 'agenda'=>array( 'name'=>"Agenda", @@ -311,10 +312,12 @@ foreach ($listofreferent as $key => $value) print_titre($langs->trans($title)); $selectList=$formproject->select_element($tablename,$project->thirdparty->id); - - if (!$selectList || ($selectList<0)) { - setEventMessage($formproject->error,'errors'); - } else { + if (! $selectList || ($selectList<0)) + { + setEventMessages($formproject->error,$formproject->errors,'errors'); + } + else + { print '
'; print ''; print ''; @@ -329,9 +332,14 @@ foreach ($listofreferent as $key => $value) print ''; print ''; - print ''; + print ''; + print ''; print ''; - print ''; + // Thirdparty or user + print ''; if (empty($value['disableamount'])) print ''; else print ''; if (empty($value['disableamount'])) print ''; @@ -360,7 +368,17 @@ foreach ($listofreferent as $key => $value) for ($i = 0; $i < $num; $i++) { $element->fetch($elementarray[$i]); - $element->fetch_thirdparty(); + + if ($tablename != 'expensereport_det') + { + $element->fetch_thirdparty(); + } + else + { + $expensereport=new ExpenseReport($db); + $expensereport->fetch($element->fk_expensereport); + } + //print $classname; if ($breakline && $saved_third_id != $element->thirdparty->id) @@ -384,12 +402,17 @@ foreach ($listofreferent as $key => $value) $var=!$var; print ""; - print '\n"; // Ref print '\n"; // Date @@ -403,9 +426,15 @@ foreach ($listofreferent as $key => $value) } print ''; - // Third party + // Third party or user print ''; // Amount without tax @@ -431,7 +460,10 @@ foreach ($listofreferent as $key => $value) else print ''; // Status - print ''; + print ''; print ''; @@ -520,13 +552,15 @@ foreach ($listofreferent as $key => $value) } } -// Profit for all project + +// Show profit summary for whole project + $langs->load("suppliers"); $langs->load("bills"); $langs->load("orders"); $langs->load("proposals"); $langs->load("margins"); -print_fiche_titre($langs->trans("Profit"),'',''); +print_fiche_titre($langs->trans("Profit"),''); print '
'.$langs->trans("Ref").''.$langs->trans("Ref").''.$langs->trans("Date").''.$langs->trans("ThirdParty").''; + if ($tablename == 'expensereport_det') print $langs->trans("User"); + else print $langs->trans("ThirdParty"); + print ''.$langs->trans("AmountHT").''.$langs->trans("AmountTTC").'
'; + print ''; print '' . img_picto($langs->trans('Unlink'), 'editdelete') . ''; print "'; - print $element->getNomUrl(1); + + if ($tablename == 'expensereport_det') + { + print $expensereport->getNomUrl(1); + } + else print $element->getNomUrl(1); print "'.dol_print_date($date,'day').''; if (is_object($element->thirdparty)) print $element->thirdparty->getNomUrl(1,'',48); + else if ($tablename == 'expensereport_det') + { + $tmpuser=new User($db); + $tmpuser->fetch($expensereport->fk_user_author); + print $tmpuser->getNomUrl(1,'',48); + } print ''.$element->getLibStatut(5).''; + if ($tablename == 'expensereport_det') print $expensereport->getLibStatut(5); + else print $element->getLibStatut(5); + print '
'; print ''; print ''; @@ -543,7 +577,7 @@ foreach ($listofreferent as $key => $value) $tablename=$value['table']; $qualified=$value['test']; $margin = $value['margin']; - if (isset($margin)) + if ($qualified && isset($margin)) // If this element must be included into profit calculation ($margin is 'minus' or 'plus') { $element = new $classname($db); @@ -557,13 +591,10 @@ foreach ($listofreferent as $key => $value) for ($i = 0; $i < $num; $i++) { $element->fetch($elementarray[$i]); - $element->fetch_thirdparty(); - //print $classname; - if ($qualified) - { - $total_ht = $total_ht + $element->total_ht; - $total_ttc = $total_ttc + $element->total_ttc; - } + if ($tablename != 'expensereport_det') $element->fetch_thirdparty(); + + $total_ht = $total_ht + $element->total_ht; + $total_ttc = $total_ttc + $element->total_ttc; } print '';
'.$langs->trans("Element").'