basics test

re-design-orderproducts-create
Nisse Lommerde 3 months ago
parent 3ba11e5637
commit 87f7581aca

@ -4,9 +4,8 @@ namespace App\Enums;
enum OrderStatus: string enum OrderStatus: string
{ {
case ORDER = 'Order'; case APPROVED = 'Approved';
case APPROVED = 'Approved';
case PRODUCTION = 'Production'; case PRODUCTION = 'Production';
case COMPLETED = 'Completed'; case SHIPPED = 'Shipped';
case CANCELLED = 'Cancelled'; case INVOICED = 'Invoiced';
} }

@ -5,8 +5,8 @@ namespace App\Enums;
enum OrderType: string enum OrderType: string
{ {
case EMBROIDERY = 'Embroidery'; case EMBROIDERY = 'Embroidery';
case SCREEN = 'Screen printing'; case SCREEN = 'Screen printing';
case DTG = 'Direct-to-garment'; case DTG = 'Direct-to-garment';
case VINYL = 'Vinyl'; case VINYL = 'Vinyl';
case MISC = 'Misc'; case MISC = 'Misc';
} }

@ -5,6 +5,6 @@ namespace App\Enums;
enum ShippingType: string enum ShippingType: string
{ {
case THEY_SHIP = 'They ship'; case THEY_SHIP = 'They ship';
case WE_SHIP = 'We ship'; case WE_SHIP = 'We ship';
case PICKUP = 'Pickup'; case PICKUP = 'Pickup';
} }

@ -43,14 +43,13 @@ class RegisterController extends Controller
/** /**
* Get a validator for an incoming registration request. * Get a validator for an incoming registration request.
* *
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator * @return \Illuminate\Contracts\Validation\Validator
*/ */
protected function validator(array $data) protected function validator(array $data)
{ {
return Validator::make($data, [ return Validator::make($data, [
'name' => ['required', 'string', 'max:255'], 'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'], 'password' => ['required', 'string', 'min:8', 'confirmed'],
]); ]);
} }
@ -58,14 +57,13 @@ class RegisterController extends Controller
/** /**
* Create a new user instance after a valid registration. * Create a new user instance after a valid registration.
* *
* @param array $data
* @return \App\Models\User * @return \App\Models\User
*/ */
protected function create(array $data) protected function create(array $data)
{ {
return User::create([ return User::create([
'name' => $data['name'], 'name' => $data['name'],
'email' => $data['email'], 'email' => $data['email'],
'password' => Hash::make($data['password']), 'password' => Hash::make($data['password']),
]); ]);
} }

@ -9,15 +9,12 @@ use Illuminate\Http\Request;
class ContactController extends Controller class ContactController extends Controller
{ {
public function index() public function index() {}
{
}
public function create(Request $request) public function create(Request $request)
{ {
return view('contacts.create', [ return view('contacts.create', [
'customers' => Customer::all(), 'customers' => Customer::all(),
'fromCustomer' => $request->get('customer'), 'fromCustomer' => $request->get('customer'),
]); ]);
} }
@ -29,17 +26,11 @@ class ContactController extends Controller
return redirect()->route('customers.show', [$contact->customer, 'contacts'])->with('status', 'Contact created successfully'); return redirect()->route('customers.show', [$contact->customer, 'contacts'])->with('status', 'Contact created successfully');
} }
public function show($id) public function show($id) {}
{
}
public function edit($id) public function edit($id) {}
{
}
public function update(Request $request, $id) public function update(Request $request, $id) {}
{
}
public function requestDestroy(Request $request) public function requestDestroy(Request $request)
{ {
@ -49,11 +40,5 @@ class ContactController extends Controller
return redirect()->route('customers.show', [$contact->customer->id, 'contacts'])->with('status', 'Contact deleted successfully'); return redirect()->route('customers.show', [$contact->customer->id, 'contacts'])->with('status', 'Contact deleted successfully');
} }
public function destroy($id) public function destroy($id) {}
{
// $contact = Contact::findOrFail($id);
// $contact->delete();
//
// return redirect()->route('customers.show', $contact->customer()->iud)->with('status', 'Contact deleted successfully');
}
} }

@ -5,25 +5,18 @@ namespace App\Http\Controllers;
use App\Http\Requests\CustomerRequest; use App\Http\Requests\CustomerRequest;
use App\Models\Customer; use App\Models\Customer;
use App\Models\PackingSlip; use App\Models\PackingSlip;
use App\Models\ShippingEntry;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
class CustomerController extends Controller class CustomerController extends Controller
{ {
public function index(Request $request) public function index() {}
{
return view('customers.index', [
'customers' => Customer::all(),
'tab' => $request->tab,
]);
}
public function store(CustomerRequest $request) public function store(CustomerRequest $request)
{ {
Customer::create($request->validated()); Customer::create($request->validated());
return redirect()->route('customers.index')->with('status', 'Customer created successfully.'); return redirect()->route('management.index')->with('status', 'Customer created successfully.');
} }
public function create() public function create()
@ -31,28 +24,19 @@ class CustomerController extends Controller
return view('customers.create'); return view('customers.create');
} }
public function show(Customer $customer, string $tab = null) public function show(Customer $customer, ?string $tab = null)
{ {
if (!$tab) { if (! $tab) {
return redirect()->route('customers.show', [$customer, 'tab' => 'details']); return redirect()->route('customers.show', [$customer, 'tab' => 'details']);
} }
$orders = $customer->orders();
$priorities = '"production", "approved", "order"';
return view('customers.show', [ return view('customers.show', [
'tab' => $tab, 'tab' => $tab,
'customer' => $customer, 'customer' => $customer,
'active_orders' => $orders 'contacts' => $customer->contacts()->get(),
->where('status', '!=', 'cancelled') 'packingSlips' => PackingSlip::where('customer_id', $customer->id)->orderByDesc('date_received')->paginate(15),
->where('status', '!=', 'completed')
->orderBy('rush', 'desc')
->orderBy('due_date', 'desc')
->paginate(10),
'contacts' => $customer->contacts()->get(),
'packingSlips' => PackingSlip::where('customer_id', $customer->id)->orderByDesc('date_received')->paginate(15),
'shippingEntries' => $customer->shippingEntries()->get(), 'shippingEntries' => $customer->shippingEntries()->get(),
'today' => Carbon::today()->format('Y-m-d'), 'today' => Carbon::today()->format('Y-m-d'),
]); ]);
} }
@ -68,13 +52,13 @@ class CustomerController extends Controller
$customer = Customer::find($request->id); $customer = Customer::find($request->id);
$customer->delete(); $customer->delete();
return redirect()->route('customers.index')->with('status', 'Customer deleted successfully.'); return redirect()->route('management.index')->with('status', 'Customer deleted successfully.');
} }
public function destroy(Customer $customer) public function destroy(Customer $customer)
{ {
$customer->delete(); $customer->delete();
return redirect()->route('customers.index')->with('status', 'Customer deleted successfully.'); return redirect()->route('management.index')->with('status', 'Customer deleted successfully.');
} }
} }

@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
class DashboardController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*/
public function index(Request $request)
{
if (! $request->get('tab')) {
return redirect()->route('dashboard', ['tab' => 'active_orders']);
}
return view('dashboard', [
'today' => Carbon::today(),
'tab' => $request->get('tab'),
]);
}
}

@ -1,28 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('home');
}
}

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Models\Customer;
class ManagementController extends Controller
{
protected string $defaultTab = 'customers';
public function index(?string $tab = null)
{
if (! $tab) {
return redirect()->route('management.index', ['tab' => $this->defaultTab]);
}
return view('management.index', [
'customers' => Customer::all(),
'tab' => $tab,
]);
}
}

@ -4,45 +4,116 @@ namespace App\Http\Controllers;
use App\Enums\OrderStatus; use App\Enums\OrderStatus;
use App\Enums\OrderType; use App\Enums\OrderType;
use App\Http\Requests\OrderRequest;
use App\Models\Customer; use App\Models\Customer;
use App\Models\Order;
use App\Models\OrderProduct;
use App\Models\ProductService;
use App\Models\ProductSize;
use App\Models\ServiceFile;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
class OrderController extends Controller class OrderController extends Controller
{ {
public function index() public function index(Request $request)
{ {
if (! $request->get('tab')) {
return redirect()->route('orders.index', ['tab' => 'all']);
}
return view('orders.index', [
'tab' => $request->get('tab'),
]);
} }
public function create() public function create()
{ {
return view('orders.create', [ return view('orders.create', [
'order_types' => OrderType::cases(), 'order_types' => OrderType::cases(),
'order_status' => OrderStatus::cases(), 'order_status' => OrderStatus::cases(),
'customers' => Customer::all(), 'customers' => Customer::all(),
'today' => Carbon::today()->format('Y-m-d'), 'today' => Carbon::today()->format('Y-m-d'),
'due_default' => Carbon::today()->addDay(10)->format('Y-m-d') 'due_default' => Carbon::today()->addDay(10)->format('Y-m-d'),
]); ]);
} }
public function store(Request $request) public function store(OrderRequest $request)
{ {
// Create order
$order = Order::create($request->safe()->only([
'customer_id',
'contact_id',
'order_type',
'status',
'customer_po',
'order_date',
'due_date',
'rush',
'new_art',
'digitizing',
'repeat',
'purchased_garments',
'customer_supplied_file',
'notes',
]));
// Create orderProducts
for ($i = 0; $i < count($request->get('productInputCount')) - 1; $i++) {
$orderProduct = OrderProduct::create([
'order_id' => $order->id,
'sku' => $request->get('sku')[$i],
'product_name' => $request->get('product_name')[$i],
'color' => $request->get('product_color')[$i],
]);
// Create productSizes
foreach (['xs', 's', 'm', 'l', 'xl', '2xl', '3xl', 'osfa'] as $size) {
ProductSize::create([
'order_product_id' => $orderProduct->id,
'amount' => $request->get('size_'.$size)[$i],
'size' => $size,
]);
}
}
// Create productServices
for ($i = 0; $i < count($request->get('serviceInputCount')) - 1; $i++) {
$productService = ProductService::create([
'order_id' => $order->id,
'service_type' => $request->get('service_type')[$i],
'placement' => $request->get('placement')[$i],
'setup_amount' => $request->get('setup_amount')[$i],
'amount' => $request->get('amount')[$i],
'amount_price' => $request->get('amount_price')[$i],
]);
ServiceFile::create([
'product_service_id' => $productService,
'code' => $request->get('service_file_name')[$i],
'name' => $request->get('logo_name')[$i],
'width' => $request->get('service_width')[$i],
'height' => $request->get('service_height')[$i],
'unit' => $request->get('service_setup_unit')[$i],
'setup_number' => $request->get('setup_number')[$i],
]);
}
return redirect()->route('order-products.create', ['order' => $order->id]);
} }
public function show($id) public function show($id)
{ {
return view('orders.show', [
'order' => Order::find($id),
'tab' => 'details',
]);
} }
public function edit($id) public function edit($id) {}
{
}
public function update(Request $request, $id) public function update(Request $request, $id) {}
{
}
public function destroy($id) public function destroy($id) {}
{
}
} }

@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class OrderProductController extends Controller
{
public function index() {}
public function create()
{
return view('order-products.create');
}
public function store(Request $request) {}
public function show($id) {}
public function edit($id) {}
public function update(Request $request, $id) {}
public function destroy($id) {}
}

@ -9,43 +9,29 @@ use Illuminate\Http\Request;
class PackingSlipController extends Controller class PackingSlipController extends Controller
{ {
public function index() public function index() {}
{
} public function create() {}
public function create()
{
}
public function store(PackingSlipRequest $request) public function store(PackingSlipRequest $request)
{ {
PackingSlip::create($request->validated()); PackingSlip::create($request->validated());
if ($request->get('from_customer')) if ($request->get('from_customer')) {
{
return redirect()->route('customers.show', [ return redirect()->route('customers.show', [
Customer::find($request->get('customer_id')), Customer::find($request->get('customer_id')),
'tab' => 'packing' 'tab' => 'packing',
]); ]);
} }
return redirect()->back(); //todo: change to packing slips page return redirect()->back(); //todo: change to packing slips page
} }
public function show($id) public function show($id) {}
{
}
public function edit($id) public function edit($id) {}
{
}
public function update(Request $request, $id) public function update(Request $request, $id) {}
{
}
public function destroy($id) public function destroy($id) {}
{
}
} }

@ -8,14 +8,9 @@ use Illuminate\Http\Request;
class ShippingEntryController extends Controller class ShippingEntryController extends Controller
{ {
public function index() public function index() {}
{
} public function create() {}
public function create()
{
}
public function store(ShippingEntryRequest $request) public function store(ShippingEntryRequest $request)
{ {
@ -24,19 +19,11 @@ class ShippingEntryController extends Controller
return redirect()->route('customers.show', [$entry->customer, 'tab' => 'shipping']); return redirect()->route('customers.show', [$entry->customer, 'tab' => 'shipping']);
} }
public function show($id) public function show($id) {}
{
}
public function edit($id) public function edit($id) {}
{
}
public function update(Request $request, $id) public function update(Request $request, $id) {}
{
}
public function destroy($id) public function destroy($id) {}
{
}
} }

@ -12,11 +12,11 @@ class ContactRequest extends FormRequest
return [ return [
'customer_id' => 'required|exists:customers,id', 'customer_id' => 'required|exists:customers,id',
'first_name' => 'string', 'first_name' => 'string',
'last_name' => 'string', 'last_name' => 'string',
'email' => 'string', 'email' => 'string',
'phone' => 'string', 'phone' => 'string',
'notes' => 'string' 'notes' => 'string',
]; ];
} }

@ -9,11 +9,11 @@ class CustomerRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'company_name' => 'required', 'company_name' => 'required',
'internal_name' => 'required', 'internal_name' => 'required',
'shipping_address' => 'required', 'shipping_address' => 'required',
'billing_address' => 'required', 'billing_address' => 'required',
'phone' => 'required', 'phone' => 'required',
]; ];
} }

@ -0,0 +1,23 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class OrderProductRequest extends FormRequest
{
public function rules(): array
{
return [
'order_id' => ['required', 'exists:orders'],
'sku' => ['string', 'nullable'],
'product_name' => ['required'],
'color' => ['string', 'nullable'],
];
}
public function authorize(): bool
{
return true;
}
}

@ -9,19 +9,20 @@ class OrderRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'customer_id' => ['required', 'exists:customers'], 'customer_id' => ['required', 'exists:customers,id'],
'internal_po' => ['required'], 'contact_id' => ['nullable', 'exists:contacts,id'],
'customer_po' => ['required'], 'customer_po' => ['required', 'string'],
'order_date' => ['required', 'date'], 'order_type' => ['required', 'string'],
'due_date' => ['required', 'date'], 'order_date' => ['required', 'date'],
'status' => ['required'], 'due_date' => ['required', 'date'],
'rush' => ['boolean'], 'status' => ['required'],
'new_art' => ['boolean'], 'rush' => ['nullable'],
'digitizing' => ['boolean'], 'new_art' => ['nullable'],
'repeat' => ['boolean'], 'digitizing' => ['nullable'],
'purchased_garments' => ['boolean'], 'repeat' => ['nullable'],
'customer_supplied_file' => ['boolean'], 'purchased_garments' => ['nullable'],
'notes' => ['required'], 'customer_supplied_file' => ['nullable'],
'notes' => ['nullable'],
]; ];
} }

@ -10,11 +10,11 @@ class PackingSlipRequest extends FormRequest
{ {
return [ return [
'date_received' => 'required|date', 'date_received' => 'required|date',
'customer_id' => 'required|exists:customers,id', 'customer_id' => 'required|exists:customers,id',
'order_id' => 'string|nullable', 'order_id' => 'string|nullable',
'amount' => 'required|string', 'amount' => 'required|string',
'contents' => 'required|string', 'contents' => 'required|string',
'from_customer' => 'required|bool' 'from_customer' => 'required|bool',
]; ];
} }

@ -0,0 +1,26 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProductServiceRequest extends FormRequest
{
public function rules(): array
{
return [
'order_product_id' => ['required', 'exists:order_products'],
'service_file_id' => ['nullable', 'exists:service_files'],
'service_type' => ['required'],
'placement' => ['required'],
'setup_amount' => ['required'],
'amount' => ['nullable'],
'amount_price' => ['nullable'],
];
}
public function authorize(): bool
{
return true;
}
}

@ -0,0 +1,22 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProductSizeRequest extends FormRequest
{
public function rules(): array
{
return [
'order_product_id' => ['required', 'exists:order_products'],
'size' => ['required'],
'amount' => ['required'],
];
}
public function authorize(): bool
{
return true;
}
}

@ -0,0 +1,24 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ServiceFileRequest extends FormRequest
{
public function rules(): array
{
return [
'code' => ['required'],
'name' => ['required'],
'width' => ['required', 'numeric'],
'height' => ['required', 'numeric'],
'unit' => ['required'],
];
}
public function authorize(): bool
{
return true;
}
}

@ -9,16 +9,16 @@ class ShippingEntryRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'shipping_type' => ['required'], 'shipping_type' => ['required'],
'customer_id' => ['required', 'exists:customers,id'], 'customer_id' => ['required', 'exists:customers,id'],
'courier' => ['nullable'], 'courier' => ['nullable'],
'contact' => ['nullable'], 'contact' => ['nullable'],
'account_title' => ['nullable'], 'account_title' => ['nullable'],
'account_username' => ['nullable'], 'account_username' => ['nullable'],
'account_password' => ['nullable'], 'account_password' => ['nullable'],
'info_needed' => ['nullable'], 'info_needed' => ['nullable'],
'notify' => ['nullable'], 'notify' => ['nullable'],
'notes' => ['nullable'], 'notes' => ['nullable'],
]; ];
} }

@ -0,0 +1,42 @@
<?php
namespace App\Livewire;
use App\Enums\OrderStatus;
use App\Enums\OrderType;
use App\Models\Customer;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Carbon;
use Livewire\Component;
class CreateOrder extends Component
{
public Collection $customers;
public string $selectedCustomer;
public $contacts;
public function mount(Collection $customers)
{
$this->customers = $customers;
$this->contacts = $customers->first()->contacts;
}
public function getContacts()
{
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
}
public function render()
{
return view('livewire.create-order', [
'contacts' => $this->contacts,
'order_types' => OrderType::cases(),
'order_status' => OrderStatus::cases(),
'customers' => $this->customers,
'today' => Carbon::today()->format('Y-m-d'),
'due_default' => Carbon::today()->addDay(10)->format('Y-m-d'),
]);
}
}

@ -0,0 +1,41 @@
<?php
namespace App\Livewire;
use App\Models\Customer;
use Illuminate\Support\Collection;
use Livewire\Component;
class CustomerAndContactSelect extends Component
{
public Collection $customers;
public Collection $contacts;
public string $selectedCustomer;
public function mount(Collection $customers)
{
$this->customers = $customers;
if (isset($this->selectedCustomer)) {
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
} else {
$this->contacts = $customers->first()->contacts;
}
}
public function updateContactList()
{
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
}
public function render()
{
return view('livewire.customer-and-contact-select', [
'customers' => $this->customers,
'contacts' => $this->contacts,
]);
}
}

@ -0,0 +1,158 @@
<?php
namespace App\Livewire;
use Exception;
use Illuminate\Support\Collection;
use Livewire\Component;
class OrderProductsCreate extends Component
{
public Collection $productInputs;
public Collection $serviceInputs;
public array $sizes = [];
public array $totals = [];
public array $units = [];
public array $prices = [];
public array $priceTotals = [];
public int $totalQuantity = 0;
public string $totalPrice = '$0.00';
public function updated()
{
try {
foreach ($this->sizes as $index => $size) {
$this->totals[$index] = array_sum($size);
}
} catch (Exception $e) {
}
try {
foreach ($this->units as $index => $unit) {
$this->priceTotals[$index] = $unit * $this->prices[$index];
}
} catch (Exception $e) {
}
$this->totalQuantity = array_sum($this->totals);
$this->totalPrice = '$'.number_format(round(array_sum($this->priceTotals), 2), 2);
}
public function addProductInput()
{
$index = $this->productInputs->count();
$this->productInputs->push([
$index => [
'sku' => '',
'product_name' => '',
'product_color' => '',
'size_xs' => '',
'size_s' => '',
'size_m' => '',
'size_l' => '',
'size_xl' => '',
'size_2xl' => '',
'size_3xl' => '',
'size_osfa' => '',
'product_total' => '',
],
]);
}
public function determineAddProductRow($index)
{
if ($index == $this->productInputs->count() - 1) {
$this->addProductInput();
}
}
public function determineAddServiceProductRow($index)
{
if ($index == $this->serviceInputs->count() - 1) {
$this->addServiceInput();
}
}
public function removeProductInput($key)
{
if ($this->productInputs->count() > 1) {
$this->productInputs->pull($key);
}
}
public function addServiceInput()
{
$this->serviceInputs->push([
$this->serviceInputs->count() => [
'service_name' => '',
'product_name' => '',
'product_color' => '',
'logo_name' => '',
'setup_number' => '',
'service_width' => '',
'service_height' => '',
'service_setup_unit' => '',
'service_setup_price' => '',
'service_total' => '',
],
]);
}
public function removeServiceInput($key)
{
if ($this->serviceInputs->count() > 1) {
$this->serviceInputs->pull($key);
}
}
public function mount()
{
$this->fill([
'productInputs' => collect([
[
'sku' => '',
'product_name' => '',
'product_color' => '',
'size_xs' => '',
'size_s' => '',
'size_m' => '',
'size_l' => '',
'size_xl' => '',
'size_2xl' => '',
'size_3xl' => '',
'size_osfa' => '',
'product_total' => '0',
],
]),
'serviceInputs' => collect([
[
'sku' => '',
'product_name' => '',
'product_color' => '',
'logo_name' => '',
'setup_number' => '',
'service_width' => '',
'service_height' => '',
'service_setup_unit' => '',
'service_setup_price' => '',
'service_total' => '',
],
]),
]);
}
public function render()
{
return view('livewire.order-products-create');
}
}

@ -0,0 +1,61 @@
<?php
namespace App\Livewire;
use App\Models\Order;
use Illuminate\Support\Carbon;
use Livewire\Component;
use Livewire\WithPagination;
class OrdersTable extends Component
{
use WithPagination;
protected $paginationTheme = 'bootstrap';
public bool $showCustomerColumn;
public string $orderType = 'active';
public string $search = '';
public string $title = '';
public string $customer_id = '';
public Carbon $today;
public function mount(bool $showCustomerColumn, string $orderType, string $title, ?string $customer_id = null)
{
$this->today = Carbon::today();
$this->showCustomerColumn = $showCustomerColumn;
$this->orderType = $orderType;
$this->title = $title;
$this->customer_id = $customer_id ?? '';
}
public function render()
{
return view('livewire.orders-table', [
'orders' => Order::with('customer')
->when($this->customer_id != null, fn ($q) => $q->where('customer_id', $this->customer_id))
->when($this->orderType === 'active', fn ($q) => $q->active())
->when($this->orderType === 'invoiced', fn ($q) => $q->invoiced())
->when($this->orderType === 'finished', fn ($q) => $q->finished())
->when($this->search !== '', function ($query) {
$query->whereHas('customer', function ($query) {
$query->where('company_name', 'like', '%'.$this->search.'%');
})->orWhere('customer_po', 'like', '%'.$this->search.'%')
->orWhere('internal_po', 'like', '%'.$this->search.'%')
->orWhere('order_date', 'like', '%'.$this->search.'%')
->orWhere('due_date', 'like', '%'.$this->search.'%')
->orWhere('status', 'like', '%'.$this->search.'%');
})
->orderByDesc('rush')
->orderBy('due_date')
->paginate(15)
->withQueryString(),
'today' => $this->today,
]);
}
}

@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class Contact extends Model class Contact extends Model
{ {
use SoftDeletes, HasFactory; use HasFactory, SoftDeletes;
protected $fillable = [ protected $fillable = [
'customer_id', 'customer_id',
@ -20,8 +20,13 @@ class Contact extends Model
'notes', 'notes',
]; ];
public function getFullNameAttribute(): string
{
return $this->first_name.' '.$this->last_name;
}
public function customer(): BelongsTo public function customer(): BelongsTo
{ {
return $this->belongsTo(Customer::class); return $this->belongsTo(Customer::class);
} }
} }

@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class Customer extends Model class Customer extends Model
{ {
use SoftDeletes, HasFactory; use HasFactory, SoftDeletes;
protected $fillable = [ protected $fillable = [
'company_name', 'company_name',

@ -7,19 +7,22 @@ use DateTimeInterface;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
class Order extends Model class Order extends Model
{ {
use SoftDeletes, HasFactory; use HasFactory, SoftDeletes;
protected $fillable = [ protected $fillable = [
'customer_id', 'customer_id',
'contact_id',
'internal_po', 'internal_po',
'customer_po', 'customer_po',
'order_date', 'order_date',
'due_date', 'order_type',
'status', 'status',
'due_date',
'rush', 'rush',
'new_art', 'new_art',
'digitizing', 'digitizing',
@ -30,16 +33,57 @@ class Order extends Model
]; ];
protected $appends = [ protected $appends = [
'active_status' 'active',
]; ];
public function getActiveStatus(): bool public static function boot()
{
parent::boot();
static::created(function ($model) {
$model->attributes['internal_po'] = $model->generateInternalPo($model->id);
$model->save();
});
}
public function generateInternalPo($id): string
{
$po = str_pad($id, 4, '0', STR_PAD_LEFT);
$year = date('y');
return 'TN'.$year.'-'.$po;
}
public function active(): bool
{ {
if ($this->status === OrderStatus::COMPLETED || $this->status === OrderStatus::CANCELLED) { if ($this->status == OrderStatus::APPROVED
return false; || $this->status == OrderStatus::PRODUCTION) {
return true;
} }
return true; return false;
}
public function scopeActive($query)
{
return $query->where('status', 'approved')
->orWhere('status', 'production');
}
public function scopeFinished($query)
{
return $query->where('status', 'shipped')
->orWhere('status', 'completed');
}
public function scopeInvoiced($query)
{
return $query->where('status', 'invoiced');
}
public function scopeRush($query)
{
return $query->where('rush', true);
} }
public function customer(): BelongsTo public function customer(): BelongsTo
@ -47,12 +91,22 @@ class Order extends Model
return $this->belongsTo(Customer::class); return $this->belongsTo(Customer::class);
} }
public function orderProducts(): HasMany
{
return $this->hasMany(OrderProduct::class);
}
public function productServices(): HasMany
{
return $this->hasMany(ProductService::class);
}
protected function serializeDate(DateTimeInterface $date): string protected function serializeDate(DateTimeInterface $date): string
{ {
return $date->format('Y-m-d'); return $date->format('Y-m-d');
} }
protected $casts = [ protected $casts = [
'status' => OrderStatus::class 'status' => OrderStatus::class,
]; ];
} }

@ -0,0 +1,37 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
class OrderProduct extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'order_id',
'sku',
'product_name',
'color',
];
public function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
public function serviceFile(): HasOne
{
return $this->hasOne(ServiceFile::class);
}
public function productSize(): HasMany
{
return $this->hasMany(ProductSize::class);
}
}

@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class PackingSlip extends Model class PackingSlip extends Model
{ {
use SoftDeletes, HasFactory; use HasFactory, SoftDeletes;
protected $fillable = [ protected $fillable = [
'order_id', 'order_id',
@ -19,7 +19,8 @@ class PackingSlip extends Model
'contents', 'contents',
]; ];
public function customer(): BelongsTo { public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class); return $this->belongsTo(Customer::class);
} }
} }

@ -0,0 +1,33 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductService extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'order_id',
'service_type',
'placement',
'setup_amount',
'amount',
'amount_price',
];
public function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
public function serviceFile(): HasOne
{
return $this->hasOne(ServiceFile::class);
}
}

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductSize extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'order_product_id',
'size',
'amount',
];
public function orderProduct(): BelongsTo
{
return $this->belongsTo(OrderProduct::class);
}
}

@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ServiceFile extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'code',
'product_service_id',
'name',
'width',
'height',
'unit',
'setup_number',
];
public function productService(): BelongsTo
{
return $this->belongsTo(ProductService::class);
}
}

@ -10,10 +10,10 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class ShippingEntry extends Model class ShippingEntry extends Model
{ {
use SoftDeletes, HasFactory; use HasFactory, SoftDeletes;
protected $casts = [ protected $casts = [
'shipping_type' => ShippingType::class 'shipping_type' => ShippingType::class,
]; ];
protected $fillable = [ protected $fillable = [

@ -41,7 +41,7 @@ class User extends Authenticatable
{ {
return [ return [
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
'password' => 'hashed', 'password' => 'hashed',
]; ];
} }
} }

@ -8,11 +8,12 @@
"php": "^8.2", "php": "^8.2",
"davidhsianturi/blade-bootstrap-icons": "^1.5", "davidhsianturi/blade-bootstrap-icons": "^1.5",
"laravel/framework": "^11.9", "laravel/framework": "^11.9",
"laravel/tinker": "^2.9" "laravel/tinker": "^2.9",
"livewire/livewire": "^3.5"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.23", "fakerphp/faker": "^1.23",
"laravel/pint": "^1.13", "laravel/pint": "^1.17",
"laravel/sail": "^1.26", "laravel/sail": "^1.26",
"laravel/ui": "^4.5", "laravel/ui": "^4.5",
"mockery/mockery": "^1.6", "mockery/mockery": "^1.6",

94
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "ecf358f6808ee41e24a7136c4c0cd543", "content-hash": "ffc721fe90178089f9fb639d3d24a0b4",
"packages": [ "packages": [
{ {
"name": "blade-ui-kit/blade-icons", "name": "blade-ui-kit/blade-icons",
@ -1959,6 +1959,82 @@
], ],
"time": "2024-01-28T23:22:08+00:00" "time": "2024-01-28T23:22:08+00:00"
}, },
{
"name": "livewire/livewire",
"version": "v3.5.6",
"source": {
"type": "git",
"url": "https://github.com/livewire/livewire.git",
"reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/livewire/livewire/zipball/597a2808d8d3001cc3ed5ce89a6ebab00f83b80f",
"reference": "597a2808d8d3001cc3ed5ce89a6ebab00f83b80f",
"shasum": ""
},
"require": {
"illuminate/database": "^10.0|^11.0",
"illuminate/routing": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"illuminate/validation": "^10.0|^11.0",
"laravel/prompts": "^0.1.24",
"league/mime-type-detection": "^1.9",
"php": "^8.1",
"symfony/console": "^6.0|^7.0",
"symfony/http-kernel": "^6.2|^7.0"
},
"require-dev": {
"calebporzio/sushi": "^2.1",
"laravel/framework": "^10.15.0|^11.0",
"mockery/mockery": "^1.3.1",
"orchestra/testbench": "^8.21.0|^9.0",
"orchestra/testbench-dusk": "^8.24|^9.1",
"phpunit/phpunit": "^10.4",
"psy/psysh": "^0.11.22|^0.12"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Livewire\\LivewireServiceProvider"
],
"aliases": {
"Livewire": "Livewire\\Livewire"
}
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Livewire\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Caleb Porzio",
"email": "calebporzio@gmail.com"
}
],
"description": "A front-end framework for Laravel.",
"support": {
"issues": "https://github.com/livewire/livewire/issues",
"source": "https://github.com/livewire/livewire/tree/v3.5.6"
},
"funding": [
{
"url": "https://github.com/livewire",
"type": "github"
}
],
"time": "2024-08-19T11:52:18+00:00"
},
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "3.7.0", "version": "3.7.0",
@ -6009,16 +6085,16 @@
}, },
{ {
"name": "laravel/pint", "name": "laravel/pint",
"version": "v1.17.2", "version": "v1.17.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/pint.git", "url": "https://github.com/laravel/pint.git",
"reference": "e8a88130a25e3f9d4d5785e6a1afca98268ab110" "reference": "9d77be916e145864f10788bb94531d03e1f7b482"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/pint/zipball/e8a88130a25e3f9d4d5785e6a1afca98268ab110", "url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482",
"reference": "e8a88130a25e3f9d4d5785e6a1afca98268ab110", "reference": "9d77be916e145864f10788bb94531d03e1f7b482",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6029,13 +6105,13 @@
"php": "^8.1.0" "php": "^8.1.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.61.1", "friendsofphp/php-cs-fixer": "^3.64.0",
"illuminate/view": "^10.48.18", "illuminate/view": "^10.48.20",
"larastan/larastan": "^2.9.8", "larastan/larastan": "^2.9.8",
"laravel-zero/framework": "^10.4.0", "laravel-zero/framework": "^10.4.0",
"mockery/mockery": "^1.6.12", "mockery/mockery": "^1.6.12",
"nunomaduro/termwind": "^1.15.1", "nunomaduro/termwind": "^1.15.1",
"pestphp/pest": "^2.35.0" "pestphp/pest": "^2.35.1"
}, },
"bin": [ "bin": [
"builds/pint" "builds/pint"
@ -6071,7 +6147,7 @@
"issues": "https://github.com/laravel/pint/issues", "issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint" "source": "https://github.com/laravel/pint"
}, },
"time": "2024-08-06T15:11:54+00:00" "time": "2024-09-03T15:00:28+00:00"
}, },
{ {
"name": "laravel/sail", "name": "laravel/sail",

@ -120,7 +120,7 @@ return [
'maintenance' => [ 'maintenance' => [
'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
'store' => env('APP_MAINTENANCE_STORE', 'database'), 'store' => env('APP_MAINTENANCE_STORE', 'database'),
], ],
]; ];

@ -14,7 +14,7 @@ return [
*/ */
'defaults' => [ 'defaults' => [
'guard' => env('AUTH_GUARD', 'web'), 'guard' => env('AUTH_GUARD', 'web'),
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
], ],
@ -37,7 +37,7 @@ return [
'guards' => [ 'guards' => [
'web' => [ 'web' => [
'driver' => 'session', 'driver' => 'session',
'provider' => 'users', 'provider' => 'users',
], ],
], ],
@ -62,7 +62,7 @@ return [
'providers' => [ 'providers' => [
'users' => [ 'users' => [
'driver' => 'eloquent', 'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\User::class), 'model' => env('AUTH_MODEL', App\Models\User::class),
], ],
// 'users' => [ // 'users' => [
@ -93,8 +93,8 @@ return [
'passwords' => [ 'passwords' => [
'users' => [ 'users' => [
'provider' => 'users', 'provider' => 'users',
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
'expire' => 60, 'expire' => 60,
'throttle' => 60, 'throttle' => 60,
], ],
], ],

@ -34,28 +34,28 @@ return [
'stores' => [ 'stores' => [
'array' => [ 'array' => [
'driver' => 'array', 'driver' => 'array',
'serialize' => false, 'serialize' => false,
], ],
'database' => [ 'database' => [
'driver' => 'database', 'driver' => 'database',
'connection' => env('DB_CACHE_CONNECTION'), 'connection' => env('DB_CACHE_CONNECTION'),
'table' => env('DB_CACHE_TABLE', 'cache'), 'table' => env('DB_CACHE_TABLE', 'cache'),
'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
'lock_table' => env('DB_CACHE_LOCK_TABLE'), 'lock_table' => env('DB_CACHE_LOCK_TABLE'),
], ],
'file' => [ 'file' => [
'driver' => 'file', 'driver' => 'file',
'path' => storage_path('framework/cache/data'), 'path' => storage_path('framework/cache/data'),
'lock_path' => storage_path('framework/cache/data'), 'lock_path' => storage_path('framework/cache/data'),
], ],
'memcached' => [ 'memcached' => [
'driver' => 'memcached', 'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [ 'sasl' => [
env('MEMCACHED_USERNAME'), env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'), env('MEMCACHED_PASSWORD'),
], ],
@ -64,25 +64,25 @@ return [
], ],
'servers' => [ 'servers' => [
[ [
'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211), 'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100, 'weight' => 100,
], ],
], ],
], ],
'redis' => [ 'redis' => [
'driver' => 'redis', 'driver' => 'redis',
'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
], ],
'dynamodb' => [ 'dynamodb' => [
'driver' => 'dynamodb', 'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'), 'endpoint' => env('DYNAMODB_ENDPOINT'),
], ],

@ -32,81 +32,81 @@ return [
'connections' => [ 'connections' => [
'sqlite' => [ 'sqlite' => [
'driver' => 'sqlite', 'driver' => 'sqlite',
'url' => env('DB_URL'), 'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')), 'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '', 'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
'busy_timeout' => null, 'busy_timeout' => null,
'journal_mode' => null, 'journal_mode' => null,
'synchronous' => null, 'synchronous' => null,
], ],
'mysql' => [ 'mysql' => [
'driver' => 'mysql', 'driver' => 'mysql',
'url' => env('DB_URL'), 'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'), 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'), 'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'), 'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'), 'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''), 'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'), 'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'strict' => true, 'strict' => true,
'engine' => null, 'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([ 'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [], ]) : [],
], ],
'mariadb' => [ 'mariadb' => [
'driver' => 'mariadb', 'driver' => 'mariadb',
'url' => env('DB_URL'), 'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'), 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'), 'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'), 'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'), 'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''), 'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'), 'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'strict' => true, 'strict' => true,
'engine' => null, 'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([ 'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [], ]) : [],
], ],
'pgsql' => [ 'pgsql' => [
'driver' => 'pgsql', 'driver' => 'pgsql',
'url' => env('DB_URL'), 'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'), 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'), 'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'laravel'), 'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'), 'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'), 'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'search_path' => 'public', 'search_path' => 'public',
'sslmode' => 'prefer', 'sslmode' => 'prefer',
], ],
'sqlsrv' => [ 'sqlsrv' => [
'driver' => 'sqlsrv', 'driver' => 'sqlsrv',
'url' => env('DB_URL'), 'url' => env('DB_URL'),
'host' => env('DB_HOST', 'localhost'), 'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'), 'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'laravel'), 'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'), 'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'), 'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
// 'encrypt' => env('DB_ENCRYPT', 'yes'), // 'encrypt' => env('DB_ENCRYPT', 'yes'),
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
@ -126,7 +126,7 @@ return [
*/ */
'migrations' => [ 'migrations' => [
'table' => 'migrations', 'table' => 'migrations',
'update_date_on_publish' => true, 'update_date_on_publish' => true,
], ],
@ -147,24 +147,24 @@ return [
'options' => [ 'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'), 'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
], ],
'default' => [ 'default' => [
'url' => env('REDIS_URL'), 'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'), 'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'), 'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'), 'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'), 'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'), 'database' => env('REDIS_DB', '0'),
], ],
'cache' => [ 'cache' => [
'url' => env('REDIS_URL'), 'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'), 'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'), 'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'), 'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'), 'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'), 'database' => env('REDIS_CACHE_DB', '1'),
], ],

@ -32,28 +32,28 @@ return [
'local' => [ 'local' => [
'driver' => 'local', 'driver' => 'local',
'root' => storage_path('app'), 'root' => storage_path('app'),
'throw' => false, 'throw' => false,
], ],
'public' => [ 'public' => [
'driver' => 'local', 'driver' => 'local',
'root' => storage_path('app/public'), 'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage', 'url' => env('APP_URL').'/storage',
'visibility' => 'public', 'visibility' => 'public',
'throw' => false, 'throw' => false,
], ],
's3' => [ 's3' => [
'driver' => 's3', 'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'), 'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'), 'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'), 'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'), 'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => false, 'throw' => false,
], ],
], ],

@ -33,7 +33,7 @@ return [
'deprecations' => [ 'deprecations' => [
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
'trace' => env('LOG_DEPRECATIONS_TRACE', false), 'trace' => env('LOG_DEPRECATIONS_TRACE', false),
], ],
/* /*
@ -53,73 +53,73 @@ return [
'channels' => [ 'channels' => [
'stack' => [ 'stack' => [
'driver' => 'stack', 'driver' => 'stack',
'channels' => explode(',', env('LOG_STACK', 'single')), 'channels' => explode(',', env('LOG_STACK', 'single')),
'ignore_exceptions' => false, 'ignore_exceptions' => false,
], ],
'single' => [ 'single' => [
'driver' => 'single', 'driver' => 'single',
'path' => storage_path('logs/laravel.log'), 'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'daily' => [ 'daily' => [
'driver' => 'daily', 'driver' => 'daily',
'path' => storage_path('logs/laravel.log'), 'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14), 'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'slack' => [ 'slack' => [
'driver' => 'slack', 'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'), 'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'),
'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
'level' => env('LOG_LEVEL', 'critical'), 'level' => env('LOG_LEVEL', 'critical'),
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'papertrail' => [ 'papertrail' => [
'driver' => 'monolog', 'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [ 'handler_with' => [
'host' => env('PAPERTRAIL_URL'), 'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'), 'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
], ],
'processors' => [PsrLogMessageProcessor::class], 'processors' => [PsrLogMessageProcessor::class],
], ],
'stderr' => [ 'stderr' => [
'driver' => 'monolog', 'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class, 'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'), 'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [ 'with' => [
'stream' => 'php://stderr', 'stream' => 'php://stderr',
], ],
'processors' => [PsrLogMessageProcessor::class], 'processors' => [PsrLogMessageProcessor::class],
], ],
'syslog' => [ 'syslog' => [
'driver' => 'syslog', 'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'errorlog' => [ 'errorlog' => [
'driver' => 'errorlog', 'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'), 'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true, 'replace_placeholders' => true,
], ],
'null' => [ 'null' => [
'driver' => 'monolog', 'driver' => 'monolog',
'handler' => NullHandler::class, 'handler' => NullHandler::class,
], ],

@ -38,14 +38,14 @@ return [
'mailers' => [ 'mailers' => [
'smtp' => [ 'smtp' => [
'transport' => 'smtp', 'transport' => 'smtp',
'url' => env('MAIL_URL'), 'url' => env('MAIL_URL'),
'host' => env('MAIL_HOST', '127.0.0.1'), 'host' => env('MAIL_HOST', '127.0.0.1'),
'port' => env('MAIL_PORT', 2525), 'port' => env('MAIL_PORT', 2525),
'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'), 'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'), 'password' => env('MAIL_PASSWORD'),
'timeout' => null, 'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
], ],
@ -67,12 +67,12 @@ return [
'sendmail' => [ 'sendmail' => [
'transport' => 'sendmail', 'transport' => 'sendmail',
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
], ],
'log' => [ 'log' => [
'transport' => 'log', 'transport' => 'log',
'channel' => env('MAIL_LOG_CHANNEL'), 'channel' => env('MAIL_LOG_CHANNEL'),
], ],
'array' => [ 'array' => [
@ -81,7 +81,7 @@ return [
'failover' => [ 'failover' => [
'transport' => 'failover', 'transport' => 'failover',
'mailers' => [ 'mailers' => [
'smtp', 'smtp',
'log', 'log',
], ],
@ -89,7 +89,7 @@ return [
'roundrobin' => [ 'roundrobin' => [
'transport' => 'roundrobin', 'transport' => 'roundrobin',
'mailers' => [ 'mailers' => [
'ses', 'ses',
'postmark', 'postmark',
], ],
@ -110,7 +110,7 @@ return [
'from' => [ 'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'), 'name' => env('MAIL_FROM_NAME', 'Example'),
], ],
]; ];

@ -35,40 +35,40 @@ return [
], ],
'database' => [ 'database' => [
'driver' => 'database', 'driver' => 'database',
'connection' => env('DB_QUEUE_CONNECTION'), 'connection' => env('DB_QUEUE_CONNECTION'),
'table' => env('DB_QUEUE_TABLE', 'jobs'), 'table' => env('DB_QUEUE_TABLE', 'jobs'),
'queue' => env('DB_QUEUE', 'default'), 'queue' => env('DB_QUEUE', 'default'),
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
'after_commit' => false, 'after_commit' => false,
], ],
'beanstalkd' => [ 'beanstalkd' => [
'driver' => 'beanstalkd', 'driver' => 'beanstalkd',
'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
'queue' => env('BEANSTALKD_QUEUE', 'default'), 'queue' => env('BEANSTALKD_QUEUE', 'default'),
'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
'block_for' => 0, 'block_for' => 0,
'after_commit' => false, 'after_commit' => false,
], ],
'sqs' => [ 'sqs' => [
'driver' => 'sqs', 'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'default'), 'queue' => env('SQS_QUEUE', 'default'),
'suffix' => env('SQS_SUFFIX'), 'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'after_commit' => false, 'after_commit' => false,
], ],
'redis' => [ 'redis' => [
'driver' => 'redis', 'driver' => 'redis',
'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
'queue' => env('REDIS_QUEUE', 'default'), 'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
'block_for' => null, 'block_for' => null,
'after_commit' => false, 'after_commit' => false,
], ],
@ -87,7 +87,7 @@ return [
'batching' => [ 'batching' => [
'database' => env('DB_CONNECTION', 'sqlite'), 'database' => env('DB_CONNECTION', 'sqlite'),
'table' => 'job_batches', 'table' => 'job_batches',
], ],
/* /*
@ -104,9 +104,9 @@ return [
*/ */
'failed' => [ 'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
'database' => env('DB_CONNECTION', 'sqlite'), 'database' => env('DB_CONNECTION', 'sqlite'),
'table' => 'failed_jobs', 'table' => 'failed_jobs',
], ],
]; ];

@ -19,7 +19,7 @@ return [
], ],
'ses' => [ 'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
], ],
@ -31,7 +31,7 @@ return [
'slack' => [ 'slack' => [
'notifications' => [ 'notifications' => [
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
], ],
], ],

@ -13,14 +13,14 @@ class ContactFactory extends Factory
public function definition(): array public function definition(): array
{ {
$first_name = $this->faker->firstName(); $first_name = $this->faker->firstName();
$last_name = $this->faker->lastName(); $last_name = $this->faker->lastName();
$email = strtolower($first_name . '.' . $last_name) . '@example.com'; $email = strtolower($first_name.'.'.$last_name).'@example.com';
return [ return [
'first_name' => $first_name, 'first_name' => $first_name,
'last_name' => $last_name, 'last_name' => $last_name,
'email' => $email, 'email' => $email,
'phone' => $this->faker->phoneNumber(), 'phone' => $this->faker->phoneNumber(),
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'updated_at' => Carbon::now(), 'updated_at' => Carbon::now(),
]; ];

@ -12,19 +12,18 @@ class CustomerFactory extends Factory
public function definition() public function definition()
{ {
$company_name = $this->faker->company(); $company_name = $this->faker->company();
$internal_name = explode(",", $company_name); $internal_name = explode(',', $company_name);
$address = $this->faker->address(); $address = $this->faker->address();
return [ return [
'company_name' => $company_name, 'company_name' => $company_name,
'internal_name' => strtolower($internal_name[0]), 'internal_name' => strtolower($internal_name[0]),
'shipping_address' => $address, 'shipping_address' => $address,
'billing_address' => $address, 'billing_address' => $address,
'phone' => $this->faker->phoneNumber(), 'phone' => $this->faker->phoneNumber(),
'created_at' => Carbon::now(),
'created_at' => Carbon::now(), 'updated_at' => Carbon::now(),
'updated_at' => Carbon::now(),
]; ];
} }
} }

@ -3,7 +3,7 @@
namespace Database\Factories; namespace Database\Factories;
use App\Enums\OrderStatus; use App\Enums\OrderStatus;
use App\Models\Customer; use App\Enums\OrderType;
use App\Models\Order; use App\Models\Order;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
@ -14,23 +14,24 @@ class OrderFactory extends Factory
public function definition(): array public function definition(): array
{ {
$order_date = Carbon::today()->subDays(rand(0, 30)); $order_date = Carbon::today()->subDays(rand(0, 10));
$due_date = $order_date->copy()->addDays(rand(9, 15));
return [ return [
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'updated_at' => Carbon::now(), 'updated_at' => Carbon::now(),
'internal_po' => 'TN' . $this->faker->randomNumber(4, true), 'customer_po' => $this->faker->randomNumber(6, true),
'customer_po' => $this->faker->randomNumber(6, true), 'order_type' => $this->faker->randomElement(OrderType::cases())->value,
'order_date' => $order_date, 'order_date' => $order_date,
'due_date' => $order_date->addDays(rand(8, 12)), 'due_date' => $due_date,
'status' => $this->faker->randomELement(OrderStatus::cases())->value, //todo: setup order status enum 'status' => $this->faker->randomELement(OrderStatus::cases())->value,
'rush' => $this->faker->boolean(), 'rush' => $this->faker->boolean(10),
'new_art' => $this->faker->boolean(), 'new_art' => $this->faker->boolean(),
'digitizing' => $this->faker->boolean(), 'digitizing' => $this->faker->boolean(),
'repeat' => $this->faker->boolean(), 'repeat' => $this->faker->boolean(),
'purchased_garments' => $this->faker->boolean(), 'purchased_garments' => $this->faker->boolean(),
'customer_supplied_file' => $this->faker->boolean(), 'customer_supplied_file' => $this->faker->boolean(),
'notes' => $this->faker->words(10, true), 'notes' => $this->faker->words(10, true),
]; ];
} }
} }

@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use App\Models\OrderProduct;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon;
class OrderProductFactory extends Factory
{
protected $model = OrderProduct::class;
public function definition(): array
{
return [
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
'sku' => $this->faker->randomElement([$this->faker->randomNumber(4, true), null]),
'product_name' => $this->faker->randomElement(['shirts', 'hats', 'jackets', 'pants', 'tote bags', 'backpacks']),
'color' => $this->faker->randomElement(['black', 'white', 'navy', 'red', 'gold', 'charcoal']),
];
}
}

@ -14,11 +14,11 @@ class PackingSlipFactory extends Factory
{ {
return [ return [
'date_received' => $this->faker->dateTimeBetween('-1 month', 'now'), 'date_received' => $this->faker->dateTimeBetween('-1 month', 'now'),
'order_id' => $this->faker->randomNumber(6), 'order_id' => $this->faker->randomNumber(6),
'amount' => $this->faker->numberBetween(2, 5) . ' boxes', 'amount' => $this->faker->numberBetween(2, 5).' boxes',
'contents' => $this->faker->numberBetween(2, 60) . ' ' . $this->faker->randomElement(['t-shirts', 'caps', 'jackets', 'pants', 'sweaters']), 'contents' => $this->faker->numberBetween(2, 60).' '.$this->faker->randomElement(['t-shirts', 'caps', 'jackets', 'pants', 'sweaters']),
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'updated_at' => Carbon::now(), 'updated_at' => Carbon::now(),
]; ];
} }
} }

@ -0,0 +1,25 @@
<?php
namespace Database\Factories;
use App\Models\ProductService;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon;
class ProductServiceFactory extends Factory
{
protected $model = ProductService::class;
public function definition(): array
{
return [
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
'service_type' => $this->faker->randomElement(['embroidery', 'screen printing', 'dtg', 'vinyl']),
'placement' => $this->faker->randomElement(['l/c', 'c/f', 'f/b', 'r/c']),
'setup_amount' => 0,
'amount' => $this->faker->randomNumber(1),
'amount_price' => 0,
];
}
}

@ -0,0 +1,22 @@
<?php
namespace Database\Factories;
use App\Models\ProductSize;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon;
class ProductSizeFactory extends Factory
{
protected $model = ProductSize::class;
public function definition(): array
{
return [
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
'size' => $this->faker->randomElement(['xs', 's', 'm', 'l', 'xl', '2xl', '3xl']),
'amount' => $this->faker->randomNumber(2, false),
];
}
}

@ -0,0 +1,25 @@
<?php
namespace Database\Factories;
use App\Models\ServiceFile;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon;
class ServiceFileFactory extends Factory
{
protected $model = ServiceFile::class;
public function definition(): array
{
return [
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
'code' => $this->faker->randomElement(['A', 'B']).$this->faker->randomNumber(4, true),
'name' => $this->faker->word(),
'width' => round($this->faker->randomFloat(2, 0, 10), 1),
'height' => round($this->faker->randomFloat(2, 0, 10), 1),
'unit' => 'inch',
];
}
}

@ -2,7 +2,6 @@
namespace Database\Factories; namespace Database\Factories;
use App\Models\Customer;
use App\Models\ShippingEntry; use App\Models\ShippingEntry;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
@ -14,16 +13,16 @@ class ShippingEntryFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
'created_at' => Carbon::now(), 'created_at' => Carbon::now(),
'updated_at' => Carbon::now(), 'updated_at' => Carbon::now(),
'courier' => $this->faker->randomElement(['UPS', 'Purolator', 'FreightCom', 'E-Shipper', 'ACE']), 'courier' => $this->faker->randomElement(['UPS', 'Purolator', 'FreightCom', 'E-Shipper', 'ACE']),
'contact' => $this->faker->randomElement(['courier.com', '+1 604 123 4567']), 'contact' => $this->faker->randomElement(['courier.com', '+1 604 123 4567']),
'account_title' => $this->faker->word, 'account_title' => $this->faker->word,
'account_username' => 'username', 'account_username' => 'username',
'account_password' => 'password', 'account_password' => 'password',
'info_needed' => $this->faker->words(3,true), 'info_needed' => $this->faker->words(3, true),
'notify' => 'someone@account.com', 'notify' => 'someone@account.com',
'notes' => $this->faker->randomElement(['', '', '', 'Some really long text to simulate a note being put here']), 'notes' => $this->faker->randomElement(['', '', '', 'Some really long text to simulate a note being put here']),
]; ];
} }
} }

@ -24,11 +24,11 @@ class UserFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
'name' => fake()->name(), 'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(), 'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(), 'email_verified_at' => now(),
'password' => Hash::make('password'), 'password' => Hash::make('password'),
'remember_token' => Str::random(10), 'remember_token' => Str::random(10),
]; ];
} }

@ -4,7 +4,8 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration { return new class extends Migration
{
public function up() public function up()
{ {
Schema::create('customers', function (Blueprint $table) { Schema::create('customers', function (Blueprint $table) {

@ -4,7 +4,8 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration { return new class extends Migration
{
public function up(): void public function up(): void
{ {
Schema::create('contacts', function (Blueprint $table) { Schema::create('contacts', function (Blueprint $table) {

@ -4,13 +4,14 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration { return new class extends Migration
{
public function up(): void public function up(): void
{ {
Schema::create('packing_slips', function (Blueprint $table) { Schema::create('packing_slips', function (Blueprint $table) {
$table->id(); $table->id();
// $table->foreignId('order_id')->nullable()->constrained(); // $table->foreignId('order_id')->nullable()->constrained();
$table->string('order_id')->nullable(); //todo: replace this once orders are actually in da system $table->string('order_id')->nullable(); //todo: replace this once orders are actually in da system
$table->foreignId('customer_id')->nullable()->constrained(); $table->foreignId('customer_id')->nullable()->constrained();
$table->date('date_received'); $table->date('date_received');

@ -4,7 +4,8 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration { return new class extends Migration
{
public function up(): void public function up(): void
{ {
Schema::create('shipping_entries', function (Blueprint $table) { Schema::create('shipping_entries', function (Blueprint $table) {

@ -1,30 +1,30 @@
<?php <?php
use App\Enums\OrderStatus;
use App\Enums\OrderType;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration { return new class extends Migration
{
public function up(): void public function up(): void
{ {
Schema::create('orders', function (Blueprint $table) { Schema::create('orders', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('customer_id'); $table->foreignId('customer_id')->constrained();
$table->string('internal_po'); $table->foreignId('contact_id')->nullable()->constrained();
$table->string('internal_po')->nullable();
$table->string('customer_po'); $table->string('customer_po');
$table->enum('order_type', OrderType::cases()); $table->string('order_type');
$table->date('order_date'); $table->date('order_date');
$table->date('due_date'); $table->date('due_date');
$table->enum('status', OrderStatus::cases()); $table->string('status');
$table->boolean('rush')->default(0); $table->boolean('rush')->default(0);
$table->boolean('new_art')->default(0); $table->boolean('new_art')->default(0);
$table->boolean('digitizing')->default(0); $table->boolean('digitizing')->default(0);
$table->boolean('repeat')->default(0); $table->boolean('repeat')->default(0);
$table->boolean('purchased_garments')->default(0); $table->boolean('purchased_garments')->default(0);
$table->boolean('customer_supplied_file')->default(0); $table->boolean('customer_supplied_file')->default(0);
$table->longText('notes'); $table->longText('notes')->nullable();
$table->softDeletes(); $table->softDeletes();
$table->timestamps(); $table->timestamps();
}); });

@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('order_products', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id')->constrained();
$table->string('sku')->nullable();
$table->string('product_name');
$table->string('color')->nullable();
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('order_products');
}
};

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('product_services', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id');
$table->string('service_type');
$table->string('placement');
$table->string('setup_amount');
$table->string('amount')->nullable();
$table->string('amount_price')->nullable();
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('product_services');
}
};

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('service_files', function (Blueprint $table) {
$table->id();
$table->foreignId('product_service_id')->constrained();
$table->string('code');
$table->string('name');
$table->string('placement');
$table->decimal('width')->nullable();
$table->decimal('height')->nullable();
$table->string('unit')->default('inch');
$table->integer('setup_number')->nullable();
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('service_files');
}
};

@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('product_sizes', function (Blueprint $table) {
$table->id();
$table->foreignId('order_product_id');
$table->string('size');
$table->string('amount');
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('product_sizes');
}
};

@ -0,0 +1,92 @@
<?php
namespace Database\Seeders;
use App\Models\Contact;
use App\Models\Customer;
use App\Models\Order;
use App\Models\OrderProduct;
use App\Models\PackingSlip;
use App\Models\ProductService;
use App\Models\ProductSize;
use App\Models\ShippingEntry;
use Illuminate\Database\Seeder;
class CustomerSeeder extends Seeder
{
public function run(): void
{
Customer::factory(3)
->has(Contact::factory(5))
->has(PackingSlip::factory(30))
->has(ShippingEntry::factory(2))
->has(Order::factory(10)
->has(OrderProduct::factory(2)
->has(ProductSize::factory(3)))
->has(ProductService::factory(3)))
// ->has(ServiceFile::factory(1))))
->create();
Customer::factory([
'company_name' => 'Genumark',
'internal_name' => 'genumark',
'shipping_address' => '',
'billing_address' => '',
])
->has(Contact::factory([
'first_name' => 'Tammy',
'last_name' => 'Bookbinder',
'email' => 'tbookbinder@genumark.com',
'phone' => '+1 778 229 5668',
]))
->has(Contact::factory([
'first_name' => 'Kathlyn',
'last_name' => 'Wood',
'email' => 'kwood@genumark.com',
'phone' => '+1 604 294 2376',
'notes' => 'Always CC, unless SOF order',
]))
->has(Contact::factory([
'first_name' => 'Jane',
'last_name' => 'Wellman',
'email' => 'jwellman@genumark.com',
'phone' => '+1 604 742 5584',
'notes' => 'Deals with SOF orders',
]))
->has(Contact::factory([
'first_name' => 'Trisha',
'last_name' => 'Miller',
'email' => 'tmiller@genumark.com',
'phone' => '+1 604 802 8486',
]))
->has(Contact::factory([
'first_name' => 'Brenda',
'last_name' => 'Kuepfer',
'email' => 'bkuepfer@genumark.com',
'phone' => '+1 604 305 5002',
]))
->has(PackingSlip::factory(20))
->has(ShippingEntry::factory([
'account_title' => 'Genumark',
'courier' => 'UPS CampusShip',
'contact' => 'https://www.ups.com/lasso/login',
'account_username' => 'GenumarkTopNotch',
'account_password' => 'TopNotch@13579',
'info_needed' => 'Put PO on box',
'notify' => 'Various reps, CC Kathlyn Wood',
'notes' => 'For Save On Foods orders, see Genumark SOF',
]))
->has(ShippingEntry::factory([
'account_title' => 'Genumark Save-On-Foods',
'courier' => 'UPS CampusShip',
'contact' => 'https://www.ups.com/lasso/login',
'account_username' => 'GenumarkTopNotch',
'account_password' => 'TopNotch@13579',
'info_needed' => 'Put PO on box',
'notify' => 'Jane Wellman',
'notes' => 'Don\'t CC Kathlyn for SOF orders',
]))
->has(Order::factory(10))
->create();
}
}

@ -2,16 +2,8 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\Contact;
use App\Models\Customer;
use App\Models\Order;
use App\Models\PackingSlip;
use App\Models\ShippingEntry;
use App\Models\User; use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents; // use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Database\Factories\ShippingEntryFactory;
use http\Client;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
@ -21,76 +13,12 @@ class DatabaseSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
Customer::factory(9) $this->call([
->has(Contact::factory(5)) CustomerSeeder::class,
->has(PackingSlip::factory(30)) ]);
->has(ShippingEntry::factory(2))
->create();
Customer::factory([
'company_name' => 'Genumark',
'internal_name' => 'genumark',
'shipping_address' => '',
'billing_address' => '',
])
->has(Contact::factory([
'first_name' => 'Tammy',
'last_name' => 'Bookbinder',
'email' => 'tbookbinder@genumark.com',
'phone' => '+1 778 229 5668'
]))
->has(Contact::factory([
'first_name' => 'Kathlyn',
'last_name' => 'Wood',
'email' => 'kwood@genumark.com',
'phone' => '+1 604 294 2376',
'notes' => 'Always CC, unless SOF order'
]))
->has(Contact::factory([
'first_name' => 'Jane',
'last_name' => 'Wellman',
'email' => 'jwellman@genumark.com',
'phone' => '+1 604 742 5584',
'notes' => 'Deals with SOF orders'
]))
->has(Contact::factory([
'first_name' => 'Trisha',
'last_name' => 'Miller',
'email' => 'tmiller@genumark.com',
'phone' => '+1 604 802 8486'
]))
->has(Contact::factory([
'first_name' => 'Brenda',
'last_name' => 'Kuepfer',
'email' => 'bkuepfer@genumark.com',
'phone' => '+1 604 305 5002'
]))
->has(PackingSlip::factory(20))
->has(ShippingEntry::factory([
'account_title' => 'Genumark',
'courier' => 'UPS CampusShip',
'contact' => 'https://www.ups.com/lasso/login',
'account_username' => 'GenumarkTopNotch',
'account_password' => 'TopNotch@13579',
'info_needed' => 'Put PO on box',
'notify' => 'Various reps, CC Kathlyn Wood',
'notes' => 'For Save On Foods orders, see Genumark SOF'
]))
->has(ShippingEntry::factory([
'account_title' => 'Genumark Save-On-Foods',
'courier' => 'UPS CampusShip',
'contact' => 'https://www.ups.com/lasso/login',
'account_username' => 'GenumarkTopNotch',
'account_password' => 'TopNotch@13579',
'info_needed' => 'Put PO on box',
'notify' => 'Jane Wellman',
'notes' => 'Don\'t CC Kathlyn for SOF orders'
]))
->has(Order::factory(10))
->create();
User::factory()->create([ User::factory()->create([
'name' => 'Test User', 'name' => 'Test User',
'email' => 'test@example.com', 'email' => 'test@example.com',
]); ]);
} }

@ -0,0 +1,12 @@
{
"preset": "laravel",
"rules": {
"binary_operator_spaces": {
"default": "single_space",
"operators": {
"=>": "align_single_space_minimal",
"=": "align_single_space_minimal"
}
}
}
}

@ -12,3 +12,14 @@ $table-striped-bg: #fafafa;
@import 'bootstrap/scss/bootstrap'; @import 'bootstrap/scss/bootstrap';
@import 'bootstrap-icons/font/bootstrap-icons.css'; @import 'bootstrap-icons/font/bootstrap-icons.css';
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
display: none;
-webkit-appearance: none;
margin: 0; /* <-- Apparently some margin are still there even though it's hidden */
}
input[type=number] {
-moz-appearance: textfield; /* Firefox */
}

@ -1,144 +0,0 @@
@extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- Customer company name row -->
<div class="row justify-content-center pb-2">
<div class="col-3"></div>
<div class="col">
<h2></h2>
</div>
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-3">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="customer-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link link-dark {{$tab == null ? 'active' : ''}}" id="details-tab"
data-bs-toggle="tab" data-bs-target="#details" type="button" role="tab"
aria-controls="details" aria-selected="{{$tab == null ? 'true' : 'false'}}">
<x-bi-list-ul/>
Customers
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link link-dark {{$tab == 'shipping' ? 'active' : ''}}" id="shipping-tab"
data-bs-toggle="tab" data-bs-target="#shipping" type="button" role="tab"
aria-controls="shipping" aria-selected="{{$tab == 'shipping' ? 'true' : 'false'}}">
<x-bi-box-fill/>
Orders
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link link-dark {{$tab == 'packing' ? 'active' : ''}}" id="packing-tab"
data-bs-toggle="tab" data-bs-target="#packing" type="button" role="tab"
aria-controls="packing" aria-selected="{{$tab == 'packing' ? 'true' : 'false'}}">
<x-bi-card-text/>
Packing Slips
</button>
</li>
{{-- <li class="nav-item" role="presentation">--}}
{{-- <button class="nav-link link-dark {{$tab == 'contacts' ? 'active' : ''}}" id="contacts-tab"--}}
{{-- data-bs-toggle="tab" data-bs-target="#contacts" type="button" role="tab"--}}
{{-- aria-controls="contacts" aria-selected="{{$tab == 'contacts' ? 'true' : 'false'}}">--}}
{{-- <x-bi-people-fill/>--}}
{{-- Contacts--}}
{{-- </button>--}}
{{-- </li>--}}
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection()
@section('content')
<div class="container">
<div class="row justify-content-center mb-3">
<div class="col">
<div class="d-flex flex-row gap-2">
<button class="btn btn-primary" title="Create new customer..."
data-bs-toggle="modal"
data-bs-target="#createCustomerModal">
<x-bi-person-plus-fill/>
Create entry
</button>
<div class="vr"></div>
<div class="d-inline-flex gap-2">
<input type="text" class="form-control" placeholder="Search..."
name="" id="">
<button class="btn btn-outline-primary">
<x-bi-search/>
</button>
</div>
<div class="mx-auto"></div>
<button class="btn btn-danger" title="Delete customer..."
data-bs-toggle="modal"
data-bs-target="#deleteCustomerModal">
<x-bi-trash-fill/>
Delete entry
</button>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col">
@if(sizeof($customers) !== 0)
<table class="table table-striped table-hover">
<thead>
<tr class="border-bottom border-black">
<th scope="col">Company Name</th>
<th scope="col">Internal Name</th>
<th scope="col">Shipping Address</th>
<th scope="col">Billing Address</th>
<th scope="col">Phone</th>
<th scope="col">View</th>
</tr>
</thead>
<tbody>
@foreach($customers as $customer)
<tr>
<td> {{$customer->company_name}} </td>
<td><code>{{$customer->internal_name}}</code></td>
<td> {{$customer->shipping_address}} </td>
<td> {{$customer->billing_address}} </td>
<td class="text-nowrap"> {{$customer->phone}} </td>
<td class="align-top">
<a class="btn btn-sm btn-outline-secondary"
href="{{route('customers.show', [$customer->id, 'tab'=>'details'])}}">
<x-bi-arrow-right/>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@else()
No customer data.
@endif
</div>
</div>
</div>
<!-- Create Customer Modal -->
@include('partials.customers.create-modal')
<!-- Delete Customer Modal -->
@include('partials.customers.delete-all-modal')
@endsection

@ -65,28 +65,24 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<div class="row justify-content-center my-3"> <div class="row justify-content-center my-3">
<div class="tab-content"> <div class="tab-content">
<!-- Overview tab --> <!-- Overview tab -->
@include('partials.customers.show-overview') @include('partials.customers.show.overview-tab')
<!-- Shipping Info tab --> <!-- Shipping Info tab -->
@include('partials.customers.show-shipping-info') @include('partials.customers.show.shipping-info-tab')
<!-- Packing Slips tab --> <!-- Packing Slips tab -->
@include('partials.customers.show-packing-slips') @include('partials.customers.show.packing-slips-tab')
<!-- Contacts tab --> <!-- Contacts tab -->
@include('partials.customers.show-contacts') @include('partials.customers.show.contacts-tab')
</div> </div>
</div> </div>
</div> </div>
<!-- Edit Customer Modal -->
@include('partials.customers.edit-modal')
<!-- Delete Customer Modal --> <!-- Delete Customer Modal -->
@include('partials.customers.delete-single-modal') @include('partials.customers.delete-single-modal')

@ -0,0 +1,59 @@
@extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- Customer company name row -->
<div class="row justify-content-center pb-2">
<div class="col-3"></div>
<div class="col">
{{-- <h2>Overview</h2>--}}
</div>
</div>
<!-- Tabs row -->
<div class="row justify-content-center">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders-tab"
href="{{route('dashboard', ['tab' => 'active_orders'])}}" type="button" role="tab"
aria-controls="active_orders"
aria-selected="{{$tab == 'active_orders' ? 'true' : 'false'}}">
<x-bi-arrow-clockwise/>
Active Orders
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'packing_slips' ? 'active' : ''}}" id="packing-tab"
href="{{route('dashboard', ['tab' => 'packing_slips'])}}" type="button" role="tab"
aria-controls="packing_slips"
aria-selected="{{$tab == 'packing_slips' ? 'true' : 'false'}}">
<x-bi-list-ul/>
Packing Slips
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection
@section('content')
<div class="container">
<div class="row justify-content-center my-3">
<div class="tab-content">
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
aria-labelledby="active_orders-tab">
<livewire:orders-table :order-type="'active'" :show-customer-column="true" title="Active Orders"/>
</div>
</div>
</div>
</div>
@endsection

@ -1,23 +0,0 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Dashboard') }}</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
{{ __('You are logged in!') }}
</div>
</div>
</div>
</div>
</div>
@endsection

@ -15,65 +15,12 @@
<!-- Scripts --> <!-- Scripts -->
@vite(['resources/sass/app.scss', 'resources/js/app.js']) @vite(['resources/sass/app.scss', 'resources/js/app.js'])
{{-- @livewireStyles--}}
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm"> @include('layouts.nav')
<div class="container">
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav me-auto">
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (Route::has('login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@endif
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main> <main>
@yield('header') @yield('header')
@ -81,5 +28,6 @@
</main> </main>
</div> </div>
{{--@livewireScripts--}}
</body> </body>
</html> </html>

@ -0,0 +1,97 @@
<nav class="navbar navbar-expand-md navbar-light bg-white border-bottom">
<div class="container">
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav me-auto">
<li class="nav-item px-2">
<a class="nav-link @if(request()->routeIs('dashboard')) active @endif "
href="{{route('dashboard')}}">
<x-bi-activity/>
Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link @if(request()->routeIs('search')) active @endif disabled"
href="">
<x-bi-search/>
Search</a>
</li>
<li class="nav-item px-2">
<a class="nav-link @if(request()->routeIs('orders.*')) active @endif"
href="{{route('orders.index')}}">
<x-bi-box/>
Orders</a>
</li>
<li class="nav-item px-2">
<a class="nav-link @if(request()->routeIs('quotes')) active @endif disabled"
href="">
<x-bi-file-text/>
Quotes</a>
</li>
<li class="nav-item px-2">
<a class="nav-link @if(request()->routeIs('invoices')) active @endif disabled"
href="">
<x-bi-envelope/>
Invoices</a>
</li>
<li class="nav-item dropdown px-2">
<a class="nav-link dropdown-toggle @if(request()->routeIs('management.index') || request()->routeIs('customer.*')) active @endif" href="#"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
<x-bi-pencil-square/>
Management
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item @if(request()->routeIs('customers.*')) fw-bold @endif" href="{{route('management.index')}}">Customers</a></li>
<li><a class="dropdown-item @if(request()->routeIs('packing-slips.*')) fw bold @endif" href="{{route('management.index', 'packing')}}">Packing Slips</a></li>
<li><a class="dropdown-item @if(request()->routeIs('service-files.*')) fw bold @endif" href="{{route('management.index', 'files')}}">Service Files</a></li>
</ul>
</li>
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (Route::has('login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@endif
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>

@ -0,0 +1,44 @@
<div>
<div class="row mb-2">
<label for="customer_id" class="col-md-4 col-form-label text-md-end">Customer</label>
<div class="col-md-6">
<select wire:change="updateContactList" wire:model="selectedCustomer" name="customer_id"
class="form-select form-select-sm" id="customer_id" autofocus required>
@foreach($customers as $customer)
<option value="{{$customer->id}}" {{ old('customer_id') == $customer->id ? "selected" : "" }}>
{{$customer->company_name}}
</option>
@endforeach()
</select>
@error('customer_id')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-2">
<label for="contact_id" class="col-md-4 col-form-label text-md-end">Contact</label>
<div class="col-md-6">
@if(isset($contacts))
<select wire:model="contacts" wire:key="{{$customer}}" name="contact_id"
class="form-select form-select-sm" id="contact_id">
<option value=""></option>
@foreach($contacts as $contact)
<option value="{{$contact->id}}" {{ old('contact_id') == $contact->id ? "selected" : "" }}>
{{$contact->full_name}}
</option>
@endforeach
</select>
@error('contact_id')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
@endif
</div>
</div>
</div>

@ -0,0 +1,299 @@
<div>
<div class="overflow-x-hidden overflow-y-visible" style="max-height: 730px">
<table class="table table-striped table-sm mb-1 ms-0">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">SKU</th>
<th scope="col">Product Name</th>
<th scope="col">Color</th>
<th scope="col">XS</th>
<th scope="col">S</th>
<th scope="col">M</th>
<th scope="col">L</th>
<th scope="col">XL</th>
<th scope="col">2XL</th>
<th scope="col">3XL</th>
<th scope="col">OSFA</th>
<th scope="col">Total</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@foreach($productInputs as $key => $value)
<tr wire:key="productRow.{{$key}}">
<input type="hidden" name="productInputCount[]" value="1">
<th scope="row" class="align-middle">{{$loop->index+1}}</th>
<td class="col-1">
<!-- SKU -->
<input id="sku_{{$key}}" type="text"
class="form-control form-control-sm @error('sku') is-invalid @enderror"
name="sku[]" value="{{@old('sku')}}" autofocus
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="col-3">
<!-- product_name -->
<input id="product_name_{{$key}}" type="text"
class="form-control form-control-sm @error('product_name') is-invalid @enderror"
name="product_name[]" value="{{@old('product_name')}}"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="col-1">
<!-- product_color -->
<input id="product_color_{{$key}}" type="text" min="0"
class="form-control form-control-sm @error('product_color') is-invalid @enderror"
name="product_color[]" value="{{@old('product_color')}}"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_xs -->
<input id="size_xs_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_xs') is-invalid @enderror"
name="size_xs[]" value="{{@old('size_xs')}}"
wire:model.live="sizes.{{$key}}.xs"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_s -->
<input id="size_s_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_s') is-invalid @enderror"
name="size_s[]" value="{{@old('size_s')}}"
wire:model.live="sizes.{{$key}}.s"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_m -->
<input id="size_m_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_m') is-invalid @enderror"
name="size_m[]" value="{{@old('size_m')}}"
wire:model.live="sizes.{{$key}}.m"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_l -->
<input id="size_l_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_l') is-invalid @enderror"
name="size_l[]" value="{{@old('size_l')}}"
wire:model.live="sizes.{{$key}}.l"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_xl -->
<input id="size_xl_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_xl') is-invalid @enderror"
name="size_xl[]" value="{{@old('size_xl')}}"
wire:model.live="sizes.{{$key}}.xl"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_2xl -->
<input id="size_2xl_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_2xl') is-invalid @enderror"
name="size_2xl[]" value="{{@old('size_2xl')}}"
wire:model.live="sizes.{{$key}}.2xl"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td class="" style="width: 55px">
<!-- size_3xl -->
<input id="size_3xl_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_3xl') is-invalid @enderror"
name="size_3xl[]"
wire:model.live="sizes.{{$key}}.3xl"
wire:change="determineAddProductRow({{$loop->index}})">
</td>
<td style="width: 55px">
<!-- size_osfa -->
<input id="size_osfa_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('size_osfa') is-invalid @enderror"
name="size_osfa[]" value="{{@old('size_osfa')}}"
wire:model.live="sizes.{{$key}}.osfa"
wire:change="determineAddProductRow({{$loop->index}})"
>
</td>
<td class="col" style="width: 55px">
<input id="product_total_{{$key}}" type="number"
class="form-control form-control-sm @error('product_total') is-invalid @enderror"
name="product_total[]" readonly
wire:model.live="totals.{{$key}}"
>
</td>
<td class="col" style="width: 40px">
@if($key > 0)
<button class="btn btn-sm" type="button" wire:click="removeProductInput({{$key}})">
<x-bi-trash3/>
</button>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="d-flex gap-2">
<label for="total-quantity" class="text-nowrap col-form-label">Total Quantity:</label>
<input type="number" name="total-quantity" id="" class="form-control-plaintext" readonly
wire:model.live="totalQuantity">
</div>
</div>
<!-- Title -->
<div class="row px-2 border-bottom mt-4">
<div class="row fw-bold">
<div class="col-1 px-1 text-end" style="width: 40px;">#</div>
<div class="col-1 px-1">Service</div>
<div class="col-2 px-1">Placement</div>
<div class="col-3 px-1">Logo Name</div>
<div class="col-5">
<div class="row">
<div class="col px-1">Setup</div>
<div class="col px-1">Width</div>
<div class="col px-1">Height</div>
<div class="col px-1">Unit</div>
<div class="col px-1">Price</div>
<div class="col px-1">Total</div>
<div class="col px-1"></div>
</div>
</div>
</div>
</div>
<!-- Row -->
@foreach($serviceInputs as $key => $value)
<div class="row">
<input type="hidden" name="serviceInputCount[]" value="1">
<div class="@if($loop->index % 2 != 1) bg-body-tertiary @endif border-bottom py-2">
<div class="row mb-1">
<div class="row mb-2">
<div class="col-1 px-1 fw-bold text-end" style="width: 40px;">{{$loop->index+1}}</div>
<div class="col-1 px-1">
<input id="service_name_{{$key}}" type="text"
class="form-control form-control-sm m-0 @error('service_name') is-invalid @enderror"
name="service_type[]" value="{{@old('service_name')}}" placeholder="Service"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col-2 px-1">
<input id="placement_{{$key}}" type="text"
class="form-control form-control-sm @error('placement') is-invalid @enderror"
name="placement[]" value="{{@old('placement')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col-3 px-1">
<input id="logo_name_{{$key}}" type="text"
class="form-control form-control-sm @error('logo_name') is-invalid @enderror"
name="logo_name[]" value="{{@old('logo_name')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col-5">
<div class="row">
<div class="col px-1">
<input id="setup_number_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('setup_number') is-invalid @enderror"
name="setup_amount[]" value="{{@old('setup_number')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col px-1">
<input id="service_width_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('service_width') is-invalid @enderror"
name="service_width[]" value="{{@old('service_width')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col px-1">
<input id="service_height_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('service_height') is-invalid @enderror"
name="service_height[]" value="{{@old('service_height')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col px-1">
<input id="service_setup_unit_{{$key}}" type="number" min="0"
class="form-control form-control-sm @error('service_setup_unit') is-invalid @enderror"
name="amount[]"
value="{{@old('service_setup_unit')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})"
wire:model.live="units.{{$key}}"
>
</div>
<div class="col px-1">
<input id="service_setup_price_{{$key}}" type="text"
class="form-control form-control-sm @error('service_setup_price') is-invalid @enderror"
name="amount_price[]"
value="{{@old('service_setup_price')}}"
wire:change="determineAddServiceProductRow({{$loop->index}})"
wire:model.live="prices.{{$key}}"
>
</div>
<div class="col px-1">
<input id="service_total_{{$key}}" type="number" precision="2"
class="form-control form-control-sm px-1 @error('service_total') is-invalid @enderror"
name="service_total" readonly
wire:model.live="priceTotals.{{$key}}">
</div>
<div class="col px-1 text-end" style="width: 40px;">
@if($key > 0)
<button class="btn btn-sm" type="button"
wire:click="removeServiceInput({{$key}})">
<x-bi-trash3/>
</button>
@endif
</div>
</div>
</div>
</div>
<div class="row mx-0 px-0">
<div class="col-1" style="width: 40px;"></div>
<div class="col-1 px-1">
<input id="service_file_name_{{$key}}" type="text"
class="form-control form-control-sm @error('service_file_name') is-invalid @enderror"
name="service_file_name[]" value="{{@old('service_file_name')}}"
placeholder="File"
wire:change="determineAddServiceProductRow({{$loop->index}})">
</div>
<div class="col-9 px-1">
<textarea name="contents[]" id="contents_{{$key}}" style="resize: none" rows="2"
class="form-control form-control-sm"
placeholder="Thread colors"
wire:change="determineAddServiceProductRow({{$loop->index}})"
>{{ old('contents') }}</textarea>
</div>
</div>
</div>
</div>
</div>
@endforeach
{{-- <div class="row">--}}
<div class="d-flex flex-row gap-2 ">
<label for="total-price" class="col-form-label text-nowrap">Total Price:</label>
<input type="text" name="total-price" id="" class="col-1 form-control-plaintext" readonly
wire:model.live="totalPrice">
</div>
{{-- </div>--}}
</div>
</div>

@ -0,0 +1,111 @@
<div>
<div class="row justify-content-center mb-3">
<div class="col-9">
<div class="d-flex flex-row gap-2">
<div class="d-inline-flex">
<h4 class="my-auto">{{$this->title}}</h4>
</div>
<div class="mx-auto"></div>
<a href="{{route('orders.create')}}"
class="btn btn-sm btn-primary" title="Create new order...">
<x-bi-plus-circle-fill/>
Create entry
</a>
<div class="vr"></div>
<div class="d-inline-flex">
<select name="" id="" class="form-select form-select-sm">
<option value="">Sort by...</option>
<option value="">Customer</option>
<option value="">Internal PO</option>
<option value="">Customer PO</option>
<option value="">Order Date</option>
<option value="">Due Date</option>
<option value="">Status</option>
<option value="">Rush</option>
</select>
</div>
<div class="d-inline-flex">
<div class="btn-group" role="group">
<button class="btn btn-sm btn-secondary">Asc</button>
<button class="btn btn-sm btn-outline-secondary">Desc</button>
</div>
</div>
<div class="vr"></div>
<div class="d-inline-flex gap-2">
<input wire:model.live.debounce.50ms="search" type="text" class="form-control form-control-sm"
placeholder="Search..."
name="" id="searchText">
<button class="btn btn-sm btn-outline-primary" id="searchButton">
<x-bi-search/>
</button>
</div>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-9">
<table class="table table-striped table-sm table-hover">
<thead>
<tr class="border-bottom border-black">
{{-- @if($this->showCustomerColumn)--}}
<th scope="col">Customer</th>
{{-- @endif()--}}
<th scope="col">Internal PO</th>
<th scope="col">Customer PO</th>
<th scope="col">Order Date</th>
<th scope="col">Due Date</th>
<th scope="col">Status</th>
<th scope="col">Rush</th>
<th scope="col">View</th>
</tr>
</thead>
<tbody>
@foreach($orders as $order)
<tr class="@if($today > $order->due_date && $order->active()) table-danger @elseif($order->rush && $order->active()) table-warning @endif">
<td><a class="text-reset text-decoration-none"
href="{{route('customers.show', [$order->customer, 'details'])}}">{{$order->customer->company_name}}</a>
</td>
<td class="fw-bold"><code>{{$order->internal_po}}</code></td>
<td class=""><code>{{$order->customer_po}}</code></td>
<td class="text-nowrap">{{$order->order_date}}</td>
<td class="text-nowrap ">
{{$order->due_date}}
@if($order->due_date < $today && $order->active())
<x-bi-exclamation-triangle/>
@endif </td>
<td>{{$order->status->value}}</td>
<td>
@if($order->rush)
<x-bi-check-lg class="text-danger"></x-bi-check-lg>
@endif
</td>
<td class="align-top">
<a class="btn btn-sm btn-outline-secondary px-1 py-0 m-0"
href="">
<x-bi-arrow-right/>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col"></div>
<div class="col-9">
{{$orders->links()}}
</div>
<div class="col"></div>
</div>
</div>

@ -0,0 +1,27 @@
@extends('layouts.app')
@section('header')
@include('partials.management.index.management-tabs')
@endsection()
@section('content')
<div class="container">
<div class="tab-content">
@include('partials.management.index.customers')
@include('partials.management.index.packing-slips')
@include('partials.management.index.service-files')
</div>
</div>
<!-- Create Customer Modal -->
@include('partials.customers.index.create-modal')
<!-- Delete Customer Modal -->
@include('partials.customers.index.delete-all-modal')
@endsection

@ -0,0 +1,39 @@
@extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- name row -->
<div class="row justify-content-center pb-2">
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-3">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark active" id="order-tab"
href="#" type="button" role="tab" aria-controls="order" aria-selected="true">
<x-bi-box/>
Add Products To Order
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-10 pt-3">
<livewire:order-products-create/>
</div>
</div>
</div>
@endsection

@ -1,130 +1,217 @@
@extends('layouts.app') @extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- name row -->
<div class="row justify-content-center pb-2">
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-2">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark active" id="order-tab"
href="#" type="button" role="tab"
aria-controls="order" aria-selected="true">
<x-bi-box/>
Create Order
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection
@section('content') @section('content')
<div class="container"> <div class="container-fluid mt-3" style="max-width: 1800px">
<div class="row justify-content-center">
<div class="col-8 pt-4">
<h4>Create Order</h4>
<div class="row mb-3">
<label for="customer_id" class="col-md-4 col-form-label text-md-end">Customer</label>
<div class="col-md-6">
<select name="customer_id" class="form-select" id="customer_id" autofocus>
@foreach($customers as $customer)
<option value="{{$customer->id}}">{{$customer->company_name}}</option>
@endforeach()
</select>
</div>
</div>
<div class="row mb-3"> <form action="{{route('orders.store') }}" method="post">
<label for="order_type" class="col-md-4 col-form-label text-md-end">Order Type</label> @csrf
<div class="col-md-6">
<select name="order_type" class="form-select" id="order_type" autofocus>
@foreach($order_types as $case)
<option value="{{$case->name}}">{{$case->value}}</option>
@endforeach()
</select>
</div>
</div>
<div class="row mb-3"> <div class="row justify-content-center">
<label for="order_status" class="col-md-4 col-form-label text-md-end">Order Status</label> <div class="col-11 col-xl-4 border-end" style="height: 730px">
<div class="col-md-6">
<select name="order_status" class="form-select" id="order_status" autofocus>
@foreach($order_status as $case)
<option value="{{$case->name}}">{{$case->value}}</option>
@endforeach()
</select>
</div>
</div>
<hr class="border-secondary-subtle mx-4 px-0"> <livewire:customer-and-contact-select :customers="$customers"/>
<div class="row mb-3"> <hr class="border-secondary-subtle px-0">
<label class="col-md-4 col-form-label text-md-end">Attributes</label>
<div class="col-md-3"> <div class="row mb-2">
<div class="form-check "> <label for="order_type" class="col-md-4 col-form-label text-md-end">Order Type</label>
<input class="form-check-input" type="checkbox" value="" id="new_art"> <div class="col-md-6">
<label class="form-check-label" for="new_art">New art</label> <select name="order_type" class="form-select form-select-sm" id="order_type">
</div> @foreach($order_types as $case)
<div class="form-check "> <option value="{{$case->name}}">{{$case->value}}</option>
<input class="form-check-input" type="checkbox" value="" id="rush"> @endforeach()
<label class="form-check-label" for="rush">Rush</label> </select>
</div>
<div class="form-check "> @error('order_type')
<input class="form-check-input" type="checkbox" value="" id="digitizing"> <span class="invalid-feedback" role="alert">
<label class="form-check-label" for="digitizing">Digitizing</label> <strong>{{ $message }}</strong>
</span>
@enderror
</div> </div>
<div class="form-check "> </div>
<input class="form-check-input" type="checkbox" value="" id="supplied_file">
<label class="form-check-label" for="supplied_file">Customer Supplied File</label> <div class="row mb-2">
<label for="order_status" class="col-md-4 col-form-label text-md-end">Order
Status</label>
<div class="col-md-6">
<select name="status" class="form-select form-select-sm" id="order_status">
@foreach($order_status as $case)
<option value="{{$case->value}}" {{ $case->name === 'APPROVED' ? 'selected' : '' }}>
{{$case->value}}
</option>
@endforeach()
</select>
@error('status')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div> </div>
</div> </div>
<div class="col-md-3">
<div class="form-check "> <hr class="border-secondary-subtle px-0">
<input class="form-check-input" type="checkbox" value="" id="repeat">
<label class="form-check-label" for="repeat">Repeat</label> <div class="row mb-2">
<label class="col-md-4 col-form-label text-md-end">Customer PO</label>
<div class="col-md-6">
<input id="customer_po" type="text"
class="form-control form-control-sm @error('customer_po') is-invalid @enderror"
name="customer_po" value="{{@old('customer_po')}}" required>
@error('customer_po')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div> </div>
<div class="form-check "> </div>
<input class="form-check-input" type="checkbox" value="" id="event">
<label class="form-check-label" for="event">Event</label> <hr class="border-secondary-subtle px-0">
<div class="row mb-2">
<label class="col-md-4 col-form-label text-md-end">Attributes</label>
<div class="col-md-3">
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="new_art" name="new_art"
value="1">
<label class="form-check-label" for="new_art">New art</label>
</div>
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="rush" name="rush" value="1">
<label class="form-check-label" for="rush">Rush</label>
</div>
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="digitizing"
name="digitizing" value="1">
<label class="form-check-label" for="digitizing">Digitizing</label>
</div>
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="supplied_file"
name="customer_supplied_file" value="1">
<label class="form-check-label" for="supplied_file">
Customer Supplied File
</label>
</div>
</div> </div>
<div class="form-check "> <div class="col-md-3">
<input class="form-check-input" type="checkbox" value="" id="purchased_garments"> <div class="form-check ">
<label class="form-check-label" for="purchased_garments">Purchased garments</label> <input class="form-check-input" type="checkbox" id="repeat" name="repeat"
value="1">
<label class="form-check-label" for="repeat">Repeat</label>
</div>
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="event" name="event"
value="1">
<label class="form-check-label" for="event">Event</label>
</div>
<div class="form-check ">
<input class="form-check-input" type="checkbox" id="purchased_garments"
value="1"
name="purchased_garment">
<label class="form-check-label" for="purchased_garments">
Purchased
garments</label>
</div>
</div> </div>
</div> </div>
</div>
<hr class="border-secondary-subtle mx-4 px-0"> <hr class="border-secondary-subtle px-0">
<div class="row mb-3"> <div class="row mb-2">
<label for="order_date" class="col-md-4 col-form-label text-md-end">Order date</label> <label for="order_date" class="col-md-4 col-form-label text-md-end">Order date</label>
<div class="col-md-6"> <div class="col-md-6">
<input id="order_date" type="date" <input id="order_date" type="date"
class="form-control @error('order_date') is-invalid @enderror" class="form-control form-control-sm @error('order_date') is-invalid @enderror"
name="order_date" value="{{ old('order_date') ?? $today }}" required name="order_date" value="{{ old('order_date') ?? $today }}" required
autocomplete="order_date"> >
@error('order_date') @error('order_date')
<span class="invalid-feedback" role="alert"> <span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong> <strong>{{ $message }}</strong>
</span> </span>
@enderror @enderror
</div>
</div> </div>
</div>
<div class="row mb-3"> <div class="row mb-2">
<label for="due_date" class="col-md-4 col-form-label text-md-end">Due date</label> <label for="due_date" class="col-md-4 col-form-label text-md-end">Due date</label>
<div class="col-md-6">
<input id="due_date" type="date"
class="form-control form-control-sm @error('due_date') is-invalid @enderror"
name="due_date" value="{{ old('due_date') ?? $due_default }}" required
>
<div class="col-md-6"> @error('due_date')
<input id="due_date" type="date" <span class="invalid-feedback" role="alert">
class="form-control @error('due_date') is-invalid @enderror" <strong>{{ $message }}</strong>
name="due_date" value="{{ old('due_date') ?? $due_default }}" required </span>
autocomplete="due_date"> @enderror
</div>
</div>
<hr class="border-secondary-subtle px-0">
<div class="row mb-2">
<label for="notes" class="col-md-4 col-form-label text-md-end">Notes</label>
@error('due_date') <div class="col-md-6">
<span class="invalid-feedback" role="alert"> <textarea name="notes" id="notes" cols="30" rows="4" class="form-control form-control-sm"
>{{ old('notes') }}</textarea>
@error('notes')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong> <strong>{{ $message }}</strong>
</span> </span>
@enderror @enderror
</div>
</div> </div>
</div> </div>
<hr class="border-secondary-subtle mx-4 px-0"> <div class="col-11 col-xl-7">
<livewire:order-products-create/>
</div>
<hr class="border-secondary-subtle px-0">
<div class="row mb-3"> <div class="row">
<label for="contact_id" class="col-md-4 col-form-label text-md-end">Contact</label> <div class="col text-end">
<div class="col-md-6"> <button type="submit" class="btn btn-primary">
<select name="contact_id" class="form-select" id="contact_id" autofocus> Save Order
<option value=""></option> </button>
</select>
</div> </div>
</div> </div>
</div> </div>
</div> </form>
</div> </div>
@endsection @endsection

@ -0,0 +1,91 @@
@extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- Customer company name row -->
<div class="row justify-content-center pb-2">
<div class="col-3"></div>
<div class="col">
{{-- <h2>Overview</h2>--}}
</div>
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-3">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'all' ? 'active' : ''}}" id="all-tab"
href="{{route('orders.index', ['tab' => 'all'])}}" type="button" role="tab"
aria-controls="all" aria-selected="{{$tab == 'all' ? 'true' : 'false'}}">
<x-bi-journals/>
All Orders
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'active_orders' ? 'active' : ''}}" id="active-orders-tab"
href="{{route('orders.index', ['tab' => 'active_orders'])}}" type="button" role="tab"
aria-controls="active_orders"
aria-selected="{{$tab == 'active_orders' ? 'true' : 'false'}}">
<x-bi-arrow-clockwise/>
Active Orders
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'finished_orders' ? 'active' : ''}}"
id="finished-orders-tab"
href="{{route('orders.index', ['tab' => 'finished_orders'])}}" type="button" role="tab"
aria-controls="finished_orders"
aria-selected="{{$tab == 'finished_orders' ? 'true' : 'false'}}">
<x-bi-check-all/>
Finished Orders
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-tab"
href="{{route('orders.index', ['tab' => 'invoice'])}}" type="button" role="tab"
aria-controls="invoice" aria-selected="{{$tab == 'invoice' ? 'true' : 'false'}}">
<x-bi-envelope/>
Invoiced Orders
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection
@section('content')
<div class="container">
<div class="row justify-content-center my-3">
<div class="tab-content">
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
aria-labelledby="active-orders-tab">
<livewire:orders-table order-type="active" :show-customer-column='true' :title="'Active Orders'"/>
</div>
<div class="tab-pane {{$tab == 'finished_orders' ? 'active' : ''}}" id="finished-orders" role="tabpanel"
aria-labelledby="finished-orders-tab">
<livewire:orders-table order-type="finished" :show-customer-column='true' title="Finished Orders"/>
</div>
<div class="tab-pane {{$tab == 'all' ? 'active' : ''}}" id="all-orders" role="tabpanel"
aria-labelledby="all-orders-tab">
<livewire:orders-table order-type="all" :show-customer-column='true' title="All Orders"/>
</div>
<div class="tab-pane {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-orders" role="tabpanel"
aria-labelledby="invoice-orders-tab">
<livewire:orders-table order-type="invoiced" :show-customer-column='true' title="Invoiced Orders"/>
</div>
</div>
</div>
</div>
@endsection

@ -0,0 +1,71 @@
@extends('layouts.app')
@section('header')
<div class="container-fluid bg-light pt-3">
<!-- Customer company name row -->
<div class="row justify-content-center pb-2">
<div class="col-3"></div>
<div class="col">
{{-- <h2>Overview</h2>--}}
</div>
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-3">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'details' ? 'active' : ''}}" id="details-tab"
href="{{route('orders.index', ['tab' => 'details'])}}" type="button" role="tab"
aria-controls="details" aria-selected="{{$tab == 'details' ? 'true' : 'false'}}">
<x-bi-list-ul/>
Order Details
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'timeline' ? 'active' : ''}}" id="timeline-tab"
href="{{route('orders.index', ['tab' => 'timeline'])}}" type="button" role="tab"
aria-controls="timeline" aria-selected="{{$tab == 'timeline' ? 'true' : 'false'}}">
<x-bi-calendar-range/>
Timeline
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>
@endsection
@section('content')
<div class="container">
<div class="row justify-content-center my-3">
<div class="tab-content">
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
aria-labelledby="active-orders-tab">
<livewire:orders-table order-type="active" :show-customer-column='true' :title="'Active Orders'"/>
</div>
<div class="tab-pane {{$tab == 'finished_orders' ? 'active' : ''}}" id="finished-orders" role="tabpanel"
aria-labelledby="finished-orders-tab">
<livewire:orders-table order-type="finished" :show-customer-column='true' title="Finished Orders"/>
</div>
<div class="tab-pane {{$tab == 'all' ? 'active' : ''}}" id="all-orders" role="tabpanel"
aria-labelledby="all-orders-tab">
<livewire:orders-table order-type="all" :show-customer-column='true' title="All Orders"/>
</div>
<div class="tab-pane {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-orders" role="tabpanel"
aria-labelledby="invoice-orders-tab">
<livewire:orders-table order-type="invoiced" :show-customer-column='true' title="Invoiced Orders"/>
</div>
</div>
</div>
</div>
@endsection

@ -1,110 +0,0 @@
<div class="modal modal-lg fade" id="editCustomerModal" tabindex="-1" aria-labelledby="editCustomerModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="editCustomerModalLabel">Edit Customer</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="{{route('customers.update', $customer)}}" method="post">
@csrf
@method('PATCH')
<div class="modal-body">
<div class="row mb-3">
<label for="company_name" class="col-md-4 col-form-label text-md-end">Company Name</label>
<div class="col-md-6">
<input id="company_name" type="text"
class="form-control @error('company_name') is-invalid @enderror"
name="company_name" value="{{$customer->company_name}}" required
autocomplete="company_name" autofocus>
@error('company_name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="internal_name" class="col-md-4 col-form-label text-md-end">Internal Name</label>
<div class="col-md-6">
<input id="internal_name" type="text"
class="form-control @error('internal_name') is-invalid @enderror"
name="internal_name" value="{{ $customer->internal_name }}" required
autocomplete="internal_name"
>
@error('internal_name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="shipping_address" class="col-md-4 col-form-label text-md-end">
Shipping Address
</label>
<div class="col-md-6">
<input id="shipping_address" type="text"
class="form-control @error('shipping_address') is-invalid @enderror"
name="shipping_address" value="{{ $customer->shipping_address }}" required
autocomplete="shipping_address">
@error('shipping_address')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="billing_address" class="col-md-4 col-form-label text-md-end">Billing Address</label>
<div class="col-md-6">
<input id="billing_address" type="text"
class="form-control @error('billing_address') is-invalid @enderror"
name="billing_address" value="{{ $customer->billing_address }}" required
autocomplete="billing_address" >
@error('billing_address')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="row mb-3">
<label for="phone" class="col-md-4 col-form-label text-md-end">Phone number</label>
<div class="col-md-6">
<input id="phone" type="text" class="form-control @error('phone') is-invalid @enderror"
name="phone" value="{{ $customer->phone }}" required autocomplete="phone">
@error('phone')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary">Edit customer</button>
</div>
</form>
</div>
</div>
</div>

@ -1,76 +0,0 @@
<div class="tab-pane {{$tab == 'details' ? 'active' : ''}}" id="details" role="tabpanel"
aria-labelledby="details-tab">
<div class="row justify-content-center mb-3">
<div class="col-9">
<div class="d-flex flex-row gap-2">
<div class="d-inline-flex">
<h4 class="my-auto">Active orders</h4>
</div>
<div class="mx-auto"></div>
<button class="btn btn-sm btn-primary" title="Create new shipping entry..."
data-bs-toggle="modal" data-bs-target="#createShippingEntryModal">
<x-bi-plus-circle-fill/>
Create entry
</button>
<div class="vr"></div>
<div class="d-inline-flex gap-2">
<input type="text" class="form-control form-control-sm" placeholder="Search..."
name="" id="searchText">
<button class="btn btn-sm btn-outline-primary" id="searchButton">
<x-bi-search/>
</button>
</div>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-9">
<table class="table table-striped table-sm table-hover">
<thead>
<tr class="border-bottom border-black">
<th scope="col">Internal PO</th>
<th scope="col">Customer PO</th>
<th scope="col">Order Date</th>
<th scope="col">Due Date</th>
<th scope="col">Status</th>
<th scope="col">Rush</th>
<th scope="col">View</th>
</tr>
</thead>
<tbody>
@foreach($active_orders as $order)
<tr>
<td class="fw-bold"><code>{{$order->internal_po}}</code></td>
<td class=""><code>{{$order->customer_po}}</code></td>
<td class="text-nowrap">{{$order->order_date}}</td>
<td class="text-nowrap">{{$order->due_date}}</td>
<td>{{$order->status->value}}</td>
<td>
@if($order->rush)
<x-bi-check-lg class="text-danger"></x-bi-check-lg>
@endif
</td>
<td class="align-top">
<a class="btn btn-sm btn-outline-secondary"
href="">
<x-bi-arrow-right/>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col"></div>
<div class="col-4">
{{$active_orders->links()}}
</div>
<div class="col"></div>
</div>
</div>

@ -36,10 +36,10 @@
@foreach ($contacts as $contact) @foreach ($contacts as $contact)
<tr> <tr>
<td>{{ $contact->first_name . ' ' . $contact->last_name }}</td> <td class="text-nowrap">{{ $contact->first_name . ' ' . $contact->last_name }}</td>
<td><a href="mailto:{{$contact->email}}">{{ $contact->email }}</a></td> <td class="text-nowrap"><a href="mailto:{{$contact->email}}">{{ $contact->email }}</a></td>
<td>{{ $contact->phone }}</td> <td class="text-nowrap">{{ $contact->phone }}</td>
<td>{{ $contact->notes }}</td> <td class="w-100">{{ $contact->notes }}</td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>

@ -0,0 +1,6 @@
<div class="tab-pane {{$tab == 'details' ? 'active' : ''}}" id="details" role="tabpanel"
aria-labelledby="details-tab">
<livewire:orders-table :show-customer-column="false" order-type="active" title="Active orders"
:customer_id="$customer->id"/>
</div>

@ -31,7 +31,7 @@
</div> </div>
<div class="row justify-content-center mb-3"> <div class="row justify-content-center mb-3">
<div class="col-9"> <div class="col-7">
<table class="table table-striped table-sm table-hover"> <table class="table table-striped table-sm table-hover">
<thead> <thead>
<tr class="border-bottom border-black"> <tr class="border-bottom border-black">
@ -44,10 +44,10 @@
<tbody> <tbody>
@foreach($packingSlips as $packingSlip) @foreach($packingSlips as $packingSlip)
<tr> <tr>
<td>{{$packingSlip->date_received}}</td> <td class="text-nowrap">{{$packingSlip->date_received}}</td>
<td><a href="">{{$packingSlip->order_id}}</a></td> <td class="text-nowrap"><a href="">{{$packingSlip->order_id}}</a></td>
<td>{{$packingSlip->amount}}</td> <td class="text-nowrap">{{$packingSlip->amount}}</td>
<td>{{$packingSlip->contents}}</td> <td class="w-50">{{$packingSlip->contents}}</td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>

@ -0,0 +1,76 @@
<div class="tab-pane {{$tab == 'customers' ? 'active' : ''}}" id="customers" role="tabpanel"
aria-labelledby="customers-tab">
<div class="row justify-content-center mb-3">
<div class="col">
<div class="d-flex flex-row gap-2">
<button class="btn btn-primary" title="Create new customer..."
data-bs-toggle="modal"
data-bs-target="#createCustomerModal">
<x-bi-person-plus-fill/>
Create entry
</button>
<div class="vr"></div>
<div class="d-inline-flex gap-2">
<input type="text" class="form-control" placeholder="Search..."
name="" id="">
<button class="btn btn-outline-primary">
<x-bi-search/>
</button>
</div>
<div class="mx-auto"></div>
<button class="btn btn-danger" title="Delete customer..."
data-bs-toggle="modal"
data-bs-target="#deleteCustomerModal">
<x-bi-trash-fill/>
Delete entry
</button>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col">
@if(sizeof($customers) !== 0)
<table class="table table-striped table-hover">
<thead>
<tr class="border-bottom border-black">
<th scope="col">Company Name</th>
<th scope="col">Internal Name</th>
<th scope="col">Shipping Address</th>
<th scope="col">Billing Address</th>
<th scope="col">Phone</th>
<th scope="col">View</th>
</tr>
</thead>
<tbody>
@foreach($customers as $customer)
<tr>
<td> {{$customer->company_name}} </td>
<td><code>{{$customer->internal_name}}</code></td>
<td> {{$customer->shipping_address}} </td>
<td> {{$customer->billing_address}} </td>
<td class="text-nowrap"> {{$customer->phone}} </td>
<td class="align-top">
<a class="btn btn-sm btn-outline-secondary"
href="{{route('customers.show', [$customer->id, 'tab'=>'details'])}}">
<x-bi-arrow-right/>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@else()
No customer data.
@endif
</div>
</div>
</div>

@ -0,0 +1,43 @@
<div class="container-fluid bg-light pt-3">
<!-- Customer company name row -->
<div class="row justify-content-center pb-2">
<div class="col-3"></div>
<div class="col">
</div>
</div>
<!-- Tabs row -->
<div class="row justify-content-center mb-3">
<div class="col-3 border-bottom"></div>
<div class="col-6 p-0">
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'customers' ? 'active' : ''}}" id="customers-tab"
href="{{route('management.index', 'customers')}}" type="button" role="tab"
aria-controls="customers" aria-selected="{{$tab == 'customers' ? 'true' : 'false'}}">
<x-bi-list-ul/>
Customers
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'packing' ? 'active' : ''}}" id="packing-tab"
href="{{route('management.index', 'packing')}}" type="button" role="tab"
aria-controls="packing" aria-selected="{{$tab == 'packing' ? 'true' : 'false'}}">
<x-bi-card-text/>
Packing Slips
</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link link-dark {{$tab == 'files' ? 'active' : ''}}" id="files-tab"
href="{{route('management.index', 'files')}}" type="button" role="tab"
aria-controls="files" aria-selected="{{$tab == 'files' ? 'true' : 'false'}}">
<x-bi-file-earmark/>
Service Files
</a>
</li>
</ul>
</div>
<div class="col border-bottom"></div>
</div>
</div>

@ -0,0 +1,5 @@
<div class="tab-pane {{$tab == 'packing' ? 'active' : ''}}" id="packing" role="tabpanel"
aria-labelledby="packing-tab">
packing slips
</div>

@ -0,0 +1,5 @@
<div class="tab-pane {{$tab == 'files' ? 'active' : ''}}" id="files" role="tabpanel"
aria-labelledby="files-tab">
Files
</div>

@ -1,46 +0,0 @@
@if ($paginator->hasPages())
<nav>
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
@endif
</ul>
</nav>
@endif

@ -1,88 +0,0 @@
@if ($paginator->hasPages())
<nav class="d-flex justify-items-center justify-content-between">
<div class="d-flex justify-content-between flex-fill d-sm-none">
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true">
<span class="page-link">@lang('pagination.previous')</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a>
</li>
@endif
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a>
</li>
@else
<li class="page-item disabled" aria-disabled="true">
<span class="page-link">@lang('pagination.next')</span>
</li>
@endif
</ul>
</div>
<div class="d-none flex-sm-fill d-sm-flex align-items-sm-center justify-content-sm-between">
<div>
<p class="small text-muted">
{!! __('Showing') !!}
<span class="fw-semibold">{{ $paginator->firstItem() }}</span>
{!! __('to') !!}
<span class="fw-semibold">{{ $paginator->lastItem() }}</span>
{!! __('of') !!}
<span class="fw-semibold">{{ $paginator->total() }}</span>
{!! __('results') !!}
</p>
</div>
<div>
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
@endif
</ul>
</div>
</div>
</nav>
@endif

@ -1,46 +0,0 @@
@if ($paginator->hasPages())
<nav>
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span aria-hidden="true">&lsaquo;</span>
</li>
@else
<li>
<a href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="disabled" aria-disabled="true"><span>{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="active" aria-current="page"><span>{{ $page }}</span></li>
@else
<li><a href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li>
<a href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
</li>
@else
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span aria-hidden="true">&rsaquo;</span>
</li>
@endif
</ul>
</nav>
@endif

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save