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; } }); /* Recepciones polimórficas */ public function recepciones() { return $this->morphMany(\App\Models\Recepcion::class, 'referencia'); } // Cuantas faltan por recibir public function getFaltantesAttribute() { return max(0, (int)($this->cantidad_enviada ?? 0) - (int)($this->cantidad_recibida ?? 0)); } // Avanzar OP al cerrar el paso o cuando se complete static::saved(function ($tintoreria) { if ($tintoreria->fecha_recepcion && $tintoreria->cantidad_recibida !== null) { $tintoreria->ordenProduccion?->avanzarEstado(); } }); } }