✏️ 正在编辑: CallcenterCampanha.php
路径:
/srv/systems_dir/yuppiecred/application/models/CallcenterCampanha.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php use Carbon\Carbon; class Model_CallcenterCampanha { private $_id; private $_nome; private $_codigo; private $_dataInicial; private $_dataFinal; private $_situacao; //status da campanha: ATIVA, INATIVA, LIBERADA, FINALIZADA private $_margemMinima; private $_consultaMargem; private $_escolherCliente; private $_carteirizar; private $_descricao; private $_idadeMinima; private $_idadeMaxima; private $_ultimaHigienizacao; private $_qtdHigienizada; private $_codigoEntidade; private $_codigoPromotora; private $_higienizacaoAutomatica; private $_frequenciaHigienizacao; public function getId() { return $this->_id; } public function setId($id) { $this->_id = $id; } public function getNome() { return $this->_nome; } public function setNome($nome) { $this->_nome = $nome; } public function getCodigo() { return $this->_codigo; } public function setCodigo($codigo) { $this->_codigo = $codigo; } public function getDataInicial() { return $this->_dataInicial; } public function setDataInicial($dataInicial) { if( !empty($dataInicial) ){ try { $data = new Zend_Date($dataInicial, Zend_Date::DATES, 'pt'); $dataInicial = $data->toString('yyyy-MM-dd'); } catch ( Zend_Date_Exception $e ) { echo $e->getMessage(); $dataInicial = null; } } else { $dataInicial = null; } $this->_dataInicial = $dataInicial; } public function getDataFinal() { return $this->_dataFinal; } public function setDataFinal($dataFinal) { if( !empty($dataFinal) ){ try { $data = new Zend_Date($dataFinal, Zend_Date::DATES, 'pt'); $dataFinal = $data->toString('yyyy-MM-dd'); } catch ( Zend_Date_Exception $e ) { echo $e->getMessage(); $dataFinal = null; } } else { $dataFinal = null; } $this->_dataFinal = $dataFinal; } public function getSituacao() { return $this->_situacao; } public function setSituacao($situacao) { $this->_situacao = $situacao; } public function getMargemMinima() { return $this->_margemMinima; } public function setMargemMinima($margemMinima) { $this->_margemMinima = $margemMinima; } public function getConsultaMargem() { return $this->_consultaMargem; } public function setConsultaMargem($consultaMargem) { $this->_consultaMargem = $consultaMargem; } function getEscolherCliente() { return $this->_escolherCliente; } function setEscolherCliente($escolherCliente) { $this->_escolherCliente = $escolherCliente; } public function getCarteirizar() { return $this->_carteirizar; } public function setCarteirizar($carteirizar) { $this->_carteirizar = $carteirizar; } public function getDescricao() { return $this->_descricao; } public function setDescricao($descricao) { $this->_descricao = $descricao; } public function getIdadeMinima() { return $this->_idadeMinima; } public function setIdadeMinima($idadeMinima) { $this->_idadeMinima = $idadeMinima; } function getIdadeMaxima() { return $this->_idadeMaxima; } function setIdadeMaxima($idadeMaxima) { $this->_idadeMaxima = $idadeMaxima; } public function getUltimaHigienizacao() { return $this->_ultimaHigienizacao; } public function getQtdHigienizada() { return $this->_qtdHigienizada; } public function setUltimaHigienizacao($ultimaHigienizacao) { $this->_ultimaHigienizacao = $ultimaHigienizacao; } protected function setQtdHigienizada($qtdHigienizar) { $this->_qtdHigienizada = $qtdHigienizar; } public function addQtdHigienizada($qtdHigienizar) { $this->_qtdHigienizada += (int) $qtdHigienizar; } public function getCodigoEntidade() { return $this->_codigoEntidade; } public function setCodigoEntidade($codigoEntidade) { $this->_codigoEntidade = $codigoEntidade; } public function getCodigoPromotora() { return $this->_codigoPromotora; } public function setCodigoPromotora($codigoPromotora) { $this->_codigoPromotora = $codigoPromotora; } public function setHigienizacaoAutomatica($higienizacaoAutomatica) { $this->_higienizacaoAutomatica = $higienizacaoAutomatica; } public function getHigienizacaoAutomatica() { return $this->_higienizacaoAutomatica; } public function setFrequenciaHigienizacao($frequenciaHigienizacao) { $this->_frequenciaHigienizacao = $frequenciaHigienizacao; } public function getFrequenciaHigienizacao() { return $this->_frequenciaHigienizacao; } public function __construct($options = null) { if( is_array($options) ){ $this->setOptions($options); } } public function setOptions(array $options) { $methods = get_class_methods($this); foreach ( $options as $key => $value ) { $explode = explode('_', $key); $methodName = ''; foreach ( $explode as $v ) { $methodName .= ucfirst($v); } $key = $methodName != '' ? $methodName : $key; $method = 'set' . ucfirst($key); if( in_array($method, $methods) ){ $this->$method($value); } } return $this; } public function _toArray() { $dbtable = new Model_DbTable_CallcenterCampanha(); $info = $dbtable->info(); $methods = get_class_methods($this); $data = array(); foreach ( $info['cols'] as $key ) { $col = $key; $explode = explode('_', $key); $methodName = ''; foreach ( $explode as $v ) { $methodName .= ucfirst($v); } $key = $methodName != '' ? $methodName : $key; $method = 'get' . ucfirst($key); if( in_array($method, $methods) ){ $data[$col] = $this->$method(); } } return $data; } /** * Insere ou altera o registro passado por parâmetro * @param Model_CallcenterCampanha $campanha */ public function salvar(Model_CallcenterCampanha $campanha) { $dbtable = new Model_DbTable_CallcenterCampanha(); if( $campanha->getId() > 0 ){ $dbtable->update($campanha->_toArray(), 'id = ' . $campanha->getId()); return $campanha->getId(); } else { return $dbtable->insert($campanha->_toArray()); } } /** * Retorna uma lista de campanhas * @param string $fields * @param string $order * @param int $page * @return Zend_Paginator|Zend_Db_Table_Rowset * * @throws Exception */ public function listar($fields = null, $order = 'data_inicial ASC', $page = null) { $dbtable = new Model_DbTable_CallcenterCampanha(); $select = $dbtable->getAdapter()->select() ->from(['campanhas' => 'tb_callcenter_campanhas'], ['campanhas.*']) ->joinLeft(['base' => 'tb_callcenter_base'], 'campanhas.id = base.campanha_id', [ 'qtd_clientes' => 'COUNT(base.id)', 'qtd_nao_atendidos' => "SUM(IF(status_atendimento IS NULL AND telefone_chamada IS NULL, 1, 0))" ]) ->group('campanhas.id') ->where('campanhas.excluido <> 1') ->order($order); if ( !empty($fields['nome']) ){ $select->where("campanhas.nome LIKE '%{$fields['nome']}%'") ; } if ( !empty($fields['codigo']) ){ $select->where("campanhas.codigo = '{$fields['codigo']}'") ; } if ( !empty($fields['data_inicial']) && !empty($fields['data_final']) ){ $dataInicial = date_create_from_format('d/m/Y', $fields['data_inicial'])->format('Y-m-d'); $dataFinal = date_create_from_format('d/m/Y', $fields['data_final'])->format('Y-m-d'); $select->where("(campanhas.data_inicial >= '$dataInicial' AND campanhas.data_final <= '$dataFinal')"); } if ( !empty($fields['situacao']) ){ if( is_array($fields['situacao']) ){ $select->where("campanhas.situacao IN (?)", $fields['situacao']); }else{ $select->where("campanhas.situacao = ?", $fields['situacao']); } } if ( !empty($fields['status_discador']) ){ $select->where("campanhas.status_discador = ?", $fields['status_discador']); } if ( !empty($fields['supervisor_id']) ){ $tabelaSupervisores = "tb_callcenter_campanha_supervisores"; $select->joinInner($tabelaSupervisores, "$tabelaSupervisores.campanha_id = campanhas.id", []) ->where("$tabelaSupervisores.supervisor_id = {$fields['supervisor_id']}"); } if ( !empty($fields['operador_id']) ){ $tabelaOperadores = "tb_callcenter_campanha_operadores"; $select->joinInner($tabelaOperadores, "$tabelaOperadores.campanha_id = campanhas.id", []) ->where("$tabelaOperadores.operador_id = {$fields['operador_id']}"); } if( $page ){ $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($page); $paginator->setItemCountPerPage(20); return $paginator; } return $dbtable->getAdapter()->fetchAll($select); } /** * Retorna uma lista * @param string $where * @param string $order * @param int $page * @return array */ public function consultaClientes($fields = null, $order = 'data_inicial ASC', $page = null) { $params = array( "excluido<>1 AND escolher_cliente = 1" ); $where = null; if( isset($fields['nome']) && !empty($fields['nome']) ){ $params[] = "nome LIKE '%" . $fields['nome'] . "%'"; } if( isset($fields['data_inicial_de']) && !empty($fields['data_inicial_de']) && isset($fields['data_inicial_a']) && !empty($fields['data_inicial_a']) ){ $params[] = "(data_inicial >= STR_TO_DATE('" . $fields['data_inicial_de'] . "', '%d/%m/%Y')" . " AND data_inicial <= STR_TO_DATE('" . $fields['data_inicial_a'] . "', '%d/%m/%Y'))"; } if( isset($fields['situacao']) && !empty($fields['situacao']) ){ if( is_array($fields['situacao']) ){ $tmp = array(); foreach ( $fields['situacao'] as $value ) { $tmp[] = sprintf("situacao LIKE '%s'", $value); } $params[] = '(' . implode(' OR ', $tmp) . ')'; } else { $params[] = "situacao = '" . $fields['situacao'] . "'"; } } //se tiver acessando como supervisor do callcenter, exibe apenas as campanhas nas quais está alocado if( Yuppie_Auth::getIdentity()->corretor_id > 0 || Yuppie_Auth::getIdentity()->grupo == 'Digitador' ){ $operador = new Model_CallcenterOperador(); $campanhas = $operador->getCampanhasAlocadas( Yuppie_Auth::getIdentity()->id); if( count($campanhas) > 0 ){ $campanhasAlocadas = array(); foreach ( $campanhas as $c ) { $campanhasAlocadas[] = $c['campanha_id']; } if( count($campanhasAlocadas) > 0 ){ $campanhasAlocadas = implode(', ', $campanhasAlocadas); $params[] = '(id IN (' . $campanhasAlocadas . '))'; } } } if( count($params) > 0 ) $where = implode(' AND ', $params); $dbtable = new Model_DbTable_CallcenterCampanha(); $selectBase = $dbtable->getAdapter()->select()->from('tb_callcenter_base', array( 'qtd_clientes' => 'COUNT(id)', 'campanha_id' )) ->group(array( 'campanha_id' )); $select = $dbtable->getAdapter()->select()->from('tb_callcenter_campanhas', array( 'tb_callcenter_campanhas.*' )) ->joinLeft(array( 'base' => $selectBase ), 'tb_callcenter_campanhas.id = base.campanha_id', array( 'qtd_clientes' )) ->group(array( 'tb_callcenter_campanhas.id' )) ->order($order); if( $where != null ){ $select->where($where); } if( $page ){ $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($page); return $paginator; } return $dbtable->getAdapter()->fetchAll($select); } /** * Exclui o registro passado por parâmetro * @param int $id * @return int The number of rows deleted */ public function excluir($id) { if( $id > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanha(); return $dbtable->delete('id = ' . $id); } return null; } /** * Retorna um fetchRow do item passado por parâmetro * @param int $id * @return Zend_Db_Table_Row_Abstract | null */ public function exibir($id) { $dbtable = new Model_DbTable_CallcenterCampanha(); $options = $dbtable->fetchRow(['id = ?' => $id]); if($options){ $this->setOptions($options->toArray()); } return $options; } public function exibirCampanhas($ids) { $dbtable = new Model_DbTable_CallcenterCampanha(); $options = $dbtable->fetchAll(['id IN(?)' => $ids]); if($options){ $this->setOptions($options->toArray()); } return $options; } public function getBase($dataHigienizacao = null, $limit = null, $cpfs = [], $columns = ['id', 'cpf', 'nome']) { if( $this->getId() ){ $dbtable = new Model_DbTable_CallcenterBase(); $select = $dbtable->select() ->from($dbtable, $columns) ->where("campanha_id = {$this->getId()}"); if (count($cpfs) > 0) { $select->where("cpf IN ('" .implode("','", $cpfs). "') "); } elseif ($dataHigienizacao != null) { $data = Core_Util::convertDate($dataHigienizacao); $select->where("data_higienizacao IS NULL OR data_higienizacao <= '{$data}'"); } if ($limit) { $select->limit($limit); } $select->order("data_higienizacao"); return $dbtable->getAdapter()->fetchAll($select); } return null; } /** * Ativa o cliente na campanha * @param int $clienteId * @return int||null */ public function ativarCliente($clienteId) { if( $clienteId > 0 ){ $dbtable = new Model_DbTable_CallcenterBase(); return $dbtable->update(array( 'ativo' => 1 ), 'id = ' . $clienteId); } return null; } public static function ativarCampanha($campanhaId) { if( $campanhaId > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanha(); $dbtable->update(array( 'situacao' => 'ATIVA' ), 'id=' . $campanhaId); } } public function resetHigienizacao() { if(!is_null($this->getUltimaHigienizacao())){ $data = new DateTime($this->getUltimaHigienizacao()); $hoje = new DateTime(); $hoje->setTime(0, 0, 0); if($this->getId() > 0 && $hoje > $data){ $this->setQtdHigienizada(0); return $this->salvar($this); } } return; } public function exibirClienteEmAtendimento($operadorId) { $corretorId = isset(Yuppie_Auth::getIdentity()->corretor_id) ? Yuppie_Auth::getIdentity()->corretor_id : false; if( !$operadorId || !$corretorId ){ return; } $dbtable = new Model_DbTable_CallcenterBase(); $where = array( 'ativo = 1', "status_atendimento = 'EM ATENDIMENTO'", "usuario_ultimo_atendimento = {$operadorId}" ); return $dbtable->fetchRow($where); } public function exibirClienteAgendado($operadorId) { $dbtable = new Model_DbTable_CallcenterBase(); $where = array( "(status_atendimento = 'RETORNAR' OR status_atendimento = 'NEGOCIANDO'" . " OR status_atendimento = 'AGENDAMENTO NA LOJA')", "usuario_ultimo_atendimento = " . $operadorId, "agendado_para <= CURDATE()", "hora_agendada <= '" . date('H:i') . "'" ); $clienteAgendado = $dbtable->fetchRow($where, array('agendado_para ASC', 'hora_agendada ASC')); if( $clienteAgendado != null && count($clienteAgendado) > 0 ){ //trava o cliente em atendimento $affectedRows = $dbtable->update( array( 'status_atendimento' => 'EM ATENDIMENTO' ), "id = " . $clienteAgendado['id'] . " AND (status_atendimento != 'EM ATENDIMENTO'" . ' OR status_atendimento IS NULL)'); if( $affectedRows > 0 ){ // retorna os dados do cliente return $clienteAgendado; } } } public function exibirCliente($campanhaId = 0, $operadorId = 0) { $corretorId = Yuppie_Auth::getIdentity()->corretor_id; if (!$operadorId || !$corretorId) { return; } $clienteEmAtendimento = $this->exibirClienteEmAtendimento($operadorId); if ($clienteEmAtendimento) { return $clienteEmAtendimento; } $dbtable = new Model_DbTable_CallcenterBase(); $where = array( 'base.ativo = 1' ); $params = array(); //data_ultimo_atendimento < (hoje-7dias) $now = Zend_Date::now()->subDay(7)->get('yyyy-MM-dd HH:mm:ss'); $params[] = "base.status_atendimento IS NULL OR base.status_atendimento = ''"; $params[] = "(base.status_atendimento = 'NAO ATENDE' AND base.usuario_ultimo_atendimento <> {$operadorId} AND '$now' > base.data_ultimo_atendimento)"; $params[] = "(base.status_atendimento = 'LIMITE DE RETORNO ATINGIDO' AND base.usuario_ultimo_atendimento <> {$operadorId})"; $where[] = "(" . implode(" OR ", $params) . ")"; $where[] = "(base.usuario_carteirizacao IS NULL OR base.usuario_carteirizacao = 0 OR base.usuario_carteirizacao = {$operadorId})"; if ($campanhaId > 0) { $where[] = 'base.campanha_id = ' . $campanhaId; } $clienteAgendado = $this->exibirClienteAgendado($operadorId); if ($clienteAgendado) { return $clienteAgendado; } $results = $dbtable->getClientesAtendimento($where); if (!$results) { return null; } $dados = null; // Percorre os resultados e tenta atualizar o status foreach ($results as $d) { $arrData = array( 'status_atendimento' => 'EM ATENDIMENTO' ); $dadosCampanha = (new Model_CallcenterCampanha()) ->exibir($d['campanha_id']); if ($dadosCampanha->carteirizar == 1) { $arrData['usuario_carteirizacao'] = $operadorId; } //seta o status do cliente como em atendimento para que //outro operador não puxe o mesmo $affectedRows = $dbtable->update( $arrData, "id = " . $d['id'] . " AND (status_atendimento != 'EM ATENDIMENTO'" . ' OR status_atendimento IS NULL)' ); if ($affectedRows > 0) { // Se o update for feito com sucesso, para o laço, e // retorna os dados deste cliente $dados = $d; break; } } return $dados; } public function exibirClienteReceptivo($clienteId, $atenderCaterizado = null, $chamadaId = null) { if (!$clienteId) { return null; } $operadorId = Yuppie_Auth::getIdentity()->id; $dados = (new Model_DbTable_CallcenterBase()) ->fetchRow('id = ' . $clienteId) ->toArray(); if (!$dados) { return null; } if ($atenderCaterizado <> 1) { $statusAtendimento = new Model_CallcenterStatusAtendimento(); $tabulacaoNegativa = $statusAtendimento->getTabulacaoNegativa(); $tabulacaoPermiteOutroAtender = $statusAtendimento->permiteOutroOperadorAtender($dados['status_atendimento']); if (!empty($dados['usuario_ultimo_atendimento']) && $dados['usuario_ultimo_atendimento'] != Yuppie_Auth::getIdentity()->id && !empty($dados['status_atendimento']) && !in_array($dados['status_atendimento'], $tabulacaoNegativa) && !$tabulacaoPermiteOutroAtender ) { $operadorAlocado = (new Model_Usuario()) ->exibir($dados['usuario_ultimo_atendimento']); $mensagem = 'Permissão negada. Cliente alocado para outro operador. ' . ($operadorAlocado['nome'] ?? ""); throw new Exception($mensagem); } } $dados['chamada_id'] = $chamadaId; //sobrepor o ID de chamada que estava no banco $dadosAtendimento = [ 'status_atendimento' => 'EM ATENDIMENTO', 'data_ultimo_atendimento' => date('Y-m-d H:i:s'), 'usuario_ultimo_atendimento' => $operadorId, 'hora_agendada' => null, 'telefone_chamada' => $chamadaId ]; $dadosCampanha = (new Model_CallcenterCampanha()) ->exibir($dados['campanha_id']); if ($dadosCampanha->carteirizar == 1) { $dadosAtendimento['usuario_carteirizacao'] = $operadorId; } //seta o status do cliente como em atendimento para que outro operador não puxe o mesmo try { (new Model_DbTable_CallcenterBase() )->update($dadosAtendimento, "id = '" . $dados['id'] . "'"); } catch (Exception $exception) { throw new Exception('Erro ao atualizar Status do atendimento.'); } return $dados; } public function getEmprestimosCliente($cpfCliente) { $cpf = String_Refatorar::formatarCpf($cpfCliente); $validator = new Validators_Cpf(); if( $validator->isValid($cpf) ){ $dbtable = new Model_DbTable_CallcenterEmprestimoCliente(); return $dbtable->fetchAll("cpf_cliente = '{$cpf}'", array("beneficio", "tipo ASC", "inicio_contrato ASC" )); } return null; } public function getEmprestimosClienteByBeneficio($cpfCliente) { $cpf = String_Refatorar::formatarCpf($cpfCliente); $validator = new Validators_Cpf(); if( $validator->isValid($cpf) ){ $dbtable = new Model_DbTable_CallcenterEmprestimoCliente(); $select = $dbtable->getAdapter()->select()->from(array('emprestimos' => 'tb_callcenter_emprestimos_clientes'), array('emprestimos.*')) ->joinLeft(array('beneficios' => 'tb_callcenter_beneficios'), 'beneficios.cpf_cliente = emprestimos.cpf_cliente', array('limite_cartao' => 'beneficios.limite_cartao', 'situacao_beneficio' => 'beneficios.situacao', 'margem_cartao' => 'beneficios.margem_cartao')) ->where("emprestimos.cpf_cliente = '{$cpf}'") ->where("beneficios.situacao = 'ATIVO'") ->order(array("emprestimos.beneficio", "emprestimos.tipo ASC", "emprestimos.inicio_contrato ASC" )); return $dbtable->getAdapter()->fetchAll($select); } return null; } public function getSupervisores($campanhaId) { if( $campanhaId > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanhaSupervisor(); return $dbtable->fetchAll('campanha_id = ' . $campanhaId); } return null; } public function getUsuarioSupervisor($campanhaId){ if( $campanhaId > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanhaSupervisor(); $select = $dbtable->getAdapter()->select()->from(array( 'cs' => 'tb_callcenter_campanha_supervisores' ),array('*')) ->joinLeft(array( 'gr' => 'tb_gerente_rota' ), 'cs.supervisor_id = gr.id', array('nome')) ->where("campanha_id = {$campanhaId}") ->where('cs.excluido<>1') ->order("campanha_id"); return $dbtable->getAdapter()->fetchAll($select); } return null; } public function adicionarSupervisor($campanhaId, $supervisorId) { if( $campanhaId > 0 && $supervisorId > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanhaSupervisor(); return $dbtable->insert(array( 'campanha_id' => $campanhaId, 'supervisor_id' => $supervisorId )); } return null; } public function excluirSupervisorCampanha($supervisorId) { if( $supervisorId > 0 ){ $dbtable = new Model_DbTable_CallcenterCampanhaSupervisor(); return $dbtable->delete('id = ' . $supervisorId); } return null; } public function getAtendimentosPorCampanha($fields) { $dbtable = new Model_DbTable_CallcenterBase(); $select = $dbtable->getAdapter()->select() ->from(array( 'b' => 'tb_callcenter_base' ), array( 'b.usuario_ultimo_atendimento', 'b.campanha_id', 'qtd_atendimentos' => 'COUNT(b.id)' )) ->joinLeft(array( 'u' => 'tb_usuarios' ), 'b.usuario_ultimo_atendimento = u.id', array( 'usuario' => 'login' )) ->joinLeft(array( 'c' => 'tb_corretores' ), 'u.corretor_id = c.id', array( 'corretor' => 'c.nome' )) ->joinLeft(array( 'r' => 'tb_rotas' ), 'c.rota_id = r.id', array()) ->joinLeft(array( 'ca' => 'tb_callcenter_campanhas' ), 'b.campanha_id = ca.id', array( 'nome_campanha' => 'ca.nome' )) ->where("status_atendimento IS NOT NULL AND status_atendimento != ''") ->order(array( 'qtd_atendimentos DESC' )) ->group(array( 'b.campanha_id', 'b.usuario_ultimo_atendimento' )); if ( !empty($fields['campanha_id']) ){ $campanhas = is_array($fields['campanha_id']) ? implode(",", $fields['campanha_id']) : $fields['campanha_id']; $select->where("campanha_id IN ({$campanhas})"); } if ( !empty($fields['data_inicial']) ){ $dataInicial = new Zend_Date("{$fields['data_inicial']} 00:00:00", 'dd/MM/yyyy HH:mm:ss'); if (!empty($fields['hora_inicial'])){ $dataInicial->setTime($fields['hora_inicial'], 'HH:mm:ss'); } $select->where("data_ultimo_atendimento >= ?", "{$dataInicial->get('yyyy-MM-dd HH:mm:ss')}"); } if ( !empty($fields['data_final']) ){ $dataFinal = new Zend_Date("{$fields['data_final']} 23:59:59", 'dd/MM/yyyy HH:mm:ss'); if ( !empty($fields['hora_final']) ){ $dataFinal->setTime($fields['hora_final'], 'HH:mm:ss'); } $select->where("data_ultimo_atendimento <= ?" , "{$dataFinal->get('yyyy-MM-dd HH:mm:ss')}"); } if ( !empty($fields['rota_id']) ){ $select->where("r.id = ?" , $fields['rota_id']); } if ( !empty($fields['usuario']) ){ $select->where("b.usuario_ultimo_atendimento = ?" , $fields['usuario']); } return $dbtable->getAdapter()->fetchAll($select); } public function getAtendimentosPorStatus($fields) { $dbtable = new Model_DbTable_CallcenterBase(); $select = $dbtable->getAdapter()->select() ->from(['b' => 'tb_callcenter_base'], ['b.status_atendimento', 'qtd_atendimentos' => 'COUNT(b.id)']) ->joinLeft(['u' => 'tb_usuarios'], 'b.usuario_ultimo_atendimento = u.id', ['usuario' => 'login']) ->joinLeft(['c' => 'tb_corretores'], 'u.corretor_id = c.id', ['corretor' => 'nome']) ->joinLeft(['r' => 'tb_rotas'], 'c.rota_id = r.id', []) ->joinLeft(['ca' => 'tb_callcenter_campanhas'], 'b.campanha_id = ca.id', ['nome_campanha' => 'ca.nome']) ->where("status_atendimento IS NOT NULL AND status_atendimento != ''") ->order(['qtd_atendimentos DESC', 'b.status_atendimento']) ->group(['status_atendimento']); if ( !empty($fields['campanha_id']) ){ $campanhas = is_array($fields['campanha_id']) ? implode(',', $fields['campanha_id']) : $fields['campanha_id']; $select->where("campanha_id IN ({$campanhas})"); } if ( !empty($fields['data_inicial']) ){ $dataInicial = new Zend_Date("{$fields['data_inicial']} 00:00:00", 'dd/MM/yyyy HH:mm:ss'); if (!empty($fields['hora_inicial'])){ $dataInicial->setTime($fields['hora_inicial'], 'HH:mm:ss'); } $select->where("data_ultimo_atendimento >= ?", "{$dataInicial->get('yyyy-MM-dd HH:mm:ss')}"); } if ( !empty($fields['data_final']) ){ $dataFinal = new Zend_Date("{$fields['data_final']} 23:59:59", 'dd/MM/yyyy HH:mm:ss'); if ( !empty($fields['hora_final']) ){ $dataFinal->setTime($fields['hora_final'], 'HH:mm:ss'); } $select->where("data_ultimo_atendimento <= ?" , "{$dataFinal->get('yyyy-MM-dd HH:mm:ss')}"); } if ( !empty($fields['rota_id']) ){ $select->where("r.id = ?" , $fields['rota_id']); } if ( !empty($fields['usuario']) ){ $select->where("b.usuario_ultimo_atendimento = ?" , $fields['usuario']); } return $dbtable->getAdapter()->fetchAll($select); } public function getClientesEmAtendimento($fields) { $dbtable = new Model_DbTable_CallcenterBase(); $select = $dbtable->getAdapter()->select() ->from(array( 'b' => 'tb_callcenter_base' ), array( 'id' ,'nome', 'data_ultimo_atendimento' , 'cpf', 'campanha_id')) ->joinLeft(array( 'u' => 'tb_usuarios' ), 'b.usuario_ultimo_atendimento = u.id', array( 'usuario' => 'login' )) ->joinLeft(array( 'c' => 'tb_corretores' ), 'u.corretor_id = c.id', array( 'corretor' => 'nome' )) ->joinLeft(array( 'r' => 'tb_rotas' ), 'c.rota_id = r.id', array()) ->joinLeft(array( 'ca' => 'tb_callcenter_campanhas' ), 'b.campanha_id = ca.id', array( 'nome_campanha' => 'ca.nome' )) ->where("status_atendimento = 'EM ATENDIMENTO'"); if( !empty($fields['campanha_id']) ){ $campanhas = is_array($fields['campanha_id']) ? implode(',', $fields['campanha_id']) : $fields['campanha_id']; $select->where("campanha_id IN ({$campanhas})"); } if ( !empty($fields['rota_id']) ){ $select->where("r.id = ?" , $fields['rota_id']); } if ( !empty($fields['usuario']) ){ $select->where("b.usuario_ultimo_atendimento = ?" , $fields['usuario']); } return $dbtable->getAdapter()->fetchAll($select); } /** * Ativa os clientes de uma campanha, com exceção daqueles que estiverem com um status * sinalizado para desativar (ex. FALECIDO) * @param int $campanhaId * @return int */ public function ativarClientes($campanhaId) { if( $campanhaId > 0 ){ $dbtable = new Model_DbTable_CallcenterBase(); $select = $dbtable->getAdapter()->select()->from(array('base' => 'tb_callcenter_base'), array('base.id')) ->join('tb_tipos', 'tb_tipos.descricao = base.status_atendimento and desativar_cliente_callcenter = 1', array()) ->where('base.campanha_id = ?', $campanhaId); $ids = $dbtable->getAdapter()->fetchCol($select); $where = "campanha_id = {$campanhaId}"; if( count($ids) > 0 ){ $where .= " AND id not in(" . implode(",", $ids) . ")"; } return $dbtable->update(array( 'ativo' => 1 ), $where); } return 0; } public function importacaoPropria($campanhaId, $fields) { $dbtable = new Model_DbTable_Cliente(); $select = $dbtable->getAdapter()->select(); $this->_condicoesImportacaoPropria($fields, $select); //seleciona os clientes $select->from(['clientes' => 'tb_clientes']) ->joinInner(['contratos' => 'tb_contratos'], 'clientes.id = contratos.cliente_id AND contratos.excluido<>1', ['numero_beneficio', 'valor_beneficio']) ->joinInner(['corretores' => 'tb_corretores'], 'contratos.corretor_id = corretores.id', []) ->order(['contratos.data_emissao ASC']) ->group(['clientes.cpf', 'contratos.numero_beneficio']); $clientes = $dbtable->getAdapter()->fetchAll($select); if (empty($clientes)) { return 0; } foreach ($clientes as $c) { $cpfCliente = String_Refatorar::soNumeros($c['cpf']); if (strlen($cpfCliente) <= 11) { $cpfCliente = String_Refatorar::formatarCpf($c['cpf']); if (!Validators_Cpf::validate($cpfCliente)) { continue; } } else { $cpfCliente = String_Refatorar::formatarCnpj($c['cpf']); if (!Validators_Cnpj::validate($cpfCliente)) { continue; } } //Cadastra os clientes. Método insert já trata a duplicidade $baseId = (new Model_DbTable_CallcenterBase())->insert([ 'campanha_id' => $campanhaId, 'nome' => $c['nome'], 'cpf' => $cpfCliente, 'data_nascimento' => $c['data_nascimento'], 'carteira_corretor' => $fields['corretor_id'] ?? 0 ]); $callcenterBase = (new Model_DbTable_CallcenterBase())->fetchRow(['id = ?' => $baseId]); //se já está em atendimento por outra pessoa, não altera if ($callcenterBase->campanha_id != $campanhaId && !empty($callcenterBase->status_atendimento)) { continue; } if (empty($callcenterBase->campanha_id) || $callcenterBase->campanha_id != $campanhaId ) { (new Model_DbTable_CallcenterBase())->update([ 'campanha_id' => $campanhaId, 'carteira_corretor' => $fields['carteira_corretor'] ], "id = {$baseId}"); } if( !empty($c['endereco']) ){ try{ (new Model_DbTable_CallcenterEndereco())->insert([ 'cpf_cliente' => $cpfCliente, 'endereco' => $c['endereco'], 'complemento' => $c['complemento'], 'bairro' => $c['bairro'], 'cidade' => $c['cidade'], 'uf' => $c['uf'], 'cep' => $c['cep'], ]); } catch (Exception $e){ } } if( !empty($c['celular']) ){ try{ (new Model_DbTable_CallcenterTelefone())->insert([ 'cliente_id' => $callcenterBase->id, 'fone' => $c['celular'], 'origem' => "IMPORTACAO", ]); } catch(Exception $e){ } } if( !empty($c['fone']) ){ try{ (new Model_DbTable_CallcenterTelefone())->insert([ 'cliente_id' => $callcenterBase->id, 'fone' => $c['fone'], 'origem' => "IMPORTACAO", ]); } catch(Exception $e){ } } if( !empty($c['numero_beneficio']) ){ (new Model_DbTable_CallcenterBeneficio())->insert([ 'base_cliente_id' => $callcenterBase->id, 'cpf_cliente' => $cpfCliente, 'beneficio' => $c['numero_beneficio'], 'mr' => $c['valor_beneficio'], 'origem' => "IMPORTACAO", ]); } } return count($clientes); } protected function _condicoesImportacaoPropria($fields, &$select) { $select->where('clientes.excluido<>1 AND contratos.excluido<>1 AND contratos.tipo_registro = 1'); if( !empty($fields['convenio']) ){ $select->where('contratos.convenio_id = ?', (int)$fields['convenio']); } if( !empty($fields['corretor_id']) ){ $select->where('contratos.corretor_id = ?', (int)$fields['corretor_id']); } if( !empty($fields['data_emissao_de']) ){ $select->where("contratos.data_emissao >= STR_TO_DATE(?, '%d/%m/%Y')", $fields['data_emissao_de']); } if( !empty($fields['data_emissao_a']) ){ $select->where("contratos.data_emissao <= STR_TO_DATE(?, '%d/%m/%Y')", $fields['data_emissao_a']); } if( !empty($fields['data_liberacao_de']) ){ $select->where("contratos.data_liberacao >= STR_TO_DATE(?, '%d/%m/%Y')", $fields['data_liberacao_de']); } if( !empty($fields['data_liberacao_a']) ){ $select->where("contratos.data_liberacao <= STR_TO_DATE(?, '%d/%m/%Y')", $fields['data_liberacao_a']); } if (!empty($fields['banco_id'])) { $select->where("contratos.banco_id = ?", $fields['banco_id']); } if (!empty($fields['tipo_contrato'])) { $select->where("contratos.tipo IN(?)", $fields['tipo_contrato']); } } public function importarBase($params, $fileName) { $dbtable = new Model_DbTable_CallcenterCampanha(); $sheetData = $dbtable->loadCsvToDatabase($fileName); $planilha = new Core_Callcenter_PlanilhaCallcenter($params); return $planilha->importar($sheetData); } public function verificaOperadorAlocado($campanhas, $campanhaId) { $result = false; foreach ( $campanhas as $campanha ) { if( $campanha['campanha_id'] == $campanhaId ){ $result = true; break; } } return $result; } public function getQtdeClientesCampanha($fields = array()) { $dbtable = new Model_DbTable_CallcenterCampanha(); $selectBase = $dbtable->getAdapter()->select() ->from('tb_callcenter_base', ['qtd_clientes' => 'COUNT(id)', 'campanha_id' ]) ->group(['campanha_id']); if (!empty($fields['ativo'])) { if ($fields['ativo'] == 1) { $selectBase->where("ativo = 1"); } else{ $selectBase->where("ativo = 0"); } } if (!empty($fields['status_atendimento'])) { if ($fields['status_atendimento'] == 'SEM_STATUS') { $selectBase->where("status_atendimento is null"); } else{ $selectBase->where("status_atendimento = ?". $fields['status_atendimento']); } } $select = $dbtable->getAdapter()->select() ->from(['campanha' => 'tb_callcenter_campanhas'], ['campanha_nome' => 'campanha.nome']) ->joinInner(['base' => $selectBase], 'campanha.id = base.campanha_id', [ 'qtd_clientes' ]) ->group(['campanha.id']) ->order("campanha.id"); if(!empty($fields['campanha_id']) ){ $campanhas = is_array($fields['campanha_id']) ? implode(',', $fields['campanha_id']) : $fields['campanha_id']; $select->where("campanha.id IN ({$campanhas})"); } return $dbtable->getAdapter()->fetchAll($select); } public function tratarPoliticaIdade() { $where = "campanha_id = {$this->getId()} "; $where .= "AND (SUBSTRING( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_nascimento ) ) , 3, 2 ) < {$this->getIdadeMinima()} " . "OR SUBSTRING( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( data_nascimento ) ) , 3, 2 ) > {$this->getIdadeMaxima()})"; $dbCliente = new Model_DbTable_CallcenterBase(); return $dbCliente->update(array( 'ativo' => 0, 'status_atendimento' => 'POLITICA DE IDADE' ), $where); } public function limparTelefonesBase($campanhaId) { if( empty($campanhaId) ){ return; } $dbtable = new Model_DbTable_CallcenterCampanha(); $select = $dbtable->getAdapter()->select()->from(["b" => "tb_callcenter_base"], []) ->joinInner(["t" => "tb_callcenter_telefones"], "b.id = t.cliente_id AND t.excluido<>1", ['t.id']) ->where("b.campanha_id = ?", $campanhaId); $telefones = $dbtable->getAdapter()->fetchCol($select); if( empty($telefones) ){ return; } $result = (new Model_DbTable_CallcenterTelefone()) ->delete("id IN (" . implode(',', $telefones) . ")"); return $result; } /** * @param int $corretor * @return array */ public function getCampanhaCorretorOportunidadeOrNew(int $corretor): ?Zend_Db_Table_Row_Abstract { $table = new Model_DbTable_CallcenterCampanha(); $campanhanNome = "$corretor - OPORTUNIDADES DE NEGÓCIOS"; $campanha = $table->fetchRow(['nome = ?' => $campanhanNome, "corretor_id = ?" => $corretor]); if (empty($campanha)) { $campanhaNew = []; $campanhaNew['nome'] = $campanhanNome; $campanhaNew['situacao'] = "LIBERADA"; $campanhaNew['carteirizar'] = 1; $campanhaNew['data_inicial'] = date('Y-m-d'); $campanhaNew['corretor_id'] = $corretor; $id = $table->insert($campanhaNew); return $table->fetchRow(['id = ?' => $id]); } return $campanha; } /** * @param string $nome * @return int */ public function getOrCreateCampanhaNome(string $nome): int { $dbtable = new Model_DbTable_CallcenterCampanha(); $campanha = $dbtable->fetchRow(['nome = ?' => $nome]); return $campanha->id ?? $dbtable->insert([ 'nome' => $nome, 'data_inicial' => Carbon::now()->format('Y-m-d'), 'data_final' => null, 'situacao' => 'ATIVA', ]); } public function viewAnaliseVendas(array $fields) { if (empty($fields['data_liberacao_de']) || empty($fields['data_liberacao_a'])) { return; } $dbtable = (new Model_DbTable_CallcenterCampanha())->getAdapter(); $select = $dbtable->select()->from(['a' => 'tb_callcenter_atendimentos'], [ 'cliente' => 'b.nome', 'b.cpf', 'atendido_em' => 'max(a.data_atendimento)', 'convenio' => 'conv.nome', 'con.numero_contrato', 'con.data_emissao', 'con.data_liberacao', 'banco' => 'ban.nome', 'con.tipo', 'con.base_comissao_empresa_valor', 'qtd_contratos_antes' => 'count(distinct contratos_antes.id)', 'corretor' => 'cor.nome', 'campanha' => 'camp.nome', 'empresa' => 'e.nome', 'sa.utm_source', 'sa.utm_campaign' ]) ->joinInner(['camp' => 'tb_callcenter_campanhas'], 'a.campanha_id = camp.id', []) ->joinInner(['b' => 'tb_callcenter_base'], 'a.cliente_id = b.id', []) ->joinInner(['c' => 'tb_clientes'], 'c.cpf = b.cpf and c.excluido<>1', []) ->joinInner(['con' => 'tb_contratos'], "con.cliente_id = c.id and con.excluido<>1 and date_format(a.data_atendimento, '%Y-%m-%d') <= con.data_liberacao", []) ->joinInner(['cor' => 'tb_corretores'], 'cor.id = con.corretor_id', []) ->joinInner(['conv' => 'tb_convenios'], 'con.convenio_id = conv.id', []) ->joinInner(['ban' => 'tb_bancos'], 'con.banco_id = ban.id', []) ->joinInner(['e' => 'tb_empresas'], 'e.id = con.empresa_id', []) ->joinLeft(['sa' => 'tb_simulacao_aberta'], 'sa.cliente_id = b.id', []) ->joinLeft(['contratos_antes' => 'tb_contratos'], 'contratos_antes.cliente_id = c.id and contratos_antes.data_liberacao < date_sub(con.data_liberacao, interval 30 day) and contratos_antes.status_proposta = 43 and contratos_antes.excluido<>1', []); $select->where("con.status_proposta = 43") ->where("con.data_liberacao >= STR_TO_DATE('{$fields['data_liberacao_de']}', '%d/%m/%Y')") ->where("con.data_liberacao <= STR_TO_DATE('{$fields['data_liberacao_a']}', '%d/%m/%Y')") ->group(['b.cpf', 'con.id']); if (!empty($fields['rota_id'])) { $select->where('cor.rota_id = ?', $fields['rota_id']); } if (!empty($fields['corretor_id'])) { $select->where('cor.id = ?', $fields['corretor_id']); } if (!empty($fields['clientes_novos'])) { if ($fields['clientes_novos'] == 1) { $select->having("qtd_contratos_antes = 0"); } else { $select->having("qtd_contratos_antes > 0"); } } return $dbtable->fetchAll($select); } public function getBaseHigienizar() { return (new Model_DbTable_CallcenterBase())->getBaseBeneficios($this->getId()); } public function getBaseHigienizarPanAutomatizacao($clientes) { $clientesBeneficios = []; foreach ($clientes as $cliente) { $beneficios = (new Model_DbTable_CallcenterBeneficio()) ->fetchBeneficiosByBaseId($cliente['id']); if (count($beneficios) > 0) { foreach ($beneficios as $beneficio) { $cliente['beneficio'] = $beneficio['beneficio']; $clientesBeneficios[] = $cliente; } } } return $clientesBeneficios; } public function getCampanhasHigienizacaoAutomatica() { return (new Model_DbTable_CallcenterCampanha())->fetchAll("higienizacao_automatica = 1 AND (DATEDIFF(ultima_higienizacao, NOW()) >= frequencia_higienizacao OR frequencia_higienizacao = 0 OR ultima_higienizacao is null)"); } public function higienizarFgts(array $clientes, string $metodo) : array { if (count($clientes) == 0) { return [ 'error' => ['Nenhum cliente informado.'] ]; } $horaInicial = (new Zend_Date())->now()->setHour(20)->setMinute(0)->setSecond(0); $horaFinal = (new Zend_Date())->now()->addDay(1)->setHour(5)->setMinute(0)->setSecond(0); $resultadoHigienizacao = [ 'error' => [], 'success' => [], ]; foreach ($clientes as $cliente) { if (!(Zend_Date::now()->getTimestamp() > $horaInicial->getTimestamp() && Zend_Date::now()->getTimestamp() < $horaFinal->getTimestamp())) { break; } Yuppie_Log::write("Higienização {$metodo} iniciada: " . print_r($cliente, true), $this); $dadosConsulta = $this->_higienizarCpf($cliente, $metodo); if (!empty($dadosConsulta->error) && $metodo == "_consultarIcred" && stristr($dadosConsulta->error, "na fila")) { sleep(40); $dadosConsulta = $this->_higienizarCpf($cliente, $metodo); } try { (new Model_CallcenterBase())->gravarConsultaFgts($dadosConsulta, $cliente['cpf']); } catch (Exception $e) { Yuppie_Log::write("Erro ao gravar retorno da consulta na higienização automática => " . print_r($e->getMessage(), true), $this); } if (!empty($dadosConsulta->error)) { $resultadoHigienizacao['error'][] = $dadosConsulta->error; } else { $resultadoHigienizacao['success'][] = $cliente['cpf']; } } Yuppie_Log::write("Higienização {$metodo} finalizada => " . print_r($resultadoHigienizacao, true), $this); return $resultadoHigienizacao; } protected function _higienizarCpf($cliente, $metodo) { $result = new stdClass(); try { $result = (new \Core_Banco_Service_Autocontratacao_Fgts()) ->consultar($cliente['cpf'], $cliente['id'], $metodo); } catch (Exception $e) { Yuppie_Log::write("Erro na higienização automática {$cliente['cpf']} => " . print_r($e->getMessage(), true), $this); $result->error = $cliente['cpf'] . " - " . $e->getMessage(); } return $result; } public function getCampanhaExportar($campanhaId) { if ($campanhaId > 0) { $dbtable = new Model_DbTable_CallcenterCampanha(); $campanha = $dbtable->getCampanhaExportar($campanhaId); } if (!empty($campanha)) { return $campanha; } return null; } public function exportarCampanha($campanha) { $dadosCsv = []; $dadosCsv[] = implode(";", [ //TABELA CAMPANHA 'Campanha', //TABELA BASE 'Cliente', 'RG', 'CPF', 'Data de Nascimento', 'Sexo', 'Nome Responsavel', 'CPF Responsavel', 'CEP', 'Endereco', 'Numero', 'Bairro', 'Cidade', 'Estado', 'Complemento', 'Obs. Endereco', 'E-mail', 'Mae', 'Pai', 'Valor Saque', //TABELA BENEFICIOS 'Beneficio', 'Margem Livre', 'Margem Cartao', 'Margem Cartao RCC', 'Renda', 'Situacao', 'Banco', 'Agencia', 'Conta', 'Orgao', 'Tipo', 'Especie', 'Data Inclusao', //TABELA EMPRESTIMOS 'Banco do Emprestimo', 'N Contrato', 'Taxa', 'Valor Emprestimo', 'Valor Parcela', 'Total Parcelas', 'Parcelas Pagas', 'Parcelas em Aberto', 'Valor de Quitacao', 'Inicio Contrato', 'Termino Contrato', //TABELA TELEFONES 'Telefones', 'Origem', 'Whatsapp', 'Nao Perturbe' ]); foreach ($campanha as $cliente) { foreach ($cliente as $key => $campo) { $cliente[$key] = String_Refatorar::removerAcentuacao($campo); } $dadosCsv[] = implode(";", [ $cliente['campanha_nome'], $cliente['cliente'], $cliente['rg'], $cliente['cpf'], $cliente['data_nascimento'], $cliente['sexo'], $cliente['responsavel'], $cliente['cpf_responsavel'], $cliente['cep'], $cliente['endereco'], $cliente['numero'], $cliente['bairro'], $cliente['cidade'], $cliente['estado'], $cliente['complemento'], $cliente['obs_endereco'], $cliente['email'], $cliente['mae'], $cliente['pai'], number_format($cliente['saldo'], 2, ',', '.'), $cliente['beneficio'], number_format($cliente['margem_livre'], 2, ',', '.'), number_format($cliente['margem_cartao'], 2, ',', '.'), number_format($cliente['margem_rcc'], 2, ',', '.'), number_format($cliente['renda'], 2, ',', '.'), $cliente['situacao'], $cliente['banco'], $cliente['agencia'], $cliente['conta'], $cliente['orgao'], $cliente['tipo'], $cliente['especie'], $cliente['data_inclusao'], $cliente['banco_emprestimo'], $cliente['contrato'], number_format($cliente['taxa'], 2, ',', '.'), number_format($cliente['valor_emprestimo'], 2, ',', '.'), number_format($cliente['valor_parcela'], 2, ',', '.'), $cliente['parcelas'], $cliente['pagas'], $cliente['abertas'], number_format($cliente['quitacao'], 2, ',', '.'), $cliente['inicio_contrato'], $cliente['termino_contrato'], $cliente['telefones'], $cliente['origem'], $cliente['whatsapp'], $cliente['nao_perturbe'] ]); } $nomeCampanha = strtoupper(current($campanha)['campanha_nome']); $exportCsv = mb_convert_encoding(implode("\n", $dadosCsv), 'ISO-8859-1', 'UTF-8'); $name = "CAMPANHA_{$nomeCampanha}_" . time() . ".csv"; $fileName = getcwd() . "/downloads/" . $name; $fp = fopen($fileName, "w"); fwrite($fp, $exportCsv); fclose($fp); return $name; } }
💾 保存文件
← 返回文件管理器