Work on expense report module

This commit is contained in:
Laurent Destailleur 2015-02-21 15:18:05 +01:00
parent 5dffe4b440
commit 30a5111c68
12 changed files with 243 additions and 170 deletions

View File

@ -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++;

View File

@ -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;
}

View File

@ -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++;

View File

@ -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 '<br>';
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 '<br>';
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 '<br>';
}
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 '<br>';
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 '<br>';
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 '<br>';
}
if ($action == 'delete_line')
{
@ -1211,7 +1213,7 @@ else
print '<tr>';
print '<td>'.$langs->trans("DATE_SAVE").'</td>';
print '<td>'.$object->date_create.'</td></tr>';
print '<td>'.dol_print_date($object->date_create,'dayhour').'</td></tr>';
print '</tr>';
if($object->fk_c_expensereport_statuts==6)
{
@ -1227,8 +1229,8 @@ else
print '<td>'.$object->date_paiement.'</td></tr>';
print '</tr>';
}
if($object->fk_c_expensereport_statuts<3)
if($object->fk_c_expensereport_statuts<3) // informed
{
print '<tr>';
print '<td>'.$langs->trans("VALIDATOR").'</td>';
@ -1259,24 +1261,24 @@ else
print '</tr>';
print '<tr>';
print '<td>'.$langs->trans("DATE_CANCEL").'</td>';
print '<td>'.$object->date_cancel.'</td></tr>';
print '<td>'.dol_print_date($object->date_cancel,'dayhour').'</td></tr>';
print '</tr>';
}
else
{
print '<tr>';
print '<td>'.$langs->trans("VALIDOR").'</td>';
print '<td>'.$langs->trans("Approbator").'</td>';
print '<td>';
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 '</td></tr>';
print '<tr>';
print '<td>'.$langs->trans("DATE_VALIDE").'</td>';
print '<td>'.$object->date_valide.'</td></tr>';
print '<td>'.$langs->trans("DateApprove").'</td>';
print '<td>'.dol_print_date($object->date_approve,'dayhour').'</td></tr>';
print '</tr>';
}
@ -1291,7 +1293,7 @@ else
print '</td></tr>';
print '<tr>';
print '<td>'.$langs->trans("DATE_REFUS").'</td>';
print '<td>'.$object->date_refuse;
print '<td>'.dol_print_date($object->date_refuse,'dayhour');
if ($object->detail_refuse) print ' - '.$object->detail_refuse;
print '</td>';
print '</tr>';
@ -1398,7 +1400,7 @@ else
}
print '</tr>';
}
if ($action == 'editline' && $objp->rowid == GETPOST('rowid'))
{
//modif ligne!!!!!
@ -1681,7 +1683,7 @@ if ($action != 'create' && $action != 'edit')
{
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=cancel&id='.$id.'">'.$langs->trans('Cancel').'</a>';
}
if($user->rights->expensereport->supprimer)
{
// Supprimer

View File

@ -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);

View File

@ -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";

View File

@ -137,12 +137,12 @@ else:
print '&nbsp;<input type="submit" class="button" value="'.$langs->trans("ViewAccountSynch").'">';
print "</form>";
$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 "<tr $bc[$var]>";
print '<td>'.$objp->ref.'</td>';
print '<td>'.dol_print_date($db->jdate($objp->date_valide),'day').'</td>';
print '<td>'.dol_print_date($db->jdate($objp->date_valid),'day').'</td>';
print '<td><a href="'.DOL_URL_ROOT.'/user/card.php?id='.$objp->fk_user_author.'">'.img_object($langs->trans("ShowUser"),"user").' '.$objp->declarant_NDF.'</a></td>';
print '<td align="center">'.$objp->total_ttc.' '.$langs->trans("EURO").'</td>';

View File

@ -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,

View File

@ -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;

View File

@ -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

View File

@ -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)
{

View File

@ -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 '<form action="'.$_SERVER["PHP_SELF"].'?id='.$projectid.'" method="post">';
print '<input type="hidden" name="tablename" value="'.$tablename.'">';
print '<input type="hidden" name="action" value="addelement">';
@ -329,9 +332,14 @@ foreach ($listofreferent as $key => $value)
print '<table class="noborder" width="100%">';
print '<tr class="liste_titre">';
print '<td width="100" colspan="2">'.$langs->trans("Ref").'</td>';
print '<td style="width: 24px"></td>';
print '<td style="width: 200px">'.$langs->trans("Ref").'</td>';
print '<td width="100" align="center">'.$langs->trans("Date").'</td>';
print '<td>'.$langs->trans("ThirdParty").'</td>';
// Thirdparty or user
print '<td>';
if ($tablename == 'expensereport_det') print $langs->trans("User");
else print $langs->trans("ThirdParty");
print '</td>';
if (empty($value['disableamount'])) print '<td align="right" width="120">'.$langs->trans("AmountHT").'</td>';
else print '<td width="120"></td>';
if (empty($value['disableamount'])) print '<td align="right" width="120">'.$langs->trans("AmountTTC").'</td>';
@ -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 "<tr ".$bc[$var].">";
print '<td width="1%">';
print '<td style="width: 24px">';
print '<a href="' . $_SERVER["PHP_SELF"] . '?id=' . $projectid . '&action=unlink&tablename=' . $tablename . '&elementselect=' . $element->id . '">' . img_picto($langs->trans('Unlink'), 'editdelete') . '</a>';
print "</td>\n";
// Ref
print '<td align="left">';
print $element->getNomUrl(1);
if ($tablename == 'expensereport_det')
{
print $expensereport->getNomUrl(1);
}
else print $element->getNomUrl(1);
print "</td>\n";
// Date
@ -403,9 +426,15 @@ foreach ($listofreferent as $key => $value)
}
print '<td align="center">'.dol_print_date($date,'day').'</td>';
// Third party
// Third party or user
print '<td align="left">';
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 '</td>';
// Amount without tax
@ -431,7 +460,10 @@ foreach ($listofreferent as $key => $value)
else print '<td></td>';
// Status
print '<td align="right">'.$element->getLibStatut(5).'</td>';
print '<td align="right">';
if ($tablename == 'expensereport_det') print $expensereport->getLibStatut(5);
else print $element->getLibStatut(5);
print '</td>';
print '</tr>';
@ -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 '<table class="noborder">';
print '<tr class="liste_titre">';
print '<td align="left" width="200">'.$langs->trans("Element").'</td>';
@ -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 '<tr >';