{{-- New-Unity ERP | purchases/rfq/show.blade.php | v1.2 | 12/07/2026 --}} {{-- v1.2 — Agrega botón "Confirm Cost" en panel awarded para recuperar flujo si se pierde sesión. --}} {{-- v1.1 — Agrega modal Add Supplier + botón en header Supplier Quotes. --}} {{-- v1.0 — Vista detalle del RFQ: productos, cotizaciones por proveedor, --}} {{-- panel de comparación de precios, semáforo de variación, adjudicación. --}} @extends('layouts.vertical') @section('content')
{{-- Header --}}

{{ $rfq->rfq_number }} {{ $rfq->statusLabel() }}

{{ $rfq->description ?? __('purchases.no-description') }}

@if($rfq->status === 'draft') {{ __('purchases.edit') }} @endif @if($rfq->canGeneratePO() && $rfq->status !== 'awarded') @endif {{ __('purchases.back') }}
{{-- Notificaciones --}} @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- Alerta: faltan cotizaciones --}} @if(!$rfq->canGeneratePO() && !in_array($rfq->status, ['awarded', 'cancelled']))
{{ __('purchases.more-quotes-needed', ['count' => $rfq->missingQuotes()]) }} {{ __('purchases.before-award') }} {{ __('purchases.received-req', ['received' => $rfq->receivedQuotesCount(), 'min' => $rfq->min_quotes]) }}
@endif
{{-- Left: Productos y cotizaciones --}}
{{-- Productos solicitados --}}
{{ __('purchases.products-requested') }}
@foreach($rfq->items as $item) @endforeach
{{ __('purchases.product') }} {{ __('purchases.qty') }} {{ __('purchases.unit') }} {{ __('purchases.ref-cost') }} {{ __('purchases.specs') }}
{{ $item->product?->product_name }}
{{ $item->product?->sku }}
{{ number_format($item->quantity, 2) }} {{ $item->unit }} @if($item->reference_cost > 0) ${{ number_format($item->reference_cost, 2) }}
{{ $item->reference_currency }} @else {{ __('purchases.no-ref-cost') }} @endif
{{ $item->specs ?? '—' }}
{{-- Cotizaciones por proveedor --}}
{{ __('purchases.supplier-quotes') }} {{ __('purchases.quotes-received-count', ['received' => $rfq->receivedQuotesCount(), 'total' => $rfq->quotes->count()]) }}
@foreach($rfq->quotes as $quote)
{{ $quote->supplier?->commercial_name ?? $quote->supplier?->name }} {{ ucfirst($quote->status) }} @if($quote->price_alert === 'above') {{ __('purchases.above-ref', ['perc' => number_format($quote->price_variance_perc, 2)]) }} @elseif($quote->price_alert === 'below') {{ __('purchases.below-ref', ['perc' => number_format(abs($quote->price_variance_perc), 2)]) }} @endif
@if($quote->status === 'pending' && !in_array($rfq->status, ['awarded','cancelled'])) @endif @if($quote->status === 'received') {{ __('purchases.view') }} @endif
@if($quote->status !== 'pending') {{-- Detalles de la cotización recibida --}}
@if($quote->supplier_quote_number)
{{ $quote->supplier_quote_number }}
@endif @if($quote->quote_date)
{{ $quote->quote_date->format('d-m-Y') }}
@endif @if($quote->delivery_days)
{{ __('purchases.days-delivery', ['days' => $quote->delivery_days]) }}
@endif @if($quote->payment_terms)
{{ $quote->payment_terms }}
@endif
{{-- Tabla de precios por producto --}} @foreach($quote->items as $qItem) @endforeach
{{ __('purchases.product') }} {{ __('purchases.unit-cost') }} {{ __('purchases.iva-col') }} {{ __('purchases.col-total-cost') }} {{ __('purchases.negotiated') }} {{ __('purchases.variance') }}
{{ $qItem->product?->product_name }} ${{ number_format($qItem->unit_cost, 4) }} {{ $qItem->iva_perc }}% ${{ number_format($qItem->total_cost, 4) }} @if($qItem->negotiated_cost) ${{ number_format($qItem->negotiated_cost, 4) }} @else @endif @if($qItem->reference_cost > 0) {{ $qItem->variance_perc > 0 ? '+' : '' }}{{ number_format($qItem->variance_perc, 2) }}% @else @endif
{{ __('purchases.total-colon') }} ${{ number_format($quote->total, 2) }}
@if($quote->buyer_notes)
{{ $quote->buyer_notes }}
@endif @endif
@endforeach
{{-- Right: Info general del RFQ --}}
{{ __('purchases.rfq-details') }}
{{ __('purchases.created-by-lbl') }} {{ $rfq->createdBy?->name }}
{{ __('purchases.created-lbl') }} {{ $rfq->created_at->format('d-m-Y H:i') }}
{{ __('purchases.currency') }}: {{ $rfq->currency }}
@if($rfq->required_date)
{{ __('purchases.required-date-lbl') }} {{ $rfq->required_date->format('d-m-Y') }}
@endif @if($rfq->deadline_date)
{{ __('purchases.quote-deadline-lbl') }} {{ $rfq->deadline_date->format('d-m-Y') }}
@endif
{{ __('purchases.quotes-received-lbl') }} {{ __('purchases.quotes-received-val', ['received' => $rfq->receivedQuotesCount(), 'min' => $rfq->min_quotes]) }}
@if($rfq->status === 'awarded')
{{ __('purchases.awarded-to-lbl') }}
{{ $rfq->awardedSupplier?->commercial_name }}
{{ $rfq->awarded_at?->format('d-m-Y H:i') }} @if($rfq->award_notes)
{{ $rfq->award_notes }} @endif
@php $awardedQuote = $rfq->quotes->where('status', 'awarded')->first(); $firstItem = $rfq->items->first(); $costConfirmed = $firstItem ? \App\Modules\Purchases\Models\ProductCost::where('product_id', $firstItem->product_id) ->where('source_rfq_id', $rfq->id) ->exists() : false; @endphp @if($awardedQuote && $firstItem && !$costConfirmed) {{ __('purchases.confirm-cost') }} @elseif($costConfirmed)
{{ __('purchases.cost-already-confirmed') }}
@endif @endif
{{-- Modal: Capturar cotización de proveedor --}} {{-- Modal: Adjudicar RFQ --}} @if($rfq->canGeneratePO() && $rfq->status !== 'awarded') @endif @endsection @section('scripts') @parent @endsection