diff --git a/app/Filament/Admin/Resources/InvoiceReportResource.php b/app/Filament/Admin/Resources/InvoiceReportResource.php
index 787e095..3df58fe 100644
--- a/app/Filament/Admin/Resources/InvoiceReportResource.php
+++ b/app/Filament/Admin/Resources/InvoiceReportResource.php
@@ -49,8 +49,10 @@ public static function form(Form $form): Form
DatePicker::make('date_end')
->required()
->default(today()),
- ])->columns(2),
- ]);
+ ])
+ ->columns(2)
+ ->columnSpan(3),
+ ])->columns(3);
}
public static function table(Table $table): Table
@@ -73,15 +75,14 @@ public static function table(Table $table): Table
->label('End Date')
->date('Y-m-d'),
TextColumn::make('total')
- ->label('Balance Due')
->weight(FontWeight::Bold)
->money(),
+ TextColumn::make('balance')
+ ->weight(FontWeight::Bold)
+ ->money(),
+ // ->getStateUsing(fn (Invoice))
])
- ->defaultSort('id', 'desc')
-
- ->filters([
- ])
- ->actions([]);
+ ->defaultSort('id', 'desc');
}
public static function canAccess(): bool
diff --git a/app/Filament/Admin/Resources/InvoiceResource.php b/app/Filament/Admin/Resources/InvoiceResource.php
index 80ea3aa..fa0e94b 100644
--- a/app/Filament/Admin/Resources/InvoiceResource.php
+++ b/app/Filament/Admin/Resources/InvoiceResource.php
@@ -112,7 +112,7 @@ public static function form(Form $form): Form
->content(fn (Invoice $record): ?string => $record->internal_id),
Placeholder::make('Amounts')
- ->content(fn (Invoice $record): ?string => 'Total: $'.$record->total.', balance: $'.$record->remainingBalance()),
+ ->content(fn (Invoice $record): ?string => 'Total: $'.number_format($record->total, 2).', balance: $'.number_format($record->remainingBalance(), 2)),
Placeholder::make('Tax Rates when created')
->content(fn (Invoice $record): ?string => $record->gst_rate.'% GST, '.$record->pst_rate.'% PST, '.$record->hst_rate.'% HST'),
@@ -123,7 +123,8 @@ public static function form(Form $form): Form
])
->columnSpan(1)
- ->hidden(fn (?Invoice $record) => $record === null),
+ ->hidden(fn (?Invoice $record) => $record === null)
+ ->extraAttributes(['class' => 'h-full']),
])
->columns(3)
diff --git a/app/Filament/Admin/Resources/OrderResource.php b/app/Filament/Admin/Resources/OrderResource.php
index 854342c..3d0b939 100644
--- a/app/Filament/Admin/Resources/OrderResource.php
+++ b/app/Filament/Admin/Resources/OrderResource.php
@@ -28,6 +28,7 @@
use Filament\Resources\Resource;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables;
+use Filament\Tables\Columns\IconColumn\IconColumnSize;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Guava\FilamentClusters\Forms\Cluster;
@@ -118,6 +119,10 @@ public static function form(Form $form): Form
->label('Order ID')
->content(fn (Order $record): ?string => $record->internal_po),
+ Placeholder::make('total_service_price')
+ ->label('Total service price')
+ ->content(fn (Order $record): ?string => '$'.number_format($record->total_service_price, 2)),
+
Placeholder::make('created_at')
->label('Created')
->content(fn (Order $record): ?string => $record->created_at?->diffForHumans()),
@@ -127,7 +132,8 @@ public static function form(Form $form): Form
->content(fn (Order $record): ?string => $record->updated_at?->diffForHumans()),
])
->columnSpan(1)
- ->hidden(fn (?Order $record) => $record === null),
+ ->hidden(fn (?Order $record) => $record === null)
+ ->extraAttributes(['class' => 'h-full']),
])
->columns(6)
->columnSpan(2),
@@ -144,21 +150,29 @@ public static function form(Form $form): Form
->datalist(OrderProduct::all()->unique('color')->pluck('color')->toArray()),
Cluster::make([
TextInput::make('xs')
- ->placeholder('xs'),
+ ->placeholder('xs')
+ ->rules('numeric'),
TextInput::make('s')
- ->placeholder('s'),
+ ->placeholder('s')
+ ->rules('numeric'),
TextInput::make('m')
- ->placeholder('m'),
+ ->placeholder('m')
+ ->rules('numeric'),
TextInput::make('l')
- ->placeholder('l'),
+ ->placeholder('l')
+ ->rules('numeric'),
TextInput::make('xl')
- ->placeholder('xl'),
+ ->placeholder('xl')
+ ->rules('numeric'),
TextInput::make('2xl')
- ->placeholder('2xl'),
+ ->placeholder('2xl')
+ ->rules('numeric'),
TextInput::make('3xl')
- ->placeholder('3xl'),
+ ->placeholder('3xl')
+ ->rules('numeric'),
TextInput::make('osfa')
- ->placeholder('osfa'),
+ ->placeholder('osfa')
+ ->rules('numeric'),
])
->label('Sizes'),
])
@@ -197,13 +211,16 @@ public static function form(Form $form): Form
->label('Logo Name'),
TextInput::make('serviceFileSetupNumber')
->label('Setup')
- ->columnSpan(1),
+ ->columnSpan(1)
+ ->rules('numeric'),
Cluster::make([
TextInput::make('serviceFileWidth')
- ->prefix('w'),
+ ->prefix('w')
+ ->rules('numeric'),
TextInput::make('serviceFileHeight')
- ->prefix('h'),
+ ->prefix('h')
+ ->rules('numeric'),
])
->label('Dimensions (inches)')
->columnSpan(4),
@@ -212,12 +229,14 @@ public static function form(Form $form): Form
->label('Quantity')
->live()
->prefix('#')
- ->columnSpan(2),
+ ->columnSpan(2)
+ ->rules('numeric'),
TextInput::make('amount_price')
->label('Amount')
->prefix('$')
- ->columnSpan(2),
+ ->columnSpan(2)
+ ->rules('numeric'),
]),
Grid::make(9)
@@ -254,7 +273,7 @@ public static function table(Table $table): Table
? 'lucide-calendar-clock' : ($record->rush
? OrderAttributes::rush->getIcon() : null);
})
- ->size(Tables\Columns\IconColumn\IconColumnSize::Medium),
+ ->size(IconColumnSize::Medium),
TextColumn::make('internal_po')
->label('Internal PO')
diff --git a/app/Filament/Admin/Resources/TaxRateResource.php b/app/Filament/Admin/Resources/TaxRateResource.php
index 64d1a62..09197b3 100644
--- a/app/Filament/Admin/Resources/TaxRateResource.php
+++ b/app/Filament/Admin/Resources/TaxRateResource.php
@@ -51,7 +51,8 @@ public static function form(Form $form): Form
->content(fn (TaxRate $record): ?string => $record->updated_at?->diffForHumans()),
])
->columnSpan(1)
- ->hidden(fn (?TaxRate $record) => $record === null),
+ ->hidden(fn (?TaxRate $record) => $record === null)
+ ->extraAttributes(['class' => 'h-full']),
])->columns(3);
}
@@ -93,9 +94,9 @@ public static function canAccess(): bool
public static function getPages(): array
{
return [
- 'index' => Pages\ListTaxRates::route('/'),
- 'create' => Pages\CreateTaxRate::route('/create'),
- 'edit' => Pages\EditTaxRate::route('/{record}/edit'),
+ 'index' => Pages\ListTaxRates::route('/'),
+ // 'create' => Pages\CreateTaxRate::route('/create'),
+ // 'edit' => Pages\EditTaxRate::route('/{record}/edit'),
];
}
}
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 7ccc41f..9052d1f 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -45,7 +45,8 @@ class Invoice extends Model
'has_gst' => 'boolean',
'has_pst' => 'boolean',
'has_hst' => 'boolean',
- 'date' => 'datetime',
+ 'date' => 'date',
+ 'due_date' => 'date',
'status' => InvoiceStatus::class,
'subtotal' => 'float',
'pst_amount' => 'float',
diff --git a/app/Models/InvoiceReport.php b/app/Models/InvoiceReport.php
index e2ddd65..3570faf 100644
--- a/app/Models/InvoiceReport.php
+++ b/app/Models/InvoiceReport.php
@@ -25,6 +25,7 @@ class InvoiceReport extends Model
protected $appends = [
'total',
+ 'balance',
];
protected $casts = [
@@ -61,6 +62,11 @@ public function getTotalAttribute()
return $this->invoices()->sum('total');
}
+ public function getBalanceAttribute()
+ {
+ return $this->invoices->sum(fn (Invoice $invoice) => $invoice->remainingBalance());
+ }
+
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
diff --git a/app/Models/OrderProduct.php b/app/Models/OrderProduct.php
index b00f3ea..843503d 100644
--- a/app/Models/OrderProduct.php
+++ b/app/Models/OrderProduct.php
@@ -21,6 +21,8 @@ class OrderProduct extends Model
'color',
];
+ protected $touches = ['order'];
+
public function totalQuantity(): int
{
return array_sum($this->productSizes()->pluck('amount')->toArray());
diff --git a/app/Models/ProductService.php b/app/Models/ProductService.php
index c1b8d24..811263a 100644
--- a/app/Models/ProductService.php
+++ b/app/Models/ProductService.php
@@ -33,6 +33,8 @@ class ProductService extends Model
'price',
];
+ protected $touches = ['order'];
+
public function getPriceAttribute(): float
{
return number_format($this->amount * $this->amount_price, 2);
diff --git a/app/Observers/InvoiceObserver.php b/app/Observers/InvoiceObserver.php
index b5d86a3..2c86548 100644
--- a/app/Observers/InvoiceObserver.php
+++ b/app/Observers/InvoiceObserver.php
@@ -23,7 +23,7 @@ public function creating(Invoice $invoice): void
public function created(Invoice $invoice): void
{
- $invoice->internal_id = 'INV4'.str_pad($invoice->id, 5, '0', STR_PAD_LEFT);
+ $invoice->internal_id = 'INV4'.str_pad($invoice->id, 4, '0', STR_PAD_LEFT);
$invoice->saveQuietly();
$invoice->calculateTotals();
diff --git a/public/invoicereport-tnr0005.pdf b/public/invoicereport-tnr0005.pdf
index 6072b7d..79dffc5 100644
Binary files a/public/invoicereport-tnr0005.pdf and b/public/invoicereport-tnr0005.pdf differ
diff --git a/resources/views/pdf/invoice-report.blade.php b/resources/views/pdf/invoice-report.blade.php
index eaef590..184b70b 100644
--- a/resources/views/pdf/invoice-report.blade.php
+++ b/resources/views/pdf/invoice-report.blade.php
@@ -72,7 +72,7 @@
- ${{number_format($invoiceReport->total, 2)}}
+ ${{number_format($invoiceReport->balance, 2)}}
@@ -95,10 +95,10 @@
{{Date::make($invoice->created_at)->format('Y-m-d')}} |
{{$invoice->internal_id}} |
- ${{$invoice->subtotal}} |
+ ${{number_format($invoice->subtotal, 2)}} |
${{number_format($invoice->gst_amount, 2)}} |
{{!$invoice->pst_amount ? '-' : '$'.number_format($invoice->pst_amount, 2)}} |
- ${{$invoice->total}} |
+ ${{number_format($invoice->remainingBalance(), 2)}} |
{{$invoice->status->value}} |
@endforeach
diff --git a/resources/views/pdf/invoice.blade.php b/resources/views/pdf/invoice.blade.php
index 78a1aac..c2645c1 100644
--- a/resources/views/pdf/invoice.blade.php
+++ b/resources/views/pdf/invoice.blade.php
@@ -30,9 +30,9 @@
BILL TO
- {{$invoice->customer->company_name}}
- {{$invoice->customer->billing_address_line_1}}
- {{$invoice->customer->billing_address_line_2}}
+ {{$invoice->customer->company_name ?? ''}}
+ {{$invoice->customer->billing_address_line_1 ?? ''}}
+ {{$invoice->customer->billing_address_line_2 ?? ''}}
@@ -50,13 +50,19 @@
- {{$invoice->internal_id}}
+ @if(isset($invoice->internal_id))
+ {{$invoice->internal_id}}
+ @endif
- {{$invoice->date}}
+ @if(isset($invoice->date))
+ {{$invoice->date->format('Y-m-d')}}
+ @endif
- {{$invoice->due_date}}
+ @if(isset($invoice->due_date))
+ {{$invoice->due_date->format('Y-m-d')}}
+ @endif
@@ -110,7 +116,7 @@
${{number_format($invoice->pst_amount, 2)}}
${{number_format($invoice->total, 2)}}
- ${{number_format($invoice->total, 2)}}
+ ${{number_format($invoice->remainingBalance(), 2)}}
diff --git a/resources/views/pdf/order.blade.php b/resources/views/pdf/order.blade.php
index 88e8868..bc4820f 100644
--- a/resources/views/pdf/order.blade.php
+++ b/resources/views/pdf/order.blade.php
@@ -1,6 +1,6 @@
@extends('layouts.pdf')
-
Top Notch Order {{$order->internal_po}}
+
Top Notch Order {{$order->internal_po ?? ''}}
@@ -135,7 +135,7 @@
-
+
SKU |
Product Name |
@@ -183,7 +183,7 @@
-
+
Placement & Service |
Logo Name & Instructions |
@@ -201,7 +201,7 @@
-
+
{{$service->serviceFile->code}}
diff --git a/tests/Unit/InvoiceTest.php b/tests/Unit/InvoiceTest.php
index 4fc13fd..63ecc94 100644
--- a/tests/Unit/InvoiceTest.php
+++ b/tests/Unit/InvoiceTest.php
@@ -50,7 +50,7 @@
->assertHasNoErrors();
$this->assertDatabaseHas('invoices', [
- 'internal_id' => 'INV400001',
+ 'internal_id' => 'INV40001',
'customer_id' => $formData['customer_id'],
'status' => $formData['status'],
'has_gst' => $formData['has_gst'],
@@ -61,7 +61,7 @@
'hst_rate' => $hst_rate,
]);
- $invoice = Invoice::where('internal_id', 'INV400001')->firstOrFail();
+ $invoice = Invoice::where('internal_id', 'INV40001')->firstOrFail();
$this->assertEquals($invoice->orders->isEmpty(), true);
});
diff --git a/tests/Unit/QuoteTest.php b/tests/Unit/QuoteTest.php
index 474d958..7e7a0c6 100644
--- a/tests/Unit/QuoteTest.php
+++ b/tests/Unit/QuoteTest.php
@@ -88,7 +88,10 @@
'width' => 1.5,
'height' => 2.5,
'color_amount' => 2,
- 'color_match' => 5.10,
+ 'setup_amount' => 2,
+ 'run_charge' => 10,
+ 'color_match' => true,
+ 'color_change' => true,
'flash' => 5.20,
'fleece' => 5.30,
'poly_ink' => 5.40,