dolibarr 21.0.0-alpha
subscription.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2018 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2012-2017 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2015-2024 Alexandre Spangaro <aspangaro@open-dsi.fr>
7 * Copyright (C) 2018-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 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
36require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
37require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
39require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
40require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
41require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
42
43$langs->loadLangs(array("companies", "bills", "members", "users", "mails", 'other'));
44
45$action = GETPOST('action', 'aZ09');
46$confirm = GETPOST('confirm', 'alpha');
47$contextpage = GETPOST('contextpage', 'aZ09');
48$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
49
50$id = GETPOSTINT('rowid') ? GETPOSTINT('rowid') : GETPOSTINT('id');
51$rowid = $id;
52$ref = GETPOST('ref', 'alphanohtml');
53$typeid = GETPOSTINT('typeid');
54$cancel = GETPOST('cancel');
55
56// Load variable for pagination
57$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
58$sortfield = GETPOST('sortfield', 'aZ09comma');
59$sortorder = GETPOST('sortorder', 'aZ09comma');
60$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
61if (empty($page) || $page == -1) {
62 $page = 0;
63} // If $page is not defined, or '' or -1
64$offset = $limit * $page;
65$pageprev = $page - 1;
66$pagenext = $page + 1;
67
68// Default sort order (if not yet defined by previous GETPOST)
69if (!$sortfield) {
70 $sortfield = "c.rowid";
71}
72if (!$sortorder) {
73 $sortorder = "DESC";
74}
75
76$object = new Adherent($db);
77$extrafields = new ExtraFields($db);
78$adht = new AdherentType($db);
79
80// fetch optionals attributes and labels
81$extrafields->fetch_name_optionals_label($object->table_element);
82
83$errmsg = '';
84
85// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
86$hookmanager->initHooks(array('subscription'));
87
88// PDF
89$hidedetails = (GETPOSTINT('hidedetails') ? GETPOSTINT('hidedetails') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS') ? 1 : 0));
90$hidedesc = (GETPOSTINT('hidedesc') ? GETPOSTINT('hidedesc') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_DESC') ? 1 : 0));
91$hideref = (GETPOSTINT('hideref') ? GETPOSTINT('hideref') : (getDolGlobalString('MAIN_GENERATE_DOCUMENTS_HIDE_REF') ? 1 : 0));
92
93$datefrom = 0;
94$dateto = 0;
95$paymentdate = -1;
96
97// Fetch object
98if ($id > 0 || !empty($ref)) {
99 // Load member
100 $result = $object->fetch($id, $ref);
101
102 // Define variables to know what current user can do on users
103 $canadduser = ($user->admin || $user->hasRight("user", "user", "creer"));
104 // Define variables to know what current user can do on properties of user linked to edited member
105 if ($object->user_id) {
106 // $User is the user who edits, $object->user_id is the id of the related user in the edited member
107 $caneditfielduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "creer"))
108 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "creer")));
109 $caneditpassworduser = ((($user->id == $object->user_id) && $user->hasRight("user", "self", "password"))
110 || (($user->id != $object->user_id) && $user->hasRight("user", "user", "password")));
111 }
112}
113
114// Define variables to determine what the current user can do on the members
115$canaddmember = $user->hasRight('adherent', 'creer');
116// Define variables to determine what the current user can do on the properties of a member
117if ($id) {
118 $caneditfieldmember = $user->hasRight('adherent', 'creer');
119}
120
121// Security check
122$result = restrictedArea($user, 'adherent', $object->id, '', '', 'socid', 'rowid', 0);
123
124
125/*
126 * Actions
127 */
128
129$parameters = array();
130$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
131if ($reshook < 0) {
132 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
133}
134
135// Create third party from a member
136if (empty($reshook) && $action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->hasRight('societe', 'creer')) {
137 if ($result > 0) {
138 // Creation of thirdparty
139 $company = new Societe($db);
140 $result = $company->create_from_member($object, GETPOST('companyname', 'alpha'), GETPOST('companyalias', 'alpha'), GETPOST('customercode', 'alpha'));
141
142 if ($result < 0) {
143 $langs->load("errors");
144 setEventMessages($company->error, $company->errors, 'errors');
145 } else {
146 $action = 'addsubscription';
147 }
148 } else {
149 setEventMessages($object->error, $object->errors, 'errors');
150 }
151}
152
153if (empty($reshook) && $action == 'setuserid' && ($user->hasRight('user', 'self', 'creer') || $user->hasRight('user', 'user', 'creer'))) {
154 $error = 0;
155 if (!$user->hasRight('user', 'user', 'creer')) { // If can edit only itself user, we can link to itself only
156 if (GETPOSTINT("userid") != $user->id && GETPOSTINT("userid") != $object->user_id) {
157 $error++;
158 setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors');
159 }
160 }
161
162 if (!$error) {
163 if (GETPOSTINT("userid") != $object->user_id) { // If link differs from currently in database
164 $result = $object->setUserId(GETPOSTINT("userid"));
165 if ($result < 0) {
166 dol_print_error(null, $object->error);
167 }
168 $action = '';
169 }
170 }
171}
172
173if (empty($reshook) && $action == 'setsocid') {
174 $error = 0;
175 if (!$error) {
176 if (GETPOSTINT('socid') != $object->fk_soc) { // If link differs from currently in database
177 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."adherent";
178 $sql .= " WHERE fk_soc = '".GETPOSTINT('socid')."'";
179 $resql = $db->query($sql);
180 if ($resql) {
181 $obj = $db->fetch_object($resql);
182 if ($obj && $obj->rowid > 0) {
183 $othermember = new Adherent($db);
184 $othermember->fetch($obj->rowid);
185 $thirdparty = new Societe($db);
186 $thirdparty->fetch(GETPOSTINT('socid'));
187 $error++;
188 setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty", $othermember->getFullName($langs), $othermember->login, $thirdparty->name), null, 'errors');
189 }
190 }
191
192 if (!$error) {
193 $result = $object->setThirdPartyId(GETPOSTINT('socid'));
194 if ($result < 0) {
195 dol_print_error(null, $object->error);
196 }
197 $action = '';
198 }
199 }
200 }
201}
202
203if ($user->hasRight('adherent', 'cotisation', 'creer') && $action == 'subscription' && !$cancel) {
204 $error = 0;
205
206 $langs->load("banks");
207
208 $result = $object->fetch($rowid);
209 $result = $adht->fetch($object->typeid);
210
211 // Subscription information
212 $datesubscription = 0;
213 $datesubend = 0;
214 $defaultdelay = !empty($adht->duration_value) ? $adht->duration_value : 1;
215 $defaultdelayunit = !empty($adht->duration_unit) ? $adht->duration_unit : 'y';
216 $paymentdate = ''; // Do not use 0 here, default value is '' that means not filled where 0 means 1970-01-01
217 if (GETPOSTINT("reyear") && GETPOSTINT("remonth") && GETPOSTINT("reday")) {
218 $datesubscription = dol_mktime(0, 0, 0, GETPOSTINT("remonth"), GETPOSTINT("reday"), GETPOSTINT("reyear"));
219 }
220 if (GETPOSTINT("endyear") && GETPOSTINT("endmonth") && GETPOSTINT("endday")) {
221 $datesubend = dol_mktime(0, 0, 0, GETPOSTINT("endmonth"), GETPOSTINT("endday"), GETPOSTINT("endyear"));
222 }
223 if (GETPOSTINT("paymentyear") && GETPOSTINT("paymentmonth") && GETPOSTINT("paymentday")) {
224 $paymentdate = dol_mktime(0, 0, 0, GETPOSTINT("paymentmonth"), GETPOSTINT("paymentday"), GETPOSTINT("paymentyear"));
225 }
226 $amount = price2num(GETPOST("subscription", 'alpha')); // Amount of subscription
227 $label = GETPOST("label");
228
229 // Payment information
230 $accountid = GETPOSTINT("accountid");
231 $operation = GETPOST("operation", "alphanohtml"); // Payment mode
232 $num_chq = GETPOST("num_chq", "alphanohtml");
233 $emetteur_nom = GETPOST("chqemetteur");
234 $emetteur_banque = GETPOST("chqbank");
235 $option = GETPOST("paymentsave");
236 if (empty($option)) {
237 $option = 'none';
238 }
239 $sendalsoemail = GETPOST("sendmail", 'alpha');
240
241 // Check parameters
242 if (!$datesubscription) {
243 $error++;
244 $langs->load("errors");
245 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateSubscription"));
246 setEventMessages($errmsg, null, 'errors');
247 $action = 'addsubscription';
248 }
249 if (GETPOST('end') && !$datesubend) {
250 $error++;
251 $langs->load("errors");
252 $errmsg = $langs->trans("ErrorBadDateFormat", $langs->transnoentitiesnoconv("DateEndSubscription"));
253 setEventMessages($errmsg, null, 'errors');
254 $action = 'addsubscription';
255 }
256 if (!$datesubend) {
257 $datesubend = dol_time_plus_duree(dol_time_plus_duree($datesubscription, $defaultdelay, $defaultdelayunit), -1, 'd');
258 }
259 if (($option == 'bankviainvoice' || $option == 'bankdirect') && !$paymentdate) {
260 $error++;
261 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DatePayment"));
262 setEventMessages($errmsg, null, 'errors');
263 $action = 'addsubscription';
264 }
265
266 // Check if a payment is mandatory or not
267 if ($adht->subscription) { // Member type need subscriptions
268 if (!is_numeric($amount)) {
269 // If field is '' or not a numeric value
270 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount"));
271 setEventMessages($errmsg, null, 'errors');
272 $error++;
273 $action = 'addsubscription';
274 } else {
275 // If an amount has been provided, we check also fields that becomes mandatory when amount is not null.
276 if (isModEnabled('bank') && GETPOST("paymentsave") != 'none') {
277 if (GETPOST("subscription")) {
278 if (!GETPOST("label")) {
279 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("Label"));
280 setEventMessages($errmsg, null, 'errors');
281 $error++;
282 $action = 'addsubscription';
283 }
284 if (GETPOST("paymentsave") != 'invoiceonly' && !GETPOST("operation")) {
285 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("PaymentMode"));
286 setEventMessages($errmsg, null, 'errors');
287 $error++;
288 $action = 'addsubscription';
289 }
290 if (GETPOST("paymentsave") != 'invoiceonly' && !(GETPOSTINT("accountid") > 0)) {
291 $errmsg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("FinancialAccount"));
292 setEventMessages($errmsg, null, 'errors');
293 $error++;
294 $action = 'addsubscription';
295 }
296 } else {
297 if (GETPOSTINT("accountid")) {
298 $errmsg = $langs->trans("ErrorDoNotProvideAccountsIfNullAmount");
299 setEventMessages($errmsg, null, 'errors');
300 $error++;
301 $action = 'addsubscription';
302 }
303 }
304 }
305 }
306 }
307
308 // Record the subscription then complementary actions
309 if (!$error && $action == 'subscription') {
310 $db->begin();
311
312 // Create subscription
313 $crowid = $object->subscription($datesubscription, $amount, $accountid, $operation, $label, $num_chq, $emetteur_nom, $emetteur_banque, $datesubend);
314 if ($crowid <= 0) {
315 $error++;
316 $errmsg = $object->error;
317 setEventMessages($object->error, $object->errors, 'errors');
318 }
319
320 if (!$error) {
321 $result = $object->subscriptionComplementaryActions($crowid, $option, $accountid, $datesubscription, $paymentdate, $operation, $label, $amount, $num_chq, $emetteur_nom, $emetteur_banque);
322 if ($result < 0) {
323 $error++;
324 setEventMessages($object->error, $object->errors, 'errors');
325 } else {
326 // If an invoice was created, it is into $object->invoice
327 }
328 }
329
330 if (!$error) {
331 $db->commit();
332 } else {
333 $db->rollback();
334 $action = 'addsubscription';
335 }
336
337 if (!$error) {
338 setEventMessages("SubscriptionRecorded", null, 'mesgs');
339 }
340
341 // Send email
342 if (!$error) {
343 // Send confirmation Email
344 if ($object->email && $sendalsoemail) { // $object is 'Adherent'
345 $parameters = array(
346 'datesubscription' => $datesubscription,
347 'amount' => $amount,
348 'ccountid' => $accountid,
349 'operation' => $operation,
350 'label' => $label,
351 'num_chq' => $num_chq,
352 'emetteur_nom' => $emetteur_nom,
353 'emetteur_banque' => $emetteur_banque,
354 'datesubend' => $datesubend
355 );
356 $reshook = $hookmanager->executeHooks('sendMail', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
357 if ($reshook < 0) {
358 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
359 }
360
361 if (empty($reshook)) {
362 $subject = '';
363 $msg = '';
364
365 // Send subscription email
366 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
367 $formmail = new FormMail($db);
368 // Set output language
369 $outputlangs = new Translate('', $conf);
370 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
371 // Load traductions files required by page
372 $outputlangs->loadLangs(array("main", "members"));
373
374 // Get email content from template
375 $arraydefaultmessage = null;
376 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
377
378 if (!empty($labeltouse)) {
379 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
380 }
381
382 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
383 $subject = $arraydefaultmessage->topic;
384 $msg = $arraydefaultmessage->content;
385 }
386
387 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
388 complete_substitutions_array($substitutionarray, $outputlangs, $object);
389 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
390 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
391
392 // Attach a file ?
393 $file = '';
394 $listofpaths = array();
395 $listofnames = array();
396 $listofmimes = array();
397 if (is_object($object->invoice) && (!is_object($arraydefaultmessage) || intval($arraydefaultmessage->joinfiles))) {
398 $invoicediroutput = $conf->facture->dir_output;
399 $fileparams = dol_most_recent_file($invoicediroutput.'/'.$object->invoice->ref, preg_quote($object->invoice->ref, '/').'[^\-]+');
400 $file = $fileparams['fullname'];
401
402 $listofpaths = array($file);
403 $listofnames = array(basename($file));
404 $listofmimes = array(dol_mimetype($file));
405 }
406
407 $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/subscription.php'."\r\n";
408
409 $result = $object->sendEmail($texttosend, $subjecttosend, $listofpaths, $listofmimes, $listofnames, "", "", 0, -1, '', $moreinheader);
410 if ($result < 0) {
411 $errmsg = $object->error;
412 setEventMessages($object->error, $object->errors, 'errors');
413 } else {
414 setEventMessages($langs->trans("EmailSentToMember", $object->email), null, 'mesgs');
415 }
416 }
417 } else {
418 setEventMessages($langs->trans("NoEmailSentToMember"), null, 'mesgs');
419 }
420 }
421
422 // Clean some POST vars
423 if (!$error) {
424 $accountid = '';
425 $operation = '';
426 $label = '';
427 $num_chq = '';
428 $option = '';
429 }
430 }
431}
432
433
434
435/*
436 * View
437 */
438
439$form = new Form($db);
440
441$now = dol_now();
442
443$title = $langs->trans("Member")." - ".$langs->trans("Subscriptions");
444$help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
445
446llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-member page-card_subscription');
447
448
449$param = '';
450if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
451 $param .= '&contextpage='.urlencode($contextpage);
452}
453if ($limit > 0 && $limit != $conf->liste_limit) {
454 $param .= '&limit='.((int) $limit);
455}
456$param .= '&id='.$rowid;
457if ($optioncss != '') {
458 $param .= '&optioncss='.urlencode($optioncss);
459}
460// Add $param from extra fields
461//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
462
463
464if (! ($object->id > 0)) {
465 $langs->load("errors");
466 print $langs->trans("ErrorRecordNotFound");
467}
468
469/*$res = $object->fetch($rowid);
470 if ($res < 0) {
471 dol_print_error($db, $object->error);
472 exit;
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->statut) {
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->statut) {
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("PublicFile"), $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" width="100%"><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->fk_soc) {
641 $company = new Societe($db);
642 $result = $company->fetch($object->fk_soc);
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" width="100%"><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, $object->user_id, 'userid', '');
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->statut > 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 '<table class="noborder centpercent">'."\n";
738
739 print '<tr class="liste_titre">';
740 print_liste_field_titre('Ref', $_SERVER["PHP_SELF"], 'c.rowid', '', $param, '', $sortfield, $sortorder);
741 print_liste_field_titre('DateCreation', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
742 print_liste_field_titre('Type', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
743 print_liste_field_titre('DateStart', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
744 print_liste_field_titre('DateEnd', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
745 print_liste_field_titre('Amount', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
746 if (isModEnabled('bank')) {
747 print_liste_field_titre('Account', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
748 }
749 print "</tr>\n";
750
751 $accountstatic = new Account($db);
752 $adh = new Adherent($db);
753 $adht = new AdherentType($db);
754
755 $i = 0;
756 while ($i < $num) {
757 $objp = $db->fetch_object($result);
758
759 $adh->id = $objp->rowid;
760 $adh->typeid = $objp->type;
761
762 $subscriptionstatic->ref = $objp->crowid;
763 $subscriptionstatic->id = $objp->crowid;
764
765 $typeid = $objp->cfk_type;
766 if ($typeid > 0) {
767 $adht->fetch($typeid);
768 }
769
770 print '<tr class="oddeven">';
771 print '<td>'.$subscriptionstatic->getNomUrl(1).'</td>';
772 print '<td class="center">'.dol_print_date($db->jdate($objp->datec), 'dayhour')."</td>\n";
773 print '<td class="center">';
774 if ($typeid > 0) {
775 print $adht->getNomUrl(1);
776 }
777 print '</td>';
778 print '<td class="center">'.dol_print_date($db->jdate($objp->dateh), 'day')."</td>\n";
779 print '<td class="center">'.dol_print_date($db->jdate($objp->datef), 'day')."</td>\n";
780 print '<td class="right amount">'.price($objp->subscription).'</td>';
781 if (isModEnabled('bank')) {
782 print '<td class="right">';
783 if ($objp->bid) {
784 $accountstatic->label = $objp->label;
785 $accountstatic->id = $objp->baid;
786 $accountstatic->number = $objp->number;
787 $accountstatic->account_number = $objp->account_number;
788 $accountstatic->currency_code = $objp->currency_code;
789
790 if (isModEnabled('accounting') && $objp->fk_accountancy_journal > 0) {
791 $accountingjournal = new AccountingJournal($db);
792 $accountingjournal->fetch($objp->fk_accountancy_journal);
793
794 $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0, 1, 1, '', 1);
795 }
796
797 $accountstatic->ref = $objp->ref;
798 print $accountstatic->getNomUrl(1);
799 } else {
800 print '&nbsp;';
801 }
802 print '</td>';
803 }
804 print "</tr>";
805 $i++;
806 }
807
808 if (empty($num)) {
809 $colspan = 6;
810 if (isModEnabled('bank')) {
811 $colspan++;
812 }
813 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
814 }
815
816 print "</table>";
817 } else {
818 dol_print_error($db);
819 }
820}
821
822
823if (($action != 'addsubscription' && $action != 'create_thirdparty')) {
824 // Show online payment link
825 // The list can be complete by the hook 'doValidatePayment' executed inside getValidOnlinePaymentMethods()
826 include_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
827 $validpaymentmethod = getValidOnlinePaymentMethods('');
828 $useonlinepayment = count($validpaymentmethod);
829
830 if ($useonlinepayment) {
831 print '<br>';
832
833 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
834 print showOnlinePaymentUrl('membersubscription', $object->ref);
835 print '<br>';
836 }
837}
838
839/*
840 * Add new subscription form
841 */
842if (($action == 'addsubscription' || $action == 'create_thirdparty') && $user->hasRight('adherent', 'cotisation', 'creer')) {
843 print '<br>';
844
845 print load_fiche_titre($langs->trans("NewCotisation"));
846
847 // Define default choice for complementary actions
848 $bankdirect = 0; // 1 means option by default is write to bank direct with no invoice
849 $invoiceonly = 0; // 1 means option by default is invoice only
850 $bankviainvoice = 0; // 1 means option by default is write to bank via invoice
851 if (GETPOST('paymentsave')) {
852 if (GETPOST('paymentsave') == 'bankdirect') {
853 $bankdirect = 1;
854 }
855 if (GETPOST('paymentsave') == 'invoiceonly') {
856 $invoiceonly = 1;
857 }
858 if (GETPOST('paymentsave') == 'bankviainvoice') {
859 $bankviainvoice = 1;
860 }
861 } else {
862 if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
863 $bankviainvoice = 1;
864 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' && isModEnabled('bank')) {
865 $bankdirect = 1;
866 } elseif (getDolGlobalString('ADHERENT_BANK_USE') == 'invoiceonly' && isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
867 $invoiceonly = 1;
868 }
869 }
870
871 print "\n\n<!-- Form add subscription -->\n";
872
873 if ($conf->use_javascript_ajax) {
874 //var_dump($bankdirect.'-'.$bankviainvoice.'-'.$invoiceonly);
875 print "\n".'<script type="text/javascript">';
876 print '$(document).ready(function () {
877 $(".bankswitchclass, .bankswitchclass2").'.(($bankdirect || $bankviainvoice) ? 'show()' : 'hide()').';
878 $("#none, #invoiceonly").click(function() {
879 $(".bankswitchclass").hide();
880 $(".bankswitchclass2").hide();
881 });
882 $("#bankdirect, #bankviainvoice").click(function() {
883 $(".bankswitchclass").show();
884 $(".bankswitchclass2").show();
885 });
886 $("#selectoperation").change(function() {
887 var code = $(this).val();
888 if (code == "CHQ")
889 {
890 $(".fieldrequireddyn").addClass("fieldrequired");
891 if ($("#fieldchqemetteur").val() == "")
892 {
893 $("#fieldchqemetteur").val($("#memberlabel").val());
894 }
895 }
896 else
897 {
898 $(".fieldrequireddyn").removeClass("fieldrequired");
899 }
900 });
901 ';
902 if (GETPOST('paymentsave')) {
903 print '$("#'.GETPOST('paymentsave', 'aZ09').'").prop("checked", true);';
904 }
905 print '});';
906 print '</script>'."\n";
907 }
908
909
910 // Confirm create third party
911 if ($action == 'create_thirdparty') {
912 $companyalias = '';
913 $fullname = $object->getFullName($langs);
914
915 if ($object->morphy == 'mor') {
916 $companyname = $object->company;
917 if (!empty($fullname)) {
918 $companyalias = $fullname;
919 }
920 } else {
921 $companyname = $fullname;
922 if (!empty($object->company)) {
923 $companyalias = $object->company;
924 }
925 }
926
927 // Create a form array
928 $formquestion = array(
929 array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $companyname, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"'),
930 array('label' => $langs->trans("AliasNames"), 'type' => 'text', 'name' => 'companyalias', 'value' => $companyalias, 'morecss' => 'minwidth300', 'moreattr' => 'maxlength="128"')
931 );
932 // If customer code was forced to "required", we ask it at creation to avoid error later
933 if (getDolGlobalString('MAIN_COMPANY_CODE_ALWAYS_REQUIRED')) {
934 $tmpcompany = new Societe($db);
935 $tmpcompany->name = $companyname;
936 $tmpcompany->get_codeclient($tmpcompany, 0);
937 $customercode = $tmpcompany->code_client;
938 $formquestion[] = array(
939 'label' => $langs->trans("CustomerCode"),
940 'type' => 'text',
941 'name' => 'customercode',
942 'value' => $customercode,
943 'morecss' => 'minwidth300',
944 'moreattr' => 'maxlength="128"',
945 );
946 }
947 // @todo Add other extrafields mandatory for thirdparty creation
948
949 print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id, $langs->trans("CreateDolibarrThirdParty"), $langs->trans("ConfirmCreateThirdParty"), "confirm_create_thirdparty", $formquestion, 1);
950 }
951
952
953 print '<form name="subscription" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
954 print '<input type="hidden" name="token" value="'.newToken().'">';
955 print '<input type="hidden" name="action" value="subscription">';
956 print '<input type="hidden" name="rowid" value="'.$rowid.'">';
957 print '<input type="hidden" name="memberlabel" id="memberlabel" value="'.dol_escape_htmltag($object->getFullName($langs)).'">';
958 print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="'.dol_escape_htmltag($object->company).'">';
959
960 print dol_get_fiche_head('');
961
962 print '<div class="div-table-responsive">';
963 print '<table class="border centpercent">'."\n";
964 print '<tbody>';
965
966 // Date payment
967 if (GETPOST('paymentyear') && GETPOST('paymentmonth') && GETPOST('paymentday')) {
968 $paymentdate = dol_mktime(0, 0, 0, GETPOST('paymentmonth'), GETPOST('paymentday'), GETPOST('paymentyear'));
969 }
970
971 print '<tr>';
972 // Date start subscription
973 $currentyear = dol_print_date($now, "%Y");
974 $currentmonth = dol_print_date($now, "%m");
975 print '<td class="fieldrequired">'.$langs->trans("DateSubscription").'</td><td>';
976 if (GETPOST('reday')) {
977 $datefrom = dol_mktime(0, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
978 }
979 if (!$datefrom) {
980 $datefrom = $object->datevalid;
981 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER')) {
982 $datefrom = dol_time_plus_duree($now, (int) substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), 0, -1), substr(getDolGlobalString('MEMBER_SUBSCRIPTION_START_AFTER'), -1));
983 } elseif ($object->datefin > 0 && dol_time_plus_duree($object->datefin, $defaultdelay, $defaultdelayunit) > $now) {
984 $datefrom = dol_time_plus_duree($object->datefin, 1, 'd');
985 }
986
987 if (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "m") {
988 $datefrom = dol_get_first_day(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
989 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "Y") {
990 $datefrom = dol_get_first_day(dol_print_date($datefrom, "%Y"));
991 }
992 }
993 print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
994 print "</td></tr>";
995
996 // Date end subscription
997 if (GETPOST('endday')) {
998 $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
999 }
1000 if (!$dateto) {
1001 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
1002 $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
1003 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
1004 $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"));
1005 } else {
1006 $dateto = -1; // By default, no date is suggested
1007 }
1008 }
1009 print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';
1010 print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
1011 print "</td></tr>";
1012
1013 if ($adht->subscription) {
1014 // Amount
1015 print '<tr><td class="fieldrequired">'.$langs->trans("Amount").'</td><td><input type="text" name="subscription" size="6" value="'.(GETPOSTISSET('subscription') ? GETPOST('subscription') : price($adht->amount, 0, '', 0)).'"> '.$langs->trans("Currency".$conf->currency) .'</td></tr>';
1016
1017 // Label
1018 print '<tr><td>'.$langs->trans("Label").'</td>';
1019 print '<td><input name="label" type="text" size="32" value="';
1020 if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
1021 print $langs->trans("Subscription").' '.dol_print_date(($datefrom ? $datefrom : time()), "%Y");
1022 }
1023 print '"></td></tr>';
1024
1025 // Complementary action
1026 if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
1027 $company = new Societe($db);
1028 if ($object->socid) {
1029 $result = $company->fetch($object->socid);
1030 }
1031
1032 // No more action
1033 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('MoreActions');
1034 print '</td>';
1035 print '<td class="line-height-large">';
1036
1037 print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"'.(empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '').'>';
1038 print '<label for="none"> '.$langs->trans("None").'</label><br>';
1039 // Add entry into bank account
1040 if (isModEnabled('bank')) {
1041 print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"'.(!empty($bankdirect) ? ' checked' : '');
1042 print '><label for="bankdirect"> '.$langs->trans("MoreActionBankDirect").'</label><br>';
1043 }
1044 // Add invoice with no payments
1045 if (isModEnabled('societe') && isModEnabled('invoice')) {
1046 print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"'.(!empty($invoiceonly) ? ' checked' : '');
1047 //if (empty($object->fk_soc)) print ' disabled';
1048 print '><label for="invoiceonly"> '.$langs->trans("MoreActionInvoiceOnly");
1049 if ($object->fk_soc) {
1050 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1051 } else {
1052 print ' (';
1053 if (empty($object->fk_soc)) {
1054 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1055 }
1056 print $langs->trans("NoThirdPartyAssociatedToMember");
1057 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&amp;action=create_thirdparty">';
1058 print $langs->trans("CreateDolibarrThirdParty");
1059 print '</a>)';
1060 }
1061 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1062 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1063 }
1064 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1065 $prodtmp = new Product($db);
1066 $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1067 if ($result < 0) {
1068 setEventMessage($prodtmp->error, 'errors');
1069 }
1070 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1071 }
1072 print '</label><br>';
1073 }
1074 // Add invoice with payments
1075 if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
1076 print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"'.(!empty($bankviainvoice) ? ' checked' : '');
1077 //if (empty($object->fk_soc)) print ' disabled';
1078 print '><label for="bankviainvoice"> '.$langs->trans("MoreActionBankViaInvoice");
1079 if ($object->socid) {
1080 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1081 } else {
1082 print ' (';
1083 if (empty($object->socid)) {
1084 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1085 }
1086 print $langs->trans("NoThirdPartyAssociatedToMember");
1087 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&amp;action=create_thirdparty">';
1088 print $langs->trans("CreateDolibarrThirdParty");
1089 print '</a>)';
1090 }
1091 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1092 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1093 }
1094 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1095 $prodtmp = new Product($db);
1096 $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1097 if ($result < 0) {
1098 setEventMessage($prodtmp->error, 'errors');
1099 }
1100 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1101 }
1102 print '</label><br>';
1103 }
1104 print '</td></tr>';
1105
1106 // Bank account
1107 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("FinancialAccount").'</td><td>';
1108 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1109 $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
1110 print "</td></tr>\n";
1111
1112 // Payment mode
1113 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td>';
1114 print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
1115 print "</td></tr>\n";
1116
1117 // Date of payment
1118 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
1119 print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
1120 print "</td></tr>\n";
1121
1122 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Numero');
1123 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
1124 print '</td>';
1125 print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="'.(!GETPOST('num_chq') ? '' : GETPOST('num_chq')).'"></td></tr>';
1126
1127 print '<tr class="bankswitchclass2 fieldrequireddyn"><td>'.$langs->trans('CheckTransmitter');
1128 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
1129 print '</td>';
1130 print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="'.(!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')).'"></td></tr>';
1131
1132 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Bank');
1133 print ' <em>('.$langs->trans("ChequeBank").')</em>';
1134 print '</td>';
1135 print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="'.(!GETPOST('chqbank') ? '' : GETPOST('chqbank')).'"></td></tr>';
1136 }
1137 }
1138
1139 print '<tr><td></td><td></td></tr>';
1140
1141 print '<tr><td>'.$langs->trans("SendAcknowledgementByMail").'</td>';
1142 print '<td>';
1143 if (!$object->email) {
1144 print $langs->trans("NoEMail");
1145 } else {
1146 $adht = new AdherentType($db);
1147 $adht->fetch($object->typeid);
1148
1149 // Send subscription email
1150 $subject = '';
1151 $msg = '';
1152
1153 // Send subscription email
1154 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1155 $formmail = new FormMail($db);
1156 // Set output language
1157 $outputlangs = new Translate('', $conf);
1158 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1159 // Load traductions files required by page
1160 $outputlangs->loadLangs(array("main", "members"));
1161 // Get email content from template
1162 $arraydefaultmessage = null;
1163 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
1164
1165 if (!empty($labeltouse)) {
1166 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1167 }
1168
1169 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1170 $subject = $arraydefaultmessage->topic;
1171 $msg = $arraydefaultmessage->content;
1172 }
1173
1174 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1175 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1176 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1177 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
1178
1179 $tmp = '<input name="sendmail" type="checkbox"'.(GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')).'>';
1180 $helpcontent = '';
1181 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM').'<br>'."\n";
1182 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1183 $helpcontent .= '<b>'.$langs->trans("MailTopic").'</b>:<br>'."\n";
1184 if ($subjecttosend) {
1185 $helpcontent .= $subjecttosend."\n";
1186 } else {
1187 $langs->load("errors");
1188 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1189 }
1190 $helpcontent .= "<br>";
1191 $helpcontent .= '<b>'.$langs->trans("MailText").'</b>:<br>';
1192 if ($texttosend) {
1193 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1194 } else {
1195 $langs->load("errors");
1196 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1197 }
1198 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1199 print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
1200 }
1201 print '</td></tr>';
1202 print '</tbody>';
1203 print '</table>';
1204 print '</div>';
1205
1206 print dol_get_fiche_end();
1207
1208 print '<div class="center">';
1209 $parameters = array();
1210 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
1211 if (empty($reshook)) {
1212 print '<input type="submit" class="button" name="add" value="'.$langs->trans("AddSubscription").'">';
1213 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
1214 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1215 }
1216 print '</div>';
1217
1218 print '</form>';
1219
1220 print "\n<!-- End form subscription -->\n\n";
1221}
1222
1223
1224// End of page
1225llxFooter();
1226$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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:70
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:594
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:124
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:613
llxFooter()
Footer empty.
Definition document.php:107
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.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
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)
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).
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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...
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return 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.
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.