dolibarr 24.0.0-beta
new.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2001-2002 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2006-2013 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2012 J. Fernando Lagrange <fernando@demo-tic.org>
7 * Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
9 * Copyright (C) 2021 Waël Almoman <info@almoman.com>
10 * Copyright (C) 2022 Udo Tamm <dev@dolibit.de>
11 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
33if (!defined('NOLOGIN')) {
34 define("NOLOGIN", 1); // This means this output page does not require to be logged.
35}
36if (!defined('NOCSRFCHECK')) {
37 define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
38}
39if (!defined('NOBROWSERNOTIF')) {
40 define('NOBROWSERNOTIF', '1');
41}
42
43
44// For MultiCompany module.
45// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
46// Because 2 entities can have the same ref
47$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
48// if (is_numeric($entity)) { // value is casted to int so always numeric
49define("DOLENTITY", $entity);
50// }
51
52
53// Load Dolibarr environment
54require '../../main.inc.php';
55require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
56require_once DOL_DOCUMENT_ROOT . '/core/lib/payments.lib.php';
57require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
58require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent_type.class.php';
59require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
60require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
61require_once DOL_DOCUMENT_ROOT . '/core/class/cunits.class.php';
62require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
63require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php';
64require_once DOL_DOCUMENT_ROOT . '/core/lib/public.lib.php';
65
73// Init vars
74$backtopage = GETPOST('backtopage', 'alpha');
75$action = GETPOST('action', 'aZ09');
76
77$errmsg = '';
78$num = 0;
79$error = 0;
80
81// Load translation files
82$langs->loadLangs(array("main", "members", "companies", "install", "other", "errors"));
83
84// Security check
85if (!isModEnabled('societe')) {
86 httponly_accessforbidden('Module Thirdparty not enabled');
87}
88
89if (!getDolGlobalString('SOCIETE_ENABLE_PUBLIC')) {
90 httponly_accessforbidden("Online form for contact for public visitors has not been enabled (option SOCIETE_ENABLE_PUBLIC)");
91}
92
93
94// permissions
95
96$permissiontoadd = $user->hasRight('societe', 'creer');
97
98// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
99$hookmanager->initHooks(array('publicnewmembercard', 'globalcard'));
100
101$extrafields = new ExtraFields($db);
102
103$object = new Societe($db);
104$user->loadDefaultValues();
105
106$extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels
107
108
123function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = [], $arrayofcss = [], $ws = '') // @phan-suppress-current-line PhanRedefineFunction
124{
125 global $langs, $mysoc;
126
127 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers
128
129 print '<body id="mainbody" class="publicnewmemberform">';
130
131 include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
132 htmlPrintOnlineHeader($mysoc, $langs, 1, getDolGlobalString('THIRDPARTY_PUBLIC_INTERFACE_TOPIC'), 'THIRDPARTY_PUBLIC_INTERFACE_IMAGE');
133
134 print '<div class="divmainbodylarge">';
135}
136
144function llxFooterVierge() // @phan-suppress-current-line PhanRedefineFunction
145{
146 global $conf, $langs;
147
148 print '</div>';
149
150 printCommonFooter('public');
151
152 if (!empty($conf->use_javascript_ajax)) {
153 print "\n" . '<!-- Includes JS Footer of Dolibarr -->' . "\n";
154 print '<script src="' . DOL_URL_ROOT . '/core/js/lib_foot.js.php?lang=' . $langs->defaultlang . '"></script>' . "\n";
155 }
156
157 print "</body>\n";
158 print "</html>\n";
159}
160
161
162
163/*
164 * Actions
165 */
166
167$parameters = array();
168// Note that $action and $object may have been modified by some hooks
169$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
170if ($reshook < 0) {
171 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
172}
173
174// Action called when page is submitted
175if (empty($reshook) && $action == 'add') { // Test on permission not required here. This is a public page. Security is done on constant and mitigation.
176 $error = 0;
177 $urlback = '';
178
179 $db->begin();
180
181 if (!GETPOST('name')) {
182 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Company")), null, 'errors');
183 $error++;
184 }
185
186 // Check Captcha code if is enabled
187 if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_THIRDPARTY')) {
188 $sessionkey = 'dol_antispam_value';
189 $ok = (array_key_exists($sessionkey, $_SESSION) && (strtolower($_SESSION[$sessionkey]) == strtolower(GETPOST('code'))));
190 if (!$ok) {
191 $error++;
192 $errmsg .= $langs->trans("ErrorBadValueForCode") . "<br>\n";
193 $action = '';
194 }
195 }
196
197 if (!$error) {
198 $societe = new Societe($db);
199
200 $societe->name = GETPOST('name', 'alphanohtml');
201 $societe->client = GETPOSTINT('client') ? GETPOSTINT('client') : $societe->client;
202 $societe->address = GETPOST('address', 'alphanohtml');
203 $societe->country_id = GETPOSTINT('country_id');
204 $societe->phone = GETPOST('phone', 'alpha');
205 $societe->fax = GETPOST('fax', 'alpha');
206 $societe->email = trim(GETPOST('email', 'email'));
207 $societe->client = 2 ; // our client is a prospect
208 $societe->code_client = '-1';
209 $societe->name_alias = GETPOST('name_alias', 'alphanohtml');
210 $societe->note_private = GETPOST('note_private', 'alphanohtml');
211 $societe->ip = getUserRemoteIP();
212
213 // Fill array 'array_options' with data from add form
214 /*
215 $extrafields->fetch_name_optionals_label($societe->table_element);
216 $ret = $extrafields->setOptionalsFromPost(null, $societe);
217 if ($ret < 0) {
218 $error++;
219 $errmsg .= $societe->error;
220 }
221 */
222
223 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
224
225 if (checkNbPostsForASpeceificIp($societe, $nb_post_max) <= 0) {
226 $error++;
227 $errmsg .= implode('<br>', $societe->errors);
228 }
229
230 if (!$error) {
231 $result = $societe->create($user);
232 if ($result > 0) {
233 require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
234 $object = $societe;
235
236 if (!empty($backtopage)) {
237 $urlback = $backtopage;
238 } elseif (getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION')) {
239 $urlback = getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION');
240 // TODO Make replacement of __AMOUNT__, etc...
241 } else {
242 $urlback = $_SERVER["PHP_SELF"] . "?action=added&token=" . newToken();
243 }
244 } else {
245 $error++;
246 $errmsg .= implode('<br>', $societe->errors);
247 }
248 }
249 }
250
251 if (!$error) {
252 $db->commit();
253
254 header("Location: " . $urlback);
255 exit;
256 } else {
257 $db->rollback();
258 $action = "create";
259 }
260}
261
262// Action called after a submitted was send and prospect created successfully
263// If MEMBER_URL_REDIRECT_SUBSCRIPTION is set to an url, we never go here because a redirect was done to this url. Same if we ask to redirect to the payment page.
264// backtopage parameter with an url was set on prospect submit page, we never go here because a redirect was done to this url.
265
266if (empty($reshook) && $action == 'added') { // Test on permission not required here
267 llxHeaderVierge("newSocieteAdded");
268
269 // If we have not been redirected
270 print '<br><br>';
271 print '<div class="center">';
272 print $langs->trans("newSocieteAdded");
273 print '</div>';
274
276 exit;
277}
278
279
280
281/*
282 * View
283 */
284
285$form = new Form($db);
286$formcompany = new FormCompany($db);
287$adht = new AdherentType($db);
288$formadmin = new FormAdmin($db);
289
290
291llxHeaderVierge($langs->trans("ContactUs"));
292
293print '<br>';
294print load_fiche_titre(img_picto('', 'member_nocolor', 'class="pictofixedwidth"') . ' &nbsp; ' . $langs->trans("ContactUs"), '', '', 0, '', 'center');
295
296
297print '<div align="center">';
298print '<div id="divsubscribe">';
299
300print '<div class="center subscriptionformhelptext opacitymedium">';
301if (getDolGlobalString('COMPANY_NEWFORM_TEXT')) {
302 print $langs->trans(getDolGlobalString('COMPANY_NEWFORM_TEXT')) . "<br>\n";
303} else {
304 print $langs->trans("ContactUsDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL")) . "<br>\n";
305}
306print '</div>';
307
308dol_htmloutput_errors($errmsg);
310
311// Print form
312print '<form action="' . $_SERVER["PHP_SELF"] . '" method="POST" name="newprospect">' . "\n";
313print '<input type="hidden" name="token" value="' . newToken() . '" / >';
314print '<input type="hidden" name="entity" value="' . $entity . '" />';
315print '<input type="hidden" name="action" value="add" />';
316print '<br>';
317
318$messagemandatory = '<span class="">' . $langs->trans("FieldsWithAreMandatory", '*') . '</span>';
319//print '<br><span class="opacitymedium">'.$langs->trans("FieldsWithAreMandatory", '*').'</span><br>';
320//print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
321
322print dol_get_fiche_head();
323
324print '<script type="text/javascript">
325jQuery(document).ready(function () {
326 jQuery(document).ready(function () {
327 function initmorphy()
328 {
329 console.log("Call initmorphy");
330 if (jQuery("#morphy").val() == \'phy\') {
331 jQuery("#trcompany").hide();
332 }
333 if (jQuery("#morphy").val() == \'mor\') {
334 jQuery("#trcompany").show();
335 }
336 }
337 initmorphy();
338 jQuery("#morphy").change(function() {
339 initmorphy();
340 });
341 jQuery("#selectcountry_id").change(function() {
342 document.newprospect.action.value="create";
343 document.newprospect.submit();
344 });
345 jQuery("#typeid").change(function() {
346 document.newprospect.action.value="create";
347 document.newprospect.submit();
348 });
349 });
350});
351</script>';
352
353
354print '<table class="border" summary="form to subscribe" id="tablesubscribe">' . "\n";
355//Third party name
356/*
357if ($object->particulier || $private) {
358 print '<span id="TypeName" class="fieldrequired">'.$langs->trans('ThirdPartyName').' / '.$langs->trans('LastName', 'name').'</span>';
359} else {
360 print '<span id="TypeName" class="fieldrequired">'.$form->editfieldkey('ThirdPartyName', 'name', '', $object, 0).'</span>';
361}
362*/
363print '<tr class="tr-field-thirdparty-name"><td class="titlefieldcreate">'; // text appreas left
364print '<input type="hidden" name="ThirdPartyName" value="' . $langs->trans('ThirdPartyName') . '">';
365print '<span id="TypeName" title="' .dol_escape_htmltag($langs->trans("FieldsWithAreMandatory", '*')) . '" >' . $form->editfieldkey('Company', 'name', '', $object, 0) . '<span class="star"> *</span></span>';
366print '</td><td>'; // inline input
367print '<input type="text" class="minwidth300" maxlength="128" name="name" id="name" value="' . dol_escape_htmltag($object->name) . '" autofocus="autofocus">';
368//
369
370// Name and lastname
371print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Firstname") . ' <span class="star">*</span></td><td><input type="text" name="firstname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('firstname')) . '"></td></tr>' . "\n";
372
373print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Lastname") . ' <span class="star">*</span></td><td><input type="text" name="lastname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('lastname')) . '"></td></tr>' . "\n";
374
375// Address
376print '<tr><td class="tdtop">';
377print $form->editfieldkey('Address', 'address', '', $object, 0);
378print '</td>';
379print '<td>';
380print '<textarea name="address" id="address" class="quatrevingtpercent" rows="' . ROWS_2 . '" wrap="soft">';
381print dol_escape_htmltag($object->address, 0, 1);
382print '</textarea>';
383print $form->widgetForTranslation("address", $object, $permissiontoadd, 'textarea', 'alphanohtml', 'quatrevingtpercent');
384print '</td></tr>';
385
386// Country
387print '<tr><td>' . $form->editfieldkey('Country', 'selectcountry_id', '', $object, 0) . '</td><td class="maxwidthonsmartphone">';
388print img_picto('', 'country', 'class="pictofixedwidth"');
389print $form->select_country((GETPOSTISSET('country_id') ? GETPOST('country_id') : $object->country_id), 'country_id', '', 0, 'minwidth300 maxwidth500 widthcentpercentminusx');
390if ($user->admin) {
391 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
392}
393print '</td></tr>';
394
395// Phone / Fax
396print '<tr><td>' . $form->editfieldkey('Phone', 'phone', '', $object, 0) . '</td>';
397print '<td>' . img_picto('', 'object_phoning', 'class="pictofixedwidth"') . ' <input type="text" name="phone" id="phone" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('phone') ? GETPOST('phone', 'alpha') : $object->phone) . '"></td>';
398print '</tr>';
399
400print '<tr>';
401print '<td>' . $form->editfieldkey('Fax', 'fax', '', $object, 0) . '</td>';
402print '<td>' . img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"') . ' <input type="text" name="fax" id="fax" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $object->fax) . '"></td>';
403print '</tr>';
404
405// Email / Web
406print '<tr><td>' . $form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '', !getDolGlobalString('SOCIETE_EMAIL_MANDATORY') ? '' : $conf->global->SOCIETE_EMAIL_MANDATORY) . '</td>';
407print '<td>' . img_picto('', 'object_email', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth200 widthcentpercentminusx" name="email" id="email" value="' . $object->email . '"></td>';
408if (isModEnabled('mailing') && getDolGlobalString('THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION')) {
409 if ($conf->browser->layout == 'phone') {
410 print '</tr><tr>';
411 }
412 print '<td class="individualline noemail">' . $form->editfieldkey($langs->trans('No_Email') . ' (' . $langs->trans('Contact') . ')', 'contact_no_email', '', $object, 0) . '</td>';
413 print '<td class="individualline" ' . (($conf->browser->layout == 'phone') /* || !isModEnabled('mailing') */ ? ' colspan="3"' : '') . '>' . $form->selectyesno('contact_no_email', (GETPOSTISSET("contact_no_email") ? GETPOST("contact_no_email", 'alpha') : (empty($object->no_email) ? 0 : 1)), 1, false, 1) . '</td>';
414}
415print '</tr>';
416
417print '<tr><td>' . $form->editfieldkey('Web', 'url', '', $object, 0) . '</td>';
418print '<td>' . img_picto('', 'globe', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth500 widthcentpercentminusx" name="url" id="url" value="' . $object->url . '"></td></tr>';
419
420
421// Comments
422print '<tr>';
423print '<td class="tdtop">' . $langs->trans("Comments") . '</td>';
424print '<td class="tdtop"><textarea name="note_private" id="note_private" wrap="soft" class="quatrevingtpercent" rows="' . ROWS_3 . '">' . dol_escape_htmltag(GETPOST('note_private', 'restricthtml'), 0, 1) . '</textarea></td>';
425print '</tr>' . "\n";
426
427
428// Other attributes
429$parameters['tpl_context'] = 'public'; // define template context to public
430include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
431
432
433// TODO Move this into generic feature.
434
435// Display Captcha code if is enabled
436if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_THIRDPARTY')) {
437 require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php';
438 print '<tr><td class="titlefield"><label for="email"><span class="fieldrequired">' . $langs->trans("SecurityCode") . '</span></label></td><td>';
439 print '<span class="span-icon-security inline-block">';
440 print '<input id="securitycode" placeholder="' . $langs->trans("SecurityCode") . '" class="flat input-icon-security width150" type="text" maxlength="5" name="code" tabindex="3" />';
441 print '</span>';
442 print '<span class="nowrap inline-block">';
443 print '<img class="inline-block valignmiddle" src="' . DOL_URL_ROOT . '/core/antispamimage.php" border="0" width="80" height="32" id="img_securitycode" />';
444 print '<a class="inline-block valignmiddle" href="' . $_SERVER['PHP_SELF'] . '" tabindex="4" data-role="button">' . img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"') . '</a>';
445 print '</span>';
446 print '</td></tr>';
447}
448
449print "</table>\n";
450
451print dol_get_fiche_end();
452
453// Save / Submit
454print '<div class="center">';
455print '<input type="submit" value="' . $langs->trans("Send") . '" id="submitsave" class="button">';
456if (!empty($backtopage)) {
457 print ' &nbsp; &nbsp; <input type="submit" value="' . $langs->trans("Cancel") . '" id="submitcancel" class="button button-cancel">';
458}
459print '</div>';
460
461
462print "</form>\n";
463print "<br>";
464print '</div></div>';
465
466
467
469
470$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
Class to manage members type.
Class to manage standard extra fields.
Class to generate html code for admin pages.
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 to manage third parties objects (customers, suppliers, prospects...)
llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[], $ws='')
Show header for new prospect.
Definition new.php:123
llxFooterVierge()
Show footer for new societe.
Definition new.php:144
htmlPrintOnlineHeader($mysoc, $langs, $showlogo=1, $alttext='', $subimageconst='', $altlogo1='', $altlogo2='')
Show the header of a company in HTML public pages.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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)
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
checkNbPostsForASpeceificIp($object, $nb_post_max)
Check if the object exceeded the number of posts for a specific ip in the same week.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.