dolibarr 23.0.3
agenda.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2017 Ferran Marcet <fmarcet@2byte.es>
4 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
5 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28require "../main.inc.php";
29require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
30require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
31require_once DOL_DOCUMENT_ROOT.'/core/lib/contract.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
34if (isModEnabled('project')) {
35 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
37}
38
47// Load translation files required by the page
48$langs->loadLangs(array("companies", "contracts"));
49
50$action = GETPOST('action', 'alpha');
51$confirm = GETPOST('confirm', 'alpha');
52$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'contratagenda';
53
54if (GETPOST('actioncode', 'array')) {
55 $actioncode = GETPOST('actioncode', 'array', 3);
56 if (!count($actioncode)) {
57 $actioncode = '0';
58 }
59} else {
60 $actioncode = GETPOST("actioncode", "alpha", 3) ? GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT'));
61}
62
63$search_rowid = GETPOST('search_rowid');
64$search_agenda_label = GETPOST('search_agenda_label');
65$search_complete = GETPOST('search_complete');
66$search_filtert = GETPOSTINT('search_filtert');
67$search_dateevent_start = GETPOSTDATE('dateevent_start');
68$search_dateevent_end = GETPOSTDATE('dateevent_end');
69
70$id = GETPOSTINT('id');
71$ref = GETPOST('ref', 'alpha');
72
73// Security check
74if ($user->socid) {
75 $socid = $user->socid;
76}
77
78// Security check
79$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
80$fieldtype = (!empty($id) ? 'rowid' : 'ref');
81
82// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
83$hookmanager->initHooks(array('agendacontract', 'globalcard'));
84
85$result = restrictedArea($user, 'contrat', $fieldvalue, '', '', '', $fieldtype);
86
87$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
88$sortfield = GETPOST('sortfield', 'aZ09comma');
89$sortorder = GETPOST('sortorder', 'aZ09comma');
90$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
91if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
92 // If $page is not defined, or '' or -1 or if we click on clear filters
93 $page = 0;
94}
95$offset = $limit * $page;
96$pageprev = $page - 1;
97$pagenext = $page + 1;
98if (!$sortfield) {
99 $sortfield = 'a.datep,a.id';
100}
101if (!$sortorder) {
102 $sortorder = 'DESC,DESC';
103}
104
105
106$object = new Contrat($db);
107if ($id > 0 || !empty($ref)) {
108 $result = $object->fetch($id, $ref);
109}
110
111$permissiontoadd = $user->hasRight('contrat', 'creer'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
112
113$result = restrictedArea($user, 'contrat', $object->id);
114
115
116/*
117 * Actions
118 */
119
120$parameters = array('id' => $id, 'ref' => $ref);
121$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
122if ($reshook < 0) {
123 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
124}
125
126if (empty($reshook)) {
127 // Cancel
128 if (GETPOST('cancel', 'alpha') && !empty($backtopage)) {
129 header("Location: ".$backtopage);
130 exit;
131 }
132
133 // Purge search criteria
134 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
135 $actioncode = '';
136 $search_rowid = '';
137 $search_agenda_label = '';
138 $search_complete = '';
139 $search_filtert = '';
140 }
141}
142
143
144/*
145 * View
146 */
147
148$form = new Form($db);
149$formfile = new FormFile($db);
150if (isModEnabled('project')) {
151 $formproject = new FormProjets($db);
152}
153
154if ($object->id > 0) {
155 // Load object modContract
156 $module = getDolGlobalString('CONTRACT_ADDON', 'mod_contract_serpis');
157 if (substr($module, 0, 13) == 'mod_contract_' && substr($module, -3) == 'php') {
158 $module = substr($module, 0, dol_strlen($module) - 4);
159 }
160 $result = dol_include_once('/core/modules/contract/'.$module.'.php');
161 if ($result > 0) {
162 $modCodeContract = new $module();
163 }
164
165 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
166 require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
167
168 $object->fetch_thirdparty();
169
170 $title = $langs->trans("Agenda");
171 if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/contractrefonly/', getDolGlobalString('MAIN_HTML_TITLE')) && $object->ref) {
172 $title = $object->ref." - ".$title;
173 }
174 $help_url = 'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
175
176 llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-contrat page-card_agenda');
177
178 if (isModEnabled('notification')) {
179 $langs->load("mails");
180 }
181 $head = contract_prepare_head($object);
182
183 print dol_get_fiche_head($head, 'agenda', $langs->trans("Contract"), -1, 'contract');
184
185 $linkback = '<a href="'.DOL_URL_ROOT.'/contrat/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
186
187 $morehtmlref = '';
188 if (!empty($modCodeContract->code_auto)) {
189 $morehtmlref .= $object->ref;
190 } else {
191 $morehtmlref .= $form->editfieldkey("", 'ref', $object->ref, $object, $user->hasRight('contrat', 'creer'), 'string', '', 0, 3);
192 $morehtmlref .= $form->editfieldval("", 'ref', $object->ref, $object, $user->hasRight('contrat', 'creer'), 'string', null, null, '2');
193 }
194
195 $permtoedit = 0;
196
197 $morehtmlref .= '<div class="refidno">';
198 // Ref customer
199 $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_customer, $object, $permtoedit, 'string', '', 0, 1);
200 $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_customer, $object, $permtoedit, 'string', '', null, null, '', 1, 'getFormatedCustomerRef');
201 // Ref supplier
202 $morehtmlref .= '<br>';
203 $morehtmlref .= $form->editfieldkey("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $permtoedit, 'string', '', 0, 1);
204 $morehtmlref .= $form->editfieldval("RefSupplier", 'ref_supplier', $object->ref_supplier, $object, $permtoedit, 'string', '', null, null, '', 1, 'getFormatedSupplierRef');
205 // Thirdparty
206 $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1);
207 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
208 $morehtmlref .= ' <span class="otherlink valignmiddle">(<a href="'.dolBuildUrl(DOL_URL_ROOT.'/contrat/list.php', ['socid' => $object->thirdparty->id, 'search_name' => $object->thirdparty->name]).'">'.$langs->trans("OtherContracts").'</a>)</span>';
209 }
210 // Project
211 if (isModEnabled('project')) {
212 $langs->load("projects");
213 $morehtmlref .= '<br>';
214 if (0) { // @phpstan-ignore-line
215 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
216 if ($action != 'classify') {
217 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
218 }
219 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, (string) $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
220 } else {
221 if (!empty($object->fk_project)) {
222 $proj = new Project($db);
223 $proj->fetch($object->fk_project);
224 $morehtmlref .= $proj->getNomUrl(1);
225 if ($proj->title) {
226 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
227 }
228 }
229 }
230 }
231 $morehtmlref .= '</div>';
232
233 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'none', $morehtmlref);
234
235 print '<div class="fichecenter">';
236
237 print '<div class="underbanner clearboth"></div>';
238
239 $object->info($object->id);
240 dol_print_object_info($object, 1);
241
242 print '</div>';
243
244 print dol_get_fiche_end();
245
246
247 // Actions buttons
248
249 /*$objthirdparty=$object;
250 $objcon=new stdClass();
251
252 $out='';
253 $permok=$user->rights->agenda->myactions->create;
254 if ((!empty($objthirdparty->id) || !empty($objcon->id)) && $permok)
255 {
256 //$out.='<a href="'.DOL_URL_ROOT.'/comm/action/card.php?action=create';
257 if (get_class($objthirdparty) == 'Societe') $out.='&amp;socid='.$objthirdparty->id;
258 $out.=(!empty($objcon->id)?'&amp;contactid='.$objcon->id:'').'&amp;backtopage=1';
259 //$out.=$langs->trans("AddAnAction").' ';
260 //$out.=img_picto($langs->trans("AddAnAction"),'filenew');
261 //$out.="</a>";
262 }*/
263
264
265 //print '<div class="tabsAction">';
266 //print '</div>';
267
268
269 $newcardbutton = '';
270 if (isModEnabled('agenda')) {
271 if ($user->hasRight('agenda', 'myactions', 'create') || $user->hasRight('agenda', 'allactions', 'create')) {
272 $backtopage = $_SERVER['PHP_SELF'].'?id='.$object->id;
273 $messagingUrl = dolBuildUrl(DOL_URL_ROOT.'/contrat/messaging.php', ['id' => $object->id]);
274 $newcardbutton .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
275 $messagingUrl = dolBuildUrl(DOL_URL_ROOT.'/contrat/agenda.php', ['id' => $object->id]);
276 $newcardbutton .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 2);
277 $query = [
278 'action' => 'create',
279 'origin' => $object->element,
280 'originid' => $object->id,
281 'backtopage' => $backtopage,
282 ];
283 $newcardbutton .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', dolBuildUrl(DOL_URL_ROOT.'/comm/action/card.php', $query));
284 }
285 }
286
287 if (isModEnabled('agenda') && ($user->hasRight('agenda', 'myactions', 'read') || $user->hasRight('agenda', 'allactions', 'read'))) {
288 print '<br>';
289
290 $param = '&id='.$object->id;
291 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
292 $param .= '&contextpage='.urlencode($contextpage);
293 }
294 if ($limit > 0 && $limit != $conf->liste_limit) {
295 $param .= '&limit='.((int) $limit);
296 }
297 if ($search_rowid) {
298 $param .= '&search_rowid='.urlencode($search_rowid);
299 }
300 if ($actioncode !== '' && $actioncode !== '-1') {
301 $param .= '&actioncode='.urlencode($actioncode);
302 }
303 if ($search_agenda_label) {
304 $param .= '&search_agenda_label='.urlencode($search_agenda_label);
305 }
306 if ($search_complete != '') {
307 $param .= '&search_complete='.urlencode($search_complete);
308 }
309 if ($search_filtert != '') {
310 $param .= '&search_filtert='.urlencode($search_filtert);
311 }
312 if ($search_dateevent_start != '') {
313 $param .= '&dateevent_startyear='.GETPOSTINT('dateevent_startyear');
314 $param .= '&dateevent_startmonth='.GETPOSTINT('dateevent_startmonth');
315 $param .= '&dateevent_startday='.GETPOSTINT('dateevent_startday');
316 }
317 if ($search_dateevent_end != '') {
318 $param .= '&dateevent_endyear='.GETPOSTINT('dateevent_endyear');
319 $param .= '&dateevent_endmonth='.GETPOSTINT('dateevent_endmonth');
320 $param .= '&dateevent_endday='.GETPOSTINT('dateevent_endday');
321 }
322
323 // Try to know count of actioncomm from cache
324 require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php';
325 $cachekey = 'count_events_thirdparty_'.$object->id;
326 $nbEvent = dol_getcache($cachekey);
327
328 $titlelist = $langs->trans("ActionsOnContract").(is_numeric($nbEvent) ? '<span class="opacitymedium colorblack paddingleft">('.$nbEvent.')</span>' : '');
329 if (!empty($conf->dol_optimize_smallscreen)) {
330 $titlelist = $langs->trans("Actions").(is_numeric($nbEvent) ? '<span class="opacitymedium colorblack paddingleft">('.$nbEvent.')</span>' : '');
331 }
332
333 print_barre_liste($titlelist, 0, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', 0, -1, '', 0, $newcardbutton, '', 0, 1, 0);
334
335 // List of all actions
336 $filters = array();
337 $filters['search_agenda_label'] = $search_agenda_label;
338 $filters['search_rowid'] = $search_rowid;
339 $filters['search_complete'] = $search_complete; // Can be 'na', '0', '100', '50'
340 $filters['search_filtert'] = $search_filtert;
341
342 // TODO Replace this with the same code than into list.php
343 show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
344 }
345}
346
347llxFooter();
348$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage projects.
show_actions_done($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC', $module='')
Show html area with actions (done or not, ignore the name of function).
contract_prepare_head(Contrat $object)
Prepare array with list of tabs.
dol_print_object_info($object, $usetable=0)
Show information on an object TODO Move this into html.formother.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_getcache($memoryid, $filecache=0)
Read a memory area shared by all users, all sessions on server.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.