Files
nnterp-react-admin/database/seeders/DemoDoubleEntrySeeder.php
2026-03-13 20:49:46 +08:00

141 lines
6.2 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Workdo\DoubleEntry\Entities\JournalEntry;
use Workdo\DoubleEntry\Entities\JournalItem;
use Workdo\Account\Models\ChartOfAccount;
use Carbon\Carbon;
class DemoDoubleEntrySeeder extends Seeder
{
public function run(DemoContext $ctx): void
{
if (JournalEntry::where('created_by', $ctx->userId)->exists()) {
return;
}
// Get chart of accounts by type
$accounts = ChartOfAccount::where('created_by', $ctx->userId)
->where('is_active', true)->get();
if ($accounts->isEmpty()) return;
$accountIds = $accounts->pluck('id')->toArray();
// Use first few accounts for different categories
// We'll use sequential IDs since CoA structure varies
$getAccountId = fn(int $offset) => $accountIds[$offset % count($accountIds)];
$journals = [
[
'days_ago' => 150,
'reference' => 'SI-REVENUE',
'description' => 'Sales Revenue Recognition - Invoice batch Q3',
'entries' => [
['account_offset' => 0, 'debit' => 125000, 'credit' => 0, 'desc' => 'Accounts Receivable'],
['account_offset' => 1, 'debit' => 0, 'credit' => 111607.14, 'desc' => 'Sales Revenue'],
['account_offset' => 2, 'debit' => 0, 'credit' => 13392.86, 'desc' => 'VAT Output'],
],
],
[
'days_ago' => 130,
'reference' => 'PI-EXPENSE',
'description' => 'Purchase Expense Recording - Vendor batch Q3',
'entries' => [
['account_offset' => 3, 'debit' => 85000, 'credit' => 0, 'desc' => 'Inventory / Purchases'],
['account_offset' => 4, 'debit' => 10200, 'credit' => 0, 'desc' => 'VAT Input'],
['account_offset' => 5, 'debit' => 0, 'credit' => 95200, 'desc' => 'Accounts Payable'],
],
],
[
'days_ago' => 110,
'reference' => 'PMT-RECEIVED',
'description' => 'Customer Payment Received - Sarah Johnson',
'entries' => [
['account_offset' => 6, 'debit' => 45000, 'credit' => 0, 'desc' => 'Cash / Bank'],
['account_offset' => 0, 'debit' => 0, 'credit' => 45000, 'desc' => 'Accounts Receivable'],
],
],
[
'days_ago' => 90,
'reference' => 'PMT-MADE',
'description' => 'Vendor Payment Made - Tech Solutions Inc',
'entries' => [
['account_offset' => 5, 'debit' => 35000, 'credit' => 0, 'desc' => 'Accounts Payable'],
['account_offset' => 6, 'debit' => 0, 'credit' => 35000, 'desc' => 'Cash / Bank'],
],
],
[
'days_ago' => 70,
'reference' => 'PAYROLL',
'description' => 'Payroll Processing - Monthly salary February',
'entries' => [
['account_offset' => 7, 'debit' => 180000, 'credit' => 0, 'desc' => 'Salary Expense'],
['account_offset' => 8, 'debit' => 0, 'credit' => 15000, 'desc' => 'SSS Payable'],
['account_offset' => 9, 'debit' => 0, 'credit' => 8000, 'desc' => 'PhilHealth Payable'],
['account_offset' => 6, 'debit' => 0, 'credit' => 157000, 'desc' => 'Cash / Bank'],
],
],
[
'days_ago' => 45,
'reference' => 'SI-REVENUE-Q4',
'description' => 'Sales Revenue Recognition - Invoice batch Q4',
'entries' => [
['account_offset' => 0, 'debit' => 200000, 'credit' => 0, 'desc' => 'Accounts Receivable'],
['account_offset' => 1, 'debit' => 0, 'credit' => 178571.43, 'desc' => 'Sales Revenue'],
['account_offset' => 2, 'debit' => 0, 'credit' => 21428.57, 'desc' => 'VAT Output'],
],
],
[
'days_ago' => 20,
'reference' => 'SR-RETURN',
'description' => 'Sales Return - Credit Note applied for defective goods',
'entries' => [
['account_offset' => 1, 'debit' => 15000, 'credit' => 0, 'desc' => 'Sales Returns & Allowances'],
['account_offset' => 0, 'debit' => 0, 'credit' => 15000, 'desc' => 'Accounts Receivable'],
],
],
[
'days_ago' => 5,
'reference' => 'UTILITIES',
'description' => 'Monthly Office Utilities - Electricity, Water, Internet',
'entries' => [
['account_offset' => 10 % count($accountIds), 'debit' => 12500, 'credit' => 0, 'desc' => 'Utilities Expense'],
['account_offset' => 6, 'debit' => 0, 'credit' => 12500, 'desc' => 'Cash / Bank'],
],
],
];
foreach ($journals as $index => $journal) {
$date = Carbon::now()->subDays($journal['days_ago']);
$entry = JournalEntry::create([
'date' => $date->toDateString(),
'reference' => $journal['reference'],
'description' => $journal['description'],
'journal_id' => $index + 1,
'workspace' => $ctx->userId,
'created_by' => $ctx->userId,
'created_at' => $date,
'updated_at' => $date,
]);
foreach ($journal['entries'] as $item) {
JournalItem::create([
'journal' => $entry->id,
'account' => $getAccountId($item['account_offset']),
'description' => $item['desc'],
'debit' => $item['debit'],
'credit' => $item['credit'],
'workspace' => $ctx->userId,
'created_by' => $ctx->userId,
'created_at' => $date,
'updated_at' => $date,
]);
}
}
}
}