diff --git a/app/Filament/Guest/Pages/ContactUs.php b/app/Filament/Guest/Pages/ContactUs.php
new file mode 100644
index 0000000..a0ac792
--- /dev/null
+++ b/app/Filament/Guest/Pages/ContactUs.php
@@ -0,0 +1,14 @@
+schema([
+ Placeholder::make('homeContent')
+ ->hiddenLabel()
+ ->content(new HtmlString),
+ ]),
+ ];
+ }
+}
diff --git a/app/Filament/Guest/Pages/Vinyl.php b/app/Filament/Guest/Pages/Vinyl.php
new file mode 100644
index 0000000..5e2e260
--- /dev/null
+++ b/app/Filament/Guest/Pages/Vinyl.php
@@ -0,0 +1,14 @@
+extraHeaderAttributes(['class' => 'w-full']),
Tables\Columns\TextColumn::make('subtotal')
- ->money('usd')
+ ->money()
->alignRight()
->getStateUsing(function (Table $table, Model $record) {
return $record->getSubtotalAttribute(
@@ -53,7 +53,7 @@ public static function table(Table $table): Table
Tables\Columns\TextColumn::make('gst')
->label('GST')
- ->money('usd')
+ ->money()
->alignRight()
->getStateUsing(function (Table $table, Model $record) {
return $record->getGstAttribute(
@@ -64,7 +64,7 @@ public static function table(Table $table): Table
Tables\Columns\TextColumn::make('pst')
->label('PST')
- ->money('usd')
+ ->money()
->alignRight()
->getStateUsing(function (Table $table, Model $record) {
return $record->getPstAttribute(
@@ -74,7 +74,7 @@ public static function table(Table $table): Table
}),
Tables\Columns\TextColumn::make('total')
- ->money('usd')
+ ->money()
->weight('bold')
->alignRight()
->getStateUsing(function (Table $table, Model $record) {
diff --git a/app/Filament/Resources/InvoiceReportResource.php b/app/Filament/Resources/InvoiceReportResource.php
index e53aa51..cdac257 100644
--- a/app/Filament/Resources/InvoiceReportResource.php
+++ b/app/Filament/Resources/InvoiceReportResource.php
@@ -11,6 +11,7 @@
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Support\Enums\FontFamily;
+use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
@@ -72,24 +73,15 @@ public static function table(Table $table): Table
->label('End Date')
->date('Y-m-d'),
TextColumn::make('total')
+ ->label('Balance Due')
+ ->weight(FontWeight::Bold)
->money(),
])
- ->defaultSort('created_at', 'desc')
+ ->defaultSort('id', 'desc')
->filters([
])
->actions([]);
- // ->defaultGroup(
- // Group::make('date')
- // ->getKeyFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('Y-m-0'))
- // ->getTitleFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('F Y'))
- // ->orderQueryUsing(function (Builder $query) {
- //
- // return $query->join('invoices', 'orders.invoice_id', '=', 'invoices.id')
- // ->orderBy('invoices.date', 'desc');
- // })
- // ->titlePrefixedWithLabel(false),
- // );
}
public static function getRelations(): array
@@ -103,8 +95,8 @@ public static function getPages(): array
{
return [
'index' => Pages\ListInvoiceReports::route('/'),
- 'edit' => Pages\EditInvoiceReport::route('/{record}/edit'),
'create' => Pages\CreateInvoiceReport::route('/create'),
+ 'view' => Pages\ViewInvoiceReport::route('/{record}'),
];
}
}
diff --git a/app/Filament/Resources/InvoiceReportResource/Pages/ViewInvoiceReport.php b/app/Filament/Resources/InvoiceReportResource/Pages/ViewInvoiceReport.php
index 7a28647..7d621bc 100644
--- a/app/Filament/Resources/InvoiceReportResource/Pages/ViewInvoiceReport.php
+++ b/app/Filament/Resources/InvoiceReportResource/Pages/ViewInvoiceReport.php
@@ -3,6 +3,8 @@
namespace App\Filament\Resources\InvoiceReportResource\Pages;
use App\Filament\Resources\InvoiceReportResource;
+use App\Models\InvoiceReport;
+use Filament\Actions\Action;
use Filament\Resources\Pages\ViewRecord;
class ViewInvoiceReport extends ViewRecord
@@ -14,6 +16,10 @@ class ViewInvoiceReport extends ViewRecord
protected function getHeaderActions(): array
{
return [
+ Action::make('print')
+ ->icon('lucide-printer')
+ ->url(fn (InvoiceReport $record) => route('pdf.invoice-report', $record))
+ ->openUrlInNewTab(),
];
}
}
diff --git a/app/Filament/Resources/InvoiceReportResource/RelationManagers/InvoicesRelationManager.php b/app/Filament/Resources/InvoiceReportResource/RelationManagers/InvoicesRelationManager.php
index 993f67a..6f12540 100644
--- a/app/Filament/Resources/InvoiceReportResource/RelationManagers/InvoicesRelationManager.php
+++ b/app/Filament/Resources/InvoiceReportResource/RelationManagers/InvoicesRelationManager.php
@@ -2,10 +2,12 @@
namespace App\Filament\Resources\InvoiceReportResource\RelationManagers;
+use App\Filament\Resources\InvoiceResource;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
-use Filament\Tables;
+use Filament\Support\Enums\FontWeight;
+use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class InvoicesRelationManager extends RelationManager
@@ -26,25 +28,44 @@ public function table(Table $table): Table
{
return $table
->recordTitleAttribute('internal_id')
+ ->recordUrl(fn ($record) => InvoiceResource::getUrl('edit', ['record' => $record->id]))
->columns([
- Tables\Columns\TextColumn::make('internal_id'),
+ TextColumn::make('internal_id')
+ ->label('ID')
+ ->extraHeaderAttributes(['class' => 'w-full'])
+ ->color('primary'),
+ TextColumn::make('date')
+ ->label('Created')
+ ->date(),
+ TextColumn::make('subtotal')
+ ->alignRight()
+ ->money(),
+ TextColumn::make('gst_amount')
+ ->label('GST')
+ ->alignRight()
+ ->money(),
+ TextColumn::make('pst_amount')
+ ->label('PST')
+ ->alignRight()
+ ->formatStateUsing(function ($state) {
+ return $state == 0.00 ? '-' : '$'.$state;
+ }),
+ TextColumn::make('total')
+ ->label('Balance Due')
+ ->alignRight()
+ ->money()
+ ->weight(FontWeight::Bold),
+ TextColumn::make('status'),
])
->filters([
//
])
->headerActions([
- // Tables\Actions\CreateAction::make(),
- Tables\Actions\AssociateAction::make(),
])
+ ->defaultSort('invoices.id')
->actions([
- Tables\Actions\DissociateAction::make(),
- // Tables\Actions\EditAction::make(),
- // Tables\Actions\DeleteAction::make(),
])
->bulkActions([
- // Tables\Actions\BulkActionGroup::make([
- // Tables\Actions\DeleteBulkAction::make(),
- // ]),
]);
}
}
diff --git a/app/Filament/Resources/InvoiceReportResource/RelationManagers/OrdersRelationManager.php b/app/Filament/Resources/InvoiceReportResource/RelationManagers/OrdersRelationManager.php
deleted file mode 100644
index b3abd8e..0000000
--- a/app/Filament/Resources/InvoiceReportResource/RelationManagers/OrdersRelationManager.php
+++ /dev/null
@@ -1,48 +0,0 @@
-schema([
- Forms\Components\TextInput::make('customer_po')
- ->required()
- ->maxLength(255),
- ]);
- }
-
- public function table(Table $table): Table
- {
- return $table
- ->recordTitleAttribute('customer_po')
- ->columns([
- Tables\Columns\TextColumn::make('customer_po'),
- ])
- ->filters([
- //
- ])
- ->headerActions([
- Tables\Actions\CreateAction::make(),
- ])
- ->actions([
- Tables\Actions\EditAction::make(),
- Tables\Actions\DeleteAction::make(),
- ])
- ->bulkActions([
- Tables\Actions\BulkActionGroup::make([
- Tables\Actions\DeleteBulkAction::make(),
- ]),
- ]);
- }
-}
diff --git a/app/Filament/Resources/InvoiceResource.php b/app/Filament/Resources/InvoiceResource.php
index 8c29bf7..847b3af 100644
--- a/app/Filament/Resources/InvoiceResource.php
+++ b/app/Filament/Resources/InvoiceResource.php
@@ -10,6 +10,8 @@
use App\Models\Invoice;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Grid;
+use Filament\Forms\Components\Group;
+use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Split;
@@ -36,56 +38,83 @@ public static function form(Form $form): Form
{
return $form
->schema([
- Section::make([
- Grid::make(2)
- ->schema([
- Select::make('customer_id')
- ->required()
- ->label('Customer')
- ->options(Customer::all()->pluck('company_name', 'id'))
- ->reactive()
- ->searchable()
- ->disabledOn('edit')
- ->columnSpan(2),
+ Group::make()
+ ->schema([
+ Section::make([
+ Grid::make(2)
+ ->schema([
+ Select::make('customer_id')
+ ->required()
+ ->label('Customer')
+ ->options(Customer::all()->pluck('company_name', 'id'))
+ ->reactive()
+ ->searchable()
+ ->disabledOn('edit')
+ ->columnSpan(2),
- Split::make([
- DatePicker::make('date')
- ->required()
- ->default(today()),
- DatePicker::make('due_date'),
+ Split::make([
+ DatePicker::make('date')
+ ->required()
+ ->default(today()),
+ DatePicker::make('due_date'),
+ ])
+ ->columnSpan(2),
+
+ ToggleButtons::make('status')
+ ->options(InvoiceStatus::class)
+ ->required()
+ ->inline()
+ ->default(InvoiceStatus::UNPAID)
+ ->columnSpan(2),
+ // Select::make('status')
+ // ->options(InvoiceStatus::class)
+ // ->searchable()
+ // ->required()
+ // ->default(InvoiceStatus::UNPAID),
+ ])->columnSpan(2),
+
+ Grid::make(1)
+ ->schema([
+ ToggleButtons::make('gst')
+ ->boolean()
+ ->default(true)
+ ->inline()
+ ->colors([
+ 'true' => 'info',
+ 'false' => 'info',
+ ]),
+
+ ToggleButtons::make('pst')
+ ->boolean()
+ ->default(false)
+ ->inline()
+ ->colors([
+ 'true' => 'info',
+ 'false' => 'info',
+ ]),
+ ])->columnSpan(1),
+ ])
+ ->columns(3)
+ ->columnSpan(2),
+
+ Section::make()
+ ->schema([
+ Placeholder::make('created_at')
+ ->label('Created at')
+ ->content(fn (Invoice $record): ?string => $record->created_at?->diffForHumans()),
+
+ Placeholder::make('updated_at')
+ ->label('Last modified at')
+ ->content(fn (Invoice $record): ?string => $record->updated_at?->diffForHumans()),
])
- ->columnSpan(2),
- Select::make('status')
- ->options(InvoiceStatus::class)
- ->searchable()
- ->required()
- ->default(InvoiceStatus::UNPAID),
- ])->columnSpan(2),
+ ->columnSpan(1)
+ ->hidden(fn (?Invoice $record) => $record === null),
- Grid::make(1)
- ->schema([
- ToggleButtons::make('gst')
- ->boolean()
- ->default(true)
- ->inline()
- ->colors([
- 'true' => 'info',
- 'false' => 'info',
- ]),
-
- ToggleButtons::make('pst')
- ->boolean()
- ->default(false)
- ->inline()
- ->colors([
- 'true' => 'info',
- 'false' => 'info',
- ]),
- ])->columnSpan(1),
- ])
+ ])
->columns(3)
- ->columnSpan(3),
- ])->columns(3);
+ ->columnSpan(2),
+
+ ])->columns(2);
}
public static function table(Table $table): Table
@@ -97,22 +126,33 @@ public static function table(Table $table): Table
->fontFamily('mono')
->color('primary')
->sortable()
- ->searchable(),
+ ->searchable(query: function (Builder $query, $search) {
+ return $query->where('internal_id', 'like', "%{$search}%")
+ ->orWhereHas('orders', function (Builder $query) use ($search) {
+ return $query->where('customer_po', 'like', "%{$search}%")
+ ->orWhere('internal_po', 'like', "%{$search}%");
+ });
+ }),
+
Tables\Columns\TextColumn::make('customer.company_name')
->sortable()
->extraHeaderAttributes(['class' => 'w-full'])
->searchable(),
+
Tables\Columns\TextColumn::make('created_at')
->label('Created')
->date()
->sortable(),
+
Tables\Columns\TextColumn::make('subtotal')
- ->money('USD')
+ ->money()
->alignRight(),
+
Tables\Columns\TextColumn::make('gst_amount')
->label('GST')
- ->money('USD')
+ ->money()
->alignRight(),
+
Tables\Columns\TextColumn::make('pst_amount')
->label('PST')
->formatStateUsing(function ($state) {
@@ -120,7 +160,8 @@ public static function table(Table $table): Table
})
->alignRight(),
Tables\Columns\TextColumn::make('total')
- ->money('USD')
+ ->label('Balance')
+ ->money()
->weight('bold')
->alignRight(),
Tables\Columns\TextColumn::make('status')
@@ -157,11 +198,10 @@ public static function table(Table $table): Table
'status',
])
- ->defaultSort('created_at', 'desc')
+ ->defaultSort('id', 'desc')
->actions([
Tables\Actions\EditAction::make(),
- //todo: generate report pdf
])
->bulkActions([
diff --git a/app/Filament/Resources/InvoiceResource/Pages/EditInvoice.php b/app/Filament/Resources/InvoiceResource/Pages/EditInvoice.php
index 8d17fa6..8751956 100644
--- a/app/Filament/Resources/InvoiceResource/Pages/EditInvoice.php
+++ b/app/Filament/Resources/InvoiceResource/Pages/EditInvoice.php
@@ -23,4 +23,15 @@ protected function getHeaderActions(): array
->icon('lucide-trash-2'),
];
}
+
+ // protected function after(array $data): array
+ // {
+ // $invoice = Invoice::findOrFail($data['id']);
+ //
+ // if ($invoice->invoiceReports()->count() > 0) {
+ // foreach ($invoice->invoiceReports as $report) {
+ // $report->updateTotalBalance();
+ // }
+ // }
+ // }
}
diff --git a/app/Filament/Resources/InvoiceResource/RelationManagers/OrdersRelationManager.php b/app/Filament/Resources/InvoiceResource/RelationManagers/OrdersRelationManager.php
index d36d1fc..046720a 100644
--- a/app/Filament/Resources/InvoiceResource/RelationManagers/OrdersRelationManager.php
+++ b/app/Filament/Resources/InvoiceResource/RelationManagers/OrdersRelationManager.php
@@ -2,9 +2,11 @@
namespace App\Filament\Resources\InvoiceResource\RelationManagers;
+use App\Filament\Resources\OrderResource;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
+use Filament\Support\Enums\FontFamily;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
@@ -27,18 +29,27 @@ public function table(Table $table): Table
{
return $table
->recordTitleAttribute('customer_po')
+ ->recordUrl(fn ($record) => OrderResource::getUrl('edit', ['record' => $record->id]))
->columns([
+ Tables\Columns\TextColumn::make('internal_po')
+ ->label('Internal PO')
+ ->color('primary')
+ ->fontFamily(FontFamily::Mono),
+
Tables\Columns\TextColumn::make('customer_po')
+ ->label('Customer PO')
->color('code')
->weight('bold')
->extraHeaderAttributes(['class' => 'w-full']),
+
Tables\Columns\TextColumn::make('total_product_quantity')
->label('Total QTY')
->alignRight(),
+
Tables\Columns\TextColumn::make('total_service_price')
->alignRight()
->label('Total price')
- ->money('usd'),
+ ->money(),
])
->filters([
//
diff --git a/app/Filament/Resources/OrderResource.php b/app/Filament/Resources/OrderResource.php
index 4d6192c..dc7e18c 100644
--- a/app/Filament/Resources/OrderResource.php
+++ b/app/Filament/Resources/OrderResource.php
@@ -9,9 +9,14 @@
use App\Models\Contact;
use App\Models\Customer;
use App\Models\Order;
+use App\Models\OrderProduct;
+use App\Models\ProductService;
+use App\Models\ServiceFile;
use App\Models\ServiceType;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Grid;
+use Filament\Forms\Components\Group;
+use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
@@ -20,15 +25,16 @@
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Form;
-use Filament\Forms\Get;
-use Filament\Forms\Set;
+use Filament\Notifications\Notification;
use Filament\Resources\Resource;
+use Filament\Support\Enums\MaxWidth;
use Filament\Tables;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Guava\FilamentClusters\Forms\Cluster;
use Icetalker\FilamentTableRepeater\Forms\Components\TableRepeater;
use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
class OrderResource extends Resource
{
@@ -41,87 +47,108 @@ class OrderResource extends Resource
public static function form(Form $form): Form
{
return $form->schema([
- Section::make([
+ Group::make()
+ ->schema([
+ Section::make([
+ Grid::make(1)
+ ->schema([
+ Select::make('order_type')
+ ->required()
+ ->options(OrderType::class)
+ ->searchable(),
- Grid::make(1)
- ->schema([
- Select::make('order_type')
- ->required()
- ->options(OrderType::class)
- ->searchable(),
+ // Split::make([
+ Select::make('customer_id')
+ ->required()
+ ->label('Customer')
+ ->options(Customer::all()->pluck('company_name', 'id'))
+// ->reactive()
+ ->searchable(),
- Split::make([
- Select::make('customer_id')
- ->required()
- ->label('Customer')
- ->options(Customer::all()->pluck('company_name', 'id'))
- ->reactive()
- ->searchable(),
+ // Select::make('contact_id')
+ // ->label('Contact')
+ // ->options(fn ($get): array => Contact::where('customer_id', $get('customer_id') ?? null)
+ // ->get()
+ // ->pluck('full_name', 'id')
+ // ->toArray())
+ // ->searchable(),
+ // ]),
- Select::make('contact_id')
- ->label('Contact')
- ->options(fn ($get): array => Contact::where('customer_id', $get('customer_id') ?? null)
- ->get()
- ->pluck('full_name', 'id')
- ->toArray())
- ->searchable(),
- ]),
+ TextInput::make('customer_po')
+ ->required()
+ ->label('Customer PO'),
- TextInput::make('customer_po')
- ->required()
- ->label('Customer PO'),
+ Split::make([
+ DatePicker::make('order_date')
+ ->required()
+ ->default(today()),
+ DatePicker::make('due_date')
+ ->required()
+ ->default(today()->add('10 days')),
+ ]),
- Split::make([
- DatePicker::make('order_date')
- ->required()
- ->default(today()),
- DatePicker::make('due_date')
- ->required()
- ->default(today()->add('10 days')),
- ]),
+ Textarea::make('notes')
+ ->rows(3),
- Textarea::make('notes')
- ->rows(3),
+ ])->columnSpan(1),
- ])->columnSpan(1),
+ Grid::make(1)
+ ->schema([
+ ToggleButtons::make('status')
+ ->required()
+ ->default(OrderStatus::DRAFT->value)
+ ->options(OrderStatus::class)
+ ->inline(),
- Grid::make(1)
- ->schema([
- ToggleButtons::make('status')
- ->required()
- ->default(OrderStatus::DRAFT->value)
- ->options(OrderStatus::class)
- ->inline(),
+ ToggleButtons::make('order_attributes')
+ ->options(OrderAttributes::class)
+ ->multiple()
+ ->inline(),
- ToggleButtons::make('order_attributes')
- ->options(OrderAttributes::class)
- ->multiple()
- ->inline(),
+ ToggleButtons::make('printed')
+ ->boolean()
+ ->default(false)
+ ->inline(),
+ ToggleButtons::make('pre_production')
+ ->label('Pre-production')
+ ->default(false)
+ ->boolean()
+ ->inline()
+ ->colors([
+ 'true' => 'info',
+ 'false' => 'info',
+ ]),
- ToggleButtons::make('printed')
- ->boolean()
- ->default(false)
- ->inline(),
- ToggleButtons::make('pre_production')
- ->label('Pre-production')
- ->default(false)
- ->boolean()
- ->inline()
- ->colors([
- 'true' => 'info',
- 'false' => 'info',
- ]),
+ ])->columnSpan(1),
+ ])->columns(2)
+ ->columnSpan(fn (?Order $record) => $record === null ? 4 : 3),
- ])->columnSpan(1),
- ])->columns(2),
+ Section::make()
+ ->schema([
+ Placeholder::make('created_at')
+ ->label('Created')
+ ->content(fn (Order $record): ?string => $record->created_at?->diffForHumans()),
+
+ Placeholder::make('updated_at')
+ ->label('Last modified')
+ ->content(fn (Order $record): ?string => $record->updated_at?->diffForHumans()),
+ ])
+ ->columnSpan(1)
+ ->hidden(fn (?Order $record) => $record === null),
+ ])
+ ->columns(4)
+ ->columnSpan(2),
TableRepeater::make('order_products')
->label('Garments')
->schema([
- TextInput::make('sku'),
+ TextInput::make('sku')
+ ->datalist(OrderProduct::all()->unique('sku')->pluck('sku')->toArray()),
TextInput::make('product_name')
+ ->datalist(OrderProduct::all()->unique('product_name')->pluck('product_name')->toArray())
->required(),
- TextInput::make('color'),
+ TextInput::make('color')
+ ->datalist(OrderProduct::all()->unique('color')->pluck('color')->toArray()),
Cluster::make([
TextInput::make('xs')
->placeholder('xs'),
@@ -151,13 +178,27 @@ public static function form(Form $form): Form
Grid::make(19)
->schema([
Select::make('serviceType')
- ->options(ServiceType::all()->pluck('name', 'id'))
- ->columnSpan(2)
+ ->options(ServiceType::all()->pluck('value', 'id'))
+ ->columnSpan(4)
->placeholder('Select...')
- ->searchable(),
+ ->searchable()
+ ->createOptionForm([
+ TextInput::make('name')
+ ->label('Code')
+ ->placeholder('Abbreviation here (example: \'Emb\'')
+ ->required(),
+ TextInput::make('value')
+ ->placeholder('Full name here (example: \'Embroidery\'')
+ ->required(),
+ ])
+ ->createOptionUsing(function (array $data): int {
+ return ServiceType::create($data)->getKey();
+ }),
TextInput::make('placement')
+ ->datalist(ProductService::all()->unique('placement')->pluck('placement')->toArray())
->columnSpan(3),
TextInput::make('serviceFileName')
+ ->datalist(ServiceFile::all()->unique('name')->pluck('name')->toArray())
->columnSpan(3)
->label('Logo Name'),
TextInput::make('serviceFileSetupNumber')
@@ -170,36 +211,18 @@ public static function form(Form $form): Form
TextInput::make('serviceFileHeight')
->prefix('h'),
])
- ->label('Dimensions')
+ ->label('Dimensions (inches)')
->columnSpan(4),
TextInput::make('amount')
->label('Quantity')
->live()
- ->reactive()
- ->afterStateUpdated(function ($state, Get $get, Set $set) {
- $set('total_price', ($get('amount_price') * $state ?? 0));
- })
- ->afterStateHydrated(function ($state, Get $get, Set $set) {
- $set('total_price', ($get('amount_price') * $state ?? 0));
- })
->prefix('#')
->columnSpan(2),
TextInput::make('amount_price')
+ ->label('Amount')
->prefix('$')
- ->reactive()
- ->afterStateUpdated(function ($state, Get $get, Set $set) {
- $set('total_price', ($get('amount') * $state ?? 0));
- })
- ->afterStateHydrated(function ($state, Get $get, Set $set) {
- $set('total_price', ($get('amount') * $state ?? 0));
- })
- ->columnSpan(2),
-
- TextInput::make('total_price')
- ->prefix('$')
- ->readOnly()
->columnSpan(2),
]),
@@ -207,6 +230,7 @@ public static function form(Form $form): Form
->schema([
TextInput::make('serviceFileCode')
->label('Code')
+ ->datalist(ServiceFile::all()->unique('code')->pluck('code')->toArray())
->columnSpan(1)
->placeholder('A1234'),
@@ -241,7 +265,17 @@ public static function table(Table $table): Table
->label('Internal PO')
->fontFamily('mono')
->color('info')
- ->searchable()
+ ->searchable(query: function (Builder $query, $search) {
+ return $query
+ ->where('internal_po', 'like', "%{$search}%")
+ ->orWhereHas('productServices', function (Builder $query) use ($search) {
+ return $query->where('placement', 'like', "%{$search}%")
+ ->orWhereHas('serviceFile', function (Builder $query) use ($search) {
+ return $query->where('code', 'like', "%{$search}%")
+ ->orWhere('name', 'like', "%{$search}%");
+ });
+ });
+ })
->sortable(),
TextColumn::make('customer.company_name')
@@ -272,9 +306,7 @@ public static function table(Table $table): Table
->searchable()
->sortable(),
])
-
->defaultSort('order_date', 'desc')
-
->filters([
Tables\Filters\Filter::make('order_date')
->form([
@@ -293,12 +325,33 @@ public static function table(Table $table): Table
);
}),
], )
-
->actions([
Tables\Actions\EditAction::make(),
])
-
->bulkActions([
+
+ Tables\Actions\BulkAction::make('updateStatus')
+ ->form([
+ Select::make('status')
+ ->options(OrderStatus::class),
+ ])
+ ->modalHeading('Change selected orders status')
+ ->modalWidth(MaxWidth::Medium)
+ ->action(function (array $data, Collection $records): void {
+ foreach ($records as $record) {
+ $record->status = $data['status'];
+ $record->save();
+ }
+
+ Notification::make()
+ ->title(count($records).' item(s) updated successfully')
+ ->success()
+ ->send();
+ })
+ ->icon('lucide-pen')
+ ->color('info')
+ ->deselectRecordsAfterCompletion(),
+
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
diff --git a/app/Filament/Resources/OrderResource/Pages/EditOrder.php b/app/Filament/Resources/OrderResource/Pages/EditOrder.php
index ce44414..e573046 100644
--- a/app/Filament/Resources/OrderResource/Pages/EditOrder.php
+++ b/app/Filament/Resources/OrderResource/Pages/EditOrder.php
@@ -148,6 +148,9 @@ protected function getHeaderActions(): array
->label('Save changes')
->action('save')
->icon('lucide-save'),
+ Actions\ReplicateAction::make()
+ ->icon('lucide-copy')
+ ->color('info'),
Action::make('print')
->icon('lucide-printer')
->url(fn (Order $record) => route('orders.pdf', $record))
@@ -156,4 +159,9 @@ protected function getHeaderActions(): array
->icon('lucide-trash-2'),
];
}
+
+ // protected function getRedirectUrl(): string
+ // {
+ // return $this->previousUrl ?? $this->getResource()::getUrl('index');
+ // }
}
diff --git a/app/Filament/Resources/OrderResource/Pages/ListOrders.php b/app/Filament/Resources/OrderResource/Pages/ListOrders.php
index a22cb38..02d23cd 100644
--- a/app/Filament/Resources/OrderResource/Pages/ListOrders.php
+++ b/app/Filament/Resources/OrderResource/Pages/ListOrders.php
@@ -36,6 +36,19 @@ public function getTabs(): array
->whereNot('status', OrderStatus::INVOICED)
->count();
}),
+
+ 'unprinted' => Tab::make()
+ ->query(function ($query) {
+ return $query->where('printed', false);
+ })
+ ->icon('lucide-printer')
+ ->badge(function () {
+ $count = Order::where('printed', false)->count();
+
+ return $count > 0 ? $count : null;
+ })
+ ->badgeColor('success'),
+
'overdue' => Tab::make()
->query(function ($query) {
return $query->whereDate('due_date', '<=', today())
@@ -72,26 +85,6 @@ public function getTabs(): array
null => Tab::make('All')
->icon('lucide-layout-grid'),
-
- // 'draft' => Tab::make()
- // ->query(fn ($query) => $query->where('status', OrderStatus::DRAFT->value))
- // ->icon(OrderStatus::DRAFT->getIcon()),
- //
- // 'approved' => Tab::make()
- // ->query(fn ($query) => $query->where('status', OrderStatus::APPROVED->value))
- // ->icon(OrderStatus::APPROVED->getIcon()),
- //
- // 'production' => Tab::make()
- // ->query(fn ($query) => $query->where('status', OrderStatus::PRODUCTION->value))
- // ->icon(OrderStatus::PRODUCTION->getIcon()),
- //
- // 'shipped' => Tab::make()
- // ->query(fn ($query) => $query->where('status', OrderStatus::SHIPPED->value))
- // ->icon(OrderStatus::SHIPPED->getIcon()),
- //
- // 'invoiced' => Tab::make()
- // ->query(fn ($query) => $query->where('status', OrderStatus::INVOICED->value))
- // ->icon(OrderStatus::INVOICED->getIcon()),
];
}
}
diff --git a/app/Filament/Resources/PackingSlipResource.php b/app/Filament/Resources/PackingSlipResource.php
index e93148b..ac5a2dc 100644
--- a/app/Filament/Resources/PackingSlipResource.php
+++ b/app/Filament/Resources/PackingSlipResource.php
@@ -7,6 +7,7 @@
use App\Models\Order;
use App\Models\PackingSlip;
use Filament\Forms\Components\DatePicker;
+use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
@@ -30,19 +31,29 @@ public static function form(Form $form): Form
{
return $form
->schema([
- DatePicker::make('date_received'),
- TextInput::make('amount'),
- Select::make('customer_id')
- ->options(Customer::all()->pluck('company_name', 'id'))
- ->reactive()
- ->searchable(),
- Select::make('order_id')
- ->options(fn ($get): array => Order::where('customer_id', $get('customer_id') ?? null)
- ->get()
- ->pluck('customer_po', 'id')
- ->toArray())
- ->searchable(),
- TextArea::make('contents'),
+ Section::make([
+ DatePicker::make('date_received')
+ ->default(today())
+ ->required(),
+ // TextInput::make('amount')
+ // ->label('Quantity')
+ // ->required(),
+ Select::make('customer_id')
+ ->label('Customer')
+ ->options(Customer::all()->pluck('company_name', 'id'))
+ ->reactive()
+ ->searchable(),
+ Select::make('order_id')
+ ->label('Order')
+ ->required()
+ ->options(fn ($get): array => Order::where('customer_id', $get('customer_id') ?? null)
+ ->get()
+ ->pluck('customer_po', 'id')
+ ->toArray())
+ ->searchable(),
+ TextArea::make('contents'),
+ ])
+ ->columns(2),
]);
}
@@ -58,8 +69,10 @@ public static function table(Table $table): Table
->color('code')
->sortable()
->searchable(),
- TextColumn::make('contents'),
- TextColumn::make('amount'),
+ TextColumn::make('contents')
+ ->extraHeaderAttributes(['class' => 'w-full']),
+ // TextColumn::make('amount')
+ // ->label('Quantity'),
TextColumn::make('order.customer.company_name')
->sortable()
->searchable(),
diff --git a/app/Filament/Resources/QuoteResource.php b/app/Filament/Resources/QuoteResource.php
index 922ddbf..a028e30 100644
--- a/app/Filament/Resources/QuoteResource.php
+++ b/app/Filament/Resources/QuoteResource.php
@@ -6,10 +6,10 @@
use App\Models\Customer;
use App\Models\Order;
use App\Models\Quote;
+use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Split;
-use Filament\Forms\Components\Textarea;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
@@ -47,9 +47,9 @@ public static function form(Form $form): Form
->searchable(),
])->columnSpan(2),
- Textarea::make('body')
- ->columnSpan(2)
- ->rows(8),
+ RichEditor::make('body')
+ ->columnSpan(2),
+ // ->rows(8),
]),
])->columns(3);
}
diff --git a/app/Http/Controllers/PdfController.php b/app/Http/Controllers/PdfController.php
new file mode 100644
index 0000000..af9ec13
--- /dev/null
+++ b/app/Http/Controllers/PdfController.php
@@ -0,0 +1,26 @@
+internal_id.'.pdf');
+
+ Pdf::view('pdf.invoice-report', ['invoiceReport' => $invoiceReport])
+ ->withBrowsershot(function (Browsershot $browsershot) {
+ $browsershot->noSandbox();
+ })
+ ->margins(8, 8, 15, 8)
+ ->footerView('pdf.invoice-report-footer', ['invoiceReport' => $invoiceReport])
+ ->save($url);
+
+ return redirect($url);
+ }
+}
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 9113585..5f553b8 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -8,10 +8,11 @@
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
+use Illuminate\Database\Eloquent\SoftDeletes;
class Invoice extends Model
{
- use HasFactory;
+ use HasFactory, SoftDeletes;
protected $fillable = [
'customer_id',
@@ -41,7 +42,7 @@ public static function boot(): void
parent::boot();
static::created(function ($model) {
- $model->attributes['internal_id'] = $model->generateInternalId($model->id);
+ $model->attributes['internal_id'] = 'TN4'.str_pad($model->id, 4, '0', STR_PAD_LEFT);
$model->save();
});
}
@@ -54,13 +55,13 @@ public function setStatus(InvoiceStatus $status)
}
}
- public function generateInternalId(int $id): string
- {
- $po = str_pad(strval($id), 4, '0', STR_PAD_LEFT);
- $year = date('y');
-
- return 'TN-IN-'.$year.'-'.$po;
- }
+ // public function generateInternalId(int $id): string
+ // {
+ // $po = str_pad(strval($id), 4, '0', STR_PAD_LEFT);
+ // $year = date('y');
+ //
+ // return 'TN-IN-'.$year.'-'.$po;
+ // }
public function calculateTotals(): void
{
diff --git a/app/Models/InvoiceReport.php b/app/Models/InvoiceReport.php
index 7e20a28..596fff2 100644
--- a/app/Models/InvoiceReport.php
+++ b/app/Models/InvoiceReport.php
@@ -2,11 +2,11 @@
namespace App\Models;
+use App\Enums\InvoiceStatus;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
-use Illuminate\Database\Eloquent\Relations\HasManyThrough;
class InvoiceReport extends Model
{
@@ -21,19 +21,47 @@ class InvoiceReport extends Model
'subtotal',
'pst',
'gst',
+ // 'total',
+ ];
+
+ protected $appends = [
'total',
];
+ protected $casts = [
+ 'date_start' => 'date',
+ 'date_end' => 'date',
+ ];
+
public static function boot(): void
{
parent::boot();
- static::created(function ($model) {
- $model->attributes['internal_id'] = 'TN-INR-'.$model->id;
+ static::created(function (InvoiceReport $model) {
+
+ // Set ID after creation
+ $model->attributes['internal_id'] = 'TNR'.str_pad($model->id, 4, '0', STR_PAD_LEFT);
+
+ // Associate all relevant invoices
+ $invoices = Invoice::whereBetween('date', [$model->date_start, $model->date_end])
+ ->where('customer_id', $model->customer_id)
+ ->when($model->filter_paid, function ($query) {
+ $query->whereNot('status', InvoiceStatus::PAID);
+ });
+ $model->invoices()->sync($invoices->pluck('id')->toArray());
+
+ // $model->total = $model->invoices()->where('status', 'UNPAID')->sum('total');
+
+ // Finally, save
$model->save();
});
}
+ public function getTotalAttribute()
+ {
+ return $this->invoices()->sum('total');
+ }
+
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
@@ -44,8 +72,8 @@ public function invoices(): BelongsToMany
return $this->BelongsToMany(Invoice::class);
}
- public function orders(): HasManyThrough
+ public function orders()
{
- return $this->hasManyThrough(Order::class, Invoice::class);
+ return $this->invoices()->with('orders')->get()->pluck('orders')->flatten()->unique('id');
}
}
diff --git a/app/Models/ProductService.php b/app/Models/ProductService.php
index 41e284d..c4e18fa 100644
--- a/app/Models/ProductService.php
+++ b/app/Models/ProductService.php
@@ -29,11 +29,6 @@ class ProductService extends Model
'price',
];
- // public function getServiceType(): string
- // {
- // return $this->serviceType->name ?? '';
- // }
-
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
new file mode 100644
index 0000000..21cdd7a
--- /dev/null
+++ b/app/Observers/InvoiceObserver.php
@@ -0,0 +1,49 @@
+id('guest')
+ ->path('')
+ ->colors([
+ 'primary' => Color::Blue,
+ ])
+ ->discoverResources(in: app_path('Filament/Guest/Resources'), for: 'App\\Filament\\Guest\\Resources')
+ ->discoverPages(in: app_path('Filament/Guest/Pages'), for: 'App\\Filament\\Guest\\Pages')
+ ->pages([
+ // Pages\Dashboard::class,
+ ])
+ ->discoverWidgets(in: app_path('Filament/Guest/Widgets'), for: 'App\\Filament\\Guest\\Widgets')
+ ->widgets([
+ // Widgets\AccountWidget::class,
+ // Widgets\FilamentInfoWidget::class,
+ ])
+ ->middleware([
+ EncryptCookies::class,
+ AddQueuedCookiesToResponse::class,
+ StartSession::class,
+ AuthenticateSession::class,
+ ShareErrorsFromSession::class,
+ VerifyCsrfToken::class,
+ SubstituteBindings::class,
+ DisableBladeIconComponents::class,
+ DispatchServingFilamentEvent::class,
+ ])
+ ->authMiddleware([
+ // Authenticate::class,
+ ]);
+ }
+}
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
index 22744d1..9054427 100644
--- a/bootstrap/providers.php
+++ b/bootstrap/providers.php
@@ -3,4 +3,5 @@
return [
App\Providers\AppServiceProvider::class,
App\Providers\Filament\AdminPanelProvider::class,
+ App\Providers\Filament\GuestPanelProvider::class,
];
diff --git a/database/factories/InvoiceReportFactory.php b/database/factories/InvoiceReportFactory.php
index 3848cfa..1884dcf 100644
--- a/database/factories/InvoiceReportFactory.php
+++ b/database/factories/InvoiceReportFactory.php
@@ -17,13 +17,9 @@ public function definition(): array
'customer_id' => Customer::all()->shuffle()->first()->id,
'date_start' => Carbon::now()->subYear(),
'date_end' => Carbon::now(),
- 'filter_paid' => $this->faker->boolean(90),
- /* 'subtotal' => $this->faker->randomFloat(),
- 'pst' => $this->faker->randomFloat(),
- 'gst' => $this->faker->randomFloat(),
- 'total' => $this->faker->randomFloat(),*/
- 'created_at' => Carbon::now(),
- 'updated_at' => Carbon::now(),
+ 'filter_paid' => $this->faker->boolean(40),
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now(),
];
}
}
diff --git a/database/migrations/2024_09_08_163053_create_invoices_table.php b/database/migrations/2024_09_08_163053_create_invoices_table.php
index 3a86455..c9c6f49 100644
--- a/database/migrations/2024_09_08_163053_create_invoices_table.php
+++ b/database/migrations/2024_09_08_163053_create_invoices_table.php
@@ -25,6 +25,7 @@ public function up(): void
$table->date('date')->default(today());
$table->date('due_date')->nullable();
+ $table->softDeletes();
$table->timestamps();
});
}
diff --git a/database/migrations/2024_11_27_004920_create_invoice_reports_table.php b/database/migrations/2024_11_27_004920_create_invoice_reports_table.php
index 5d860d4..75047c4 100644
--- a/database/migrations/2024_11_27_004920_create_invoice_reports_table.php
+++ b/database/migrations/2024_11_27_004920_create_invoice_reports_table.php
@@ -20,7 +20,7 @@ public function up(): void
$table->float('subtotal', 2)->default(0);
$table->float('pst', 2)->default(0);
$table->float('gst', 2)->default(0);
- $table->float('total', 2)->default(0);
+ // $table->float('total', 2)->default(0);
$table->timestamps();
});
diff --git a/database/seeders/InvoiceSeeder.php b/database/seeders/InvoiceSeeder.php
index 52390c6..f833d8c 100644
--- a/database/seeders/InvoiceSeeder.php
+++ b/database/seeders/InvoiceSeeder.php
@@ -26,7 +26,5 @@ public function run(): void
$invoice->calculateTotals();
}
-
- \Log::debug(Invoice::all());
}
}
diff --git a/public/invoice-tn-in-24-0017.pdf b/public/invoice-tn-in-24-0017.pdf
new file mode 100644
index 0000000..f710344
Binary files /dev/null and b/public/invoice-tn-in-24-0017.pdf differ
diff --git a/public/invoicereport-tn-inr-1.pdf b/public/invoicereport-tn-inr-1.pdf
new file mode 100644
index 0000000..a92053d
Binary files /dev/null and b/public/invoicereport-tn-inr-1.pdf differ
diff --git a/public/invoicereport-tn-inr-3.pdf b/public/invoicereport-tn-inr-3.pdf
new file mode 100644
index 0000000..c13784f
Binary files /dev/null and b/public/invoicereport-tn-inr-3.pdf differ
diff --git a/public/invoicereport-tn-inr-6.pdf b/public/invoicereport-tn-inr-6.pdf
new file mode 100644
index 0000000..c3ed4be
Binary files /dev/null and b/public/invoicereport-tn-inr-6.pdf differ
diff --git a/public/invoicereport-tn40006.pdf b/public/invoicereport-tn40006.pdf
new file mode 100644
index 0000000..7cb3c60
Binary files /dev/null and b/public/invoicereport-tn40006.pdf differ
diff --git a/public/invoicereport-tnr0002.pdf b/public/invoicereport-tnr0002.pdf
new file mode 100644
index 0000000..b5d7abf
Binary files /dev/null and b/public/invoicereport-tnr0002.pdf differ
diff --git a/public/invoicereport-tnr0005.pdf b/public/invoicereport-tnr0005.pdf
new file mode 100644
index 0000000..6072b7d
Binary files /dev/null and b/public/invoicereport-tnr0005.pdf differ
diff --git a/public/invoicereport-tnr0006.pdf b/public/invoicereport-tnr0006.pdf
new file mode 100644
index 0000000..5c41f3e
Binary files /dev/null and b/public/invoicereport-tnr0006.pdf differ
diff --git a/public/order-tn24-0029.pdf b/public/order-tn24-0029.pdf
new file mode 100644
index 0000000..ed1907a
Binary files /dev/null and b/public/order-tn24-0029.pdf differ
diff --git a/public/order-tn24-0093.pdf b/public/order-tn24-0093.pdf
new file mode 100644
index 0000000..32be9b8
Binary files /dev/null and b/public/order-tn24-0093.pdf differ
diff --git a/public/order-tn24-0132.pdf b/public/order-tn24-0132.pdf
new file mode 100644
index 0000000..e632d43
Binary files /dev/null and b/public/order-tn24-0132.pdf differ
diff --git a/public/order-tn24-0179.pdf b/public/order-tn24-0179.pdf
new file mode 100644
index 0000000..195e264
Binary files /dev/null and b/public/order-tn24-0179.pdf differ
diff --git a/resources/views/filament/guest/pages/contact-us.blade.php b/resources/views/filament/guest/pages/contact-us.blade.php
new file mode 100644
index 0000000..3e2e844
--- /dev/null
+++ b/resources/views/filament/guest/pages/contact-us.blade.php
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/views/filament/guest/pages/digitizing.blade.php b/resources/views/filament/guest/pages/digitizing.blade.php
new file mode 100644
index 0000000..cc61477
--- /dev/null
+++ b/resources/views/filament/guest/pages/digitizing.blade.php
@@ -0,0 +1,3 @@
+
+
+
diff --git a/resources/views/filament/guest/pages/embroidery.blade.php b/resources/views/filament/guest/pages/embroidery.blade.php
new file mode 100644
index 0000000..cc61477
--- /dev/null
+++ b/resources/views/filament/guest/pages/embroidery.blade.php
@@ -0,0 +1,3 @@
+
+
+
diff --git a/resources/views/filament/guest/pages/home.blade.php b/resources/views/filament/guest/pages/home.blade.php
new file mode 100644
index 0000000..6d969da
--- /dev/null
+++ b/resources/views/filament/guest/pages/home.blade.php
@@ -0,0 +1,3 @@
+
+ {{ $this->form }}
+
diff --git a/resources/views/filament/guest/pages/vinyl.blade.php b/resources/views/filament/guest/pages/vinyl.blade.php
new file mode 100644
index 0000000..cc61477
--- /dev/null
+++ b/resources/views/filament/guest/pages/vinyl.blade.php
@@ -0,0 +1,3 @@
+
+
+
diff --git a/resources/views/pdf/invoice-report-footer.blade.php b/resources/views/pdf/invoice-report-footer.blade.php
new file mode 100644
index 0000000..7e7c2e0
--- /dev/null
+++ b/resources/views/pdf/invoice-report-footer.blade.php
@@ -0,0 +1,10 @@
+
+
+'
\ No newline at end of file
diff --git a/resources/views/pdf/invoice-report.blade.php b/resources/views/pdf/invoice-report.blade.php
new file mode 100644
index 0000000..49464e0
--- /dev/null
+++ b/resources/views/pdf/invoice-report.blade.php
@@ -0,0 +1,106 @@
+@extends('layouts.pdf')
+
+
+
+
+
+
+ TOP NOTCH EMBROIDERY & DIGITIZING LTD.
+
+
+ 108-618 EAST KENT AVE. SOUTH
+ VANCOUVER BC
+ (604) 871-9991
+ info@sewtopnotch.com
+ GST# 846025062RT0001
+
+
+
+ INVOICE STATEMENT
+
+
+
+
+
+
+ BILL TO
+
+
+ {{$invoiceReport->customer->company_name}}
+ {{$invoiceReport->customer->billing_address_line_1}}
+ {{$invoiceReport->customer->billing_address_line_2}}
+
+
+
+
+
+ INVOICE REPORT #
+
+
+ DATE
+
+
+ DATE FROM
+
+
+ DATE TO
+
+
+
+ TOTAL BALANCE DUE
+
+
+
+
+
+ {{$invoiceReport->internal_id}}
+
+
+ {{Date::make($invoiceReport->created_at)->format('Y-m-d')}}
+
+
+ {{$invoiceReport->date_start->format('Y-m-d')}}
+
+
+ {{$invoiceReport->date_end->format('Y-m-d')}}
+
+
+
+ ${{number_format($invoiceReport->total, 2)}}
+
+
+
+
+
+
+
+
+
+ Date |
+ Invoice |
+ Subtotal |
+ GST |
+ PST |
+ Balance |
+ Status |
+
+
+ @foreach($invoiceReport->invoices as $invoice)
+
+ {{Date::make($invoice->created_at)->format('Y-m-d')}} |
+ {{$invoice->internal_id}} |
+ ${{$invoice->subtotal}} |
+ ${{number_format($invoice->gst_amount, 2)}} |
+ {{!$invoice->pst_amount ? '-' : '$'.number_format($invoice->pst_amount, 2)}} |
+ ${{$invoice->total}} |
+ {{$invoice->status->value}} |
+
+ @endforeach
+
+
+
+
diff --git a/resources/views/pdf/invoice.blade.php b/resources/views/pdf/invoice.blade.php
index f0bb2e2..76e37da 100644
--- a/resources/views/pdf/invoice.blade.php
+++ b/resources/views/pdf/invoice.blade.php
@@ -70,10 +70,11 @@
RATE |
AMOUNT |
+
@foreach($invoice->productServices as $service)
-
-
+ |
+
{{$service->order->internal_po}}
|
diff --git a/resources/views/pdf/order.blade.php b/resources/views/pdf/order.blade.php
index b818b3f..98fccd6 100644
--- a/resources/views/pdf/order.blade.php
+++ b/resources/views/pdf/order.blade.php
@@ -108,8 +108,9 @@
PO#
-
+
{{$order->customer_po}}
+ @if($order->pre_production) (pre-pro)@endif()
@@ -118,7 +119,7 @@
-
+
TOTAL QUANTITY: {{$order->totalProductQuantity}}
+
+
-
+
Placement & Service |
@@ -227,6 +230,8 @@
+
+
{{$order->notes}}
diff --git a/routes/web.php b/routes/web.php
index 79707e5..6717f48 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -8,33 +8,26 @@
use App\Http\Controllers\OrderController;
use App\Http\Controllers\OrderProductController;
use App\Http\Controllers\PackingSlipController;
+use App\Http\Controllers\PdfController;
use App\Http\Controllers\ShippingEntryController;
use Illuminate\Support\Facades\Route;
-Route::get('/', function () {
- return redirect()->route('dashboard');
-});
+//Route::get('/', function () {
+// return redirect()->route('dashboard');
+//});
+//
+//Auth::routes();
-Auth::routes();
-
-Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
-
-Route::get('/management/{tab?}', [ManagementController::class, 'index'])->name('management.index');
-
-// OrderProducts
-Route::resource('order-products', OrderProductController::class);
-
-// Contacts
-Route::resource('contacts', ContactController::class);
-Route::post('/contacts/request-destroy', [ContactController::class, 'requestDestroy'])->name('contacts.requestDestroy');
-
-Route::resource('packing-slips', PackingSlipController::class);
-
-Route::resource('shipping-entries', ShippingEntryController::class);
-
-Route::resource('orders', OrderController::class);
+Route::get('/pdf/invoicereport/{id}', [PdfController::class, 'invoiceReport'])->name('pdf.invoice-report');
Route::get('orders/{order}/pdf', [OrderController::class, 'pdf'])->name('orders.pdf');
-
Route::get('invoices/{invoice}/pdf', [InvoiceController::class, 'pdf'])->name('invoice.pdf');
-
Route::get('customers/{customer}/pdf', [CustomerController::class, 'pdf'])->name('customer.pdf');
+
+//Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
+//Route::get('/management/{tab?}', [ManagementController::class, 'index'])->name('management.index');
+//Route::resource('order-products', OrderProductController::class);
+//Route::resource('contacts', ContactController::class);
+//Route::post('/contacts/request-destroy', [ContactController::class, 'requestDestroy'])->name('contacts.requestDestroy');
+//Route::resource('packing-slips', PackingSlipController::class);
+//Route::resource('shipping-entries', ShippingEntryController::class);
+//Route::resource('orders', OrderController::class);
diff --git a/todos b/todos
index 614a31a..6bd8d50 100644
--- a/todos
+++ b/todos
@@ -1,40 +1,53 @@
todo
-Invoice Report
---------------
-Model ?customer > table
+
+Guest Panel
+-----------
+Make info pages
+Show customer order status
+
+
+Invoice Reports
+---------------
+Filter paid doesn't work?
+
+Orders
+-------
+- Validation
+- Tabs for quotes, invoices, packingSlips?
Quotes
------
- Add date?
-Orders
--------
-- Fix service type
-- PDF pre-pro property
-- Change order status from table > do thru checkboxes?
-- Tabs for quotes, invoices, packingSlips?
-- Fix total order price
-- Duplicate to new order
+Customer report
+----------------
+- Save to PDF
-Shipping Entries
------------------
-- Clickable URL in title
+Invoices
+--------
+Due date doesn't update?
Others
-------
-- ServiceFile findOrCreate
-- Way to set GST and PST
-- Remove service_type from ProductService?
-- order pdfs checkboxes don't tick no more
-- duplicate order button (edit page header)
-- badge for invoices
-
-
-- finish invoice styling
-- add to invoice button on order page
+- Change price calculations to round to two
- customer name to invoice title / filename
+- ability to change PST / GST amounts
+- ability to change office address (see below)
+- dynamically get office address in invoice / invoice reports (add top notch as customer?)
+
+Potentials
+-----------
+- ServiceFile findOrCreate?
+- add to invoice button on order page?
+- Save and close buttons at header (orders)
+
renamings:
- order->total_service_price => subtotal
- amount > quantity
- amount_price > amount
+
+ Discuss w/ James
+ -----------------
+ Customer address system improvement (multiple addresses per customer instead of customer entry per address?)
+ Global search?