up
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
<?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
|
||||
$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');
|
||||
|
||||
return max(0, $disponiblesConfeccion - $enviadasOjales);
|
||||
})
|
||||
->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): int {
|
||||
// Enviadas a ojales - Terminadas en ojales
|
||||
$enviadas = $record->ojales()->sum('cantidad_enviada');
|
||||
$terminadas = $record->ojales()
|
||||
->where('terminada', true)
|
||||
->sum('cantidad_enviada');
|
||||
|
||||
return max(0, $enviadas - $terminadas);
|
||||
})
|
||||
->color(fn ($state) => $state > 0 ? 'warning' : 'gray')
|
||||
->weight(fn ($state) => $state > 0 ? 'bold' : 'normal'),
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user