File manager - Edit - /var/www/html/homologBancodetalentos/app/Http/Services/TalentBank/AngraCompanySyncService.php
Back
<?php namespace App\Http\Services\TalentBank; use App\Support\TalentBank\IntegrationLog; use Illuminate\Database\Connection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; class AngraCompanySyncService { private const DEFAULT_PERMISSIONS = [ 'GERENCIADOR_DE_CONTA_ANGRA', 'GERENCIADOR_DE_LINHAS_DO_TEMPO', 'GUEST', ]; /** * Cria (ou garante registro auxiliar de) conta empresa no Conta Angra para o mesmo CNPJ/e-mail do BT. * Erros são logados sem interromper o fluxo principal. * * @param string $cnpj CNPJ limpo (14 dígitos) * @param string|null $passwordHash bcrypt da senha (obrigatório para criar login no portal) */ public function syncToAngra(string $cnpj, string $razaoSocial, string $email, ?string $passwordHash = null): void { try { $conn = DB::connection('mysql_angra'); $emailNorm = mb_strtolower(trim($email)); $jaExisteUser = $conn->table('users') ->where(function ($q) use ($cnpj, $emailNorm) { $q->where('cpf', $cnpj)->orWhere('email', $emailNorm); }) ->exists(); if (! $jaExisteUser) { if ($passwordHash === null || $passwordHash === '') { IntegrationLog::warning('angra_company_sync', 'skip_create_missing_password', [ 'cnpj_masked' => $this->maskCnpj($cnpj), 'email_domain' => str_contains($emailNorm, '@') ? (string) strstr($emailNorm, '@') : 'unknown', ]); } else { $this->criarUsuarioContaAngra($conn, $cnpj, $razaoSocial, $emailNorm, $passwordHash); } } $this->garantirSolicitanteEmpresa($conn, $cnpj, $razaoSocial, $emailNorm, $passwordHash); } catch (\Throwable $e) { IntegrationLog::error('angra_company_sync', 'sync_failed', [ 'cnpj_masked' => $this->maskCnpj($cnpj), 'email_domain' => str_contains($email, '@') ? (string) strstr($email, '@') : 'unknown', 'error' => $e->getMessage(), ]); } } private function criarUsuarioContaAngra(Connection $conn, string $cnpj, string $razaoSocial, string $emailNorm, string $passwordHash): void { if ($this->portalUsaUsersNumericos($conn)) { $this->criarUsuarioPortalAtual($conn, $cnpj, $razaoSocial, $emailNorm, $passwordHash); return; } $this->criarUsuarioPortalLegadoUuid($conn, $cnpj, $razaoSocial, $emailNorm, $passwordHash); } /** * Schema atual do portal (Laragon / produção simples): users.id autoincrement, name, cpf guardando CNPJ. */ private function portalUsaUsersNumericos(Connection $conn): bool { return Schema::connection('mysql_angra')->hasColumn('users', 'name') && ! Schema::connection('mysql_angra')->hasColumn('users', 'structure_id'); } private function criarUsuarioPortalAtual(Connection $conn, string $cnpj, string $razaoSocial, string $emailNorm, string $passwordHash): void { $userId = (int) $conn->table('users')->insertGetId([ 'name' => $razaoSocial, 'email' => $emailNorm, 'password' => $passwordHash, 'cpf' => $cnpj, 'matriculation' => $this->gerarMatriculaUnica($conn, $cnpj), 'status' => 'ATIVADO', 'isPasswordDefault' => 0, 'isServidorPublico' => 'Não', 'isWhatsapp' => 0, 'created_at' => now(), 'updated_at' => now(), ]); $this->concederPermissoesPortalAtual($conn, $userId); $this->criarEmpresaMinimaSePossivel($conn, $userId, $cnpj, $razaoSocial, $emailNorm); } private function criarUsuarioPortalLegadoUuid(Connection $conn, string $cnpj, string $razaoSocial, string $emailNorm, string $passwordHash): void { $structureId = env('ANGRA_STRUCTURE_DEFAULT_ID'); if (! $structureId) { IntegrationLog::warning('angra_company_sync', 'structure_id_missing', [ 'cnpj_masked' => $this->maskCnpj($cnpj), ]); return; } $userId = (string) Str::uuid(); $conn->table('users')->insert([ 'id' => $userId, 'structure_id' => $structureId, 'firstName' => $razaoSocial, 'lastName' => '', 'cpf' => $cnpj, 'phoneNumber' => '', 'email' => $emailNorm, 'password' => $passwordHash, 'status' => 'ATIVADO', 'isPasswordDefault' => 0, 'email_verified_at' => now(), 'created_at' => now(), 'updated_at' => now(), ]); $this->concederPermissoesLegadoUuid($conn, $userId); } private function concederPermissoesPortalAtual(Connection $conn, int $userId): void { foreach (self::DEFAULT_PERMISSIONS as $permissao) { $exists = $conn->table('permissoes') ->where('user_id', $userId) ->where('permissao', $permissao) ->exists(); if (! $exists) { $conn->table('permissoes')->insert([ 'id' => (string) Str::uuid(), 'user_id' => $userId, 'permissao' => $permissao, 'visualizar' => 1, 'adicionar' => 1, 'editar' => 1, 'excluir' => 1, 'status' => 'ATIVADO', 'created_at' => now(), 'updated_at' => now(), ]); } } } private function concederPermissoesLegadoUuid(Connection $conn, string $userId): void { foreach (self::DEFAULT_PERMISSIONS as $permissao) { $exists = $conn->table('permissoes') ->where('user_id', $userId) ->where('permissao', $permissao) ->exists(); if (! $exists) { $conn->table('permissoes')->insert([ 'id' => (string) Str::uuid(), 'user_id' => $userId, 'permissao' => $permissao, 'visualizar' => 1, 'adicionar' => 1, 'editar' => 1, 'excluir' => 1, 'status' => 'ATIVADO', 'created_at' => now(), 'updated_at' => now(), ]); } } } private function criarEmpresaMinimaSePossivel(Connection $conn, int $userId, string $cnpj, string $razaoSocial, string $emailNorm): void { if (! Schema::connection('mysql_angra')->hasTable('empresas') || ! Schema::connection('mysql_angra')->hasTable('enderecos')) { return; } if ($conn->table('empresas')->where('cnpj', $cnpj)->exists()) { return; } $endId = (string) Str::uuid(); $empId = (string) Str::uuid(); $uidStr = (string) $userId; $conn->table('enderecos')->insert([ 'id' => $endId, 'user_id' => $uidStr, 'owner_id' => null, 'domicilio' => 'OUTROS', 'cep' => '23900000', 'logradouro' => 'Cadastro via Banco de Talentos', 'complemento' => null, 'numero' => 'S/N', 'bairro' => 'Centro', 'cidade' => 'Angra dos Reis', 'uf' => 'RJ', 'latitude' => null, 'longitude' => null, 'created_at' => now(), 'updated_at' => now(), 'status' => 'ATIVADO', 'fixed' => 0, 'comprovante' => null, 'map' => null, ]); $conn->table('empresas')->insert([ 'id' => $empId, 'created_at' => now(), 'updated_at' => now(), 'razaoSocial' => $razaoSocial, 'nomeFantasia' => $razaoSocial, 'numeroInscricaoMunicipal' => (string) now()->timestamp, 'cadastur' => null, 'cnpj' => $cnpj, 'anoAbertura' => (int) now()->format('Y'), 'principalAtividade' => 'Cadastro sincronizado pelo Banco de Talentos', 'areaOcupacao' => null, 'segmento' => null, 'nomeContato' => $razaoSocial, 'fotoPerfil' => 'pmar/assets/img/icons/neutro.png', 'owner_id' => $userId, 'endereco_id' => $endId, 'responsavel_id' => $userId, 'preposto_id' => null, 'telefone' => '', 'celular' => '', 'email' => $emailNorm, 'site' => null, 'contratoSocial' => null, 'cartaoCNPJ' => null, 'registroJuntaComercial' => null, 'alvaraDeFuncionamento' => null, 'inscricaoEstadual' => null, 'inscricaoMunicipal' => null, 'status' => 'ATIVADO', ]); $conn->table('enderecos')->where('id', $endId)->update(['owner_id' => $empId]); } private function garantirSolicitanteEmpresa(Connection $conn, string $cnpj, string $razaoSocial, string $emailNorm, ?string $passwordHash): void { if (! Schema::connection('mysql_angra')->hasTable('solicitantes_conta_empresa')) { return; } $jaExiste = $conn->table('solicitantes_conta_empresa') ->where(function ($q) use ($cnpj, $emailNorm) { $q->where('cnpj', $cnpj)->orWhere('email', $emailNorm); }) ->exists(); if ($jaExiste) { return; } $conn->table('solicitantes_conta_empresa')->insert([ 'id' => (string) Str::uuid(), 'cnpj' => $cnpj, 'razao_social' => $razaoSocial, 'email' => $emailNorm, 'token' => null, 'password_hash' => $passwordHash, 'expires_at' => null, 'status' => 'SINCRONIZADO', 'source' => 'BT', 'created_at' => now(), 'updated_at' => now(), ]); } private function gerarMatriculaUnica(Connection $conn, string $cnpj): string { $digits = preg_replace('/\D/', '', $cnpj) ?: '00000000'; for ($i = 0; $i < 12; $i++) { $candidate = 'BT-'.substr($digits, 0, 8).'-'.strtoupper(bin2hex(random_bytes(2))); if (! $conn->table('users')->where('matriculation', $candidate)->exists()) { return $candidate; } } return 'BT-'.bin2hex(random_bytes(10)); } private function maskCnpj(string $cnpj): string { $c = preg_replace('/\D/', '', $cnpj); return strlen($c) > 4 ? substr($c, 0, 3).'***'.substr($c, -2) : '***'; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings