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