belongsTo(Proveedor::class); } public function ordenProduccion() { return $this->belongsTo(OrdenProduccion::class); } /* Lógica de negocio */ protected static function booted() { static::saving(function ($tintoreria) { // Fecha de envío por defecto if (! $tintoreria->fecha_envio) { $tintoreria->fecha_envio = now(); } // Validación: cantidad_enviada no puede exceder la suma de confecciones recibidas de la OP if ($tintoreria->cantidad_enviada !== null && $tintoreria->orden_produccion_id) { $sum = \App\Models\Confeccion::where('orden_produccion_id', $tintoreria->orden_produccion_id)->sum('cantidad_recibida'); if ($sum && $tintoreria->cantidad_enviada > $sum) { throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad_enviada' => 'La cantidad enviada no puede exceder la cantidad recibida en Confección (' . $sum . ').', ]); } } if ($tintoreria->cantidad_recibida !== null) { $tintoreria->perdidas = $tintoreria->cantidad_enviada - $tintoreria->cantidad_recibida; if ($tintoreria->perdidas < 0) $tintoreria->perdidas = 0; } }); $createTrasladoFn = function ($tintoreria) { if ($tintoreria->cantidad_recibida !== null) { // Evitar duplicados $exists = \App\Models\TrasladoPrenda::where('referencia_type', self::class) ->where('referencia_id', $tintoreria->id) ->exists(); if (! $exists) { // Mapear "perdidas" a prendas_defectuosas en el traslado $payload = [ 'prendas_defectuosas' => $tintoreria->perdidas ?? 0, ]; $destino = 'acabados'; \App\Models\TrasladoPrenda::crearDesdeReferencia( $tintoreria, 'tintoreria', $destino, $payload ); // Avanzar la OP al cerrar el paso $tintoreria->ordenProduccion?->avanzarEstado(); } } if ( $tintoreria->fecha_recepcion && $tintoreria->cantidad_recibida !== null ) { $tintoreria->ordenProduccion?->avanzarEstado(); } }; static::updated($createTrasladoFn); static::saved($createTrasladoFn); } }