forked from Wavyzz/dolibarr
# Qual: Fix spelling for crypted and referer. The proper spelling is encrypted and referrer, but the code has some occurences where referer and crypted need to be maintained. To make verification easier, this spelling correction is limited to mostly these corrections and some minor translations and a only a few other corrections. crypted and referer are added as exceptions for spelling after this fix. Co-authored-by: Laurent Destailleur <eldy@destailleur.fr>
1693 lines
64 KiB
PHP
1693 lines
64 KiB
PHP
<?php
|
|
/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
|
* Copyright (C) 2004-2020 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
|
|
* Copyright (C) 2012-2016 Juanjo Menent <jmenent@2byte.es>
|
|
* Copyright (C) 2015-2021 Alexandre Spangaro <aspangaro@open-dsi.fr>
|
|
* Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
|
|
* Copyright (C) 2016 Josep Lluís Amador <joseplluis@lliuretic.cat>
|
|
* Copyright (C) 2021-2023 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
|
|
* Copyright (C) 2021 Noé Cendrier <noe.cendrier@altairis.fr>
|
|
* Copyright (C) 2023 Frédéric France wfrederic.france@netlogic.fr>
|
|
* 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
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/projet/element.php
|
|
* \ingroup projet
|
|
* \brief Page of project referrers
|
|
*/
|
|
|
|
// Load Dolibarr environment
|
|
require '../main.inc.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
|
|
|
|
if (isModEnabled('agenda')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
|
|
}
|
|
if (isModEnabled('banque')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php';
|
|
}
|
|
if (isModEnabled('categorie')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
|
|
}
|
|
if (isModEnabled('commande')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
|
|
}
|
|
if (isModEnabled('contrat')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
|
|
}
|
|
if (isModEnabled('deplacement')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/compta/deplacement/class/deplacement.class.php';
|
|
}
|
|
if (isModEnabled('don')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
|
|
}
|
|
if (isModEnabled('expedition')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
|
|
}
|
|
if (isModEnabled('expensereport')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
|
|
}
|
|
if (isModEnabled('facture')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php';
|
|
}
|
|
if (isModEnabled('ficheinter')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
|
|
}
|
|
if (isModEnabled('loan')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/loan/class/loanschedule.class.php';
|
|
}
|
|
if (isModEnabled('mrp')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
|
|
}
|
|
if (isModEnabled('propal')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
|
|
}
|
|
if (isModEnabled('salaries')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
|
|
}
|
|
if (isModEnabled('stock')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php';
|
|
}
|
|
if (isModEnabled('supplier_invoice')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
|
|
}
|
|
if (isModEnabled('supplier_order')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
|
|
}
|
|
if (isModEnabled('supplier_proposal')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
|
|
}
|
|
if (isModEnabled('tax')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
|
|
}
|
|
if (isModEnabled('stocktransfer')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/product/stock/stocktransfer/class/stocktransfer.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/product/stock/stocktransfer/class/stocktransferline.class.php';
|
|
}
|
|
|
|
|
|
|
|
// Load translation files required by the page
|
|
$langs->loadLangs(array('projects', 'companies', 'suppliers', 'compta'));
|
|
if (isModEnabled('facture')) {
|
|
$langs->load("bills");
|
|
}
|
|
if (isModEnabled('commande')) {
|
|
$langs->load("orders");
|
|
}
|
|
if (isModEnabled("propal")) {
|
|
$langs->load("propal");
|
|
}
|
|
if (isModEnabled('ficheinter')) {
|
|
$langs->load("interventions");
|
|
}
|
|
if (isModEnabled('deplacement')) {
|
|
$langs->load("trips");
|
|
}
|
|
if (isModEnabled('expensereport')) {
|
|
$langs->load("trips");
|
|
}
|
|
if (isModEnabled('don')) {
|
|
$langs->load("donations");
|
|
}
|
|
if (isModEnabled('loan')) {
|
|
$langs->load("loan");
|
|
}
|
|
if (isModEnabled('salaries')) {
|
|
$langs->load("salaries");
|
|
}
|
|
if (isModEnabled('mrp')) {
|
|
$langs->load("mrp");
|
|
}
|
|
if (isModEnabled('eventorganization')) {
|
|
$langs->load("eventorganization");
|
|
}
|
|
//if (isModEnabled('stocktransfer')) {
|
|
// $langs->load("stockstransfer");
|
|
//}
|
|
|
|
$id = GETPOST('id', 'int');
|
|
$ref = GETPOST('ref', 'alpha');
|
|
$action = GETPOST('action', 'aZ09');
|
|
$datesrfc = GETPOST('datesrfc');
|
|
$dateerfc = GETPOST('dateerfc');
|
|
$dates = dol_mktime(0, 0, 0, GETPOST('datesmonth'), GETPOST('datesday'), GETPOST('datesyear'));
|
|
$datee = dol_mktime(23, 59, 59, GETPOST('dateemonth'), GETPOST('dateeday'), GETPOST('dateeyear'));
|
|
if (empty($dates) && !empty($datesrfc)) {
|
|
$dates = dol_stringtotime($datesrfc);
|
|
}
|
|
if (empty($datee) && !empty($dateerfc)) {
|
|
$datee = dol_stringtotime($dateerfc);
|
|
}
|
|
if (!GETPOSTISSET('datesrfc') && !GETPOSTISSET('datesday') && getDolGlobalString('PROJECT_LINKED_ELEMENT_DEFAULT_FILTER_YEAR')) {
|
|
$new = dol_now();
|
|
$tmp = dol_getdate($new);
|
|
//$datee=$now
|
|
//$dates=dol_time_plus_duree($datee, -1, 'y');
|
|
$dates = dol_get_first_day($tmp['year'], 1);
|
|
}
|
|
if ($id == '' && $ref == '') {
|
|
setEventMessage($langs->trans('ErrorBadParameters'), 'errors');
|
|
header('Location: list.php');
|
|
exit();
|
|
}
|
|
|
|
$mine = GETPOST('mode') == 'mine' ? 1 : 0;
|
|
//if (! $user->rights->projet->all->lire) $mine=1; // Special for projects
|
|
|
|
$object = new Project($db);
|
|
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once
|
|
if (getDolGlobalString('PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($object, 'fetchComments') && empty($object->comments)) {
|
|
$object->fetchComments();
|
|
}
|
|
|
|
// Security check
|
|
$socid = $object->socid;
|
|
//if ($user->socid > 0) $socid = $user->socid; // For external user, no check is done on company because readability is managed by public status of project and assignement.
|
|
$result = restrictedArea($user, 'projet', $object->id, 'projet&project');
|
|
|
|
$hookmanager->initHooks(array('projectOverview'));
|
|
|
|
|
|
/*
|
|
* View
|
|
*/
|
|
|
|
$title = $langs->trans('ProjectReferers').' - '.$object->ref.' '.$object->name;
|
|
if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/projectnameonly/', $conf->global->MAIN_HTML_TITLE) && $object->name) {
|
|
$title = $object->ref.' '.$object->name.' - '.$langs->trans('ProjectReferers');
|
|
}
|
|
|
|
$help_url = 'EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos|DE:Modul_Projekte';
|
|
|
|
llxHeader('', $title, $help_url);
|
|
|
|
$form = new Form($db);
|
|
$formproject = new FormProjets($db);
|
|
$formfile = new FormFile($db);
|
|
|
|
$userstatic = new User($db);
|
|
|
|
// To verify role of users
|
|
$userAccess = $object->restrictedProjectArea($user);
|
|
|
|
$head = project_prepare_head($object);
|
|
print dol_get_fiche_head($head, 'element', $langs->trans("Project"), -1, ($object->public ? 'projectpub' : 'project'));
|
|
|
|
|
|
// Project card
|
|
|
|
if (!empty($_SESSION['pageforbacktolist']) && !empty($_SESSION['pageforbacktolist']['project'])) {
|
|
$tmpurl = $_SESSION['pageforbacktolist']['project'];
|
|
$tmpurl = preg_replace('/__SOCID__/', $object->socid, $tmpurl);
|
|
$linkback = '<a href="'.$tmpurl.(preg_match('/\?/', $tmpurl) ? '&' : '?'). 'restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
|
|
} else {
|
|
$linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
|
|
}
|
|
|
|
$morehtmlref = '<div class="refidno">';
|
|
// Title
|
|
$morehtmlref .= $object->title;
|
|
// Thirdparty
|
|
if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
|
|
$morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1, 'project');
|
|
}
|
|
$morehtmlref .= '</div>';
|
|
|
|
// Define a complementary filter for search of next/prev ref.
|
|
if (!$user->hasRight('projet', 'all', 'lire')) {
|
|
$objectsListId = $object->getProjectsAuthorizedForUser($user, 0, 0);
|
|
$object->next_prev_filter = "te.rowid IN (".$db->sanitize(count($objectsListId) ? join(',', array_keys($objectsListId)) : '0').")";
|
|
}
|
|
|
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
|
|
|
|
|
print '<div class="fichecenter">';
|
|
print '<div class="fichehalfleft">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
|
|
print '<table class="border tableforfield centpercent">';
|
|
|
|
// Usage
|
|
if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
|
|
print '<tr><td class="tdtop">';
|
|
print $langs->trans("Usage");
|
|
print '</td>';
|
|
print '<td>';
|
|
if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
|
|
print '<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_opportunity ? ' checked="checked"' : '')).'"> ';
|
|
$htmltext = $langs->trans("ProjectFollowOpportunity");
|
|
print $form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext);
|
|
print '<br>';
|
|
}
|
|
if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
|
|
print '<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_task ? ' checked="checked"' : '')).'"> ';
|
|
$htmltext = $langs->trans("ProjectFollowTasks");
|
|
print $form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext);
|
|
print '<br>';
|
|
}
|
|
if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
|
|
print '<input type="checkbox" disabled name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_bill_time ? ' checked="checked"' : '')).'"> ';
|
|
$htmltext = $langs->trans("ProjectBillTimeDescription");
|
|
print $form->textwithpicto($langs->trans("BillTime"), $htmltext);
|
|
print '<br>';
|
|
}
|
|
if (isModEnabled('eventorganization')) {
|
|
print '<input type="checkbox" disabled name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_organize_event ? ' checked="checked"' : '')).'"> ';
|
|
$htmltext = $langs->trans("EventOrganizationDescriptionLong");
|
|
print $form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext);
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Visibility
|
|
print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
|
|
if ($object->public) {
|
|
print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
|
|
print $langs->trans('SharedProject');
|
|
} else {
|
|
print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
|
|
print $langs->trans('PrivateProject');
|
|
}
|
|
print '</td></tr>';
|
|
|
|
if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
|
|
// Opportunity status
|
|
print '<tr><td>'.$langs->trans("OpportunityStatus").'</td><td>';
|
|
$code = dol_getIdFromCode($db, $object->opp_status, 'c_lead_status', 'rowid', 'code');
|
|
if ($code) {
|
|
print $langs->trans("OppStatus".$code);
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Opportunity percent
|
|
print '<tr><td>'.$langs->trans("OpportunityProbability").'</td><td>';
|
|
if (!is_null($object->opp_percent) && strcmp($object->opp_percent, '')) {
|
|
print price($object->opp_percent, '', $langs, 1, 0).' %';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Opportunity Amount
|
|
print '<tr><td>'.$langs->trans("OpportunityAmount").'</td><td>';
|
|
if (!is_null($object->opp_amount) && strcmp($object->opp_amount, '')) {
|
|
print '<span class="amount">'.price($object->opp_amount, '', $langs, 1, 0, 0, $conf->currency).'</span>';
|
|
if (strcmp($object->opp_percent, '')) {
|
|
print ' <span title="'.dol_escape_htmltag($langs->trans('OpportunityWeightedAmount')).'"><span class="opacitymedium">'.$langs->trans("Weighted").'</span>: <span class="amount">'.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).'</span></span>';
|
|
}
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Budget
|
|
print '<tr><td>'.$langs->trans("Budget").'</td><td>';
|
|
if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) {
|
|
print '<span class="amount">'.price($object->budget_amount, '', $langs, 1, 0, 0, $conf->currency).'</span>';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Date start - end project
|
|
print '<tr><td>'.$langs->trans("Dates").'</td><td>';
|
|
$start = dol_print_date($object->date_start, 'day');
|
|
print($start ? $start : '?');
|
|
$end = dol_print_date($object->date_end, 'day');
|
|
print ' - ';
|
|
print($end ? $end : '?');
|
|
if ($object->hasDelay()) {
|
|
print img_warning("Late");
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Other attributes
|
|
$cols = 2;
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
print '<div class="fichehalfright">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
|
|
print '<table class="border tableforfield centpercent">';
|
|
|
|
// Description
|
|
print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
|
|
print dol_htmlentitiesbr($object->description);
|
|
print '</td></tr>';
|
|
|
|
// Categories
|
|
if (isModEnabled('categorie')) {
|
|
print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
|
|
print $form->showCategories($object->id, Categorie::TYPE_PROJECT, 1);
|
|
print "</td></tr>";
|
|
}
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
print '</div>';
|
|
|
|
print '<div class="clearboth"></div>';
|
|
|
|
print dol_get_fiche_end();
|
|
|
|
print '<br>';
|
|
|
|
/*
|
|
* Referrer types
|
|
*/
|
|
|
|
$listofreferent = array(
|
|
'entrepot'=>array(
|
|
'name'=>"Warehouse",
|
|
'title'=>"ListWarehouseAssociatedProject",
|
|
'class'=>'Entrepot',
|
|
'table'=>'entrepot',
|
|
'datefieldname'=>'date_entrepot',
|
|
'urlnew'=>DOL_URL_ROOT.'/product/stock/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'entrepot',
|
|
'buttonnew'=>'AddWarehouse',
|
|
'project_field'=>'fk_project',
|
|
'testnew'=>$user->hasRight('stock', 'creer'),
|
|
'test'=>isModEnabled('stock') && $user->hasRight('stock', 'lire') && getDolGlobalString('WAREHOUSE_ASK_WAREHOUSE_DURING_PROJECT')
|
|
),
|
|
'propal'=>array(
|
|
'name'=>"Proposals",
|
|
'title'=>"ListProposalsAssociatedProject",
|
|
'class'=>'Propal',
|
|
'table'=>'propal',
|
|
'datefieldname'=>'datep',
|
|
'urlnew'=>DOL_URL_ROOT.'/comm/propal/card.php?action=create&origin=project&originid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'propal',
|
|
'buttonnew'=>'AddProp',
|
|
'testnew'=>$user->hasRight('propal', 'creer'),
|
|
'test'=>isModEnabled('propal') && $user->hasRight('propal', 'lire')
|
|
),
|
|
'order'=>array(
|
|
'name'=>"CustomersOrders",
|
|
'title'=>"ListOrdersAssociatedProject",
|
|
'class'=>'Commande',
|
|
'table'=>'commande',
|
|
'datefieldname'=>'date_commande',
|
|
'urlnew'=>DOL_URL_ROOT.'/commande/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'orders',
|
|
'buttonnew'=>'CreateOrder',
|
|
'testnew'=>$user->hasRight('commande', 'creer'),
|
|
'test'=>isModEnabled('commande') && $user->hasRight('commande', 'lire')
|
|
),
|
|
'invoice'=>array(
|
|
'name'=>"CustomersInvoices",
|
|
'title'=>"ListInvoicesAssociatedProject",
|
|
'class'=>'Facture',
|
|
'margin'=>'add',
|
|
'table'=>'facture',
|
|
'datefieldname'=>'datef',
|
|
'urlnew'=>DOL_URL_ROOT.'/compta/facture/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'bills',
|
|
'buttonnew'=>'CreateBill',
|
|
'testnew'=>$user->hasRight('facture', 'creer'),
|
|
'test'=>isModEnabled('facture') && $user->hasRight('facture', 'lire')
|
|
),
|
|
'invoice_predefined'=>array(
|
|
'name'=>"PredefinedInvoices",
|
|
'title'=>"ListPredefinedInvoicesAssociatedProject",
|
|
'class'=>'FactureRec',
|
|
'table'=>'facture_rec',
|
|
'datefieldname'=>'datec',
|
|
'urlnew'=>DOL_URL_ROOT.'/compta/facture/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'bills',
|
|
'buttonnew'=>'CreateBill',
|
|
'testnew'=>$user->hasRight('facture', 'creer'),
|
|
'test'=>isModEnabled('facture') && $user->hasRight('facture', 'lire')
|
|
),
|
|
'proposal_supplier'=>array(
|
|
'name'=>"SupplierProposals",
|
|
'title'=>"ListSupplierProposalsAssociatedProject",
|
|
'class'=>'SupplierProposal',
|
|
'table'=>'supplier_proposal',
|
|
'datefieldname'=>'date_valid',
|
|
'urlnew'=>DOL_URL_ROOT.'/supplier_proposal/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id), // No socid parameter here, the socid is often the customer and we create a supplier object
|
|
'lang'=>'supplier_proposal',
|
|
'buttonnew'=>'AddSupplierProposal',
|
|
'testnew'=>$user->hasRight('supplier_proposal', 'creer'),
|
|
'test'=>isModEnabled('supplier_proposal') && $user->hasRight('supplier_proposal', 'lire')
|
|
),
|
|
'order_supplier'=>array(
|
|
'name'=>"SuppliersOrders",
|
|
'title'=>"ListSupplierOrdersAssociatedProject",
|
|
'class'=>'CommandeFournisseur',
|
|
'table'=>'commande_fournisseur',
|
|
'datefieldname'=>'date_commande',
|
|
'urlnew'=>DOL_URL_ROOT.'/fourn/commande/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id), // No socid parameter here, the socid is often the customer and we create a supplier object
|
|
'lang'=>'suppliers',
|
|
'buttonnew'=>'AddSupplierOrder',
|
|
'testnew'=>$user->hasRight('fournisseur', 'commande', 'creer') || $user->hasRight('supplier_order', 'creer'),
|
|
'test'=>isModEnabled('supplier_order') && $user->hasRight('fournisseur', 'commande', 'lire') || $user->hasRight('supplier_order', 'lire')
|
|
),
|
|
'invoice_supplier'=>array(
|
|
'name'=>"BillsSuppliers",
|
|
'title'=>"ListSupplierInvoicesAssociatedProject",
|
|
'class'=>'FactureFournisseur',
|
|
'margin'=>'minus',
|
|
'table'=>'facture_fourn',
|
|
'datefieldname'=>'datef',
|
|
'urlnew'=>DOL_URL_ROOT.'/fourn/facture/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id), // No socid parameter here, the socid is often the customer and we create a supplier object
|
|
'lang'=>'suppliers',
|
|
'buttonnew'=>'AddSupplierInvoice',
|
|
'testnew'=>$user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer'),
|
|
'test'=>isModEnabled('supplier_invoice') && $user->hasRight('fournisseur', 'facture', 'lire') || $user->hasRight('supplier_invoice', 'lire')
|
|
),
|
|
'contract'=>array(
|
|
'name'=>"Contracts",
|
|
'title'=>"ListContractAssociatedProject",
|
|
'class'=>'Contrat',
|
|
'table'=>'contrat',
|
|
'datefieldname'=>'date_contrat',
|
|
'urlnew'=>DOL_URL_ROOT.'/contrat/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'contracts',
|
|
'buttonnew'=>'AddContract',
|
|
'testnew'=>$user->hasRight('contrat', 'creer'),
|
|
'test'=>isModEnabled('contrat') && $user->hasRight('contrat', 'lire')
|
|
),
|
|
'intervention'=>array(
|
|
'name'=>"Interventions",
|
|
'title'=>"ListFichinterAssociatedProject",
|
|
'class'=>'Fichinter',
|
|
'table'=>'fichinter',
|
|
'datefieldname'=>'date_valid',
|
|
'disableamount'=>0,
|
|
'margin'=>'',
|
|
'urlnew'=>DOL_URL_ROOT.'/fichinter/card.php?action=create&origin=project&originid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'interventions',
|
|
'buttonnew'=>'AddIntervention',
|
|
'testnew'=>$user->hasRight('ficheinter', 'creer'),
|
|
'test'=>isModEnabled('ficheinter') && $user->hasRight('ficheinter', 'lire')
|
|
),
|
|
'shipping'=>array(
|
|
'name'=>"Shippings",
|
|
'title'=>"ListShippingAssociatedProject",
|
|
'class'=>'Expedition',
|
|
'table'=>'expedition',
|
|
'datefieldname'=>'date_valid',
|
|
'urlnew'=>DOL_URL_ROOT.'/expedition/card.php?action=create&origin=project&originid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'sendings',
|
|
'buttonnew'=>'CreateShipment',
|
|
'testnew'=>0,
|
|
'test'=>isModEnabled('expedition') && $user->hasRight('expedition', 'lire')
|
|
),
|
|
'mrp'=>array(
|
|
'name'=>"MO",
|
|
'title'=>"ListMOAssociatedProject",
|
|
'class'=>'Mo',
|
|
'table'=>'mrp_mo',
|
|
'datefieldname'=>'date_valid',
|
|
'urlnew'=>DOL_URL_ROOT.'/mrp/mo_card.php?action=create&origin=project&originid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'mrp',
|
|
'buttonnew'=>'CreateMO',
|
|
'testnew'=>$user->hasRight('mrp', 'write'),
|
|
'project_field'=>'fk_project',
|
|
'nototal'=>1,
|
|
'test'=>isModEnabled('mrp') && $user->hasRight('mrp', 'read')
|
|
),
|
|
'trip'=>array(
|
|
'name'=>"TripsAndExpenses",
|
|
'title'=>"ListExpenseReportsAssociatedProject",
|
|
'class'=>'Deplacement',
|
|
'table'=>'deplacement',
|
|
'datefieldname'=>'dated',
|
|
'margin'=>'minus',
|
|
'disableamount'=>1,
|
|
'urlnew'=>DOL_URL_ROOT.'/deplacement/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'trips',
|
|
'buttonnew'=>'AddTrip',
|
|
'testnew'=>$user->hasRight('deplacement', 'creer'),
|
|
'test'=>isModEnabled('deplacement') && $user->hasRight('deplacement', 'lire')
|
|
),
|
|
'expensereport'=>array(
|
|
'name'=>"ExpenseReports",
|
|
'title'=>"ListExpenseReportsAssociatedProject",
|
|
'class'=>'ExpenseReportLine',
|
|
'table'=>'expensereport_det',
|
|
'datefieldname'=>'date',
|
|
'margin'=>'minus',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/expensereport/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'trips',
|
|
'buttonnew'=>'AddTrip',
|
|
'testnew'=>$user->hasRight('expensereport', 'creer'),
|
|
'test'=>isModEnabled('expensereport') && $user->hasRight('expensereport', 'lire')
|
|
),
|
|
'donation'=>array(
|
|
'name'=>"Donation",
|
|
'title'=>"ListDonationsAssociatedProject",
|
|
'class'=>'Don',
|
|
'margin'=>'add',
|
|
'table'=>'don',
|
|
'datefieldname'=>'datedon',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/don/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'donations',
|
|
'buttonnew'=>'AddDonation',
|
|
'testnew'=>$user->hasRight('don', 'creer'),
|
|
'test'=>isModEnabled('don') && $user->hasRight('don', 'lire')
|
|
),
|
|
'loan'=>array(
|
|
'name'=>"Loan",
|
|
'title'=>"ListLoanAssociatedProject",
|
|
'class'=>'Loan',
|
|
'margin'=>'add',
|
|
'table'=>'loan',
|
|
'datefieldname'=>'datestart',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/loan/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'loan',
|
|
'buttonnew'=>'AddLoan',
|
|
'testnew'=>$user->hasRight('loan', 'write'),
|
|
'test'=>isModEnabled('loan') && $user->hasRight('loan', 'read')
|
|
),
|
|
'chargesociales'=>array(
|
|
'name'=>"SocialContribution",
|
|
'title'=>"ListSocialContributionAssociatedProject",
|
|
'class'=>'ChargeSociales',
|
|
'margin'=>'minus',
|
|
'table'=>'chargesociales',
|
|
'datefieldname'=>'date_ech',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/compta/sociales/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'compta',
|
|
'buttonnew'=>'AddSocialContribution',
|
|
'testnew'=>$user->hasRight('tax', 'charges', 'lire'),
|
|
'test'=>isModEnabled('tax') && $user->hasRight('tax', 'charges', 'lire')
|
|
),
|
|
'project_task'=>array(
|
|
'name'=>"TaskTimeSpent",
|
|
'title'=>"ListTaskTimeUserProject",
|
|
'class'=>'Task',
|
|
'margin'=>'minus',
|
|
'table'=>'projet_task',
|
|
'datefieldname'=>'element_date',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/projet/tasks/time.php?withproject=1&action=createtime&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'buttonnew'=>'AddTimeSpent',
|
|
'testnew'=>$user->hasRight('project', 'creer'),
|
|
'test'=>isModEnabled('project') && $user->hasRight('projet', 'lire') && !getDolGlobalString('PROJECT_HIDE_TASKS')
|
|
),
|
|
'stock_mouvement'=>array(
|
|
'name'=>"MouvementStockAssociated",
|
|
'title'=>"ListMouvementStockProject",
|
|
'class'=>'StockTransfer',
|
|
'table'=>'stocktransfer_stocktransfer',
|
|
'datefieldname'=>'datem',
|
|
'margin'=>'minus',
|
|
'project_field'=>'fk_project',
|
|
'disableamount'=>0,
|
|
'test'=>isModEnabled('stock') && $user->hasRight('stock', 'mouvement', 'lire') && getDolGlobalString('STOCK_MOVEMENT_INTO_PROJECT_OVERVIEW')
|
|
),
|
|
'salaries'=>array(
|
|
'name'=>"Salaries",
|
|
'title'=>"ListSalariesAssociatedProject",
|
|
'class'=>'Salary',
|
|
'table'=>'salary',
|
|
'datefieldname'=>'datesp',
|
|
'margin'=>'minus',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/salaries/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'salaries',
|
|
'buttonnew'=>'AddSalary',
|
|
'testnew'=>$user->hasRight('salaries', 'write'),
|
|
'test'=>isModEnabled('salaries') && $user->hasRight('salaries', 'read')
|
|
),
|
|
'variouspayment'=>array(
|
|
'name'=>"VariousPayments",
|
|
'title'=>"ListVariousPaymentsAssociatedProject",
|
|
'class'=>'PaymentVarious',
|
|
'table'=>'payment_various',
|
|
'datefieldname'=>'datev',
|
|
'margin'=>'minus',
|
|
'disableamount'=>0,
|
|
'urlnew'=>DOL_URL_ROOT.'/compta/bank/various_payment/card.php?action=create&projectid='.$id.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'banks',
|
|
'buttonnew'=>'AddVariousPayment',
|
|
'testnew'=>$user->hasRight('banque', 'modifier'),
|
|
'test'=>isModEnabled("banque") && $user->hasRight('banque', 'lire') && !getDolGlobalString('BANK_USE_OLD_VARIOUS_PAYMENT')
|
|
),
|
|
/* No need for this, available on dedicated tab "Agenda/Events"
|
|
'agenda'=>array(
|
|
'name'=>"Agenda",
|
|
'title'=>"ListActionsAssociatedProject",
|
|
'class'=>'ActionComm',
|
|
'table'=>'actioncomm',
|
|
'datefieldname'=>'datep',
|
|
'disableamount'=>1,
|
|
'urlnew'=>DOL_URL_ROOT.'/comm/action/card.php?action=create&projectid='.$id.'&socid='.$socid.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$id),
|
|
'lang'=>'agenda',
|
|
'buttonnew'=>'AddEvent',
|
|
'testnew'=>$user->rights->agenda->myactions->create,
|
|
'test'=> isModEnabled('agenda') && $user->hasRight('agenda', 'myactions', 'read')),
|
|
*/
|
|
);
|
|
|
|
// Change rules for profit/benefit calculation
|
|
if (getDolGlobalString('PROJECT_ELEMENTS_FOR_PLUS_MARGIN')) {
|
|
foreach ($listofreferent as $key => $element) {
|
|
if ($listofreferent[$key]['margin'] == 'add') {
|
|
unset($listofreferent[$key]['margin']);
|
|
}
|
|
}
|
|
$newelementforplusmargin = explode(',', getDolGlobalString('PROJECT_ELEMENTS_FOR_PLUS_MARGIN'));
|
|
foreach ($newelementforplusmargin as $value) {
|
|
$listofreferent[trim($value)]['margin'] = 'add';
|
|
}
|
|
}
|
|
if (getDolGlobalString('PROJECT_ELEMENTS_FOR_MINUS_MARGIN')) {
|
|
foreach ($listofreferent as $key => $element) {
|
|
if ($listofreferent[$key]['margin'] == 'minus') {
|
|
unset($listofreferent[$key]['margin']);
|
|
}
|
|
}
|
|
$newelementforminusmargin = explode(',', getDolGlobalString('PROJECT_ELEMENTS_FOR_MINUS_MARGIN'));
|
|
foreach ($newelementforminusmargin as $value) {
|
|
$listofreferent[trim($value)]['margin'] = 'minus';
|
|
}
|
|
}
|
|
|
|
|
|
$parameters = array('listofreferent'=>$listofreferent);
|
|
$resHook = $hookmanager->executeHooks('completeListOfReferent', $parameters, $object, $action);
|
|
|
|
if (!empty($hookmanager->resArray)) {
|
|
$listofreferent = array_merge($listofreferent, $hookmanager->resArray);
|
|
}
|
|
|
|
if ($action == "addelement") {
|
|
$tablename = GETPOST("tablename");
|
|
$elementselectid = GETPOST("elementselect");
|
|
$result = $object->update_element($tablename, $elementselectid);
|
|
if ($result < 0) {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
}
|
|
} elseif ($action == "unlink") {
|
|
$tablename = GETPOST("tablename", "aZ09");
|
|
$projectField = GETPOSTISSET('projectfield') ? GETPOST('projectfield', 'aZ09') : 'fk_projet';
|
|
$elementselectid = GETPOST("elementselect", "int");
|
|
|
|
$result = $object->remove_element($tablename, $elementselectid, $projectField);
|
|
if ($result < 0) {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
}
|
|
}
|
|
|
|
$elementuser = new User($db);
|
|
|
|
|
|
|
|
$showdatefilter = 0;
|
|
// Show the filter on date on top of element list
|
|
if (!$showdatefilter) {
|
|
print '<div class="center centpercent">';
|
|
print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="POST">';
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<input type="hidden" name="tablename" value="'.(empty($tablename) ? '' : $tablename).'">';
|
|
print '<input type="hidden" name="action" value="view">';
|
|
print '<div class="inline-block">';
|
|
print $form->selectDate($dates, 'dates', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From"));
|
|
print '</div>';
|
|
print '<div class="inline-block">';
|
|
print $form->selectDate($datee, 'datee', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
|
|
print '</div>';
|
|
print '<div class="inline-block">';
|
|
print '<input type="submit" name="refresh" value="'.$langs->trans("Refresh").'" class="button small">';
|
|
print '</div>';
|
|
print '</form>';
|
|
print '</div>';
|
|
|
|
$showdatefilter++;
|
|
}
|
|
|
|
|
|
|
|
// Show balance for whole project
|
|
|
|
$langs->loadLangs(array("suppliers", "bills", "orders", "proposals", "margins"));
|
|
|
|
if (isModEnabled('stock')) {
|
|
$langs->load('stocks');
|
|
}
|
|
|
|
print load_fiche_titre($langs->trans("Profit"), '', 'title_accountancy');
|
|
|
|
print '<table class="noborder centpercent">';
|
|
print '<tr class="liste_titre">';
|
|
print '<td class="left" width="200">';
|
|
$tooltiponprofit = $langs->trans("ProfitIsCalculatedWith")."<br>\n";
|
|
$tooltiponprofitplus = $tooltiponprofitminus = '';
|
|
foreach ($listofreferent as $key => $value) {
|
|
if (!empty($value['lang'])) {
|
|
$langs->load($value['lang']);
|
|
}
|
|
$name = $langs->trans($value['name']);
|
|
$qualified = $value['test'];
|
|
$margin = empty($value['margin']) ? '' : $value['margin'];
|
|
if ($qualified && isset($margin)) { // If this element must be included into profit calculation ($margin is 'minus' or 'add')
|
|
if ($margin === 'add') {
|
|
$tooltiponprofitplus .= ' > '.$name." (+)<br>\n";
|
|
}
|
|
if ($margin === 'minus') {
|
|
$tooltiponprofitminus .= ' > '.$name." (-)<br>\n";
|
|
}
|
|
}
|
|
}
|
|
$tooltiponprofit .= $tooltiponprofitplus;
|
|
$tooltiponprofit .= $tooltiponprofitminus;
|
|
print $form->textwithpicto($langs->trans("Element"), $tooltiponprofit);
|
|
print '</td>';
|
|
print '<td class="right" width="100">'.$langs->trans("Number").'</td>';
|
|
print '<td class="right" width="100">'.$langs->trans("AmountHT").'</td>';
|
|
print '<td class="right" width="100">'.$langs->trans("AmountTTC").'</td>';
|
|
print '</tr>';
|
|
|
|
$total_revenue_ht = 0;
|
|
$balance_ht = 0;
|
|
$balance_ttc = 0;
|
|
|
|
// Loop on each element type (proposal, sale order, invoices, ...)
|
|
foreach ($listofreferent as $key => $value) {
|
|
$parameters = array(
|
|
'total_revenue_ht' =>& $total_revenue_ht,
|
|
'balance_ht' =>& $balance_ht,
|
|
'balance_ttc' =>& $balance_ttc,
|
|
'key' => $key,
|
|
'value' =>& $value,
|
|
'dates' => $dates,
|
|
'datee' => $datee
|
|
);
|
|
$reshook = $hookmanager->executeHooks('printOverviewProfit', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if ($reshook < 0) {
|
|
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
|
|
} elseif ($reshook > 0) {
|
|
print $hookmanager->resPrint;
|
|
continue;
|
|
}
|
|
|
|
$name = $langs->trans($value['name']);
|
|
$title = $value['title'];
|
|
$classname = $value['class'];
|
|
$tablename = $value['table'];
|
|
$datefieldname = $value['datefieldname'];
|
|
$qualified = $value['test'];
|
|
$margin = empty($value['margin']) ? 0 : $value['margin'];
|
|
$project_field = empty($value['project_field']) ? '' : $value['project_field'];
|
|
if ($qualified && isset($margin)) { // If this element must be included into profit calculation ($margin is 'minus' or 'add')
|
|
$element = new $classname($db);
|
|
|
|
$elementarray = $object->get_element_list($key, $tablename, $datefieldname, $dates, $datee, !empty($project_field) ? $project_field : 'fk_projet');
|
|
|
|
if (is_array($elementarray) && count($elementarray) > 0) {
|
|
$total_ht = 0;
|
|
$total_ttc = 0;
|
|
|
|
// Loop on each object for the current element type
|
|
$num = count($elementarray);
|
|
for ($i = 0; $i < $num; $i++) {
|
|
$tmp = explode('_', $elementarray[$i]);
|
|
$idofelement = $tmp[0];
|
|
$idofelementuser = !empty($tmp[1]) ? $tmp[1] : "";
|
|
|
|
$element->fetch($idofelement);
|
|
if ($idofelementuser) {
|
|
$elementuser->fetch($idofelementuser);
|
|
}
|
|
|
|
// Define if record must be used for total or not
|
|
$qualifiedfortotal = true;
|
|
if ($key == 'invoice') {
|
|
if (!empty($element->close_code) && $element->close_code == 'replaced') {
|
|
$qualifiedfortotal = false; // Replacement invoice, do not include into total
|
|
}
|
|
if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS') && $element->type == Facture::TYPE_DEPOSIT) {
|
|
$qualifiedfortotal = false; // If hidden option to use deposits as payment (deprecated, not recommended to use this), deposits are not included
|
|
}
|
|
}
|
|
if ($key == 'propal') {
|
|
if ($element->status != Propal::STATUS_SIGNED && $element->status != Propal::STATUS_BILLED) {
|
|
$qualifiedfortotal = false; // Only signed proposal must not be included in total
|
|
}
|
|
}
|
|
|
|
if ($tablename != 'expensereport_det' && method_exists($element, 'fetch_thirdparty')) {
|
|
$element->fetch_thirdparty();
|
|
}
|
|
|
|
// Define $total_ht_by_line
|
|
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
|
|
$total_ht_by_line = $element->amount;
|
|
} elseif ($tablename == 'fichinter') {
|
|
$total_ht_by_line = $element->getAmount();
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
$total_ht_by_line = $element->price * abs($element->qty);
|
|
} elseif ($tablename == 'projet_task') {
|
|
$tmp = $element->getSumOfAmount($idofelementuser ? $elementuser : '', $dates, $datee);
|
|
$total_ht_by_line = price2num($tmp['amount'], 'MT');
|
|
} elseif ($key == 'loan') {
|
|
if ((empty($dates) && empty($datee)) || (intval($dates) <= $element->datestart && intval($datee) >= $element->dateend)) {
|
|
// Get total loan
|
|
$total_ht_by_line = -$element->capital;
|
|
} else {
|
|
// Get loan schedule according to date filter
|
|
$total_ht_by_line = 0;
|
|
$loanScheduleStatic = new LoanSchedule($element->db);
|
|
$loanScheduleStatic->fetchAll($element->id);
|
|
if (!empty($loanScheduleStatic->lines)) {
|
|
foreach ($loanScheduleStatic->lines as $loanSchedule) {
|
|
/**
|
|
* @var $loanSchedule LoanSchedule
|
|
*/
|
|
if (($loanSchedule->datep >= $dates && $loanSchedule->datep <= $datee) // dates filter is defined
|
|
|| !empty($dates) && empty($datee) && $loanSchedule->datep >= $dates && $loanSchedule->datep <= dol_now()
|
|
|| empty($dates) && !empty($datee) && $loanSchedule->datep <= $datee
|
|
) {
|
|
$total_ht_by_line -= $loanSchedule->amount_capital;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$total_ht_by_line = $element->total_ht;
|
|
}
|
|
|
|
// Define $total_ttc_by_line
|
|
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
|
|
$total_ttc_by_line = $element->amount;
|
|
} elseif ($tablename == 'fichinter') {
|
|
$total_ttc_by_line = $element->getAmount();
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
$total_ttc_by_line = $element->price * abs($element->qty);
|
|
} elseif ($tablename == 'projet_task') {
|
|
$defaultvat = get_default_tva($mysoc, $mysoc);
|
|
$reg = array();
|
|
if (preg_replace('/^(\d+\.)\s\(.*\)/', $defaultvat, $reg)) {
|
|
$defaultvat = $reg[1];
|
|
}
|
|
$total_ttc_by_line = price2num($total_ht_by_line * (1 + ((float) $defaultvat / 100)), 'MT');
|
|
} elseif ($key == 'loan') {
|
|
$total_ttc_by_line = $total_ht_by_line; // For loan there is actually no taxe managed in Dolibarr
|
|
} else {
|
|
$total_ttc_by_line = $element->total_ttc;
|
|
}
|
|
|
|
// Change sign of $total_ht_by_line and $total_ttc_by_line for some cases
|
|
if ($tablename == 'payment_various') {
|
|
if ($element->sens == 1) {
|
|
$total_ht_by_line = -$total_ht_by_line;
|
|
$total_ttc_by_line = -$total_ttc_by_line;
|
|
}
|
|
}
|
|
|
|
// Add total if we have to
|
|
if ($qualifiedfortotal) {
|
|
$total_ht = $total_ht + $total_ht_by_line;
|
|
$total_ttc = $total_ttc + $total_ttc_by_line;
|
|
}
|
|
}
|
|
|
|
// Each element with at least one line is output
|
|
|
|
// Calculate margin
|
|
if ($margin) {
|
|
if ($margin === 'add') {
|
|
$total_revenue_ht += $total_ht;
|
|
}
|
|
|
|
if ($margin === "minus") { // Revert sign
|
|
$total_ht = -$total_ht;
|
|
$total_ttc = -$total_ttc;
|
|
}
|
|
|
|
$balance_ht += $total_ht;
|
|
$balance_ttc += $total_ttc;
|
|
}
|
|
|
|
print '<tr class="oddeven">';
|
|
// Module
|
|
print '<td class="left">'.$name.'</td>';
|
|
// Nb
|
|
print '<td class="right">'.$i.'</td>';
|
|
// Amount HT
|
|
print '<td class="right">';
|
|
if ($key == 'intervention' && !$margin) {
|
|
print '<span class="opacitymedium">'.$form->textwithpicto($langs->trans("NA"), $langs->trans("AmountOfInteventionNotIncludedByDefault")).'</span>';
|
|
} else {
|
|
if ($key == 'propal') {
|
|
print '<span class="opacitymedium">'.$form->textwithpicto('', $langs->trans("SignedOnly")).'</span>';
|
|
}
|
|
print price($total_ht);
|
|
}
|
|
print '</td>';
|
|
// Amount TTC
|
|
print '<td class="right">';
|
|
if ($key == 'intervention' && !$margin) {
|
|
print '<span class="opacitymedium">'.$form->textwithpicto($langs->trans("NA"), $langs->trans("AmountOfInteventionNotIncludedByDefault")).'</span>';
|
|
} else {
|
|
if ($key == 'propal') {
|
|
print '<span class="opacitymedium">'.$form->textwithpicto('', $langs->trans("SignedOnly")).'</span>';
|
|
}
|
|
print price($total_ttc);
|
|
}
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
}
|
|
}
|
|
// and the final balance
|
|
print '<tr class="liste_total">';
|
|
print '<td class="right" colspan="2">'.$langs->trans("Profit").'</td>';
|
|
print '<td class="right">'.price(price2num($balance_ht, 'MT')).'</td>';
|
|
print '<td class="right">'.price(price2num($balance_ttc, 'MT')).'</td>';
|
|
print '</tr>';
|
|
|
|
// and the margin (profit / revenues)
|
|
if ($total_revenue_ht) {
|
|
print '<tr class="liste_total">';
|
|
print '<td class="right" colspan="2">'.$langs->trans("Margin").'</td>';
|
|
print '<td class="right">'.round(100 * $balance_ht / $total_revenue_ht, 1).'%</td>';
|
|
print '<td class="right"></td>';
|
|
print '</tr>';
|
|
}
|
|
|
|
print "</table>";
|
|
|
|
|
|
print '<br><br>';
|
|
print '<br>';
|
|
|
|
|
|
$total_time = 0;
|
|
|
|
// Detail
|
|
foreach ($listofreferent as $key => $value) {
|
|
$parameters = array(
|
|
'key' => $key,
|
|
'value' =>& $value,
|
|
'dates' => $dates,
|
|
'datee' => $datee
|
|
);
|
|
$reshook = $hookmanager->executeHooks('printOverviewDetail', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if ($reshook < 0) {
|
|
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
|
|
} elseif ($reshook > 0) {
|
|
print $hookmanager->resPrint;
|
|
continue;
|
|
}
|
|
|
|
$title = $value['title'];
|
|
$classname = $value['class'];
|
|
$tablename = $value['table'];
|
|
$datefieldname = $value['datefieldname'];
|
|
$qualified = $value['test'];
|
|
$urlnew = empty($value['urlnew']) ? '' : $value['urlnew'];
|
|
$buttonnew = empty($value['buttonnew']) ? '' : $value['buttonnew'];
|
|
$testnew = empty($value['testnew']) ? '' : $value['testnew'];
|
|
$project_field = empty($value['project_field']) ? '' : $value['project_field'];
|
|
$nototal = empty($value['nototal']) ? 0 : 1;
|
|
|
|
$exclude_select_element = array('payment_various');
|
|
if (!empty($value['exclude_select_element'])) {
|
|
$exclude_select_element[] = $value['exclude_select_element'];
|
|
}
|
|
|
|
if ($qualified) {
|
|
// If we want the project task array to have details of users
|
|
//if ($key == 'project_task') $key = 'project_task_time';
|
|
|
|
$element = new $classname($db);
|
|
|
|
$addform = '';
|
|
|
|
$idtofilterthirdparty = 0;
|
|
$array_of_element_linkable_with_different_thirdparty = array('facture_fourn', 'commande_fournisseur');
|
|
if (!in_array($tablename, $array_of_element_linkable_with_different_thirdparty)) {
|
|
$idtofilterthirdparty = empty($object->thirdparty->id) ? 0 : $object->thirdparty->id;
|
|
if (getDolGlobalString('PROJECT_OTHER_THIRDPARTY_ID_TO_ADD_ELEMENTS')) {
|
|
$idtofilterthirdparty .= ',' . getDolGlobalString('PROJECT_OTHER_THIRDPARTY_ID_TO_ADD_ELEMENTS');
|
|
}
|
|
}
|
|
|
|
$elementarray = $object->get_element_list($key, $tablename, $datefieldname, $dates, $datee, !empty($project_field) ? $project_field : 'fk_projet');
|
|
|
|
|
|
if (!getDolGlobalString('PROJECT_LINK_ON_OVERWIEW_DISABLED') && $idtofilterthirdparty && !in_array($tablename, $exclude_select_element)) {
|
|
$selectList = $formproject->select_element($tablename, $idtofilterthirdparty, 'minwidth300 minwidth75imp', -2, empty($project_field) ? 'fk_projet' : $project_field, $langs->trans("SelectElement"));
|
|
if ($selectList < 0) {
|
|
setEventMessages($formproject->error, $formproject->errors, 'errors');
|
|
} elseif ($selectList) {
|
|
// Define form with the combo list of elements to link
|
|
$addform .= '<div class="inline-block valignmiddle">';
|
|
$addform .= '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
|
|
$addform .= '<input type="hidden" name="token" value="'.newToken().'">';
|
|
$addform .= '<input type="hidden" name="tablename" value="'.$tablename.'">';
|
|
$addform .= '<input type="hidden" name="action" value="addelement">';
|
|
$addform .= '<input type="hidden" name="datesrfc" value="'.dol_print_date($dates, 'dayhourrfc').'">';
|
|
$addform .= '<input type="hidden" name="dateerfc" value="'.dol_print_date($datee, 'dayhourrfc').'">';
|
|
$addform .= '<table><tr>';
|
|
//$addform .= '<td><span class="hideonsmartphone opacitymedium">'.$langs->trans("SelectElement").'</span></td>';
|
|
$addform .= '<td>'.$selectList.'</td>';
|
|
$addform .= '<td><input type="submit" class="button button-linkto smallpaddingimp" value="'.dol_escape_htmltag($langs->trans("LinkToElementShort")).'"></td>';
|
|
$addform .= '</tr></table>';
|
|
$addform .= '</form>';
|
|
$addform .= '</div>';
|
|
}
|
|
}
|
|
if (!getDolGlobalString('PROJECT_CREATE_ON_OVERVIEW_DISABLED') && $urlnew) {
|
|
$addform .= '<div class="inline-block valignmiddle">';
|
|
if ($testnew) {
|
|
$addform .= '<a class="buttonxxx marginleftonly" href="'.$urlnew.'" title="'.dol_escape_htmltag($langs->trans($buttonnew)).'"><span class="fa fa-plus-circle valignmiddle paddingleft"></span></a>';
|
|
} elseif (!getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED')) {
|
|
$addform .= '<span title="'.dol_escape_htmltag($langs->trans($buttonnew)).'"><a class="buttonxxx marginleftonly buttonRefused" disabled="disabled" href="#"><span class="fa fa-plus-circle valignmiddle paddingleft"></span></a></span>';
|
|
}
|
|
$addform .= '<div>';
|
|
}
|
|
|
|
if (is_array($elementarray) && count($elementarray) > 0 && $key == "order_supplier") {
|
|
$addform = '<div class="inline-block valignmiddle"><a id="btnShow" class="buttonxxx marginleftonly" href="#" onClick="return false;">
|
|
<span id="textBtnShow" class="valignmiddle text-plus-circle hideonsmartphone">'.$langs->trans("CanceledShown").'</span><span id="minus-circle" class="fa fa-eye valignmiddle paddingleft"></span>
|
|
</a>
|
|
<script>
|
|
$("#btnShow").on("click", function () {
|
|
console.log("We click to show or hide the canceled lines");
|
|
var attr = $(this).attr("data-canceledarehidden");
|
|
if (typeof attr !== "undefined" && attr !== false) {
|
|
console.log("Show canceled");
|
|
$(".tr_canceled").show();
|
|
$("#textBtnShow").text("'.dol_escape_js($langs->transnoentitiesnoconv("CanceledShown")).'");
|
|
$("#btnShow").removeAttr("data-canceledarehidden");
|
|
$("#minus-circle").removeClass("fa-eye-slash").addClass("fa-eye");
|
|
} else {
|
|
console.log("Hide canceled");
|
|
$(".tr_canceled").hide();
|
|
$("#textBtnShow").text("'.dol_escape_js($langs->transnoentitiesnoconv("CanceledHidden")).'");
|
|
$("#btnShow").attr("data-canceledarehidden", 1);
|
|
$("#minus-circle").removeClass("fa-eye").addClass("fa-eye-slash");
|
|
}
|
|
});
|
|
</script></div> '.$addform;
|
|
}
|
|
|
|
print load_fiche_titre($langs->trans($title), $addform, '');
|
|
|
|
print "\n".'<!-- Table for tablename = '.$tablename.' -->'."\n";
|
|
print '<div class="div-table-responsive">';
|
|
print '<table class="noborder centpercent">';
|
|
|
|
print '<tr class="liste_titre">';
|
|
// Remove link column
|
|
print '<td style="width: 24px"></td>';
|
|
// Ref
|
|
print '<td'.(($tablename != 'actioncomm' && $tablename != 'projet_task') ? ' style="width: 200px"' : '').'>'.$langs->trans("Ref").'</td>';
|
|
// Date
|
|
print '<td'.(($tablename != 'actioncomm' && $tablename != 'projet_task') ? ' style="width: 200px"' : '').' class="center">';
|
|
if (in_array($tablename, array('projet_task'))) {
|
|
print $langs->trans("TimeSpent");
|
|
}
|
|
if (!in_array($tablename, array('projet_task'))) {
|
|
print $langs->trans("Date");
|
|
}
|
|
print '</td>';
|
|
// Thirdparty or user
|
|
print '<td>';
|
|
if (in_array($tablename, array('projet_task')) && $key == 'project_task') {
|
|
print ''; // if $key == 'project_task', we don't want details per user
|
|
} elseif (in_array($tablename, array('payment_various'))) {
|
|
print ''; // if $key == 'payment_various', we don't have any thirdparty
|
|
} elseif (in_array($tablename, array('expensereport_det', 'don', 'projet_task', 'stock_mouvement', 'salary'))) {
|
|
print $langs->trans("User");
|
|
} else {
|
|
print $langs->trans("ThirdParty");
|
|
}
|
|
print '</td>';
|
|
// Duration of intervention
|
|
if ($tablename == 'fichinter') {
|
|
print '<td>';
|
|
print $langs->trans("TotalDuration");
|
|
$total_duration = 0;
|
|
print '</td>';
|
|
}
|
|
// Amount HT
|
|
//if (empty($value['disableamount']) && ! in_array($tablename, array('projet_task'))) print '<td class="right" width="120">'.$langs->trans("AmountHT").'</td>';
|
|
//elseif (empty($value['disableamount']) && in_array($tablename, array('projet_task'))) print '<td class="right" width="120">'.$langs->trans("Amount").'</td>';
|
|
if ($key == 'loan') {
|
|
print '<td class="right" width="120">'.$langs->trans("LoanCapital").'</td>';
|
|
} elseif (empty($value['disableamount'])) {
|
|
print '<td class="right" width="120">'.$langs->trans("AmountHT").'</td>';
|
|
} else {
|
|
print '<td width="120"></td>';
|
|
}
|
|
// Amount TTC
|
|
//if (empty($value['disableamount']) && ! in_array($tablename, array('projet_task'))) print '<td class="right" width="120">'.$langs->trans("AmountTTC").'</td>';
|
|
if ($key == 'loan') {
|
|
print '<td class="right" width="120">'.$langs->trans("RemainderToPay").'</td>';
|
|
} elseif (empty($value['disableamount'])) {
|
|
print '<td class="right" width="120">'.$langs->trans("AmountTTC").'</td>';
|
|
} else {
|
|
print '<td width="120"></td>';
|
|
}
|
|
// Status
|
|
if (in_array($tablename, array('projet_task'))) {
|
|
print '<td class="right" width="200">'.$langs->trans("ProgressDeclared").'</td>';
|
|
} else {
|
|
print '<td class="right" width="200">'.$langs->trans("Status").'</td>';
|
|
}
|
|
print '</tr>';
|
|
|
|
if (is_array($elementarray) && count($elementarray) > 0) {
|
|
$total_ht = 0;
|
|
$total_ttc = 0;
|
|
|
|
$total_ht_by_third = 0;
|
|
$total_ttc_by_third = 0;
|
|
|
|
$saved_third_id = 0;
|
|
$breakline = '';
|
|
|
|
if (canApplySubtotalOn($tablename)) {
|
|
// Sort
|
|
$elementarray = sortElementsByClientName($elementarray);
|
|
}
|
|
|
|
$num = count($elementarray);
|
|
for ($i = 0; $i < $num; $i++) {
|
|
$tmp = explode('_', $elementarray[$i]);
|
|
$idofelement = $tmp[0];
|
|
$idofelementuser = isset($tmp[1]) ? $tmp[1] : "";
|
|
|
|
$element->fetch($idofelement);
|
|
if ($idofelementuser) {
|
|
$elementuser->fetch($idofelementuser);
|
|
}
|
|
|
|
// Special cases
|
|
if ($tablename != 'expensereport_det') {
|
|
if (method_exists($element, 'fetch_thirdparty')) {
|
|
$element->fetch_thirdparty();
|
|
}
|
|
} else {
|
|
$expensereport = new ExpenseReport($db);
|
|
$expensereport->fetch($element->fk_expensereport);
|
|
}
|
|
|
|
//print 'xxx'.$tablename.'yyy'.$classname;
|
|
|
|
if ($breakline && $saved_third_id != $element->thirdparty->id) {
|
|
print $breakline;
|
|
|
|
$saved_third_id = $element->thirdparty->id;
|
|
$breakline = '';
|
|
|
|
$total_ht_by_third = 0;
|
|
$total_ttc_by_third = 0;
|
|
}
|
|
|
|
$saved_third_id = empty($element->thirdparty->id) ? 0 : $element->thirdparty->id;
|
|
|
|
$qualifiedfortotal = true;
|
|
if ($key == 'invoice') {
|
|
if (!empty($element->close_code) && $element->close_code == 'replaced') {
|
|
$qualifiedfortotal = false; // Replacement invoice, do not include into total
|
|
}
|
|
} elseif ($key == 'order_supplier' && $element->status == 7) {
|
|
$qualifiedfortotal = false; // It makes no sense to include canceled orders in the total
|
|
}
|
|
|
|
if ($key == "order_supplier" && $element->status == 7) {
|
|
print '<tr class="oddeven tr_canceled" style=display:none>';
|
|
} else {
|
|
print '<tr class="oddeven" >';
|
|
}
|
|
|
|
|
|
// Remove link
|
|
print '<td style="width: 24px">';
|
|
if ($tablename != 'projet_task' && $tablename != 'stock_mouvement') {
|
|
if (!getDolGlobalString('PROJECT_DISABLE_UNLINK_FROM_OVERVIEW') || $user->admin) { // PROJECT_DISABLE_UNLINK_FROM_OVERVIEW is empty by defaut, so this test true
|
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=unlink&tablename='.$tablename.'&elementselect='.$element->id.($project_field ? '&projectfield='.$project_field : '').'" class="reposition">';
|
|
print img_picto($langs->trans('Unlink'), 'unlink');
|
|
print '</a>';
|
|
}
|
|
}
|
|
print "</td>\n";
|
|
|
|
// Ref
|
|
print '<td class="left nowraponall">';
|
|
if ($tablename == 'expensereport_det') {
|
|
print $expensereport->getNomUrl(1);
|
|
} else {
|
|
// Show ref with link
|
|
if ($element instanceof Task) {
|
|
print $element->getNomUrl(1, 'withproject', 'time');
|
|
print ' - '.dol_trunc($element->label, 48);
|
|
} elseif ($key == 'loan') {
|
|
print $element->getNomUrl(1);
|
|
print ' - '.dol_trunc($element->label, 48);
|
|
} else {
|
|
print $element->getNomUrl(1);
|
|
}
|
|
|
|
$element_doc = $element->element;
|
|
$filename = dol_sanitizeFileName($element->ref);
|
|
if (!empty($conf->$element_doc)) {
|
|
$confelementdoc = $conf->$element_doc;
|
|
$filedir = $confelementdoc->multidir_output[$element->entity].'/'.dol_sanitizeFileName($element->ref);
|
|
} else {
|
|
$filedir = '';
|
|
}
|
|
|
|
if ($element_doc === 'order_supplier') {
|
|
$element_doc = 'commande_fournisseur';
|
|
$filedir = $conf->fournisseur->commande->multidir_output[$element->entity].'/'.dol_sanitizeFileName($element->ref);
|
|
} elseif ($element_doc === 'invoice_supplier') {
|
|
$element_doc = 'facture_fournisseur';
|
|
$filename = get_exdir($element->id, 2, 0, 0, $element, 'product').dol_sanitizeFileName($element->ref);
|
|
$filedir = $conf->fournisseur->facture->multidir_output[$element->entity].'/'.get_exdir($element->id, 2, 0, 0, $element, 'invoice_supplier').dol_sanitizeFileName($element->ref);
|
|
}
|
|
|
|
print '<div class="inline-block valignmiddle">';
|
|
if ($filedir) {
|
|
print $formfile->getDocumentsLink($element_doc, $filename, $filedir);
|
|
}
|
|
print '</div>';
|
|
|
|
// Show supplier ref
|
|
if (!empty($element->ref_supplier)) {
|
|
print ' - '.$element->ref_supplier;
|
|
}
|
|
// Show customer ref
|
|
if (!empty($element->ref_customer)) {
|
|
print ' - '.$element->ref_customer;
|
|
}
|
|
// Compatibility propale
|
|
if (empty($element->ref_customer) && !empty($element->ref_client)) {
|
|
print ' - '.$element->ref_client;
|
|
}
|
|
}
|
|
print "</td>\n";
|
|
|
|
// Date or TimeSpent
|
|
$date = '';
|
|
$total_time_by_line = null;
|
|
if ($tablename == 'expensereport_det') {
|
|
$date = $element->date; // No draft status on lines
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
$date = $element->datem;
|
|
} elseif ($tablename == 'salary') {
|
|
$date = $element->datesp;
|
|
} elseif ($tablename == 'payment_various') {
|
|
$date = $element->datev;
|
|
} elseif ($tablename == 'chargesociales') {
|
|
$date = $element->date_ech;
|
|
} elseif (!empty($element->status) || !empty($element->statut) || !empty($element->fk_status)) {
|
|
if ($tablename == 'don') {
|
|
$date = $element->datedon;
|
|
}
|
|
if ($tablename == 'commande_fournisseur' || $tablename == 'supplier_order') {
|
|
$date = ($element->date_commande ? $element->date_commande : $element->date_valid);
|
|
} elseif ($tablename == 'supplier_proposal') {
|
|
$date = $element->date_validation; // There is no other date for this
|
|
} elseif ($tablename == 'fichinter') {
|
|
$date = $element->datev; // There is no other date for this
|
|
} elseif ($tablename == 'projet_task') {
|
|
$date = ''; // We show no date. Showing date of beginning of task make user think it is date of time consumed
|
|
} else {
|
|
$date = $element->date; // invoice, ...
|
|
if (empty($date)) {
|
|
$date = $element->date_contrat;
|
|
}
|
|
if (empty($date)) {
|
|
$date = $element->datev;
|
|
}
|
|
if (empty($date) && !empty($datefieldname)) {
|
|
$date = $element->$datefieldname;
|
|
}
|
|
}
|
|
} elseif ($key == 'loan') {
|
|
$date = $element->datestart;
|
|
}
|
|
|
|
print '<td class="center">';
|
|
if ($tablename == 'actioncomm') {
|
|
print dol_print_date($element->datep, 'dayhour');
|
|
if ($element->datef && $element->datef > $element->datep) {
|
|
print " - ".dol_print_date($element->datef, 'dayhour');
|
|
}
|
|
} elseif (in_array($tablename, array('projet_task'))) {
|
|
$tmpprojtime = $element->getSumOfAmount($idofelementuser ? $elementuser : '', $dates, $datee); // $element is a task. $elementuser may be empty
|
|
print '<a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?id='.$idofelement.'&withproject=1">';
|
|
print convertSecondToTime($tmpprojtime['nbseconds'], 'allhourmin');
|
|
print '</a>';
|
|
$total_time_by_line = $tmpprojtime['nbseconds'];
|
|
} else {
|
|
print dol_print_date($date, 'day');
|
|
}
|
|
print '</td>';
|
|
|
|
// Third party or user
|
|
print '<td class="left">';
|
|
if (is_object($element->thirdparty)) {
|
|
print $element->thirdparty->getNomUrl(1, '', 48);
|
|
} elseif ($tablename == 'expensereport_det') {
|
|
$tmpuser = new User($db);
|
|
$tmpuser->fetch($expensereport->fk_user_author);
|
|
print $tmpuser->getNomUrl(1, '', 48);
|
|
} elseif ($tablename == 'salary') {
|
|
$tmpuser = new User($db);
|
|
$tmpuser->fetch($element->fk_user);
|
|
print $tmpuser->getNomUrl(1, '', 48);
|
|
} elseif ($tablename == 'don' || $tablename == 'stock_mouvement') {
|
|
if ($element->fk_user_author > 0) {
|
|
$tmpuser2 = new User($db);
|
|
$tmpuser2->fetch($element->fk_user_author);
|
|
print $tmpuser2->getNomUrl(1, '', 48);
|
|
}
|
|
} elseif ($tablename == 'projet_task' && $key == 'element_time') { // if $key == 'project_task', we don't want details per user
|
|
print $elementuser->getNomUrl(1);
|
|
}
|
|
print '</td>';
|
|
|
|
// Add duration and store it in counter for fichinter
|
|
if ($tablename == 'fichinter') {
|
|
print '<td>';
|
|
print convertSecondToTime($element->duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
|
|
$total_duration += $element->duration;
|
|
print '</td>';
|
|
}
|
|
|
|
// Amount without tax
|
|
$warning = '';
|
|
if (empty($value['disableamount'])) {
|
|
$total_ht_by_line = null;
|
|
$othermessage = '';
|
|
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
|
|
$total_ht_by_line = $element->amount;
|
|
} elseif ($tablename == 'fichinter') {
|
|
$total_ht_by_line = $element->getAmount();
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
$total_ht_by_line = $element->price * abs($element->qty);
|
|
} elseif (in_array($tablename, array('projet_task'))) {
|
|
if (isModEnabled('salaries')) {
|
|
// TODO Permission to read daily rate to show value
|
|
$total_ht_by_line = price2num($tmpprojtime['amount'], 'MT');
|
|
if ($tmpprojtime['nblinesnull'] > 0) {
|
|
$langs->load("errors");
|
|
$warning = $langs->trans("WarningSomeLinesWithNullHourlyRate", $conf->currency);
|
|
}
|
|
} else {
|
|
$othermessage = $form->textwithpicto($langs->trans("NotAvailable"), $langs->trans("ModuleSalaryToDefineHourlyRateMustBeEnabled"));
|
|
}
|
|
} elseif ($key == 'loan') {
|
|
$total_ht_by_line = $element->capital;
|
|
} else {
|
|
$total_ht_by_line = $element->total_ht;
|
|
}
|
|
|
|
// Change sign of $total_ht_by_line and $total_ttc_by_line for some cases
|
|
if ($tablename == 'payment_various') {
|
|
if ($element->sens == 0) {
|
|
$total_ht_by_line = -$total_ht_by_line;
|
|
}
|
|
}
|
|
|
|
print '<td class="right">';
|
|
if ($othermessage) {
|
|
print $othermessage;
|
|
}
|
|
if (isset($total_ht_by_line)) {
|
|
if (!$qualifiedfortotal) {
|
|
print '<strike>';
|
|
}
|
|
print '<span class="amount">'.price($total_ht_by_line).'</span>';
|
|
if (!$qualifiedfortotal) {
|
|
print '</strike>';
|
|
}
|
|
}
|
|
if ($warning) {
|
|
print ' '.img_warning($warning);
|
|
}
|
|
print '</td>';
|
|
} else {
|
|
print '<td></td>';
|
|
}
|
|
|
|
// Amount inc tax
|
|
if (empty($value['disableamount'])) {
|
|
$total_ttc_by_line = null;
|
|
if ($tablename == 'don' || $tablename == 'chargesociales' || $tablename == 'payment_various' || $tablename == 'salary') {
|
|
$total_ttc_by_line = $element->amount;
|
|
} elseif ($tablename == 'fichinter') {
|
|
$total_ttc_by_line = $element->getAmount();
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
$total_ttc_by_line = $element->price * abs($element->qty);
|
|
} elseif ($tablename == 'projet_task') {
|
|
if (isModEnabled('salaries')) {
|
|
// TODO Permission to read daily rate
|
|
$defaultvat = get_default_tva($mysoc, $mysoc);
|
|
$total_ttc_by_line = price2num($total_ht_by_line * (1 + ($defaultvat / 100)), 'MT');
|
|
} else {
|
|
$othermessage = $form->textwithpicto($langs->trans("NotAvailable"), $langs->trans("ModuleSalaryToDefineHourlyRateMustBeEnabled"));
|
|
}
|
|
} elseif ($key == 'loan') {
|
|
$total_ttc_by_line = $element->capital - $element->getSumPayment();
|
|
} else {
|
|
$total_ttc_by_line = $element->total_ttc;
|
|
}
|
|
|
|
// Change sign of $total_ht_by_line and $total_ttc_by_line for some cases
|
|
if ($tablename == 'payment_various') {
|
|
if ($element->sens == 0) {
|
|
$total_ttc_by_line = -$total_ttc_by_line;
|
|
}
|
|
}
|
|
|
|
print '<td class="right">';
|
|
if ($othermessage) {
|
|
print $othermessage;
|
|
}
|
|
if (isset($total_ttc_by_line)) {
|
|
if (!$qualifiedfortotal) {
|
|
print '<strike>';
|
|
}
|
|
print '<span class="amount">'.price($total_ttc_by_line).'</span>';
|
|
if (!$qualifiedfortotal) {
|
|
print '</strike>';
|
|
}
|
|
}
|
|
if ($warning) {
|
|
print ' '.img_warning($warning);
|
|
}
|
|
print '</td>';
|
|
} else {
|
|
print '<td></td>';
|
|
}
|
|
|
|
// Status
|
|
print '<td class="right">';
|
|
if ($tablename == 'expensereport_det') {
|
|
print $expensereport->getLibStatut(5);
|
|
} elseif ($element instanceof CommonInvoice) {
|
|
//This applies for Facture and FactureFournisseur
|
|
print $element->getLibStatut(5, $element->getSommePaiement());
|
|
} elseif ($element instanceof Task) {
|
|
if ($element->progress != '') {
|
|
print $element->progress.' %';
|
|
}
|
|
} elseif ($tablename == 'stock_mouvement') {
|
|
print $element->getLibStatut(3);
|
|
} else {
|
|
print $element->getLibStatut(5);
|
|
}
|
|
print '</td>';
|
|
|
|
print '</tr>';
|
|
|
|
if ($qualifiedfortotal) {
|
|
$total_ht = $total_ht + $total_ht_by_line;
|
|
$total_ttc = $total_ttc + $total_ttc_by_line;
|
|
|
|
$total_ht_by_third += $total_ht_by_line;
|
|
$total_ttc_by_third += $total_ttc_by_line;
|
|
|
|
if (!isset($total_time)) {
|
|
$total_time = $total_time_by_line;
|
|
} else {
|
|
$total_time += $total_time_by_line;
|
|
}
|
|
}
|
|
|
|
if (canApplySubtotalOn($tablename)) {
|
|
$breakline = '<tr class="liste_total liste_sub_total">';
|
|
$breakline .= '<td colspan="2">';
|
|
$breakline .= '</td>';
|
|
$breakline .= '<td>';
|
|
$breakline .= '</td>';
|
|
$breakline .= '<td class="right">';
|
|
$breakline .= $langs->trans('SubTotal').' : ';
|
|
if (is_object($element->thirdparty)) {
|
|
$breakline .= $element->thirdparty->getNomUrl(0, '', 48);
|
|
}
|
|
$breakline .= '</td>';
|
|
$breakline .= '<td class="right">'.price($total_ht_by_third).'</td>';
|
|
$breakline .= '<td class="right">'.price($total_ttc_by_third).'</td>';
|
|
$breakline .= '<td></td>';
|
|
$breakline .= '</tr>';
|
|
}
|
|
|
|
//var_dump($element->thirdparty->name.' - '.$saved_third_id.' - '.$element->thirdparty->id);
|
|
}
|
|
|
|
if ($breakline) {
|
|
print $breakline;
|
|
}
|
|
|
|
// Total
|
|
if (empty($nototal)) {
|
|
$colspan = 4;
|
|
if (in_array($tablename, array('projet_task'))) {
|
|
$colspan = 2;
|
|
}
|
|
|
|
print '<tr class="liste_total"><td colspan="'.$colspan.'">'.$langs->trans("Number").': '.$i.'</td>';
|
|
if (in_array($tablename, array('projet_task'))) {
|
|
print '<td class="center">';
|
|
print convertSecondToTime($total_time, 'allhourmin');
|
|
print '</td>';
|
|
print '<td>';
|
|
print '</td>';
|
|
}
|
|
//if (empty($value['disableamount']) && ! in_array($tablename, array('projet_task'))) print '<td class="right" width="100">'.$langs->trans("TotalHT").' : '.price($total_ht).'</td>';
|
|
//elseif (empty($value['disableamount']) && in_array($tablename, array('projet_task'))) print '<td class="right" width="100">'.$langs->trans("Total").' : '.price($total_ht).'</td>';
|
|
// If fichinter add the total_duration
|
|
if ($tablename == 'fichinter') {
|
|
print '<td class="left">'.convertSecondToTime($total_duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY).'</td>';
|
|
}
|
|
print '<td class="right">';
|
|
if (empty($value['disableamount'])) {
|
|
if ($key == 'loan') {
|
|
print $langs->trans("Total").' '.$langs->trans("LoanCapital").' : '.price($total_ttc);
|
|
} elseif ($tablename != 'projet_task' || isModEnabled('salaries')) {
|
|
print ''.$langs->trans("TotalHT").' : '.price($total_ht);
|
|
}
|
|
}
|
|
print '</td>';
|
|
//if (empty($value['disableamount']) && ! in_array($tablename, array('projet_task'))) print '<td class="right" width="100">'.$langs->trans("TotalTTC").' : '.price($total_ttc).'</td>';
|
|
//elseif (empty($value['disableamount']) && in_array($tablename, array('projet_task'))) print '<td class="right" width="100"></td>';
|
|
print '<td class="right">';
|
|
if (empty($value['disableamount'])) {
|
|
if ($key == 'loan') {
|
|
print $langs->trans("Total").' '.$langs->trans("RemainderToPay").' : '.price($total_ttc);
|
|
} elseif ($tablename != 'projet_task' || isModEnabled('salaries')) {
|
|
print $langs->trans("TotalTTC").' : '.price($total_ttc);
|
|
}
|
|
}
|
|
print '</td>';
|
|
print '<td> </td>';
|
|
print '</tr>';
|
|
}
|
|
} else {
|
|
if (!is_array($elementarray)) { // error
|
|
print '<tr><td>'.$elementarray.'</td></tr>';
|
|
} else {
|
|
$colspan = 7;
|
|
if ($tablename == 'fichinter') {
|
|
$colspan++;
|
|
}
|
|
print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</td></tr>';
|
|
}
|
|
}
|
|
print "</table>";
|
|
print '</div>';
|
|
print "<br>\n";
|
|
}
|
|
}
|
|
|
|
// Enhance with select2
|
|
if ($conf->use_javascript_ajax) {
|
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
|
|
$comboenhancement = ajax_combobox('.elementselect');
|
|
|
|
print $comboenhancement;
|
|
}
|
|
|
|
// End of page
|
|
llxFooter();
|
|
$db->close();
|
|
|
|
|
|
|
|
/**
|
|
* Return if we should do a group by customer with sub-total
|
|
*
|
|
* @param string $tablename Name of table
|
|
* @return boolean True to tell to make a group by sub-total
|
|
*/
|
|
function canApplySubtotalOn($tablename)
|
|
{
|
|
global $conf;
|
|
|
|
if (!getDolGlobalString('PROJECT_ADD_SUBTOTAL_LINES')) {
|
|
return false;
|
|
}
|
|
return in_array($tablename, array('facture_fourn', 'commande_fournisseur'));
|
|
}
|
|
|
|
/**
|
|
* sortElementsByClientName
|
|
*
|
|
* @param array $elementarray Element array
|
|
* @return array Element array sorted
|
|
*/
|
|
function sortElementsByClientName($elementarray)
|
|
{
|
|
global $db, $classname;
|
|
|
|
$element = new $classname($db);
|
|
|
|
$clientname = array();
|
|
foreach ($elementarray as $key => $id) { // id = id of object
|
|
if (empty($clientname[$id])) {
|
|
$element->fetch($id);
|
|
$element->fetch_thirdparty();
|
|
|
|
$clientname[$id] = $element->thirdparty->name;
|
|
}
|
|
}
|
|
|
|
//var_dump($clientname);
|
|
asort($clientname); // sort on name
|
|
|
|
$elementarray = array();
|
|
foreach ($clientname as $id => $name) {
|
|
$elementarray[] = $id;
|
|
}
|
|
|
|
return $elementarray;
|
|
}
|