Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b32fb853f6 |
@@ -0,0 +1,180 @@
|
|||||||
|
#--------------------------------------------------------------------
|
||||||
|
# Example Environment Configuration file
|
||||||
|
#
|
||||||
|
# This file can be used as a starting point for your own
|
||||||
|
# custom .env files, and contains most of the possible settings
|
||||||
|
# available in a default install.
|
||||||
|
#
|
||||||
|
# By default, all of the settings are commented out. If you want
|
||||||
|
# to override the setting, you must un-comment it by removing the '#'
|
||||||
|
# at the beginning of the line.
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# ENVIRONMENT
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
CI_ENVIRONMENT = development
|
||||||
|
|
||||||
|
# Which profile to use if none is supplied to sendEmail()
|
||||||
|
# Options: default, communication, payment, ...
|
||||||
|
MAIL_PROFILE_DEFAULT=default
|
||||||
|
|
||||||
|
# ===== DEFAULT (system) =====
|
||||||
|
# ---- Legacy fallbacks (kept for compatibility) ----
|
||||||
|
SMTP_HOST = smtp.gmail.com
|
||||||
|
SMTP_USER = alrahma.sunday.school@gmail.com
|
||||||
|
SMTP_PASS = "psnp emdq dykw ypul"
|
||||||
|
SMTP_PORT = 587
|
||||||
|
SMTP_ENCRYPTION = tls # was SSL; set to ssl to match 587
|
||||||
|
|
||||||
|
# Reply-To for all mail profiles
|
||||||
|
MAIL_DEFAULT_REPLY_TO=alrahma.isgl@gmail.com
|
||||||
|
MAIL_DEFAULT_REPLY_TO_NAME="Al Rahma Sunday School"
|
||||||
|
MAIL_COMMUNICATION_REPLY_TO=alrahma.isgl@gmail.com
|
||||||
|
MAIL_COMMUNICATION_REPLY_TO_NAME="School Communications"
|
||||||
|
MAIL_PAYMENT_REPLY_TO=alrahma.isgl@gmail.com
|
||||||
|
MAIL_PAYMENT_REPLY_TO_NAME="School Payments"
|
||||||
|
MAIL_DEFAULT_REPLY_TO="alrahma.isgl@gmail.com"
|
||||||
|
|
||||||
|
# Optional sender directory you already use elsewhere
|
||||||
|
MAIL_SENDERS="{\"general\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma No-Reply\"},\
|
||||||
|
\"registration\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Register Office\"},\
|
||||||
|
\"notifications\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Notifications\"},\
|
||||||
|
\"finance\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Finance Office\"}}"
|
||||||
|
|
||||||
|
# Principal notification recipient for TimeOff requests (comma-separated allowed)
|
||||||
|
PRINCIPAL_EMAIL="principal@alrahmaisgl.org"
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# APP
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# If you have trouble with `.`, you could also use `_`.
|
||||||
|
app_baseURL = 'http://localhost:8080/'
|
||||||
|
# app.forceGlobalSecureRequests = true
|
||||||
|
# app.CSPEnabled = false
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# DATABASE
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
database.default.hostname = 127.0.0.1
|
||||||
|
database.default.database = school
|
||||||
|
database.default.username = root
|
||||||
|
database.default.password = root
|
||||||
|
database.default.DBDriver = MySQLi
|
||||||
|
database.default.DBPrefix =
|
||||||
|
database.default.port = 3306
|
||||||
|
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# CONTENT SECURITY POLICY
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# contentsecuritypolicy.reportOnly = false
|
||||||
|
# contentsecuritypolicy.defaultSrc = 'none'
|
||||||
|
# contentsecuritypolicy.scriptSrc = 'self'
|
||||||
|
# contentsecuritypolicy.styleSrc = 'self'
|
||||||
|
# contentsecuritypolicy.imageSrc = 'self'
|
||||||
|
# contentsecuritypolicy.baseURI = null
|
||||||
|
# contentsecuritypolicy.childSrc = null
|
||||||
|
# contentsecuritypolicy.connectSrc = 'self'
|
||||||
|
# contentsecuritypolicy.fontSrc = null
|
||||||
|
# contentsecuritypolicy.formAction = null
|
||||||
|
# contentsecuritypolicy.frameAncestors = null
|
||||||
|
# contentsecuritypolicy.frameSrc = null
|
||||||
|
# contentsecuritypolicy.mediaSrc = null
|
||||||
|
# contentsecuritypolicy.objectSrc = null
|
||||||
|
# contentsecuritypolicy.pluginTypes = null
|
||||||
|
# contentsecuritypolicy.reportURI = null
|
||||||
|
# contentsecuritypolicy.sandbox = false
|
||||||
|
# contentsecuritypolicy.upgradeInsecureRequests = false
|
||||||
|
# contentsecuritypolicy.styleNonceTag = '{csp-style-nonce}'
|
||||||
|
# contentsecuritypolicy.scriptNonceTag = '{csp-script-nonce}'
|
||||||
|
# contentsecuritypolicy.autoNonce = true
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# COOKIE
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# cookie.prefix = ''
|
||||||
|
# cookie.expires = 0
|
||||||
|
# cookie.path = '/'
|
||||||
|
# cookie.domain = ''
|
||||||
|
# cookie.secure = false
|
||||||
|
# cookie.httponly = false
|
||||||
|
# cookie.samesite = 'Lax'
|
||||||
|
# cookie.raw = false
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# ENCRYPTION
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# encryption.key =
|
||||||
|
# encryption.driver = OpenSSL
|
||||||
|
# encryption.blockSize = 16
|
||||||
|
# encryption.digest = SHA512
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# HONEYPOT
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# honeypot.hidden = 'true'
|
||||||
|
# honeypot.label = 'Fill This Field'
|
||||||
|
# honeypot.name = 'honeypot'
|
||||||
|
# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
|
||||||
|
# honeypot.container = '<div style="display:none">{template}</div>'
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# SECURITY
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# security.csrfProtection = 'cookie'
|
||||||
|
# security.tokenRandomize = false
|
||||||
|
# security.tokenName = 'csrf_token_name'
|
||||||
|
# security.headerName = 'X-CSRF-TOKEN'
|
||||||
|
# security.cookieName = 'csrf_cookie_name'
|
||||||
|
# security.expires = 7200
|
||||||
|
# security.regenerate = true
|
||||||
|
# security.redirect = false
|
||||||
|
# security.samesite = 'Lax'
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# SESSION
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# session.driver = 'CodeIgniter\Session\Handlers\FileHandler'
|
||||||
|
# session.cookieName = 'ci_session'
|
||||||
|
# session.expiration = 7200
|
||||||
|
# session.savePath = null
|
||||||
|
# session.matchIP = false
|
||||||
|
# session.timeToUpdate = 300
|
||||||
|
# session.regenerateDestroy = false
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# LOGGER
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# logger.threshold = 4
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
# CURLRequest
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
# curlrequest.shareOptions = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mail.protocol = smtp
|
||||||
|
mail.SMTPHost = ${SMTP_HOST}
|
||||||
|
mail.SMTPUser = ${SMTP_USER}
|
||||||
|
mail.SMTPPass = ${SMTP_PASS}
|
||||||
|
mail.SMTPPort = ${SMTP_PORT}
|
||||||
|
mail.SMTPCrypto = tls
|
||||||
|
|
||||||
|
mail.fromEmail = ${SMTP_USER}
|
||||||
|
mail.fromName = "Al Rahma Sunday School"
|
||||||
|
mail.mailType = text
|
||||||
|
mail.charset = UTF-8
|
||||||
-54
@@ -1,54 +0,0 @@
|
|||||||
.env
|
|
||||||
.env.*
|
|
||||||
!.env.example
|
|
||||||
|
|
||||||
/vendor/
|
|
||||||
/node_modules/
|
|
||||||
|
|
||||||
/writable/cache/*
|
|
||||||
/writable/debugbar/*
|
|
||||||
/writable/logs/*
|
|
||||||
/writable/session/*
|
|
||||||
/writable/uploads/*
|
|
||||||
/writable/tmp/*
|
|
||||||
/writable/*.log
|
|
||||||
|
|
||||||
!/writable/.gitkeep
|
|
||||||
!/writable/cache/.gitkeep
|
|
||||||
!/writable/debugbar/.gitkeep
|
|
||||||
!/writable/logs/.gitkeep
|
|
||||||
!/writable/session/.gitkeep
|
|
||||||
!/writable/uploads/.gitkeep
|
|
||||||
!/writable/tmp/.gitkeep
|
|
||||||
|
|
||||||
/public/build/
|
|
||||||
/public/hot/
|
|
||||||
/public/uploads/**
|
|
||||||
!/public/uploads/**/index.html
|
|
||||||
!/public/uploads/.gitkeep
|
|
||||||
|
|
||||||
/uploads/**
|
|
||||||
!/uploads/**/index.html
|
|
||||||
!/uploads/.gitkeep
|
|
||||||
|
|
||||||
docker-compose.override.yml
|
|
||||||
docker-compose.local.yml
|
|
||||||
|
|
||||||
*.log
|
|
||||||
.swp
|
|
||||||
.swo
|
|
||||||
*~
|
|
||||||
.tmp
|
|
||||||
.DS_Store
|
|
||||||
Thumbs.db
|
|
||||||
.idea/
|
|
||||||
.vscode/
|
|
||||||
.codex/
|
|
||||||
|
|
||||||
/coverage/
|
|
||||||
/build/
|
|
||||||
/builds
|
|
||||||
/phpunit.xml.cache
|
|
||||||
/.phpunit.result.cache
|
|
||||||
/writable/reports/*
|
|
||||||
/writable/test.txt
|
|
||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+5
-2
@@ -393,8 +393,8 @@ $routes->get('print-requests/file/(:segment)', 'PrintRequests::serveFile/$1', ['
|
|||||||
$routes->get('print-requests/file/(:segment)/(:alpha)', 'PrintRequests::serveFile/$1/$2', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('print-requests/file/(:segment)/(:alpha)', 'PrintRequests::serveFile/$1/$2', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
$routes->get('uploads/print_requests/(:segment)', 'PrintRequests::serveFile/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('uploads/print_requests/(:segment)', 'PrintRequests::serveFile/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
|
|
||||||
$routes->get('exam-drafts/files/teacher/(:segment)', 'View\FilesController::examDraftTeacher/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('exam-drafts/files/teacher/(:segment)', 'View\FilesController::examDraftTeacher/$1', ['filter' => 'auth:teacher,teacher_assistant,admin,administrator,principal']);
|
||||||
$routes->get('exam-drafts/files/final/(:segment)', 'View\FilesController::examDraftFinal/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('exam-drafts/files/final/(:segment)', 'View\FilesController::examDraftFinal/$1', ['filter' => 'auth:teacher,teacher_assistant,admin,administrator,principal']);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -745,6 +745,9 @@ $routes->post('/administrator/teacher-submissions/notify', 'View\AdministratorCo
|
|||||||
$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin']);
|
$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin']);
|
||||||
$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin']);
|
$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin']);
|
||||||
$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin']);
|
$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin']);
|
||||||
|
$routes->get('/principal/exam-drafts', 'View\ExamDraftController::principalIndex', ['filter' => 'auth:admin']);
|
||||||
|
$routes->post('/principal/exam-drafts/review', 'View\ExamDraftController::principalReview', ['filter' => 'auth:admin']);
|
||||||
|
$routes->post('/principal/exam-drafts/upload-legacy', 'View\ExamDraftController::principalUploadLegacy', ['filter' => 'auth:admin']);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* --------------------------------------------------------------------
|
* --------------------------------------------------------------------
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+54
-2
@@ -2003,6 +2003,58 @@ class AttendanceTrackingController extends BaseController
|
|||||||
return [$subject, $body];
|
return [$subject, $body];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildFallbackTemplate(string $code, string $variant, array $context): array
|
||||||
|
{
|
||||||
|
$studentName = (string) ($context['{{student_name}}'] ?? 'the student');
|
||||||
|
$incident = (string) ($context['{{incident_date}}'] ?? date('Y-m-d'));
|
||||||
|
$parentName = (string) ($context['{{parent_name}}'] ?? 'Parent/Guardian');
|
||||||
|
$phone = (string) ($context['{{school_phone}}'] ?? 'the school office');
|
||||||
|
$voicemail = (string) ($context['{{voicemail_phone}}'] ?? 'your voicemail');
|
||||||
|
|
||||||
|
$subject = match (true) {
|
||||||
|
str_starts_with($code, 'ABS_1') => 'Attendance Notice: Unreported Absence',
|
||||||
|
str_starts_with($code, 'ABS_2') => 'Attendance Follow-Up: Two Consecutive Absences',
|
||||||
|
str_starts_with($code, 'ABS_3') => 'Attendance Follow-Up: Three Absences',
|
||||||
|
str_starts_with($code, 'LATE_2') => 'Attendance Notice: Repeated Lateness',
|
||||||
|
str_starts_with($code, 'LATE_3'),
|
||||||
|
str_starts_with($code, 'LATE_4'),
|
||||||
|
str_starts_with($code, 'MIX') => 'Attendance Follow-Up: Repeated Lateness and Absence',
|
||||||
|
default => 'Attendance Notice',
|
||||||
|
};
|
||||||
|
|
||||||
|
$intro = "<p>Insha Allah this email finds you well";
|
||||||
|
if ($variant === 'answered') {
|
||||||
|
$intro .= ", <strong>{$parentName}</strong>. Jazakum Allahu khayran for taking the time to speak with us today.</p>";
|
||||||
|
} elseif ($variant === 'no_answer') {
|
||||||
|
$intro .= ".</p><p>We tried to reach you but could not connect and left a voice message at <strong>{$voicemail}</strong>.</p>";
|
||||||
|
} else {
|
||||||
|
$intro .= ".</p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = match (true) {
|
||||||
|
str_starts_with($code, 'ABS_1')
|
||||||
|
=> "<p>This is to let you know that <strong>{$studentName}</strong> was absent on <strong>{$incident}</strong> without prior notice.</p>",
|
||||||
|
str_starts_with($code, 'ABS_2')
|
||||||
|
=> "<p>This is a reminder that <strong>{$studentName}</strong> has had repeated absences, most recently on <strong>{$incident}</strong>, without prior notice.</p>",
|
||||||
|
str_starts_with($code, 'ABS_3')
|
||||||
|
=> "<p>This is a reminder that <strong>{$studentName}</strong> has been absent three times, most recently on <strong>{$incident}</strong>, without prior notice.</p>",
|
||||||
|
str_starts_with($code, 'LATE_2')
|
||||||
|
=> "<p>This is a reminder that <strong>{$studentName}</strong> has been late multiple times, most recently on <strong>{$incident}</strong>.</p>",
|
||||||
|
str_starts_with($code, 'LATE_3'),
|
||||||
|
str_starts_with($code, 'LATE_4')
|
||||||
|
=> "<p>This is a follow-up that <strong>{$studentName}</strong> has had repeated lateness concerns, most recently on <strong>{$incident}</strong>.</p>",
|
||||||
|
str_starts_with($code, 'MIX')
|
||||||
|
=> "<p>This is a follow-up that <strong>{$studentName}</strong> has had a mix of repeated lateness and absence concerns, most recently on <strong>{$incident}</strong>.</p>",
|
||||||
|
default
|
||||||
|
=> "<p>We'd like to inform you about <strong>{$studentName}</strong>'s recent attendance concern dated <strong>{$incident}</strong>.</p>",
|
||||||
|
};
|
||||||
|
|
||||||
|
$closing = "<p>If your child will be absent or late due to illness or family commitments, please let us know ahead of time.</p>"
|
||||||
|
. "<p>You can email/call/text us at <strong>{$phone}</strong>.</p>";
|
||||||
|
|
||||||
|
return [$subject, $intro . $details . $closing];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public function compose()
|
public function compose()
|
||||||
{
|
{
|
||||||
@@ -2033,8 +2085,8 @@ class AttendanceTrackingController extends BaseController
|
|||||||
$rendered = $this->renderTemplate($code, $variant, $ctx);
|
$rendered = $this->renderTemplate($code, $variant, $ctx);
|
||||||
|
|
||||||
if (!$rendered) {
|
if (!$rendered) {
|
||||||
return redirect()->to(site_url('attendance/violations'))
|
log_message('warning', 'Attendance email template missing; using fallback compose body. code=' . $code . ' variant=' . $variant);
|
||||||
->with('error', 'Template not found for ' . $code . ' (' . $variant . ').');
|
$rendered = $this->buildFallbackTemplate($code, $variant, $ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
[$subject, $body] = $rendered;
|
[$subject, $body] = $rendered;
|
||||||
|
|||||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user