*
* PHP version 5
*
- * Copyright © 2020-2021 The Galette Team
+ * Copyright © 2020-2023 The Galette Team
*
* This file is part of Galette (http://galette.tuxfamily.org).
*
* You should have received a copy of the GNU General Public License
* along with Galette. If not, see <http://www.gnu.org/licenses/>.
*
- * @category Entity
+ * @category Features
* @package Galette
*
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020-2021 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
* @link http://galette.eu
* @since 2020-12-20
use Galette\Entity\Adherent;
use Galette\Entity\Contribution;
use Galette\Entity\PdfModel;
+use Galette\Entity\Reminder;
use Galette\Entity\Texts;
use Galette\Repository\DynamicFieldsSet;
use Galette\DynamicFields\DynamicField;
use Analog\Analog;
use NumberFormatter;
-use Slim\Router;
+use PHPMailer\PHPMailer\PHPMailer;
+use Slim\Routing\RouteParser;
+use DI\Attribute\Inject;
/**
* Replacements feature
* @name Replacements
* @package Galette
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020-2021 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
* @link http://galette.eu
* @since 2020-12-20
private $patterns = [];
private $replaces = [];
private $dynamic_patterns = [];
+ private ?PHPMailer $mail = null;
/**
- * @Inject("db")
* @var Db
*/
+ #[Inject("zdb")]
protected $zdb;
/**
- * @Inject("login")
* @var Login
*/
+ #[Inject("login")]
protected $login;
/**
- * @Inject("preferences")
* @var Preferences
*/
+ #[Inject("preferences")]
protected $preferences;
/**
- * @Inject
- * @var Router
+ * @var RouteParser
*/
- protected $router;
+ protected $routeparser;
/**
* Get dynamic patterns
break;
case '':
case 'VALUE':
+ default:
$skey = $key;
$title = _T('Value for dynamic field "%s"');
break;
'pattern' => '/{ASSO_LOGO}/',
],
'date_now' => [
+ //TRANS: see https://www.php.net/manual/datetime.format.php
'title' => _T('Current date (Y-m-d)'),
'pattern' => '/{DATE_NOW}/'
],
'login_uri' => [
'title' => _T("Galette's login URI"),
'pattern' => '/{LOGIN_URI}/'
+ ],
+ 'asso_footer' => [
+ 'title' => trim(trim(_T("Footer text:"), ':')),
+ 'pattern' => '/{ASSO_FOOTER}/'
]
];
}
'title' => _T("Member's ID"),
'pattern' => '/{ID_ADH}/',
],
+ 'adh_num' => [
+ 'title' => _T("Member number"),
+ 'pattern' => '/{NUM_ADH}/',
+ ],
'adh_name' => [
'title' => _T("Name"),
'pattern' => '/{NAME_ADH}/',
'title' => _T("Address"),
'pattern' => '/{ADDRESS_ADH}/',
],
+ 'adh_address_multi' => [
+ 'title' => sprintf('%s (%s)', _T('Address'), _T('with break lines')),
+ 'pattern' => '/{ADDRESS_ADH_MULTI}/',
+ ],
'adh_zip' => [
'title' => _T("Zipcode"),
'pattern' => '/{ZIP_ADH}/',
}
$c_patterns['__contrib_label'] = [
- 'title' => $c_patterns['contrib_label'],
+ 'title' => $c_patterns['contrib_label']['title'],
'pattern' => '/{CONTRIB_TYPE}/'
];
}
//handle DEADLINE alias
$c_patterns['deadline'] = [
- 'title' => $c_patterns['contrib_edate'],
+ 'title' => $c_patterns['contrib_edate']['title'],
'pattern' => '/{DEADLINE}/'
];
return $c_patterns + $dynamic_patterns;
}
+ /**
+ * Set mail instance
+ *
+ * @param PHPMailer $mail PHPMailer instance
+ *
+ * @return self
+ */
+ public function setMail(PHPMailer $mail): self
+ {
+ $this->mail = $mail;
+ return $this;
+ }
+
/**
* Set main replacements
*
}
$logo = new Logo();
- $logo_elt = '<img' .
- ' src="' . $this->preferences->getURL() . $this->router->pathFor('logo') . '"' .
- ' width="' . $logo->getOptimalWidth() . '"' .
- ' height="' . $logo->getOptimalHeight() . '"' .
- '/>';
+ if ($this->mail !== null) {
+ $logo_content = $this->preferences->getURL() . $this->routeparser->urlFor('logo');
+ } else {
+ $logo_content = '@' . base64_encode(file_get_contents($logo->getPath()));
+ }
+ $logo_elt = sprintf(
+ '<img src="%1$s" width="%2$s" height="%3$s" alt="" />',
+ $logo_content,
+ $logo->getOptimalWidth(),
+ $logo->getOptimalHeight()
+ );
$this->setReplacements(
array(
'asso_address_multi' => $address_multi,
'asso_website' => $website,
'asso_logo' => $logo_elt,
+ //TRANS: see https://www.php.net/manual/datetime.format.php
'date_now' => date(_T('Y-m-d')),
- 'login_uri' => $this->preferences->getURL() . $this->router->pathFor('login'),
+ 'login_uri' => $this->preferences->getURL() . $this->routeparser->urlFor('login'),
+ 'asso_footer' => $this->preferences->pref_footer
)
);
$c_replacements['__contrib_label'] = $c_replacements['contrib_label'];
//handle DEADLINE alias
+ $c_replacements['deadline'] = null;
$this->setReplacements($c_replacements);
*
* @param Contribution $contrib Contribution
*
- * @return PdfModel
+ * @return self
*/
public function setContribution(Contribution $contrib): self
{
*
* @param Adherent $member Member
*
- * @return PdfModel
+ * @return self
*/
public function setMember(Adherent $member): self
{
global $login;
- $address = $member->address;
- if ($member->address_continuation !== '') {
- $address .= '<br/>' . $member->address_continuation;
- }
+ $address = $member->getAddress();
+ $address_multi = preg_replace("/\n/", "<br>", $address);
if ($member->isMan()) {
$gender = _T("Man");
array(
'adh_title' => $member->stitle,
'adh_id' => $member->id,
+ 'adh_num' => $member->number,
'adh_name' => $member->sfullname,
'adh_last_name' => $member->name,
'adh_first_name' => $member->surname,
'adh_profession' => $member->job,
'adh_company' => $member->company_name,
'adh_address' => $address,
- 'adh_zip' => $member->zipcode,
- 'adh_town' => $member->town,
- 'adh_country' => $member->country,
+ 'adh_address_multi' => $address_multi,
+ 'adh_zip' => $member->getZipcode(),
+ 'adh_town' => $member->getTown(),
+ 'adh_country' => $member->getCountry(),
'adh_phone' => $member->phone,
'adh_mobile' => $member->gsm,
+ //always take current member email, to be sure.
'adh_email' => $member->email,
'adh_login' => $member->login,
'adh_main_group' => $main_group,
'adh_groups' => $group_list,
'adh_dues' => $member->getDues(),
'days_remaining' => $member->days_remaining,
- 'days_expired' => ($member->days_remaining * -1),
+ 'days_expired' => (int)$member->days_remaining + 1,
//Handle COMPANY_NAME_ADH... https://bugs.galette.eu/issues/1530
'_adh_company' => $member->company_name,
//Handle old names for variables ... https://bugs.galette.eu/issues/1393
* @param array $dynamic_fields Dynamic fields
* @param mixed $object Related object (Adherent, Contribution, ...)
*
- * @return PdfModel
+ * @return self
*/
public function setDynamicFields(string $form_name, array $dynamic_fields, $object): self
{
$value .= sprintf(
$spattern,
$this->preferences->getURL(),
- $this->router->pathFor(
+ $this->routeparser->urlFor(
'getDynamicFile',
[
+ 'form_name' => $form_name,
'id' => $object->id,
'fid' => $field_id,
'pos' => ++$pos,
}
/**
- * Set Router dependency
+ * Set RouteParser dependency
*
- * @param Router $router Router instance
+ * @param RouteParser $routeparser RouteParser instance
*
* @return $this
*/
- public function setRouter(Router $router): self
+ public function setRouteparser(RouteParser $routeparser): self
{
- $this->router = $router;
+ $this->routeparser = $routeparser;
return $this;
}
*/
protected function proceedReplacements(string $source): string
{
- $replaced = $source;
-
//handle translations
$callback = static function ($matches) {
return _T($matches[1]);
$replaced
);
- return $replaced;
+ return trim($replaced);
}
/**