dolibarr 25.0.0-alpha
subscription.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2018 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2012-2017 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2015-2024 Alexandre Spangaro <aspangaro@open-dsi.fr>
7 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2019 Thibault FOUCART <support@ptibogxiv.net>
9 * Copyright (C) 2023 Waël Almoman <info@almoman.com>
10 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
32// Load Dolibarr environment
33require '../main.inc.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
45require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
46require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
47require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
48require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
49require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
50require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
51
52$langs->loadLangs(array("companies", "bills", "members", "users", "mails", 'other'));
53
54$action = GETPOST('action', 'aZ09');
55$confirm = GETPOST('confirm', 'alpha');
56$contextpage = GETPOST('contextpage', 'aZ09');
57$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
58
59$id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
60$rowid = $id;
61$ref = GETPOST('ref', 'alphanohtml');
62$typeid = GETPOSTINT('typeid');
63$cancel = GETPOST('cancel', 'alpha');
64
65// Load variable for pagination
66$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
67$sortfield = GETPOST('sortfield', 'aZ09comma');
68$sortorder = GETPOST('sortorder', 'aZ09comma');
69$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
70if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
71 // If $page is not defined, or '' or -1 or if we click on clear filters
72 $page = 0;
73}
74$offset = $limit * $page;
75$pageprev = $page - 1;
76$pagenext = $page + 1;
77
78// Default sort order (if not yet defined by previous GETPOST)
79if (!$sortfield) {
80 $sortfield = "c.rowid";
81}
82if (!$sortorder) {
83 $sortorder = "DESC";
84}
85
86$object = new Adherent($db);
87
88$adht = new AdherentType($db);
89
90// fetch optionals attributes and labels
91$extrafields->fetch_name_optionals_label($object->table_element);
92
93$errmsg = '';
94
95// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
96$hookmanager->initHooks(array('subscription'));
97
98// PDF
99$hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
100$hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
101$hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
102
103$datefrom = 0;
104$dateto = 0;
105$paymentdate = -1;
106
107// Fetch object
108if ($id > 0 || !empty($ref)) {
109 // Load member
110 $result = $object->fetch($id, $ref);
111
112 // Define variables to know what current user can do on users
113 $canadduser = ($user->admin || $user->hasRight("user", "user", "creer"));
114 // Define variables to know what current user can do on properties of user linked to edited member
115 if ($object->user_id) {
116 // $User is the user who edits, $object->user_id is the id of the related user in the edited member
117 $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "creer"))
118 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "creer")));
119 $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "password"))
120 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "password")));
121 }
122}
123
124// Define variables to determine what the current user can do on the members
125$permissiontoaddmember = $user->hasRight('adherent', 'creer');
126$permissiontoeditextra = $permissiontoaddmember;
127if (GETPOST('attribute', 'aZ09') && isset($extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')])) {
128 // For action 'update_extras', is there a specific permission set for the attribute to update
129 $permissiontoeditextra = dol_eval((string) $extrafields->attributes[$object->table_element]['perms'][GETPOST('attribute', 'aZ09')]);
130}
131
132// Security check
133$result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
134
135
136/*
137 * Actions
138 */
139
140$parameters = array();
141$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
142if ($reshook < 0) {
143 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
144}
145
146if (empty($reshook) && $action == 'update_extras' && $permissiontoeditextra) {
147 $error = 0;
148 $object->oldcopy = dol_clone($object, 2); // @phan-suppress-current-line PhanTypeMismatchProperty
149 $attribute_name = GETPOST('attribute', 'aZ09');
150
151 // Fill array 'array_options' with data from update form
152 $ret = $extrafields->setOptionalsFromPost(null, $object, $attribute_name);
153 if ($ret < 0) {
154 $error++;
155 }
156 if (!$error) {
157 $result = $object->updateExtraField($attribute_name, 'MEMBER_MODIFY');
158 if ($result < 0) {
159 setEventMessages($object->error, $object->errors, 'errors');
160 $error++;
161 }
162 }
163 if ($error) {
164 $action = 'edit_extras';
165 }
166}
167
168// Create third party from a member
169if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
170 if ($result > 0) {
171 // Creation of thirdparty
172 $company = new Societe($db);
173 $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'), GETPOST('customercode', 'alpha'));
174
175 if ($result < 0) {
176 $langs->load("errors");
177 setEventMessages($company->error, $company->errors, 'errors');
178 } else {
179 $object->socid = $result;
180
181 $action = 'createsubscription';
182 }
183 } else {
184 setEventMessages($object->error, $object->errors, 'errors');
185 }
186}
187
188if (empty($reshook) && $action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
189 $error = 0;
190 if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
191 if (GETPOSTINT("userid") != $user->id && GETPOSTINT("userid") != $object->user_id) {
192 $error++;
193 setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
194 }
195 }
196
197 if (!$error) {
198 if (GETPOSTINT("userid") != $object->user_id) { // If link differs from currently in database
199 $result = $object->setUserId(GETPOSTINT("userid"));
200 if ($result < 0) {
201 dol_print_error(null, $object->error);
202 }
203 $action = '';
204 }
205 }
206}
207
208if (empty($reshook) && $action == 'setsocid' && $permissiontoaddmember) {
209 $error = 0;
210 if (GETPOSTINT('socid') != $object->socid) { // If link differs from currently in database
211 $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "adherent";
212 $sql .= " WHERE fk_soc = " . ((int) GETPOSTINT('socid'));
213 $resql = $db->query($sql);
214 if ($resql) {
215 $obj = $db->fetch_object($resql);
216 if ($obj && $obj->rowid > 0) {
217 $othermember = new Adherent($db);
218 $othermember->fetch($obj->rowid);
219 $thirdparty = new Societe($db);
220 $thirdparty->fetch(GETPOSTINT('socid'));
221 $error++;
222 setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
223 }
224 }
225
226 if (!$error) {
227 $result = $object->setThirdPartyId(GETPOSTINT('socid'));
228 if ($result < 0) {
229 dol_print_error(null, $object->error);
230 }
231 $action = '';
232 }
233 }
234}
235
236if (empty($reshook) && $user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) {
237 $error = 0;
238
239 $langs->load("banks");
240
241 $result = $object->fetch($rowid);
242 $result = $adht->fetch($object->typeid);
243
244 // Subscription information
245 $datesubscription = 0;
246 $datesubend = 0;
247 $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
248 $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
249 $paymentdate = ''; // Do not use 0 here, default value is '' that means not filled where 0 means 1970-01-01
250 if (GETPOSTINT("reyear") && GETPOSTINT("remonth") && GETPOSTINT("reday")) {
251 $datesubscription = dol_mktime(0, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
252 }
253 if (GETPOSTINT("endyear") && GETPOSTINT("endmonth") && GETPOSTINT("endday")) {
254 $datesubend = dol_mktime(0, 0, 0, GETPOSTINT("endmonth"), GETPOSTINT("endday"), GETPOSTINT("endyear"));
255 }
256 if (GETPOSTINT("paymentyear") && GETPOSTINT("paymentmonth") && GETPOSTINT("paymentday")) {
257 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT("paymentmonth"), GETPOSTINT("paymentday"), GETPOSTINT("paymentyear"));
258 }
259 $amount = price2num(GETPOST("subscription", 'alpha')); // Amount of subscription
260 $label = GETPOST("label");
261
262 // Payment information
263 $accountid = GETPOSTINT("accountid");
264 $operation = GETPOST("operation", "alphanohtml"); // Payment mode
265 $num_chq = GETPOST("num_chq", "alphanohtml");
266 $emetteur_nom = GETPOST("chqemetteur");
267 $emetteur_banque = GETPOST("chqbank");
268 $option = GETPOST("paymentsave");
269 if (empty($option)) {
270 $option = 'none';
271 }
272 $sendalsoemail = GETPOST("sendmail", 'alpha');
273
274 // Check parameters
275 if (!$datesubscription) {
276 $error++;
277 $langs->load("errors");
278 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateSubscription"));
279 setEventMessages($errmsg, null, 'errors');
280 $action = 'createsubscription';
281 }
282 if (GETPOST('end') && !$datesubend) {
283 $error++;
284 $langs->load("errors");
285 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateEndSubscription"));
286 setEventMessages($errmsg, null, 'errors');
287 $action = 'createsubscription';
288 }
289 if (!$datesubend) {
290 $datesubend = dol_time_plus_duree(dol_time_plus_duree($datesubscription, $defaultdelay, $defaultdelayunit), -1, 'd');
291 }
292 if (($option == 'bankviainvoice' || $option == 'bankdirect') && !$paymentdate) {
293 $error++;
294 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment"));
295 setEventMessages($errmsg, null, 'errors');
296 $action = 'createsubscription';
297 }
298
299 // Check if a payment is mandatory or not
300 if ($adht->subscription) { // Member type need subscriptions
301 if (!is_numeric($amount)) {
302 // If field is '' or not a numeric value
303 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount"));
304 setEventMessages($errmsg, null, 'errors');
305 $error++;
306 $action = 'createsubscription';
307 } else {
308 // If an amount has been provided, we check also fields that becomes mandatory when amount is not null.
309 if (isModEnabled('bank') && GETPOST("paymentsave") != 'none') {
310 if (GETPOST("subscription")) {
311 if (!GETPOST("label")) {
312 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"));
313 setEventMessages($errmsg, null, 'errors');
314 $error++;
315 $action = 'createsubscription';
316 }
317 if (GETPOST("paymentsave") != 'invoiceonly' && !GETPOST("operation")) {
318 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode"));
319 setEventMessages($errmsg, null, 'errors');
320 $error++;
321 $action = 'createsubscription';
322 }
323 if (GETPOST("paymentsave") != 'invoiceonly' && !(GETPOSTINT("accountid") > 0)) {
324 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("FinancialAccount"));
325 setEventMessages($errmsg, null, 'errors');
326 $error++;
327 $action = 'createsubscription';
328 }
329 } else {
330 if (GETPOSTINT("accountid")) {
331 $errmsg = $langs->trans("ErrorDoNotProvideAccountsIfNullAmount");
332 setEventMessages($errmsg, null, 'errors');
333 $error++;
334 $action = 'createsubscription';
335 }
336 }
337 }
338 }
339 }
340
341 // Record the subscription then complementary actions
342 if (!$error && $action == 'subscription') { // Test on permission already done
343 $db->begin();
344
345 // Create subscription
346 $crowid = $object->subscription($datesubscription, (float) $amount, $accountid, $operation, $label, $num_chq, $emetteur_nom, $emetteur_banque, $datesubend);
347 if ($crowid <= 0) {
348 $error++;
349 $errmsg = $object->error;
350 setEventMessages($object->error, $object->errors, 'errors');
351 }
352
353 if (!$error) {
354 $result = $object->subscriptionComplementaryActions($crowid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, (float) $amount, $num_chq, $emetteur_nom, $emetteur_banque);
355 if ($result < 0) {
356 $error++;
357 setEventMessages($object->error, $object->errors, 'errors');
358 } else {
359 // If an invoice was created, it is into $object->invoice
360 }
361 }
362
363 if (!$error) {
364 $db->commit();
365 } else {
366 $db->rollback();
367 $action = 'createsubscription';
368 }
369
370 if (!$error) {
371 setEventMessages("SubscriptionRecorded", null, 'mesgs');
372 }
373
374 // Send email
375 if (!$error) {
376 // Send confirmation Email
377 if ($object->email && $sendalsoemail) { // $object is 'Adherent'
378 $parameters = array(
379 'datesubscription' => $datesubscription,
380 'amount' => $amount,
381 'ccountid' => $accountid,
382 'operation' => $operation,
383 'label' => $label,
384 'num_chq' => $num_chq,
385 'emetteur_nom' => $emetteur_nom,
386 'emetteur_banque' => $emetteur_banque,
387 'datesubend' => $datesubend
388 );
389 $reshook = $hookmanager->executeHooks('sendMail', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
390 if ($reshook < 0) {
391 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
392 }
393
394 if (empty($reshook)) {
395 $subject = '';
396 $msg = '';
397
398 // Send subscription email
399 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
400 $formmail = new FormMail($db);
401 // Set output language
402 $outputlangs = new Translate('', $conf);
403 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
404 // Load traductions files required by page
405 $outputlangs->loadLangs(array("main", "members"));
406
407 // Get email content from template
408 $arraydefaultmessage = null;
409 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
410
411 if (!empty($labeltouse)) {
412 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
413 }
414
415 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
416 $subject = (string) $arraydefaultmessage->topic;
417 $msg = (string) $arraydefaultmessage->content;
418 }
419
420 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
421 complete_substitutions_array($substitutionarray, $outputlangs, $object);
422 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
423 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
424
425 // Attach a file ?
426 $file = '';
427 $listofpaths = array();
428 $listofnames = array();
429 $listofmimes = array();
430 if (is_object($object->invoice) && (!is_object($arraydefaultmessage) || intval($arraydefaultmessage->joinfiles))) {
431 $invoicediroutput = $conf->facture->dir_output;
432 $fileparams = dol_most_recent_file($invoicediroutput.'/'.$object->invoice->ref, preg_quote($object->invoice->ref, '/').'[^\-]+');
433 $file = $fileparams['fullname'];
434
435 $listofpaths = array($file);
436 $listofnames = array(basename($file));
437 $listofmimes = array(dol_mimetype($file));
438 }
439
440 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/subscription.php'."\r\n";
441
442 $result = $object->sendEmail($texttosend, $subjecttosend, $listofpaths, $listofmimes, $listofnames, "", "", 0, -1, '', $moreinheader);
443 if ($result < 0) {
444 $errmsg = $object->error;
445 setEventMessages($object->error, $object->errors, 'errors');
446 } else {
447 setEventMessages($langs->trans("EmailSentToMember", $object->email), null, 'mesgs');
448 }
449 }
450 } else {
451 setEventMessages($langs->trans("NoEmailSentToMember"), null, 'mesgs');
452 }
453 }
454
455 // Clean some POST vars
456 if (!$error) {
457 $accountid = '';
458 $operation = '';
459 $label = '';
460 $num_chq = '';
461 $option = '';
462 }
463 }
464}
465
466
467
468/*
469 * View
470 */
471
472$form = new Form($db);
473
474$now = dol_now();
475
476$title = $langs->trans("Member")." - ".$langs->trans("Subscriptions");
477$help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
478
479llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-member page-card_subscription');
480
481
482$param = '';
483if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
484 $param .= '&contextpage='.urlencode($contextpage);
485}
486if ($limit > 0 && $limit != $conf->liste_limit) {
487 $param .= '&limit='.((int) $limit);
488}
489$param .= '&id='.$rowid;
490if ($optioncss != '') {
491 $param .= '&optioncss='.urlencode($optioncss);
492}
493// Add $param from extra fields
494//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
495
496
497if (! ($object->id > 0)) {
498 $langs->load("errors");
499 print $langs->trans("ErrorRecordNotFound");
500}
501
502
503$adht->fetch($object->typeid);
504
505$defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
506$defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
507
508$head = member_prepare_head($object);
509
510$rowspan = 10;
511if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
512 $rowspan++;
513}
514if (isModEnabled('societe')) {
515 $rowspan++;
516}
517
518print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
519print '<input type="hidden" name="token" value="'.newToken().'">';
520print '<input type="hidden" name="rowid" value="'.$object->id.'">';
521
522print dol_get_fiche_head($head, 'subscription', $langs->trans("Member"), -1, 'user');
523
524$linkback = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/adherents/list.php', ['restore_lastsearch_values' => 1]).'">'.$langs->trans("BackToList").'</a>';
525
526$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
527$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard', 'class="valignmiddle marginleftonly paddingrightonly"');
528$morehtmlref .= '</a>';
529
530dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
531
532print '<div class="fichecenter">';
533print '<div class="fichehalfleft">';
534
535print '<div class="underbanner clearboth"></div>';
536print '<table class="border centpercent tableforfield">';
537
538// Login
539if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
540 print '<tr><td class="titlefieldmiddle">'.$langs->trans("Login").' / '.$langs->trans("Id").'</td><td class="valeur">'.dol_escape_htmltag($object->login).'</td></tr>';
541}
542
543// Type
544print '<tr><td class="titlefieldmiddle">'.$langs->trans("Type").'</td>';
545print '<td class="valeur">'.$adht->getNomUrl(1)."</td></tr>\n";
546
547// Morphy
548print '<tr><td>'.$langs->trans("MemberNature").'</td>';
549print '<td class="valeur" >'.$object->getmorphylib('', 1).'</td>';
550print '</tr>';
551
552// Company
553print '<tr><td>'.$langs->trans("Company").'</td><td class="valeur">'.dol_escape_htmltag($object->company).'</td></tr>';
554
555// Civility
556print '<tr><td>'.$langs->trans("UserTitle").'</td><td class="valeur">'.$object->getCivilityLabel().'</td>';
557print '</tr>';
558
559// Password
560if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
561 print '<tr><td>'.$langs->trans("Password").'</td><td>';
562 if ($object->pass) {
563 print preg_replace('/./i', '*', $object->pass);
564 } else {
565 if ($user->admin) {
566 print '<!-- '.$langs->trans("Crypted").': '.$object->pass_indatabase_crypted.' -->';
567 }
568 print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
569 }
570 if (!empty($object->pass_indatabase) && empty($object->user_id)) { // Show warning only for old password still in clear (does not happen anymore)
571 $langs->load("errors");
572 $htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
573 print ' '.$form->textwithpicto('', $htmltext, 1, 'warning');
574 }
575 print '</td></tr>';
576}
577
578// Date end subscription
579print '<tr><td>'.$langs->trans("SubscriptionEndDate").'</td><td class="valeur">';
580if ($object->datefin) {
581 print dol_print_date($object->datefin, 'day');
582 if ($object->hasDelay()) {
583 print " ".img_warning($langs->trans("Late"));
584 }
585} else {
586 if ($object->need_subscription == 0) {
587 print $langs->trans("SubscriptionNotNeeded");
588 } elseif (!$adht->subscription) {
589 print $langs->trans("SubscriptionNotRecorded");
590 if (Adherent::STATUS_VALIDATED == $object->status) {
591 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
592 }
593 } else {
594 print $langs->trans("SubscriptionNotReceived");
595 if (Adherent::STATUS_VALIDATED == $object->status) {
596 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
597 }
598 }
599}
600print '</td></tr>';
601
602print '</table>';
603
604print '</div>';
605
606print '<div class="fichehalfright">';
607print '<div class="underbanner clearboth"></div>';
608
609print '<table class="border tableforfield centpercent">';
610
611// Tags / Categories
612if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
613 print '<tr><td>'.$langs->trans("Categories").'</td>';
614 print '<td colspan="2">';
615 print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
616 print '</td></tr>';
617}
618
619// Birth Date
620print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateOfBirth").'</td><td class="valeur">'.dol_print_date($object->birth, 'day').'</td></tr>';
621
622// Default language
623if (getDolGlobalInt('MAIN_MULTILANGS')) {
624 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
625 print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
626 //$s=picto_from_langcode($object->default_lang);
627 //print ($s?$s.' ':'');
628 $langs->load("languages");
629 $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
630 print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
631 print $labellang;
632 print '</td></tr>';
633}
634
635// Public
636$linkofpubliclist = DOL_MAIN_URL_ROOT.'/public/members/public_list.php'.((isModEnabled('multicompany')) ? '?entity='.$conf->entity : '');
637print '<tr><td>'.$form->textwithpicto($langs->trans("MembershipPublic"), $langs->trans("Public", getDolGlobalString('MAIN_INFO_SOCIETE_NOM'), $linkofpubliclist), 1, 'help', '', 0, 3, 'publicfile').'</td><td class="valeur">'.yn($object->public).'</td></tr>';
638
639// Other attributes
640$cols = 2;
641include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
642
643// Third party Dolibarr
644if (isModEnabled('societe')) {
645 print '<tr><td>';
646 print '<table class="nobordernopadding centpercent"><tr><td>';
647 print $langs->trans("LinkedToDolibarrThirdParty");
648 print '</td>';
649 if ($action != 'editthirdparty' && $user->hasRight('adherent', 'creer')) {
650 print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editthirdparty&token='.newToken().'&rowid='.$object->id.'">'.img_edit($langs->trans('SetLinkToThirdParty'), 1).'</a></td>';
651 }
652 print '</tr></table>';
653 print '</td><td colspan="2" class="valeur">';
654 if ($action == 'editthirdparty') {
655 $htmlname = 'socid';
656 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" name="form'.$htmlname.'">';
657 print '<input type="hidden" name="rowid" value="'.$object->id.'">';
658 print '<input type="hidden" name="action" value="set'.$htmlname.'">';
659 print '<input type="hidden" name="token" value="'.newToken().'">';
660 print '<table class="nobordernopadding">';
661 print '<tr><td>';
662 print $form->select_company($object->socid, 'socid', '', 1);
663 print '</td>';
664 print '<td class="left"><input type="submit" class="button button-edit" value="'.$langs->trans("Modify").'"></td>';
665 print '</tr></table></form>';
666 } else {
667 if ($object->socid > 0) {
668 $company = new Societe($db);
669 $result = $company->fetch($object->socid);
670 print $company->getNomUrl(1);
671
672 // Show link to invoices
673 $tmparray = $company->getOutstandingBills('customer');
674 if (!empty($tmparray['refs'])) {
675 print ' - '.img_picto($langs->trans("Invoices"), 'bill', 'class="paddingright"').'<a href="'.DOL_URL_ROOT.'/compta/facture/list.php?socid='.$object->socid.'">'.$langs->trans("Invoices").' ('.count($tmparray['refs']).')';
676 // TODO Add alert if warning on at least one invoice late
677 print '</a>';
678 }
679 } else {
680 print '<span class="opacitymedium">'.$langs->trans("NoThirdPartyAssociatedToMember").'</span>';
681 }
682 }
683 print '</td></tr>';
684}
685
686// Login Dolibarr - Link to user
687print '<tr><td>';
688print '<table class="nobordernopadding centpercent"><tr><td>';
689print $langs->trans("LinkedToDolibarrUser");
690print '</td>';
691if ($action != 'editlogin' && $user->hasRight('adherent', 'creer')) {
692 print '<td class="right">';
693 if ($user->hasRight("user", "user", "creer")) {
694 print '<a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editlogin&token='.newToken().'&rowid='.$object->id.'">'.img_edit($langs->trans('SetLinkToUser'), 1).'</a>';
695 }
696 print '</td>';
697}
698print '</tr></table>';
699print '</td><td colspan="2" class="valeur">';
700if ($action == 'editlogin') {
701 $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id, (string) $object->user_id, 'userid', array());
702} else {
703 if ($object->user_id) {
704 $linkeduser = new User($db);
705 $linkeduser->fetch($object->user_id);
706 print $linkeduser->getNomUrl(-1);
707 } else {
708 print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
709 }
710}
711print '</td></tr>';
712
713print "</table>\n";
714
715print "</div></div>\n";
716print '<div class="clearboth"></div>';
717
718print dol_get_fiche_end();
719
720
721/*
722 * Action bar
723 */
724
725// Button to create a new subscription if member no draft (-1) neither resiliated (0) neither excluded (-2)
726if ($user->hasRight('adherent', 'cotisation', 'creer')) {
727 if ($action != 'createsubscription' && $action != 'create_thirdparty') {
728 print '<div class="tabsAction">';
729
730 if ($object->status > 0) {
731 print '<div class="inline-block divButAction"><a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['rowid' => $rowid, 'action' => 'createsubscription'], true).'">'.$langs->trans("AddSubscription")."</a></div>";
732 } else {
733 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("AddSubscription").'</a></div>';
734 }
735
736 print '</div>';
737 }
738}
739
740/*
741 * List of subscriptions
742 */
743if ($action != 'createsubscription' && $action != 'create_thirdparty') {
744 $sql = "SELECT d.rowid, d.firstname, d.lastname, d.societe, d.fk_adherent_type as type,";
745 $sql .= " c.rowid as crowid, c.subscription,";
746 $sql .= " c.datec, c.fk_type as cfk_type,";
747 $sql .= " c.dateadh as dateh, c.note as clabel,";
748 $sql .= " c.datef,";
749 $sql .= " c.fk_bank,";
750 $sql .= " b.rowid as bid,";
751 $sql .= " ba.rowid as baid, ba.label, ba.bank, ba.ref, ba.account_number, ba.fk_accountancy_journal, ba.number, ba.currency_code";
752 $sql .= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."subscription as c";
753 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON c.fk_bank = b.rowid";
754 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank_account as ba ON b.fk_account = ba.rowid";
755 $sql .= " WHERE d.rowid = c.fk_adherent AND d.rowid=".((int) $rowid);
756 $sql .= $db->order($sortfield, $sortorder);
757
758 $result = $db->query($sql);
759 if ($result) {
760 $subscriptionstatic = new Subscription($db);
761
762 $num = $db->num_rows($result);
763
764 print '<div class="div-table-responsive-no-min">';
765 print '<table class="noborder centpercent">'."\n";
766
767 print '<tr class="liste_titre">';
768 print_liste_field_titre('Ref', $_SERVER["PHP_SELF"], 'c.rowid', '', $param, '', $sortfield, $sortorder);
769 print_liste_field_titre('DateCreation', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
770 print_liste_field_titre('Type', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
771 print_liste_field_titre('DateStart', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
772 print_liste_field_titre('DateEnd', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
773 print_liste_field_titre('Amount', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
774 print_liste_field_titre('Note', $_SERVER["PHP_SELF"], 'clabel', '', $param, '', $sortfield, $sortorder);
775 if (isModEnabled('bank')) {
776 print_liste_field_titre('Account', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
777 }
778 print "</tr>\n";
779
780 $accountstatic = new Account($db);
781 $adh = new Adherent($db);
782 $adht = new AdherentType($db);
783
784 $i = 0;
785 while ($i < $num) {
786 $objp = $db->fetch_object($result);
787
788 $adh->id = $objp->rowid;
789 $adh->typeid = $objp->type;
790
791 $subscriptionstatic->ref = $objp->crowid;
792 $subscriptionstatic->id = $objp->crowid;
793 $subscriptionstatic->note_public = $objp->clabel;
794
795 $typeid = $objp->cfk_type;
796 if ($typeid > 0) {
797 $adht->fetch($typeid);
798 }
799
800 print '<tr class="oddeven">';
801 print '<td>'.$subscriptionstatic->getNomUrl(1).'</td>';
802 print '<td class="center nowraponall">'.dol_print_date($db->jdate($objp->datec), 'dayhour')."</td>\n";
803 print '<td class="center tdoverflowmax125">';
804 if ($typeid > 0) {
805 print $adht->getNomUrl(1);
806 }
807 print '</td>';
808 print '<td class="center">'.dol_print_date($db->jdate($objp->dateh), 'day')."</td>\n";
809 print '<td class="center">'.dol_print_date($db->jdate($objp->datef), 'day')."</td>\n";
810 print '<td class="right amount">'.price($objp->subscription).'</td>';
811 print '<td class="left">'.$objp->clabel.'</td>';
812 if (isModEnabled('bank')) {
813 print '<td class="tdoverflowmax100 right">';
814 if ($objp->bid) {
815 $accountstatic->label = $objp->label;
816 $accountstatic->id = $objp->baid;
817 $accountstatic->number = $objp->number;
818 $accountstatic->account_number = $objp->account_number;
819 $accountstatic->currency_code = $objp->currency_code;
820
821 if (isModEnabled('accounting') && $objp->fk_accountancy_journal > 0) {
822 $accountingjournal = new AccountingJournal($db);
823 $accountingjournal->fetch($objp->fk_accountancy_journal);
824
825 $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
826 }
827
828 $accountstatic->ref = $objp->ref;
829 print $accountstatic->getNomUrl(1);
830 } else {
831 print '&nbsp;';
832 }
833 print '</td>';
834 }
835 print "</tr>";
836 $i++;
837 }
838
839 if (empty($num)) {
840 $colspan = 7;
841 if (isModEnabled('bank')) {
842 $colspan++;
843 }
844 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
845 }
846
847 print "</table>";
848 print '</div>';
849 } else {
851 }
852}
853
854
855if (($action != 'createsubscription' && $action != 'create_thirdparty')) {
856 // Show online payment link
857 // The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
858 include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
859 $validpaymentmethod = getValidOnlinePaymentMethods('');
860 $useonlinepayment = count($validpaymentmethod);
861
862 if ($useonlinepayment) {
863 print '<br>';
864
865 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
866 print showOnlinePaymentUrl('membersubscription', $object->ref);
867 print '<br>';
868 }
869}
870
871/*
872 * Add new subscription form
873 */
874if (($action == 'createsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) {
875 print '<br>';
876
877 print load_fiche_titre($langs->trans("NewCotisation"));
878
879 // Define default choice for complementary actions
880 $bankdirect = 0; // 1 means option by default is write to bank direct with no invoice
881 $invoiceonly = 0; // 1 means option by default is invoice only
882 $bankviainvoice = 0; // 1 means option by default is write to bank via invoice
883 if (GETPOST('paymentsave')) {
884 if (GETPOST('paymentsave') == 'bankdirect') {
885 $bankdirect = 1;
886 }
887 if (GETPOST('paymentsave') == 'invoiceonly') {
888 $invoiceonly = 1;
889 }
890 if (GETPOST('paymentsave') == 'bankviainvoice') {
891 $bankviainvoice = 1;
892 }
893 } else {
894 if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
895 $bankviainvoice = 1;
896 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' && isModEnabled('bank')) {
897 $bankdirect = 1;
898 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'invoiceonly' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
899 $invoiceonly = 1;
900 }
901 }
902
903 print "\n\n<!-- Form add subscription -->\n";
904
905 if ($conf->use_javascript_ajax) {
906 //var_dump($bankdirect.'-'.$bankviainvoice.'-'.$invoiceonly);
907 print "\n".'<script type="text/javascript">';
908 print '$(document).ready(function () {
909 $(".bankswitchclass, .bankswitchclass2").'.(($bankdirect || $bankviainvoice) ? 'show()' : 'hide()').';
910 $("#none, #invoiceonly").click(function() {
911 $(".bankswitchclass").hide();
912 $(".bankswitchclass2").hide();
913 });
914 $("#bankdirect, #bankviainvoice").click(function() {
915 $(".bankswitchclass").show();
916 $(".bankswitchclass2").show();
917 });
918 $("#selectoperation").change(function() {
919 var code = $(this).val();
920 if (code == "CHQ")
921 {
922 $(".fieldrequireddyn").addClass("fieldrequired");
923 if ($("#fieldchqemetteur").val() == "")
924 {
925 $("#fieldchqemetteur").val($("#memberlabel").val());
926 }
927 }
928 else
929 {
930 $(".fieldrequireddyn").removeClass("fieldrequired");
931 }
932 });
933 ';
934 if (GETPOST('paymentsave')) {
935 print '$("#'.GETPOST('paymentsave', 'aZ09').'").prop("checked", true);';
936 }
937 print '});';
938 print '</script>'."\n";
939 }
940
941
942 // Confirm create third party
943 if ($action == 'create_thirdparty') {
944 $companyalias = '';
945 $fullname = $object->getFullName($langs);
946
947 if ($object->morphy == 'mor') {
948 $companyname = $object->company;
949 if (!empty($fullname)) {
950 $companyalias = $fullname;
951 }
952 } else {
953 $companyname = $fullname;
954 if (!empty($object->company)) {
955 $companyalias = $object->company;
956 }
957 }
958
959 // Create a form array
960 $formquestion = array(
961 array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
962 array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
963 );
964 // If customer code was forced to "required", we ask it at creation to avoid error later
965 if (getDolGlobalString('MAIN_COMPANY_CODE_ALWAYS_REQUIRED')) {
966 $tmpcompany = new Societe($db);
967 $tmpcompany->name = (string) $companyname;
968 $tmpcompany->get_codeclient($tmpcompany, 0);
969 $customercode = $tmpcompany->code_client;
970 $formquestion[] = array(
971 'label' => $langs->trans("CustomerCode"),
972 'type' => 'text',
973 'name' => 'customercode',
974 'value' => $customercode,
975 'morecss' => 'minwidth300',
976 'moreattr' => 'maxlength="128"',
977 );
978 }
979 // @todo Add other extrafields mandatory for thirdparty creation
980
981 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 1);
982 }
983
984
985 print '<form name="subscription" method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
986 print '<input type="hidden" name="token" value="'.newToken().'">';
987 print '<input type="hidden" name="action" value="subscription">';
988 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
989 print '<input type="hidden" name="memberlabel" id="memberlabel" value="'.dol_escape_htmltag($object->getFullName($langs)).'">';
990 print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="'.dol_escape_htmltag($object->company).'">';
991
992 print dol_get_fiche_head(array());
993
994 print '<div class="div-table-responsive">';
995 print '<table class="border centpercent">'."\n";
996 print '<tbody>';
997
998 // Date payment
999 if (GETPOST('paymentyear') && GETPOST('paymentmonth') && GETPOST('paymentday')) {
1000 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT('paymentmonth'), GETPOSTINT('paymentday'), GETPOSTINT('paymentyear'));
1001 }
1002
1003 // Date start subscription
1004 print '<tr>';
1005 $currentyear = dol_print_date($now, "%Y");
1006 $currentmonth = dol_print_date($now, "%m");
1007 print '<td class="fieldrequired">'.$langs->trans("DateSubscription").'</td><td>';
1008 if (GETPOST('reday')) {
1009 $datefrom = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
1010 }
1011 if (!$datefrom) {
1012 // Guess the subscription start date
1013 // By default, the subscription start date is the end date of previous membership ($object->datefin) + 1 day, or the date of
1014 // the validation of the member if no previous date exists.
1015 $datefrom = ($object->datefin ? dol_time_plus_duree($object->datefin, 1, 'd') : $object->datevalid);
1016
1017 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER')) {
1018 $datefrom = dol_time_plus_duree($now, (int) substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), 0, -1), substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), -1));
1019 } elseif ($object->datefin > 0 && dol_time_plus_duree($object->datefin, $defaultdelay, $defaultdelayunit) > $now) {
1020 $datefrom = dol_time_plus_duree($object->datefin, 1, 'd');
1021 }
1022 // Now do a correction of the suggested date
1023 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "m") {
1024 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1025 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "3m") {
1026 $datefrom = dol_time_plus_duree($object->datefin, -3, 'm');
1027 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1028 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "Y") {
1029 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"));
1030 }
1031 }
1032 print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
1033 print "</td></tr>";
1034
1035 // Date end subscription
1036 if (GETPOST('endday')) {
1037 $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
1038 }
1039 if (!$dateto) {
1040 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
1041 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1042 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
1043 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"));
1044 } else {
1045 $dateto = -1; // By default, no date is suggested
1046 }
1047 }
1048 print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';
1049 print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
1050 print "</td></tr>";
1051
1052 if ($adht->subscription) {
1053 // Amount
1054 print '<tr><td class="fieldrequired">'.$langs->trans("Amount").'</td>';
1055 print '<td><input autofocus class="width50" type="text" name="subscription" value="'.(GETPOSTISSET('subscription') ? GETPOST('subscription') : (is_null($adht->amount) ? '' : price($adht->amount, 0, '', 0))).'"> '.$langs->trans("Currency".getDolCurrency()) .'</td></tr>';
1056
1057 // Label
1058 print '<tr><td>'.$langs->trans("Note").'</td>';
1059 print '<td><input name="label" type="text" size="32" value="';
1060 if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
1061 print $langs->trans("Subscription").' '.dol_print_date(($datefrom ? $datefrom : time()), "%Y");
1062 }
1063 print '"></td></tr>';
1064
1065 // Complementary action
1066 if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
1067 $company = new Societe($db);
1068 if ($object->socid) {
1069 $result = $company->fetch($object->socid);
1070 }
1071
1072 // No more action
1073 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('MoreActions');
1074 print '</td>';
1075 print '<td class="line-height-large">';
1076
1077 print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"'.(empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '').'>';
1078 print '<label for="none"> '.$langs->trans("None").'</label><br>';
1079 // Add entry into bank account
1080 if (isModEnabled('bank')) {
1081 print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"'.(!empty($bankdirect) ? ' checked' : '');
1082 print '><label for="bankdirect"> '.$langs->trans("MoreActionBankDirect").'</label><br>';
1083 }
1084 // Add invoice with no payments
1085 if (isModEnabled('societe') && isModEnabled('invoice')) {
1086 print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"'.(!empty($invoiceonly) ? ' checked' : '');
1087 //if (empty($object->fk_soc)) print ' disabled';
1088 print '><label for="invoiceonly"> '.$langs->trans("MoreActionInvoiceOnly");
1089 if ($object->socid) {
1090 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1091 } else {
1092 print ' (';
1093 if (empty($object->socid)) {
1094 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1095 }
1096 print $langs->trans("NoThirdPartyAssociatedToMember");
1097 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&action=create_thirdparty">';
1098 print $langs->trans("CreateDolibarrThirdParty");
1099 print '</a>)';
1100 }
1101 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1102 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1103 }
1104 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1105 $prodtmp = new Product($db);
1106 $result = $prodtmp->fetch(getDolGlobalInt('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1107 if ($result < 0) {
1108 setEventMessage($prodtmp->error, 'errors');
1109 }
1110 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1111 }
1112 print '</label><br>';
1113 }
1114 // Add invoice with payments
1115 if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
1116 print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"'.(!empty($bankviainvoice) ? ' checked' : '');
1117 //if (empty($object->socid)) print ' disabled';
1118 print '><label for="bankviainvoice"> '.$langs->trans("MoreActionBankViaInvoice");
1119 if ($object->socid) {
1120 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1121 } else {
1122 print ' (';
1123 if (empty($object->socid)) {
1124 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1125 }
1126 print $langs->trans("NoThirdPartyAssociatedToMember");
1127 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&action=create_thirdparty">';
1128 print $langs->trans("CreateDolibarrThirdParty");
1129 print '</a>)';
1130 }
1131 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1132 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1133 }
1134 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1135 $prodtmp = new Product($db);
1136 $result = $prodtmp->fetch(getDolGlobalInt('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1137 if ($result < 0) {
1138 setEventMessage($prodtmp->error, 'errors');
1139 }
1140 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1141 }
1142 print '</label><br>';
1143 }
1144 print '</td></tr>';
1145
1146 // Bank account
1147 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("FinancialAccount").'</td><td>';
1148 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1149 $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
1150 print "</td></tr>\n";
1151
1152 // Payment mode
1153 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td>';
1154 print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
1155 print "</td></tr>\n";
1156
1157 // Date of payment
1158 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
1159 print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
1160 print "</td></tr>\n";
1161
1162 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Numero');
1163 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
1164 print '</td>';
1165 print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="'.(!GETPOST('num_chq') ? '' : GETPOST('num_chq')).'"></td></tr>';
1166
1167 print '<tr class="bankswitchclass2 fieldrequireddyn"><td>'.$langs->trans('CheckTransmitter');
1168 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
1169 print '</td>';
1170 print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="'.(!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')).'"></td></tr>';
1171
1172 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Bank');
1173 print ' <em>('.$langs->trans("ChequeBank").')</em>';
1174 print '</td>';
1175 print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="'.(!GETPOST('chqbank') ? '' : GETPOST('chqbank')).'"></td></tr>';
1176 }
1177 }
1178
1179 print '<tr><td></td><td></td></tr>';
1180
1181 print '<tr><td>'.$langs->trans("SendAcknowledgementByMail").'</td>';
1182 print '<td>';
1183 if (!$object->email) {
1184 print $langs->trans("NoEMail");
1185 } else {
1186 $adht = new AdherentType($db);
1187 $adht->fetch($object->typeid);
1188
1189 // Send subscription email
1190 $subject = '';
1191 $msg = '';
1192
1193 // Send subscription email
1194 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1195 $formmail = new FormMail($db);
1196 // Set output language
1197 $outputlangs = new Translate('', $conf);
1198 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1199 // Load traductions files required by page
1200 $outputlangs->loadLangs(array("main", "members"));
1201 // Get email content from template
1202 $arraydefaultmessage = null;
1203 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
1204
1205 if (!empty($labeltouse)) {
1206 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1207 }
1208
1209 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1210 $subject = (string) $arraydefaultmessage->topic;
1211 $msg = (string) $arraydefaultmessage->content;
1212 }
1213
1214 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1215 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1216 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1217 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
1218
1219 $tmp = '<input name="sendmail" type="checkbox"'.(GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')).'>';
1220 $helpcontent = '';
1221 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1222 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1223 $helpcontent .= '<b>'.$langs->trans("MailTopic").'</b>:<br>'."\n";
1224 if ($subjecttosend) {
1225 $helpcontent .= $subjecttosend."\n";
1226 } else {
1227 $langs->load("errors");
1228 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1229 }
1230 $helpcontent .= "<br>";
1231 $helpcontent .= '<b>'.$langs->trans("MailText").'</b>:<br>';
1232 if ($texttosend) {
1233 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1234 } else {
1235 $langs->load("errors");
1236 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1237 }
1238 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1239 print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
1240 }
1241 print '</td></tr>';
1242 print '</tbody>';
1243 print '</table>';
1244 print '</div>';
1245
1246 print dol_get_fiche_end();
1247
1248 print '<div class="center">';
1249 $parameters = array();
1250 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
1251 if (empty($reshook)) {
1252 print '<input type="submit" class="button" name="add" value="'.$langs->trans("AddSubscription").'">';
1253 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
1254 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1255 }
1256 print '</div>';
1257
1258 print '</form>';
1259
1260 print "\n<!-- End form subscription -->\n\n";
1261}
1262
1263
1264// End of page
1265llxFooter();
1266$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 manage bank accounts.
Class to manage accounting journals.
Class to manage members of a foundation.
const STATUS_VALIDATED
Validated status.
Class to manage members type.
Class to manage generation of HTML components Only common components must be here.
Class to manage a HTML form to send a unitary email Usage: $formail = new FormMail($db) $formmail->pr...
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage subscriptions of foundation members.
Class to manage translations.
Class to manage Dolibarr users.
global $mysoc
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:605
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:126
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:624
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.
dol_most_recent_file($dir, $regexfilter='', $excludefilter=array('(\.meta|_preview.*\.png) $', '^\.'), $nohook=0, $mode=0)
Return file(s) into a directory (by default most recent)
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
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, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
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_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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
member_prepare_head(Adherent $object)
Return array head with list of tabs to view object information.
print $langs trans('Date')." left Ref Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as p p num_paiement as f pf amount as amount
Definition receipt.php:489
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.