@if($product->photos->count() > 0)
@foreach($product->photos as $idx => $photo)
@if($idx === 0)
Main
@endif
@endforeach
{{ $product->photos->count() }}/5 photos uploaded. Add new photos below.
@endif
@if($product->photos->count() < 5)
@endif
@error('description') {{ $message }} @enderror
status) === 'draft' ? 'selected' : '' }}>Draft
status) === 'active' ? 'selected' : '' }}>Active
status) === 'inactive' ? 'selected' : '' }}>Inactive
@error('status') {{ $message }} @enderror
Cancel
Save Details
Next: Inventory
Inventory Type *
inventory_type) === 'simple' ? 'selected' : '' }}>Simple (fixed quantity)
inventory_type) === 'assets' ? 'selected' : '' }}>Assets (linked to asset pool)
inventory_type) === 'unlimited' ? 'selected' : '' }}>Unlimited (inventory is unlimited)
@error('inventory_type') {{ $message }} @enderror
Assets *
Assets are made up of resources you can use across products. Add your assets for this product.
{{-- Category Picker --}}
— Select an asset category —
@foreach($assetCategories as $ac)
asset_category_id) == $ac->id ? 'selected' : '' }}>
{{ $ac->name }}
@endforeach
@error('asset_category_id')
{{ $message }} @enderror
{{-- Pool Block --}}
Quantity
total no. of assets
Total
Quantity × Capacity
@foreach($selectedAssets as $sa)
@endforeach
Previous
Save Inventory
Next: Availability
@php $avail = $product->availability->first(); @endphp
Availability Name {{ strlen(old('availability.event_name', $avail->event_name ?? '')) }}/150
@error('availability.event_name') {{ $message }} @enderror
Days of Week
@php
$daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
$dayValues = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
$savedDays = $avail ? ($avail->days_of_week ?? $dayValues) : $dayValues;
$oldDays = old('availability.days_of_week', $savedDays);
@endphp
@foreach($daysOfWeek as $i => $day)
{{ $day }}
@endforeach
@php
$toMinutes = function ($value, $unit) {
if ($value === null || $value === '') {
return 0;
}
return match ($unit) {
'days' => (int) $value * 24 * 60,
'hours' => (int) $value * 60,
default => (int) $value,
};
};
$minDurationMinutes = old('availability.min_duration_hours') !== null || old('availability.min_duration_minutes') !== null
? null
: $toMinutes($avail?->min_duration_value, $avail?->min_duration_unit);
$maxDurationMinutes = old('availability.max_duration_hours') !== null || old('availability.max_duration_minutes') !== null
? null
: $toMinutes($avail?->max_duration_value, $avail?->max_duration_unit);
$bookingWindowMinutes = old('availability.booking_window_hours') !== null || old('availability.booking_window_minutes') !== null
? null
: $toMinutes($avail?->booking_window_value, $avail?->booking_window_unit);
$cutoffWindowMinutes = old('availability.cutoff_window_hours') !== null || old('availability.cutoff_window_minutes') !== null
? null
: $toMinutes($avail?->cutoff_window_value, $avail?->cutoff_window_unit);
$bookingRulesEnabled = old('availability.booking_rules_enabled', $avail?->booking_rules_enabled ? '1' : '');
@endphp
Apply rules to this event
Booking Rules
Use hours and minutes. Leave both fields at 0 to skip a rule.
Booking Window
How far in advance
Cutoff Window
Last-minute cutoff
Previous
Save Availability
Next: Pricing
Additional pricing rules can be configured after saving the product.
Deposit Type
@php $savedDepositType = old('deposit_type', $product->deposit_type ?? 'system_default'); @endphp
Use System Settings (100%)
% Percent
$ USD (Fixed Amount)
{{-- Percent input --}}
{{-- Dollar input (fixed / per day / per qty) --}}
Taxes & Fees
Select taxes and fees to apply to this product.
@if($taxFees->isEmpty())
No active taxes or fees. Create one first.
@else
@php $selectedTaxFees = old('tax_fees', $product->taxFees->pluck('id')->toArray()); @endphp
@foreach($taxFees as $fee)
id, $selectedTaxFees) ? 'checked' : '' }}>
{{ $fee->name }}
{{ number_format($fee->percent, 2) }}%
@endforeach
@endif
Custom Rates
Only custom rates assigned to this product are shown here.
Add Rate
@foreach($product->customRates as $rate)
@endforeach
@if($customRates->isEmpty())
No custom rates assigned to this product yet.
@else
@foreach($customRates as $rate)
{{ $rate->name }}
{{ ucfirst(str_replace('_', ' ', $rate->rate_type)) }}
@if($rate->start_date)
• {{ $rate->start_date->format('Y/m/d') }}
@endif
@if($rate->end_date)
- {{ $rate->end_date->format('Y/m/d') }}
@else
- Open Ended
@endif
• {{ $rate->products_count }} linked product{{ $rate->products_count === 1 ? '' : 's' }}
Assigned
@endforeach
@endif
{{ $product->name }}
Base Rate
${{ number_format($product->base_price ?? 0, 2) }}
@forelse($product->customRates as $rate)
@php
$rateTypeLabel = match($rate->rate_type) {
'per_booking' => 'Per Booking',
'per_24_hours' => 'Per 24 Hours',
default => 'Per Day',
};
@endphp
{{ Str::limit($rate->name, 25) }}
{{ $rateTypeLabel }}
{{ $rate->start_date->format('Y/m/d') }} – {{ $rate->end_date ? $rate->end_date->format('Y/m/d') : '∞' }}
@foreach($rate->tiers as $tier)
@php
$unit = match($rate->rate_type) {
'per_24_hours' => 'Day',
'per_day' => 'Day',
default => 'Booking',
};
$lower = $tier->lower_threshold;
$upper = $tier->upper_threshold;
if ($upper === null) {
$tierLabel = $lower . ' – ∞ ' . $unit . 's';
} elseif ((int)$lower === (int)$upper) {
$tierLabel = $lower . ' ' . $unit . ($lower > 1 ? 's' : '');
} else {
$tierLabel = $lower . ' - ' . $upper . ' ' . $unit . 's';
}
$base = (float)($product->base_price ?? 0);
$adj = (float)$tier->adjustment_amount;
$price = $base + $adj;
@endphp
{{ $tierLabel }}
${{ number_format($price, 2) }}
(+${{ number_format($adj, 2) }})
@endforeach
@empty
No custom rates added yet.
@endforelse