Work on customer login

This commit is contained in:
Nisse Lommerde 2025-01-21 21:28:41 -05:00
parent b320915fc1
commit 33f66a561e
11 changed files with 72 additions and 12 deletions

@ -90,6 +90,16 @@ public static function form(Form $form): Form
'true' => 'info',
'false' => 'info',
]),
ToggleButtons::make('has_hst')
->label('HST')
->boolean('On', 'Off')
->default(false)
->inline()
->colors([
'true' => 'info',
'false' => 'info',
]),
])->columnSpan(1),
])
->columns(3)
@ -101,16 +111,16 @@ public static function form(Form $form): Form
->label('ID')
->content(fn (Invoice $record): ?string => $record->internal_id),
Placeholder::make('Tax Rates')
->content(fn (Invoice $record): ?string => $record->gst_rate.'% GST, '.$record->pst_rate.'% PST'),
Placeholder::make('Tax Rates '.'(if applicable)')
->content(fn (Invoice $record): ?string => $record->gst_rate.'% GST, '.$record->pst_rate.'% PST, '.$record->hst_rate.'% HST'),
Placeholder::make('created_at')
->label('Created')
->content(fn (Invoice $record): ?string => $record->created_at?->diffForHumans()),
->content(fn (Invoice $record): ?string => $record->created_at->format('Y-m-d')),
Placeholder::make('updated_at')
->label('Last modified')
->content(fn (Invoice $record): ?string => $record->updated_at?->diffForHumans()),
->content(fn (Invoice $record): ?string => $record->updated_at->format('Y-m-d')),
])
->columnSpan(1)
@ -156,9 +166,10 @@ public static function table(Table $table): Table
TextColumn::make('has_gst')
->label('GST')
->money()
->formatStateUsing(function (Invoice $record) {
if ($record->has_gst) {
return '$'.$record->gst_amount;
return '$'.number_format($record->gst_amount, 2);
}
return '-';
@ -169,7 +180,18 @@ public static function table(Table $table): Table
->label('PST')
->formatStateUsing(function (Invoice $record) {
if ($record->has_pst) {
return '$'.$record->pst_amount;
return '$'.number_format($record->pst_amount, 2);
}
return '-';
})
->alignRight(),
TextColumn::make('has_hst')
->label('HST')
->money()
->formatStateUsing(function (Invoice $record) {
if ($record->has_hst) {
return '$'.number_format($record->hst_amount, 2);
}
return '-';

@ -6,6 +6,7 @@
use App\Models\User;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@ -48,7 +49,12 @@ public static function form(Form $form): Form
->required(fn (string $operation) => $operation === 'create'),
Checkbox::make('is_admin')
->disabled(fn (User $record) => auth()->user()->id === $record->id),
->disabled(fn (?User $record, $operation) => $operation !== 'create' && auth()->user()->id === $record->id),
Select::make('customer_id')
->relationship('customer', 'company_name')
->searchable()
->preload(),
]),
]);
}

@ -6,6 +6,7 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
class Customer extends Model
@ -100,4 +101,9 @@ public function invoices(): HasMany
{
return $this->hasMany(Invoice::class);
}
public function user(): HasOne
{
return $this->hasOne(User::class);
}
}

@ -12,7 +12,6 @@
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Log;
#[ObservedBy(InvoiceObserver::class)]
@ -31,10 +30,13 @@ class Invoice extends Model
'total',
'pst_rate',
'gst_rate',
'hst_rate',
'pst_amount',
'gst_amount',
'hst_amount',
'has_pst',
'has_gst',
'has_hst',
'date',
'due_date',
];
@ -42,11 +44,13 @@ class Invoice extends Model
protected $casts = [
'has_gst' => 'boolean',
'has_pst' => 'boolean',
'has_hst' => 'boolean',
'date' => 'datetime',
'status' => InvoiceStatus::class,
'subtotal' => 'float',
'pst_amount' => 'float',
'gst_amount' => 'float',
'hst_amount' => 'float',
'total' => 'float',
];
@ -60,23 +64,26 @@ public function calculateTotals(): void
$this->subtotal = 0;
$this->gst_amount = 0;
$this->pst_amount = 0;
$this->hst_amount = 0;
$this->total = 0;
return;
}
$subtotal = $this->orders->sum(fn (Order $order) => $order->total_service_price);
Log::debug('subtotal: '.$subtotal);
$this->subtotal = $subtotal;
$this->saveQuietly();
$gstAmount = $this->calculateTaxAmount($subtotal, $this->gst_rate, $this->has_gst);
$pstAmount = $this->calculateTaxAmount($subtotal, $this->pst_rate, $this->has_pst);
$hstAmount = $this->calculateTaxAmount($subtotal, $this->hst_rate, $this->has_hst);
$this->gst_amount = $gstAmount;
$this->pst_amount = $pstAmount;
$this->total = $subtotal + $gstAmount + $pstAmount;
$this->hst_amount = $hstAmount;
$this->total = $subtotal + $gstAmount + $pstAmount + $hstAmount;
$this->saveQuietly();
}

@ -5,6 +5,7 @@
use Database\Factories\UserFactory;
use Filament\Models\Contracts\HasName;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
@ -22,6 +23,7 @@ class User extends Authenticatable implements HasName
'username',
'is_admin',
'password',
'customer_id',
];
/**
@ -50,4 +52,9 @@ public function getFilamentName(): string
{
return $this->username;
}
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
}
}

@ -14,6 +14,7 @@ public function creating(Invoice $invoice): void
{
$invoice->pst_rate = TaxRate::where('name', 'PST')->value('value') ?? 0;
$invoice->gst_rate = TaxRate::where('name', 'GST')->value('value') ?? 0;
$invoice->hst_rate = TaxRate::where('name', 'HST')->value('value') ?? 0;
}
/**

@ -19,10 +19,12 @@ public function definition(): array
return [
'created_at' => Carbon::now()->subDays(rand(1, 30)),
'pst_rate' => TaxRate::where('name', 'PST')->value('value'),
'gst_rate' => TaxRate::where('name', 'GST')->value('value'),
'pst_rate' => TaxRate::where('name', 'PST')->value('value') ?? 0,
'gst_rate' => TaxRate::where('name', 'GST')->value('value') ?? 0,
'hst_rate' => TaxRate::where('name', 'HST')->value('value') ?? 0,
'has_gst' => true,
'has_pst' => $this->faker->boolean(40),
'has_hst' => false,
'date' => Carbon::now()->subDays(rand(1, 60)),
'status' => $this->faker->randomElement(InvoiceStatus::cases())->value,
'customer_id' => $customer->id,

@ -13,6 +13,7 @@ public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->foreignId('customer_id')->nullable()->constrained();
$table->string('username')->unique();
$table->string('password');
$table->boolean('is_admin')->default(0);

@ -21,12 +21,15 @@ public function up(): void
$table->decimal('pst_rate', 8, 2);
$table->decimal('gst_rate', 8, 2);
$table->decimal('hst_rate', 8, 2);
$table->decimal('pst_amount', 8, 2)->nullable();
$table->decimal('gst_amount', 8, 2)->nullable();
$table->decimal('hst_amount', 8, 2)->nullable();
$table->boolean('has_pst')->default(false);
$table->boolean('has_gst')->default(true);
$table->boolean('has_hst')->default(false);
$table->date('date')->default(today());
$table->date('due_date')->nullable();

@ -14,5 +14,6 @@ public function run(): void
{
TaxRate::create(['name' => 'GST', 'value' => 5.00]);
TaxRate::create(['name' => 'PST', 'value' => 7.00]);
TaxRate::create(['name' => 'HST', 'value' => 13.00]);
}
}

@ -19,6 +19,7 @@
$customer = Customer::factory()->create(); // Generates a customer
$pst_rate = TaxRate::where('name', 'PST')->value('value') ?? 0;
$gst_rate = TaxRate::where('name', 'GST')->value('value') ?? 0;
$hst_rate = TaxRate::where('name', 'HST')->value('value') ?? 0;
$formData = [
'customer_id' => $customer->id,
@ -27,6 +28,7 @@
'status' => InvoiceStatus::UNPAID->value,
'has_gst' => true,
'has_pst' => true,
'has_hst' => false,
];
$this->livewire(CreateInvoice::class)
@ -40,8 +42,10 @@
'status' => $formData['status'],
'has_gst' => $formData['has_gst'],
'has_pst' => $formData['has_pst'],
'has_hst' => $formData['has_hst'],
'gst_rate' => $gst_rate,
'pst_rate' => $pst_rate,
'hst_rate' => $hst_rate,
]);
$invoice = Invoice::where('internal_id', 'INV400001')->firstOrFail();