dolibarr  20.0.0-alpha
webhook.php
1 <?php
2 /* Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
25 // Load Dolibarr environment
26 require '../main.inc.php';
27 require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php";
28 require_once DOL_DOCUMENT_ROOT.'/webhook/lib/webhook.lib.php';
29 
30 // Translations
31 $langs->loadLangs(array("admin", "webhook"));
32 
33 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
34 $hookmanager->initHooks(array('webhooksetup', 'globalsetup'));
35 
36 // Access control
37 if (!$user->admin) {
39 }
40 
41 // Parameters
42 $action = GETPOST('action', 'aZ09');
43 $backtopage = GETPOST('backtopage', 'alpha');
44 $modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
45 
46 $value = GETPOST('value', 'alpha');
47 $label = GETPOST('label', 'alpha');
48 $scandir = GETPOST('scan_dir', 'alpha');
49 $type = 'myobject';
50 
51 
52 $error = 0;
53 $setupnotempty = 0;
54 
55 // Set this to 1 to use the factory to manage constants. Warning, the generated module will be compatible with version v15+ only
56 $useFormSetup = 1;
57 
58 if (!class_exists('FormSetup')) {
59  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsetup.class.php';
60 }
61 
62 $formSetup = new FormSetup($db);
63 
64 
65 $setupnotempty = count($formSetup->items);
66 
67 
68 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
69 
70 
71 /*
72  * Actions
73  */
74 
75 include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
76 
77 if ($action == 'updateMask') {
78  $maskconst = GETPOST('maskconst', 'aZ09');
79  $maskvalue = GETPOST('maskvalue', 'alpha');
80 
81  if ($maskconst && preg_match('/_MASK$/', $maskconst)) {
82  $res = dolibarr_set_const($db, $maskconst, $maskvalue, 'chaine', 0, '', $conf->entity);
83  if (!($res > 0)) {
84  $error++;
85  }
86  }
87 
88  if (!$error) {
89  setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
90  } else {
91  setEventMessages($langs->trans("Error"), null, 'errors');
92  }
93 } elseif ($action == 'setmod') {
94  // TODO Check if numbering module chosen can be activated by calling method canBeActivated
95  $tmpobjectkey = GETPOST('object', 'aZ09');
96  if (!empty($tmpobjectkey)) {
97  $constforval = 'WEBHOOK_'.strtoupper($tmpobjectkey)."_ADDON";
98  dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity);
99  }
100 } elseif ($action == 'set') {
101  // Activate a model
102  $ret = addDocumentModel($value, $type, $label, $scandir);
103 } elseif ($action == 'del') {
104  $ret = delDocumentModel($value, $type);
105  if ($ret > 0) {
106  $tmpobjectkey = GETPOST('object', 'aZ09');
107  if (!empty($tmpobjectkey)) {
108  $constforval = 'WEBHOOK_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
109  if (getDolGlobalString($constforval) == "$value") {
110  dolibarr_del_const($db, $constforval, $conf->entity);
111  }
112  }
113  }
114 } elseif ($action == 'setdoc') {
115  // Set or unset default model
116  $tmpobjectkey = GETPOST('object', 'aZ09');
117  if (!empty($tmpobjectkey)) {
118  $constforval = 'WEBHOOK_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
119  if (dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity)) {
120  // The constant that was read before the new set
121  // We therefore requires a variable to have a coherent view
122  $conf->global->$constforval = $value;
123  }
124 
125  // We disable/enable the document template (into llx_document_model table)
126  $ret = delDocumentModel($value, $type);
127  if ($ret > 0) {
128  $ret = addDocumentModel($value, $type, $label, $scandir);
129  }
130  }
131 } elseif ($action == 'unsetdoc') {
132  $tmpobjectkey = GETPOST('object', 'aZ09');
133  if (!empty($tmpobjectkey)) {
134  $constforval = 'WEBHOOK_'.strtoupper($tmpobjectkey).'_ADDON_PDF';
135  dolibarr_del_const($db, $constforval, $conf->entity);
136  }
137 }
138 
139 
140 
141 /*
142  * View
143  */
144 
145 $form = new Form($db);
146 
147 $help_url = '';
148 $page_name = "WebhookSetup";
149 
150 llxHeader('', $langs->trans($page_name), $help_url);
151 
152 // Subheader
153 $linkback = '<a href="'.($backtopage ? $backtopage : DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1').'">'.$langs->trans("BackToModuleList").'</a>';
154 
155 print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
156 
157 // Configuration header
158 $head = webhookAdminPrepareHead();
159 print dol_get_fiche_head($head, 'settings', $langs->trans($page_name), -1, "webhook");
160 
161 // Setup page goes here
162 echo '<span class="opacitymedium">'.$langs->trans("WebhookSetupPage", $langs->transnoentitiesnoconv("Targets")).'</span><br><br>';
163 
164 
165 if ($action == 'edit') {
166  if ($useFormSetup && (float) DOL_VERSION >= 15) {
167  print $formSetup->generateOutput(true);
168  } else {
169  print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
170  print '<input type="hidden" name="token" value="'.newToken().'">';
171  print '<input type="hidden" name="action" value="update">';
172 
173  print '<table class="noborder centpercent">';
174  print '<tr class="liste_titre"><td class="titlefield">'.$langs->trans("Parameter").'</td><td>'.$langs->trans("Value").'</td></tr>';
175 
176  foreach ($arrayofparameters as $constname => $val) {
177  if ($val['enabled'] == 1) {
178  $setupnotempty++;
179  print '<tr class="oddeven"><td>';
180  $tooltiphelp = (($langs->trans($constname . 'Tooltip') != $constname . 'Tooltip') ? $langs->trans($constname . 'Tooltip') : '');
181  print '<span id="helplink'.$constname.'" class="spanforparamtooltip">'.$form->textwithpicto($langs->trans($constname), $tooltiphelp, 1, 'info', '', 0, 3, 'tootips'.$constname).'</span>';
182  print '</td><td>';
183 
184  if ($val['type'] == 'textarea') {
185  print '<textarea class="flat" name="'.$constname.'" id="'.$constname.'" cols="50" rows="5" wrap="soft">' . "\n";
186  print getDolGlobalString($constname);
187  print "</textarea>\n";
188  } elseif ($val['type'] == 'html') {
189  require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
190  $doleditor = new DolEditor($constname, getDolGlobalString($constname), '', 160, 'dolibarr_notes', '', false, false, isModEnabled('fckeditor'), ROWS_5, '90%');
191  $doleditor->Create();
192  } elseif ($val['type'] == 'yesno') {
193  print $form->selectyesno($constname, getDolGlobalString($constname), 1);
194  } elseif (preg_match('/emailtemplate:/', $val['type'])) {
195  include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
196  $formmail = new FormMail($db);
197 
198  $tmp = explode(':', $val['type']);
199  $nboftemplates = $formmail->fetchAllEMailTemplate($tmp[1], $user, null, 1); // We set lang=null to get in priority record with no lang
200  //$arraydefaultmessage = $formmail->getEMailTemplate($db, $tmp[1], $user, null, 0, 1, '');
201  $arrayofmessagename = array();
202  if (is_array($formmail->lines_model)) {
203  foreach ($formmail->lines_model as $modelmail) {
204  //var_dump($modelmail);
205  $moreonlabel = '';
206  if (!empty($arrayofmessagename[$modelmail->label])) {
207  $moreonlabel = ' <span class="opacitymedium">(' . $langs->trans("SeveralLangugeVariatFound") . ')</span>';
208  }
209  // The 'label' is the key that is unique if we exclude the language
210  $arrayofmessagename[$modelmail->id] = $langs->trans(preg_replace('/\‍(|\‍)/', '', $modelmail->label)) . $moreonlabel;
211  }
212  }
213  print $form->selectarray($constname, $arrayofmessagename, getDolGlobalString($constname), 'None', 0, 0, '', 0, 0, 0, '', '', 1);
214  } elseif (preg_match('/category:/', $val['type'])) {
215  require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
216  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
217  $formother = new FormOther($db);
218 
219  $tmp = explode(':', $val['type']);
220  print img_picto('', 'category', 'class="pictofixedwidth"');
221  print $formother->select_categories($tmp[1], getDolGlobalString($constname), $constname, 0, $langs->trans('CustomersProspectsCategoriesShort'));
222  } elseif (preg_match('/thirdparty_type/', $val['type'])) {
223  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
224  $formcompany = new FormCompany($db);
225  print $formcompany->selectProspectCustomerType(getDolGlobalString($constname), $constname);
226  } elseif ($val['type'] == 'securekey') {
227  print '<input required="required" type="text" class="flat" id="'.$constname.'" name="'.$constname.'" value="'.(GETPOST($constname, 'alpha') ? GETPOST($constname, 'alpha') : getDolGlobalString($constname)).'" size="40">';
228  if (!empty($conf->use_javascript_ajax)) {
229  print '&nbsp;'.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_token'.$constname.'" class="linkobject"');
230  }
231 
232  // Add button to autosuggest a key
233  include_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
234  print dolJSToSetRandomPassword($constname, 'generate_token'.$constname);
235  } elseif ($val['type'] == 'product') {
236  if (isModEnabled("product") || isModEnabled("service")) {
237  $selected = getDolGlobalString($constname);
238  $form->select_produits($selected, $constname, '', 0);
239  }
240  } else {
241  print '<input name="'.$constname.'" class="flat '.(empty($val['css']) ? 'minwidth200' : $val['css']).'" value="'.getDolGlobalString($constname).'">';
242  }
243  print '</td></tr>';
244  }
245  }
246  print '</table>';
247 
248  print '<br><div class="center">';
249  print '<input class="button button-save" type="submit" value="'.$langs->trans("Save").'">';
250  print '</div>';
251 
252  print '</form>';
253  }
254 
255  print '<br>';
256 } else {
257  if ($useFormSetup && (float) DOL_VERSION >= 15) {
258  if (!empty($formSetup->items)) {
259  print $formSetup->generateOutput();
260  }
261  } else {
262  if (!empty($arrayofparameters)) {
263  print '<table class="noborder centpercent">';
264  print '<tr class="liste_titre"><td class="titlefield">'.$langs->trans("Parameter").'</td><td>'.$langs->trans("Value").'</td></tr>';
265 
266  foreach ($arrayofparameters as $constname => $val) {
267  if ($val['enabled'] == 1) {
268  $setupnotempty++;
269  print '<tr class="oddeven"><td>';
270  $tooltiphelp = (($langs->trans($constname . 'Tooltip') != $constname . 'Tooltip') ? $langs->trans($constname . 'Tooltip') : '');
271  print $form->textwithpicto($langs->trans($constname), $tooltiphelp);
272  print '</td><td>';
273 
274  if ($val['type'] == 'textarea') {
275  print dol_nl2br(getDolGlobalString($constname));
276  } elseif ($val['type'] == 'html') {
277  print getDolGlobalString($constname);
278  } elseif ($val['type'] == 'yesno') {
279  print ajax_constantonoff($constname);
280  } elseif (preg_match('/emailtemplate:/', $val['type'])) {
281  include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
282  $formmail = new FormMail($db);
283 
284  $tmp = explode(':', $val['type']);
285 
286  $template = $formmail->getEMailTemplate($db, $tmp[1], $user, $langs, getDolGlobalString($constname));
287  if ($template < 0) {
288  setEventMessages(null, $formmail->errors, 'errors');
289  }
290  print $langs->trans($template->label);
291  } elseif (preg_match('/category:/', $val['type'])) {
292  $c = new Categorie($db);
293  $result = $c->fetch(getDolGlobalString($constname));
294  if ($result < 0) {
295  setEventMessages(null, $c->errors, 'errors');
296  } elseif ($result > 0) {
297  $ways = $c->print_all_ways(' &gt;&gt; ', 'none', 0, 1); // $ways[0] = "ccc2 >> ccc2a >> ccc2a1" with html formatted text
298  $toprint = array();
299  foreach ($ways as $way) {
300  $toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories"' . ($c->color ? ' style="background: #' . $c->color . ';"' : ' style="background: #bbb"') . '>' . $way . '</li>';
301  }
302  print '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">' . implode(' ', $toprint) . '</ul></div>';
303  }
304  } elseif (preg_match('/thirdparty_type/', $val['type'])) {
305  if (getDolGlobalInt($constname) == 2) {
306  print $langs->trans("Prospect");
307  } elseif (getDolGlobalInt($constname) == 3) {
308  print $langs->trans("ProspectCustomer");
309  } elseif (getDolGlobalInt($constname) == 1) {
310  print $langs->trans("Customer");
311  } elseif (getDolGlobalInt($constname) == 0) {
312  print $langs->trans("NorProspectNorCustomer");
313  }
314  } elseif ($val['type'] == 'product') {
315  $product = new Product($db);
316  $resprod = $product->fetch(getDolGlobalInt($constname));
317  if ($resprod > 0) {
318  print $product->ref;
319  } elseif ($resprod < 0) {
320  setEventMessages(null, $object->errors, "errors");
321  }
322  } else {
323  print getDolGlobalString($constname);
324  }
325  print '</td></tr>';
326  }
327  }
328 
329  print '</table>';
330  }
331  }
332 
333  if ($setupnotempty) {
334  print '<div class="tabsAction">';
335  print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a>';
336  print '</div>';
337  } else {
338  //print '<br>'.$langs->trans("NothingToSetup");
339  }
340 }
341 
342 /*
343 if (empty($setupnotempty)) {
344  print '<br>'.$langs->trans("NothingToSetup");
345 }
346 */
347 
348 // Page end
349 print dol_get_fiche_end();
350 
351 llxFooter();
352 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
addDocumentModel($name, $type, $label='', $description='')
Add document model used by doc generator.
Definition: admin.lib.php:1939
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
Definition: admin.lib.php:655
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
Definition: admin.lib.php:579
delDocumentModel($name, $type)
Delete document model used by doc generator.
Definition: admin.lib.php:1970
ajax_constantonoff($code, $input=array(), $entity=null, $revertonoff=0, $strict=0, $forcereload=0, $marginleftonlyshort=2, $forcenoajax=0, $setzeroinsteadofdel=0, $suffix='', $mode='', $morecss='inline-block')
On/off button for constant.
Definition: ajax.lib.php:646
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage categories.
Class to manage a WYSIWYG editor.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
Class permettant la generation de composants html autre Only common components are here.
This class help you create setup render.
Class to manage products or services.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dolJSToSetRandomPassword($htmlname, $htmlnameofbutton='generate_token', $generic=1)
Output javascript to autoset a generated password using default module into a HTML element.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
webhookAdminPrepareHead()
Prepare admin pages header.
Definition: webhook.lib.php:30