diff --git a/app/Http/Requests/ExpenseRequest.php b/app/Http/Requests/ExpenseRequest.php
index 1ea65d13..77829784 100644
--- a/app/Http/Requests/ExpenseRequest.php
+++ b/app/Http/Requests/ExpenseRequest.php
@@ -26,6 +26,11 @@ class ExpenseRequest extends FormRequest
'expense_date' => [
'required',
],
+ 'expense_number' => [
+ 'nullable',
+ 'string',
+ 'max:255',
+ ],
'expense_category_id' => [
'required',
],
diff --git a/app/Http/Resources/Customer/ExpenseResource.php b/app/Http/Resources/Customer/ExpenseResource.php
index 865877d3..a121aebd 100644
--- a/app/Http/Resources/Customer/ExpenseResource.php
+++ b/app/Http/Resources/Customer/ExpenseResource.php
@@ -16,6 +16,7 @@ class ExpenseResource extends JsonResource
return [
'id' => $this->id,
'expense_date' => $this->expense_date,
+ 'expense_number' => $this->expense_number,
'amount' => $this->amount,
'notes' => $this->notes,
'customer_id' => $this->customer_id,
diff --git a/app/Http/Resources/ExpenseResource.php b/app/Http/Resources/ExpenseResource.php
index 3119fa2a..f251b9bb 100644
--- a/app/Http/Resources/ExpenseResource.php
+++ b/app/Http/Resources/ExpenseResource.php
@@ -16,6 +16,7 @@ class ExpenseResource extends JsonResource
return [
'id' => $this->id,
'expense_date' => $this->expense_date,
+ 'expense_number' => $this->expense_number,
'amount' => $this->amount,
'notes' => $this->notes,
'customer_id' => $this->customer_id,
diff --git a/database/factories/ExpenseFactory.php b/database/factories/ExpenseFactory.php
index 4a13562e..d4c4765d 100644
--- a/database/factories/ExpenseFactory.php
+++ b/database/factories/ExpenseFactory.php
@@ -26,6 +26,7 @@ class ExpenseFactory extends Factory
return [
'expense_date' => $this->faker->date('Y-m-d', 'now'),
'expense_category_id' => ExpenseCategory::factory(),
+ 'expense_number' => $this->faker->unique()->numerify('EXP-#####'),
'company_id' => User::find(1)->companies()->first()->id,
'amount' => $this->faker->randomDigitNotNull(),
'notes' => $this->faker->text(),
diff --git a/database/migrations/2025_09_02_add_expense_number_to_expenses_table.php b/database/migrations/2025_09_02_add_expense_number_to_expenses_table.php
new file mode 100644
index 00000000..e1c65a40
--- /dev/null
+++ b/database/migrations/2025_09_02_add_expense_number_to_expenses_table.php
@@ -0,0 +1,30 @@
+string('expense_number')->nullable()->after('expense_date');
+ $table->index('expense_number');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('expenses', function (Blueprint $table) {
+ $table->dropIndex(['expense_number']);
+ $table->dropColumn('expense_number');
+ });
+ }
+};
diff --git a/lang/ar.json b/lang/ar.json
index 5d56167a..97f77c27 100644
--- a/lang/ar.json
+++ b/lang/ar.json
@@ -653,6 +653,8 @@
"from_date": "من تاريخ",
"to_date": "حتى تاريخ",
"expense_date": "التاريخ",
+ "expense_number": "رقم المصروفات",
+ "expense_number_placeholder": "EXP-001",
"description": "الوصف",
"receipt": "سند القبض",
"amount": "المبلغ المطلوب",
diff --git a/lang/cs.json b/lang/cs.json
index cb903474..abaa1ccd 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -653,6 +653,8 @@
"from_date": "Od data",
"to_date": "Do data",
"expense_date": "Datum",
+ "expense_number": "Číslo výdaje",
+ "expense_number_placeholder": "EXP-001",
"description": "Popis",
"receipt": "Doklad",
"amount": "Částka",
diff --git a/lang/de.json b/lang/de.json
index 37564ebf..e51dc2d8 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -653,6 +653,8 @@
"from_date": "Von Datum",
"to_date": "bis Datum",
"expense_date": "Datum",
+ "expense_number": "Kostennummer",
+ "expense_number_placeholder": "EXP-001",
"description": "Beschreibung",
"receipt": "Rechnung",
"amount": "Summe",
diff --git a/lang/el.json b/lang/el.json
index 34e3d263..2b89ab6d 100644
--- a/lang/el.json
+++ b/lang/el.json
@@ -653,6 +653,8 @@
"from_date": "Από Ημερομηνία",
"to_date": "Έως ημερομηνία",
"expense_date": "Ημερομηνία",
+ "expense_number": "Αριθμός παραστατικού",
+ "expense_number_placeholder": "EXP-001",
"description": "Περιγραφή",
"receipt": "Απόδειξη",
"amount": "Ποσό",
diff --git a/lang/en.json b/lang/en.json
index cb96f9a4..fa1a523d 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -653,6 +653,8 @@
"from_date": "From Date",
"to_date": "To Date",
"expense_date": "Date",
+ "expense_number": "Expense Number",
+ "expense_number_placeholder": "EXP-001",
"description": "Description",
"receipt": "Receipt",
"amount": "Amount",
diff --git a/lang/es.json b/lang/es.json
index 6ab155b6..8ef2bed0 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -653,6 +653,8 @@
"from_date": "Desde la fecha",
"to_date": "Hasta la fecha",
"expense_date": "Fecha",
+ "expense_number": "Número de gasto",
+ "expense_number_placeholder": "EXP-001",
"description": "Descripción",
"receipt": "Recibo",
"amount": "Cantidad",
diff --git a/lang/fa.json b/lang/fa.json
index 99157f2c..c7410204 100644
--- a/lang/fa.json
+++ b/lang/fa.json
@@ -653,6 +653,8 @@
"from_date": "From Date",
"to_date": "To Date",
"expense_date": "Date",
+ "expense_number": "شماره هزینه",
+ "expense_number_placeholder": "EXP-001",
"description": "Description",
"receipt": "Receipt",
"amount": "Amount",
diff --git a/lang/fi.json b/lang/fi.json
index c208fb0a..f290715c 100644
--- a/lang/fi.json
+++ b/lang/fi.json
@@ -653,6 +653,8 @@
"from_date": "Päivästä",
"to_date": "Päivään",
"expense_date": "Päivämäärä",
+ "expense_number": "Kulunumero",
+ "expense_number_placeholder": "EXP-001",
"description": "Kuvaus",
"receipt": "Kuitti",
"amount": "Summa",
diff --git a/lang/fr.json b/lang/fr.json
index 1e24d522..290fa4b0 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -653,6 +653,8 @@
"from_date": "Du",
"to_date": "Au",
"expense_date": "Date",
+ "expense_number": "Numéro de dépense",
+ "expense_number_placeholder": "EXP-001",
"description": "Description",
"receipt": "Reçu",
"amount": "Montant",
diff --git a/lang/hi.json b/lang/hi.json
index 517244ae..5c5159af 100644
--- a/lang/hi.json
+++ b/lang/hi.json
@@ -653,6 +653,8 @@
"from_date": "इस तारीख से",
"to_date": "इस तारीख तक",
"expense_date": "दिनांक",
+ "expense_number": "व्यय संख्या",
+ "expense_number_placeholder": "EXP-001",
"description": "विवरण",
"receipt": "रसीद",
"amount": "राशि",
diff --git a/lang/hr.json b/lang/hr.json
index b6802d87..eef64713 100644
--- a/lang/hr.json
+++ b/lang/hr.json
@@ -653,6 +653,8 @@
"from_date": "Datum od",
"to_date": "Datum do",
"expense_date": "Datum",
+ "expense_number": "Broj troška",
+ "expense_number_placeholder": "EXP-001",
"description": "Opis",
"receipt": "Račun",
"amount": "Iznos",
diff --git a/lang/id.json b/lang/id.json
index ca897a01..263cb495 100644
--- a/lang/id.json
+++ b/lang/id.json
@@ -653,6 +653,8 @@
"from_date": "Dari Tanggal",
"to_date": "Sampai Tanggal",
"expense_date": "Tanggal",
+ "expense_number": "Nomor Biaya",
+ "expense_number_placeholder": "EXP-001",
"description": "Deskripsi",
"receipt": "Tanda Terima",
"amount": "Jumlah",
diff --git a/lang/it.json b/lang/it.json
index 50f857da..41b2ef3a 100644
--- a/lang/it.json
+++ b/lang/it.json
@@ -653,6 +653,8 @@
"from_date": "Dalla Data",
"to_date": "Alla Data",
"expense_date": "Data",
+ "expense_number": "Numero di spesa",
+ "expense_number_placeholder": "EXP-001",
"description": "Descrizione",
"receipt": "Ricevuta",
"amount": "Ammontare",
diff --git a/lang/ja.json b/lang/ja.json
index ccee46eb..92f7f8a7 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -653,6 +653,8 @@
"from_date": "開始日",
"to_date": "終了日",
"expense_date": "日時",
+ "expense_number": "経費番号",
+ "expense_number_placeholder": "EXP-001",
"description": "説明",
"receipt": "領収書",
"amount": "数量",
diff --git a/lang/ko.json b/lang/ko.json
index b34c19f0..21379552 100644
--- a/lang/ko.json
+++ b/lang/ko.json
@@ -442,6 +442,8 @@
"from_date": "시작 날짜",
"to_date": "현재까지",
"expense_date": "데이트",
+ "expense_number": "비용 번호",
+ "expense_number_placeholder": "EXP-001",
"description": "기술",
"receipt": "영수증",
"amount": "양",
diff --git a/lang/lt.json b/lang/lt.json
index 1b0b3b1a..17cd9fb3 100644
--- a/lang/lt.json
+++ b/lang/lt.json
@@ -653,6 +653,8 @@
"from_date": "From Date",
"to_date": "To Date",
"expense_date": "Data",
+ "expense_number": "Išlaidų numeris",
+ "expense_number_placeholder": "EXP-001",
"description": "Aprašymas",
"receipt": "Čekis",
"amount": "Amount",
diff --git a/lang/lv.json b/lang/lv.json
index 233188e3..3e371dfb 100644
--- a/lang/lv.json
+++ b/lang/lv.json
@@ -653,6 +653,8 @@
"from_date": "Datums no",
"to_date": "Datums līdz",
"expense_date": "Datums",
+ "expense_number": "Izdevumu numurs",
+ "expense_number_placeholder": "EXP-001",
"description": "Apraksts",
"receipt": "Čeks",
"amount": "Summa",
diff --git a/lang/mk.json b/lang/mk.json
index 37f1ae3e..726e8738 100644
--- a/lang/mk.json
+++ b/lang/mk.json
@@ -653,6 +653,8 @@
"from_date": "From Date",
"to_date": "To Date",
"expense_date": "Date",
+ "expense_number": "Expense Number",
+ "expense_number_placeholder": "EXP-001",
"description": "Description",
"receipt": "Receipt",
"amount": "Amount",
diff --git a/lang/nl.json b/lang/nl.json
index 88e77a34..22bf2a8a 100644
--- a/lang/nl.json
+++ b/lang/nl.json
@@ -653,6 +653,8 @@
"from_date": "Van datum",
"to_date": "Tot datum",
"expense_date": "Datum",
+ "expense_number": "Izdevumu numurs",
+ "expense_number_placeholder": "EXP-001",
"description": "Omschrijving",
"receipt": "Bon",
"amount": "Bedrag",
diff --git a/lang/pl.json b/lang/pl.json
index bc34584b..538b773c 100644
--- a/lang/pl.json
+++ b/lang/pl.json
@@ -653,6 +653,8 @@
"from_date": "Od daty",
"to_date": "Do daty",
"expense_date": "Data",
+ "expense_number": "Numer wydatku",
+ "expense_number_placeholder": "EXP-001",
"description": "Opis",
"receipt": "Potwierdzenie",
"amount": "Kwota",
diff --git a/lang/pt-br.json b/lang/pt-br.json
index 02d18a2d..ae0cd54e 100644
--- a/lang/pt-br.json
+++ b/lang/pt-br.json
@@ -653,6 +653,8 @@
"from_date": "A partir da Data",
"to_date": "Até a Data",
"expense_date": "Data",
+ "expense_number": "Número de despesas",
+ "expense_number_placeholder": "EXP-001",
"description": "Descrição",
"receipt": "Receita",
"amount": "Montante",
diff --git a/lang/pt.json b/lang/pt.json
index 69d1938c..0add6f89 100644
--- a/lang/pt.json
+++ b/lang/pt.json
@@ -653,6 +653,8 @@
"from_date": "A partir da Data",
"to_date": "Até a Data",
"expense_date": "Data",
+ "expense_number": "Número de despesas",
+ "expense_number_placeholder": "EXP-001",
"description": "Descrição",
"receipt": "Recibo",
"amount": "Valor",
diff --git a/lang/ro.json b/lang/ro.json
index abe249ab..58966ff9 100644
--- a/lang/ro.json
+++ b/lang/ro.json
@@ -653,6 +653,8 @@
"from_date": "From Date",
"to_date": "To Date",
"expense_date": "Date",
+ "expense_number": "Număr de cheltuială",
+ "expense_number_placeholder": "EXP-001",
"description": "Description",
"receipt": "Receipt",
"amount": "Amount",
diff --git a/lang/ru.json b/lang/ru.json
index 5e68fbb2..04b444e1 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -653,6 +653,8 @@
"from_date": "От даты",
"to_date": "До даты",
"expense_date": "Дата",
+ "expense_number": "Номер расхода",
+ "expense_number_placeholder": "EXP-001",
"description": "Описание",
"receipt": "Квитанция",
"amount": "Сумма",
diff --git a/lang/sk.json b/lang/sk.json
index f6cdfaf7..4cf41064 100644
--- a/lang/sk.json
+++ b/lang/sk.json
@@ -653,6 +653,8 @@
"from_date": "Od dátumu",
"to_date": "Do dátumu",
"expense_date": "Dátum",
+ "expense_number": "Številka odhodka",
+ "expense_number_placeholder": "EXP-001",
"description": "Popis",
"receipt": "Doklad o zaplatení",
"amount": "Suma",
diff --git a/lang/sr.json b/lang/sr.json
index 44932d60..574546a3 100644
--- a/lang/sr.json
+++ b/lang/sr.json
@@ -653,6 +653,8 @@
"from_date": "Datum od",
"to_date": "Datum do",
"expense_date": "Datum",
+ "expense_number": "Broj troška",
+ "expense_number_placeholder": "EXP-001",
"description": "Opis",
"receipt": "Račun",
"amount": "Iznos",
diff --git a/lang/sv.json b/lang/sv.json
index 70967fac..4ca42440 100644
--- a/lang/sv.json
+++ b/lang/sv.json
@@ -653,6 +653,8 @@
"from_date": "Från datum",
"to_date": "Till datum",
"expense_date": "Datum",
+ "expense_number": "Utgiftsnummer",
+ "expense_number_placeholder": "EXP-001",
"description": "Beskrivning",
"receipt": "Kvitto",
"amount": "Summa",
diff --git a/lang/th.json b/lang/th.json
index 2b717008..60eb5841 100644
--- a/lang/th.json
+++ b/lang/th.json
@@ -653,6 +653,8 @@
"from_date": "จากวันที่",
"to_date": "ถึงวันที่",
"expense_date": "วันที่",
+ "expense_number": "เลขที่ค่าใช้จ่าย",
+ "expense_number_placeholder": "EXP-001",
"description": "คำอธิบาย",
"receipt": "ใบเสร็จ",
"amount": "จำนวนเงิน (บาท)",
diff --git a/lang/tr.json b/lang/tr.json
index f043405c..ff5a95ad 100644
--- a/lang/tr.json
+++ b/lang/tr.json
@@ -653,6 +653,8 @@
"from_date": "Başlangıç tarihi",
"to_date": "Bitiş tarihi",
"expense_date": "Tarih",
+ "expense_number": "Gider Numarası",
+ "expense_number_placeholder": "EXP-001",
"description": "Açıklama",
"receipt": "Makbuz",
"amount": "Tutar",
diff --git a/lang/uk.json b/lang/uk.json
index 3ce5174f..773bf6fa 100644
--- a/lang/uk.json
+++ b/lang/uk.json
@@ -653,6 +653,8 @@
"from_date": "Від дати",
"to_date": "До дати",
"expense_date": "Дата",
+ "expense_number": "Номер витрат",
+ "expense_number_placeholder": "EXP-001",
"description": "Опис",
"receipt": "Квитанція",
"amount": "Сума",
diff --git a/lang/vi.json b/lang/vi.json
index aa722021..274a839a 100644
--- a/lang/vi.json
+++ b/lang/vi.json
@@ -653,6 +653,8 @@
"from_date": "Từ ngày",
"to_date": "Đến nay",
"expense_date": "Ngày",
+ "expense_number": "Số chi phí",
+ "expense_number_placeholder": "EXP-001",
"description": "Sự miêu tả",
"receipt": "Biên lai",
"amount": "Số tiền",
diff --git a/lang/zh.json b/lang/zh.json
index 88ff61ab..59f1926b 100644
--- a/lang/zh.json
+++ b/lang/zh.json
@@ -653,6 +653,8 @@
"from_date": "啟始日",
"to_date": "終止日",
"expense_date": "日期",
+ "expense_number": "費用編號",
+ "expense_number_placeholder": "EXP-001",
"description": "詳情",
"receipt": "收據",
"amount": "總額",
diff --git a/resources/scripts/admin/stub/expense.js b/resources/scripts/admin/stub/expense.js
index 98e945a6..49c6789e 100644
--- a/resources/scripts/admin/stub/expense.js
+++ b/resources/scripts/admin/stub/expense.js
@@ -3,6 +3,7 @@ import moment from 'moment'
export default {
expense_category_id: null,
expense_date: moment().format('YYYY-MM-DD'),
+ expense_number: '',
amount: 100,
notes: '',
attachment_receipt: null,
diff --git a/resources/scripts/admin/views/expenses/Create.vue b/resources/scripts/admin/views/expenses/Create.vue
index 8f2275cd..8fef8209 100644
--- a/resources/scripts/admin/views/expenses/Create.vue
+++ b/resources/scripts/admin/views/expenses/Create.vue
@@ -116,6 +116,19 @@
/>
+
+
+
+
+
+
+
+
+
@@ -482,7 +500,10 @@ async function submitForm() {
isSaving.value = true
- let formData = expenseStore.currentExpense
+ let formData = {
+ ...expenseStore.currentExpense,
+ expense_number: expenseStore.currentExpense.expense_number || ''
+ }
try {
if (isEdit.value) {
diff --git a/resources/scripts/admin/views/expenses/Index.vue b/resources/scripts/admin/views/expenses/Index.vue
index 3321526a..2dc1b4f1 100644
--- a/resources/scripts/admin/views/expenses/Index.vue
+++ b/resources/scripts/admin/views/expenses/Index.vue
@@ -188,6 +188,10 @@
{{ row.data.formatted_expense_date }}
+
+ {{ row.data.expense_number || '-' }}
+
+
{
thClass: 'extra',
tdClass: 'font-medium text-gray-900',
},
+ {
+ key: 'expense_number',
+ label: t('expenses.expense_number'),
+ thClass: 'extra',
+ tdClass: 'font-medium text-gray-900',
+ },
{
key: 'name',
label: t('expenses.category'),
diff --git a/tests/Feature/Admin/ExpenseTest.php b/tests/Feature/Admin/ExpenseTest.php
index ca7904a6..4267a153 100644
--- a/tests/Feature/Admin/ExpenseTest.php
+++ b/tests/Feature/Admin/ExpenseTest.php
@@ -57,6 +57,7 @@ test('store validates using a form request', function () {
test('get expense data', function () {
$expense = Expense::factory()->create([
+ 'expense_number' => 'EXP-000001',
'expense_date' => '2019-02-05',
]);
@@ -64,6 +65,7 @@ test('get expense data', function () {
$this->assertDatabaseHas('expenses', [
'id' => $expense->id,
+ 'expense_number' => $expense['expense_number'],
'notes' => $expense['notes'],
'expense_category_id' => $expense['expense_category_id'],
'amount' => $expense['amount'],