feat(expense): add outlet selection for expenses and update form handling
This commit is contained in:
parent
e9e5975e57
commit
2b101764a8
@ -25,6 +25,9 @@ public function columns(): array
|
||||
->format(fn ($value) => currency($value, 'Rp'))
|
||||
->searchable(),
|
||||
|
||||
Column::make('Outlet', 'outlet.name')
|
||||
->searchable(),
|
||||
|
||||
Column::make('Aksi')
|
||||
->label(function ($row) {
|
||||
$actions = '';
|
||||
@ -52,6 +55,6 @@ public function columns(): array
|
||||
|
||||
public function builder(): Builder
|
||||
{
|
||||
return Expense::select('id', 'description', 'amount');
|
||||
return Expense::select('expenses.id', 'description', 'amount')->with('outlet');
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
use App\Rules\UnsignedInteger;
|
||||
use App\Traits\WithMediaHandler;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Livewire\Form;
|
||||
|
||||
class ExpenseForm extends Form
|
||||
@ -19,6 +20,8 @@ class ExpenseForm extends Form
|
||||
|
||||
public string $amount = '';
|
||||
|
||||
public string $outlet_id = '';
|
||||
|
||||
public array $image = [];
|
||||
|
||||
public function rules(): array
|
||||
@ -26,6 +29,7 @@ public function rules(): array
|
||||
return [
|
||||
'description' => ['required', 'string', 'max:100'],
|
||||
'amount' => ['required', new UnsignedInteger],
|
||||
'outlet_id' => [Rule::requiredIf(auth()->user()->outlets()->count() > 1), Rule::exists('outlets', 'id')],
|
||||
'image' => ['nullable', 'array'],
|
||||
];
|
||||
}
|
||||
@ -45,6 +49,7 @@ public function setExpense(Expense $expense)
|
||||
|
||||
$this->description = $expense->description;
|
||||
$this->amount = $expense->amount;
|
||||
$this->outlet_id = $expense->outlet_id;
|
||||
|
||||
$this->image = $this->mapMediaCollection($expense->getMedia('image'));
|
||||
}
|
||||
@ -57,7 +62,8 @@ public function store()
|
||||
$expense = Expense::create([
|
||||
'type' => ExpenseType::OPERATIONAL,
|
||||
'description' => $this->description,
|
||||
'amount' => $this->amount,
|
||||
'amount' => replaceCurrency($this->amount),
|
||||
'outlet_id' => auth()->user()->outlets()->count() > 1 ? $this->outlet_id : auth()->user()->outlets()->first()->id,
|
||||
]);
|
||||
|
||||
$this->uploadMedia($this->image, $expense, 'image');
|
||||
@ -71,7 +77,7 @@ public function update()
|
||||
DB::transaction(function () {
|
||||
$this->expense->update([
|
||||
'description' => $this->description,
|
||||
'amount' => $this->amount,
|
||||
'amount' => replaceCurrency($this->amount),
|
||||
]);
|
||||
|
||||
$this->syncMedia($this->image, $this->expense, 'image');
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
|
||||
use App\Livewire\Forms\Studio\Finance\ExpenseForm;
|
||||
use App\Models\Expense as ExpenseModel;
|
||||
use App\Models\Outlet;
|
||||
use App\Traits\WithAuthorization;
|
||||
use App\Traits\WithCloseModal;
|
||||
use App\Traits\WithConfirmation;
|
||||
@ -21,10 +22,21 @@ class Expense extends Component
|
||||
|
||||
public ExpenseForm $form;
|
||||
|
||||
public array $outlets = [];
|
||||
|
||||
public bool $userHasMultipleOutlets = false;
|
||||
|
||||
public string $method = 'create';
|
||||
|
||||
public string $modalTitle = '';
|
||||
|
||||
public function mount()
|
||||
{
|
||||
$this->outlets = Outlet::pluck('name', 'id')->toArray();
|
||||
|
||||
$this->userHasMultipleOutlets = auth()->user()->outlets()->count() > 1;
|
||||
}
|
||||
|
||||
#[On('modal:open')]
|
||||
public function openModal(string $method, string $modalTitle, ?string $id = null)
|
||||
{
|
||||
|
||||
@ -26,8 +26,8 @@
|
||||
|
||||
<flux:field>
|
||||
<flux:label>Keterangan <span class="text-red-500 ms-1">*</span></flux:label>
|
||||
<flux:input placeholder="Masukkan keterangan" wire:model.live.debounce.500ms="form.description"
|
||||
autofocus autocomplete="off" />
|
||||
<flux:input placeholder="Beli kuota" wire:model.live.debounce.500ms="form.description" autofocus
|
||||
autocomplete="off" />
|
||||
<flux:error name="form.description" />
|
||||
</flux:field>
|
||||
|
||||
@ -42,6 +42,20 @@
|
||||
<flux:error name="form.amount" />
|
||||
</flux:field>
|
||||
|
||||
@if ($userHasMultipleOutlets)
|
||||
<flux:field>
|
||||
<flux:label>Outlet <span class="text-red-500 ms-1">*</span></flux:label>
|
||||
<flux:select variant="listbox" searchable placeholder="Pilih Outlet"
|
||||
wire:model.live.debounce.500ms="form.outlet_id">
|
||||
@foreach ($outlets as $key => $value)
|
||||
<flux:select.option value="{{ $key }}">{{ $value }}
|
||||
</flux:select.option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
<flux:error name="form.outlet_id" />
|
||||
</flux:field>
|
||||
@endif
|
||||
|
||||
<div class="space-y-3">
|
||||
<h3 class="text-sm font-medium">Gambar</h3>
|
||||
<div class="dropzone-wrapper">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user