@extends('templates.adminlte') @section('content-header')

Compras

@endsection @section('main-content') @php $productOptions = $products ?? collect(); $materialOptions = $materials ?? collect(); $equipmentOptions = $equipments ?? collect(); $catalogs = [ 'equipment' => $equipmentOptions, 'product' => $productOptions, 'material' => $materialOptions, ]; $catalogCounts = [ 'equipment' => $equipmentOptions->count(), 'product' => $productOptions->count(), 'material' => $materialOptions->count(), ]; $productsCount = array_sum($catalogCounts); $formatCurrency = fn($amount) => '$' . number_format((float) $amount, 2); $inputClass = 'w-full rounded-2xl border border-primary-600/40 bg-primary-900/70 px-4 py-3 text-sm text-on-primary placeholder:text-primary-300 transition focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20'; $compactInputClass = 'w-full rounded-xl border border-primary-600/40 bg-primary-900/70 px-3 py-2 text-sm text-on-primary transition focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20'; $labelClass = 'text-[11px] font-semibold uppercase tracking-[0.24em] text-primary-200'; $sectionClass = 'rounded-3xl border border-primary-700/60 bg-primary-800 p-6 shadow-2xl shadow-primary-900/20'; $mutedPanelClass = 'rounded-2xl border border-primary-700/60 bg-primary-900/40'; $buildCode = fn(string $type, $id) => match ($type) { 'equipment' => 'EQP-' . str_pad((string) $id, 3, '0', STR_PAD_LEFT), 'material' => 'MAT-' . str_pad((string) $id, 3, '0', STR_PAD_LEFT), default => 'PRD-' . str_pad((string) $id, 3, '0', STR_PAD_LEFT), }; $buildRow = function ($item, string $type, int $index) use ($buildCode) { $quantity = $index === 0 ? 2 : 10; $price = $index === 0 ? 4500 : 1200; return [ 'id' => $item->id, 'type' => $type, 'name' => $item->name, 'code' => $buildCode($type, $item->id), 'unit' => $item->unit ?: 'Pieza', 'quantity' => $quantity, 'price' => $price, 'subtotal' => $quantity * $price, ]; }; $catalogPayload = collect($catalogs) ->map( fn($items, $type) => $items ->map( fn($item) => [ 'id' => $item->id, 'name' => $item->name, 'unit' => $item->unit ?: 'Pieza', 'code' => $buildCode($type, $item->id), ], ) ->values(), ) ->all(); $defaultType = $equipmentOptions->isNotEmpty() ? 'equipment' : ($productOptions->isNotEmpty() ? 'product' : 'material'); $defaultRows = ($catalogs[$defaultType] ?? collect()) ->take(2) ->values() ->map(fn($item, $index) => $buildRow($item, $defaultType, $index)); if ($defaultRows->isEmpty()) { $defaultRows = collect([ [ 'id' => null, 'type' => $defaultType, 'name' => 'Producto pendiente por seleccionar', 'code' => 'PRD-000', 'unit' => 'Pieza', 'quantity' => 1, 'price' => 0, 'subtotal' => 0, ], ]); } $oldRows = collect(old('items', [])) ->filter(fn($row) => filled($row['item_id'] ?? null) || filled($row['quantity'] ?? null) || filled($row['price'] ?? null)) ->values() ->map(function ($row) use ($catalogs, $buildCode) { $type = in_array($row['type'] ?? '', ['equipment', 'product', 'material'], true) ? $row['type'] : 'equipment'; $item = ($catalogs[$type] ?? collect())->firstWhere('id', (int) ($row['item_id'] ?? 0)); $quantity = (float) ($row['quantity'] ?? 0); $price = (float) ($row['price'] ?? 0); return [ 'id' => $item?->id, 'type' => $type, 'name' => $item?->name ?? 'Concepto pendiente por seleccionar', 'code' => $item ? $buildCode($type, $item->id) : 'NUEVO', 'unit' => $item?->unit ?: 'Pieza', 'quantity' => $quantity, 'price' => $price, 'subtotal' => $quantity * $price, ]; }); $conceptRows = $oldRows->isNotEmpty() ? $oldRows : $defaultRows; $discountEnabled = (bool) old('discount_enabled', false); $discountRate = (float) old('discount_rate', 10); $ivaEnabled = (bool) old('iva_enabled', false); $ivaRate = (float) old('iva_rate', 16); $creditLimitEnabled = (bool) old('credit_limit_enabled', false); $summarySubtotal = (float) $conceptRows->sum('subtotal'); $summaryDiscount = $discountEnabled ? $summarySubtotal * ($discountRate / 100) : 0; $summaryTax = $ivaEnabled ? ($summarySubtotal - $summaryDiscount) * ($ivaRate / 100) : 0; $summaryTotal = $summarySubtotal - $summaryDiscount + $summaryTax; @endphp
Centro de Compras Nueva captura

Abastecimiento operativo

Registrar compra para actualizar el almacen.

Captura proveedor, fecha, comprobantes y conceptos para mantener el historial de adquisiciones alineado con el inventario de Pirotecnia San Rafael.

Folio

CMP-NUEVA

Conceptos

{{ number_format($productsCount) }}

Estatus

Borrador

@if ($errors->any())

No se pudo guardar la compra

@endif
@csrf

Datos generales

Informacion de la compra

Registra la informacion base para ubicar la adquisicion dentro del historial y asociarla con el usuario responsable.

Borrador
shield_person

Administrador

Sede Central

Detalle de conceptos

Equipo

@foreach ($conceptRows as $index => $row) @php $rowOptions = $catalogs[$row['type']] ?? collect(); @endphp @endforeach
Concepto Cantidad Unidad Costo unit. Subtotal
@if ($rowOptions->isNotEmpty()) @else

{{ $row['name'] }}

@endif

{{ $row['code'] }}

{{ $row['unit'] }} {{ $formatCurrency($row['subtotal']) }}

Compra lista para revision

Revisa proveedor, productos y totales antes de confirmar el movimiento.

close Cancelar
@endsection