From 3e962976997e8e69b17c84d29c60614d6a4ef9af Mon Sep 17 00:00:00 2001 From: Christos Yiakoumettis Date: Tue, 2 Sep 2025 04:20:27 +0300 Subject: [PATCH] Add expense number at Expenses (#406) * add expense number at expenses * Re-order expense fields * Rename expense_number migration * Add expense_number to tests --------- Co-authored-by: Darko Gjorgjijoski --- app/Http/Requests/ExpenseRequest.php | 5 ++++ .../Resources/Customer/ExpenseResource.php | 1 + app/Http/Resources/ExpenseResource.php | 1 + database/factories/ExpenseFactory.php | 1 + ...2_add_expense_number_to_expenses_table.php | 30 +++++++++++++++++++ lang/ar.json | 2 ++ lang/cs.json | 2 ++ lang/de.json | 2 ++ lang/el.json | 2 ++ lang/en.json | 2 ++ lang/es.json | 2 ++ lang/fa.json | 2 ++ lang/fi.json | 2 ++ lang/fr.json | 2 ++ lang/hi.json | 2 ++ lang/hr.json | 2 ++ lang/id.json | 2 ++ lang/it.json | 2 ++ lang/ja.json | 2 ++ lang/ko.json | 2 ++ lang/lt.json | 2 ++ lang/lv.json | 2 ++ lang/mk.json | 2 ++ lang/nl.json | 2 ++ lang/pl.json | 2 ++ lang/pt-br.json | 2 ++ lang/pt.json | 2 ++ lang/ro.json | 2 ++ lang/ru.json | 2 ++ lang/sk.json | 2 ++ lang/sr.json | 2 ++ lang/sv.json | 2 ++ lang/th.json | 2 ++ lang/tr.json | 2 ++ lang/uk.json | 2 ++ lang/vi.json | 2 ++ lang/zh.json | 2 ++ resources/scripts/admin/stub/expense.js | 1 + .../scripts/admin/views/expenses/Create.vue | 23 +++++++++++++- .../scripts/admin/views/expenses/Index.vue | 10 +++++++ tests/Feature/Admin/ExpenseTest.php | 2 ++ 41 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2025_09_02_add_expense_number_to_expenses_table.php 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 }} + +