dolibarr 20.0.5
partnership.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2021 NextGestion <contact@nextgestion.com>
4 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
28// Put here all includes required by your class file
29require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
30
31
36{
40 public $module = 'partnership';
41
45 public $element = 'partnership';
46
50 public $table_element = 'partnership';
51
55 public $picto = 'partnership';
56
57 public $type_code;
58 public $type_label;
59
60
61 const STATUS_DRAFT = 0;
62 const STATUS_VALIDATED = 1; // Validate (no more draft)
63 const STATUS_APPROVED = 2; // Approved
64 const STATUS_REFUSED = 3; // Refused
65 const STATUS_CANCELED = 9;
66
67
94 // BEGIN MODULEBUILDER PROPERTIES
98 public $fields = array(
99 'rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'noteditable' => 1, 'index' => 1, 'css' => 'left', 'comment' => "Id"),
100 'ref' => array('type' => 'varchar(128)', 'label' => 'Ref', 'enabled' => 1, 'position' => 10, 'notnull' => 1, 'visible' => 4, 'noteditable' => 1, 'default' => '(PROV)', 'index' => 1, 'searchall' => 1, 'showoncombobox' => 1, 'comment' => "Reference of object", 'csslist' => 'tdoverflowmax150'),
101 'entity' => array('type' => 'integer', 'label' => 'Entity', 'enabled' => 'isModEnabled("multicompany")', 'position' => 15, 'notnull' => 1, 'visible' => -2, 'default' => '1', 'index' => 1,),
102 'fk_type' => array('type' => 'integer:PartnershipType:partnership/class/partnership_type.class.php:0:(active:=:1)', 'label' => 'Type', 'enabled' => 1, 'position' => 20, 'notnull' => 1, 'visible' => 1, 'csslist' => 'tdoverflowmax125'),
103 'fk_soc' => array('type' => 'integer:Societe:societe/class/societe.class.php:1:((status:=:1) AND (entity:IN:__SHARED_ENTITIES__))', 'label' => 'ThirdParty', 'picto' => 'company', 'enabled' => 1, 'position' => 50, 'notnull' => -1, 'visible' => 1, 'index' => 1, 'css' => 'maxwidth500', 'csslist' => 'tdoverflowmax125',),
104 'note_public' => array('type' => 'html', 'label' => 'NotePublic', 'enabled' => 1, 'position' => 61, 'notnull' => 0, 'visible' => 0,),
105 'note_private' => array('type' => 'html', 'label' => 'NotePrivate', 'enabled' => 1, 'position' => 62, 'notnull' => 0, 'visible' => 0,),
106 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'position' => 500, 'notnull' => 1, 'visible' => -2, 'csslist' => 'nowraponall'),
107 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 501, 'notnull' => 0, 'visible' => -2, 'csslist' => 'nowraponall'),
108 'fk_user_creat' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserAuthor', 'enabled' => 1, 'position' => 510, 'notnull' => 1, 'visible' => -2, 'foreignkey' => 'user.rowid', 'csslist' => 'tdoverflowmax125'),
109 'fk_user_modif' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserModif', 'enabled' => 1, 'position' => 511, 'notnull' => -1, 'visible' => -2, 'csslist' => 'tdoverflowmax125'),
110 'last_main_doc' => array('type' => 'varchar(255)', 'label' => 'LastMainDoc', 'enabled' => 1, 'position' => 600, 'notnull' => 0, 'visible' => 0,),
111 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'position' => 1000, 'notnull' => -1, 'visible' => -2,),
112 'model_pdf' => array('type' => 'varchar(255)', 'label' => 'Model pdf', 'enabled' => 1, 'position' => 1010, 'notnull' => -1, 'visible' => 0,),
113 'date_partnership_start' => array('type' => 'date', 'label' => 'DatePartnershipStart', 'enabled' => 1, 'position' => 52, 'notnull' => 1, 'visible' => 1,),
114 'date_partnership_end' => array('type' => 'date', 'label' => 'DatePartnershipEnd', 'enabled' => 1, 'position' => 53, 'notnull' => 0, 'visible' => 1,),
115 'url_to_check' => array('type' => 'url', 'label' => 'UrlToCheck', 'enabled' => 'getDolGlobalString("PARTNERSHIP_BACKLINKS_TO_CHECK")', 'position' => 70, 'notnull' => 0, 'visible' => -1, 'csslist' => 'tdoverflowmax150'),
116 'count_last_url_check_error' => array('type' => 'integer', 'label' => 'CountLastUrlCheckError', 'enabled' => 'getDolGlobalString("PARTNERSHIP_BACKLINKS_TO_CHECK")', 'position' => 71, 'notnull' => 0, 'visible' => -4, 'default' => '0',),
117 'last_check_backlink' => array('type' => 'datetime', 'label' => 'LastCheckBacklink', 'enabled' => 'getDolGlobalString("PARTNERSHIP_BACKLINKS_TO_CHECK")', 'position' => 72, 'notnull' => 0, 'visible' => -4, 'csslist' => 'nowraponall'),
118 'reason_decline_or_cancel' => array('type' => 'text', 'label' => 'ReasonDeclineOrCancel', 'enabled' => 1, 'position' => 73, 'notnull' => 0, 'visible' => -2,),
119 'ip' => array('type' => 'ip', 'label' => 'IPOfApplicant', 'enabled' => 1, 'position' => 74, 'notnull' => 0, 'visible' => -2,),
120 'status' => array('type' => 'smallint', 'label' => 'Status', 'enabled' => 1, 'position' => 2000, 'notnull' => 1, 'visible' => 2, 'default' => '0', 'index' => 1, 'arrayofkeyval' => array('0' => 'Draft', '1' => 'Validated', '2' => 'Approved', '3' => 'Refused', '9' => 'Terminated'),),
121 );
122 public $rowid;
123 public $ref;
124 public $entity;
125 public $fk_type;
126 public $note_public;
127 public $note_private;
128 public $date_creation;
129 public $fk_user_creat;
130 public $fk_user_modif;
131 public $last_main_doc;
132 public $import_key;
133 public $model_pdf;
134 public $date_partnership_start;
135 public $date_partnership_end;
136 public $url_to_check;
137 public $count_last_url_check_error;
138 public $last_check_backlink;
139 public $reason_decline_or_cancel;
140 public $fk_soc;
141 public $fk_member;
142 public $ip;
143 public $status;
144 // END MODULEBUILDER PROPERTIES
145
146
152 public function __construct(DoliDB $db)
153 {
154 global $langs;
155
156 $this->db = $db;
157
158 $this->ismultientitymanaged = 0;
159 $this->isextrafieldmanaged = 1;
160
161 if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') {
162 $this->fields['fk_member'] = array('type' => 'integer:Adherent:adherents/class/adherent.class.php:1', 'label' => 'Member', 'enabled' => '1', 'position' => 50, 'notnull' => -1, 'visible' => 1, 'index' => 1, 'picto' => 'member', 'css' => 'maxwidth500', 'csslist' => 'tdoverflowmax150');
163 unset($this->fields['fk_soc']);
164 } else {
165 $this->fields['fk_soc'] = array('type' => 'integer:Societe:societe/class/societe.class.php:1:((status:=:1) AND (entity:IN:__SHARED_ENTITIES__))', 'label' => 'ThirdParty', 'enabled' => '1', 'position' => 50, 'notnull' => -1, 'visible' => 1, 'index' => 1, 'picto' => 'company', 'css' => 'maxwidth500', 'csslist' => 'tdoverflowmax150');
166 unset($this->fields['fk_member']);
167 }
168
169 if (!getDolGlobalString('MAIN_SHOW_TECHNICAL_ID') && isset($this->fields['rowid']) && !empty($this->fields['ref'])) {
170 $this->fields['rowid']['visible'] = 0;
171 }
172
173 // Unset fields that are disabled
174 foreach ($this->fields as $key => $val) {
175 if (isset($val['enabled']) && empty($val['enabled'])) {
176 unset($this->fields[$key]);
177 }
178 }
179
180 // Translate some data of arrayofkeyval
181 if (is_object($langs)) {
182 foreach ($this->fields as $key => $val) {
183 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
184 foreach ($val['arrayofkeyval'] as $key2 => $val2) {
185 $this->fields[$key]['arrayofkeyval'][$key2] = $langs->trans($val2);
186 }
187 }
188 }
189 }
190 }
191
199 public function create(User $user, $notrigger = 0)
200 {
201 if ($this->fk_soc <= 0 && $this->fk_member <= 0) {
202 $this->errors[] = "ErrorThirpdartyOrMemberidIsMandatory";
203 return -1;
204 }
205
206 $this->status = 0;
207 return $this->createCommon($user, $notrigger);
208 }
209
217 public function createFromClone(User $user, $fromid)
218 {
219 global $langs, $extrafields;
220 $error = 0;
221
222 dol_syslog(__METHOD__, LOG_DEBUG);
223
224 $object = new self($this->db);
225
226 $this->db->begin();
227
228 // Load source object
229 $result = $object->fetchCommon($fromid);
230 if ($result > 0 && !empty($object->table_element_line)) {
231 $object->fetchLines();
232 }
233
234 // get lines so they will be clone
235 //foreach($this->lines as $line)
236 // $line->fetch_optionals();
237
238 // Reset some properties
239 unset($object->id);
240 unset($object->fk_user_creat);
241 unset($object->import_key);
242
243 // Clear fields
244 if (property_exists($object, 'ref')) {
245 $object->ref = empty($this->fields['ref']['default']) ? "Copy_Of_".$object->ref : $this->fields['ref']['default'];
246 }
247 if (property_exists($object, 'label')) {
248 $object->label = empty($this->fields['label']['default']) ? $langs->trans("CopyOf")." ".$object->label : $this->fields['label']['default'];
249 }
250 if (property_exists($object, 'status')) {
251 $object->status = self::STATUS_DRAFT;
252 }
253 if (property_exists($object, 'date_creation')) {
254 $object->date_creation = dol_now();
255 }
256 if (property_exists($object, 'date_modification')) {
257 $object->date_modification = null;
258 }
259 // ...
260 // Clear extrafields that are unique
261 if (is_array($object->array_options) && count($object->array_options) > 0) {
262 $extrafields->fetch_name_optionals_label($this->table_element);
263 foreach ($object->array_options as $key => $option) {
264 $shortkey = preg_replace('/options_/', '', $key);
265 if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) {
266 //var_dump($key);
267 //var_dump($clonedObj->array_options[$key]); exit;
268 unset($object->array_options[$key]);
269 }
270 }
271 }
272
273 // Create clone
274 $object->context['createfromclone'] = 'createfromclone';
275 $result = $object->createCommon($user);
276 if ($result < 0) {
277 $error++;
278 $this->error = $object->error;
279 $this->errors = $object->errors;
280 }
281
282 if (!$error) {
283 // copy internal contacts
284 if ($this->copy_linked_contact($object, 'internal') < 0) {
285 $error++;
286 }
287 }
288
289 if (!$error) {
290 // copy external contacts if same company
291 if (property_exists($this, 'fk_soc') && $this->fk_soc == $object->socid) {
292 if ($this->copy_linked_contact($object, 'external') < 0) {
293 $error++;
294 }
295 }
296 }
297
298 unset($object->context['createfromclone']);
299
300 // End
301 if (!$error) {
302 $this->db->commit();
303 return $object;
304 } else {
305 $this->db->rollback();
306 return -1;
307 }
308 }
309
320 public function fetch($id, $ref = null, $fk_member = null, $fk_soc = null)
321 {
322 // Check parameters
323 if (empty($id) && empty($ref) && empty($fk_member) && empty($fk_soc)) {
324 return -1;
325 }
326
327 $sql = 'SELECT p.rowid, p.ref, p.fk_type, p.fk_soc, p.fk_member, p.status';
328 $sql .= ', p.entity, p.date_partnership_start, p.date_partnership_end, p.date_creation';
329 $sql .= ', p.fk_user_creat, p.tms, p.fk_user_modif, p.fk_user_modif';
330 $sql .= ', p.note_private, p.note_public, p.url_to_check';
331 $sql .= ', p.last_main_doc, p.count_last_url_check_error, p.last_check_backlink, p.reason_decline_or_cancel';
332 $sql .= ', p.import_key, p.model_pdf';
333 $sql .= ', pt.code as type_code, pt.label as type_label';
334 $sql .= ' FROM '.MAIN_DB_PREFIX.'partnership as p';
335 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_partnership_type as pt ON p.fk_type = pt.rowid';
336
337 if ($id) {
338 $sql .= " WHERE p.rowid = ".((int) $id);
339 } else {
340 $sql .= " WHERE p.entity IN (0,".getEntity('partnership').")"; // Don't use entity if you use rowid
341 }
342
343 if ($ref) {
344 $sql .= " AND p.ref='".$this->db->escape($ref)."'";
345 }
346
347 if ($fk_member > 0) {
348 $sql .= ' AND p.fk_member = '.((int) $fk_member);
349 }
350 if ($fk_soc > 0) {
351 $sql .= ' AND p.fk_soc = '.((int) $fk_soc);
352 }
353 $sql .= ' ORDER BY p.date_partnership_end DESC';
354
355 dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
356 $result = $this->db->query($sql);
357 if ($result) {
358 $obj = $this->db->fetch_object($result);
359 if ($obj) {
360 $this->id = $obj->rowid;
361 $this->entity = $obj->entity;
362 $this->ref = $obj->ref;
363
364 $this->fk_type = $obj->fk_type;
365 $this->type_code = $obj->type_code;
366 $this->type_label = $obj->type_label;
367
368 $this->fk_soc = $obj->fk_soc;
369 $this->fk_member = $obj->fk_member;
370 $this->status = $obj->status;
371 $this->date_partnership_start = $this->db->jdate($obj->date_partnership_start);
372 $this->date_partnership_end = $this->db->jdate($obj->date_partnership_end);
373 $this->date_creation = $this->db->jdate($obj->date_creation);
374 $this->fk_user_creat = $obj->fk_user_creat;
375 $this->tms = $obj->tms;
376 $this->fk_user_modif = $obj->fk_user_modif;
377 $this->note_private = $obj->note_private;
378 $this->note_public = $obj->note_public;
379 $this->last_main_doc = $obj->last_main_doc;
380 $this->count_last_url_check_error = $obj->count_last_url_check_error;
381 $this->last_check_backlink = $this->db->jdate($obj->last_check_backlink);
382 $this->reason_decline_or_cancel = $obj->reason_decline_or_cancel;
383 $this->import_key = $obj->import_key;
384 $this->model_pdf = $obj->model_pdf;
385 $this->url_to_check = $obj->url_to_check;
386
387 // Retrieve all extrafield
388 // fetch optionals attributes and labels
389 $this->fetch_optionals();
390
391 $this->db->free($result);
392
393 return 1;
394 } else {
395 // $this->error = 'Partnership with id '.$id.' not found sql='.$sql;
396 return 0;
397 }
398 } else {
399 $this->error = $this->db->error();
400 return -1;
401 }
402 }
403
404
410 public function fetchLines()
411 {
412 $this->lines = array();
413
414 $result = $this->fetchLinesCommon();
415 return $result;
416 }
417
418
430 public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, $filter = '', $filtermode = 'AND')
431 {
432 dol_syslog(__METHOD__, LOG_DEBUG);
433
434 $records = array();
435
436 $sql = 'SELECT ';
437 $sql .= $this->getFieldList('t');
438 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
439 if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
440 $sql .= ' WHERE t.entity IN ('.getEntity($this->element).')';
441 } else {
442 $sql .= ' WHERE 1 = 1';
443 }
444
445 // Manage filter
446 if (is_array($filter)) {
447 $sqlwhere = array();
448 if (count($filter) > 0) {
449 foreach ($filter as $key => $value) {
450 if ($key == 't.rowid') {
451 $sqlwhere[] = $this->db->sanitize($key)." = ".((int) $value);
452 } elseif (array_key_exists($key, $this->fields) && in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
453 $sqlwhere[] = $this->db->sanitize($key)." = '".$this->db->idate($value)."'";
454 } elseif (strpos($value, '%') === false) {
455 $sqlwhere[] = $this->db->sanitize($key)." IN (".$this->db->sanitize($this->db->escape($value)).")";
456 } else {
457 $sqlwhere[] = $this->db->sanitize($key)." LIKE '%".$this->db->escape($this->db->escapeforlike($value))."%'";
458 }
459 }
460 }
461 if (count($sqlwhere) > 0) {
462 $sql .= ' AND ('.implode(' '.$this->db->escape($filtermode).' ', $sqlwhere).')';
463 }
464
465 $filter = '';
466 }
467
468 // Manage filter
469 $errormessage = '';
470 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
471 if ($errormessage) {
472 $this->errors[] = $errormessage;
473 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
474 return -1;
475 }
476
477 if (!empty($sortfield)) {
478 $sql .= $this->db->order($sortfield, $sortorder);
479 }
480 if (!empty($limit)) {
481 $sql .= $this->db->plimit($limit, $offset);
482 }
483
484 $resql = $this->db->query($sql);
485 if ($resql) {
486 $num = $this->db->num_rows($resql);
487 $i = 0;
488 while ($i < ($limit ? min($limit, $num) : $num)) {
489 $obj = $this->db->fetch_object($resql);
490
491 $record = new self($this->db);
492 $record->setVarsFromFetchObj($obj);
493
494 $records[$record->id] = $record;
495
496 $i++;
497 }
498 $this->db->free($resql);
499
500 return $records;
501 } else {
502 $this->errors[] = 'Error '.$this->db->lasterror();
503 dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
504
505 return -1;
506 }
507 }
508
516 public function update(User $user, $notrigger = 0)
517 {
518 if ($this->fk_soc <= 0 && $this->fk_member <= 0) {
519 $this->errors[] = "ErrorThirpdartyOrMemberidIsMandatory"; // Mistyping in key is in translations
520 return -1;
521 }
522 if (empty($this->fk_user_creat)) { // For the case the object was created with empty user (from public page).
523 $this->fk_user_creat = $user->id;
524 }
525
526 return $this->updateCommon($user, $notrigger);
527 }
528
536 public function delete(User $user, $notrigger = 0)
537 {
538 return $this->deleteCommon($user, $notrigger);
539 //return $this->deleteCommon($user, $notrigger, 1);
540 }
541
550 public function deleteLine(User $user, $idline, $notrigger = 0)
551 {
552 if ($this->status < 0) {
553 $this->error = 'ErrorDeleteLineNotAllowedByObjectStatus';
554 return -2;
555 }
556
557 return $this->deleteLineCommon($user, $idline, $notrigger);
558 }
559
560
568 public function validate($user, $notrigger = 0)
569 {
570 global $conf;
571
572 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
573
574 $error = 0;
575
576 // Protection
577 if ($this->status == self::STATUS_VALIDATED) {
578 dol_syslog(get_class($this)."::validate action abandoned: already validated", LOG_WARNING);
579 return 0;
580 }
581
582 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->write))
583 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->partnership_advance->validate))))
584 {
585 $this->error='NotEnoughPermissions';
586 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
587 return -1;
588 }*/
589
590 $now = dol_now();
591
592 $this->db->begin();
593
594 // Define new ref
595 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
596 $num = $this->getNextNumRef();
597 } else {
598 $num = $this->ref;
599 }
600 $this->newref = $num;
601
602 if (!empty($num)) {
603 // Validate
604 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
605 $sql .= " SET ref = '".$this->db->escape($num)."',";
606 $sql .= " status = ".self::STATUS_VALIDATED;
607 if (!empty($this->fields['date_validation'])) {
608 $sql .= ", date_validation = '".$this->db->idate($now)."'";
609 }
610 if (!empty($this->fields['fk_user_valid'])) {
611 $sql .= ", fk_user_valid = ".$user->id;
612 }
613 $sql .= " WHERE rowid = ".((int) $this->id);
614
615 dol_syslog(get_class($this)."::validate()", LOG_DEBUG);
616 $resql = $this->db->query($sql);
617 if (!$resql) {
618 dol_print_error($this->db);
619 $this->error = $this->db->lasterror();
620 $error++;
621 }
622
623 if (!$error && !$notrigger) {
624 // Call trigger
625 $result = $this->call_trigger('PARTNERSHIP_VALIDATE', $user);
626 if ($result < 0) {
627 $error++;
628 }
629 // End call triggers
630 }
631 }
632
633 if (!$error) {
634 $this->oldref = $this->ref;
635
636 // Rename directory if dir was a temporary ref
637 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
638 // Now we rename also files into index
639 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'partnership/".$this->db->escape($this->newref)."'";
640 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'partnership/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
641 $resql = $this->db->query($sql);
642 if (!$resql) {
643 $error++;
644 $this->error = $this->db->lasterror();
645 }
646 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'partnership/".$this->db->escape($this->newref)."'";
647 $sql .= " WHERE filepath = 'partnership/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
648 $resql = $this->db->query($sql);
649 if (!$resql) {
650 $error++;
651 $this->error = $this->db->lasterror();
652 }
653
654 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
655 $oldref = dol_sanitizeFileName($this->ref);
656 $newref = dol_sanitizeFileName($num);
657 $dirsource = $conf->partnership->dir_output.'/partnership/'.$oldref;
658 $dirdest = $conf->partnership->dir_output.'/partnership/'.$newref;
659 if (!$error && file_exists($dirsource)) {
660 dol_syslog(get_class($this)."::validate() rename dir ".$dirsource." into ".$dirdest);
661
662 if (@rename($dirsource, $dirdest)) {
663 dol_syslog("Rename ok");
664 // Rename docs starting with $oldref with $newref
665 $listoffiles = dol_dir_list($conf->partnership->dir_output.'/partnership/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
666 foreach ($listoffiles as $fileentry) {
667 $dirsource = $fileentry['name'];
668 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
669 $dirsource = $fileentry['path'].'/'.$dirsource;
670 $dirdest = $fileentry['path'].'/'.$dirdest;
671 @rename($dirsource, $dirdest);
672 }
673 }
674 }
675 }
676 }
677
678 // Set new ref and current status
679 if (!$error) {
680 $this->ref = $num;
681 $this->status = self::STATUS_VALIDATED;
682 }
683
684 if (!$error) {
685 $this->db->commit();
686 return 1;
687 } else {
688 $this->db->rollback();
689 return -1;
690 }
691 }
692
700 public function approve($user, $notrigger = 0)
701 {
702 global $conf;
703
704 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
705
706 $error = 0;
707
708 // Protection
709 if ($this->status == self::STATUS_APPROVED) {
710 dol_syslog(get_class($this)."::accept action abandoned: already acceptd", LOG_WARNING);
711 return 0;
712 }
713
714 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->write))
715 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->partnership_advance->accept))))
716 {
717 $this->error='NotEnoughPermissions';
718 dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR);
719 return -1;
720 }*/
721
722 $now = dol_now();
723
724 $this->db->begin();
725
726 // Define new ref
727 if (!$error && (preg_match('/^[\‍(]?PROV/i', $this->ref) || empty($this->ref))) { // empty should not happened, but when it occurs, the test save life
728 $num = $this->getNextNumRef();
729 } else {
730 $num = $this->ref;
731 }
732 $this->newref = $num;
733
734 if (!empty($num)) {
735 // Accept
736 $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
737 $sql .= " SET ref = '".$this->db->escape($num)."',";
738 $sql .= " status = ".self::STATUS_APPROVED;
739 // if (!empty($this->fields['date_validation'])) {
740 // $sql .= ", date_validation = '".$this->db->idate($now)."'";
741 // }
742 // if (!empty($this->fields['fk_user_valid'])) {
743 // $sql .= ", fk_user_valid = ".$user->id;
744 // }
745 $sql .= " WHERE rowid = ".((int) $this->id);
746
747 dol_syslog(get_class($this)."::accept()", LOG_DEBUG);
748 $resql = $this->db->query($sql);
749 if (!$resql) {
750 dol_print_error($this->db);
751 $this->error = $this->db->lasterror();
752 $error++;
753 }
754
755 if (!$error && !$notrigger) {
756 // Call trigger
757 $result = $this->call_trigger('PARTNERSHIP_ACCEPT', $user);
758 if ($result < 0) {
759 $error++;
760 }
761 // End call triggers
762 }
763 }
764
765 if (!$error) {
766 $this->oldref = $this->ref;
767
768 // Rename directory if dir was a temporary ref
769 if (preg_match('/^[\‍(]?PROV/i', $this->ref)) {
770 // Now we rename also files into index
771 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filename = CONCAT('".$this->db->escape($this->newref)."', SUBSTR(filename, ".(strlen($this->ref) + 1).")), filepath = 'partnership/".$this->db->escape($this->newref)."'";
772 $sql .= " WHERE filename LIKE '".$this->db->escape($this->ref)."%' AND filepath = 'partnership/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
773 $resql = $this->db->query($sql);
774 if (!$resql) {
775 $error++;
776 $this->error = $this->db->lasterror();
777 }
778 $sql = 'UPDATE '.MAIN_DB_PREFIX."ecm_files set filepath = 'partnership/".$this->db->escape($this->newref)."'";
779 $sql .= " WHERE filepath = 'partnership/".$this->db->escape($this->ref)."' and entity = ".$conf->entity;
780 $resql = $this->db->query($sql);
781 if (!$resql) {
782 $error++;
783 $this->error = $this->db->lasterror();
784 }
785
786 // We rename directory ($this->ref = old ref, $num = new ref) in order not to lose the attachments
787 $oldref = dol_sanitizeFileName($this->ref);
788 $newref = dol_sanitizeFileName($num);
789 $dirsource = $conf->partnership->dir_output.'/partnership/'.$oldref;
790 $dirdest = $conf->partnership->dir_output.'/partnership/'.$newref;
791 if (!$error && file_exists($dirsource)) {
792 dol_syslog(get_class($this)."::accept() rename dir ".$dirsource." into ".$dirdest);
793
794 if (@rename($dirsource, $dirdest)) {
795 dol_syslog("Rename ok");
796 // Rename docs starting with $oldref with $newref
797 $listoffiles = dol_dir_list($conf->partnership->dir_output.'/partnership/'.$newref, 'files', 1, '^'.preg_quote($oldref, '/'));
798 foreach ($listoffiles as $fileentry) {
799 $dirsource = $fileentry['name'];
800 $dirdest = preg_replace('/^'.preg_quote($oldref, '/').'/', $newref, $dirsource);
801 $dirsource = $fileentry['path'].'/'.$dirsource;
802 $dirdest = $fileentry['path'].'/'.$dirdest;
803 @rename($dirsource, $dirdest);
804 }
805 }
806 }
807 }
808 }
809
810 // Set new ref and current status
811 if (!$error) {
812 $this->ref = $num;
813 $this->status = self::STATUS_APPROVED;
814 }
815
816 if (!$error) {
817 $this->db->commit();
818 return 1;
819 } else {
820 $this->db->rollback();
821 return -1;
822 }
823 }
824
825
833 public function setDraft($user, $notrigger = 0)
834 {
835 // Protection
836 if ($this->status <= self::STATUS_DRAFT) {
837 return 0;
838 }
839
840 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->write))
841 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership_advance->validate))))
842 {
843 $this->error='Permission denied';
844 return -1;
845 }*/
846
847 return $this->setStatusCommon($user, self::STATUS_DRAFT, $notrigger, 'PARTNERSHIP_UNVALIDATE');
848 }
849
858 public function refused($user, $reasondeclinenote = '', $notrigger = 0)
859 {
860 // Protection
861 if ($this->status == self::STATUS_REFUSED) {
862 return 0;
863 }
864
865 $this->status = self::STATUS_REFUSED;
866 $this->reason_decline_or_cancel = $reasondeclinenote;
867
868 $result = $this->update($user);
869
870 if ($result) {
871 $this->reason_decline_or_cancel = $reasondeclinenote;
872 return 1;
873 }
874
875 return -1;
876 }
877
885 public function cancel($user, $notrigger = 0)
886 {
887 // Protection
888 if ($this->status != self::STATUS_APPROVED) {
889 return 0;
890 }
891
892 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->write))
893 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership_advance->validate))))
894 {
895 $this->error='Permission denied';
896 return -1;
897 }*/
898
899 return $this->setStatusCommon($user, self::STATUS_CANCELED, $notrigger, 'PARTNERSHIP_CANCEL');
900 }
901
909 public function reopen($user, $notrigger = 0)
910 {
911 // Protection
912 if ($this->status != self::STATUS_CANCELED && $this->status != self::STATUS_REFUSED) {
913 return 0;
914 }
915
916 /*if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership->write))
917 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->partnership_advance->validate))))
918 {
919 $this->error='Permission denied';
920 return -1;
921 }*/
922
923 return $this->setStatusCommon($user, self::STATUS_APPROVED, $notrigger, 'PARTNERSHIP_REOPEN');
924 }
925
933 public function getTooltipContentArray($params)
934 {
935 global $langs;
936
937 $langs->load('partnership');
938
939 $datas = [];
940 $datas['picto'] = img_picto('', $this->picto).' <u>'.$langs->trans("Partnership").'</u>';
941 if (isset($this->status)) {
942 $datas['picto'] .= ' '.$this->getLibStatut(5);
943 }
944 $datas['ref'] = '<br><b>'.$langs->trans('Ref').':</b> '.$this->ref;
945
946 return $datas;
947 }
948
959 public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1)
960 {
961 global $conf, $langs, $hookmanager;
962
963 if (!empty($conf->dol_no_mouse_hover)) {
964 $notooltip = 1; // Force disable tooltips
965 }
966
967 $result = '';
968 $params = [
969 'id' => $this->id,
970 'objecttype' => $this->element,
971 'option' => $option,
972 ];
973 $classfortooltip = 'classfortooltip';
974 $dataparams = '';
975 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
976 $classfortooltip = 'classforajaxtooltip';
977 $dataparams = ' data-params="'.dol_escape_htmltag(json_encode($params)).'"';
978 $label = '';
979 } else {
980 $label = implode($this->getTooltipContentArray($params));
981 }
982
983 $url = DOL_URL_ROOT.'/partnership/partnership_card.php?id='.$this->id;
984
985 if ($option != 'nolink') {
986 // Add param to save lastsearch_values or not
987 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
988 if ($save_lastsearch_value == -1 && isset($_SERVER["PHP_SELF"]) && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) {
989 $add_save_lastsearch_values = 1;
990 }
991 if ($add_save_lastsearch_values) {
992 $url .= '&save_lastsearch_values=1';
993 }
994 }
995
996 $linkclose = '';
997 if (empty($notooltip)) {
998 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
999 $label = $langs->trans("ShowPartnership");
1000 $linkclose .= ' alt="'.dol_escape_htmltag($label, 1).'"';
1001 }
1002 $linkclose .= ($label ? ' title="'.dol_escape_htmltag($label, 1).'"' : ' title="tocomplete"');
1003 $linkclose .= $dataparams.' class="'.$classfortooltip.($morecss ? ' '.$morecss : '').'"';
1004 } else {
1005 $linkclose = ($morecss ? ' class="'.$morecss.'"' : '');
1006 }
1007
1008 if ($option == 'nolink') {
1009 $linkstart = '<span';
1010 } else {
1011 $linkstart = '<a href="'.$url.'"';
1012 }
1013 $linkstart .= $linkclose.'>';
1014 if ($option == 'nolink') {
1015 $linkend = '</span>';
1016 } else {
1017 $linkend = '</a>';
1018 }
1019
1020 $result .= $linkstart;
1021
1022 if (empty($this->showphoto_on_popup)) {
1023 if ($withpicto) {
1024 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : $dataparams.' class="'.(($withpicto != 2) ? 'paddingright ' : '').$classfortooltip.'"'), 0, 0, $notooltip ? 0 : 1);
1025 }
1026 } else {
1027 if ($withpicto) {
1028 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1029
1030 list($class, $module) = explode('@', $this->picto);
1031 $upload_dir = $conf->$module->multidir_output[$conf->entity]."/$class/".dol_sanitizeFileName($this->ref);
1032 $filearray = dol_dir_list($upload_dir, "files");
1033 $filename = $filearray[0]['name'];
1034 if (!empty($filename)) {
1035 $pospoint = strpos($filearray[0]['name'], '.');
1036
1037 $pathtophoto = $class.'/'.$this->ref.'/thumbs/'.substr($filename, 0, $pospoint).'_mini'.substr($filename, $pospoint);
1038 if (!getDolGlobalString(strtoupper($module.'_'.$class).'_FORMATLISTPHOTOSASUSERS')) {
1039 $result .= '<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref"><img class="photo'.$module.'" alt="No photo" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$module.'&entity='.$conf->entity.'&file='.urlencode($pathtophoto).'"></div></div>';
1040 } else {
1041 $result .= '<div class="floatleft inline-block valignmiddle divphotoref"><img class="photouserphoto userphoto" alt="No photo" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$module.'&entity='.$conf->entity.'&file='.urlencode($pathtophoto).'"></div>';
1042 }
1043
1044 $result .= '</div>';
1045 } else {
1046 $result .= img_object(($notooltip ? '' : $label), ($this->picto ? $this->picto : 'generic'), ($notooltip ? (($withpicto != 2) ? 'class="paddingright"' : '') : 'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1047 }
1048 }
1049 }
1050
1051 if ($withpicto != 2) {
1052 $result .= $this->ref;
1053 }
1054
1055 $result .= $linkend;
1056 //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : '');
1057
1058 global $action, $hookmanager;
1059 $hookmanager->initHooks(array('partnershipdao'));
1060 $parameters = array('id' => $this->id, 'getnomurl' => &$result);
1061 $reshook = $hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
1062 if ($reshook > 0) {
1063 $result = $hookmanager->resPrint;
1064 } else {
1065 $result .= $hookmanager->resPrint;
1066 }
1067
1068 return $result;
1069 }
1070
1079 public static function replaceThirdparty($db, $origin_id, $dest_id)
1080 {
1081 $tables = array('partnership');
1082
1083 return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables);
1084 }
1085
1092 public function getLibStatut($mode = 0)
1093 {
1094 return $this->LibStatut($this->status, $mode);
1095 }
1096
1097 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1105 public function LibStatut($status, $mode = 0)
1106 {
1107 // phpcs:enable
1108 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
1109 global $langs;
1110 //$langs->load("partnership");
1111 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
1112 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
1113 $this->labelStatus[self::STATUS_APPROVED] = $langs->transnoentitiesnoconv('Approved');
1114 $this->labelStatus[self::STATUS_REFUSED] = $langs->transnoentitiesnoconv('Refused');
1115 $this->labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Terminated');
1116 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
1117 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated');
1118 $this->labelStatusShort[self::STATUS_APPROVED] = $langs->transnoentitiesnoconv('Approved');
1119 $this->labelStatusShort[self::STATUS_REFUSED] = $langs->transnoentitiesnoconv('Refused');
1120 $this->labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Terminated');
1121 }
1122
1123 $statusType = 'status'.$status;
1124 if ($status == self::STATUS_APPROVED) {
1125 $statusType = 'status4';
1126 }
1127 if ($status == self::STATUS_REFUSED) {
1128 $statusType = 'status9';
1129 }
1130 if ($status == self::STATUS_CANCELED) {
1131 $statusType = 'status6';
1132 }
1133
1134 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status], '', $statusType, $mode);
1135 }
1136
1143 public function info($id)
1144 {
1145 $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
1146 $sql .= ' fk_user_creat, fk_user_modif';
1147 $sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
1148 $sql .= ' WHERE t.rowid = '.((int) $id);
1149 $result = $this->db->query($sql);
1150 if ($result) {
1151 if ($this->db->num_rows($result)) {
1152 $obj = $this->db->fetch_object($result);
1153
1154 $this->id = $obj->rowid;
1155
1156 $this->user_creation_id = $obj->fk_user_creat;
1157 $this->user_modification_id = $obj->fk_user_modif;
1158 $this->date_creation = $this->db->jdate($obj->datec);
1159 $this->date_modification = empty($obj->datem) ? '' : $this->db->jdate($obj->datem);
1160 }
1161
1162 $this->db->free($result);
1163 } else {
1164 dol_print_error($this->db);
1165 }
1166 }
1167
1174 public function initAsSpecimen()
1175 {
1176 return $this->initAsSpecimenCommon();
1177 }
1178
1184 public function getLinesArray()
1185 {
1186 $this->lines = array();
1187
1188 $objectline = new PartnershipLine($this->db);
1189 $result = $objectline->fetchAll('ASC', 'position', 0, 0, '(fk_partnership:=:'.((int) $this->id).')');
1190
1191 if (is_numeric($result)) {
1192 $this->error = $objectline->error;
1193 $this->errors = $objectline->errors;
1194 return $result;
1195 } else {
1196 $this->lines = $result;
1197 return $this->lines;
1198 }
1199 }
1200
1206 public function getNextNumRef()
1207 {
1208 global $langs, $conf;
1209 $langs->load("partnership");
1210
1211 if (!getDolGlobalString('PARTNERSHIP_ADDON')) {
1212 $conf->global->PARTNERSHIP_ADDON = 'mod_partnership_standard';
1213 }
1214
1215 if (getDolGlobalString('PARTNERSHIP_ADDON')) {
1216 $mybool = false;
1217
1218 $file = getDolGlobalString('PARTNERSHIP_ADDON') . ".php";
1219 $classname = getDolGlobalString('PARTNERSHIP_ADDON');
1220
1221 // Include file with class
1222 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
1223 foreach ($dirmodels as $reldir) {
1224 $dir = dol_buildpath($reldir."core/modules/partnership/");
1225
1226 // Load file with numbering class (if found)
1227 $mybool = ((bool) @include_once $dir.$file) || $mybool;
1228 }
1229
1230 if ($mybool === false) {
1231 dol_print_error(null, "Failed to include file ".$file);
1232 return '';
1233 }
1234
1235 if (class_exists($classname)) {
1236 $obj = new $classname();
1237 $numref = $obj->getNextValue($this);
1238
1239 if ($numref != '' && $numref != '-1') {
1240 return $numref;
1241 } else {
1242 $this->error = $obj->error;
1243 //dol_print_error($this->db,get_class($this)."::getNextNumRef ".$obj->error);
1244 return "";
1245 }
1246 } else {
1247 print $langs->trans("Error")." ".$langs->trans("ClassNotFound").' '.$classname;
1248 return "";
1249 }
1250 } else {
1251 print $langs->trans("ErrorNumberingModuleNotSetup", $this->element);
1252 return "";
1253 }
1254 }
1255
1267 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
1268 {
1269 global $conf, $langs;
1270
1271 $result = 0;
1272 $includedocgeneration = 0;
1273
1274 $langs->load("partnership");
1275
1276 if (!dol_strlen($modele)) {
1277 $modele = 'standard_partnership';
1278
1279 if (!empty($this->model_pdf)) {
1280 $modele = $this->model_pdf;
1281 } elseif (getDolGlobalString('PARTNERSHIP_ADDON_PDF')) {
1282 $modele = getDolGlobalString('PARTNERSHIP_ADDON_PDF');
1283 }
1284 }
1285
1286 $modelpath = "core/modules/partnership/doc/";
1287
1288 if ($includedocgeneration && !empty($modele)) {
1289 $result = $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
1290 }
1291
1292 return $result;
1293 }
1294
1302 public function doScheduledJob()
1303 {
1304 //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log';
1305
1306 $error = 0;
1307 $this->output = '';
1308 $this->error = '';
1309
1310 dol_syslog(__METHOD__, LOG_DEBUG);
1311
1312 //$now = dol_now();
1313
1314 $this->db->begin();
1315
1316 // ...
1317
1318 $this->db->commit();
1319
1320 return $error;
1321 }
1322
1330 public function getKanbanView($option = '', $arraydata = null)
1331 {
1332 $selected = (empty($arraydata['selected']) ? 0 : $arraydata['selected']);
1333
1334 $return = '<div class="box-flex-item box-flex-grow-zero">';
1335 $return .= '<div class="info-box info-box-sm">';
1336 $return .= '<span class="info-box-icon bg-infobox-action">';
1337 $return .= img_picto('', $this->picto);
1338 $return .= '</span>';
1339 $return .= '<div class="info-box-content">';
1340 $return .= '<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this, 'getNomUrl') ? $this->getNomUrl() : $this->ref).'</span>';
1341 if ($selected >= 0) {
1342 $return .= '<input id="cb'.$this->id.'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->id.'"'.($selected ? ' checked="checked"' : '').'>';
1343 }
1344 if (property_exists($this, 'label')) {
1345 $return .= ' <div class="inline-block opacitymedium valignmiddle tdoverflowmax100">'.$this->label.'</div>';
1346 }
1347 if (property_exists($this, 'thirdparty') && is_object($this->thirdparty)) {
1348 $return .= '<br><div class="info-box-ref tdoverflowmax150">'.$this->thirdparty->getNomUrl(1).'</div>';
1349 }
1350 if (method_exists($this, 'getLibStatut')) {
1351 $return .= '<br><div class="info-box-status">'.$this->getLibStatut(3).'</div>';
1352 }
1353 $return .= '</div>';
1354 $return .= '</div>';
1355 $return .= '</div>';
1356
1357 return $return;
1358 }
1359}
1360
1361
1362require_once DOL_DOCUMENT_ROOT.'/core/class/commonobjectline.class.php';
1363
1368{
1369 // To complete with content of an object PartnershipLine
1370 // We should have a field rowid, fk_partnership and position
1371
1372
1378 public function __construct(DoliDB $db)
1379 {
1380 $this->db = $db;
1381
1382 $this->isextrafieldmanaged = 0;
1383 }
1384}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition security.php:637
$object ref
Definition info.php:79
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
deleteLineCommon(User $user, $idline, $notrigger=0)
Delete a line of object in database.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
createCommon(User $user, $notrigger=0)
Create object in the database.
getFieldList($alias='', $excludefields=array())
Function to concat keys of fields.
updateCommon(User $user, $notrigger=0)
Update object into database.
setStatusCommon($user, $status, $notrigger=0, $triggercode='')
Set to a status.
initAsSpecimenCommon()
Initialise object with example values Id must be 0 if object instance is a specimen.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
fetchLinesCommon($morewhere='', $noextrafields=0)
Load object in memory from the database.
deleteCommon(User $user, $notrigger=0, $forcechilddeletion=0)
Delete object in database.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage Dolibarr database access.
Class for Partnership.
initAsSpecimen()
Initialise object with example values Id must be 0 if object instance is a specimen.
__construct(DoliDB $db)
Constructor.
getNextNumRef()
Returns the reference to the following non used object depending on the active numbering module.
validate($user, $notrigger=0)
Validate object.
getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1)
Return a link to the object card (with optionally the picto)
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
static replaceThirdparty($db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
create(User $user, $notrigger=0)
Create object into database.
update(User $user, $notrigger=0)
Update object into database.
createFromClone(User $user, $fromid)
Clone an object into another one.
setDraft($user, $notrigger=0)
Set draft status.
refused($user, $reasondeclinenote='', $notrigger=0)
Set refused status.
fetch($id, $ref=null, $fk_member=null, $fk_soc=null)
Load object in memory from the database Get object from database.
getKanbanView($option='', $arraydata=null)
Return a thumb for kanban views.
getLinesArray()
Create an array of lines.
getTooltipContentArray($params)
getTooltipContentArray
cancel($user, $notrigger=0)
Set cancel status.
reopen($user, $notrigger=0)
Set back to validated status.
fetchLines()
Load object lines in memory from the database.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND')
Load list of objects in memory from the database.
doScheduledJob()
Action executed by scheduler CAN BE A CRON TASK.
getLibStatut($mode=0)
Return the label of the status.
LibStatut($status, $mode=0)
Return the status.
info($id)
Load the info information in the object.
approve($user, $notrigger=0)
Approve object.
deleteLine(User $user, $idline, $notrigger=0)
Delete a line of object in database.
Class PartnershipLine.
__construct(DoliDB $db)
Constructor.
Class to manage Dolibarr users.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition files.lib.php:63
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.