diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 75e54b2a5905ebf27933195d6f532a0d15e04df4..1764a127515b8cf54dc44a08f9c3e0c81b3c182f 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -36,6 +36,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; @@ -115,6 +116,7 @@ $object = new Account($db); $paymentstatic = new Paiement($db); $paymentsupplierstatic = new PaiementFourn($db); $societestatic = new Societe($db); +$userstatic = new User($db); $chargestatic = new ChargeSociales($db); $paymentvatstatic = new TVA($db); $paymentsalstatic = new PaymentSalary($db); @@ -127,8 +129,8 @@ if ($result) { // Variables $cptfour = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef")); $cptcli = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef")); - $cpttva = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) ? $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE : $langs->trans("CodeNotDef")); $accountancy_account_salary = (! empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) ? $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT : $langs->trans("CodeNotDef")); + $accountancy_account_pay_vat = (! empty($conf->global->ACCOUNTING_VAT_PAY_ACCOUNT) ? $conf->global->ACCOUNTING_VAT_PAY_ACCOUNT : $langs->trans("CodeNotDef")); $tabpay = array (); $tabbq = array (); @@ -175,7 +177,6 @@ if ($result) { { $tabtype[$obj->rowid] = $links[$key]['type']; - if ($links[$key]['type'] == 'payment') { $paymentstatic->id = $links[$key]['url_id']; @@ -194,6 +195,13 @@ if ($result) { $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); $tabtp[$obj->rowid][$compta_soc] += $obj->amount; } + else if ($links[$key]['type'] == 'user') + { + $userstatic->id = $links[$key]['url_id']; + $userstatic->name = $links[$key]['label']; + $tabpay[$obj->rowid]["soclib"] = $userstatic->getNomUrl(1, '', 30); + // $tabtp[$obj->rowid][$compta_user] += $obj->amount; + } else if ($links[$key]['type'] == 'sc') { $chargestatic->id = $links[$key]['url_id']; @@ -232,8 +240,8 @@ if ($result) { { $paymentvatstatic->id = $links[$key]['url_id']; $paymentvatstatic->ref = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); - $tabtp[$obj->rowid][$cpttva] += $obj->amount; + $tabpay[$obj->rowid]["lib"] .= ' ' . $langs->trans("PaymentVat"); + $tabtp[$obj->rowid][$accountancy_account_pay_vat] += $obj->amount; } else if ($links[$key]['type'] == 'payment_salary') { @@ -427,7 +435,6 @@ if ($action == 'export_csv') foreach ( $tabpay as $key => $val ) { $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); - $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; @@ -680,6 +687,7 @@ else print "<td>" . $reflabel . "</td>"; print "<td>" . $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . "</td>"; print "<td>" . $langs->trans('ThirdParty') . "</td>"; + print "<td> </td>"; print "<td align='right'>" . ($mt < 0 ? price(- $mt) : '') . "</td>"; print "<td align='right'>" . ($mt >= 0 ? price($mt) : '') . "</td>"; print "</tr>"; diff --git a/htdocs/admin/taxes.php b/htdocs/admin/taxes.php index bcbf11cfdb2807ea4aa68f3b883041db3334b090..3f8ecca00d9cbc9d8d620a859dc6b74997d416e2 100644 --- a/htdocs/admin/taxes.php +++ b/htdocs/admin/taxes.php @@ -2,7 +2,8 @@ /* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org> * Copyright (C) 2004-2008 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@capnetworks.com> - * Copyright (C) 2011-2013 Juanjo Menent <jmenent@2byte.es> + * Copyright (C) 2011-2013 Juanjo Menent <jmenent@2byte.es> + * Copyright (C) 2015 Alexandre Spangaro <alexandre.spangaro@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,6 +34,11 @@ if (!$user->admin) accessforbidden(); $action = GETPOST('action','alpha'); +// Other parameters ACCOUNTING_* +$list = array ( + 'ACCOUNTING_VAT_PAY_ACCOUNT' +); + /* * Actions */ @@ -51,9 +57,11 @@ $action = GETPOST('action','alpha'); $tax_mode = empty($conf->global->TAX_MODE)?0:$conf->global->TAX_MODE; -if ($action == 'settaxmode') -{ - $tax_mode = GETPOST('tax_mode','alpha'); +if ($action == 'update') { + $error = 0; + + // Tax mode + $tax_mode = GETPOST('tax_mode','alpha'); $db->begin(); @@ -79,38 +87,24 @@ if ($action == 'settaxmode') $res = dolibarr_set_const($db, 'TAX_MODE_BUY_SERVICE', $value,'chaine',0,'',$conf->entity); if (! $res > 0) $error++; - if (! $error) - { + // Others options + foreach ($list as $constname) { + $constvalue = GETPOST($constname, 'alpha'); + + if (!dolibarr_set_const($db, $constname, $constvalue, 'chaine', 0, '', $conf->entity)) { + $error++; + } + } + + if (! $error) { $db->commit(); setEventMessage($langs->trans("SetupSaved")); - } - else - { + } else { $db->rollback(); setEventMessage($langs->trans("Error"),'errors'); } - - } -/* - if ($_POST['action'] == 'update' || $_POST['action'] == 'add') - { - if (! dolibarr_set_const($db, $_POST['constname'], $_POST['constvalue'], $typeconst[$_POST['consttype']], 0, isset($_POST['constnote']) ? $_POST['constnote'] : '',$conf->entity)); - { - print $db->error(); - } - } - - if ($_GET['action'] == 'delete') - { - if (! dolibarr_del_const($db, $_GET['constname'],$conf->entity)); - { - print $db->error(); - } - } - */ - /* * View @@ -122,7 +116,8 @@ $form=new Form($db); $linkback='<a href="'.DOL_URL_ROOT.'/admin/modules.php">'.$langs->trans("BackToModuleList").'</a>'; print_fiche_titre($langs->trans('TaxSetup'),$linkback,'title_setup'); -print '<br>'; +dol_fiche_head(); + if (empty($mysoc->tva_assuj)) { print $langs->trans("YourCompanyDoesNotUseVAT").'<br>'; @@ -134,29 +129,28 @@ else // Cas des parametres TAX_MODE_SELL/BUY_SERVICE/PRODUCT print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - print '<input type="hidden" name="action" value="settaxmode">'; + print '<input type="hidden" name="action" value="update">'; + print '<tr class="liste_titre">'; - print '<td>'.$langs->trans('OptionVatMode').'</td><td>'.$langs->trans('Description').'</td>'; - print '<td align="right"><input class="button" type="submit" value="'.$langs->trans('Modify').'"></td>'; + print '<td colspan="2">'.$langs->trans('OptionVatMode').'</td><td>'.$langs->trans('Description').'</td>'; print "</tr>\n"; print '<tr '.$bc[false].'><td width="200"><input type="radio" name="tax_mode" value="0"'.($tax_mode != 1 ? ' checked' : '').'> '.$langs->trans('OptionVATDefault').'</td>'; print '<td colspan="2">'.nl2br($langs->trans('OptionVatDefaultDesc')); print "</td></tr>\n"; print '<tr '.$bc[true].'><td width="200"><input type="radio" name="tax_mode" value="1"'.($tax_mode == 1 ? ' checked' : '').'> '.$langs->trans('OptionVATDebitOption').'</td>'; print '<td colspan="2">'.nl2br($langs->trans('OptionVatDebitOptionDesc'))."</td></tr>\n"; - print '</form>'; print "</table>\n"; - print '<br><br>'; + print '<br>'; print_fiche_titre($langs->trans("SummaryOfVatExigibilityUsedByDefault"),'',''); //print ' ('.$langs->trans("CanBeChangedWhenMakingInvoice").')'; - print '<table class="border" width="100%">'; - print '<tr><td> </td><td>'.$langs->trans("Buy").'</td><td>'.$langs->trans("Sell").'</td></tr>'; + print '<table class="noborder" width="100%">'; + print '<tr class="liste_titre"><td> </td><td>'.$langs->trans("Buy").'</td><td>'.$langs->trans("Sell").'</td></tr>'; // Products - print '<tr><td>'.$langs->trans("Product").'</td>'; + print '<tr '.$bc[false].'><td>'.$langs->trans("Product").'</td>'; print '<td>'; print $langs->trans("OnDelivery"); print ' ('.$langs->trans("SupposedToBeInvoiceDate").')'; @@ -167,7 +161,7 @@ else print '</td></tr>'; // Services - print '<tr><td>'.$langs->trans("Services").'</td>'; + print '<tr '.$bc[true].'><td>'.$langs->trans("Services").'</td>'; print '<td>'; if ($tax_mode == 0) { @@ -196,6 +190,42 @@ else print '</table>'; } +print "<br>\n"; + +/* + * Others params + */ +print '<table class="noborder" width="100%">'; +print '<tr class="liste_titre">'; +print '<td colspan="3">' . $langs->trans('OtherOptions') . '</td>'; +print "</tr>\n"; + +foreach ($list as $key) +{ + $var=!$var; + + print '<tr '.$bc[$var].' class="value">'; + + // Param + $label = $langs->trans($key); + print '<td><label for="'.$key.'">'.$label.'</label></td>'; + + // Value + print '<td>'; + print '<input type="text" size="20" id="'.$key.'" name="'.$key.'" value="'.$conf->global->$key.'">'; + print '</td></tr>'; +} + +print '</table>'; + +dol_fiche_end(); + +print '<div class="center">'; +print '<input type="submit" class="button" value="' . $langs->trans("Modify") . '" name="button">'; +print '</div>'; + +print '</form>'; + $db->close(); llxFooter(); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index d11a37564b9033404da6696ddb37813768195ced..6af44d4a7d6c9cc32215aca0250277fa91b5bf7a 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -292,10 +292,12 @@ if ($resql) } if (! empty($moreforfilter)) { - print '<tr class="liste_titre">'; - print '<td class="liste_titre" colspan="10">'; - print $moreforfilter; - print '</td></tr>'; + print '<div class="liste_titre">'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '</div>'; } print '<tr class="liste_titre">'; @@ -305,6 +307,9 @@ if ($resql) print_liste_field_titre($langs->trans('OrderDate'),$_SERVER["PHP_SELF"],'c.date_commande','',$param, 'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('DeliveryDate'),$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('AmountHT'),$_SERVER["PHP_SELF"],'c.total_ht','',$param, 'align="right"',$sortfield,$sortorder); + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; print_liste_field_titre($langs->trans('Status'),$_SERVER["PHP_SELF"],'c.fk_statut','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); print '</tr>'; diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php index c4908595493032904bb14c17e62586b97b70d36a..fa9db9ea4b42aa337592ed1b40523f436c1cddc5 100644 --- a/htdocs/core/db/DoliDB.class.php +++ b/htdocs/core/db/DoliDB.class.php @@ -220,7 +220,7 @@ abstract class DoliDB implements Database /** * Define sort criteria of request * - * @param string $sortfield List of sort fields + * @param string $sortfield List of sort fields, separated by comma. Example: 't1.fielda, t2.fieldb' * @param string $sortorder Sort order * @return string String to provide syntax of a sort sql string */ @@ -236,7 +236,8 @@ abstract class DoliDB implements Database else $return.=','; $return.=preg_replace('/[^0-9a-z_\.]/i','',$val); - if (isset($sortorder)) { + if (isset($sortorder)) + { $return.=' '.preg_replace('/[^0-9a-z]/i','',$sortorder); } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ed3d709f16f23ae958c8214b77723ec1340b6869..5d75d7ad5d6760bd46ff0f2b524673ccfa920354 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4644,7 +4644,8 @@ function dol_osencode($str) /** - * Return an id or code from a code or id. Store also Code-Id into a cache for next use. + * Return an id or code from a code or id. + * Store also Code-Id into a cache to speed up next request on same key. * * @param DoliDB $db Database handler * @param string $key Code to get Id diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 3709303f68e3a56c46ff62417c3dec9f1f11115d..c337cccc940844007eac384b6c56c24fc5057d0e 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -872,13 +872,15 @@ function searchTaskInChild(&$inc, $parent, &$lines, &$taskrole) * Return HTML table with list of projects and number of opened tasks * * @param DoliDB $db Database handler + * @param Form $form Object form * @param int $socid Id thirdparty * @param int $projectsListId Id of project i have permission on * @param int $mytasks Limited to task i am contact to * @param int $statut -1=No filter on statut, 0 or 1 = Filter on status + * @param array $listofoppstatus List of opportunity status * @return void */ -function print_projecttasks_array($db, $socid, $projectsListId, $mytasks=0, $statut=-1) +function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=0, $statut=-1, $listofoppstatus=array()) { global $langs,$conf,$user,$bc; @@ -890,18 +892,22 @@ function print_projecttasks_array($db, $socid, $projectsListId, $mytasks=0, $sta $sortorder=''; $project_year_filter=0; - $title=$langs->trans("Project"); - if (strcmp($statut, '') && $statut >= 0) $title=$langs->trans("Project").' ('.$langs->trans($projectstatic->statuts_long[$statut]).')'; + $title=$langs->trans("Projects"); + if (strcmp($statut, '') && $statut >= 0) $title=$langs->trans("Projects").' '.$langs->trans($projectstatic->statuts_long[$statut]); print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; print_liste_field_titre($title,"index.php","","","","",$sortfield,$sortorder); - //if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print_liste_field_titre($langs->trans("OpportunityStatus"),"","","","",'align="right"',$sortfield,$sortorder); + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print_liste_field_titre($langs->trans("OpportunityAmount"),"","","","",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("OpportunityStatus"),"","","","",'align="right"',$sortfield,$sortorder); + } if (empty($conf->global->PROJECT_HIDE_TASKS)) print_liste_field_titre($langs->trans("Tasks"),"","","","",'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Status"),"","","","",'align="right"',$sortfield,$sortorder); print "</tr>\n"; - $sql = "SELECT p.rowid as projectid, p.ref, p.title, p.fk_user_creat, p.public, p.fk_statut as status, p.fk_opp_status as opp_status, COUNT(t.rowid) as nb"; + $sql = "SELECT p.rowid as projectid, p.ref, p.title, p.fk_user_creat, p.public, p.fk_statut as status, p.fk_opp_status as opp_status, p.opp_amount, COUNT(DISTINCT t.rowid) as nb"; // We use DISTINCT here because line can be doubled if task has 2 links to same user $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; if ($mytasks) { @@ -928,24 +934,31 @@ function print_projecttasks_array($db, $socid, $projectsListId, $mytasks=0, $sta { $sql.= " AND p.fk_statut = ".$statut; } - if (!empty($conf->global->PROJECT_LIMIT_YEAR_RANGE)) { + if (!empty($conf->global->PROJECT_LIMIT_YEAR_RANGE)) + { $project_year_filter = GETPOST("project_year_filter"); //Check if empty or invalid year. Wildcard ignores the sql check - if ($project_year_filter != "*") { - if (empty($project_year_filter) || !ctype_digit($project_year_filter)) { // + if ($project_year_filter != "*") + { + if (empty($project_year_filter) || !ctype_digit($project_year_filter)) + { $project_year_filter = date("Y"); } $sql.= " AND (p.dateo IS NULL OR p.dateo <= ".$db->idate(dol_get_last_day($project_year_filter,12,false)).")"; $sql.= " AND (p.datee IS NULL OR p.datee >= ".$db->idate(dol_get_first_day($project_year_filter,1,false)).")"; } } - $sql.= " GROUP BY p.rowid, p.ref, p.title, p.fk_user_creat, p.public, p.fk_statut, p.fk_opp_status"; + $sql.= " GROUP BY p.rowid, p.ref, p.title, p.fk_user_creat, p.public, p.fk_statut, p.fk_opp_status, p.opp_amount"; $sql.= " ORDER BY p.title, p.ref"; $var=true; $resql = $db->query($sql); if ( $resql ) { + $total_task = 0; + $total_opp_amount = 0; + $ponderated_opp_amount = 0; + $num = $db->num_rows($resql); $i = 0; @@ -967,22 +980,34 @@ function print_projecttasks_array($db, $socid, $projectsListId, $mytasks=0, $sta $projectstatic->ref=$objp->ref; print $projectstatic->getNomUrl(1); print ' - '.dol_trunc($objp->title,24).'</td>'; - /*if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print '<td align="right">'; + if ($objp->opp_amount) print price($objp->opp_amount, 0, '', 1, -1, -1, $conf->currency); + print '</td>'; + print '<td align="right">'; $code = dol_getIdFromCode($db, $objp->opp_status, 'c_lead_status', 'rowid', 'code'); if ($code) print $langs->trans("OppStatus".$code); print '</td>'; - }*/ - if (empty($conf->global->PROJECT_HIDE_TASKS)) print '<td align="right">'.$objp->nb.'</td>'; + } $projectstatic->statut = $objp->status; + if (empty($conf->global->PROJECT_HIDE_TASKS)) print '<td align="right">'.$objp->nb.'</td>'; print '<td align="right">'.$projectstatic->getLibStatut(3).'</td>'; print "</tr>\n"; + + $total_task = $total_task + $objp->nb; + $total_opp_amount = $total_opp_amount + $objp->opp_amount; + $ponderated_opp_amount = $ponderated_opp_amount + price2num($listofoppstatus[$objp->opp_status] * $objp->opp_amount / 100); } $i++; } + print '<tr><td>'.$langs->trans("Total")."</td>"; + print '<td align="right">'.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).'</td>'; + print '<td align="right">'.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).'</td>'; + if (empty($conf->global->PROJECT_HIDE_TASKS)) print '<td align="right">'.$total_task.'</td>'; + $db->free($resql); } else diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 117a54f89c340d0e9e056be4d4a584fc19897f3b..b623c7daa1fec88cb5524f70a77000407fca05ee 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -8,7 +8,7 @@ * Copyright (C) 2013 Philippe Grand <philippe.grand@atoo-net.com> * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro> * Copyright (C) 2014-2015 Marcos GarcĂa <marcosgdf@gmail.com> - * Copyright (C) 2015 Bahfir Abbes <bafbes@gmail.com> + * Copyright (C) 2015 Bahfir Abbes <bafbes@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1987,8 +1987,8 @@ class SupplierInvoiceLine extends CommonObjectLine /** * Retrieves a supplier invoice line * - * @param int $rowid Line id - * @return int <0 KO; 0 NOT FOUND; 1 OK + * @param int $rowid Line id + * @return int <0 KO; 0 NOT FOUND; 1 OK */ public function fetch($rowid) { @@ -2052,8 +2052,8 @@ class SupplierInvoiceLine extends CommonObjectLine /** * Deletes a line * - * @param bool|int $notrigger - * @return int -1 KO; 1 OK + * @param bool|int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return int 0 if KO, 1 if OK */ public function delete($notrigger = 0) { diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index 9e801939dccd69ac96566d2e65a4a92ffade7034..7ce82448cb57596bd6113a5181d92570afab9efd 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -199,7 +199,8 @@ TurnoverPerProductInCommitmentAccountingNotRelevant=Turnover report per product, CalculationMode=Calculation mode AccountancyJournal=Accountancy code journal ACCOUNTING_VAT_SOLD_ACCOUNT=Default accountancy code for collecting VAT -ACCOUNTING_VAT_BUY_ACCOUNT=Default accountancy code for paying VAT +ACCOUNTING_VAT_BUY_ACCOUNT=Default accountancy code for recovered VAT +ACCOUNTING_VAT_PAY_ACCOUNT=Default accountancy code for paying VAT ACCOUNTING_ACCOUNT_CUSTOMER=Accountancy code by default for customer thirdparties ACCOUNTING_ACCOUNT_SUPPLIER=Accountancy code by default for supplier thirdparties CloneTax=Clone a social/fiscal tax diff --git a/htdocs/langs/en_US/languages.lang b/htdocs/langs/en_US/languages.lang index aaeeb235544421208b68e18db0f0666f563ace40..dbfe650102c015bd7ce4c4a1bb498f36d30e46d3 100644 --- a/htdocs/langs/en_US/languages.lang +++ b/htdocs/langs/en_US/languages.lang @@ -23,6 +23,7 @@ Language_en_US=English (United States) Language_en_ZA=English (South Africa) Language_es_ES=Spanish Language_es_AR=Spanish (Argentina) +Language_es_BO=Spanish (Bolivia) Language_es_CL=Spanish (Chile) Language_es_CO=Spanish (Colombia) Language_es_DO=Spanish (Dominican Republic) @@ -40,6 +41,7 @@ Language_fr_CA=French (Canada) Language_fr_CH=French (Switzerland) Language_fr_FR=French Language_fr_NC=French (New Caledonia) +Language_fy_NL=Frisian Language_he_IL=Hebrew Language_hr_HR=Croatian Language_hu_HU=Hungarian diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 5d560ed4a248d9170e4d2d94050e127e40c4dec2..09ac5dd44a7e956a2181d41f05ee9c1348b6816d 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -26,6 +26,8 @@ ConfirmDeleteATask=Are you sure you want to delete this task ? OfficerProject=Officer project LastProjects=Last %s projects AllProjects=All projects +OpenedProjects=Opened projects +OpportunitiesStatusForOpenedProjects=Opportunities status for opened projects ProjectsList=List of projects ShowProject=Show project SetProject=Set project @@ -78,6 +80,8 @@ ListDonationsAssociatedProject=List of donations associated with the project ListActionsAssociatedProject=List of events associated with the project ListTaskTimeUserProject=List of time consumed on tasks of project TaskTimeUserProject=Time consumed on tasks of project +ActivityOnProjectToday=Activity on project today +ActivityOnProjectYesterday=Activity on project yesterday ActivityOnProjectThisWeek=Activity on project this week ActivityOnProjectThisMonth=Activity on project this month ActivityOnProjectThisYear=Activity on project this year @@ -93,6 +97,7 @@ ReOpenAProject=Open project ConfirmReOpenAProject=Are you sure you want to re-open this project ? ProjectContact=Project contacts ActionsOnProject=Events on project +OpenedProjects=Opened projects YouAreNotContactOfProject=You are not a contact of this private project DeleteATimeSpent=Delete time spent ConfirmDeleteATimeSpent=Are you sure you want to delete this time spent ? @@ -142,6 +147,7 @@ PlannedWorkloadShort=Workload WorkloadOccupation=Workload assignation ProjectReferers=Refering objects SearchAProject=Search a project +SearchATask=Search a task ProjectMustBeValidatedFirst=Project must be validated first ProjectDraft=Draft projects FirstAddRessourceToAllocateTime=Associate a resource to allocate time @@ -161,3 +167,5 @@ ManageOpportunitiesStatus=Use projects to follow leads/opportinuties ProjectNbProjectByMonth=Nb of created projects by month ProjectsStatistics=Statistics on projects/leads TaskAssignedToEnterTime=Task assigned. Entering time on this task should be possible. +OpenedProjectsByThirdparties=Opened projects by thirdparties +OpportunityPonderatedAmount=Opportunities ponderated amount \ No newline at end of file diff --git a/htdocs/langs/es_BO/main.lang b/htdocs/langs/es_BO/main.lang new file mode 100644 index 0000000000000000000000000000000000000000..2e691473326d372b5db42468423519b3171a0d8a --- /dev/null +++ b/htdocs/langs/es_BO/main.lang @@ -0,0 +1,21 @@ +# Dolibarr language file - Source file is en_US - main +DIRECTION=ltr +FONTFORPDF=helvetica +FONTSIZEFORPDF=10 +SeparatorDecimal=. +SeparatorThousand=, +FormatDateShort=%m/%d/%Y +FormatDateShortInput=%m/%d/%Y +FormatDateShortJava=MM/dd/yyyy +FormatDateShortJavaInput=MM/dd/yyyy +FormatDateShortJQuery=mm/dd/yy +FormatDateShortJQueryInput=mm/dd/yy +FormatHourShortJQuery=HH:MI +FormatHourShort=%I:%M %p +FormatHourShortDuration=%H:%M +FormatDateTextShort=%b %d, %Y +FormatDateText=%B %d, %Y +FormatDateHourShort=%m/%d/%Y %I:%M %p +FormatDateHourSecShort=%m/%d/%Y %I:%M:%S %p +FormatDateHourTextShort=%b %d, %Y, %I:%M %p +FormatDateHourText=%B %d, %Y, %I:%M %p diff --git a/htdocs/projet/activity/index.php b/htdocs/projet/activity/index.php index 75fd12e9d9592c8f934f9d38cb69e5028262a7e2..39f728263ad65aa08910015788aac22e03b0897c 100644 --- a/htdocs/projet/activity/index.php +++ b/htdocs/projet/activity/index.php @@ -49,6 +49,7 @@ $now = dol_now(); $projectstatic=new Project($db); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); // Return all projects I have permission on because I want my tasks and some of my task may be on a public projet that is not my project +$tasktmp=new Task($db); $title=$langs->trans("Activities"); if ($mine) $title=$langs->trans("MyActivities"); @@ -68,13 +69,31 @@ else print '<div class="fichecenter"><div class="fichethirdleft">'; -print_projecttasks_array($db,$socid,$projectsListId,$mine,1); +// Search task +if (! empty($conf->projet->enabled) && $user->rights->projet->lire) +{ + $var=false; + print '<form method="post" action="'.DOL_URL_ROOT.'/projet/tasks/index.php">'; + print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; + print '<input type="hidden" name="mode" value="'.$mine.'">'; + print '<input type="hidden" name="search_status" value="-1">'; // All status + print '<table class="noborder nohover" width="100%">'; + print '<tr class="liste_titre"><td colspan="3">'.$langs->trans("SearchATask").'</td></tr>'; + print '<tr '.$bc[$var].'>'; + print '<td class="nowrap"><label for="sf_ref">'.$langs->trans("Ref").'</label>:</td><td><input type="text" class="flat" name="search_task_ref" id="sf_ref" size="18"></td>'; + print '<td rowspan="3"><input type="submit" value="'.$langs->trans("Search").'" class="button"></td></tr>'; + //print '<tr '.$bc[$var].'><td class="nowrap"><label for="syear">'.$langs->trans("Year").'</label>:</td><td><input type="text" class="flat" name="search_year" id="search_year" size="18"></td>'; + print '<tr '.$bc[$var].'><td class="nowrap"><label for="sall">'.$langs->trans("Other").'</label>:</td><td><input type="text" class="flat" name="search_task_label" id="search_task_label" size="18"></td>'; + print '</tr>'; + print "</table></form>\n"; + print "<br>\n"; +} /* Affichage de la liste des projets d'aujourd'hui */ print '<br><table class="noborder" width="100%">'; print '<tr class="liste_titre">'; -print '<td width="50%">'.$langs->trans('Today').'</td>'; +print '<td width="50%">'.$langs->trans('ActivityOnProjectToday').'</td>'; print '<td width="50%" align="right">'.$langs->trans("Time").'</td>'; print "</tr>\n"; @@ -127,67 +146,64 @@ print "</table>"; if ($db->type != 'pgsql') { -/* Affichage de la liste des projets d'hier */ -print '<br><table class="noborder" width="100%">'; -print '<tr class="liste_titre">'; -print '<td>'.$langs->trans('Yesterday').'</td>'; -print '<td align="right">'.$langs->trans("Time").'</td>'; -print "</tr>\n"; - -$sql = "SELECT p.rowid, p.ref, p.title, sum(tt.task_duration) as nb"; -$sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; -$sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; -$sql.= ", ".MAIN_DB_PREFIX."projet_task_time as tt"; -$sql.= " WHERE t.fk_projet = p.rowid"; -$sql.= " AND p.entity = ".$conf->entity; -$sql.= " AND tt.fk_task = t.rowid"; -$sql.= " AND tt.fk_user = ".$user->id; -$sql.= " AND date_format(date_add(task_date, INTERVAL 1 DAY),'%y-%m-%d') = '".strftime("%y-%m-%d",$now)."'"; -$sql.= " AND p.rowid in (".$projectsListId.")"; -$sql.= " GROUP BY p.rowid, p.ref, p.title"; - -$resql = $db->query($sql); -if ( $resql ) -{ - $var=true; - $total=0; - - while ($row = $db->fetch_object($resql)) + /* Affichage de la liste des projets d'hier */ + print '<br><table class="noborder" width="100%">'; + print '<tr class="liste_titre">'; + print '<td>'.$langs->trans('ActivityOnProjectYesterday').'</td>'; + print '<td align="right">'.$langs->trans("Time").'</td>'; + print "</tr>\n"; + + $sql = "SELECT p.rowid, p.ref, p.title, sum(tt.task_duration) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; + $sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; + $sql.= ", ".MAIN_DB_PREFIX."projet_task_time as tt"; + $sql.= " WHERE t.fk_projet = p.rowid"; + $sql.= " AND p.entity = ".$conf->entity; + $sql.= " AND tt.fk_task = t.rowid"; + $sql.= " AND tt.fk_user = ".$user->id; + $sql.= " AND date_format(date_add(task_date, INTERVAL 1 DAY),'%y-%m-%d') = '".strftime("%y-%m-%d",$now)."'"; + $sql.= " AND p.rowid in (".$projectsListId.")"; + $sql.= " GROUP BY p.rowid, p.ref, p.title"; + + $resql = $db->query($sql); + if ( $resql ) { - $var=!$var; - print "<tr ".$bc[$var].">"; - print '<td>'; - $projectstatic->id=$row->rowid; - $projectstatic->ref=$row->ref; - $projectstatic->title=$row->title; - print $projectstatic->getNomUrl(1, '', 1); - print '</td>'; - print '<td align="right">'.convertSecondToTime($row->nb).'</td>'; - print "</tr>\n"; - $total += $row->nb; + $var=true; + $total=0; + + while ($row = $db->fetch_object($resql)) + { + $var=!$var; + print "<tr ".$bc[$var].">"; + print '<td>'; + $projectstatic->id=$row->rowid; + $projectstatic->ref=$row->ref; + $projectstatic->title=$row->title; + print $projectstatic->getNomUrl(1, '', 1); + print '</td>'; + print '<td align="right">'.convertSecondToTime($row->nb).'</td>'; + print "</tr>\n"; + $total += $row->nb; + } + + $db->free($resql); } - - $db->free($resql); -} -else -{ - dol_print_error($db); -} -print '<tr class="liste_total">'; -print '<td>'.$langs->trans('Total').'</td>'; -print '<td align="right">'.convertSecondToTime($total).'</td>'; -print "</tr>\n"; -print "</table>"; - + else + { + dol_print_error($db); + } + print '<tr class="liste_total">'; + print '<td>'.$langs->trans('Total').'</td>'; + print '<td align="right">'.convertSecondToTime($total).'</td>'; + print "</tr>\n"; + print "</table>"; } -print '</div><div class="fichetwothirdright"><div class="ficheaddleft">'; - - // TODO Do not use week function to be compatible with all database if ($db->type != 'pgsql') { +print '<br>'; /* Affichage de la liste des projets de la semaine */ print '<table class="noborder" width="100%">'; @@ -293,52 +309,190 @@ print "</tr>\n"; print "</table>"; /* Affichage de la liste des projets de l'annee */ -print '<br><table class="noborder" width="100%">'; -print '<tr class="liste_titre">'; -print '<td>'.$langs->trans("ActivityOnProjectThisYear").': '.strftime("%Y", $now).'</td>'; -print '<td align="right">'.$langs->trans("Time").'</td>'; -print "</tr>\n"; - -$sql = "SELECT p.rowid, p.ref, p.title, SUM(tt.task_duration) as nb"; -$sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; -$sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; -$sql.= ", ".MAIN_DB_PREFIX."projet_task_time as tt"; -$sql.= " WHERE t.fk_projet = p.rowid"; -$sql.= " AND p.entity = ".$conf->entity; -$sql.= " AND tt.fk_task = t.rowid"; -$sql.= " AND tt.fk_user = ".$user->id; -$sql.= " AND YEAR(task_date) = '".strftime("%Y",$now)."'"; -$sql.= " AND p.rowid in (".$projectsListId.")"; -$sql.= " GROUP BY p.rowid, p.ref, p.title"; - -$var=false; -$resql = $db->query($sql); -if ( $resql ) +if (! empty($conf->global->PROJECT_TASK_TIME_YEAR)) { - while ($row = $db->fetch_object($resql)) + print '<br><table class="noborder" width="100%">'; + print '<tr class="liste_titre">'; + print '<td>'.$langs->trans("ActivityOnProjectThisYear").': '.strftime("%Y", $now).'</td>'; + print '<td align="right">'.$langs->trans("Time").'</td>'; + print "</tr>\n"; + + $sql = "SELECT p.rowid, p.ref, p.title, SUM(tt.task_duration) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; + $sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; + $sql.= ", ".MAIN_DB_PREFIX."projet_task_time as tt"; + $sql.= " WHERE t.fk_projet = p.rowid"; + $sql.= " AND p.entity = ".$conf->entity; + $sql.= " AND tt.fk_task = t.rowid"; + $sql.= " AND tt.fk_user = ".$user->id; + $sql.= " AND YEAR(task_date) = '".strftime("%Y",$now)."'"; + $sql.= " AND p.rowid in (".$projectsListId.")"; + $sql.= " GROUP BY p.rowid, p.ref, p.title"; + + $var=false; + $resql = $db->query($sql); + if ( $resql ) { - print "<tr ".$bc[$var].">"; - print '<td>'; - $projectstatic->id=$row->rowid; - $projectstatic->ref=$row->ref; - $projectstatic->title=$row->title; - print $projectstatic->getNomUrl(1, '', 1); - print '</td>'; - print '<td align="right">'.convertSecondToTime($row->nb).'</td>'; - print "</tr>\n"; - $var=!$var; + while ($row = $db->fetch_object($resql)) + { + print "<tr ".$bc[$var].">"; + print '<td>'; + $projectstatic->id=$row->rowid; + $projectstatic->ref=$row->ref; + $projectstatic->title=$row->title; + print $projectstatic->getNomUrl(1, '', 1); + print '</td>'; + print '<td align="right">'.convertSecondToTime($row->nb).'</td>'; + print "</tr>\n"; + $var=!$var; + } + $db->free($resql); } - $db->free($resql); + else + { + dol_print_error($db); + } + print '<tr class="liste_total">'; + print '<td>'.$langs->trans('Total').'</td>'; + print '<td align="right">'.convertSecondToTime($total).'</td>'; + print "</tr>\n"; + print "</table>"; } -else + + + +print '</div><div class="fichetwothirdright"><div class="ficheaddleft">'; + + +if (empty($conf->global->PROJECT_HIDE_TASKS)) { - dol_print_error($db); + // Tasks for all resources of all opened projects and time spent for each task/resource + + $max = (empty($conf->global->PROJECT_LIMIT_TASK_PROJECT_AREA)?1000:$conf->global->PROJECT_LIMIT_TASK_PROJECT_AREA); + + $sql = "SELECT p.ref, p.title, p.rowid as projectid, p.fk_statut as status, p.fk_opp_status as opp_status, t.label, t.rowid as taskid, t.planned_workload, t.duration_effective, t.progress, t.dateo, t.datee, SUM(tasktime.task_duration) as timespent"; + $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task_time as tasktime on tasktime.fk_task = t.rowid"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on tasktime.fk_user = u.rowid"; + $sql.= " WHERE p.entity = ".$conf->entity; + if ($mine || empty($user->rights->projet->all->lire)) $sql.= " AND p.rowid IN (".$projectsListId.")"; + if ($socid) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".$socid.")"; + $sql.= " AND p.fk_statut=1"; + $sql.= " GROUP BY p.ref, p.title, p.rowid, t.label, t.rowid, t.planned_workload, t.duration_effective, t.progress, t.dateo, t.datee"; + $sql.= " ORDER BY t.dateo desc, t.rowid desc, t.datee"; + $sql.= $db->plimit($max+1); // We want more to know if we have more than limit + + $var=true; + + dol_syslog('projet:index.php: affectationpercent', LOG_DEBUG); + $resql = $db->query($sql); + if ( $resql ) + { + $num = $db->num_rows($resql); + $i = 0; + + //print_fiche_titre($langs->trans("TasksOnOpenedProject"),'','').'<br>'; + + print '<table class="noborder" width="100%">'; + print '<tr class="liste_titre">'; + //print '<th>'.$langs->trans('TaskRessourceLinks').'</th>'; + print '<th>'.$langs->trans('OpenedProjects').'</th>'; + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print '<th>'.$langs->trans('OpportunityStatus').'</th>'; + print '<th>'.$langs->trans('Task').'</th>'; + print '<th align="center">'.$langs->trans('DateStart').'</th>'; + print '<th align="center">'.$langs->trans('DateEnd').'</th>'; + print '<th align="right">'.$langs->trans('PlannedWorkload').'</th>'; + print '<th align="right">'.$langs->trans("ProgressDeclared").'</td>'; + print '<th align="right">'.$langs->trans('TimeSpent').'</th>'; + print '<th align="right">'.$langs->trans("ProgressCalculated").'</td>'; + print '</tr>'; + + while ($i < $num && $i < $max) + { + $obj = $db->fetch_object($resql); + $var=!$var; + + $username=''; + if ($obj->userid && $userstatic->id != $obj->userid) // We have a user and it is not last loaded user + { + $result=$userstatic->fetch($obj->userid); + if (! $result) $userstatic->id=0; + } + if ($userstatic->id) $username = $userstatic->getNomUrl(0,0); + + print "<tr ".$bc[$var].">"; + //print '<td>'.$username.'</td>'; + print '<td>'; + $projectstatic->id=$obj->projectid; + $projectstatic->ref=$obj->ref; + $projectstatic->title=$obj->title; + print $projectstatic->getNomUrl(1,'',16,'','<br>'); + //print '<a href="'.DOL_URL_ROOT.'/projet/card.php?id='.$obj->projectid.'">'.$obj->title.'</a>'; + print '</td>'; + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print '<td>'; + $code = dol_getIdFromCode($db, $obj->opp_status, 'c_lead_status', 'rowid', 'code'); + if ($code) print $langs->trans("OppStatus".$code); + print '</td>'; + } + print '<td>'; + if (! empty($obj->taskid)) + { + $tasktmp->id = $obj->taskid; + $tasktmp->ref = $obj->ref; + $tasktmp->label = $obj->label; + print $tasktmp->getNomUrl(1,'withproject','task',1,'<br>'); + } + else print $langs->trans("NoTasks"); + print '</td>'; + print '<td align="center">'.dol_print_date($db->jdate($obj->dateo),'day').'</td>'; + print '<td align="center">'.dol_print_date($db->jdate($obj->datee),'day').'</td>'; + print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$obj->taskid.'&withproject=1">'; + print convertSecondToTime($obj->planned_workload, 'all'); + print '</a></td>'; + print '<td align="right">'; + print ($obj->taskid>0)?$obj->progress.'%':''; + print '</td>'; + print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$obj->taskid.'&withproject=1">'; + print convertSecondToTime($obj->timespent, 'all'); + print '</a></td>'; + print '<td align="right">'; + if (! empty($obj->taskid)) + { + if (empty($obj->planned_workload) > 0) { + $percentcompletion = $langs->trans("WorkloadNotDefined"); + } else { + $percentcompletion = intval($obj->duration_effective*100/$obj->planned_workload).'%'; + } + } + print $percentcompletion; + print '</td>'; + print "</tr>\n"; + + $i++; + } + + if ($num > $max) + { + $colspan=6; + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) $colspan++; + print '<tr><td colspan="'.$colspan.'">'.$langs->trans("WarningTooManyDataPleaseUseMoreFilters").'</td></tr>'; + } + + print "</table>"; + + + $db->free($resql); + } + else + { + dol_print_error($db); + } + } -print '<tr class="liste_total">'; -print '<td>'.$langs->trans('Total').'</td>'; -print '<td align="right">'.convertSecondToTime($total).'</td>'; -print "</tr>\n"; -print "</table>"; print '</div></div></div>'; diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 7a38e7a1278190210c9aec3bd8b6e4ffc2c711d5..0bf57ebb922aaca70e106501cb8cc4850173574b 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -871,10 +871,11 @@ class Project extends CommonObject * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto * @param string $option Variant ('', 'nolink') * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string - * @param string $moreinpopup Text to add into popu + * @param string $moreinpopup Text to add into popup + * @param string $sep Separator between ref and label if option addlabel is set * @return string Chaine avec URL */ - function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='') + function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep=' - ') { global $langs; @@ -905,7 +906,7 @@ class Project extends CommonObject if ($withpicto) $result.=($link . img_object($label, $picto, 'class="classfortooltip"') . $linkend); if ($withpicto && $withpicto != 2) $result.=' '; - if ($withpicto != 2) $result.=$link . $this->ref . $linkend . (($addlabel && $this->title) ? ' - ' . dol_trunc($this->title, ($addlabel > 1 ? $addlabel : 0)) : ''); + if ($withpicto != 2) $result.=$link . $this->ref . $linkend . (($addlabel && $this->title) ? $sep . dol_trunc($this->title, ($addlabel > 1 ? $addlabel : 0)) : ''); return $result; } diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index bd20a930aa46a3a949174434707a8603526331ac..5bdbc4a1820308c182425d4ee38e1a3e9c3c3c13 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -499,9 +499,11 @@ class Task extends CommonObject * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto * @param string $option 'withproject' or '' * @param string $mode Mode 'task', 'time', 'contact', 'note', document' define page to link to. + * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string + * @param string $sep Separator between ref and label if option addlabel is set * @return string Chaine avec URL */ - function getNomUrl($withpicto=0,$option='',$mode='task') + function getNomUrl($withpicto=0,$option='',$mode='task', $addlabel=0, $sep=' - ') { global $langs; @@ -525,7 +527,7 @@ class Task extends CommonObject if ($withpicto) $result.=($link.img_object($label, $picto, 'class="classfortooltip"').$linkend); if ($withpicto && $withpicto != 2) $result.=' '; - if ($withpicto != 2) $result.=$link.$this->ref.$linkend; + if ($withpicto != 2) $result.=$link.$this->ref.$linkend . (($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : ''); return $result; } @@ -585,12 +587,14 @@ class Task extends CommonObject $sql.= " WHERE p.entity = ".$conf->entity; $sql.= " AND t.fk_projet = p.rowid"; } - if ($mode == 1) + elseif ($mode == 1) { $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid"; $sql.= " WHERE p.entity = ".$conf->entity; } + else return 'BadValueForParameterMode'; + if ($filteronprojuser) { // TODO @@ -603,7 +607,7 @@ class Task extends CommonObject if ($projectid) $sql.= " AND p.rowid in (".$projectid.")"; if ($filteronprojref) $sql.= " AND p.ref LIKE '%".$filteronprojref."%'"; if ($filteronprojstatus > -1) $sql.= " AND p.fk_statut = ".$filteronprojstatus; - if ($morewherefilter) $sql.=" AND (".$morewherefilter.")"; + if ($morewherefilter) $sql.=$morewherefilter; $sql.= " ORDER BY p.ref, t.rang, t.dateo"; //print $sql;exit; @@ -948,7 +952,7 @@ class Task extends CommonObject $sql.=" AND (".$datefieldname." <= '".$this->db->idate($datee)."' OR ".$datefieldname." IS NULL)"; } //print $sql; - + dol_syslog(get_class($this)."::getSumOfAmount", LOG_DEBUG); $resql=$this->db->query($sql); if ($resql) @@ -957,7 +961,7 @@ class Task extends CommonObject $result['amount'] = $obj->amount; $result['nblinesnull'] = $obj->nblinesnull; - + $this->db->free($resql); return $result; } diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 4894aed413b7274fed2ca3d801a76a3e7d25ba94..264afb449f9dad24c899f9cf93ced8e43b897f5e 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -51,7 +51,7 @@ $sortorder = GETPOST("sortorder",'alpha'); $socstatic=new Societe($db); $projectstatic=new Project($db); $userstatic=new User($db); -$tasktmp=new Task($db); +$form=new Form($db); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,($mine?$mine:(empty($user->rights->projet->all->lire)?0:2)),1); //var_dump($projectsListId); @@ -73,6 +73,28 @@ else } +// Get list of ponderated percent for each status +$listofoppstatus=array(); $listofopplabel=array(); $listofoppcode=array(); +$sql = "SELECT cls.rowid, cls.code, cls.percent, cls.label"; +$sql.= " FROM ".MAIN_DB_PREFIX."c_lead_status as cls"; +$resql = $db->query($sql); +if ( $resql ) +{ + $num = $db->num_rows($resql); + $i = 0; + + while ($i < $num) + { + $objp = $db->fetch_object($resql); + $listofoppstatus[$objp->rowid]=$objp->percent; + $listofopplabel[$objp->rowid]=$objp->label; + $listofoppcode[$objp->rowid]=$objp->code; + $i++; + } +} +else dol_print_error($db); + + print '<div class="fichecenter"><div class="fichethirdleft">'; @@ -94,8 +116,92 @@ if (! empty($conf->projet->enabled) && $user->rights->projet->lire) print "<br>\n"; } + +/* + * Statistics + */ + +if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) +{ + $sql = "SELECT count(p.rowid), p.fk_opp_status as status"; + $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; + $sql.= " WHERE p.entity = ".$conf->entity; + $sql.= " AND p.fk_statut = 1"; + if ($mine || empty($user->rights->projet->all->lire)) $sql.= " AND p.rowid IN (".$projectsListId.")"; + if ($socid) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".$socid.")"; + $sql.= " GROUP BY p.fk_opp_status"; + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $i = 0; + + $total=0; + $totalinprocess=0; + $dataseries=array(); + $vals=array(); + // -1=Canceled, 0=Draft, 1=Validated, (2=Accepted/On process not managed for customer orders), 3=Closed (Sent/Received, billed or not) + while ($i < $num) + { + $row = $db->fetch_row($resql); + if ($row) + { + //if ($row[1]!=-1 && ($row[1]!=3 || $row[2]!=1)) + { + $vals[$row[1]]=$row[0]; + $totalinprocess+=$row[0]; + } + $total+=$row[0]; + } + $i++; + } + $db->free($resql); + + print '<table class="noborder nohover" width="100%">'; + print '<tr class="liste_titre"><td colspan="2">'.$langs->trans("Statistics").' - '.$langs->trans("OpportunitiesStatusForOpenedProjects").'</td></tr>'."\n"; + $var=true; + $listofstatus=array_keys($listofoppstatus); + foreach ($listofstatus as $status) + { + $labelstatus = ''; + + $code = dol_getIdFromCode($db, $status, 'c_lead_status', 'rowid', 'code'); + if ($code) $labelstatus = $langs->trans("OppStatus".$code); + if (empty($labelstatus)) $labelstatus=$listofopplabel[$status]; + + $labelstatus .= ' ('.$langs->trans("Coeff").': '.$listofoppstatus[$status].')'; + + $dataseries[]=array('label'=>$labelstatus,'data'=>(isset($vals[$status])?(int) $vals[$status]:0)); + if (! $conf->use_javascript_ajax) + { + $var=!$var; + print "<tr ".$bc[$var].">"; + print '<td>'.$labelstatus.'</td>'; + print '<td align="right"><a href="list.php?statut='.$status.'">'.(isset($vals[$status])?$vals[$status]:0).'</a></td>'; + print "</tr>\n"; + } + } + if ($conf->use_javascript_ajax) + { + print '<tr class="impair"><td align="center" colspan="2">'; + $data=array('series'=>$dataseries); + dol_print_graph('stats',400,180,$data,1,'pie',1); + print '</td></tr>'; + } + //if ($totalinprocess != $total) + //print '<tr class="liste_total"><td>'.$langs->trans("Total").' ('.$langs->trans("CustomersOrdersRunning").')</td><td align="right">'.$totalinprocess.'</td></tr>'; + print '<tr class="liste_total"><td>'.$langs->trans("Total").'</td><td align="right">'.$total.'</td></tr>'; + print "</table><br>"; + } + else + { + dol_print_error($db); + } +} + + // List of draft projects -print_projecttasks_array($db,$socid,$projectsListId,0,0); +print_projecttasks_array($db,$form,$socid,$projectsListId,0,0,$listofoppstatus); print '</div><div class="fichetwothirdright"><div class="ficheaddleft">'; @@ -103,15 +209,16 @@ print '</div><div class="fichetwothirdright"><div class="ficheaddleft">'; print '<table class="noborder" width="100%">'; print '<tr class="liste_titre">'; -print_liste_field_titre($langs->trans("ThirdParties"),$_SERVER["PHP_SELF"],"s.nom","","","",$sortfield,$sortorder); +print_liste_field_titre($langs->trans("OpenedProjectsByThirdparties"),$_SERVER["PHP_SELF"],"s.nom","","","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("NbOfProjects"),"","","","",'align="right"',$sortfield,$sortorder); print "</tr>\n"; -$sql = "SELECT count(p.rowid) as nb"; +$sql = "SELECT COUNT(p.rowid) as nb, SUM(p.opp_amount)"; $sql.= ", s.nom as name, s.rowid as socid"; $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid"; $sql.= " WHERE p.entity = ".$conf->entity; +$sql.= " AND p.fk_statut = 1"; if ($mine || empty($user->rights->projet->all->lire)) $sql.= " AND p.rowid IN (".$projectsListId.")"; if ($socid) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".$socid.")"; $sql.= " GROUP BY s.nom, s.rowid"; @@ -140,7 +247,7 @@ if ( $resql ) print $langs->trans("OthersNotLinkedToThirdParty"); } print '</td>'; - print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/list.php?socid='.$obj->socid.'">'.$obj->nb.'</a></td>'; + print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/list.php?socid='.$obj->socid.'&search_status=1">'.$obj->nb.'</a></td>'; print "</tr>\n"; $i++; @@ -155,141 +262,14 @@ else print "</table>"; -print '</div></div></div>'; +print '<br>'; -if (empty($conf->global->PROJECT_HIDE_TASKS)) -{ - // Tasks for all resources of all opened projects and time spent for each task/resource - print '<div class="fichecenter">'; - - $max = (empty($conf->global->PROJECT_LIMIT_TASK_PROJECT_AREA)?1000:$conf->global->PROJECT_LIMIT_TASK_PROJECT_AREA); +print_projecttasks_array($db,$form,$socid,$projectsListId,0,1,$listofoppstatus); - $sql = "SELECT p.ref, p.title, p.rowid as projectid, p.fk_statut as status, p.fk_opp_status as opp_status, t.label, t.rowid as taskid, t.planned_workload, t.duration_effective, t.progress, t.dateo, t.datee, SUM(tasktime.task_duration) as timespent"; - $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on p.fk_soc = s.rowid"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task_time as tasktime on tasktime.fk_task = t.rowid"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on tasktime.fk_user = u.rowid"; - $sql.= " WHERE p.entity = ".$conf->entity; - if ($mine || empty($user->rights->projet->all->lire)) $sql.= " AND p.rowid IN (".$projectsListId.")"; - if ($socid) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".$socid.")"; - $sql.= " AND p.fk_statut=1"; - $sql.= " GROUP BY p.ref, p.title, p.rowid, t.label, t.rowid, t.planned_workload, t.duration_effective, t.progress, t.dateo, t.datee"; - $sql.= " ORDER BY t.dateo desc, t.rowid desc, t.datee"; - $sql.= $db->plimit($max+1); // We want more to know if we have more than limit - $var=true; - dol_syslog('projet:index.php: affectationpercent', LOG_DEBUG); - $resql = $db->query($sql); - if ( $resql ) - { - $num = $db->num_rows($resql); - $i = 0; - - print '<br>'; - - print_fiche_titre($langs->trans("TasksOnOpenedProject"),'','').'<br>'; - - print '<table class="noborder" width="100%">'; - print '<tr class="liste_titre">'; - //print '<th>'.$langs->trans('TaskRessourceLinks').'</th>'; - print '<th>'.$langs->trans('Projects').'</th>'; - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print '<th>'.$langs->trans('OpportunityStatus').'</th>'; - print '<th>'.$langs->trans('Task').'</th>'; - print '<th>'.$langs->trans('DateStart').'</th>'; - print '<th>'.$langs->trans('DateEnd').'</th>'; - print '<th align="right">'.$langs->trans('PlannedWorkload').'</th>'; - print '<th align="right">'.$langs->trans("ProgressDeclared").'</td>'; - print '<th align="right">'.$langs->trans('TimeSpent').'</th>'; - print '<th align="right">'.$langs->trans("ProgressCalculated").'</td>'; - print '</tr>'; - - while ($i < $num && $i < $max) - { - $obj = $db->fetch_object($resql); - $var=!$var; - - $username=''; - if ($obj->userid && $userstatic->id != $obj->userid) // We have a user and it is not last loaded user - { - $result=$userstatic->fetch($obj->userid); - if (! $result) $userstatic->id=0; - } - if ($userstatic->id) $username = $userstatic->getNomUrl(0,0); - - print "<tr ".$bc[$var].">"; - //print '<td>'.$username.'</td>'; - print '<td>'; - $projectstatic->id=$obj->projectid; - $projectstatic->ref=$obj->ref; - $projectstatic->title=$obj->title; - print $projectstatic->getNomUrl(1,'',16); - //print '<a href="'.DOL_URL_ROOT.'/projet/card.php?id='.$obj->projectid.'">'.$obj->title.'</a>'; - print '</td>'; - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { - print '<td>'; - $code = dol_getIdFromCode($db, $obj->opp_status, 'c_lead_status', 'rowid', 'code'); - if ($code) print $langs->trans("OppStatus".$code); - print '</td>'; - } - print '<td>'; - if (! empty($obj->taskid)) - { - $tasktmp->id = $obj->taskid; - $tasktmp->ref = $obj->label; - print $tasktmp->getNomUrl(1,'withproject'); - } - else print $langs->trans("NoTasks"); - print '</td>'; - print '<td>'.dol_print_date($db->jdate($obj->dateo),'day').'</td>'; - print '<td>'.dol_print_date($db->jdate($obj->datee),'day').'</td>'; - print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$obj->taskid.'&withproject=1">'; - print convertSecondToTime($obj->planned_workload, 'all'); - print '</a></td>'; - print '<td align="right">'; - print ($obj->taskid>0)?$obj->progress.'%':''; - print '</td>'; - print '<td align="right"><a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$obj->taskid.'&withproject=1">'; - print convertSecondToTime($obj->timespent, 'all'); - print '</a></td>'; - print '<td align="right">'; - if (! empty($obj->taskid)) - { - if (empty($obj->planned_workload) > 0) { - $percentcompletion = $langs->trans("WorkloadNotDefined"); - } else { - $percentcompletion = intval($obj->duration_effective*100/$obj->planned_workload).'%'; - } - } - print $percentcompletion; - print '</td>'; - print "</tr>\n"; - - $i++; - } - - if ($num > $max) - { - $colspan=6; - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) $colspan++; - print '<tr><td colspan="'.$colspan.'">'.$langs->trans("WarningTooManyDataPleaseUseMoreFilters").'</td></tr>'; - } - - print "</table>"; - - - $db->free($resql); - } - else - { - dol_print_error($db); - } - - print '</div>'; -} +print '</div></div></div>'; llxFooter(); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index abe0a5858fcb6ef4d4b994e550fc551b7fbe2fee..cb70773dcd8bfd05de0eb08227e9b15a06e88e28 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -242,16 +242,19 @@ if ($resql) if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); + $moreforfilter.='<div class="divsearchfield">'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.=' '; + $moreforfilter.=$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, 1, 'maxwidth300'); + $moreforfilter.='</div>'; } // If the user can view prospects other than his' if (($user->rights->societe->client->voir || $socid) && !$mine) { - $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; - $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + $moreforfilter.='<div class="divsearchfield">'; + $moreforfilter.=$langs->trans('ProjectsWithThisUserAsContact'). ': '; + $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + $moreforfilter.='</div>'; } if (! empty($moreforfilter)) { @@ -274,12 +277,10 @@ if ($resql) if (! empty($conf->global->PROJECT_LIST_SHOW_STARTDATE)) print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"p.dateo","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateEnd"),$_SERVER["PHP_SELF"],"p.datee","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Visibility"),$_SERVER["PHP_SELF"],"p.public","",$param,"",$sortfield,$sortorder); - $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print_liste_field_titre($langs->trans("OpportunityStatus"),$_SERVER["PHP_SELF"],'p.fk_opp_statut',"",$param,'',$sortfield,$sortorder); + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) print_liste_field_titre($langs->trans("OpportunityStatus"),$_SERVER["PHP_SELF"],'p.fk_opp_status',"",$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],'p.fk_statut',"",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); print "</tr>\n"; @@ -401,6 +402,7 @@ if ($resql) $userstatic->id=$val['id']; $userstatic->lastname=$val['lastname']; $userstatic->firstname=$val['firstname']; + $userstatic->email=$val['email']; print $userstatic->getNomUrl(1); $j++; if ($j < $nbofsalesrepresentative) print ', '; diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/index.php index bc184133954af94f76e03a8958b6f84c51afe248..02a8eddbc5915ec5ed776beb838d9671d725ff1b 100644 --- a/htdocs/projet/tasks/index.php +++ b/htdocs/projet/tasks/index.php @@ -41,7 +41,6 @@ $search_task_label=GETPOST('search_task_label'); $search_project_user=GETPOST('search_project_user'); $search_task_user=GETPOST('search_task_user'); - // Security check $socid=0; if ($user->societe_id > 0) $socid = $user->societe_id; @@ -63,7 +62,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_task_ref=""; $search_task_label=""; } -if (empty($search_status)) $search_status=1; +if (empty($search_status) && $search_status == '') $search_status=1; /* @@ -108,8 +107,8 @@ $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1,$so // Get list of tasks in tasksarray and taskarrayfiltered // We need all tasks (even not limited to a user because a task assigned to a user can have a parent that is not assigned to him and we need such parents). $morewherefilter=''; -if ($search_task_ref) $morewherefilter.=natural_search('t.ref', $search_task_ref, 0, 1); -if ($search_task_label) $morewherefilter.=natural_search('t.label', $search_task_label, 0, 1); +if ($search_task_ref) $morewherefilter.=natural_search('t.ref', $search_task_ref); +if ($search_task_label) $morewherefilter.=natural_search('t.label', $search_task_label); $tasksarray=$taskstatic->getTasksArray(0, 0, $projectstatic->id, $socid, 0, $search_project, $search_status, $morewherefilter, $search_project_user, $search_task_user); // We load also tasks limited to a particular user $tasksrole=($mine ? $taskstatic->getUserRolesForProjectsOrTasks(0,$user,$projectstatic->id,0) : ''); @@ -121,22 +120,26 @@ print '<table class="noborder" width="100%">'; // If the user can view users if ($user->rights->user->user->lire) { - $moreforfilter.=($moreforfilter?' ':''); + $moreforfilter.='<div class="divsearchfield">'; $moreforfilter.=$langs->trans('ProjectsWithThisUserAsContact'). ' '; - $moreforfilter.=$form->select_dolusers($search_project_user,'search_project_user',1); + $moreforfilter.=$form->select_dolusers($search_project_user, 'search_project_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + $moreforfilter.='</div>'; } if ($user->rights->user->user->lire) { - $moreforfilter.=($moreforfilter?' ':''); + $moreforfilter.='<div class="divsearchfield">'; $moreforfilter.=$langs->trans('TasksWithThisUserAsContact'). ' '; - $moreforfilter.=$form->select_dolusers($search_task_user,'search_task_user',1); + $moreforfilter.=$form->select_dolusers($search_task_user, 'search_task_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + $moreforfilter.='</div>'; } if (! empty($moreforfilter)) { - print '<tr class="liste_titre">'; - print '<td class="liste_titre" colspan="10">'; - print $moreforfilter; - print '</td></tr>'; + print '<div class="liste_titre">'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '</div>'; } print '<tr class="liste_titre">'; @@ -165,10 +168,10 @@ foreach($projectstatic->statuts_short as $key => $val) $listofstatus[$key]=$lang print $form->selectarray('search_status', $listofstatus, $search_status); print '</td>'; print '<td class="liste_titre">'; -print '<input type="text" class="flat" name="search_task_ref" value="'.$search_task_ref.'" size="4">'; +print '<input type="text" class="flat" name="search_task_ref" value="'.dol_escape_htmltag($search_task_ref).'" size="4">'; print '</td>'; print '<td class="liste_titre">'; -print '<input type="text" class="flat" name="search_task_label" value="'.$search_task_label.'" size="8">'; +print '<input type="text" class="flat" name="search_task_label" value="'.dol_escape_htmltag($search_task_label).'" size="8">'; print '</td>'; print '<td class="liste_titre" colspan="5">'; print ' '; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 06b369e0141b7fb165d5f7dc97a430e86260393c..2c7d3f2505327c8f77cf91f6b57bed8683a02e8a 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1652,7 +1652,7 @@ class Societe extends CommonObject $reparray=array(); - $sql = "SELECT u.rowid, u.lastname, u.firstname"; + $sql = "SELECT u.rowid, u.lastname, u.firstname, u.email"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc, ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE u.rowid = sc.fk_user AND sc.fk_soc =".$this->id; $sql.= " AND entity in (0, ".$conf->entity.")"; @@ -1668,6 +1668,7 @@ class Societe extends CommonObject $reparray[$i]['id']=$obj->rowid; $reparray[$i]['lastname']=$obj->lastname; $reparray[$i]['firstname']=$obj->firstname; + $reparray[$i]['email']=$obj->email; $i++; } return $reparray; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index ba094124462b723ab193214b5c031bb1f79afb46..afe0e4502f1eb5940eed771949ee726ad31b06c8 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -2547,6 +2547,8 @@ a.impayee:hover { font-weight: bold; color: #550000; } .legendColorBox, .legendLabel { border: none !important; } div.dolgraph div.legend, div.dolgraph div.legend div { background-color: rgba(255,255,255,0) !important; } div.dolgraph div.legend table tbody tr { height: auto; } +td.legendColorBox { padding: 2px 2px 2px 0 !important; } +td.legendLabel { padding: 2px 2px 2px 0 !important; } .photo { border: 0px;