query( OrdenProduccion::query() ->whereIn('estado', ['en_proceso', 'en_confeccion', 'en_tintoreria', 'en_acabados']) ->orderBy('created_at', 'desc') ) ->columns([ Tables\Columns\TextColumn::make('numero_orden') ->label('Orden') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('prenda_modelo') ->label('Prenda') ->searchable() ->limit(30), Tables\Columns\TextColumn::make('cantidad_total') ->label('Total OP') ->alignCenter(), Tables\Columns\TextColumn::make('pendiente_confeccion') ->label('Pend. Confección') ->alignCenter() ->state(function (OrdenProduccion $record): int { // Recibidas en confección - Enviadas a ojales y prensillas $recibidas = $record->confecciones() ->whereNotNull('fecha_recepcion') ->sum('cantidad_recibida'); // Restamos arreglos y cobros de confección $arreglos = \App\Models\Ajuste::where('referencia_type', \App\Models\Confeccion::class) ->whereHas('referencia', function($q) use ($record) { $q->where('orden_produccion_id', $record->id); })->where('tipo', 'arreglo')->sum('cantidad'); $cobros = \App\Models\Cobro::where('referencia_type', \App\Models\Confeccion::class) ->whereHas('referencia', function($q) use ($record) { $q->where('orden_produccion_id', $record->id); })->sum('cantidad'); $disponiblesConfeccion = $recibidas - $arreglos - $cobros; $enviadasOjales = $record->ojales()->sum('cantidad_enviada'); $enviadasPrensillas = $record->prensillas()->sum('cantidad_enviada'); return max(0, $disponiblesConfeccion - $enviadasOjales - $enviadasPrensillas); }) ->color(fn ($state) => $state > 0 ? 'warning' : 'gray') ->weight(fn ($state) => $state > 0 ? 'bold' : 'normal'), Tables\Columns\TextColumn::make('pendiente_ojales') ->label('Pend. Ojales') ->alignCenter() ->state(function (OrdenProduccion $record): string { // Enviadas a ojales - Terminadas en ojales $enviadas = $record->ojales()->sum('cantidad_enviada'); $terminadas = $record->ojales() ->where('terminada', true) ->sum('cantidad_enviada'); $pendientes = max(0, $enviadas - $terminadas); return "{$terminadas}/{$enviadas}"; }) ->color(function (OrdenProduccion $record) { $enviadas = $record->ojales()->sum('cantidad_enviada'); $terminadas = $record->ojales()->where('terminada', true)->sum('cantidad_enviada'); return $terminadas < $enviadas ? 'warning' : ($terminadas > 0 ? 'success' : 'gray'); }) ->weight(function (OrdenProduccion $record) { $enviadas = $record->ojales()->sum('cantidad_enviada'); $terminadas = $record->ojales()->where('terminada', true)->sum('cantidad_enviada'); return $terminadas < $enviadas ? 'bold' : 'normal'; }) ->tooltip('Terminadas / Total Enviadas'), Tables\Columns\TextColumn::make('pendiente_prensillas') ->label('Pend. Prensillas') ->alignCenter() ->state(function (OrdenProduccion $record): string { $enviadas = $record->prensillas()->sum('cantidad_enviada'); $terminadas = $record->prensillas() ->where('terminada', true) ->sum('cantidad_enviada'); $pendientes = max(0, $enviadas - $terminadas); return "{$terminadas}/{$enviadas}"; }) ->color(function (OrdenProduccion $record) { $enviadas = $record->prensillas()->sum('cantidad_enviada'); $terminadas = $record->prensillas()->where('terminada', true)->sum('cantidad_enviada'); return $terminadas < $enviadas ? 'warning' : ($terminadas > 0 ? 'success' : 'gray'); }) ->weight(function (OrdenProduccion $record) { $enviadas = $record->prensillas()->sum('cantidad_enviada'); $terminadas = $record->prensillas()->where('terminada', true)->sum('cantidad_enviada'); return $terminadas < $enviadas ? 'bold' : 'normal'; }) ->tooltip('Terminadas / Total Enviadas'), Tables\Columns\TextColumn::make('pendiente_tintoreria') ->label('Pend. Tintorería') ->alignCenter() ->state(function (OrdenProduccion $record): int { // Enviadas a tintorería - Recibidas de tintorería $enviadas = $record->tintorerias() ->sum('cantidad_enviada'); $recepciones = 0; foreach ($record->tintorerias as $tintoreria) { $recepciones += (int) $tintoreria->recepciones() ->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); } return max(0, $enviadas - $recepciones); }) ->color(fn ($state) => $state > 0 ? 'warning' : 'gray') ->weight(fn ($state) => $state > 0 ? 'bold' : 'normal'), Tables\Columns\TextColumn::make('pendiente_acabados') ->label('Pend. Acabados') ->alignCenter() ->state(function (OrdenProduccion $record): int { // Disponibles desde tintorería - Enviadas a acabados $recepciones = 0; foreach ($record->tintorerias as $tintoreria) { $recep = (int) $tintoreria->recepciones() ->sum(DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)')); $reprocesos = (int) $tintoreria->ajustes() ->where('tipo', 'reproceso')->sum('cantidad'); $cobros = (int) $tintoreria->cobros()->sum('cantidad'); $recepciones += ($recep - $reprocesos - $cobros); } $enviadasAcabados = $record->procesosAcabado() ->sum('cantidad_enviada'); return max(0, $recepciones - $enviadasAcabados); }) ->color(fn ($state) => $state > 0 ? 'warning' : 'gray') ->weight(fn ($state) => $state > 0 ? 'bold' : 'normal'), Tables\Columns\TextColumn::make('en_bodega') ->label('En Bodega') ->alignCenter() ->state(function (OrdenProduccion $record): int { // Inventario disponible return $record->inventarioPrenda() ->sum('cantidad_disponible'); }) ->color(fn ($state) => $state > 0 ? 'success' : 'gray') ->weight(fn ($state) => $state > 0 ? 'bold' : 'normal'), ]) ->paginated([10, 25, 50]) ->defaultPaginationPageOption(25); } }