The branch filter was incorrectly limiting available revenue accounts in certain scenarios. Temporarily added debug output to investigate account query results.
265 lines
9.6 KiB
PHP
265 lines
9.6 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources;
|
|
|
|
use App\Filament\Resources\SaleResource\Pages;
|
|
use App\Models\Account;
|
|
use App\Models\Branch;
|
|
use App\Models\Client;
|
|
use App\Models\Sale;
|
|
use Awcodes\TableRepeater\Components\TableRepeater;
|
|
use Awcodes\TableRepeater\Header;
|
|
use Filament\Forms\Components\Checkbox;
|
|
use Filament\Forms\Components\DatePicker;
|
|
use Filament\Forms\Components\Hidden;
|
|
use Filament\Forms\Components\Select;
|
|
use Filament\Forms\Components\TextInput;
|
|
use Filament\Forms\Form;
|
|
use Filament\Forms\Get;
|
|
use Filament\Forms\Set;
|
|
use Filament\Resources\Resource;
|
|
use Filament\Tables;
|
|
use Filament\Tables\Columns\TextColumn;
|
|
use Filament\Tables\Table;
|
|
|
|
class SaleResource extends Resource
|
|
{
|
|
protected static ?string $model = Sale::class;
|
|
|
|
protected static ?string $navigationIcon = 'heroicon-o-currency-dollar';
|
|
|
|
protected static bool $shouldRegisterNavigation = false;
|
|
|
|
public static function form(Form $form): Form
|
|
{
|
|
return $form
|
|
->schema([
|
|
Select::make('client')
|
|
->default(request()->query('client_id'))
|
|
->options(Client::query()->get()->pluck('company', 'id'))
|
|
->afterStateUpdated(function ($set, $get) {
|
|
$set('branch_id', '');
|
|
})
|
|
->required()
|
|
->live(),
|
|
Select::make('branch_id')
|
|
->relationship('branch', 'code')
|
|
->options(fn ($get) => Branch::query()->where('client_id', $get('client'))->get()->pluck('code', 'id'))
|
|
->required()
|
|
->afterStateUpdated(function ($set, $get) {
|
|
$set('current_series', static::getSeries($get));
|
|
$set('transactions.*.branch_id', $get('branch_id'));
|
|
})
|
|
->live(),
|
|
TextInput::make('current_series')
|
|
->label('Series')
|
|
->disabled(),
|
|
DatePicker::make('happened_on')->label('Date')
|
|
->required()
|
|
->afterStateUpdated(function ($set, $get) {
|
|
$set('transactions.*.happened_on', $get('happened_on'));
|
|
})
|
|
->native(false),
|
|
Checkbox::make('with_discount')->label('With Discount?')->default(false)->live(),
|
|
|
|
TableRepeater::make('transactions')
|
|
->headers(fn (Get $get): array => static::getTransactionTableHeader($get))
|
|
->relationship('transactions')
|
|
->schema(fn (Get $get): array => static::getTransactionTableFormSchema($get))
|
|
->visible(fn (Get $get) => $get('branch_id') != null)
|
|
->columnSpan('full'),
|
|
]);
|
|
}
|
|
|
|
public static function getSeries(Get $get): string
|
|
{
|
|
$branch = Branch::find($get('branch_id'));
|
|
|
|
if ($branch) {
|
|
$currentSeries = $branch->current_series;
|
|
|
|
return str_pad($currentSeries + 1, 6, '0', STR_PAD_LEFT);
|
|
}
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
private static function getTransactionTableHeader(Get $get): array
|
|
{
|
|
if ($get('with_discount')) {
|
|
return [
|
|
Header::make('Charge Account'),
|
|
Header::make('Description'),
|
|
Header::make('Gross Amount'),
|
|
Header::make('Exempt'),
|
|
Header::make('Vatable Amount'),
|
|
Header::make('Output Tax'),
|
|
Header::make('Withholding Tax'),
|
|
Header::make('Discount'),
|
|
Header::make('Net Amount'),
|
|
];
|
|
}
|
|
|
|
return [
|
|
Header::make('Charge Account'),
|
|
Header::make('Description'),
|
|
Header::make('Gross Amount'),
|
|
Header::make('Exempt'),
|
|
Header::make('Vatable Amount'),
|
|
Header::make('Output Tax'),
|
|
Header::make('Withholding Tax'),
|
|
Header::make('Net Amount'),
|
|
];
|
|
}
|
|
|
|
private static function getTransactionTableFormSchema(Get $get): array
|
|
{
|
|
return [
|
|
Select::make('account_id')->options(fn ($get) => static::getAccountOptions($get)),
|
|
TextInput::make('description')->label('Description'),
|
|
Hidden::make('branch_id')->default(fn (Get $get) => $get('../../branch_id')),
|
|
TextInput::make('gross_amount')
|
|
->numeric()
|
|
->live(false, 500)
|
|
->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) {
|
|
static::setDefaultFormValues($get, $set, $old, $state);
|
|
})->default(0),
|
|
TextInput::make('exempt')
|
|
->numeric()
|
|
->live()
|
|
->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) {
|
|
static::setDefaultFormValues($get, $set, $old, $state);
|
|
})->default(0),
|
|
TextInput::make('vatable_amount')
|
|
->numeric()
|
|
->nullable()
|
|
->live()
|
|
->readOnly()
|
|
->default(0),
|
|
Hidden::make('happened_on')->default(fn (Get $get) => $get('../../happened_on')),
|
|
Hidden::make('with_discount')->default(fn (Get $get) => $get('../../with_discount')),
|
|
TextInput::make('output_tax')
|
|
->numeric()
|
|
->live()
|
|
->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) {
|
|
|
|
static::setDefaultFormValues($get, $set, $old, $state);
|
|
})->default(0),
|
|
TextInput::make('payable_withholding_tax')
|
|
->numeric()
|
|
->live()
|
|
->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) {
|
|
|
|
static::setDefaultFormValues($get, $set, $old, $state);
|
|
})->default(0),
|
|
TextInput::make('discount')
|
|
->numeric()
|
|
->readOnly()
|
|
->visible(fn (Get $get) => $get('../../with_discount'))
|
|
->live(),
|
|
TextInput::make('net_amount')->numeric()->default(0),
|
|
];
|
|
}
|
|
|
|
private static function getAccountOptions($get)
|
|
{
|
|
$query = Account::query();
|
|
|
|
$query->where([
|
|
'client_id' => $get('../../client'),
|
|
]);
|
|
|
|
// if ($get('../../branch_id')) {
|
|
// $query->whereHas('balances', function ($query) use ($get) {
|
|
// return $query->where('branch_id', $get('../../branch_id'));
|
|
// });
|
|
// }
|
|
|
|
$query->whereHas('accountType', function ($query) {
|
|
return $query->where('type', 'Revenue');
|
|
});
|
|
|
|
dd($query->get());
|
|
|
|
return $query->get()->pluck('account', 'id');
|
|
}
|
|
|
|
private static function setDefaultFormValues(Get $get, Set $set, ?string $old, ?string $state)
|
|
{
|
|
$exempt = (float) $get('exempt');
|
|
$withHoldingTax = (float) $get('payable_withholding_tax');
|
|
$vatableSales = $get('gross_amount');
|
|
$vatableAmount = 0;
|
|
if ($vatableSales) {
|
|
$vatableAmount = $vatableSales / 1.12;
|
|
}
|
|
|
|
$discount = $exempt * .20;
|
|
$outputTax = $vatableAmount * 0.12;
|
|
|
|
//default net amount
|
|
$netAmount = (int) $vatableSales - $get('payable_withholding_tax');
|
|
|
|
//net amount if vatable
|
|
if (ExpenseResource::getIsVatable($get)) {
|
|
$netAmount = ($vatableAmount + $exempt) - $withHoldingTax;
|
|
}
|
|
|
|
//if discounted
|
|
if ($get('../../with_discount')) {
|
|
$netAmount = $netAmount - $discount;
|
|
}
|
|
|
|
$set('output_tax', number_format($outputTax, 2, '.', ''));
|
|
$set('discount', number_format($discount, 2, '.', ''));
|
|
$set('vatable_amount', number_format($vatableAmount, 2, '.', ''));
|
|
$set('net_amount', number_format($netAmount, 2, '.', ''));
|
|
}
|
|
|
|
public static function table(Table $table): Table
|
|
{
|
|
return $table
|
|
->columns([
|
|
TextColumn::make('id')->label('ID')->sortable(),
|
|
TextColumn::make('client.name')->label('Client')->sortable(),
|
|
TextColumn::make('branch.name')->label('Branch')->sortable(),
|
|
TextColumn::make('happened_on')->label('Date')->date()->sortable(),
|
|
TextColumn::make('gross_amount')->label('Gross Amount')->numeric()->sortable(),
|
|
TextColumn::make('exempt')->label('Exempt')->numeric()->sortable(),
|
|
TextColumn::make('vatable_amount')->label('Vatable Amount')->numeric()->sortable(),
|
|
TextColumn::make('output_tax')->label('Output Tax')->numeric()->sortable(),
|
|
TextColumn::make('payable_withholding_tax')->label('Payable Withholding Tax')->numeric()->sortable(),
|
|
TextColumn::make('discount')->label('Discount')->numeric()->sortable(),
|
|
TextColumn::make('net_amount')->label('Net Amount')->numeric()->sortable(),
|
|
])
|
|
->filters([
|
|
//
|
|
])
|
|
->actions([
|
|
Tables\Actions\EditAction::make(),
|
|
])
|
|
->bulkActions([
|
|
Tables\Actions\BulkActionGroup::make([
|
|
Tables\Actions\DeleteBulkAction::make(),
|
|
]),
|
|
]);
|
|
}
|
|
|
|
public static function getRelations(): array
|
|
{
|
|
return [
|
|
//
|
|
];
|
|
}
|
|
|
|
public static function getPages(): array
|
|
{
|
|
return [
|
|
'index' => Pages\ListSales::route('/'),
|
|
'create' => Pages\CreateSale::route('/create'),
|
|
'edit' => Pages\EditSale::route('/{record}/edit'),
|
|
];
|
|
}
|
|
}
|