<?php

class SincronizacaoController extends GxController
{
    private $MSG = "";
    private $de;
    private $para;

    public function actionIndex()
    {
        if (isset($_POST['De']) && !empty($_POST['De']) && isset($_POST['Para']) && !empty($_POST['Para'])) {
            // do prospecto mais recente para o mais antigo
            $this->de   = ($_POST['De'] > $_POST['Para']) ? $_POST['De'] : $_POST['Para'];
            $this->para = ($_POST['De'] < $_POST['Para']) ? $_POST['De'] : $_POST['Para'];

            $cidades_regiao = User::getCidades();
            $cliente_de     = Clientes::model()->findByPk($this->de);
            $cliente_para      = Clientes::model()->findByPk($this->para);
            $cliente_de_cidade = $cliente_de->CLI_CIDADE;
            $cliente_para_cidade = $cliente_para->CLI_CIDADE;
            if ((!array_key_exists($cliente_de_cidade, $cidades_regiao)) || (!array_key_exists($cliente_para_cidade, $cidades_regiao))) {
                Yii::app()->user->setFlash('error', 'Você deve ter acesso aos dois clientes informados');
                $this->render('sincronizacao');
                return;
            }

            if ($this->de == $this->para) {
                Yii::app()->user->setFlash('error', 'Mesmo código informado para ambos prospectos/clientes');
                $this->render('sincronizacao');
                return;
            }
            $ClienteDeletar = Clientes::model()->findByPk($this->de);

            if (!$ClienteDeletar) {
                Yii::app()->user->setFlash('error', 'Cliente código '.$this->de.' não encontrado');
                $this->render('sincronizacao');
                return;
            }
            $ClienteManter = Clientes::model()->findByPk($this->para);

            if (!$ClienteManter) {
                Yii::app()->user->setFlash('error', 'Cliente código '.$this->para.' não encontrado');
                $this->render('sincronizacao');
                return;
            }

            if (in_array($ClienteDeletar->CLI_SITUACAO, array('A', 'I')) && in_array($ClienteManter->CLI_SITUACAO, array('A', 'I'))) {
                Yii::app()->user->setFlash('error', 'Os códigos informados são de clientes ativos ou inativos, não é possível executar a sincronização');
                $this->render('sincronizacao');
                return;
            }

            // caso o mais recente seja cliente ativo, o mesmo é mantido
            $MantidoMaisRecente = false;
            $SituacaoMaisRecente = '';
            if (in_array($ClienteDeletar->CLI_SITUACAO, array('A', 'I'))) {
                $SituacaoMaisRecente = ($ClienteDeletar->CLI_SITUACAO == 'A') ? 'ativo' : 'inativo';
                $MantidoMaisRecente = true;
                $this->de                 = $ClienteManter->CLI_IDCLIENTE;
                $this->para               = $ClienteDeletar->CLI_IDCLIENTE;
                $ClienteDeletar     = Clientes::model()->findByPk($this->de);
                $ClienteManter      = Clientes::model()->findByPk($this->para);
            }

            $this->MSG = '<ul>';
                $tabelas = array(
                    array(
                        "modelo" => "Atendimentos",
                        "campoIdCliente" => "ATD_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Titulos",
                        "campoIdCliente" => "TIT_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Contratos",
                        "campoIdCliente" => "COT_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Solicitacoes",
                        "campoIdCliente" => "SOL_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Interessados",
                        "campoIdCliente" => "INT_IDPROSPECTO",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "ClientesDocumentosFiscais",
                        "campoIdCliente" => "CDF_IDCLIENTE",
                        "labelModelo" => "Documentos Fiscais",
                        "displayField" => 'PrettyName'
                    ),
                    array(
                        "modelo" => "Enderecos",
                        "campoIdCliente" => "END_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Sugestoes",
                        "campoIdCliente" => "SUG_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "TermoLevantamentoDados",
                        "campoIdCliente" => "TLD_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Arquivos",
                        "campoIdCliente" => "ARQ_FOREIGNKEY",
                        "labelModelo" => "Arquivos anexados",
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "Clientes",
                        "campoIdCliente" => "CLI_IDCONTADOR",
                        "labelModelo" => "Clientes em que era contador",
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "ClientesSituacoes",
                        "campoIdCliente" => "CST_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "ClienteAlteracoesExternas",
                        "campoIdCliente" => "CAE_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                    array(
                        "modelo" => "ClientesEmailsAdicionais",
                        "campoIdCliente" => "CLE_IDCLIENTE",
                        "labelModelo" => false,
                        "displayField" => false
                    ),
                );

                $transaction = Yii::app()->db->beginTransaction();
                $Save = true;

                $tabelasAtualizadas = array();
                foreach ($tabelas as $tabela) {
                    $retorno = $this->sincronizaTabelasVinculadas($tabela['modelo'], $tabela['campoIdCliente'], $tabela['labelModelo'], $tabela['displayField']);
                    if ($retorno) {
                        if (is_array($retorno)) {
                            $tabelasAtualizadas[] = array(
                                'modelo' => $tabela['modelo'],
                                'campoIdCliente' => $tabela['campoIdCliente'],
                                'labelModelo' => $tabela['labelModelo'],
                                'displayField' => $tabela['displayField'],
                                'codigos' => $retorno
                            );
                        }
                    } else {
                        $Save = false;
                        return;
                    }
                }

                if ($Save) {
                    $retorno = $this->sincronizaVinculos();
                    if ($retorno) {
                        if ($retorno['updatedVinculados']) {
                            $tabelasAtualizadas[] = array(
                                'modelo' => 'ClientesVinculados',
                                'campoIdCliente' => 'VIN_IDCLIENTE',
                                'labelModelo' => 'Clientes a quem estava vinculado',
                                'displayField' => false,
                                'codigos' => $retorno['updatedVinculados']
                            );
                        }

                        if ($retorno['updatedVinculos']) {
                            $tabelasAtualizadas[] = array(
                                'modelo' => 'ClientesVinculados',
                                'campoIdCliente' => 'VIN_VINCULO',
                                'labelModelo' => 'Clientes Vinculados a ele',
                                'displayField' => false,
                                'codigos' => $retorno['updatedVinculos']
                            );
                        }

                        if ($retorno['deleted']) {
                            $tabelasAtualizadas[] = array(
                                'modelo' => 'ClientesVinculadosExcluidos',
                                'campoIdCliente' => 'VIN_IDCLIENTE',
                                'labelModelo' => 'Vínculos excluídos pois resultariam em vínculo de cliente com ele mesmo',
                                'displayField' => false,
                                'codigos' => $retorno['deleted']
                            );
                        }
                    } else {
                        $Save = false;
                    }
                }

                if ($Save) {
                    $clienteSincronizado = new ClientesSincronizacoes();
                    $clienteSincronizado->SIN_DE = $this->de;
                    $clienteSincronizado->SIN_PARA = $this->para;
                    $clienteSincronizado->SIN_DADOSCLIENTE = CJSON::encode($ClienteDeletar->attributes);
                    if (!empty($tabelasAtualizadas)) {
                        $clienteSincronizado->SIN_REGISTROS_SINCRONIZADOS = CJSON::encode($tabelasAtualizadas);
                    }
                    $clienteSincronizado->SIN_DATA = date('Y-m-d H:i:s');
                    $clienteSincronizado->SIN_IDAUTOR = User::getId();
                    $clienteSincronizado->SIN_STATUS = 1;

                    $Save = $clienteSincronizado->save();
                }

                if ($Save)
                    $Save = $ClienteManter->updateLastVisitaComercial();
                if ($Save)
                    $Save = $ClienteManter->updateLastAtividadeComercial();
                if ($Save)
                    $Save = $ClienteManter->updateNextVisitaComercial();
                if ($Save)
                    $Save = $ClienteManter->updateLastVisitaSuporte();
                if ($Save)
                    $Save = $ClienteManter->updateLastAtividadeSuporte();
                if ($Save)
                    $Save = $ClienteManter->updateNextVisitaSuporte();

                if ($Save) {
                    $Save = $ClienteDeletar->delete();
                    $this->MSG .= '<li>Código do Prospecto/Cliente deletado: '.$ClienteDeletar->CLI_IDCLIENTE.'.</li>';
                }
            $this->MSG .= '</ul>';

            $msgAtendimento = 'Prospecto / Cliente Sincronizado através do CRM! <br />'.$this->MSG;
            if ($Save) {
                $Atendimento = new Atendimentos;
                $Atendimento->validate();
                $Atendimento->ATD_IDCLIENTE     = (int) $ClienteManter->CLI_IDCLIENTE;
                $Atendimento->ATD_IDFUNCIONARIO = User::getId();
                $Atendimento->ATD_IDUSUARIO     = User::getId();
                $Atendimento->ATD_TIPO          = 'O';
                $Atendimento->ATD_AUTOMATICO    = 1;
                $Atendimento->ATD_DTLANCAMENTO  = date('Y-m-d H:i:s');
                $Atendimento->ATD_DTCADASTRO    = date('d/m/Y');
                $Atendimento->ATD_HORAINICIO    = date('H:i').':00';
                $Atendimento->ATD_HORAFINAL     = date("H:i:s", mktime(date('H'), date('i')+1, 0, 1, 10, 2012));
                $Atendimento->ATD_TOTALHORAS    = '00:01:00';
                $Atendimento->ATD_IDMOTIVO      = 70;
                $Atendimento->ATD_OBS           = $msgAtendimento;
                $Atendimento->ATD_SITUACAO      = 'R';
                $Save = $Atendimento->save(false, array('ATD_DTLANCAMENTO', 'ATD_TIPO', 'ATD_IDMOTIVO', 'ATD_DTCADASTRO', 'ATD_HORAINICIO', 'ATD_HORAFINAL', 'ATD_TOTALHORAS', 'ATD_IDFUNCIONARIO', 'ATD_SITUACAO', 'ATD_IDCLIENTE', 'ATD_OBS', 'ATD_AUTOMATICO', 'ATD_IDUSUARIO'));
            }

            if($Save) {
                try {
                    $transaction->commit();
                } catch (Exception $e) {
                    $transaction->rollback();
                }
            } else {
                $transaction->rollback();
                Yii::app()->user->setFlash('error', 'Erro ao efetuar a sincronização.');
                $this->render('sincronizacao');
                return;
            }

            $msgExibicao = 'Sincronização efetuada com sucesso!<br />';
            if ($MantidoMaisRecente) {
                $msgExibicao .= 'Conforme política interna o prospecto/cliente mais recente é deletado automaticamente pelo CRM, porém o mesmo se trata de um cliente '.$SituacaoMaisRecente.', desta forma este foi mantido.<br />';
            } else {
                $msgExibicao .= 'Conforme política interna o prospecto/cliente mais recente é deletado automaticamente pelo CRM.<br />Favor rever informações do prospecto código '.$ClienteManter->CLI_IDCLIENTE.' caso hajam atualizações.<br />';
            }
            $msgExibicao .= 'Lançamentos sincronizados: <br />'.$this->MSG;
            Yii::app()->user->setFlash('success', $msgExibicao);
        }

        $this->render('sincronizacao');
    }

    public function actionReversao($id) {
        if (User::getUser()->FUN_TBL_SINCRONIZACAO == 1 && Yii::app()->getRequest()->getIsAjaxRequest()) {
            $sincronizacao = $this->loadModel($id, "ClientesSincronizacoes");
            $array_privilegios = array(1, 7, 11);
            if ($sincronizacao->SIN_IDAUTOR != User::getId() && !in_array(User::getPrivilegio(), $array_privilegios)) {
                throw new CHttpException(400, 'O Usuário não tem permissão para reverter a sincronização de outro usuário.');
            }

            if ($sincronizacao->SIN_STATUS) {
                $transaction = Yii::app()->db->beginTransaction();
                $Save = true;

                $dadosCliente = CJSON::decode($sincronizacao->SIN_DADOSCLIENTE);
                $cliente = new Clientes;
                foreach ($dadosCliente as $campo => $valor) {
                    $cliente->{$campo} = (!empty($valor) || $valor == "0") ? utf8_decode($valor) : NULL;
                }
                $cadastro = Util::FormatDataMysql($cliente->CLI_DTCADASTRO);
                $edicao = Util::FormatDataMysql($cliente->CLI_DTEDICAO);

                if ($Save = $cliente->save(false)) {
                    $Save = Yii::app()->db->createCommand()->update(
                        "clientes", 
                        [
                            'CLI_DTCADASTRO' => $cadastro,
                            'CLI_DTEDICAO' => $edicao
                        ],
                        'CLI_IDCLIENTE = :id',
                        [
                            'id' => $cliente->CLI_IDCLIENTE
                        ]
                    );
                    if($Save) {
                        $registrosSincronizados = CJSON::decode($sincronizacao->SIN_REGISTROS_SINCRONIZADOS);

                        $alteracoes = array();
                        $naoEncontrados = array();
                        if (!empty($registrosSincronizados)) {
                            foreach ($registrosSincronizados as $sincronizar) {
                                $codigosAtualizados = array();
                                $codigosNaoEncontrados = array();
                                if ($sincronizar['modelo'] != 'ClientesVinculadosExcluidos') {
                                    $model = new $sincronizar['modelo'];
                                    $displayField = $sincronizar['displayField'];
                                    $primaryKey = $model->tableSchema->primaryKey;

                                    $label = (!$sincronizar['labelModelo']) ? $model->label(2) : $sincronizar['labelModelo'];

                                    foreach ($sincronizar['codigos'] as $codigo) {
                                        $registro = $model->findByPk($codigo);
                                        if ($registro) {
                                            $codigosAtualizar[] = $codigo;
                                            $codigosAtualizados[] = (!$displayField) ? $registro->{$primaryKey} : $registro->{$displayField};
                                        } else {
                                            $codigosNaoEncontrados[] = $codigo;
                                        }
                                    }

                                    if (!empty($codigosAtualizar)) {
                                        $updatedRows = $model->updateAll(
                                            array($sincronizar['campoIdCliente'] => $cliente->CLI_IDCLIENTE),
                                            "{$primaryKey} IN (" . implode(", ", $codigosAtualizar) . ")"
                                        );

                                        if ($updatedRows != count($codigosAtualizados)) {
                                            $Save = false;
                                            return;
                                        }
                                    }
                                } else {
                                    $label = "Vínculos restaurados que foram excluídos pois resultariam em vínculo de cliente com ele mesmo";

                                    foreach ($sincronizar['codigos'] as $restaurar) {
                                        $registro = new ClientesVinculados;

                                        $registroRestaurar = CJSON::decode($restaurar);
                                        foreach ($registroRestaurar as $campo => $valor) {
                                            $registro->{$campo} = $valor;
                                        }

                                        if ($Save = $registro->save()) {
                                            $codigosAtualizados[] = $registroRestaurar['VIN_IDVINCULO'];
                                        } else {
                                            return;
                                        }
                                    }
                                }

                                if ($Save) {
                                    if (!empty($codigosAtualizados)) {
                                        echo "<li>{$label}: " . count($codigosAtualizados) . " (" . implode(", ", $codigosAtualizados) . ")</li>";
                                        $alteracoes[] = "<li>{$label}: " . count($codigosAtualizados) . " (" . implode(", ", $codigosAtualizados) . ")</li>";
                                    }

                                    if (!empty($codigosNaoEncontrados)) {
                                        echo "<li>{$label}: " . count($codigosNaoEncontrados) . " (" . implode(", ", $codigosNaoEncontrados) . ")</li>";
                                        $naoEncontrados[] = "<li>{$label}: " . count($codigosNaoEncontrados) . " (" . implode(", ", $codigosNaoEncontrados) . ")</li>";
                                    }
                                }
                            }
                        }

                        if ($Save) {
                            $msgAtendimento  = "Sincronização revertida com sucesso! <br>";
                            if (!empty($registrosSincronizados)) {
                                $msgAtendimento .= "O cliente Cod. {$cliente->CLI_IDCLIENTE} que havia sido deletado foi restaurado e os lançamentos abaixo foram retornados ao estado anterior: <br>";
                                $msgAtendimento .= "<ul>" . implode("", $alteracoes) . "</ul>";
                                if (!empty($naoEncontrados)) {
                                    $msgAtendimento .= "Os lançamentos abaixo não foram encontrados: ";
                                    $msgAtendimento .= "<ul>" . implode("", $naoEncontrados) . "</ul>";
                                }
                            } else {
                                $msgAtendimento .= "O cliente Cod. {$cliente->CLI_IDCLIENTE} que havia sido deletado foi restaurado.";
                            }

                            $sincronizacao->SIN_STATUS = 0;
                            $sincronizacao->SIN_DATA_DESSINCRONIZACAO = date('Y-m-d H:i:s');
                            $sincronizacao->SIN_IDAUTOR_DESSINCRONIZACAO = User::getId();
                            if ($Save = $sincronizacao->save(false, ['SIN_STATUS', 'SIN_DATA_DESSINCRONIZACAO', 'SIN_IDAUTOR_DESSINCRONIZACAO'])) {
                                $Atendimento = new Atendimentos;
                                $Atendimento->validate();
                                $Atendimento->ATD_IDCLIENTE     = (!empty($sincronizacao->ClienteMantido)) ? $sincronizacao->SIN_PARA : $sincronizacao->SIN_DE;
                                $Atendimento->ATD_IDFUNCIONARIO = User::getId();
                                $Atendimento->ATD_IDUSUARIO     = User::getId();
                                $Atendimento->ATD_TIPO          = 'O';
                                $Atendimento->ATD_AUTOMATICO    = 1;
                                $Atendimento->ATD_DTLANCAMENTO  = date('Y-m-d H:i:s');
                                $Atendimento->ATD_DTCADASTRO    = date('d/m/Y');
                                $Atendimento->ATD_HORAINICIO    = date('H:i').':00';
                                $Atendimento->ATD_HORAFINAL     = date("H:i:s", mktime(date('H'), date('i')+1, 0, 1, 10, 2012));
                                $Atendimento->ATD_TOTALHORAS    = '00:01:00';
                                $Atendimento->ATD_IDMOTIVO      = 70;
                                $Atendimento->ATD_OBS           = $msgAtendimento;
                                $Atendimento->ATD_SITUACAO      = 'R';
                                $Save = $Atendimento->save(false, array('ATD_DTLANCAMENTO', 'ATD_TIPO', 'ATD_IDMOTIVO', 'ATD_DTCADASTRO', 'ATD_HORAINICIO', 'ATD_HORAFINAL', 'ATD_TOTALHORAS', 'ATD_IDFUNCIONARIO', 'ATD_SITUACAO', 'ATD_IDCLIENTE', 'ATD_OBS', 'ATD_AUTOMATICO', 'ATD_IDUSUARIO'));
                            }
                        }
                    }
                }

                if ($Save) {
                    try {
                        $transaction->commit();
                        Yii::app()->user->setFlash('success', $msgAtendimento);
                    } catch (Exception $e) {
                        $transaction->rollback();
                        Yii::app()->user->setFlash('danger', "Ocorreu um erro ao reverter a sincronização");
                    }
                } else {
                    $transaction->rollback();
                    Yii::app()->user->setFlash('danger', "Ocorreu um erro ao reverter a sincronização");
                }
            } else {
                Yii::app()->user->setFlash('danger', "Essa sincronização já foi revertida");
            }
        } else {
            throw new CHttpException(400, 'Sua solicitação é inválida.');
        }
    }

    public function actionAdmin() {
        $model = new ClientesSincronizacoes('search');
        $model->unsetAttributes();

        if (isset($_GET['ClientesSincronizacoes']))
            $model->setAttributes($_GET['ClientesSincronizacoes']);

        $this->render('admin', array('model' => $model));
    }

    public function sincronizaAtendimentos($de, $para) {
        $qtdAtendimentos  = 0;
        $Atendimentos     = Atendimentos::model()->findAll("ATD_IDCLIENTE = ".$de);

        if ($Atendimentos) {
            $ids_atendimentos = array();
            foreach ($Atendimentos as $Atendimento) {
                $Atendimento->ATD_IDCLIENTE = $para;
                if ($Atendimento->save(false, array('ATD_IDCLIENTE'))) {
                    $ids_atendimentos[] = $Atendimento->ATD_IDATENDIMENTO;
                    $qtdAtendimentos++;
                } else {
                    return false;
                }
            }

            $this->MSG .= '<li>Atendimentos: '.$qtdAtendimentos.(($qtdAtendimentos > 0)?' (Códigos: '.implode(', ', $ids_atendimentos).')':'').'</li>';
        }

        return true;
    }

    public function sincronizaTabelasVinculadas($modelo, $campoIdCliente, $labelModelo = false, $displayField = false) {
        $qtd = 0;
        $registros = new $modelo;
        if (!$labelModelo) {
            $labelModelo = $registros->label(2);
        }
        if ($modelo != "Arquivos") {
            $registros = $registros->findAll("{$campoIdCliente} = {$this->de}");
        } else {
            $registros = $registros->findAll("{$campoIdCliente} = {$this->de} AND ARQ_MODEL = 'Clientes'");
        }

        if ($registros) {
            $model = new $modelo;
            $primaryKey = $registros[0]->tableSchema->primaryKey;

            $ids = array();
            $returnIds = array();
            foreach ($registros as $registro) {
                $ids[] = $registro->{$primaryKey};
                $returnIds[] = (!$displayField) ? $registro->{$primaryKey} : $registro->{$displayField};
            }

            $updatedRows = $model->updateAll(
                array($campoIdCliente => $this->para),
                "{$primaryKey} IN (" . implode(", ", $ids) . ")"
            );

            if (count($registros) == $updatedRows) {
                $this->MSG .= "<li>{$labelModelo}: " . $updatedRows. (($updatedRows > 0) ? " (Registros: " . implode(', ', $returnIds) . ")" : "") . "</li>";
            } else {
                return false;
            }

            return $ids;
        }
        return true;
    }

    public function sincronizaVinculos() {
        $deletedRecords = array();

        $vinculosExcluidos = array();
        $qtdClientesVinculadosExcluidos = 0;

        $qtdClientesVinculados = 0;
        $idsClientesVinculados = array();

        $updatedVinculados = array();

        $clientesVinculados = ClientesVinculados::model()->findAll("VIN_IDCLIENTE = {$this->de}");
        if ($clientesVinculados) {
            foreach ($clientesVinculados as $clienteVinculado) {
                if ($clienteVinculado->VIN_VINCULO != $this->para) {
                    $clienteVinculado->VIN_IDCLIENTE = $this->para;
                    $clienteVinculado->registraAtividade = false;

                    if (!$clienteVinculado->save(false, array('VIN_IDCLIENTE'))) {
                        return false;
                    }
                    $idsClientesVinculados[] = $clienteVinculado->VIN_VINCULO;
                    $qtdClientesVinculados++;

                    $updatedVinculados[] = $clienteVinculado->VIN_IDVINCULO;
                } else {
                    $vinculosExcluidos[] = $clienteVinculado->VIN_IDVINCULO . ' (entre ' . $clienteVinculado->VIN_IDCLIENTE . ' e ' . $clienteVinculado->VIN_VINCULO . ')';
                    $qtdClientesVinculadosExcluidos++;
                    $clienteVinculado->registraAtividade = false;

                    if (!$clienteVinculado->delete()) {
                        return false;
                    }

                    $deletedRecords[] = CJSON::encode($clienteVinculado->attributes);
                }
            }

            $this->MSG .= '<li>Clientes a quem estava vinculado: ' . $qtdClientesVinculados . (($qtdClientesVinculados > 0) ? ' (Códigos: ' . implode(', ', $idsClientesVinculados) . ')' : '') . '</li>';
        }

        $qtdClientesVinculos = 0;
        $idsClientesVinculos = array();

        $updatedVinculos = array();

        $clientesVinculos = ClientesVinculados::model()->findAll("VIN_VINCULO = {$this->de}");
        if ($clientesVinculos) {
            foreach ($clientesVinculos as $clienteVinculo) {
                if ($clienteVinculo->VIN_IDCLIENTE != $this->para) {
                    $clienteVinculo->VIN_VINCULO = $this->para;
                    $clienteVinculo->registraAtividade = false;
                    if (!$clienteVinculo->save(false, array('VIN_VINCULO'))) {
                        return false;
                    }
                    $idsClientesVinculos[] = $clienteVinculo->VIN_IDCLIENTE;
                    $qtdClientesVinculos++;

                    $updatedVinculos[] = $clienteVinculo->VIN_IDVINCULO;
                } else {
                    $vinculosExcluidos[] = $clienteVinculo->VIN_IDVINCULO . ' (entre ' . $clienteVinculo->VIN_IDCLIENTE . ' e ' . $clienteVinculo->VIN_VINCULO . ')';
                    $qtdClientesVinculadosExcluidos++;
                    $clienteVinculo->registraAtividade = false;
                    if (!$clienteVinculo->delete()) {
                        return false;
                    }

                    $deletedRecords[] = CJSON::encode($clienteVinculo->attributes);
                }
            }

            $this->MSG .= '<li>Clientes vinculados a ele: ' . $qtdClientesVinculos . (($qtdClientesVinculos > 0) ? ' (Códigos: ' . implode(', ', $idsClientesVinculos) . ')' : '') . '</li>';
        }

        if ($qtdClientesVinculadosExcluidos > 0) {
            $this->MSG .= '<li>Vínculos excluídos pois resultariam em vínculo de cliente com ele mesmo: ' . $qtdClientesVinculadosExcluidos . (($qtdClientesVinculadosExcluidos > 0) ? ' => Códigos: ' . implode(', ', $vinculosExcluidos) . '' : '') . '</li>';
        }

        if (!empty($updatedVinculados) || !empty($updatedVinculos) || !empty($deletedRecords)) {
            $retorno['updatedVinculados'] = (!empty($updatedVinculados)) ? $updatedVinculados : false;
            $retorno['updatedVinculos'] = (!empty($updatedVinculos)) ? $updatedVinculos : false;
            $retorno['deleted'] = (!empty($deletedRecords)) ? $deletedRecords : false;

            return $retorno;
        }
        return true;
    }
}