belongsTo(Proveedor::class); } public function ordenProduccion() { return $this->belongsTo(OrdenProduccion::class); } /* Lógica de negocio */ protected static function booted() { static::saving(function ($confeccion) { // Total a pagar if ($confeccion->cantidad_recibida !== null) { $confeccion->total_pagar = $confeccion->cantidad_recibida * $confeccion->valor_por_prenda; } // Estado automático if (!$confeccion->cantidad_recibida) { $confeccion->estado = 'pendiente'; } elseif ($confeccion->cantidad_recibida < $confeccion->cantidad_enviada) { $confeccion->estado = 'parcial'; } else { $confeccion->estado = 'completo'; } }); // Crear traslado cuando la confección tenga recepción (en creación y en actualización) $createTrasladoFn = function ($confeccion) { if ($confeccion->cantidad_recibida !== null) { // Evitar duplicados $exists = \App\Models\TrasladoPrenda::where('referencia_type', self::class) ->where('referencia_id', $confeccion->id) ->exists(); if (! $exists) { $destino = 'tintoreria'; \App\Models\TrasladoPrenda::crearDesdeReferencia( $confeccion, 'confeccion', $destino ); // Marcar el paso como terminado y avanzar la OP incluso si fue parcial $confeccion->ordenProduccion?->avanzarEstado(); } } // Mantener el comportamiento anterior: si está completo, también avanzamos (por seguridad) if ($confeccion->estado === 'completo') { $confeccion->ordenProduccion?->avanzarEstado(); } }; static::updated($createTrasladoFn); static::saved($createTrasladoFn); } }