belongsTo(Proveedor::class); } public function ordenProduccion() { return $this->belongsTo(OrdenProduccion::class); } /* Lógica de negocio */ protected static function booted() { static::saving(function ($confeccion) { // Establecer fecha de envío por defecto si no se proporcionó if (! $confeccion->fecha_envio) { $confeccion->fecha_envio = now(); } // Validación: cantidad_enviada no puede exceder la cantidad total de la OP if ($confeccion->cantidad_enviada !== null && $confeccion->orden_produccion_id) { $orden = \App\Models\OrdenProduccion::find($confeccion->orden_produccion_id); if ($orden && $confeccion->cantidad_enviada > $orden->cantidad_total) { throw \Illuminate\Validation\ValidationException::withMessages([ 'cantidad_enviada' => 'La cantidad enviada no puede exceder la cantidad total de la Orden de Producción (' . $orden->cantidad_total . ').', ]); } } // Total a pagar: usa cantidad_recibida si existe, sino cantidad_enviada $cantidadBase = $confeccion->cantidad_recibida ?? $confeccion->cantidad_enviada ?? 0; $valorUnitario = $confeccion->valor_por_prenda ?? 0; $confeccion->total_pagar = $cantidadBase * $valorUnitario; // 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); } }