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 <dg@darkog.com>
This commit is contained in:
Christos Yiakoumettis
2025-09-02 04:20:27 +03:00
committed by GitHub
parent f3e49d3044
commit 3e96297699
41 changed files with 137 additions and 1 deletions

View File

@@ -26,6 +26,11 @@ class ExpenseRequest extends FormRequest
'expense_date' => [
'required',
],
'expense_number' => [
'nullable',
'string',
'max:255',
],
'expense_category_id' => [
'required',
],

View File

@@ -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,

View File

@@ -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,

View File

@@ -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(),

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('expenses', function (Blueprint $table) {
$table->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');
});
}
};

View File

@@ -653,6 +653,8 @@
"from_date": "من تاريخ",
"to_date": "حتى تاريخ",
"expense_date": "التاريخ",
"expense_number": "رقم المصروفات",
"expense_number_placeholder": "EXP-001",
"description": "الوصف",
"receipt": "سند القبض",
"amount": "المبلغ المطلوب",

View File

@@ -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",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "Από Ημερομηνία",
"to_date": "Έως ημερομηνία",
"expense_date": "Ημερομηνία",
"expense_number": "Αριθμός παραστατικού",
"expense_number_placeholder": "EXP-001",
"description": "Περιγραφή",
"receipt": "Απόδειξη",
"amount": "Ποσό",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "इस तारीख से",
"to_date": "इस तारीख तक",
"expense_date": "दिनांक",
"expense_number": "व्यय संख्या",
"expense_number_placeholder": "EXP-001",
"description": "विवरण",
"receipt": "रसीद",
"amount": "राशि",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "開始日",
"to_date": "終了日",
"expense_date": "日時",
"expense_number": "経費番号",
"expense_number_placeholder": "EXP-001",
"description": "説明",
"receipt": "領収書",
"amount": "数量",

View File

@@ -442,6 +442,8 @@
"from_date": "시작 날짜",
"to_date": "현재까지",
"expense_date": "데이트",
"expense_number": "비용 번호",
"expense_number_placeholder": "EXP-001",
"description": "기술",
"receipt": "영수증",
"amount": "양",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "От даты",
"to_date": "До даты",
"expense_date": "Дата",
"expense_number": "Номер расхода",
"expense_number_placeholder": "EXP-001",
"description": "Описание",
"receipt": "Квитанция",
"amount": "Сумма",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "จากวันที่",
"to_date": "ถึงวันที่",
"expense_date": "วันที่",
"expense_number": "เลขที่ค่าใช้จ่าย",
"expense_number_placeholder": "EXP-001",
"description": "คำอธิบาย",
"receipt": "ใบเสร็จ",
"amount": "จำนวนเงิน (บาท)",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "Від дати",
"to_date": "До дати",
"expense_date": "Дата",
"expense_number": "Номер витрат",
"expense_number_placeholder": "EXP-001",
"description": "Опис",
"receipt": "Квитанція",
"amount": "Сума",

View File

@@ -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",

View File

@@ -653,6 +653,8 @@
"from_date": "啟始日",
"to_date": "終止日",
"expense_date": "日期",
"expense_number": "費用編號",
"expense_number_placeholder": "EXP-001",
"description": "詳情",
"receipt": "收據",
"amount": "總額",

View File

@@ -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,

View File

@@ -116,6 +116,19 @@
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('expenses.expense_number')"
:content-loading="isFetchingInitialData"
>
<BaseInput
v-model="expenseStore.currentExpense.expense_number"
:content-loading="isFetchingInitialData"
type="text"
name="expense_number"
:placeholder="$t('expenses.expense_number_placeholder')"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('expenses.amount')"
:error="
@@ -134,6 +147,7 @@
@input="v$.currentExpense.amount.$touch()"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('expenses.currency')"
:content-loading="isFetchingInitialData"
@@ -216,6 +230,9 @@
</BaseMultiselect>
</BaseInputGroup>
</BaseInputGrid>
<BaseInputGrid class="mt-4">
<BaseInputGroup
:content-loading="isFetchingInitialData"
:label="$t('expenses.note')"
@@ -276,6 +293,7 @@
</BaseButton>
</div>
</BaseInputGrid>
</BaseCard>
</form>
</BasePage>
@@ -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) {

View File

@@ -188,6 +188,10 @@
{{ row.data.formatted_expense_date }}
</template>
<template #cell-expense_number="{ row }">
{{ row.data.expense_number || '-' }}
</template>
<template #cell-user_name="{ row }">
<BaseText
:text="row.data.customer ? row.data.customer.name : '-'"
@@ -281,6 +285,12 @@ const expenseColumns = computed(() => {
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'),

View File

@@ -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'],