66use Illuminate \Support \Facades \Gate ;
77use Illuminate \Database \Eloquent \Model ;
88use Illuminate \Database \Eloquent \Factories \HasFactory ;
9+ use Uspdev \Replicado \Estrutura ;
910
1011class 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