178 lines
9.1 KiB
PHP
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);
|
|
}
|
|
}
|