@php // Check if proposal has a ProposalTemplate $hasTemplate = !empty($proposal->proposal_template_id); $proposalTemplate = null; $processedContent = ''; if ($hasTemplate) { $proposalTemplate = \App\Models\ProposalTemplate::find($proposal->proposal_template_id); if ($proposalTemplate) { $processedContent = \App\Models\ProposalTemplate::processTemplate( $proposalTemplate->content ?? '', $proposal, $company ?? [], $taxesMap ?? [], $taxRatesMap ?? [] ); } else { $hasTemplate = false; } } // Check if template content has {proposal_items} placeholder - totals are included in items $templateHasItemsPlaceholder = $hasTemplate && strpos($proposalTemplate->content ?? '', '{proposal_items}') !== false; // Get brand logos if passed (from print modal) $brandLogos = $brandLogos ?? collect([]); @endphp
@if(!empty($company['logo'])) @if(str_starts_with($company['logo'], 'data:image')) @else @endif @endif
{{ $company['name'] ?? config('app.name') }}
@if(!empty($company['address'])){{ $company['address'] }}
@endif @if(!empty($company['phone']))Phone: {{ $company['phone'] }}
@endif @if(!empty($company['email']))Email: {{ $company['email'] }}
@endif @if(!empty($company['gst']))GST: {{ $company['gst'] }}@endif
{{-- Brand Logos Section --}} @if($brandLogos->count() > 0)
Authorized Brands
@foreach($brandLogos as $brand) @if($brand->logo_base64) {{ $brand->name }} @elseif($brand->logo_path && file_exists($brand->logo_path)) {{ $brand->name }} @else {{ $brand->name }} @endif @endforeach
@endif
PROPOSAL
#{{ $proposal->proposal_number }}
Date:{{ $proposal->date ? $proposal->date->format('d M Y') : '-' }}
Valid Until:{{ $proposal->open_till ? $proposal->open_till->format('d M Y') : '-' }}
{{ ucfirst($proposal->status) }}
Prepared For
@if($proposal->customer)
{{ $proposal->customer->customer_type === 'company' ? $proposal->customer->company : $proposal->customer->name }}
@if($proposal->customer->customer_type === 'company' && $proposal->customer->name)Attn: {{ $proposal->customer->name }}
@endif @if($proposal->address){{ $proposal->address }}
@endif @if($proposal->city || $proposal->state){{ $proposal->city }}{{ $proposal->city && $proposal->state ? ', ' : '' }}{{ $proposal->state }}
@endif @if($proposal->country){{ $proposal->country }} {{ $proposal->zip_code }}
@endif @if($proposal->email)Email: {{ $proposal->email }}
@endif @if($proposal->phone)Phone: {{ $proposal->phone }}@endif
@elseif($proposal->lead)
{{ $proposal->lead->company ?? $proposal->lead->name }}
@if($proposal->lead->company && $proposal->lead->name)Attn: {{ $proposal->lead->name }}
@endif @if($proposal->address){{ $proposal->address }}
@endif @if($proposal->city || $proposal->state){{ $proposal->city }}{{ $proposal->city && $proposal->state ? ', ' : '' }}{{ $proposal->state }}
@endif @if($proposal->country){{ $proposal->country }} {{ $proposal->zip_code }}
@endif @if($proposal->email)Email: {{ $proposal->email }}
@endif @if($proposal->phone)Phone: {{ $proposal->phone }}@endif
@else
No client assigned
@endif
Proposal Details
Subject: {{ $proposal->subject ?? '-' }}
Currency: {{ $proposal->currency ?? 'INR' }}
Total: {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->total, 2) }}
@if($hasTemplate && $processedContent) {{-- ============================================ IF PROPOSAL TEMPLATE EXISTS - USE IT ============================================ --}}
{!! $processedContent !!}
{{-- Show items table AFTER template content ONLY if template doesn't have {proposal_items} placeholder --}} @if(!$templateHasItemsPlaceholder && $proposal->items->count() > 0)
📦 Proposal Items
@php $idx = 0; @endphp @foreach($proposal->items as $item) @if(($item->item_type ?? 'product') === 'section') @elseif(($item->item_type ?? 'product') === 'note') @else @php $idx++; $itemTaxIds = []; if (!empty($item->tax_ids)) { if (is_array($item->tax_ids)) { $itemTaxIds = array_map('intval', $item->tax_ids); } else { $decoded = json_decode($item->tax_ids, true); if (is_array($decoded)) { $itemTaxIds = array_map('intval', $decoded); } elseif (strpos($item->tax_ids, ',') !== false) { $itemTaxIds = array_map('intval', array_filter(explode(',', $item->tax_ids))); } elseif ($item->tax_ids) { $itemTaxIds = [intval($item->tax_ids)]; } } } @endphp @endif @endforeach
# Description Qty Rate Tax Amount
{{ $item->description }}
{{ $item->long_description ?: $item->description }}
{{ $idx }}
{{ $item->description }}
@if($item->long_description)
{{ $item->long_description }}
@endif
{{ number_format($item->quantity, 2) }} {{ number_format($item->rate, 2) }} @foreach($itemTaxIds as $taxId) {{ $taxRatesMap[$taxId] ?? 0 }}% @endforeach @if(empty($itemTaxIds))-@endif {{ number_format($item->amount, 2) }}
Proposal Total
{{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->total, 2) }}
Subtotal {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->subtotal, 2) }}
@if(($proposal->discount_amount ?? 0) > 0)
Discount @if($proposal->discount_percent > 0)({{ $proposal->discount_percent }}%)@endif - {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->discount_amount, 2) }}
@endif @if(isset($taxBreakdown) && count($taxBreakdown) > 0)
Tax Breakdown
@foreach($taxBreakdown as $tax)
{{ $tax['name'] }} ({{ $tax['rate'] }}%) {{ $proposal->currency ?? 'INR' }} {{ number_format($tax['amount'], 2) }}
@endforeach
@endif
Total Tax {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->tax_amount ?? 0, 2) }}
@if(($proposal->adjustment ?? 0) != 0)
Adjustment {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->adjustment, 2) }}
@endif
Grand Total {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->total, 2) }}
@endif @else {{-- ============================================ DEFAULT LAYOUT (No Template) ============================================ --}} @if($proposal->content)
📝 Introduction
{!! nl2br(e($proposal->content)) !!}
@endif @if($proposal->items->count() > 0) @php $idx = 0; @endphp @forelse($proposal->items as $item) @if(($item->item_type ?? 'product') === 'section') @elseif(($item->item_type ?? 'product') === 'note') @else @php $idx++; $itemTaxIds = []; if (!empty($item->tax_ids)) { if (is_array($item->tax_ids)) { $itemTaxIds = array_map('intval', $item->tax_ids); } else { $decoded = json_decode($item->tax_ids, true); if (is_array($decoded)) { $itemTaxIds = array_map('intval', $decoded); } elseif (strpos($item->tax_ids, ',') !== false) { $itemTaxIds = array_map('intval', array_filter(explode(',', $item->tax_ids))); } elseif ($item->tax_ids) { $itemTaxIds = [intval($item->tax_ids)]; } } } @endphp @endif @empty @endforelse
# Description Qty Rate Tax Amount
{{ $item->description }}
{{ $item->long_description ?: $item->description }}
{{ $idx }}
{{ $item->description }}
@if($item->long_description)
{{ $item->long_description }}
@endif
{{ number_format($item->quantity, 2) }} {{ number_format($item->rate, 2) }} @foreach($itemTaxIds as $taxId) {{ $taxRatesMap[$taxId] ?? 0 }}% @endforeach @if(empty($itemTaxIds))-@endif {{ number_format($item->amount, 2) }}
No items
Proposal Total
{{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->total, 2) }}
Subtotal {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->subtotal, 2) }}
@if(($proposal->discount_amount ?? 0) > 0)
Discount @if($proposal->discount_percent > 0)({{ $proposal->discount_percent }}%)@endif - {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->discount_amount, 2) }}
@endif @if(isset($taxBreakdown) && count($taxBreakdown) > 0)
Tax Breakdown
@foreach($taxBreakdown as $tax)
{{ $tax['name'] }} ({{ $tax['rate'] }}%) {{ $proposal->currency ?? 'INR' }} {{ number_format($tax['amount'], 2) }}
@endforeach
@endif
Total Tax {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->tax_amount ?? 0, 2) }}
@if(($proposal->adjustment ?? 0) != 0)
Adjustment {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->adjustment, 2) }}
@endif
Grand Total {{ $proposal->currency ?? 'INR' }} {{ number_format($proposal->total, 2) }}
@endif @endif @if($proposal->terms_and_conditions)
Terms & Conditions
{!! $proposal->terms_and_conditions !!}
@endif @if($proposal->privacy_policy)
Privacy Policy
{!! $proposal->privacy_policy !!}
@endif @if($proposal->payment_details)
Payment Details
{!! $proposal->payment_details !!}
@endif @if($proposal->conclusion)
Conclusion
{!! $proposal->conclusion !!}
@endif @if(!empty($company['signature']))
Customer Signature
@if(str_starts_with($company['signature'], 'data:image')) @else @endif
{{ $company['name'] ?? config('app.name') }}
Authorized Signatory
@endif