dolibarr 20.0.0
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-2016 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 technical object to manage hooks of page. Note that conf->hooks_modules contains 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
445$help_url = "EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder";
446
447llxHeader("", $title, $help_url);
448
449
450$param = '';
451if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
452 $param .= '&contextpage='.urlencode($contextpage);
453}
454if ($limit > 0 && $limit != $conf->liste_limit) {
455 $param .= '&limit='.((int) $limit);
456}
457$param .= '&id='.$rowid;
458if ($optioncss != '') {
459 $param .= '&optioncss='.urlencode($optioncss);
460}
461// Add $param from extra fields
462//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
463
464
465if (! ($object->id > 0)) {
466 $langs->load("errors");
467 print $langs->trans("ErrorRecordNotFound");
468}
469
470/*$res = $object->fetch($rowid);
471 if ($res < 0) {
472 dol_print_error($db, $object->error);
473 exit;
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("PublicFile"), $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" width="100%"><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->fk_soc) {
642 $company = new Societe($db);
643 $result = $company->fetch($object->fk_soc);
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" width="100%"><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', '');
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('');
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, GETPOST('paymentmonth'), GETPOST('paymentday'), GETPOST('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(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
991 } elseif (getDolGlobalString('MEMBER_SUBSCRIPTION_START_FIRST_DAY_OF') === "Y") {
992 $datefrom = dol_get_first_day(dol_print_date($datefrom, "%Y"));
993 }
994 }
995 print $form->selectDate($datefrom, '', 0, 0, 0, "subscription", 1, 1);
996 print "</td></tr>";
997
998 // Date end subscription
999 if (GETPOST('endday')) {
1000 $dateto = dol_mktime(0, 0, 0, GETPOSTINT('endmonth'), GETPOSTINT('endday'), GETPOSTINT('endyear'));
1001 }
1002 if (!$dateto) {
1003 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
1004 $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"), dol_print_date($datefrom, "%m"));
1005 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
1006 $dateto = dol_get_last_day(dol_print_date($datefrom, "%Y"));
1007 } else {
1008 $dateto = -1; // By default, no date is suggested
1009 }
1010 }
1011 print '<tr><td>'.$langs->trans("DateEndSubscription").'</td><td>';
1012 print $form->selectDate($dateto, 'end', 0, 0, 0, "subscription", 1, 0);
1013 print "</td></tr>";
1014
1015 if ($adht->subscription) {
1016 // Amount
1017 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>';
1018
1019 // Label
1020 print '<tr><td>'.$langs->trans("Label").'</td>';
1021 print '<td><input name="label" type="text" size="32" value="';
1022 if (!getDolGlobalString('MEMBER_NO_DEFAULT_LABEL')) {
1023 print $langs->trans("Subscription").' '.dol_print_date(($datefrom ? $datefrom : time()), "%Y");
1024 }
1025 print '"></td></tr>';
1026
1027 // Complementary action
1028 if ((isModEnabled('bank') || isModEnabled('invoice')) && !getDolGlobalString('ADHERENT_SUBSCRIPTION_HIDECOMPLEMENTARYACTIONS')) {
1029 $company = new Societe($db);
1030 if ($object->socid) {
1031 $result = $company->fetch($object->socid);
1032 }
1033
1034 // No more action
1035 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('MoreActions');
1036 print '</td>';
1037 print '<td class="line-height-large">';
1038
1039 print '<input type="radio" class="moreaction" id="none" name="paymentsave" value="none"'.(empty($bankdirect) && empty($invoiceonly) && empty($bankviainvoice) ? ' checked' : '').'>';
1040 print '<label for="none"> '.$langs->trans("None").'</label><br>';
1041 // Add entry into bank account
1042 if (isModEnabled('bank')) {
1043 print '<input type="radio" class="moreaction" id="bankdirect" name="paymentsave" value="bankdirect"'.(!empty($bankdirect) ? ' checked' : '');
1044 print '><label for="bankdirect"> '.$langs->trans("MoreActionBankDirect").'</label><br>';
1045 }
1046 // Add invoice with no payments
1047 if (isModEnabled('societe') && isModEnabled('invoice')) {
1048 print '<input type="radio" class="moreaction" id="invoiceonly" name="paymentsave" value="invoiceonly"'.(!empty($invoiceonly) ? ' checked' : '');
1049 //if (empty($object->fk_soc)) print ' disabled';
1050 print '><label for="invoiceonly"> '.$langs->trans("MoreActionInvoiceOnly");
1051 if ($object->fk_soc) {
1052 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1053 } else {
1054 print ' (';
1055 if (empty($object->fk_soc)) {
1056 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1057 }
1058 print $langs->trans("NoThirdPartyAssociatedToMember");
1059 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&amp;action=create_thirdparty">';
1060 print $langs->trans("CreateDolibarrThirdParty");
1061 print '</a>)';
1062 }
1063 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1064 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1065 }
1066 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1067 $prodtmp = new Product($db);
1068 $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1069 if ($result < 0) {
1070 setEventMessage($prodtmp->error, 'errors');
1071 }
1072 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1073 }
1074 print '</label><br>';
1075 }
1076 // Add invoice with payments
1077 if (isModEnabled('bank') && isModEnabled('societe') && isModEnabled('invoice')) {
1078 print '<input type="radio" class="moreaction" id="bankviainvoice" name="paymentsave" value="bankviainvoice"'.(!empty($bankviainvoice) ? ' checked' : '');
1079 //if (empty($object->fk_soc)) print ' disabled';
1080 print '><label for="bankviainvoice"> '.$langs->trans("MoreActionBankViaInvoice");
1081 if ($object->socid) {
1082 print ' ('.$langs->trans("ThirdParty").': '.$company->getNomUrl(1).')';
1083 } else {
1084 print ' (';
1085 if (empty($object->socid)) {
1086 print img_warning($langs->trans("NoThirdPartyAssociatedToMember"));
1087 }
1088 print $langs->trans("NoThirdPartyAssociatedToMember");
1089 print ' - <a href="'.$_SERVER["PHP_SELF"].'?rowid='.$object->id.'&amp;action=create_thirdparty">';
1090 print $langs->trans("CreateDolibarrThirdParty");
1091 print '</a>)';
1092 }
1093 if (!getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') || getDolGlobalString('ADHERENT_VAT_FOR_SUBSCRIPTIONS') != 'defaultforfoundationcountry') {
1094 print '. <span class="opacitymedium">'.$langs->trans("NoVatOnSubscription", 0).'</span>';
1095 }
1096 if (getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS') && (isModEnabled('product') || isModEnabled('service'))) {
1097 $prodtmp = new Product($db);
1098 $result = $prodtmp->fetch(getDolGlobalString('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'));
1099 if ($result < 0) {
1100 setEventMessage($prodtmp->error, 'errors');
1101 }
1102 print '. '.$langs->transnoentitiesnoconv("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS", $prodtmp->getNomUrl(1)); // must use noentitiesnoconv to avoid to encode html into getNomUrl of product
1103 }
1104 print '</label><br>';
1105 }
1106 print '</td></tr>';
1107
1108 // Bank account
1109 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("FinancialAccount").'</td><td>';
1110 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
1111 $form->select_comptes(GETPOST('accountid'), 'accountid', 0, '', 2, '', 0, 'minwidth200');
1112 print "</td></tr>\n";
1113
1114 // Payment mode
1115 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("PaymentMode").'</td><td>';
1116 print $form->select_types_paiements(GETPOST('operation'), 'operation', '', 2, 1, 0, 0, 1, 'minwidth200', 1);
1117 print "</td></tr>\n";
1118
1119 // Date of payment
1120 print '<tr class="bankswitchclass"><td class="fieldrequired">'.$langs->trans("DatePayment").'</td><td>';
1121 print $form->selectDate(isset($paymentdate) ? $paymentdate : -1, 'payment', 0, 0, 1, 'subscription', 1, 1);
1122 print "</td></tr>\n";
1123
1124 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Numero');
1125 print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
1126 print '</td>';
1127 print '<td><input id="fieldnum_chq" name="num_chq" type="text" size="8" value="'.(!GETPOST('num_chq') ? '' : GETPOST('num_chq')).'"></td></tr>';
1128
1129 print '<tr class="bankswitchclass2 fieldrequireddyn"><td>'.$langs->trans('CheckTransmitter');
1130 print ' <em>('.$langs->trans("ChequeMaker").')</em>';
1131 print '</td>';
1132 print '<td><input id="fieldchqemetteur" name="chqemetteur" size="32" type="text" value="'.(!GETPOST('chqemetteur') ? '' : GETPOST('chqemetteur')).'"></td></tr>';
1133
1134 print '<tr class="bankswitchclass2"><td>'.$langs->trans('Bank');
1135 print ' <em>('.$langs->trans("ChequeBank").')</em>';
1136 print '</td>';
1137 print '<td><input id="chqbank" name="chqbank" size="32" type="text" value="'.(!GETPOST('chqbank') ? '' : GETPOST('chqbank')).'"></td></tr>';
1138 }
1139 }
1140
1141 print '<tr><td></td><td></td></tr>';
1142
1143 print '<tr><td>'.$langs->trans("SendAcknowledgementByMail").'</td>';
1144 print '<td>';
1145 if (!$object->email) {
1146 print $langs->trans("NoEMail");
1147 } else {
1148 $adht = new AdherentType($db);
1149 $adht->fetch($object->typeid);
1150
1151 // Send subscription email
1152 $subject = '';
1153 $msg = '';
1154
1155 // Send subscription email
1156 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
1157 $formmail = new FormMail($db);
1158 // Set output language
1159 $outputlangs = new Translate('', $conf);
1160 $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
1161 // Load traductions files required by page
1162 $outputlangs->loadLangs(array("main", "members"));
1163 // Get email content from template
1164 $arraydefaultmessage = null;
1165 $labeltouse = getDolGlobalString('ADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION');
1166
1167 if (!empty($labeltouse)) {
1168 $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
1169 }
1170
1171 if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
1172 $subject = $arraydefaultmessage->topic;
1173 $msg = $arraydefaultmessage->content;
1174 }
1175
1176 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1177 complete_substitutions_array($substitutionarray, $outputlangs, $object);
1178 $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
1179 $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnSubscription()), $substitutionarray, $outputlangs);
1180
1181 $tmp = '<input name="sendmail" type="checkbox"'.(GETPOST('sendmail', 'alpha') ? ' checked' : (getDolGlobalString('ADHERENT_DEFAULT_SENDINFOBYMAIL') ? ' checked' : '')).'>';
1182 $helpcontent = '';
1183 $helpcontent .= '<b>'.$langs->trans("MailFrom").'</b>: '.getDolGlobalString('ADHERENT_MAIL_FROM').'<br>'."\n";
1184 $helpcontent .= '<b>'.$langs->trans("MailRecipient").'</b>: '.$object->email.'<br>'."\n";
1185 $helpcontent .= '<b>'.$langs->trans("MailTopic").'</b>:<br>'."\n";
1186 if ($subjecttosend) {
1187 $helpcontent .= $subjecttosend."\n";
1188 } else {
1189 $langs->load("errors");
1190 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1191 }
1192 $helpcontent .= "<br>";
1193 $helpcontent .= '<b>'.$langs->trans("MailText").'</b>:<br>';
1194 if ($texttosend) {
1195 $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
1196 } else {
1197 $langs->load("errors");
1198 $helpcontent .= '<span class="error">'.$langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Module310Name")).'</span>'."\n";
1199 }
1200 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1201 print $form->textwithpicto($tmp, $helpcontent, 1, 'help', '', 0, 2, 'helpemailtosend');
1202 }
1203 print '</td></tr>';
1204 print '</tbody>';
1205 print '</table>';
1206 print '</div>';
1207
1208 print dol_get_fiche_end();
1209
1210 print '<div class="center">';
1211 $parameters = array();
1212 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
1213 if (empty($reshook)) {
1214 print '<input type="submit" class="button" name="add" value="'.$langs->trans("AddSubscription").'">';
1215 print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
1216 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1217 }
1218 print '</div>';
1219
1220 print '</form>';
1221
1222 print "\n<!-- End form subscription -->\n\n";
1223}
1224
1225
1226// End of page
1227llxFooter();
1228$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()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
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
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).
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...
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.