Initial commit

This commit is contained in:
2025-11-20 23:21:05 +08:00
commit 13bc6db529
378 changed files with 54527 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class FinanceDocumentApprovedByAccountant extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public \App\Models\FinanceDocument $document
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Finance Document Awaiting Chair Final Approval - ' . $this->document->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.finance.approved-by-accountant',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use App\Models\FinanceDocument;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class FinanceDocumentApprovedByCashier extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public FinanceDocument $document
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Finance Document Awaiting Accountant Review - ' . $this->document->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.finance.approved-by-cashier',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class FinanceDocumentFullyApproved extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public \App\Models\FinanceDocument $document
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Finance Document Fully Approved - ' . $this->document->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.finance.fully-approved',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class FinanceDocumentRejected extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public \App\Models\FinanceDocument $document
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Finance Document Rejected - ' . $this->document->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.finance.rejected',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use App\Models\FinanceDocument;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class FinanceDocumentSubmitted extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public FinanceDocument $document
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'New Finance Document Awaiting Cashier Review - ' . $this->document->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.finance.submitted',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueAssignedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Issue Assigned to You - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.assigned',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueClosedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Issue Closed - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.closed',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use App\Models\IssueComment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueCommentedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue,
public IssueComment $comment
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'New Comment on Issue - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.commented',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueDueSoonMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue,
public int $daysRemaining
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Issue Due Soon - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.due-soon',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueOverdueMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue,
public int $daysOverdue
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Issue Overdue - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.overdue',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Mail;
use App\Models\Issue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class IssueStatusChangedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(
public Issue $issue,
public string $oldStatus,
public string $newStatus
) {
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Issue Status Changed - ' . $this->issue->issue_number . ': ' . $this->issue->title,
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
markdown: 'emails.issues.status-changed',
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class MemberActivationMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public User $user;
public string $token;
public function __construct(User $user, string $token)
{
$this->user = $user;
$this->token = $token;
}
public function build(): self
{
$resetUrl = url(route('password.reset', [
'token' => $this->token,
'email' => $this->user->email,
], false));
return $this->subject(__('Activate your membership account'))
->text('emails.members.activation-text', [
'user' => $this->user,
'resetUrl' => $resetUrl,
]);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\Member;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class MemberRegistrationWelcomeMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public Member $member
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Welcome! Please Submit Payment to Complete Your Membership - ' . $this->member->full_name,
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.members.registration-welcome',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\Member;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class MembershipActivatedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public Member $member
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Membership Activated - Welcome to ' . config('app.name'),
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.members.activated',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Mail;
use App\Models\Member;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class MembershipExpiryReminderMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public Member $member;
public function __construct(Member $member)
{
$this->member = $member;
}
public function build(): self
{
return $this->subject(__('Your membership is expiring soon'))
->text('emails.members.expiry-reminder-text', [
'member' => $this->member,
]);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\MembershipPayment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PaymentApprovedByAccountantMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public MembershipPayment $payment
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Payment Verification Update - Accountant Approved',
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.payments.approved-accountant',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\MembershipPayment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PaymentApprovedByCashierMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public MembershipPayment $payment
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Payment Verification Update - Cashier Approved',
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.payments.approved-cashier',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\MembershipPayment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PaymentFullyApprovedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public MembershipPayment $payment
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Payment Fully Approved - Membership Activation Pending',
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.payments.fully-approved',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use App\Models\MembershipPayment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PaymentRejectedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public MembershipPayment $payment
) {
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Payment Verification - Action Required',
);
}
public function content(): Content
{
return new Content(
markdown: 'emails.payments.rejected',
);
}
public function attachments(): array
{
return [];
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Mail;
use App\Models\MembershipPayment;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PaymentSubmittedMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public function __construct(
public MembershipPayment $payment,
public string $recipient // 'member' or 'cashier'
) {
}
public function envelope(): Envelope
{
$subject = $this->recipient === 'member'
? 'Payment Submitted Successfully - Awaiting Verification'
: 'New Payment Submitted for Verification - ' . $this->payment->member->full_name;
return new Envelope(subject: $subject);
}
public function content(): Content
{
return new Content(
markdown: 'emails.payments.submitted-' . $this->recipient,
);
}
public function attachments(): array
{
return [];
}
}