dolibarr 24.0.0-beta
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
127// Security check
128$result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
129
130
131/*
132 * Actions
133 */
134
135$parameters = array();
136$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
137if ($reshook < 0) {
138 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
139}
140
141// Create third party from a member
142if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
143 if ($result > 0) {
144 // Creation of thirdparty
145 $company = new Societe($db);
146 $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'), GETPOST('customercode', 'alpha'));
147
148 if ($result < 0) {
149 $langs->load("errors");
150 setEventMessages($company->error, $company->errors, 'errors');
151 } else {
152 $object->socid = $result;
153
154 $action = 'createsubscription';
155 }
156 } else {
157 setEventMessages($object->error, $object->errors, 'errors');
158 }
159}
160
161if (empty($reshook) && $action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
162 $error = 0;
163 if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
164 if (GETPOSTINT("userid") != $user->id && GETPOSTINT("userid") != $object->user_id) {
165 $error++;
166 setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
167 }
168 }
169
170 if (!$error) {
171 if (GETPOSTINT("userid") != $object->user_id) { // If link differs from currently in database
172 $result = $object->setUserId(GETPOSTINT("userid"));
173 if ($result < 0) {
174 dol_print_error(null, $object->error);
175 }
176 $action = '';
177 }
178 }
179}
180
181if (empty($reshook) && $action == 'setsocid' && $permissiontoaddmember) {
182 $error = 0;
183 if (GETPOSTINT('socid') != $object->socid) { // If link differs from currently in database
184 $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "adherent";
185 $sql .= " WHERE fk_soc = " . ((int) GETPOSTINT('socid'));
186 $resql = $db->query($sql);
187 if ($resql) {
188 $obj = $db->fetch_object($resql);
189 if ($obj && $obj->rowid > 0) {
190 $othermember = new Adherent($db);
191 $othermember->fetch($obj->rowid);
192 $thirdparty = new Societe($db);
193 $thirdparty->fetch(GETPOSTINT('socid'));
194 $error++;
195 setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
196 }
197 }
198
199 if (!$error) {
200 $result = $object->setThirdPartyId(GETPOSTINT('socid'));
201 if ($result < 0) {
202 dol_print_error(null, $object->error);
203 }
204 $action = '';
205 }
206 }
207}
208
209if (empty($reshook) && $user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) {
210 $error = 0;
211
212 $langs->load("banks");
213
214 $result = $object->fetch($rowid);
215 $result = $adht->fetch($object->typeid);
216
217 // Subscription information
218 $datesubscription = 0;
219 $datesubend = 0;
220 $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
221 $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
222 $paymentdate = ''; // Do not use 0 here, default value is '' that means not filled where 0 means 1970-01-01
223 if (GETPOSTINT("reyear") && GETPOSTINT("remonth") && GETPOSTINT("reday")) {
224 $datesubscription = dol_mktime(0, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
225 }
226 if (GETPOSTINT("endyear") && GETPOSTINT("endmonth") && GETPOSTINT("endday")) {
227 $datesubend = dol_mktime(0, 0, 0, GETPOSTINT("endmonth"), GETPOSTINT("endday"), GETPOSTINT("endyear"));
228 }
229 if (GETPOSTINT("paymentyear") && GETPOSTINT("paymentmonth") && GETPOSTINT("paymentday")) {
230 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT("paymentmonth"), GETPOSTINT("paymentday"), GETPOSTINT("paymentyear"));
231 }
232 $amount = price2num(GETPOST("subscription", 'alpha')); // Amount of subscription
233 $label = GETPOST("label");
234
235 // Payment information
236 $accountid = GETPOSTINT("accountid");
237 $operation = GETPOST("operation", "alphanohtml"); // Payment mode
238 $num_chq = GETPOST("num_chq", "alphanohtml");
239 $emetteur_nom = GETPOST("chqemetteur");
240 $emetteur_banque = GETPOST("chqbank");
241 $option = GETPOST("paymentsave");
242 if (empty($option)) {
243 $option = 'none';
244 }
245 $sendalsoemail = GETPOST("sendmail", 'alpha');
246
247 // Check parameters
248 if (!$datesubscription) {
249 $error++;
250 $langs->load("errors");
251 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateSubscription"));
252 setEventMessages($errmsg, null, 'errors');
253 $action = 'createsubscription';
254 }
255 if (GETPOST('end') && !$datesubend) {
256 $error++;
257 $langs->load("errors");
258 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateEndSubscription"));
259 setEventMessages($errmsg, null, 'errors');
260 $action = 'createsubscription';
261 }
262 if (!$datesubend) {
263 $datesubend = dol_time_plus_duree(dol_time_plus_duree($datesubscription, $defaultdelay, $defaultdelayunit), -1, 'd');
264 }
265 if (($option == 'bankviainvoice' || $option == 'bankdirect') && !$paymentdate) {
266 $error++;
267 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment"));
268 setEventMessages($errmsg, null, 'errors');
269 $action = 'createsubscription';
270 }
271
272 // Check if a payment is mandatory or not
273 if ($adht->subscription) { // Member type need subscriptions
274 if (!is_numeric($amount)) {
275 // If field is '' or not a numeric value
276 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount"));
277 setEventMessages($errmsg, null, 'errors');
278 $error++;
279 $action = 'createsubscription';
280 } else {
281 // If an amount has been provided, we check also fields that becomes mandatory when amount is not null.
282 if (isModEnabled('bank') && GETPOST("paymentsave") != 'none') {
283 if (GETPOST("subscription")) {
284 if (!GETPOST("label")) {
285 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"));
286 setEventMessages($errmsg, null, 'errors');
287 $error++;
288 $action = 'createsubscription';
289 }
290 if (GETPOST("paymentsave") != 'invoiceonly' && !GETPOST("operation")) {
291 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode"));
292 setEventMessages($errmsg, null, 'errors');
293 $error++;
294 $action = 'createsubscription';
295 }
296 if (GETPOST("paymentsave") != 'invoiceonly' && !(GETPOSTINT("accountid") > 0)) {
297 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("FinancialAccount"));
298 setEventMessages($errmsg, null, 'errors');
299 $error++;
300 $action = 'createsubscription';
301 }
302 } else {
303 if (GETPOSTINT("accountid")) {
304 $errmsg = $langs->trans("ErrorDoNotProvideAccountsIfNullAmount");
305 setEventMessages($errmsg, null, 'errors');
306 $error++;
307 $action = 'createsubscription';
308 }
309 }
310 }
311 }
312 }
313
314 // Record the subscription then complementary actions
315 if (!$error && $action == 'subscription') { // Test on permission already done
316 $db->begin();
317
318 // Create subscription
319 $crowid = $object->subscription($datesubscription, (float) $amount, $accountid, $operation, $label, $num_chq, $emetteur_nom, $emetteur_banque, $datesubend);
320 if ($crowid <= 0) {
321 $error++;
322 $errmsg = $object->error;
323 setEventMessages($object->error, $object->errors, 'errors');
324 }
325
326 if (!$error) {
327 $result = $object->subscriptionComplementaryActions($crowid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, (float) $amount, $num_chq, $emetteur_nom, $emetteur_banque);
328 if ($result < 0) {
329 $error++;
330 setEventMessages($object->error, $object->errors, 'errors');
331 } else {
332 // If an invoice was created, it is into $object->invoice
333 }
334 }
335
336 if (!$error) {
337 $db->commit();
338 } else {
339 $db->rollback();
340 $action = 'createsubscription';
341 }
342
343 if (!$error) {
344 setEventMessages("SubscriptionRecorded", null, 'mesgs');
345 }
346
347 // Send email
348 if (!$error) {
349 // Send confirmation Email
350 if ($object->email && $sendalsoemail) { // $object is 'Adherent'
351 $parameters = array(
352 'datesubscription' => $datesubscription,
353 'amount' => $amount,
354 'ccountid' => $accountid,
355 'operation' => $operation,
356 'label' => $label,
357 'num_chq' => $num_chq,
358 'emetteur_nom' => $emetteur_nom,
359 'emetteur_banque' => $emetteur_banque,
360 'datesubend' => $datesubend
361 );
362 $reshook = $hookmanager->executeHooks('sendMail', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
363 if ($reshook < 0) {
364 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
365 }
366
367 if (empty($reshook)) {
368 $subject = '';
369 $msg = '';
370
371 // Send subscription email
372 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
373 $formmail = new FormMail($db);
374 // Set output language
375 $outputlangs = new Translate('', $conf);
376 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
377 // Load traductions files required by page
378 $outputlangs->loadLangs(array("main", "members"));
379
380 // Get email content from template
381 $arraydefaultmessage = null;
382 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
383
384 if (!empty($labeltouse)) {
385 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
386 }
387
388 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
389 $subject = (string) $arraydefaultmessage->topic;
390 $msg = (string) $arraydefaultmessage->content;
391 }
392
393 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
394 complete_substitutions_array($substitutionarray, $outputlangs, $object);
395 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
396 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
397
398 // Attach a file ?
399 $file = '';
400 $listofpaths = array();
401 $listofnames = array();
402 $listofmimes = array();
403 if (is_object($object->invoice) && (!is_object($arraydefaultmessage) || intval($arraydefaultmessage->joinfiles))) {
404 $invoicediroutput = $conf->facture->dir_output;
405 $fileparams = dol_most_recent_file($invoicediroutput.'/'.$object->invoice->ref, preg_quote($object->invoice->ref, '/').'[^\-]+');
406 $file = $fileparams['fullname'];
407
408 $listofpaths = array($file);
409 $listofnames = array(basename($file));
410 $listofmimes = array(dol_mimetype($file));
411 }
412
413 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/subscription.php'."\r\n";
414
415 $result = $object->sendEmail($texttosend, $subjecttosend, $listofpaths, $listofmimes, $listofnames, "", "", 0, -1, '', $moreinheader);
416 if ($result < 0) {
417 $errmsg = $object->error;
418 setEventMessages($object->error, $object->errors, 'errors');
419 } else {
420 setEventMessages($langs->trans("EmailSentToMember", $object->email), null, 'mesgs');
421 }
422 }
423 } else {
424 setEventMessages($langs->trans("NoEmailSentToMember"), null, 'mesgs');
425 }
426 }
427
428 // Clean some POST vars
429 if (!$error) {
430 $accountid = '';
431 $operation = '';
432 $label = '';
433 $num_chq = '';
434 $option = '';
435 }
436 }
437}
438
439
440
441/*
442 * View
443 */
444
445$form = new Form($db);
446
447$now = dol_now();
448
449$title = $langs->trans("Member")." - ".$langs->trans("Subscriptions");
450$help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
451
452llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-member page-card_subscription');
453
454
455$param = '';
456if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
457 $param .= '&contextpage='.urlencode($contextpage);
458}
459if ($limit > 0 && $limit != $conf->liste_limit) {
460 $param .= '&limit='.((int) $limit);
461}
462$param .= '&id='.$rowid;
463if ($optioncss != '') {
464 $param .= '&optioncss='.urlencode($optioncss);
465}
466// Add $param from extra fields
467//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
468
469
470if (! ($object->id > 0)) {
471 $langs->load("errors");
472 print $langs->trans("ErrorRecordNotFound");
473}
474
475
476$adht->fetch($object->typeid);
477
478$defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
479$defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
480
481$head = member_prepare_head($object);
482
483$rowspan = 10;
484if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
485 $rowspan++;
486}
487if (isModEnabled('societe')) {
488 $rowspan++;
489}
490
491print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
492print '<input type="hidden" name="token" value="'.newToken().'">';
493print '<input type="hidden" name="rowid" value="'.$object->id.'">';
494
495print dol_get_fiche_head($head, 'subscription', $langs->trans("Member"), -1, 'user');
496
497$linkback = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/adherents/list.php', ['restore_lastsearch_values' => 1]).'">'.$langs->trans("BackToList").'</a>';
498
499$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
500$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard', 'class="valignmiddle marginleftonly paddingrightonly"');
501$morehtmlref .= '</a>';
502
503dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
504
505print '<div class="fichecenter">';
506print '<div class="fichehalfleft">';
507
508print '<div class="underbanner clearboth"></div>';
509print '<table class="border centpercent tableforfield">';
510
511// Login
512if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
513 print '<tr><td class="titlefieldmiddle">'.$langs->trans("Login").' / '.$langs->trans("Id").'</td><td class="valeur">'.dol_escape_htmltag($object->login).'</td></tr>';
514}
515
516// Type
517print '<tr><td class="titlefieldmiddle">'.$langs->trans("Type").'</td>';
518print '<td class="valeur">'.$adht->getNomUrl(1)."</td></tr>\n";
519
520// Morphy
521print '<tr><td>'.$langs->trans("MemberNature").'</td>';
522print '<td class="valeur" >'.$object->getmorphylib('', 1).'</td>';
523print '</tr>';
524
525// Company
526print '<tr><td>'.$langs->trans("Company").'</td><td class="valeur">'.dol_escape_htmltag($object->company).'</td></tr>';
527
528// Civility
529print '<tr><td>'.$langs->trans("UserTitle").'</td><td class="valeur">'.$object->getCivilityLabel().'</td>';
530print '</tr>';
531
532// Password
533if (!getDolGlobalString('ADHERENT_LOGIN_NOT_REQUIRED')) {
534 print '<tr><td>'.$langs->trans("Password").'</td><td>';
535 if ($object->pass) {
536 print preg_replace('/./i', '*', $object->pass);
537 } else {
538 if ($user->admin) {
539 print '<!-- '.$langs->trans("Crypted").': '.$object->pass_indatabase_crypted.' -->';
540 }
541 print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
542 }
543 if (!empty($object->pass_indatabase) && empty($object->user_id)) { // Show warning only for old password still in clear (does not happen anymore)
544 $langs->load("errors");
545 $htmltext = $langs->trans("WarningPasswordSetWithNoAccount");
546 print ' '.$form->textwithpicto('', $htmltext, 1, 'warning');
547 }
548 print '</td></tr>';
549}
550
551// Date end subscription
552print '<tr><td>'.$langs->trans("SubscriptionEndDate").'</td><td class="valeur">';
553if ($object->datefin) {
554 print dol_print_date($object->datefin, 'day');
555 if ($object->hasDelay()) {
556 print " ".img_warning($langs->trans("Late"));
557 }
558} else {
559 if ($object->need_subscription == 0) {
560 print $langs->trans("SubscriptionNotNeeded");
561 } elseif (!$adht->subscription) {
562 print $langs->trans("SubscriptionNotRecorded");
563 if (Adherent::STATUS_VALIDATED == $object->status) {
564 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
565 }
566 } else {
567 print $langs->trans("SubscriptionNotReceived");
568 if (Adherent::STATUS_VALIDATED == $object->status) {
569 print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
570 }
571 }
572}
573print '</td></tr>';
574
575print '</table>';
576
577print '</div>';
578
579print '<div class="fichehalfright">';
580print '<div class="underbanner clearboth"></div>';
581
582print '<table class="border tableforfield centpercent">';
583
584// Tags / Categories
585if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
586 print '<tr><td>'.$langs->trans("Categories").'</td>';
587 print '<td colspan="2">';
588 print $form->showCategories($object->id, Categorie::TYPE_MEMBER, 1);
589 print '</td></tr>';
590}
591
592// Birth Date
593print '<tr><td class="titlefieldmiddle">'.$langs->trans("DateOfBirth").'</td><td class="valeur">'.dol_print_date($object->birth, 'day').'</td></tr>';
594
595// Default language
596if (getDolGlobalInt('MAIN_MULTILANGS')) {
597 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
598 print '<tr><td>'.$langs->trans("DefaultLang").'</td><td>';
599 //$s=picto_from_langcode($object->default_lang);
600 //print ($s?$s.' ':'');
601 $langs->load("languages");
602 $labellang = ($object->default_lang ? $langs->trans('Language_'.$object->default_lang) : '');
603 print picto_from_langcode($object->default_lang, 'class="paddingrightonly saturatemedium opacitylow"');
604 print $labellang;
605 print '</td></tr>';
606}
607
608// Public
609$linkofpubliclist = DOL_MAIN_URL_ROOT.'/public/members/public_list.php'.((isModEnabled('multicompany')) ? '?entity='.$conf->entity : '');
610print '<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>';
611
612// Other attributes
613$cols = 2;
614include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
615
616// Third party Dolibarr
617if (isModEnabled('societe')) {
618 print '<tr><td>';
619 print '<table class="nobordernopadding centpercent"><tr><td>';
620 print $langs->trans("LinkedToDolibarrThirdParty");
621 print '</td>';
622 if ($action != 'editthirdparty' && $user->hasRight('adherent', 'creer')) {
623 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>';
624 }
625 print '</tr></table>';
626 print '</td><td colspan="2" class="valeur">';
627 if ($action == 'editthirdparty') {
628 $htmlname = 'socid';
629 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" name="form'.$htmlname.'">';
630 print '<input type="hidden" name="rowid" value="'.$object->id.'">';
631 print '<input type="hidden" name="action" value="set'.$htmlname.'">';
632 print '<input type="hidden" name="token" value="'.newToken().'">';
633 print '<table class="nobordernopadding">';
634 print '<tr><td>';
635 print $form->select_company($object->socid, 'socid', '', 1);
636 print '</td>';
637 print '<td class="left"><input type="submit" class="button button-edit" value="'.$langs->trans("Modify").'"></td>';
638 print '</tr></table></form>';
639 } else {
640 if ($object->socid > 0) {
641 $company = new Societe($db);
642 $result = $company->fetch($object->socid);
643 print $company->getNomUrl(1);
644
645 // Show link to invoices
646 $tmparray = $company->getOutstandingBills('customer');
647 if (!empty($tmparray['refs'])) {
648 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']).')';
649 // TODO Add alert if warning on at least one invoice late
650 print '</a>';
651 }
652 } else {
653 print '<span class="opacitymedium">'.$langs->trans("NoThirdPartyAssociatedToMember").'</span>';
654 }
655 }
656 print '</td></tr>';
657}
658
659// Login Dolibarr - Link to user
660print '<tr><td>';
661print '<table class="nobordernopadding centpercent"><tr><td>';
662print $langs->trans("LinkedToDolibarrUser");
663print '</td>';
664if ($action != 'editlogin' && $user->hasRight('adherent', 'creer')) {
665 print '<td class="right">';
666 if ($user->hasRight("user", "user", "creer")) {
667 print '<a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editlogin&token='.newToken().'&rowid='.$object->id.'">'.img_edit($langs->trans('SetLinkToUser'), 1).'</a>';
668 }
669 print '</td>';
670}
671print '</tr></table>';
672print '</td><td colspan="2" class="valeur">';
673if ($action == 'editlogin') {
674 $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id, (string) $object->user_id, 'userid', array());
675} else {
676 if ($object->user_id) {
677 $linkeduser = new User($db);
678 $linkeduser->fetch($object->user_id);
679 print $linkeduser->getNomUrl(-1);
680 } else {
681 print '<span class="opacitymedium">'.$langs->trans("NoDolibarrAccess").'</span>';
682 }
683}
684print '</td></tr>';
685
686print "</table>\n";
687
688print "</div></div>\n";
689print '<div class="clearboth"></div>';
690
691print dol_get_fiche_end();
692
693
694/*
695 * Action bar
696 */
697
698// Button to create a new subscription if member no draft (-1) neither resiliated (0) neither excluded (-2)
699if ($user->hasRight('adherent', 'cotisation', 'creer')) {
700 if ($action != 'createsubscription' && $action != 'create_thirdparty') {
701 print '<div class="tabsAction">';
702
703 if ($object->status > 0) {
704 print '<div class="inline-block divButAction"><a class="butAction" href="'.dolBuildUrl($_SERVER["PHP_SELF"], ['rowid' => $rowid, 'action' => 'createsubscription'], true).'">'.$langs->trans("AddSubscription")."</a></div>";
705 } else {
706 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("ValidateBefore")).'">'.$langs->trans("AddSubscription").'</a></div>';
707 }
708
709 print '</div>';
710 }
711}
712
713/*
714 * List of subscriptions
715 */
716if ($action != 'createsubscription' && $action != 'create_thirdparty') {
717 $sql = "SELECT d.rowid, d.firstname, d.lastname, d.societe, d.fk_adherent_type as type,";
718 $sql .= " c.rowid as crowid, c.subscription,";
719 $sql .= " c.datec, c.fk_type as cfk_type,";
720 $sql .= " c.dateadh as dateh, c.note as clabel,";
721 $sql .= " c.datef,";
722 $sql .= " c.fk_bank,";
723 $sql .= " b.rowid as bid,";
724 $sql .= " ba.rowid as baid, ba.label, ba.bank, ba.ref, ba.account_number, ba.fk_accountancy_journal, ba.number, ba.currency_code";
725 $sql .= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."subscription as c";
726 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON c.fk_bank = b.rowid";
727 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."bank_account as ba ON b.fk_account = ba.rowid";
728 $sql .= " WHERE d.rowid = c.fk_adherent AND d.rowid=".((int) $rowid);
729 $sql .= $db->order($sortfield, $sortorder);
730
731 $result = $db->query($sql);
732 if ($result) {
733 $subscriptionstatic = new Subscription($db);
734
735 $num = $db->num_rows($result);
736
737 print '<div class="div-table-responsive-no-min">';
738 print '<table class="noborder centpercent">'."\n";
739
740 print '<tr class="liste_titre">';
741 print_liste_field_titre('Ref', $_SERVER["PHP_SELF"], 'c.rowid', '', $param, '', $sortfield, $sortorder);
742 print_liste_field_titre('DateCreation', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
743 print_liste_field_titre('Type', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
744 print_liste_field_titre('DateStart', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
745 print_liste_field_titre('DateEnd', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
746 print_liste_field_titre('Amount', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
747 print_liste_field_titre('Note', $_SERVER["PHP_SELF"], 'clabel', '', $param, '', $sortfield, $sortorder);
748 if (isModEnabled('bank')) {
749 print_liste_field_titre('Account', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
750 }
751 print "</tr>\n";
752
753 $accountstatic = new Account($db);
754 $adh = new Adherent($db);
755 $adht = new AdherentType($db);
756
757 $i = 0;
758 while ($i < $num) {
759 $objp = $db->fetch_object($result);
760
761 $adh->id = $objp->rowid;
762 $adh->typeid = $objp->type;
763
764 $subscriptionstatic->ref = $objp->crowid;
765 $subscriptionstatic->id = $objp->crowid;
766 $subscriptionstatic->note_public = $objp->clabel;
767
768 $typeid = $objp->cfk_type;
769 if ($typeid > 0) {
770 $adht->fetch($typeid);
771 }
772
773 print '<tr class="oddeven">';
774 print '<td>'.$subscriptionstatic->getNomUrl(1).'</td>';
775 print '<td class="center nowraponall">'.dol_print_date($db->jdate($objp->datec), 'dayhour')."</td>\n";
776 print '<td class="center tdoverflowmax125">';
777 if ($typeid > 0) {
778 print $adht->getNomUrl(1);
779 }
780 print '</td>';
781 print '<td class="center">'.dol_print_date($db->jdate($objp->dateh), 'day')."</td>\n";
782 print '<td class="center">'.dol_print_date($db->jdate($objp->datef), 'day')."</td>\n";
783 print '<td class="right amount">'.price($objp->subscription).'</td>';
784 print '<td class="left">'.$objp->clabel.'</td>';
785 if (isModEnabled('bank')) {
786 print '<td class="tdoverflowmax100 right">';
787 if ($objp->bid) {
788 $accountstatic->label = $objp->label;
789 $accountstatic->id = $objp->baid;
790 $accountstatic->number = $objp->number;
791 $accountstatic->account_number = $objp->account_number;
792 $accountstatic->currency_code = $objp->currency_code;
793
794 if (isModEnabled('accounting') && $objp->fk_accountancy_journal > 0) {
795 $accountingjournal = new AccountingJournal($db);
796 $accountingjournal->fetch($objp->fk_accountancy_journal);
797
798 $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
799 }
800
801 $accountstatic->ref = $objp->ref;
802 print $accountstatic->getNomUrl(1);
803 } else {
804 print '&nbsp;';
805 }
806 print '</td>';
807 }
808 print "</tr>";
809 $i++;
810 }
811
812 if (empty($num)) {
813 $colspan = 7;
814 if (isModEnabled('bank')) {
815 $colspan++;
816 }
817 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
818 }
819
820 print "</table>";
821 print '</div>';
822 } else {
824 }
825}
826
827
828if (($action != 'createsubscription' && $action != 'create_thirdparty')) {
829 // Show online payment link
830 // The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
831 include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
832 $validpaymentmethod = getValidOnlinePaymentMethods('');
833 $useonlinepayment = count($validpaymentmethod);
834
835 if ($useonlinepayment) {
836 print '<br>';
837
838 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
839 print showOnlinePaymentUrl('membersubscription', $object->ref);
840 print '<br>';
841 }
842}
843
844/*
845 * Add new subscription form
846 */
847if (($action == 'createsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) {
848 print '<br>';
849
850 print load_fiche_titre($langs->trans("NewCotisation"));
851
852 // Define default choice for complementary actions
853 $bankdirect = 0; // 1 means option by default is write to bank direct with no invoice
854 $invoiceonly = 0; // 1 means option by default is invoice only
855 $bankviainvoice = 0; // 1 means option by default is write to bank via invoice
856 if (GETPOST('paymentsave')) {
857 if (GETPOST('paymentsave') == 'bankdirect') {
858 $bankdirect = 1;
859 }
860 if (GETPOST('paymentsave') == 'invoiceonly') {
861 $invoiceonly = 1;
862 }
863 if (GETPOST('paymentsave') == 'bankviainvoice') {
864 $bankviainvoice = 1;
865 }
866 } else {
867 if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
868 $bankviainvoice = 1;
869 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' && isModEnabled('bank')) {
870 $bankdirect = 1;
871 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'invoiceonly' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
872 $invoiceonly = 1;
873 }
874 }
875
876 print "\n\n<!-- Form add subscription -->\n";
877
878 if ($conf->use_javascript_ajax) {
879 //var_dump($bankdirect.'-'.$bankviainvoice.'-'.$invoiceonly);
880 print "\n".'<script type="text/javascript">';
881 print '$(document).ready(function () {
882 $(".bankswitchclass, .bankswitchclass2").'.(($bankdirect || $bankviainvoice) ? 'show()' : 'hide()').';
883 $("#none, #invoiceonly").click(function() {
884 $(".bankswitchclass").hide();
885 $(".bankswitchclass2").hide();
886 });
887 $("#bankdirect, #bankviainvoice").click(function() {
888 $(".bankswitchclass").show();
889 $(".bankswitchclass2").show();
890 });
891 $("#selectoperation").change(function() {
892 var code = $(this).val();
893 if (code == "CHQ")
894 {
895 $(".fieldrequireddyn").addClass("fieldrequired");
896 if ($("#fieldchqemetteur").val() == "")
897 {
898 $("#fieldchqemetteur").val($("#memberlabel").val());
899 }
900 }
901 else
902 {
903 $(".fieldrequireddyn").removeClass("fieldrequired");
904 }
905 });
906 ';
907 if (GETPOST('paymentsave')) {
908 print '$("#'.GETPOST('paymentsave', 'aZ09').'").prop("checked", true);';
909 }
910 print '});';
911 print '</script>'."\n";
912 }
913
914
915 // Confirm create third party
916 if ($action == 'create_thirdparty') {
917 $companyalias = '';
918 $fullname = $object->getFullName($langs);
919
920 if ($object->morphy == 'mor') {
921 $companyname = $object->company;
922 if (!empty($fullname)) {
923 $companyalias = $fullname;
924 }
925 } else {
926 $companyname = $fullname;
927 if (!empty($object->company)) {
928 $companyalias = $object->company;
929 }
930 }
931
932 // Create a form array
933 $formquestion = array(
934 array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
935 array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
936 );
937 // If customer code was forced to "required", we ask it at creation to avoid error later
938 if (getDolGlobalString('MAIN_COMPANY_CODE_ALWAYS_REQUIRED')) {
939 $tmpcompany = new Societe($db);
940 $tmpcompany->name = (string) $companyname;
941 $tmpcompany->get_codeclient($tmpcompany, 0);
942 $customercode = $tmpcompany->code_client;
943 $formquestion[] = array(
944 'label' => $langs->trans("CustomerCode"),
945 'type' => 'text',
946 'name' => 'customercode',
947 'value' => $customercode,
948 'morecss' => 'minwidth300',
949 'moreattr' => 'maxlength="128"',
950 );
951 }
952 // @todo Add other extrafields mandatory for thirdparty creation
953
954 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 1);
955 }
956
957
958 print '<form name="subscription" method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
959 print '<input type="hidden" name="token" value="'.newToken().'">';
960 print '<input type="hidden" name="action" value="subscription">';
961 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
962 print '<input type="hidden" name="memberlabel" id="memberlabel" value="'.dol_escape_htmltag($object->getFullName($langs)).'">';
963 print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="'.dol_escape_htmltag($object->company).'">';
964
965 print dol_get_fiche_head(array());
966
967 print '<div class="div-table-responsive">';
968 print '<table class="border centpercent">'."\n";
969 print '<tbody>';
970
971 // Date payment
972 if (GETPOST('paymentyear') && GETPOST('paymentmonth') && GETPOST('paymentday')) {
973 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT('paymentmonth'), GETPOSTINT('paymentday'), GETPOSTINT('paymentyear'));
974 }
975
976 // Date start subscription
977 print '<tr>';
978 $currentyear = dol_print_date($now, "%Y");
979 $currentmonth = dol_print_date($now, "%m");
980 print '<td class="fieldrequired">'.$langs->trans("DateSubscription").'</td><td>';
981 if (GETPOST('reday')) {
982 $datefrom = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
983 }
984 if (!$datefrom) {
985 // Guess the subscription start date
986 // By default, the subscription start date is the end date of previous membership ($object->datefin) + 1 day, or the date of
987 // the validation of the member if no previous date exists.
988 $datefrom = ($object->datefin ? dol_time_plus_duree($object->datefin, 1, 'd') : $object->datevalid);
989
990 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER')) {
991 $datefrom = dol_time_plus_duree($now, (int) substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), 0, -1), substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), -1));
992 } elseif ($object->datefin > 0 && dol_time_plus_duree($object->datefin, $defaultdelay, $defaultdelayunit) > $now) {
993 $datefrom = dol_time_plus_duree($object->datefin, 1, 'd');
994 }
995 // Now do a correction of the suggested date
996 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "m") {
997 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
998 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "3m") {
999 $datefrom = dol_time_plus_duree($object->datefin, -3, 'm');
1000 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1001 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "Y") {
1002 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"));
1003 }
1004 }
1005 print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
1006 print "</td></tr>";
1007
1008 // Date end subscription
1009 if (GETPOST('endday')) {
1010 $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
1011 }
1012 if (!$dateto) {
1013 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
1014 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1015 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
1016 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"));
1017 } else {
1018 $dateto = -1; // By default, no date is suggested
1019 }
1020 }
1021 print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';
1022 print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
1023 print "</td></tr>";
1024
1025 if ($adht->subscription) {
1026 // Amount
1027 print '<tr><td class="fieldrequired">'.$langs->trans("Amount").'</td>';
1028 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>';
1029
1030 // Label
1031 print '<tr><td>'.$langs->trans("Note").'</td>';
1032 print '<td><input name="label" type="text" size="32" value="';
1033 if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
1034 print $langs->trans("Subscription").' '.dol_print_date(($datefrom ? $datefrom : time()), "%Y");
1035 }
1036 print '"></td></tr>';
1037
1038 // Complementary action
1039 if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
1040 $company = new Societe($db);
1041 if ($object->socid) {
1042 $result = $company->fetch($object->socid);
1043 }
1044
1045 // No more action
1046 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('MoreActions');
1047 print '</td>';
1048 print '<td class="line-height-large">';
1049
1050 print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"'.(empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '').'>';
1051 print '<label for="none"> '.$langs->trans("None").'</label><br>';
1052 // Add entry into bank account
1053 if (isModEnabled('bank')) {
1054 print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"'.(!empty($bankdirect) ? ' checked' : '');
1055 print '><label for="bankdirect"> '.$langs->trans("MoreActionBankDirect").'</label><br>';
1056 }
1057 // Add invoice with no payments
1058 if (isModEnabled('societe') && isModEnabled('invoice')) {
1059 print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"'.(!empty($invoiceonly) ? ' checked' : '');
1060 //if (empty($object->fk_soc)) print ' disabled';
1061 print '><label for="invoiceonly"> '.$langs->trans("MoreActionInvoiceOnly");
1062 if ($object->socid) {
1063 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1064 } else {
1065 print ' (';
1066 if (empty($object->socid)) {
1067 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1068 }
1069 print $langs->trans("NoThirdPartyAssociatedToMember");
1070 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&action=create_thirdparty">';
1071 print $langs->trans("CreateDolibarrThirdParty");
1072 print '</a>)';
1073 }
1074 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1075 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1076 }
1077 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1078 $prodtmp = new Product($db);
1079 $result = $prodtmp->fetch(getDolGlobalInt('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1080 if ($result < 0) {
1081 setEventMessage($prodtmp->error, 'errors');
1082 }
1083 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1084 }
1085 print '</label><br>';
1086 }
1087 // Add invoice with payments
1088 if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
1089 print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"'.(!empty($bankviainvoice) ? ' checked' : '');
1090 //if (empty($object->socid)) print ' disabled';
1091 print '><label for="bankviainvoice"> '.$langs->trans("MoreActionBankViaInvoice");
1092 if ($object->socid) {
1093 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1094 } else {
1095 print ' (';
1096 if (empty($object->socid)) {
1097 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1098 }
1099 print $langs->trans("NoThirdPartyAssociatedToMember");
1100 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&action=create_thirdparty">';
1101 print $langs->trans("CreateDolibarrThirdParty");
1102 print '</a>)';
1103 }
1104 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1105 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1106 }
1107 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1108 $prodtmp = new Product($db);
1109 $result = $prodtmp->fetch(getDolGlobalInt('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1110 if ($result < 0) {
1111 setEventMessage($prodtmp->error, 'errors');
1112 }
1113 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1114 }
1115 print '</label><br>';
1116 }
1117 print '</td></tr>';
1118
1119 // Bank account
1120 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("FinancialAccount").'</td><td>';
1121 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1122 $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
1123 print "</td></tr>\n";
1124
1125 // Payment mode
1126 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td>';
1127 print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
1128 print "</td></tr>\n";
1129
1130 // Date of payment
1131 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
1132 print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
1133 print "</td></tr>\n";
1134
1135 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Numero');
1136 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
1137 print '</td>';
1138 print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="'.(!GETPOST('num_chq') ? '' : GETPOST('num_chq')).'"></td></tr>';
1139
1140 print '<tr class="bankswitchclass2 fieldrequireddyn"><td>'.$langs->trans('CheckTransmitter');
1141 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
1142 print '</td>';
1143 print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="'.(!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')).'"></td></tr>';
1144
1145 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Bank');
1146 print ' <em>('.$langs->trans("ChequeBank").')</em>';
1147 print '</td>';
1148 print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="'.(!GETPOST('chqbank') ? '' : GETPOST('chqbank')).'"></td></tr>';
1149 }
1150 }
1151
1152 print '<tr><td></td><td></td></tr>';
1153
1154 print '<tr><td>'.$langs->trans("SendAcknowledgementByMail").'</td>';
1155 print '<td>';
1156 if (!$object->email) {
1157 print $langs->trans("NoEMail");
1158 } else {
1159 $adht = new AdherentType($db);
1160 $adht->fetch($object->typeid);
1161
1162 // Send subscription email
1163 $subject = '';
1164 $msg = '';
1165
1166 // Send subscription email
1167 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1168 $formmail = new FormMail($db);
1169 // Set output language
1170 $outputlangs = new Translate('', $conf);
1171 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1172 // Load traductions files required by page
1173 $outputlangs->loadLangs(array("main", "members"));
1174 // Get email content from template
1175 $arraydefaultmessage = null;
1176 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
1177
1178 if (!empty($labeltouse)) {
1179 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1180 }
1181
1182 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1183 $subject = (string) $arraydefaultmessage->topic;
1184 $msg = (string) $arraydefaultmessage->content;
1185 }
1186
1187 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1188 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1189 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1190 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
1191
1192 $tmp = '<input name="sendmail" type="checkbox"'.(GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')).'>';
1193 $helpcontent = '';
1194 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1195 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1196 $helpcontent .= '<b>'.$langs->trans("MailTopic").'</b>:<br>'."\n";
1197 if ($subjecttosend) {
1198 $helpcontent .= $subjecttosend."\n";
1199 } else {
1200 $langs->load("errors");
1201 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1202 }
1203 $helpcontent .= "<br>";
1204 $helpcontent .= '<b>'.$langs->trans("MailText").'</b>:<br>';
1205 if ($texttosend) {
1206 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1207 } else {
1208 $langs->load("errors");
1209 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1210 }
1211 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1212 print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
1213 }
1214 print '</td></tr>';
1215 print '</tbody>';
1216 print '</table>';
1217 print '</div>';
1218
1219 print dol_get_fiche_end();
1220
1221 print '<div class="center">';
1222 $parameters = array();
1223 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
1224 if (empty($reshook)) {
1225 print '<input type="submit" class="button" name="add" value="'.$langs->trans("AddSubscription").'">';
1226 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
1227 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1228 }
1229 print '</div>';
1230
1231 print '</form>';
1232
1233 print "\n<!-- End form subscription -->\n\n";
1234}
1235
1236
1237// End of page
1238llxFooter();
1239$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:604
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:623
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.
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.
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.
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.
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...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
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.