'boolean', ]; public function proveedor() { return $this->belongsTo(Proveedor::class); } public function ordenProduccion() { return $this->belongsTo(OrdenProduccion::class); } protected static function booted() { static::creating(function ($p) { // Validar disponibilidad desde confecciones $opId = $p->orden_produccion_id; $totalProducido = \App\Models\Confeccion::where('orden_produccion_id', $opId)->sum('cantidad_recibida'); $yaAsignado = \App\Models\Prensilla::where('orden_produccion_id', $opId)->sum('cantidad_enviada') + \App\Models\Ojal::where('orden_produccion_id', $opId)->sum('cantidad_enviada'); if (($yaAsignado + ($p->cantidad_enviada ?? 0)) > $totalProducido) { throw \Illuminate\Validation\ValidationException::withMessages(['cantidad_enviada' => 'No hay suficientes unidades disponibles desde confecciones para asignar.']); } }); static::saved(function ($registro) { // Si se marca como terminada, crear traslado automático a tintororía if ($registro->terminada && !$registro->getOriginal('terminada')) { \App\Models\Tintoreria::create([ 'proveedor_id' => $registro->proveedor_tintoreria_id, 'orden_produccion_id' => $registro->orden_produccion_id, 'fecha_envio' => now(), 'cantidad_enviada' => $registro->cantidad_enviada, 'observaciones' => "Auto-enviado desde {$registro->tipo} (ID: {$registro->id})", ]); } }); } }