dolibarr 22.0.5
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-2024 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';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
37require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
38require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
40require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
41require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
42require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
43
53$langs->loadLangs(array("companies", "bills", "members", "users", "mails", 'other'));
54
55$action = GETPOST('action', 'aZ09');
56$confirm = GETPOST('confirm', 'alpha');
57$contextpage = GETPOST('contextpage', 'aZ09');
58$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
59
60$id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
61$rowid = $id;
62$ref = GETPOST('ref', 'alphanohtml');
63$typeid = GETPOSTINT('typeid');
64$cancel = GETPOST('cancel');
65
66// Load variable for pagination
67$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
68$sortfield = GETPOST('sortfield', 'aZ09comma');
69$sortorder = GETPOST('sortorder', 'aZ09comma');
70$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
71if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
72 // If $page is not defined, or '' or -1 or if we click on clear filters
73 $page = 0;
74}
75$offset = $limit * $page;
76$pageprev = $page - 1;
77$pagenext = $page + 1;
78
79// Default sort order (if not yet defined by previous GETPOST)
80if (!$sortfield) {
81 $sortfield = "c.rowid";
82}
83if (!$sortorder) {
84 $sortorder = "DESC";
85}
86
87$object = new Adherent($db);
88$extrafields = new ExtraFields($db);
89$adht = new AdherentType($db);
90
91// fetch optionals attributes and labels
92$extrafields->fetch_name_optionals_label($object->table_element);
93
94$errmsg = '';
95
96// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
97$hookmanager->initHooks(array('subscription'));
98
99// PDF
100$hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
101$hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
102$hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
103
104$datefrom = 0;
105$dateto = 0;
106$paymentdate = -1;
107
108// Fetch object
109if ($id > 0 || !empty($ref)) {
110 // Load member
111 $result = $object->fetch($id, $ref);
112
113 // Define variables to know what current user can do on users
114 $canadduser = ($user->admin || $user->hasRight("user", "user", "creer"));
115 // Define variables to know what current user can do on properties of user linked to edited member
116 if ($object->user_id) {
117 // $User is the user who edits, $object->user_id is the id of the related user in the edited member
118 $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "creer"))
119 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "creer")));
120 $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "password"))
121 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "password")));
122 }
123}
124
125// Define variables to determine what the current user can do on the members
126$permissiontoaddmember = $user->hasRight('adherent', 'creer');
127
128// Security check
129$result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
130
131
132/*
133 * Actions
134 */
135
136$parameters = array();
137$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
138if ($reshook < 0) {
139 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
140}
141
142// Create third party from a member
143if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
144 if ($result > 0) {
145 // Creation of thirdparty
146 $company = new Societe($db);
147 $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'), GETPOST('customercode', 'alpha'));
148
149 if ($result < 0) {
150 $langs->load("errors");
151 setEventMessages($company->error, $company->errors, 'errors');
152 } else {
153 $action = 'addsubscription';
154 }
155 } else {
156 setEventMessages($object->error, $object->errors, 'errors');
157 }
158}
159
160if (empty($reshook) && $action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
161 $error = 0;
162 if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
163 if (GETPOSTINT("userid") != $user->id && GETPOSTINT("userid") != $object->user_id) {
164 $error++;
165 setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
166 }
167 }
168
169 if (!$error) {
170 if (GETPOSTINT("userid") != $object->user_id) { // If link differs from currently in database
171 $result = $object->setUserId(GETPOSTINT("userid"));
172 if ($result < 0) {
173 dol_print_error(null, $object->error);
174 }
175 $action = '';
176 }
177 }
178}
179
180if (empty($reshook) && $action == 'setsocid' && $permissiontoaddmember) {
181 $error = 0;
182 if (GETPOSTINT('socid') != $object->socid) { // If link differs from currently in database
183 $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "adherent";
184 $sql .= " WHERE fk_soc = " . ((int) GETPOSTINT('socid'));
185 $resql = $db->query($sql);
186 if ($resql) {
187 $obj = $db->fetch_object($resql);
188 if ($obj && $obj->rowid > 0) {
189 $othermember = new Adherent($db);
190 $othermember->fetch($obj->rowid);
191 $thirdparty = new Societe($db);
192 $thirdparty->fetch(GETPOSTINT('socid'));
193 $error++;
194 setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
195 }
196 }
197
198 if (!$error) {
199 $result = $object->setThirdPartyId(GETPOSTINT('socid'));
200 if ($result < 0) {
201 dol_print_error(null, $object->error);
202 }
203 $action = '';
204 }
205 }
206}
207
208if (empty($reshook) && $user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) {
209 $error = 0;
210
211 $langs->load("banks");
212
213 $result = $object->fetch($rowid);
214 $result = $adht->fetch($object->typeid);
215
216 // Subscription information
217 $datesubscription = 0;
218 $datesubend = 0;
219 $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
220 $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
221 $paymentdate = ''; // Do not use 0 here, default value is '' that means not filled where 0 means 1970-01-01
222 if (GETPOSTINT("reyear") && GETPOSTINT("remonth") && GETPOSTINT("reday")) {
223 $datesubscription = dol_mktime(0, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
224 }
225 if (GETPOSTINT("endyear") && GETPOSTINT("endmonth") && GETPOSTINT("endday")) {
226 $datesubend = dol_mktime(0, 0, 0, GETPOSTINT("endmonth"), GETPOSTINT("endday"), GETPOSTINT("endyear"));
227 }
228 if (GETPOSTINT("paymentyear") && GETPOSTINT("paymentmonth") && GETPOSTINT("paymentday")) {
229 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT("paymentmonth"), GETPOSTINT("paymentday"), GETPOSTINT("paymentyear"));
230 }
231 $amount = price2num(GETPOST("subscription", 'alpha')); // Amount of subscription
232 $label = GETPOST("label");
233
234 // Payment information
235 $accountid = GETPOSTINT("accountid");
236 $operation = GETPOST("operation", "alphanohtml"); // Payment mode
237 $num_chq = GETPOST("num_chq", "alphanohtml");
238 $emetteur_nom = GETPOST("chqemetteur");
239 $emetteur_banque = GETPOST("chqbank");
240 $option = GETPOST("paymentsave");
241 if (empty($option)) {
242 $option = 'none';
243 }
244 $sendalsoemail = GETPOST("sendmail", 'alpha');
245
246 // Check parameters
247 if (!$datesubscription) {
248 $error++;
249 $langs->load("errors");
250 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateSubscription"));
251 setEventMessages($errmsg, null, 'errors');
252 $action = 'addsubscription';
253 }
254 if (GETPOST('end') && !$datesubend) {
255 $error++;
256 $langs->load("errors");
257 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateEndSubscription"));
258 setEventMessages($errmsg, null, 'errors');
259 $action = 'addsubscription';
260 }
261 if (!$datesubend) {
262 $datesubend = dol_time_plus_duree(dol_time_plus_duree($datesubscription, $defaultdelay, $defaultdelayunit), -1, 'd');
263 }
264 if (($option == 'bankviainvoice' || $option == 'bankdirect') && !$paymentdate) {
265 $error++;
266 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment"));
267 setEventMessages($errmsg, null, 'errors');
268 $action = 'addsubscription';
269 }
270
271 // Check if a payment is mandatory or not
272 if ($adht->subscription) { // Member type need subscriptions
273 if (!is_numeric($amount)) {
274 // If field is '' or not a numeric value
275 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount"));
276 setEventMessages($errmsg, null, 'errors');
277 $error++;
278 $action = 'addsubscription';
279 } else {
280 // If an amount has been provided, we check also fields that becomes mandatory when amount is not null.
281 if (isModEnabled('bank') && GETPOST("paymentsave") != 'none') {
282 if (GETPOST("subscription")) {
283 if (!GETPOST("label")) {
284 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"));
285 setEventMessages($errmsg, null, 'errors');
286 $error++;
287 $action = 'addsubscription';
288 }
289 if (GETPOST("paymentsave") != 'invoiceonly' && !GETPOST("operation")) {
290 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode"));
291 setEventMessages($errmsg, null, 'errors');
292 $error++;
293 $action = 'addsubscription';
294 }
295 if (GETPOST("paymentsave") != 'invoiceonly' && !(GETPOSTINT("accountid") > 0)) {
296 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("FinancialAccount"));
297 setEventMessages($errmsg, null, 'errors');
298 $error++;
299 $action = 'addsubscription';
300 }
301 } else {
302 if (GETPOSTINT("accountid")) {
303 $errmsg = $langs->trans("ErrorDoNotProvideAccountsIfNullAmount");
304 setEventMessages($errmsg, null, 'errors');
305 $error++;
306 $action = 'addsubscription';
307 }
308 }
309 }
310 }
311 }
312
313 // Record the subscription then complementary actions
314 if (!$error && $action == 'subscription') { // Test on permission already done
315 $db->begin();
316
317 // Create subscription
318 $crowid = $object->subscription($datesubscription, (float) $amount, $accountid, $operation, $label, $num_chq, $emetteur_nom, $emetteur_banque, $datesubend);
319 if ($crowid <= 0) {
320 $error++;
321 $errmsg = $object->error;
322 setEventMessages($object->error, $object->errors, 'errors');
323 }
324
325 if (!$error) {
326 $result = $object->subscriptionComplementaryActions($crowid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, (float) $amount, $num_chq, $emetteur_nom, $emetteur_banque);
327 if ($result < 0) {
328 $error++;
329 setEventMessages($object->error, $object->errors, 'errors');
330 } else {
331 // If an invoice was created, it is into $object->invoice
332 }
333 }
334
335 if (!$error) {
336 $db->commit();
337 } else {
338 $db->rollback();
339 $action = 'addsubscription';
340 }
341
342 if (!$error) {
343 setEventMessages("SubscriptionRecorded", null, 'mesgs');
344 }
345
346 // Send email
347 if (!$error) {
348 // Send confirmation Email
349 if ($object->email && $sendalsoemail) { // $object is 'Adherent'
350 $parameters = array(
351 'datesubscription' => $datesubscription,
352 'amount' => $amount,
353 'accountid' => $accountid,
354 'ccountid' => $accountid, // Deprecated key (typo), kept for the hooks that already read it
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->default_lang) ? $object->default_lang : (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="'.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.png', '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="titlefield">'.$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="titlefield">'.$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="titlefield">'.$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->fk_soc, '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 != 'addsubscription' && $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="'.$_SERVER["PHP_SELF"].'?rowid='.$rowid.'&action=addsubscription&token='.newToken().'">'.$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 != 'addsubscription' && $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,";
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 if (isModEnabled('bank')) {
748 print_liste_field_titre('Account', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
749 }
750 print "</tr>\n";
751
752 $accountstatic = new Account($db);
753 $adh = new Adherent($db);
754 $adht = new AdherentType($db);
755
756 $i = 0;
757 while ($i < $num) {
758 $objp = $db->fetch_object($result);
759
760 $adh->id = $objp->rowid;
761 $adh->typeid = $objp->type;
762
763 $subscriptionstatic->ref = $objp->crowid;
764 $subscriptionstatic->id = $objp->crowid;
765
766 $typeid = $objp->cfk_type;
767 if ($typeid > 0) {
768 $adht->fetch($typeid);
769 }
770
771 print '<tr class="oddeven">';
772 print '<td>'.$subscriptionstatic->getNomUrl(1).'</td>';
773 print '<td class="center nowraponall">'.dol_print_date($db->jdate($objp->datec), 'dayhour')."</td>\n";
774 print '<td class="center tdoverflowmax125">';
775 if ($typeid > 0) {
776 print $adht->getNomUrl(1);
777 }
778 print '</td>';
779 print '<td class="center">'.dol_print_date($db->jdate($objp->dateh), 'day')."</td>\n";
780 print '<td class="center">'.dol_print_date($db->jdate($objp->datef), 'day')."</td>\n";
781 print '<td class="right amount">'.price($objp->subscription).'</td>';
782 if (isModEnabled('bank')) {
783 print '<td class="tdoverflowmax100 right">';
784 if ($objp->bid) {
785 $accountstatic->label = $objp->label;
786 $accountstatic->id = $objp->baid;
787 $accountstatic->number = $objp->number;
788 $accountstatic->account_number = $objp->account_number;
789 $accountstatic->currency_code = $objp->currency_code;
790
791 if (isModEnabled('accounting') && $objp->fk_accountancy_journal > 0) {
792 $accountingjournal = new AccountingJournal($db);
793 $accountingjournal->fetch($objp->fk_accountancy_journal);
794
795 $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
796 }
797
798 $accountstatic->ref = $objp->ref;
799 print $accountstatic->getNomUrl(1);
800 } else {
801 print '&nbsp;';
802 }
803 print '</td>';
804 }
805 print "</tr>";
806 $i++;
807 }
808
809 if (empty($num)) {
810 $colspan = 6;
811 if (isModEnabled('bank')) {
812 $colspan++;
813 }
814 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
815 }
816
817 print "</table>";
818 print '</div>';
819 } else {
820 dol_print_error($db);
821 }
822}
823
824
825if (($action != 'addsubscription' && $action != 'create_thirdparty')) {
826 // Show online payment link
827 // The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
828 include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
829 $validpaymentmethod = getValidOnlinePaymentMethods('');
830 $useonlinepayment = count($validpaymentmethod);
831
832 if ($useonlinepayment) {
833 print '<br>';
834
835 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
836 print showOnlinePaymentUrl('membersubscription', $object->ref);
837 print '<br>';
838 }
839}
840
841/*
842 * Add new subscription form
843 */
844if (($action == 'addsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) {
845 print '<br>';
846
847 print load_fiche_titre($langs->trans("NewCotisation"));
848
849 // Define default choice for complementary actions
850 $bankdirect = 0; // 1 means option by default is write to bank direct with no invoice
851 $invoiceonly = 0; // 1 means option by default is invoice only
852 $bankviainvoice = 0; // 1 means option by default is write to bank via invoice
853 if (GETPOST('paymentsave')) {
854 if (GETPOST('paymentsave') == 'bankdirect') {
855 $bankdirect = 1;
856 }
857 if (GETPOST('paymentsave') == 'invoiceonly') {
858 $invoiceonly = 1;
859 }
860 if (GETPOST('paymentsave') == 'bankviainvoice') {
861 $bankviainvoice = 1;
862 }
863 } else {
864 if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
865 $bankviainvoice = 1;
866 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' && isModEnabled('bank')) {
867 $bankdirect = 1;
868 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'invoiceonly' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
869 $invoiceonly = 1;
870 }
871 }
872
873 print "\n\n<!-- Form add subscription -->\n";
874
875 if ($conf->use_javascript_ajax) {
876 //var_dump($bankdirect.'-'.$bankviainvoice.'-'.$invoiceonly);
877 print "\n".'<script type="text/javascript">';
878 print '$(document).ready(function () {
879 $(".bankswitchclass, .bankswitchclass2").'.(($bankdirect || $bankviainvoice) ? 'show()' : 'hide()').';
880 $("#none, #invoiceonly").click(function() {
881 $(".bankswitchclass").hide();
882 $(".bankswitchclass2").hide();
883 });
884 $("#bankdirect, #bankviainvoice").click(function() {
885 $(".bankswitchclass").show();
886 $(".bankswitchclass2").show();
887 });
888 $("#selectoperation").change(function() {
889 var code = $(this).val();
890 if (code == "CHQ")
891 {
892 $(".fieldrequireddyn").addClass("fieldrequired");
893 if ($("#fieldchqemetteur").val() == "")
894 {
895 $("#fieldchqemetteur").val($("#memberlabel").val());
896 }
897 }
898 else
899 {
900 $(".fieldrequireddyn").removeClass("fieldrequired");
901 }
902 });
903 ';
904 if (GETPOST('paymentsave')) {
905 print '$("#'.GETPOST('paymentsave', 'aZ09').'").prop("checked", true);';
906 }
907 print '});';
908 print '</script>'."\n";
909 }
910
911
912 // Confirm create third party
913 if ($action == 'create_thirdparty') {
914 $companyalias = '';
915 $fullname = $object->getFullName($langs);
916
917 if ($object->morphy == 'mor') {
918 $companyname = $object->company;
919 if (!empty($fullname)) {
920 $companyalias = $fullname;
921 }
922 } else {
923 $companyname = $fullname;
924 if (!empty($object->company)) {
925 $companyalias = $object->company;
926 }
927 }
928
929 // Create a form array
930 $formquestion = array(
931 array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
932 array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
933 );
934 // If customer code was forced to "required", we ask it at creation to avoid error later
935 if (getDolGlobalString('MAIN_COMPANY_CODE_ALWAYS_REQUIRED')) {
936 $tmpcompany = new Societe($db);
937 $tmpcompany->name = $companyname;
938 $tmpcompany->get_codeclient($tmpcompany, 0);
939 $customercode = $tmpcompany->code_client;
940 $formquestion[] = array(
941 'label' => $langs->trans("CustomerCode"),
942 'type' => 'text',
943 'name' => 'customercode',
944 'value' => $customercode,
945 'morecss' => 'minwidth300',
946 'moreattr' => 'maxlength="128"',
947 );
948 }
949 // @todo Add other extrafields mandatory for thirdparty creation
950
951 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 1);
952 }
953
954
955 print '<form name="subscription" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
956 print '<input type="hidden" name="token" value="'.newToken().'">';
957 print '<input type="hidden" name="action" value="subscription">';
958 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
959 print '<input type="hidden" name="memberlabel" id="memberlabel" value="'.dol_escape_htmltag($object->getFullName($langs)).'">';
960 print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="'.dol_escape_htmltag($object->company).'">';
961
962 print dol_get_fiche_head(array());
963
964 print '<div class="div-table-responsive">';
965 print '<table class="border centpercent">'."\n";
966 print '<tbody>';
967
968 // Date payment
969 if (GETPOST('paymentyear') && GETPOST('paymentmonth') && GETPOST('paymentday')) {
970 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT('paymentmonth'), GETPOSTINT('paymentday'), GETPOSTINT('paymentyear'));
971 }
972
973 // Date start subscription
974 print '<tr>';
975 $currentyear = dol_print_date($now, "%Y");
976 $currentmonth = dol_print_date($now, "%m");
977 print '<td class="fieldrequired">'.$langs->trans("DateSubscription").'</td><td>';
978 if (GETPOST('reday')) {
979 $datefrom = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
980 }
981 if (!$datefrom) {
982 // Guess the subscription start date
983 // By default, the subscription start date is the end date of previous membership ($object->datefin) + 1 day, or the date of
984 // the validation of the member if no previous date exists.
985 $datefrom = ($object->datefin ? dol_time_plus_duree($object->datefin, 1, 'd') : $object->datevalid);
986
987 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER')) {
988 $datefrom = dol_time_plus_duree($now, (int) substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), 0, -1), substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), -1));
989 } elseif ($object->datefin > 0 && dol_time_plus_duree($object->datefin, $defaultdelay, $defaultdelayunit) > $now) {
990 $datefrom = dol_time_plus_duree($object->datefin, 1, 'd');
991 }
992 // Now do a correction of the suggested date
993 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "m") {
994 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
995 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "3m") {
996 $datefrom = dol_time_plus_duree($object->datefin, -3, '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') === "Y") {
999 $datefrom = dol_get_first_day((int) dol_print_date($datefrom, "%Y"));
1000 }
1001 }
1002 print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
1003 print "</td></tr>";
1004
1005 // Date end subscription
1006 if (GETPOST('endday')) {
1007 $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
1008 }
1009 if (!$dateto) {
1010 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
1011 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"), (int) dol_print_date($datefrom, "%m"));
1012 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
1013 $dateto = dol_get_last_day((int) dol_print_date($datefrom, "%Y"));
1014 } else {
1015 $dateto = -1; // By default, no date is suggested
1016 }
1017 }
1018 print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';
1019 print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
1020 print "</td></tr>";
1021
1022 if ($adht->subscription) {
1023 // Amount
1024 print '<tr><td class="fieldrequired">'.$langs->trans("Amount").'</td>';
1025 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".$conf->currency) .'</td></tr>';
1026
1027 // Label
1028 print '<tr><td>'.$langs->trans("Label").'</td>';
1029 print '<td><input name="label" type="text" size="32" value="';
1030 if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
1031 print $langs->trans("Subscription").' '.dol_print_date(($datefrom ? $datefrom : time()), "%Y");
1032 }
1033 print '"></td></tr>';
1034
1035 // Complementary action
1036 if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
1037 $company = new Societe($db);
1038 if ($object->socid) {
1039 $result = $company->fetch($object->socid);
1040 }
1041
1042 // No more action
1043 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('MoreActions');
1044 print '</td>';
1045 print '<td class="line-height-large">';
1046
1047 print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"'.(empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '').'>';
1048 print '<label for="none"> '.$langs->trans("None").'</label><br>';
1049 // Add entry into bank account
1050 if (isModEnabled('bank')) {
1051 print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"'.(!empty($bankdirect) ? ' checked' : '');
1052 print '><label for="bankdirect"> '.$langs->trans("MoreActionBankDirect").'</label><br>';
1053 }
1054 // Add invoice with no payments
1055 if (isModEnabled('societe') && isModEnabled('invoice')) {
1056 print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"'.(!empty($invoiceonly) ? ' checked' : '');
1057 //if (empty($object->fk_soc)) print ' disabled';
1058 print '><label for="invoiceonly"> '.$langs->trans("MoreActionInvoiceOnly");
1059 if ($object->fk_soc) {
1060 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1061 } else {
1062 print ' (';
1063 if (empty($object->fk_soc)) {
1064 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1065 }
1066 print $langs->trans("NoThirdPartyAssociatedToMember");
1067 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&action=create_thirdparty">';
1068 print $langs->trans("CreateDolibarrThirdParty");
1069 print '</a>)';
1070 }
1071 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1072 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1073 }
1074 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1075 $prodtmp = new Product($db);
1076 $result = $prodtmp->fetch(getDolGlobalInt('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1077 if ($result < 0) {
1078 setEventMessage($prodtmp->error, 'errors');
1079 }
1080 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1081 }
1082 print '</label><br>';
1083 }
1084 // Add invoice with payments
1085 if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
1086 print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"'.(!empty($bankviainvoice) ? ' checked' : '');
1087 //if (empty($object->fk_soc)) print ' disabled';
1088 print '><label for="bankviainvoice"> '.$langs->trans("MoreActionBankViaInvoice");
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 print '</td></tr>';
1115
1116 // Bank account
1117 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("FinancialAccount").'</td><td>';
1118 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1119 $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
1120 print "</td></tr>\n";
1121
1122 // Payment mode
1123 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td>';
1124 print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
1125 print "</td></tr>\n";
1126
1127 // Date of payment
1128 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
1129 print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
1130 print "</td></tr>\n";
1131
1132 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Numero');
1133 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
1134 print '</td>';
1135 print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="'.(!GETPOST('num_chq') ? '' : GETPOST('num_chq')).'"></td></tr>';
1136
1137 print '<tr class="bankswitchclass2 fieldrequireddyn"><td>'.$langs->trans('CheckTransmitter');
1138 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
1139 print '</td>';
1140 print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="'.(!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')).'"></td></tr>';
1141
1142 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Bank');
1143 print ' <em>('.$langs->trans("ChequeBank").')</em>';
1144 print '</td>';
1145 print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="'.(!GETPOST('chqbank') ? '' : GETPOST('chqbank')).'"></td></tr>';
1146 }
1147 }
1148
1149 print '<tr><td></td><td></td></tr>';
1150
1151 print '<tr><td>'.$langs->trans("SendAcknowledgementByMail").'</td>';
1152 print '<td>';
1153 if (!$object->email) {
1154 print $langs->trans("NoEMail");
1155 } else {
1156 $adht = new AdherentType($db);
1157 $adht->fetch($object->typeid);
1158
1159 // Send subscription email
1160 $subject = '';
1161 $msg = '';
1162
1163 // Send subscription email
1164 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1165 $formmail = new FormMail($db);
1166 // Set output language
1167 $outputlangs = new Translate('', $conf);
1168 $outputlangs->setDefaultLang(!empty($object->default_lang) ? $object->default_lang : (empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang));
1169 // Load traductions files required by page
1170 $outputlangs->loadLangs(array("main", "members"));
1171 // Get email content from template
1172 $arraydefaultmessage = null;
1173 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
1174
1175 if (!empty($labeltouse)) {
1176 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1177 }
1178
1179 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1180 $subject = (string) $arraydefaultmessage->topic;
1181 $msg = (string) $arraydefaultmessage->content;
1182 }
1183
1184 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1185 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1186 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1187 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
1188
1189 $tmp = '<input name="sendmail" type="checkbox"'.(GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')).'>';
1190 $helpcontent = '';
1191 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM', $conf->email_from).'<br>'."\n";
1192 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1193 $helpcontent .= '<b>'.$langs->trans("MailTopic").'</b>:<br>'."\n";
1194 if ($subjecttosend) {
1195 $helpcontent .= $subjecttosend."\n";
1196 } else {
1197 $langs->load("errors");
1198 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1199 }
1200 $helpcontent .= "<br>";
1201 $helpcontent .= '<b>'.$langs->trans("MailText").'</b>:<br>';
1202 if ($texttosend) {
1203 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1204 } else {
1205 $langs->load("errors");
1206 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1207 }
1208 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1209 print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
1210 }
1211 print '</td></tr>';
1212 print '</tbody>';
1213 print '</table>';
1214 print '</div>';
1215
1216 print dol_get_fiche_end();
1217
1218 print '<div class="center">';
1219 $parameters = array();
1220 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
1221 if (empty($reshook)) {
1222 print '<input type="submit" class="button" name="add" value="'.$langs->trans("AddSubscription").'">';
1223 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
1224 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1225 }
1226 print '</div>';
1227
1228 print '</form>';
1229
1230 print "\n<!-- End form subscription -->\n\n";
1231}
1232
1233
1234// End of page
1235llxFooter();
1236$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
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 standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
Class 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.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:600
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:125
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:619
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_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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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.
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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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...
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_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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.
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...
member_prepare_head(Adherent $object)
Return array head with list of tabs to view object information.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
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.