'array', 'terminada' => 'boolean', 'fecha_envio' => 'date', 'fecha_recepcion' => 'date', ]; /* Relaciones */ public function ordenProduccion() { return $this->belongsTo(OrdenProduccion::class); } public function proveedor() { return $this->belongsTo(Proveedor::class); } /* Lógica de negocio */ protected static function booted() { static::saving(function ($acabado) { // Fecha de envío por defecto if (! $acabado->fecha_envio) { $acabado->fecha_envio = now(); } // Validación: cantidad_enviada no puede exceder lo enviado desde Tintorería (cantidad recibida allí) if ($acabado->cantidad_enviada !== null && $acabado->orden_produccion_id) { $sumTint = \App\Models\Tintoreria::where('orden_produccion_id', $acabado->orden_produccion_id)->sum('cantidad_recibida'); if ($sumTint && $acabado->cantidad_enviada > $sumTint) { throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad_enviada' => 'La cantidad enviada no puede exceder lo recibido en Tintorería (' . $sumTint . ').', ]); } } }); $createTrasladoFn = function ($acabado) { if ($acabado->cantidad_recibida !== null) { // Evitar duplicados $exists = \App\Models\TrasladoPrenda::where('referencia_type', self::class) ->where('referencia_id', $acabado->id) ->exists(); if (! $exists) { $destino = 'bodega'; \App\Models\TrasladoPrenda::crearDesdeReferencia( $acabado, 'acabados', $destino ); // Avanzar la OP al cerrar este proceso $acabado->ordenProduccion?->avanzarEstado(); } } if ( $acabado->fecha_recepcion && $acabado->cantidad_recibida !== null ) { // Validar si ya no quedan procesos pendientes $pendientes = self::where('orden_produccion_id', $acabado->orden_produccion_id) ->whereNull('fecha_recepcion') ->exists(); if (!$pendientes) { // Intentar finalizar la OP solo si está completada según la lógica centralizada $acabado->ordenProduccion?->tryFinalize(); } } }; static::updated($createTrasladoFn); static::saved($createTrasladoFn); } }