Skip to content

Commit 9299cc3

Browse files
authored
Merge pull request #370 from uspdev/issue_369
Sincroniza setores com replicado #369
2 parents fe59129 + 1a89219 commit 9299cc3

File tree

7 files changed

+220
-243
lines changed

7 files changed

+220
-243
lines changed

app/Listeners/LoginListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public function handle(Login $event)
3131
// vincular a pessoa e o vinculo ao setor
3232
$vinculos = Pessoa::listarVinculosAtivos($user->codpes, false);
3333
foreach ($vinculos as $vinculo) {
34-
if ($setor = Setor::where('cod_set_replicado', $vinculo['codset'])->first()) {
34+
$setor = Setor::where('cod_set_replicado', $vinculo['codset'])->first();
35+
if ($setor) {
3536
Setor::vincularPessoa($setor, $user, mb_convert_case($vinculo['tipvin'], MB_CASE_TITLE));
3637
$log .= 'update vinculo codpes=' . $user->codpes . ',setor=' . $setor->sigla . ',vínculo=' . $vinculo['tipvin'] . ';';
3738
}

app/Models/Setor.php

Lines changed: 112 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Support\Facades\Gate;
77
use Illuminate\Database\Eloquent\Model;
88
use Illuminate\Database\Eloquent\Factories\HasFactory;
9+
use Uspdev\Replicado\Estrutura;
910

1011
class Setor extends Model
1112
{
@@ -77,7 +78,7 @@ public static function allToSelect()
7778
$ret = [];
7879
foreach ($setores as $setor) {
7980
if (Gate::allows('setores.view', $setor)) {
80-
$ret[$setor->id] = $setor->sigla . ' - ' . $setor->nome;
81+
$ret[$setor->id] = $setor->sigla . ' - ' . $setor->nome;
8182
}
8283
}
8384
return $ret;
@@ -93,14 +94,123 @@ public static function vincularPessoa($setor, $user, $funcao)
9394
$u = $setor->users()->where('user_id', $user->id)->wherePivot('funcao', $funcao)->withPivot('funcao')->first();
9495

9596
// vamos cadastrar ou atualizar o setor somente se mudou de setor
96-
if(empty($u) || $u->pivot->funcao != $funcao) {
97+
if (empty($u) || $u->pivot->funcao != $funcao) {
9798
config('app.debug') && Log::info("Atualizado setor de $user->codpes em $setor->sigla na função $funcao");
9899
$setor->users()->wherePivot('funcao', $funcao)->detach($user);
99100
$user->setores()->attach($setor, ['funcao' => $funcao]);
100101
}
102+
}
103+
104+
/**
105+
* Sincroniza os setores com o replicado e retorna uma mensagem com as estatísticas
106+
*
107+
* Adiciona, remove e renomeia os setores.
108+
* Adiciona os chefes como gerentes dos setores.
109+
* Não remove os antigos pois se for substituição vai remover o chefe de fato.
110+
* Chamado no artisan setores:sync
111+
*/
112+
public static function sincronizarComReplicado()
113+
{
114+
$estatisticas = [
115+
'setores_criados' => [],
116+
'setores_atualizados' => [],
117+
'chefes_adicionados' => [],
118+
'setores_removidos' => [],
119+
];
120+
121+
$setores_repl = Estrutura::listarSetores();
122+
$cod_unidade = config('replicado.codundclg');
123+
124+
// Primeiro loop: cria ou atualiza setores
125+
foreach ($setores_repl as $setor_repl) {
126+
$setor = self::firstOrNew(['cod_set_replicado' => $setor_repl['codset']]);
127+
$is_novo = !$setor->exists;
128+
129+
// Atualiza atributos
130+
$setor->sigla = str_replace('-' . $cod_unidade, '', $setor_repl['nomabvset']);
131+
$setor->nome = $setor_repl['nomset'];
132+
$setor->cod_set_replicado = $setor_repl['codset'];
133+
$setor->cod_set_pai_replicado = $setor_repl['codsetspe'];
134+
135+
if ($is_novo) {
136+
$setor->save();
137+
$estatisticas['setores_criados'][] = $setor->nome;
138+
} elseif ($setor->isDirty()) {
139+
$setor->save();
140+
$estatisticas['setores_atualizados'][] = $setor->nome;
141+
}
142+
}
143+
144+
// Segundo loop: associa setor pai e chefes
145+
foreach ($setores_repl as $setor_repl) {
146+
$setor = self::where('cod_set_replicado', $setor_repl['codset'])->first();
147+
148+
$setor_pai = self::where('cod_set_replicado', $setor->cod_set_pai_replicado)->first();
149+
if ($setor_pai) {
150+
$setor->setor_id = $setor_pai->id;
151+
$setor->save();
152+
}
153+
154+
if (!empty($setor->setor_id)) {
155+
$chefes = Estrutura::getChefiaSetor($setor_repl['codset']);
156+
foreach ($chefes as $chefe) {
157+
$u = User::obterOuCriarPorCodpes($chefe['codpes']);
158+
159+
$attached = $setor->users()
160+
->wherePivot('user_id', $u->id)
161+
->wherePivot('funcao', 'Gerente')
162+
->exists();
163+
164+
if (!$attached) {
165+
$setor->users()->attach($u->id, ['funcao' => 'Gerente']);
166+
$estatisticas['chefes_adicionados'][] = "{$u->name} ({$setor->nome})";
167+
}
168+
}
169+
}
170+
}
171+
172+
// Terceiro loop: remove setores que não existem mais no replicado
173+
$codigos_replicado = array_column($setores_repl, 'codset');
174+
$setores_remover = self::whereNotIn('cod_set_replicado', $codigos_replicado)->get();
101175

176+
foreach ($setores_remover as $setor) {
177+
$nome_antigo = $setor->nome;
178+
if (stripos($setor->nome, '(removido)') === false) {
179+
$setor->nome .= ' (removido)';
180+
$setor->save();
181+
$estatisticas['setores_removidos'][] = $nome_antigo;
182+
}
183+
}
184+
185+
// Monta a mensagem de log
186+
$mensagem_log = "Sincronização de setores concluída\n";
187+
188+
$mensagem_log .= "\nSetores criados (" . count($estatisticas['setores_criados']) . "):";
189+
foreach ($estatisticas['setores_criados'] as $nome) {
190+
$mensagem_log .= "\n - $nome";
191+
}
192+
193+
$mensagem_log .= "\n\nSetores atualizados (" . count($estatisticas['setores_atualizados']) . "):";
194+
foreach ($estatisticas['setores_atualizados'] as $nome) {
195+
$mensagem_log .= "\n - $nome";
196+
}
197+
198+
$mensagem_log .= "\n\nChefes adicionados (" . count($estatisticas['chefes_adicionados']) . "):";
199+
foreach ($estatisticas['chefes_adicionados'] as $chefe) {
200+
$mensagem_log .= "\n - $chefe";
201+
}
202+
203+
$mensagem_log .= "\n\nSetores marcados como removidos (" . count($estatisticas['setores_removidos']) . "):";
204+
foreach ($estatisticas['setores_removidos'] as $nome) {
205+
$mensagem_log .= "\n - $nome";
206+
}
207+
208+
// Loga e retorna mensagem
209+
Log::info($mensagem_log);
210+
return $mensagem_log;
102211
}
103212

213+
104214
/**
105215
* Auto relacionamento
106216
*/

0 commit comments

Comments
 (0)