Files
pos_heidiver/app/Filament/Widgets/PrendasPendientesWidget.php
T
2026-02-04 16:35:34 -05:00

178 lines
9.1 KiB
PHP

<?php
namespace App\Filament\Widgets;
use App\Models\OrdenProduccion;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class PrendasPendientesWidget extends BaseWidget
{
protected static ?int $sort = 2;
protected int | string | array $columnSpan = 'full';
protected static ?string $heading = 'Prendas Pendientes por Proceso';
public function table(Table $table): Table
{
return $table
->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);
}
}