unitId = $unitId; } /** * Serializa os jobs por unidade: evita que duas execuções concorrentes * criem a subconta ao mesmo tempo (o POST /accounts do Asaas não é idempotente). */ public function middleware(): array { return [(new WithoutOverlapping($this->unitId))->releaseAfter(10)->expireAfter(60)]; } public function handle(AsaasAccountService $accountService): void { $unit = Unit::find($this->unitId); if (!$unit) { Log::warning("CreateAsaasSubaccountJob: Unidade {$this->unitId} não encontrada."); return; } try { $accountService->ensureSubaccount($unit); Log::info("CreateAsaasSubaccountJob: Subconta criada com sucesso para a Unidade {$unit->id}."); } catch (AsaasException $e) { // Erros 4xx (ex.: e-mail/CNPJ já em uso) são permanentes: retentar só // recriaria a colisão. Falha imediatamente, sem consumir as outras tentativas. if ($e->getCode() >= 400 && $e->getCode() < 500) { Log::error("CreateAsaasSubaccountJob: Erro permanente do Asaas para Unidade {$unit->id} — sem retry.", [ 'error' => $e->getMessage(), ]); $this->fail($e); return; } // 5xx / instabilidade: deixa o mecanismo de retry agir. Log::error("CreateAsaasSubaccountJob: Falha transitória para Unidade {$unit->id}.", [ 'error' => $e->getMessage(), ]); throw $e; } catch (Exception $e) { Log::error("CreateAsaasSubaccountJob: Falha ao criar subconta para Unidade {$unit->id}.", [ 'error' => $e->getMessage(), ]); throw $e; } } }