add controllers, servoices

This commit is contained in:
root
2026-03-09 02:52:13 -04:00
parent c8de5f7edc
commit d76c871cb7
501 changed files with 34439 additions and 21843 deletions
@@ -0,0 +1,18 @@
<?php
namespace App\Services\Expenses;
use App\Models\Configuration;
class ExpenseContextService
{
public function getSchoolYear(): string
{
return (string) (Configuration::getConfig('school_year') ?? '');
}
public function getSemester(): string
{
return (string) (Configuration::getConfig('semester') ?? '');
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Services\Expenses;
use App\Models\Expense;
use Illuminate\Support\Facades\DB;
class ExpenseQueryService
{
public function listAll(): array
{
return $this->baseQuery()
->orderByDesc('expenses.created_at')
->get()
->map(fn ($row) => (array) $row)
->all();
}
public function findById(int $id): ?array
{
$row = $this->baseQuery()
->where('expenses.id', $id)
->first();
return $row ? (array) $row : null;
}
private function baseQuery()
{
return Expense::query()
->selectRaw('
expenses.*,
u.firstname AS purchaser_firstname,
u.lastname AS purchaser_lastname,
approver.firstname AS approver_firstname,
approver.lastname AS approver_lastname
')
->leftJoin('users as u', 'u.id', '=', 'expenses.purchased_by')
->leftJoin('users as approver', 'approver.id', '=', 'expenses.approved_by');
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Services\Expenses;
use Illuminate\Http\UploadedFile;
class ExpenseReceiptService
{
public function storeReceipt(UploadedFile $file): string
{
$stored = $file->store('receipts');
return basename($stored);
}
public function receiptUrl(?string $filename): ?string
{
if (!$filename) {
return null;
}
return url('receipts/' . $filename);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Services\Expenses;
class ExpenseRetailorService
{
public function listRetailors(): array
{
return [
'Amazon',
'Walmart',
'Costco',
"BJ's",
'Market Basket',
'Aldi',
'Hannaford',
"Sam's Club",
'HomeGoods',
'Hostinger',
'Wicked Cheesy',
'Shatila',
'Brothers Pizzeria',
'Paradise Biryani Pointe',
'Emad Leiman',
'Nova Trampoline Park',
"Lubin's Awards",
'Dollar Tree',
'Stop & Shop',
"Dunkin' Donuts",
"Giovanni's Pizza",
'Trader Joes',
];
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Services\Expenses;
use Illuminate\Support\Facades\DB;
class ExpenseStaffService
{
public function listStaffUsers(): array
{
$rows = DB::table('users')
->select('users.id', 'users.firstname', 'users.lastname', 'roles.name AS role_name')
->leftJoin('user_roles', 'user_roles.user_id', '=', 'users.id')
->leftJoin('roles', 'roles.id', '=', 'user_roles.role_id')
->whereNotNull('roles.name')
->get()
->map(fn ($row) => (array) $row)
->all();
$excludedRoles = array_map('strtolower', ['parent', 'student', 'guest']);
$staff = [];
foreach ($rows as $row) {
$roleName = strtolower((string) ($row['role_name'] ?? ''));
$id = (int) ($row['id'] ?? 0);
if ($id <= 0 || in_array($roleName, $excludedRoles, true)) {
continue;
}
if (!isset($staff[$id])) {
$staff[$id] = [
'id' => $id,
'firstname' => $row['firstname'] ?? '',
'lastname' => $row['lastname'] ?? '',
];
}
}
uasort($staff, static function ($a, $b) {
$nameA = trim(($a['firstname'] ?? '') . ' ' . ($a['lastname'] ?? ''));
$nameB = trim(($b['firstname'] ?? '') . ' ' . ($b['lastname'] ?? ''));
return strcasecmp($nameA, $nameB);
});
return array_values($staff);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Services\Expenses;
use App\Models\Expense;
class ExpenseStatusService
{
public function updateStatus(Expense $expense, string $status, string $reason, int $userId): Expense
{
$expense->status = $status;
$expense->status_reason = $reason;
$expense->approved_by = $userId;
$expense->updated_by = $userId;
$expense->save();
return $expense;
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Services\Expenses;
use App\Models\Expense;
class ExpenseWriteService
{
public function __construct(private ExpenseContextService $context) {}
public function store(array $payload): Expense
{
$schoolYear = $payload['school_year'] ?? $this->context->getSchoolYear();
$semester = $payload['semester'] ?? $this->context->getSemester();
$data = [
'category' => $payload['category'],
'amount' => $payload['amount'],
'receipt_path' => $payload['receipt_path'] ?? null,
'description' => $payload['description'] ?? null,
'retailor' => $payload['retailor'] ?? null,
'date_of_purchase' => $payload['date_of_purchase'],
'purchased_by' => $payload['purchased_by'],
'added_by' => $payload['added_by'],
'status' => $payload['status'],
'status_reason' => $payload['status_reason'] ?? null,
'approved_by' => $payload['approved_by'] ?? null,
'school_year' => $schoolYear,
'semester' => $semester,
];
return Expense::query()->create($data);
}
public function update(Expense $expense, array $payload): Expense
{
$expense->fill($payload);
$expense->save();
return $expense;
}
}