di['mod_service']('email'); foreach (self::CODES as $code) { $template = $email->getTemplateRepository()->findOneByActionCode($code); if ($template === null) { $source = file_get_contents(dirname(__DIR__) . '/Support/templates/email/' . $code . '.html.twig'); if (!is_string($source) || !preg_match('/{%\s*block subject\s*%}(.*?){%\s*endblock\s*%}/s', $source, $subject) || !preg_match('/{%\s*block content\s*%}(.*?){%\s*endblock\s*%}/s', $source, $content)) { throw new \FOSSBilling\InformationException("Cannot configure $code: its default template is missing or invalid."); } $template = $email->templateCreate($code, trim($subject[1]), trim($content[1]), $code === 'mod_support_ticket_open' ? 1 : 0, 'support'); } $data = $email->templateToApiArray($template); if ($code !== 'mod_support_ticket_open' && !$data['enabled']) { continue; } $subject = $data['subject'] ?? ''; $enabled = $code === 'mod_support_ticket_open' ? true : null; if (!$this->hasMarker($subject)) { // Keep the existing subject and body, adding only the routing marker. $email->updateTemplate($template, $enabled, null, '[Ticket #{{ ticket.id }}] ' . $subject); } elseif ($code === 'mod_support_ticket_open' && !$data['enabled']) { $email->updateTemplate($template, true); } } return $this->status(); } public function status(): array { $email = $this->di['mod_service']('email'); $errors = []; foreach (self::CODES as $code) { $template = $email->getTemplateRepository()->findOneByActionCode($code); if ($template === null) { $errors[] = "Open FOSSBilling Email settings and configure $code before enabling importing."; continue; } $data = $email->templateToApiArray($template); if (!$data['enabled']) { if ($code === 'mod_support_ticket_open') { $errors[] = 'Enable mod_support_ticket_open in FOSSBilling Email settings to send ticket acknowledgements.'; } continue; } // Check the documented dynamic marker without executing custom template code. if (!$this->hasMarker($data['subject'] ?? '')) { $errors[] = "Include [Ticket #{{ ticket.id }}] in the subject of $code in FOSSBilling Email settings."; } } return ['ready' => $errors === [], 'errors' => $errors]; } }