u
This commit is contained in:
@@ -166,6 +166,7 @@ class ConfeccionResource extends Resource
|
|||||||
TextColumn::make('total_pagar')
|
TextColumn::make('total_pagar')
|
||||||
->money('COP'),
|
->money('COP'),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
||||||
->label('Orden de Producción')
|
->label('Orden de Producción')
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ class InventarioPrendaResource extends Resource
|
|||||||
'success' => 'lista_despacho',
|
'success' => 'lista_despacho',
|
||||||
]),
|
]),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
||||||
->label('Orden de Producción')
|
->label('Orden de Producción')
|
||||||
|
|||||||
@@ -140,7 +140,8 @@ class OrdenProduccionResource extends Resource
|
|||||||
->label('Tela')
|
->label('Tela')
|
||||||
->toggleable(),
|
->toggleable(),
|
||||||
|
|
||||||
BadgeColumn::make('estado')
|
BadgeColumn::make('estado_display')
|
||||||
|
->label('Estado')
|
||||||
->colors([
|
->colors([
|
||||||
'warning' => 'en_corte',
|
'warning' => 'en_corte',
|
||||||
'info' => 'en_confeccion',
|
'info' => 'en_confeccion',
|
||||||
@@ -159,11 +160,37 @@ class OrdenProduccionResource extends Resource
|
|||||||
TextColumn::make('fecha_entrega_estimada')
|
TextColumn::make('fecha_entrega_estimada')
|
||||||
->date(),
|
->date(),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
//
|
//
|
||||||
])
|
])
|
||||||
->actions([
|
->actions([
|
||||||
Tables\Actions\EditAction::make(),
|
Tables\Actions\EditAction::make(),
|
||||||
|
|
||||||
|
Tables\Actions\Action::make('finalizar')
|
||||||
|
->label('Finalizar')
|
||||||
|
->icon('heroicon-o-check')
|
||||||
|
->color('success')
|
||||||
|
->requiresConfirmation()
|
||||||
|
->visible(fn($record) => $record->estado !== 'finalizada')
|
||||||
|
->action(function ($record) {
|
||||||
|
try {
|
||||||
|
// Forzar finalización
|
||||||
|
$record->manualFinalize();
|
||||||
|
|
||||||
|
\Filament\Notifications\Notification::make()
|
||||||
|
->success()
|
||||||
|
->title('Orden finalizada')
|
||||||
|
->body('La orden se marcó como finalizada manualmente.')
|
||||||
|
->send();
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
\Filament\Notifications\Notification::make()
|
||||||
|
->danger()
|
||||||
|
->title('Error')
|
||||||
|
->body($e->getMessage())
|
||||||
|
->send();
|
||||||
|
}
|
||||||
|
}),
|
||||||
])
|
])
|
||||||
->bulkActions([
|
->bulkActions([
|
||||||
Tables\Actions\BulkActionGroup::make([
|
Tables\Actions\BulkActionGroup::make([
|
||||||
|
|||||||
@@ -51,15 +51,14 @@ class ProcesoAcabadoResource extends Resource
|
|||||||
->required()
|
->required()
|
||||||
->afterStateUpdated(function ($state, $set) {
|
->afterStateUpdated(function ($state, $set) {
|
||||||
if ($state) {
|
if ($state) {
|
||||||
// Sumar lo recibido en Tintorería
|
// Total recibido en Tintorería para esta OP
|
||||||
$sumTint = \App\Models\Tintoreria::where('orden_produccion_id', $state)->sum('cantidad_recibida');
|
$sumTint = \App\Models\Tintoreria::where('orden_produccion_id', $state)->sum('cantidad_recibida');
|
||||||
|
|
||||||
// Restar lo ya enviado a acabados y aún en proceso
|
// Restar todo lo ya enviado a procesos de acabados (de la misma OP)
|
||||||
$sentInProcess = \App\Models\ProcesoAcabado::where('orden_produccion_id', $state)
|
$sentToAcabados = \App\Models\ProcesoAcabado::where('orden_produccion_id', $state)
|
||||||
->whereNull('fecha_recepcion')
|
|
||||||
->sum('cantidad_enviada');
|
->sum('cantidad_enviada');
|
||||||
|
|
||||||
$pending = max(0, (int)$sumTint - (int)$sentInProcess);
|
$pending = max(0, (int)$sumTint - (int)$sentToAcabados);
|
||||||
|
|
||||||
$set('cantidad_enviada', $pending ?: 0);
|
$set('cantidad_enviada', $pending ?: 0);
|
||||||
$set('fecha_envio', now()->toDateString());
|
$set('fecha_envio', now()->toDateString());
|
||||||
@@ -85,7 +84,8 @@ class ProcesoAcabadoResource extends Resource
|
|||||||
->numeric()
|
->numeric()
|
||||||
->required()
|
->required()
|
||||||
->reactive()
|
->reactive()
|
||||||
->helperText(fn ($get) => 'Sugerido: ' . (\App\Models\Tintoreria::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_recibida') ?: 0)),
|
->helperText(fn ($get) => 'Sugerido: ' . (max(0, (int)\App\Models\Tintoreria::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_recibida') - (int)\App\Models\ProcesoAcabado::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_enviada')) ?: 0)),
|
||||||
|
|
||||||
|
|
||||||
DatePicker::make('fecha_envio')
|
DatePicker::make('fecha_envio')
|
||||||
->required()
|
->required()
|
||||||
@@ -144,6 +144,7 @@ class ProcesoAcabadoResource extends Resource
|
|||||||
'success' => fn($state) => $state !== null,
|
'success' => fn($state) => $state !== null,
|
||||||
]),
|
]),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
||||||
->label('Orden de Producción')
|
->label('Orden de Producción')
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ class TelaResource extends Resource
|
|||||||
Tables\Columns\TextColumn::make('costo_por_metro')->money('USD')->sortable(),
|
Tables\Columns\TextColumn::make('costo_por_metro')->money('USD')->sortable(),
|
||||||
Tables\Columns\TextColumn::make('fecha_compra')->date()->sortable(),
|
Tables\Columns\TextColumn::make('fecha_compra')->date()->sortable(),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('tipo')
|
Tables\Filters\SelectFilter::make('tipo')
|
||||||
->options([
|
->options([
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ class TintoreriaResource extends Resource
|
|||||||
->getStateUsing(fn($record) => optional($record->recepciones()->latest('fecha_recepcion')->first())->fecha_recepcion)
|
->getStateUsing(fn($record) => optional($record->recepciones()->latest('fecha_recepcion')->first())->fecha_recepcion)
|
||||||
->date(),
|
->date(),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
Tables\Filters\SelectFilter::make('orden_produccion_id')
|
||||||
->label('Orden de Producción')
|
->label('Orden de Producción')
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class TrasladoPrendaResource extends Resource
|
|||||||
TextColumn::make('fecha_recepcion')->dateTime(),
|
TextColumn::make('fecha_recepcion')->dateTime(),
|
||||||
TextColumn::make('referencia_type')->label('Referencia'),
|
TextColumn::make('referencia_type')->label('Referencia'),
|
||||||
])
|
])
|
||||||
|
->defaultSort('created_at', 'desc')
|
||||||
->filters([
|
->filters([
|
||||||
SelectFilter::make('orden_produccion_id')
|
SelectFilter::make('orden_produccion_id')
|
||||||
->label('Orden de Producción')
|
->label('Orden de Producción')
|
||||||
|
|||||||
@@ -190,6 +190,43 @@ class OrdenProduccion extends Model
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Estado calculado para mostrar en UI: si está completada o la última etapa que tiene tareas pendientes.
|
||||||
|
*/
|
||||||
|
public function getEstadoDisplayAttribute()
|
||||||
|
{
|
||||||
|
if ($this->canBeFinalized() || $this->estado === 'finalizada') {
|
||||||
|
return 'finalizada';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revisar etapas de último a primero para encontrar la etapa que aún tiene tareas pendientes
|
||||||
|
if (\App\Models\ProcesoAcabado::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
|
||||||
|
return 'en_acabados';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\App\Models\Tintoreria::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
|
||||||
|
return 'en_tintoreria';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\App\Models\Confeccion::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
|
||||||
|
return 'en_confeccion';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Por defecto devolver el estado actual (incluye en_corte u otros)
|
||||||
|
return $this->estado ?? 'en_corte';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forzar finalización manualmente (útil si desea marcar como finalizada aunque no esté totalmente recibida)
|
||||||
|
*/
|
||||||
|
public function manualFinalize(): void
|
||||||
|
{
|
||||||
|
$this->update(['estado' => 'finalizada']);
|
||||||
|
|
||||||
|
// Intentar crear inventario con lo recibido hasta ahora
|
||||||
|
$this->crearInventarioPorFinalizacion();
|
||||||
|
}
|
||||||
|
|
||||||
public function avanzarEstado(): void
|
public function avanzarEstado(): void
|
||||||
{
|
{
|
||||||
$flujo = [
|
$flujo = [
|
||||||
|
|||||||
Reference in New Issue
Block a user