✏️ 正在编辑: Contrato.php
路径:
/srv/systems_dir/yuppiecred-lidernegocios/application/models/DbTable/Contrato.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Model_DbTable_Contrato extends Zend_Db_Table_Abstract { /** @var Service_AuthService */ private $authService; protected $_primary = 'id'; protected $_name = 'tb_contratos'; protected static $_viewName = 'vw_contratos'; protected $_referenceMap = array( 'Empresa' => array( 'columns' => array( 'empresa_id' ), 'refTableClass' => 'Model_DbTable_Empresa', 'refColumns' => array( 'id' ) ), 'Cliente' => array( 'columns' => array( 'cliente_id' ), 'refTableClass' => 'Model_DbTable_Cliente', 'refColumns' => array( 'id' ) ), 'Corretor' => array( 'columns' => array( 'corretor_id' ), 'refTableClass' => 'Model_DbTable_Corretor', 'refColumns' => array( 'id' ) ), 'Banco' => array( 'columns' => array( 'banco_id' ), 'refTableClass' => 'Model_DbTable_Banco', 'refColumns' => array( 'id' ) ), 'Tabela' => array( 'columns' => array( 'tabela_id' ), 'refTableClass' => 'Model_DbTable_Tabela', 'refColumns' => array( 'id' ) ), 'Orgao' => array( 'columns' => array( 'convenio_id' ), 'refTableClass' => 'Model_DbTable_Convenio', 'refColumns' => array( 'id' ) ), 'StatusProposta' => array( 'columns' => array( 'status_proposta' ), 'refTableClass' => 'Model_DbTable_Tipos', 'refColumns' => array( 'id' ) ), 'ProtocoloPagamento' => array( 'columns' => array( 'protocolo_pagamento_id' ), 'refTableClass' => 'Model_DbTable_ProtocoloPagamento', 'refColumns' => array( 'id' ) ), 'UsuarioFormalizacao' => array( 'columns' => array( 'usuario_formalizacao' ), 'refTableClass' => 'Model_DbTable_Usuario', 'refColumns' => array( 'id' ) ), 'UsuarioRecebimentoFisico' => array( 'columns' => array( 'usuario_recebimento' ), 'refTableClass' => 'Model_DbTable_Usuario', 'refColumns' => array( 'id' ) ), 'UsuarioEnvioFisico' => array( 'columns' => array( 'usuario_formalizacao' ), 'refTableClass' => 'Model_DbTable_Usuario', 'refColumns' => array( 'id' ) ), ); public function init() { $this->authService = service('auth_service'); parent::init(); } public static function getViewName() { return self::$_viewName; } public function fetchAll($where = null, $order = null, $count = null, $offset = null) { if( ($where instanceof Zend_Db_Table_Select ) ){ $strWhere = "tipo_registro = 1 AND excluido<>1"; foreach ( $where->getPart(Zend_Db_Table_Select::WHERE) as $w ) { $strWhere .= " AND " . $w; } $where->where($strWhere); } if( is_array($where) ){ $where[] = "tipo_registro = 1"; $where[] = "excluido<>1"; } elseif( $where != null ){ $where = $where . " AND tipo_registro = 1 AND excluido<>1"; } else { $where = "tipo_registro = 1 AND excluido<>1"; } return parent::fetchAll($where, $order, $count, $offset); } public function fetchRow($where = null, $order = null, $offset = null) { if( ($where instanceof Zend_Db_Table_Select ) ){ $strWhere = 'tipo_registro = 1 AND excluido <> 1'; foreach ( $where->getPart(Zend_Db_Table_Select::WHERE) as $w ) { $strWhere .= ' AND ' . $w; } $where->where($strWhere); } elseif( is_array($where) ){ $where[] = "tipo_registro = 1"; $where[] = "excluido<>1"; }else{ if( $where != null ){ $where = $where . ' AND tipo_registro = 1 AND excluido <> 1'; } else { $where = 'tipo_registro = 1 AND excluido <> 1'; } } return parent::fetchRow($where, $order, $offset); } public function fetchComissaoReceber($fields = null, $order = null, $count = null, $offset = null) { $params = array( 'contratos.excluido<>1 AND contratos.tipo_registro = 1' ); $select = $this->getAdapter()->select()->from(array( 'contratos' => 'tb_contratos' ), array( 'contratos.*' )) ->joinInner(array( 'clientes' => 'tb_clientes' ), 'contratos.cliente_id = clientes.id', array( 'cliente' => 'nome', 'cpf', 'fone', 'celular' )) ->joinLeft(array( 'corretores' => 'tb_corretores' ), 'contratos.corretor_id = corretores.id', array( 'corretor' => 'nome', 'prazo_fisico' => 'IF(corretores_prazos.id IS NOT NULL, corretores_prazos.prazo, corretores.prazo_fisico)')) ->joinLeft(array( 'corretores_prazos' => 'tb_corretores_prazos' ), "contratos.corretor_id = corretores_prazos.corretor_id AND contratos.banco_id = corretores_prazos.banco_id AND corretores_prazos.excluido<>1", array()) ->joinLeft(array( 'empresas' => 'tb_empresas' ), 'contratos.empresa_id = empresas.id', array( 'empresa' => 'nome' )); //tratando os filtros de comissao Receber if( isset($fields['empresa_id']) && !empty($fields['empresa_id']) ){ $params[] = 'contratos.empresa_id = ' . $fields['empresa_id']; } if( isset($fields['data_emissao_de']) && !empty($fields['data_emissao_de']) && isset($fields['data_emissao_a']) && !empty($fields['data_emissao_a']) ){ $params[] = "(data_emissao >= STR_TO_DATE('" . $fields['data_emissao_de'] . "', '%d/%m/%Y')" . " AND data_emissao <= STR_TO_DATE('" . $fields['data_emissao_a'] . "', '%d/%m/%Y'))"; } if( isset($fields['data_liberacao_de']) && !empty($fields['data_liberacao_de']) && isset($fields['data_liberacao_a']) && !empty($fields['data_liberacao_a']) ){ $params[] = "(data_liberacao >= STR_TO_DATE('" . $fields['data_liberacao_de'] . "', '%d/%m/%Y')" . " AND data_liberacao <= STR_TO_DATE('" . $fields['data_liberacao_a'] . "', '%d/%m/%Y'))"; } if( isset($fields['status_proposta']) && !empty($fields['status_proposta']) ){ if( is_array($fields['status_proposta']) ){ $fields['status_proposta'] = array_filter($fields['status_proposta']); $params[] = "contratos.status_proposta IN ('" . implode("','", $fields['status_proposta']) . "')"; } else { $params[] = 'contratos.status_proposta = ' . $fields['status_proposta']; } } $where = null; if( count($params) > 0 ) $where = implode(' AND ', $params); if( $where != null ) $select->where($where); if( $order != null ){ $select->order($order); } $select->group(array( 'contratos.id' )); $select->limit($count, $offset); return $this->getAdapter()->fetchAll($select); } public function fetchAllDependents($fields = null, $order = null, $count = null, $offset = null) { $params = array( 'contratos.excluido<>1 AND contratos.tipo_registro = 1' ); //verifica as permissoes $ns = new Zend_Session_Namespace(); if( !$ns->acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'visualizar-contratos-filiais') ){ $params[] = 'contratos.empresa_id = ' . Yuppie_Auth::getIdentity()->empresa_id; } if( Yuppie_Auth::getIdentity()->grupo == 'Supervisor' ){ $params[] = 'rotas.gerente_id = ' . Yuppie_Auth::getIdentity()->id; } elseif( Yuppie_Auth::getIdentity()->grupo == 'Gerente Regional' ){ $params[] = 'gerentes.id = ' . Yuppie_Auth::getIdentity()->id; } elseif( Yuppie_Auth::getIdentity()->grupo == 'Corretor' ){ $params[] = 'corretores.id = ' . Yuppie_Auth::getIdentity()->id; } elseif( Yuppie_Auth::getIdentity()->corretor_id > 0 && !$ns->acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'contrato', 'contratos-verificar') ){ $params[] = 'corretores.id = ' . Yuppie_Auth::getIdentity()->corretor_id; } $selectProtocoloPagamento = $this->getAdapter()->select()->from('tb_protocolo_pagamento', array( 'data_pagamento', 'id' )) ->joinInner(array( 'tb_protocolo_contrato' ), 'tb_protocolo_pagamento.id = tb_protocolo_contrato.protocolo_id', array( 'contrato_id' )) ->where('tb_protocolo_pagamento.excluido<>1 AND tb_protocolo_contrato.excluido<>1'); $modelPercentualSupervisor = new Model_PercentualSupervisor(); $comissaoSupervisor = array( 'valor_comissao_supervisor' => $modelPercentualSupervisor->getColunaValorComissaoSupervisor()); $tetoComissao = $modelPercentualSupervisor->getBaseCalculoComissao(); $select = $this->getAdapter()->select()->from(array( 'contratos' => 'tb_contratos' ), array( 'contratos.*' )) ->joinInner(array( 'clientes' => 'tb_clientes' ), 'contratos.cliente_id = clientes.id', array( 'cliente' => 'nome', 'cpf', 'fone', 'celular' )) ->joinLeft(array( 'corretores' => 'tb_corretores' ), 'contratos.corretor_id = corretores.id', array( 'corretor' => 'nome', 'prazo_fisico' => 'IF(corretores_prazos.id IS NOT NULL, corretores_prazos.prazo, corretores.prazo_fisico)')) ->joinLeft(array( 'corretores_prazos' => 'tb_corretores_prazos' ), "contratos.corretor_id = corretores_prazos.corretor_id AND contratos.banco_id = corretores_prazos.banco_id", array()) ->joinLeft(array( 'rotas' => 'tb_rotas' ), 'corretores.rota_id = rotas.id', array( 'rota' => 'nome' )) ->joinLeft(array( 'bancos' => 'tb_bancos' ), 'contratos.banco_id = bancos.id', array( 'banco' => 'nome', 'margem' )) ->joinLeft(array( 'gerentes_rotas' => 'tb_gerente_rota' ), 'rotas.gerente_id = gerentes_rotas.id', $comissaoSupervisor) ->joinLeft(array( 'faixas_valor' => 'tb_faixa_valores' ), "$tetoComissao >= percentual_de AND $tetoComissao <= percentual_a AND faixas_valor.excluido <> 1", array( 'comissao_supervisor_faixa' => 'comissao' )) ->joinLeft(array( 'gerentes' => 'tb_gerentes' ), 'gerentes_rotas.gerente_id = gerentes.id', array( 'valor_comissao_gerente' => 'valor_comissao' )) ->joinLeft(array( 'empresas' => 'tb_empresas' ), 'contratos.empresa_id = empresas.id', array( 'empresa' => 'nome' )) ->joinLeft(array( 'convenios' => 'tb_convenios' ), 'contratos.convenio_id = convenios.id', array( 'convenio' => 'nome' )) ->joinLeft(array( 'tabelas' => 'tb_tabelas' ), 'contratos.tabela_id = tabelas.id', array( 'tabela' => 'nome' )) ->joinLeft(array( 'portabilidade' => 'tb_contratos_portabilidade' ), 'contratos.id = portabilidade.contrato_id AND portabilidade.excluido <> 1', array( 'contrato_portabilidade_id' => 'portabilidade.id', 'portabilidade.comentario_corretor', 'portabilidade.resposta_corretor', 'portabilidade_obs' => 'portabilidade.obs', 'portabilidade.data_hora_envio', 'portabilidade_prazo' => 'portabilidade.prazo', 'portabilidade_saldo_banco' => 'portabilidade.saldo_banco', 'portabilidade_valor_liberado' => 'portabilidade.valor_liberado', 'portabilidade_valor_parcela' => 'portabilidade.valor_parcela', )) ->joinLeft(array( 'portabilidades_tabelas' => 'tb_tabelas' ), 'portabilidade.tabela_id = portabilidades_tabelas.id', array( 'portabilidade_tabela' => 'nome' )) ->joinLeft(array( 'status_propostas' => 'tb_tipos' ), 'contratos.status_proposta = status_propostas.id', array( 'status_proposta_nome' => 'descricao' )) ->joinLeft(array( 'protocolos_pagamentos_corretor_itens' => 'tb_protocolo_contrato' ), 'contratos.id = protocolos_pagamentos_corretor_itens.contrato_id', array()) ->joinLeft(array( 'protocolos_pagamentos_corretor' => 'tb_protocolo_pagamento' ), 'protocolos_pagamentos_corretor.id = protocolos_pagamentos_corretor_itens.protocolo_id', array( 'data_pagamento_corretor' => 'data_pagamento' )) ->joinLeft(array( 'protocolos_pagamentos_supervisor_itens' => 'tb_protocolo_pagamento_supervisor_itens' ), 'contratos.id = protocolos_pagamentos_supervisor_itens.contrato_id', array()) ->joinLeft(array( 'protocolos_pagamentos_supervisor' => 'tb_protocolo_pagamento_supervisor' ), 'protocolos_pagamentos_supervisor.id = protocolos_pagamentos_supervisor_itens.protocolo_id', array( 'data_pagamento_supervisor' => 'data_pagamento' )) ->joinLeft(array( 'protocolos_pagamentos_gerente_itens' => 'tb_protocolo_pagamento_gerente_itens' ), 'contratos.id = protocolos_pagamentos_gerente_itens.contrato_id', array()) ->joinLeft(array( 'protocolos_pagamentos_gerente' => 'tb_protocolo_pagamento_gerente' ), 'protocolos_pagamentos_gerente.id = protocolos_pagamentos_gerente_itens.protocolo_id', array( 'data_pagamento_gerente' => 'data_pagamento' )) ->joinLeft(array( 'usuarios' => "tb_usuarios" ), "usuarios.id = contratos.usuario_formalizacao", array( 'formalizacao' => 'nome' )) ->joinLeft(array( 'usuarios2' => "tb_usuarios" ), "usuarios2.id = contratos.usuario_recebimento", array( 'usuario_recebimento' => 'nome' )) ->joinLeft(array( 'produtos' => 'tb_produtos' ), 'produtos.codigo = contratos.produto', array( 'tipo' )) ->joinLeft(array( 'protocolos_pagamentos' => $selectProtocoloPagamento ), "protocolos_pagamentos.contrato_id = contratos.id", array( 'protocolo_pagamento_gerado' => 'MAX(protocolos_pagamentos.id)' )) ->where(implode(" AND ", $params)) ->group(array( 'contratos.id' )) ->limit($count, $offset); if( $order != null ){ $select->order($order); } Core_Filters::_prepareFilterFetchAllDependents($fields, $select); return $this->getAdapter()->fetchAll($select); } public function fetchSincronizacaoYuppies($corretor, $offset, $ultimaSinc) { $columns = [ //dados contrato 'contrato_numero_contrato' => 'contratos.numero_contrato', 'contrato_tipo' => 'contratos.tipo', 'contrato_data_emissao' => 'contratos.data_emissao', 'contrato_prazo' => 'contratos.prazo', 'contrato_forma_liberacao' => 'contratos.forma_liberacao', 'contrato_produto' => 'contratos.produto', 'contrato_status_proposta' => 'contratos.status_proposta', 'contrato_digitador' => 'contratos.digitador', 'contrato_numero_beneficio' => 'contratos.numero_beneficio', 'contrato_data_liberacao' => 'contratos.data_liberacao', 'contrato_data_quitacao' => 'contratos.data_quitacao', // 'contrato_valor_tac' => 'contratos.valor_tac', // 'contrato_valor_liberado' => 'contratos.valor_liberado', // 'contrato_valor_seguro' => 'contratos.valor_seguro', // 'contrato_valor_financiado' => 'contratos.valor_financiado', // 'contrato_valor_iof' => 'contratos.valor_iof', 'contrato_valor_beneficio' => 'contratos.valor_beneficio', 'contrato_valor_prestacao' => 'contratos.valor_prestacao', 'contrato_data_primeiro_vencimento' => 'contratos.data_primeiro_vencimento', 'contrato_valor_liquido' => 'contratos.valor_liquido', 'contrato_valor_bruto' => 'contratos.valor_bruto', 'contrato_bonus_empresa' => 'contratos.bonus_empresa', // 'contrato_adiantamento_comissao_empresa' => 'contratos.adiantamento_comissao_empresa', 'contrato_taxa_portabilidade' => 'contratos.taxa_portabilidade', 'contrato_banco_beneficiado' => 'contratos.banco_beneficiado', 'contrato_agencia_beneficiado' => 'contratos.agencia_beneficiado', 'contrato_conta_beneficiado' => 'contratos.conta_beneficiado', 'contrato_obs' => 'contratos.obs', 'contrato_descricao_pendencia' => 'contratos.descricao_pendencia', 'contrato_matricula' => 'contratos.matricula', 'contrato_tipo_registro' => 'contratos.tipo_registro', // 'contrato_cep' => 'contratos.cep', // 'contrato_endereco' => 'contratos.endereco', // 'contrato_complemento' => 'contratos.complemento', // 'contrato_bairro' => 'contratos.bairro', // 'contrato_cidade' => 'contratos.cidade', // 'contrato_uf' => 'contratos.uf', // 'contrato_usuario_efetivacao' => 'contratos.usuario_efetivacao', // 'contrato_data_efetivacao' => 'contratos.data_efetivacao', 'contrato_operacao_beneficiado' => 'contratos.operacao_beneficiado', 'contrato_cobranca_banco' => 'contratos.cobranca_banco', 'contrato_anterior_numero' => 'contratos.anterior_numero', 'contrato_anterior_prazo' => 'contratos.anterior_prazo', 'contrato_anterior_parcelas_pagas' => 'contratos.anterior_parcelas_pagas', 'contrato_anterior_sequencial_compra' => 'contratos.anterior_sequencial_compra', 'contrato_anterior_tipo_quitacao' => 'contratos.anterior_tipo_quitacao', 'contrato_anterior_banco' => 'contratos.anterior_banco', 'contrato_anterior_parcelas_restantes' => 'contratos.anterior_parcelas_restantes', 'contrato_anterior_saldo_devedor' => 'contratos.anterior_saldo_devedor', 'contrato_anterior_valor_parcela' => 'contratos.anterior_valor_parcela', 'contrato_numero_ade' => 'contratos.numero_ade', 'contrato_codigo_barras_ade' => 'contratos.codigo_barras_ade', 'contrato_seguranca' => 'contratos.seguranca', 'contrato_especie' => 'contratos.especie', 'contrato_estornado' => 'contratos.estornado', 'contrato_data_ted_devolvida' => 'contratos.data_ted_devolvida', 'contrato_data_op_sacada' => 'contratos.data_op_sacada', 'contrato_diferimento_corretor' => 'contratos.diferimento_corretor', 'contrato_cartao' => 'contratos.cartao', 'contrato_token_proposta' => 'contratos.token_proposta', 'contrato_base_comissao_valor' => 'contratos.base_comissao_valor', 'contrato_base_comissao_bonus' => 'contratos.base_comissao_bonus', 'contrato_base_comissao_diferimento' => 'contratos.base_comissao_diferimento', 'contrato_base_comissao_adiantamento' => 'contratos.base_comissao_adiantamento', 'contrato_base_comissao_empresa_valor' => 'contratos.base_comissao_valor', 'contrato_base_comissao_empresa_bonus' => 'contratos.base_comissao_bonus', 'contrato_valor_fixo_empresa' => 'contratos.valor_fixo_corretor', // 'contrato_base_comissao_empresa_adiantamento' => 'contratos.base_comissao_empresa_adiantamento', 'contrato_saldo_banco' => 'contratos.saldo_banco', 'contrato_rco' => 'contratos.rco', 'contrato_taxa_contrato' => 'contratos.taxa_contrato', 'contrato_idade_cliente' => 'contratos.idade_cliente', 'contrato_tipo_formalizacao' => 'contratos.tipo_formalizacao', // dados cliente 'cliente_data_cadastro' => 'clientes.data_cadastro', 'cliente_nome' => 'clientes.nome', 'cliente_numero_dependentes' => 'clientes.numero_dependentes', 'cliente_compoe_renda' => 'clientes.compoe_renda', 'cliente_tipo_moradia' => 'clientes.tipo_moradia', 'cliente_profissao' => 'clientes.profissao', 'cliente_anos_servicos' => 'clientes.anos_servicos', 'cliente_meses_servicos' => 'clientes.meses_servicos', 'cliente_tipo_comprovante' => 'clientes.tipo_comprovante', 'cliente_orgao_pagador' => 'clientes.orgao_pagador', 'cliente_numero_beneficio' => 'clientes.numero_beneficio', 'cliente_empresa_beneficiado' => 'clientes.empresa_beneficiado', 'cliente_cpf' => 'clientes.cpf', 'cliente_rg' => 'clientes.rg', 'cliente_orgao_expedidor' => 'clientes.orgao_expedidor', 'cliente_uf_expedidor' => 'clientes.uf_expedidor', 'cliente_data_expedicao' => 'clientes.data_expedicao', 'cliente_data_nascimento' => 'clientes.data_nascimento', 'cliente_nome_pai' => 'clientes.nome_pai', 'cliente_nome_mae' => 'clientes.nome_mae', 'cliente_estado_civil' => 'clientes.estado_civil', 'cliente_sexo' => 'clientes.sexo', 'cliente_conjuge' => 'clientes.conjuge', 'cliente_endereco' => 'clientes.endereco', 'cliente_complemento' => 'clientes.complemento', 'cliente_bairro' => 'clientes.bairro', 'cliente_cidade' => 'clientes.cidade', 'cliente_uf' => 'clientes.uf', 'cliente_cep' => 'clientes.cep', 'cliente_email' => 'clientes.email', 'cliente_celular' => 'clientes.celular', 'cliente_fax' => 'clientes.fax', 'cliente_fone' => 'clientes.fone', 'cliente_telefone_comercial' => 'clientes.telefone_comercial', 'cliente_obs' => 'clientes.obs', 'cliente_naturalidade' => 'clientes.naturalidade', 'cliente_tipo_registro' => 'clientes.tipo_registro', 'cliente_senha_contracheque' => 'clientes.senha_contracheque', 'cliente_renda' => 'clientes.renda', 'cliente_anexo_cpf' => 'clientes.anexo_cpf', 'cliente_anexo_rg' => 'clientes.anexo_rg', 'cliente_anexo_contra_cheque' => 'clientes.anexo_contra_cheque' ]; $select = $this->getAdapter()->select()->from(array( 'contratos' => 'tb_contratos' ), array()) ->columns($columns) ->joinInner(array( 'clientes' => "tb_clientes" ), "contratos.cliente_id = clientes.id", array()) ->joinLeft(array( 'corretores' => "tb_corretores" ), "contratos.corretor_id = corretores.id", array( 'corretor_cpf' => 'corretores.cpf' )) ->joinLeft(array( 'bancos' => 'tb_bancos' ), "bancos.id = contratos.banco_id", array( 'banco_nome' => 'bancos.nome' )) ->joinLeft(array( 'convenios' => 'tb_convenios' ), "convenios.id = contratos.convenio_id", array( 'convenio_nome' => 'convenios.nome' )) ->joinLeft(array( 'tabelas' => 'tb_tabelas' ), "tabelas.id = contratos.tabela_id", array( 'tabela_nome' => 'tabelas.nome', 'tabela_codigo' => 'tabelas.codigo')) ->joinLeft(array( 'status_propostas' => 'tb_tipos' ), 'contratos.status_proposta = status_propostas.id', array( 'status_proposta_nome' => 'status_propostas.descricao' )) ->joinLeft(array( 'produtos' => 'tb_produtos' ), 'produtos.codigo = contratos.produto AND contratos.tipo = produtos.tipo AND contratos.banco_id = produtos.banco_id', array( 'produto_tipo' => 'produtos.tipo', 'produto_descricao' => 'produtos.descricao' )) ->joinLeft(array( 'rotas' => 'tb_rotas' ), 'corretores.rota_id = rotas.id', array( 'rota_nome' => 'rotas.nome' )) ->where("corretores.id = ?", $corretor) ->where("contratos.excluido<>1") ->where("contratos.tipo_registro = 1") ->where("clientes.excluido<>1") ->group("contratos.id"); if( $ultimaSinc ){ $select->where("( (contratos.data_cadastro >= ?", $ultimaSinc) ->where("contratos.data_atualizacao IS NULL)") ->orwhere("(contratos.data_atualizacao >= ?", $ultimaSinc) ->Where("contratos.data_atualizacao IS NOT NULL) )"); } if( $offset ){ $select->limit(100, $offset); } else { $select->limit(100); } return $this->getAdapter()->fetchAll($select); } public function insert(array $data) { $data['tipo_registro'] = 1; $data = $this->_prepareData($data); if( empty($data['numero_contrato']) || empty($data['banco_id']) ){ return null; } $data['numero_contrato'] = ltrim(trim($data['numero_contrato'])); if( ($dados = $this->existeNumeroContrato($data['banco_id'], $data['numero_contrato'])) != null ){ return $dados->id; } if (empty($data['base_comissao_valor'])) { $data['base_comissao_valor'] = $data['valor_liquido']; } if (empty($data['base_comissao_empresa_valor'])) { $data['base_comissao_empresa_valor'] = $data['valor_liquido']; } $id = parent::insert($data); //grava inserção no log if( $id > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, 'insert', $id); } if ($id) { new Model_FisicosPendentes($this->fetchRow(['id = ?' => $id])); } return $id; } public function existeCodigoDeSeguranca($md5) { return ($this->fetchRow("seguranca = '" . $md5 . "'") != null) ? true : false; } public function updateConvenio($novoConvenioId, $antigoConvenioId) { $data = array('convenio_id' => $novoConvenioId ); $where = 'convenio_id = ' . $antigoConvenioId; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function updateTabela($novaTabelaId, $antigaTabelaId) { $data = array('tabela_id' => $novaTabelaId ); $where = 'tabela_id = ' . $antigaTabelaId; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function updateTipoFormalizacao($tabelaId, $tipoFormalizacao = 0) { $data = array('tipo_formalizacao' => $tipoFormalizacao ); $where = 'tabela_id = ' . $tabelaId; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $contratos = $this->fetchAll($where); if( count($contratos) > 0 ){ foreach( $contratos as $contrato ){ new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contrato->id])); } } $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function updateStatusProposta($novoStatusId, $antigoStatusId) { $data = array('status_proposta' => $novoStatusId ); $where = 'status_proposta = ' . $antigoStatusId; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function updateCorretor($numeroAde, $corretor, $bancoId){ //atualiza o corretor e a empresa do contrato $data = array('corretor_id' => $corretor['id'], 'empresa_id' => $corretor['empresa_id']); $where = array('numero_ade = ' . $numeroAde, 'banco_id = ' . $bancoId); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function limparCobrancaBanco($bancoId) { if( !$bancoId ){ return 0; } $result = parent::update(array( 'cobranca_banco' => 0 ), "banco_id = {$bancoId}"); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, array( 'cobranca_banco' => 0 ), "banco_id = {$bancoId}", $this->_primary[1]); } return $result; } public function updateStatus($data, $where) { $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $dadosContrato = $this->fetchRow($where); if(!empty($dadosContrato)){ new Model_FisicosPendentes($dadosContrato); } $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } protected function _compareData($data, $oldData) { $data = array_filter($data, function ($v) { return $v !== '' && $v !== NULL && $v !== FALSE; }); $oldData = array_filter($oldData, function ($v) { return $v !== '' && $v !== NULL && $v !== FALSE; }); $diff = array_diff_assoc($data, $oldData); return $diff; } public function update(array $data, $where) { $ns = new Zend_Session_Namespace(); $result = null; $oldData = $this->fetchRow($where); $data = $this->_prepareData($data); $oldData = $this->_prepareData($oldData); if(!empty($data) && !empty($oldData)){ $diff = $this->_compareData($data, $oldData->toArray()); } unset($data['protocolo_pagamento_id']); if( isset($data['numero_contrato']) ){ $data['numero_contrato'] = trim($data['numero_contrato']); } if( !empty($data['numero_contrato']) && !empty($data['banco_id']) ){ if( $this->existeNumeroContrato($data['banco_id'], $data['numero_contrato']) ){ $dados = $this->fetchRow($where); if( (isset($data['outras_despesas']) && $data['outras_despesas'] <> $dados->outras_despesas || isset($data['rco']) && $data['rco'] <> $dados->rco) && $this->isPaid($data['id']) ){ return null; } $dadosContrato = $this->fetchRow("banco_id = " . $data['banco_id'] . " AND numero_contrato = '" . $data['numero_contrato'] . "'"); if (!empty($dadosContrato['verificar_contratos'])) { unset($dados['corretor_id']); } if( $dados['id'] != $dadosContrato['id'] ){ return null; } } } $contratoPago = $this->isPaid($data['id']); $this->_trataAlteracaoParcial($data, $contratoPago); //não altera o contrato pago //verifica se tem permissao para alterar contrato pago if( isset($data['id']) && $contratoPago && !$this->authService->isAllowed($ns, 'contrato-bloqueado') ){ $camposAtualizacao = $this->getCamposAtualizarContratoPago($data); if (!empty($data['status_proposta']) && $this->authService->isAllowed($ns, 'alterar-staus')) { //seta os campos de alteracao apenas com o status $camposAtualizacao['status_proposta'] = $data['status_proposta']; } $data = $camposAtualizacao; } if (!empty($oldData)) { $this->checarEstornadoManual($oldData->toArray(), $data); } $acl = (new Zend_Session_Namespace())->acl; if ($acl && !empty($data['data_recebimento_comissao']) && empty($data['comissao_empresa']) && !$acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'comissionamento', 'receber-comissao-zerada')) { unset($data['data_recebimento_comissao']); } if ($data != null) { $result = parent::update($data, $where); $fisicosPendentes = $this->fetchRow($where); if( !empty($fisicosPendentes) ){ new Model_FisicosPendentes($fisicosPendentes); } //grava alteracao no log if ($result > 0) { $log = new Model_DbTable_Log(); $primaryKey = ($data != null && array_key_exists('id', $data)) ? $data[$this->_primary[1]] : null; $log->save($this, $diff, $where, $primaryKey); } } return $result; } private function getCamposAtualizarContratoPago($data) { $camposAtualizacao = [ 'id' => $data['id'], 'numero_beneficio' => null, 'senha_contracheque' => null, 'valor_beneficio' => null, 'banco_beneficiado' => null, 'agencia_beneficiado' => null, 'conta_beneficiado' => null, 'operacao_beneficiado' => null, 'midia_origem_id' => null, 'captador_id' => null, 'comissao_empresa' => null, 'base_comissao_empresa_valor' => null, 'data_recebimento_comissao' => null, 'bonus_empresa' => null, 'base_comissao_empresa_bonus' => null, 'data_recebimento_bonus' => null, 'adiantamento_comissao_empresa' => null, 'base_comissao_empresa_adiantamento' => null, 'valor_fixo_empresa' => null, 'bordero_newspace' => null, 'numero_envelope' => null, 'data_recebimento_previa' => null, 'descricao_pendencia' => null, 'rco' => null, 'taxa_portabilidade' => null, 'saldo_banco' => null, 'anterior_banco' => null, 'anterior_numero' => null, 'anterior_parcelas_restantes' => null, 'anterior_saldo_devedor' => null, 'anterior_prazo' => null, 'anterior_valor_parcela' => null, 'obs' => null ]; $campos = null; array_map( function ($key) use ($data, &$campos) { if (array_key_exists($key, $data)) { $campos[$key] = $data[$key]; } }, array_keys($camposAtualizacao)); return $campos; } protected function _trataAlteracaoParcial(&$data, $contratoPago) { $ns = new Zend_Session_Namespace(); //verifica se a permissão é para alterar apenas alguns campos específicos if ($this->authService->isAllowed($ns, 'altera-contrato-parcial')) { $columns = [ 'id', 'subestabelecido_id', 'numero_beneficio', 'valor_beneficio', 'especie', 'banco_beneficiado', 'agencia_beneficiado', 'conta_beneficiado', 'operacao_beneficiado', 'midia_origem_id', 'obs' ]; if ($this->authService->isAllowed($ns, 'atualizar-comissao-empresa')) { $camposComissao = [ 'comissao_empresa', 'bonus_empresa', 'adiantamento_comissao_empresa', 'base_comissao_empresa_valor', 'base_comissao_empresa_bonus', 'base_comissao_empresa_adiantamento' ]; $columns = array_merge($columns, $camposComissao); } if (stristr(Yuppie_Auth::getIdentity()->grupo, "Formalizacao")) { $camposAdicionais = [ 'corretor_id', 'empresa_id', 'tipo_formalizacao', 'bordero_newspace', 'numero_envelope', 'descricao_pendencia', 'usuario_pendencia' ]; $columns = array_merge($columns, $camposAdicionais); } if( $contratoPago ){ unset($columns['corretor_id']); } $data = array_intersect_key($data, array_flip($columns)); } } /** * Atualiza o número do contrato para o passado por parâmetro * @param array $dataUpdate * @param int $contratoId * @return int|null quantidade de linhas atualizadas */ public function updateNumeroContrato($dataUpdate, $contratoId) { $result = null; $data = isset($dataUpdate['numero_contrato']) ? array( 'numero_contrato' => $dataUpdate['numero_contrato'] ) : null; $dadosContrato = $this->fetchRow("id = {$contratoId}"); if( isset( $dataUpdate['numero_ade']) && $dataUpdate['numero_ade'] && !$dadosContrato['numero_ade'] ){ $data['numero_ade'] = $dataUpdate['numero_ade']; } if( $dadosContrato ){ //verifica se existe algum contrato com o número que será atualizado $numeroExiste = $this->existeNumeroContrato($dadosContrato->banco_id, $data['numero_contrato']); } if( $data != null && $dadosContrato && !$numeroExiste && !$this->isPaid($contratoId)){ $where = "id = {$dadosContrato->id}"; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } } return $result; } public function updateContratosVerificados(array $data, $where) { $result = null; if( $data != null ){ $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $primaryKey = !empty($data['id']) ? $data['id'] : null; $log->save($this, $data, $where, $primaryKey); } } return $result; } /** * Exclui o contrato apenas se o mesmo não estiver pago * @param type $where * @return type * @throws Core_Exception */ public function delete($where) { //localiza o contrato $contrato = $this->fetchRow($where); if( $contrato ){ //verifica se está pago if( $this->isPaid($contrato->id) ){ throw new Core_Exception("O contrato está pago e não pode ser removido."); } $data = array( 'excluido' => 1 ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } else { throw new Core_Exception('Contrato não identificado.'); } } public function receberComissao($data, $numeroContrato) { $where = "numero_contrato = '" . $numeroContrato . "'"; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } /** * * @param int $bancoId * @param string $numero * @return boolean */ public function existeNumeroContrato($bancoId, $numero) { return $this->fetchRow("banco_id = {$bancoId} AND numero_contrato = '{$numero}'"); } /** * * @param int $bancoId * @param string $numero * @return boolean */ public function getNumeroContratoExtrator($bancoId, $numero) { $contrato = $this->fetchRow("banco_id = " . $bancoId . " AND numero_contrato = '" . $numero . "'", 'numero_contrato DESC'); if( $contrato != null ){ $numeroContrato = $contrato->numero_contrato; $digito = strstr($numeroContrato, '-') ? substr($numeroContrato, strpos($numeroContrato, '-') + 1) : '1'; return $numeroContrato . '-' . $digito; } return $numero; } protected function _prepareData($data) { if( isset($data['valor_bruto']) ){ $data['valor_bruto'] = Core_FilterValor::filter($data['valor_bruto']); } if( isset($data['valor_liquido']) ){ $data['valor_liquido'] = Core_FilterValor::filter($data['valor_liquido']); } if( isset($data['comissao_empresa']) ){ $data['comissao_empresa'] = Core_FilterValor::filter($data['comissao_empresa']); } if( isset($data['comissao_corretor']) ){ $data['comissao_corretor'] = Core_FilterValor::filter($data['comissao_corretor']); } if( isset($data['comissao_gerente']) ){ $data['comissao_gerente'] = Core_FilterValor::filter($data['comissao_gerente']); } if( isset($data['valor_tac']) ){ $data['valor_tac'] = Core_FilterValor::filter($data['valor_tac']); } if( isset($data['valor_beneficio']) ){ $data['valor_beneficio'] = Core_FilterValor::filter($data['valor_beneficio']); } if( isset($data['valor_seguro']) ){ $data['valor_seguro'] = Core_FilterValor::filter($data['valor_seguro']); } if( isset($data['valor_financiado']) ){ $data['valor_financiado'] = Core_FilterValor::filter($data['valor_financiado']); } if( isset($data['valor_iof']) ){ $data['valor_iof'] = Core_FilterValor::filter($data['valor_iof']); } if( isset($data['valor_prestacao']) ){ $data['valor_prestacao'] = Core_FilterValor::filter($data['valor_prestacao']); } if( isset($data['bonus_corretor']) ){ $data['bonus_corretor'] = Core_FilterValor::filter($data['bonus_corretor']); } if( isset($data['bonus_empresa']) ){ $data['bonus_empresa'] = Core_FilterValor::filter($data['bonus_empresa']); } if( isset($data['adiantamento_comissao_empresa']) ){ $data['adiantamento_comissao_empresa'] = Core_FilterValor::filter($data['adiantamento_comissao_empresa']); } if( isset($data['taxa_portabilidade']) ){ $data['taxa_portabilidade'] = Core_FilterValor::filter($data['taxa_portabilidade']); } if( isset($data['bonus_recebido']) ){ $data['bonus_recebido'] = Core_FilterValor::filter($data['bonus_recebido']); } if( isset($data['base_comissao_valor']) ){ $data['base_comissao_valor'] = Core_FilterValor::filter($data['base_comissao_valor']); } if( isset($data['base_comissao_bonus']) ){ $data['base_comissao_bonus'] = Core_FilterValor::filter($data['base_comissao_bonus']); } if( isset($data['base_comissao_adiantamento']) ){ $data['base_comissao_adiantamento'] = Core_FilterValor::filter($data['base_comissao_adiantamento']); } if( isset($data['base_comissao_diferimento']) ){ $data['base_comissao_diferimento'] = Core_FilterValor::filter($data['base_comissao_diferimento']); } if( isset($data['base_comissao_empresa_valor']) ){ $data['base_comissao_empresa_valor'] = Core_FilterValor::filter($data['base_comissao_empresa_valor']); } if( isset($data['base_comissao_empresa_bonus']) ){ $data['base_comissao_empresa_bonus'] = Core_FilterValor::filter($data['base_comissao_empresa_bonus']); } if( isset($data['base_comissao_empresa_adiantamento']) ){ $data['base_comissao_empresa_adiantamento'] = Core_FilterValor::filter($data['base_comissao_empresa_adiantamento']); } if( isset($data['saldo_banco']) ){ $data['saldo_banco'] = Core_FilterValor::filter($data['saldo_banco']); } if( isset($data['valor_fixo_empresa']) ){ $data['valor_fixo_empresa'] = Core_FilterValor::filter($data['valor_fixo_empresa']); } if( isset($data['valor_fixo_corretor']) ){ $data['valor_fixo_corretor'] = Core_FilterValor::filter($data['valor_fixo_corretor']); } if( isset($data['rco']) ){ $data['rco'] = Core_FilterValor::filter($data['rco']); } if( isset($data['outras_despesas']) ){ $data['outras_despesas'] = Core_FilterValor::filter($data['outras_despesas']); } if( isset($data['anexo_cpf']) && $data['anexo_cpf'] == '' ){ unset($data['anexo_cpf']); } if( isset($data['anexo_rg']) && $data['anexo_rg'] == '' ){ unset($data['anexo_rg']); } if( isset($data['anexo_contra_cheque']) && $data['anexo_contra_cheque'] == '' ){ unset($data['anexo_contra_cheque']); } if( isset($data['anexo_ficha_cadastral']) && $data['anexo_ficha_cadastral'] == '' ){ unset($data['anexo_ficha_cadastral']); } if( isset($data['anexo_beneficio']) && $data['anexo_beneficio'] == '' ){ unset($data['anexo_beneficio']); } if( isset($data['anexo_comprovante_residencia']) && $data['anexo_comprovante_residencia'] == '' ){ unset($data['anexo_comprovante_residencia']); } if( !isset($data['estornado']) || !is_numeric($data['estornado']) ){ unset($data['estornado']); } if( empty($data['cobranca_banco']) ){ unset($data['cobranca_banco']); } if( empty($data['verificar_contratos']) ){ unset($data['verificar_contratos']); } if( isset($data['anterior_saldo_devedor']) ){ $data['anterior_saldo_devedor'] = Core_FilterValor::filter($data['anterior_saldo_devedor']); } if( isset($data['anterior_valor_parcela']) ){ $data['anterior_valor_parcela'] = Core_FilterValor::filter($data['anterior_valor_parcela']); } if( isset($data['base_comissao_bonus']) ){ $data['base_comissao_bonus'] = Core_FilterValor::filter($data['base_comissao_bonus']); } if( isset($data['base_comissao_diferimento']) ){ $data['base_comissao_diferimento'] = Core_FilterValor::filter($data['base_comissao_diferimento']); } if( isset($data['base_comissao_empresa_bonus']) ){ $data['base_comissao_empresa_bonus'] = Core_FilterValor::filter($data['base_comissao_empresa_bonus']); } if( isset($data['diferimento_corretor']) ){ $data['diferimento_corretor'] = Core_FilterValor::filter($data['diferimento_corretor']); } if( !empty($data['descricao_pendencia']) ){ $data['usuario_pendencia'] = Yuppie_Auth::getIdentity()->id; } if( isset($data['taxa_contrato']) ){ $data['taxa_contrato'] = Core_FilterValor::filter($data['taxa_contrato']); } if( isset($data['valor_reducao']) ){ $data['valor_reducao'] = Core_FilterValor::filter($data['valor_reducao']); } if (isset($data['srcc']) && $data['srcc']) { $data = $this->getComissoesSRCC($data['id'], $data); } return $data; } /** * Verifica se o contrato está pago * @param int $contratoId * @return boolean */ public function isPaid($contratoId) { if( $contratoId > 0 ){ $dbtable = new Model_DbTable_ProtocoloContrato(); if( $dbtable->fetchRow("contrato_id = " . $contratoId) != null ){ return true; } } return false; } protected function _executaBaixaEnvioFisico($where, $dataEnvio, $bordero, $envelope, $protocolo = null, $obs = '', $usuarioFormalizacao = null) { $dadosContrato = $this->fetchRow($where); $usuarioFormalizacao = !$usuarioFormalizacao ? Yuppie_Auth::getIdentity()->id : $usuarioFormalizacao; if ($dadosContrato) { if (is_null($dadosContrato['data_envio_fisico'])) { if (!is_null($dataEnvio) && $bordero != '' && $envelope != '') { $data = [ 'data_envio_fisico' => $dataEnvio, 'bordero_newspace' => $bordero, 'numero_envelope' => $envelope, 'obs_envio_fisico' => $obs, 'usuario_formalizacao' => $usuarioFormalizacao, 'protocolo_envio_fisico' => $protocolo, 'cobranca_banco' => 0 ]; $ns = new Zend_Session_Namespace(); if( !$ns->acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'nao-baixar-contratos-newspace') ){ if( is_null($dadosContrato['protocolo_recebimento_fisico']) ){ $data['usuario_recebimento'] = $usuarioFormalizacao; $data['data_recebimento_fisico'] = $dataEnvio; $data['obs_recebimento_fisico'] = 'BAIXADO NA IMPORTAÇÃO DO ENVIO DE FÍSICO'; $data['protocolo_recebimento_fisico'] = $protocolo; } } $where = "id = {$dadosContrato['id']}"; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ new Model_FisicosPendentes($this->fetchRow(['id = ?' => $dadosContrato['id']])); $log = new Model_DbTable_Log(); $log->save($this, $data, $where); return "Contrato baixado com sucesso."; } } else { return "Data de envio, número do borderô ou número de envelope inválidos."; } } else { return "Contrato já possui envio de físico cadastrado."; } } else { return "Contrato não encontrado."; } } public function baixarEnvioFisico($dataEnvio, $bordero, $envelope = null, $numeroContrato = '', $bancoId = 0, $protocolo = null, $obs = '', $usuarioFormalizacao = null) { if( $numeroContrato != '' && $bancoId > 0 ){ $where = "numero_contrato = '" . trim($numeroContrato) . "' AND banco_id = $bancoId"; return $this->_executaBaixaEnvioFisico($where, $dataEnvio, $bordero, $envelope, $protocolo, $obs, $usuarioFormalizacao); } else { return "Número de contrato ou banco inválido."; } } public function baixarEnvioFisicoPan($dataEnvio, $bordero, $envelope, $numeroContrato, $bancoId, $protocoloRecebimento = null, $obs = '', $usuarioFormalizacao = null) { if( $numeroContrato != '' && $bancoId > 0 ){ $where = "(numero_contrato = '" . $numeroContrato . "' OR numero_contrato LIKE '" . trim($numeroContrato) . "-%')" . " AND banco_id = $bancoId"; return $this->_executaBaixaEnvioFisico($where, $dataEnvio, $bordero, $envelope, $protocoloRecebimento, $obs, $usuarioFormalizacao); } else { return "Número de contrato ou banco inválido."; } } public function analisarPendencia($pendencia, $contratoId, $cobrancaBanco = 0) { $where = "id = " . $contratoId; $data = array( 'descricao_pendencia' => $pendencia, 'cobranca_banco' => $cobrancaBanco ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $dadosContrato = $this->fetchRow($where); if(!empty($dadosContrato)){ new Model_FisicosPendentes($dadosContrato); } $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } public function baixarRecebimentoFisico($contratoId, $dataRecebimento, $obsRecebimento, $protocolo) { $result = null; $usuarioFormalizacao = Yuppie_Auth::getIdentity()->id; if( $contratoId > 0 && $dataRecebimento != null ){ $data = array( 'data_recebimento_fisico' => $dataRecebimento, 'obs_recebimento_fisico' => $obsRecebimento, 'protocolo_recebimento_fisico' => $protocolo, 'usuario_recebimento' => $usuarioFormalizacao, 'cobranca_banco' => 0 ); $dadosContrato = $this->fetchRow("id = " . $contratoId); if( $dadosContrato ){ $banco = $dadosContrato->findParentRow('Model_DbTable_Banco'); if( strpos($dadosContrato->numero_contrato, "-") != false && in_array($banco->nome, array( "BMG", "ITAU", "PAN" )) ){ $numeroContratoSemIndice = substr($dadosContrato->numero_contrato, 0, strpos($dadosContrato->numero_contrato, "-")); if( $numeroContratoSemIndice != "" ){ $where = "banco_id = $dadosContrato->banco_id"; if( $banco->nome == "BMG" ){ $where .= " AND numero_ade = '{$dadosContrato->numero_ade}'"; }else{ $where .= " AND SUBSTRING_INDEX(numero_contrato, '-', 1) LIKE '{$numeroContratoSemIndice}'"; } $contratos = $this->fetchAll($where); if( count($contratos) > 0 ){ foreach ( $contratos as $registros ) { $where = "id = $registros->id AND protocolo_recebimento_fisico IS NULL"; $result = parent::update($data, $where); new Model_FisicosPendentes($this->fetchRow(['id = ?' => $registros->id])); } } } else { $where = "id = " . $dadosContrato->id; $result = parent::update($data, $where); } } else { $where = "id = " . $contratoId; $result = parent::update($data, $where); } //grava alteracao no log if( $result > 0 ){ $primaryKey = $contratoId; $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $primaryKey); } } new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contratoId])); return $result; } return 0; } public function baixarEnvioFisicoManual($dataEnvio, $bordero, $envelope, $contratoId, $protocolo, $protocoloRecebimento = null, $obs = '', $baixarRecebimento = true, $usuarioFormalizacao = null) { $result = null; $usuarioFormalizacao = !$usuarioFormalizacao ? Yuppie_Auth::getIdentity()->id : $usuarioFormalizacao; if( $dataEnvio != null && $contratoId != '' ){ if( ($dadosContrato = $this->fetchRow("id = " . $contratoId)) != null ){ $data = array( 'data_envio_fisico' => $dataEnvio, 'bordero_newspace' => $bordero, 'numero_envelope' => $envelope, 'obs_envio_fisico' => $obs, 'cobranca_banco' => 0, 'protocolo_envio_fisico' => $protocolo, 'usuario_formalizacao' => $usuarioFormalizacao, 'cobranca_banco' => 0, 'usuario_envio_fisico' => Yuppie_Auth::getIdentity()->id //usuado quando o usuario formalizacao vinha do form ); if( $dadosContrato['protocolo_recebimento_fisico'] == null && $baixarRecebimento ){ $data['data_recebimento_fisico'] = $dataEnvio; $data['obs_recebimento_fisico'] = 'BAIXADO AUTOMATICAMENTE PELA BAIXA DE ENVIO DE FÍSICO'; $data['protocolo_recebimento_fisico'] = $protocoloRecebimento; $data['usuario_recebimento'] = $usuarioFormalizacao; } $contratoSemIndice = $this->fetchRow("numero_contrato LIKE '{$dadosContrato->numero_contrato}-" . "%' AND banco_id = " . $dadosContrato->banco_id); if( $contratoSemIndice ){ $numeroContratoSemIndice = substr($contratoSemIndice->numero_contrato, 0, strpos($contratoSemIndice->numero_contrato, "-")); $contratos = $this->fetchAll("numero_contrato LIKE '%{$numeroContratoSemIndice}%' and banco_id = {$contratoSemIndice->banco_id}"); foreach ( $contratos as $registros ) { $where = "id = " . $registros->id; $result = parent::update($data, $where); if( $baixarRecebimento && $result ){ new Model_FisicosPendentes($this->fetchRow(['id = ?' => $registros->id])); } } } else { $where = "id = " . $dadosContrato['id']; $result = parent::update($data, $where); } if ( $baixarRecebimento && $result ) { new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contratoId])); } //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } } } return $result; } public function alterarCobrancaBanco($contratoId, $status) { $where = "id = " . $contratoId; $data = array( 'cobranca_banco' => $status ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contratoId])); return $result; } public function alterarCobrancaPromotora($contratoId, $status) { $where = "id = " . $contratoId; $data = array( 'cobranca_promotora' => $status ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contratoId])); return $result; } public function contratosCorrigir($fields = null, $order = null) { $where = null; $params = array( "contratos.excluido<>1", "contratos.tipo_registro = 1", "(contratos.convenio_id IS NULL OR contratos.tabela_id IS NULL OR contratos.corretor_id IS NULL)" ); //verifica as permissoes $ns = new Zend_Session_Namespace(); if( !$ns->acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'visualizar-contratos-filiais') ){ $params[] = "contratos.empresa_id = " . Yuppie_Auth::getIdentity()->empresa_id; } $select = $this->getAdapter()->select()->from(array( 'contratos' => "tb_contratos" ), array( 'contratos.*' )) ->joinInner(array( 'clientes' => "tb_clientes" ), 'contratos.cliente_id = clientes.id', array( 'cliente' => 'nome', 'cpf' )) ->joinLeft(array( 'corretores' => 'tb_corretores' ), 'contratos.corretor_id = corretores.id', array( 'corretor' => 'nome', 'prazo_fisico' => 'IF(corretores_prazos.id IS NOT NULL, corretores_prazos.prazo, corretores.prazo_fisico)')) ->joinLeft(array( 'corretores_prazos' => 'tb_corretores_prazos' ), "contratos.corretor_id = corretores_prazos.corretor_id AND contratos.banco_id = corretores_prazos.banco_id AND corretores_prazos.excluido <> 1", array()) ->joinLeft(array( 'empresas' => "tb_empresas" ), "contratos.empresa_id = empresas.id", array( 'empresa' => 'nome' )) ->joinLeft(array( 'convenios' => "tb_convenios" ), "contratos.convenio_id = convenios.id", array( 'convenio' => 'nome' )) ->joinLeft(array( 'tabelas' => "tb_tabelas" ), "contratos.tabela_id = tabelas.id", array( 'tabela' => 'nome' )) ->joinLeft(array( 'bancos' => "tb_bancos" ), "contratos.banco_id = bancos.id", array( 'banco' => 'nome' )) ->joinLeft(array( 'status_propostas' => "tb_tipos" ), "contratos.status_proposta = status_propostas.id", array( 'status_proposta_nome' => 'descricao' )); if( isset($fields['numero_contrato']) && !empty($fields['numero_contrato']) ){ $params[] = "contratos.numero_contrato = '" . $fields['numero_contrato'] . "'"; } if( isset($fields['cpf']) && !empty($fields['cpf']) ){ $params[] = "clientes.cpf = '" . String_Refatorar::formatarCpf($fields['cpf']) . "'"; } if( isset($fields['empresa_id']) && !empty($fields['empresa_id']) ){ $params[] = "contratos.empresa_id = " . $fields['empresa_id']; } if( isset($fields['banco_id']) && !empty($fields['banco_id']) ){ $params[] = "banco_id = " . $fields['banco_id']; } if( isset($fields['data_emissao_de']) && !empty($fields['data_emissao_de']) && isset($fields['data_emissao_a']) && !empty($fields['data_emissao_a']) ){ $params[] = "(data_emissao >= STR_TO_DATE('" . $fields['data_emissao_de'] . "', '%d/%m/%Y')" . " AND data_emissao <= STR_TO_DATE('" . $fields['data_emissao_a'] . "', '%d/%m/%Y'))"; } if( isset($fields['data_liberacao_de']) && !empty($fields['data_liberacao_de']) && isset($fields['data_liberacao_a']) && !empty($fields['data_liberacao_a']) ){ $params[] = "(data_liberacao >= STR_TO_DATE('" . $fields['data_liberacao_de'] . "', '%d/%m/%Y')" . " AND data_liberacao <= STR_TO_DATE('" . $fields['data_liberacao_a'] . "', '%d/%m/%Y'))"; } if( isset($fields['status_proposta']) && !empty($fields['status_proposta']) ){ $params[] = "status_proposta = '" . $fields['status_proposta'] . "'"; } if( count($params) > 0 ){ $where = implode(' AND ', $params); } $select->where($where); if( $order != null ){ $select->order($order); } return $this->getAdapter()->fetchAll($select); } public function previaRecebimento($contratoId, $dataPrevia = null) { $result = null; $this->_existePreviaRecebimento($contratoId); $date = new Zend_Date(); if( $dataPrevia != null ){ $date = new Zend_Date($dataPrevia); } $dados = $date->get('YYYY-MM-dd'); $usuario = Yuppie_Auth::getIdentity()->id; $grupoUsuario = Yuppie_Auth::getIdentity()->grupo_id; $data = array( 'previa_recebimento' => 1, 'data_recebimento_previa' => $dados, 'usuario_previa' => $usuario, 'usuario_grupo_previa' => $grupoUsuario); $banco = new Model_Banco(); $bancoId = $banco->bancoPorNome('ITAU'); $numero = "numero_contrato LIKE '%" . "-" . "%'"; $verificarContratos = $this->fetchRow("(cartao = 1 OR banco_id = {$bancoId}) AND id = " . $contratoId . " AND " . $numero); if( $verificarContratos ){ $retirarCaracter = explode('-', $verificarContratos['numero_contrato']); $nContrato = "(cartao = 1 OR banco_id = {$bancoId}) AND numero_contrato LIKE '" . $retirarCaracter[0] . "-%'"; $contratos = $this->fetchAll($nContrato); if( $contratos ){ foreach ( $contratos as $registros ) { if( empty($registros['protocolo_recebimento_fisico']) && $verificarContratos['numero_ade'] == $registros['numero_ade'] ){ $where = "id = " . $registros->id; $result = parent::update($data, $where); } } } } else { $where = "id = " . $contratoId; $result = parent::update($data, $where); } //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function _existePreviaRecebimento($contratoId) { $model = new Model_Contrato(); $dados = $model->exibir($contratoId); if( $dados ){ if( $dados->previa_recebimento > 0 && ($dados->data_recebimento_previa || $dados->data_recebimento_previa <> '0000-00-00') ){ throw new Exception("Atenção! Este contrato ($dados->numero_contrato) já possui uma prévia em seu respectivo cadastro."); } } return false; } public function alterarEstornado($contratoId) { $anterior = parent::fetchRow("id = " . $contratoId); if ($anterior['estornado'] == 0) { $data = [ 'estornado' => 1, 'data_estornado_manual' => Zend_Date::now()->get('yyyy-MM-dd HH:mm') ]; } else { $data = [ 'estornado' => 0, 'data_estornado_manual' => null ]; } $result = null; $where = "id = " . $contratoId; if( $contratoId > 0 ){ $result = parent::update($data, $where); } //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function alterarPreviaRecebimento($contratoId) { $atual = parent::fetchRow("id = " . $contratoId); if( $atual['previa_recebimento'] == 1 ){ $data = array( 'previa_recebimento' => 0, 'data_recebimento_previa' => NULL ); } else { $data = array( 'previa_recebimento' => 0 ); } $result = null; $where = "id = " . $contratoId; if( $contratoId > 0 ){ $result = parent::update($data, $where); } //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function excluirRecebimentoFisico($protocolo) { if ($protocolo != null) { $data = array( 'data_recebimento_fisico' => null, 'obs_recebimento_fisico' => null, 'protocolo_recebimento_fisico' => null ); $contratos = $this->fetchAll(['protocolo_recebimento_fisico = ?' => $protocolo]); $where = "protocolo_recebimento_fisico = " . $protocolo; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 && !empty($contratos) ){ foreach( $contratos as $contrato ){ new Model_FisicosPendentes($this->fetchRow("id = " . $contrato['id'])); } $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } return 0; } public function excluirEnvioFisico($protocolo) { if( $protocolo != null ){ $data = array( 'data_envio_fisico' => null, 'obs_envio_fisico' => null, 'protocolo_envio_fisico' => null ); $where = "protocolo_envio_fisico = " . $protocolo; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } return 0; } public function limparOpSacada($bancoId) { $where = "banco_id = " . $bancoId; $data = array( 'data_op_sacada' => NULL ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function setarOpSacada($contratoId, $dataOpSacada) { $where = "id = $contratoId"; $data = array( 'data_op_sacada' => $dataOpSacada ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function atualizarOpSacada(array $contratos, $dataOpSacada, $bancoId) { $where = "numero_contrato NOT IN ('" . implode("','", $contratos) . "')"; $where .= " AND excluido <> 1 AND banco_id = {$bancoId}"; $data = array( 'data_op_sacada' => $dataOpSacada ); $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function updateDataRecebimento($dataRecebimento, $idContrato, $statusProposta = null) { return parent::update([ 'data_recebimento_comissao' => $dataRecebimento ], "id = '{$idContrato}'" ); } /** * OBS: Utilizar esse método apenas na tela de pagamento de contrato, * por causa de verificação de contato pago * @param array $data * @param string|array $where */ public function updateComissao($data, $where) { $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } /** * Atualiza a data de notificação de análise no contrato * @param type $data * @param type $where * @return type */ public function updateDataNotificacao($data, $where) { $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where, $this->_primary[1]); } return $result; } public function baixarEnvioFisicoItau($contratoId, $protocoloRecebimentoFisico, $dataEnvio, $bordero, $protocolo = null, $obs = '', $usuarioFormalizacao = null) { $usuarioFormalizacao = !$usuarioFormalizacao ? Yuppie_Auth::getIdentity()->id : $usuarioFormalizacao; $ns = new Zend_Session_Namespace(); $where = "id = " . $contratoId; $data = array( 'data_envio_fisico' => $dataEnvio, 'bordero_newspace' => $bordero, 'obs_envio_fisico' => $obs, 'usuario_formalizacao' => $usuarioFormalizacao, 'protocolo_envio_fisico' => $protocolo, 'cobranca_banco' => 0 ); if( !$ns->acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'nao-baixar-contratos-newspace') ){ if( $protocoloRecebimentoFisico == null ){ $data['data_recebimento_fisico'] = $dataEnvio; $data['obs_recebimento_fisico'] = 'BAIXADO NA IMPORTAÇÃO DO ENVIO DE FÍSICO'; $data['protocolo_recebimento_fisico'] = $protocolo; $data['usuario_recebimento'] = $usuarioFormalizacao; } } $result = parent::update($data, $where); new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contratoId])); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } public function excluirContratoProtocoloEnvio($contratos, $protocoloId) { $contratosSalvos = $this->fetchAll("protocolo_envio_fisico = '$protocoloId'")->toArray(); if(count($contratosSalvos) < 2 || count($contratos) == count($contratosSalvos)){ throw new Core_Exception("O protocolo deve possuir ao menos um contrato."); } if( count($contratos) ){ $data = array( 'data_envio_fisico' => null, 'obs_envio_fisico' => null, 'protocolo_envio_fisico' => null ); $where = "id IN (" . implode(",", $contratos) . ")"; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } return 0; } public function excluirContratoProtocoloRecebimento($contratos, $protocoloId) { $contratosSalvos = $this->fetchAll("protocolo_recebimento_fisico = '$protocoloId'")->toArray(); if(count($contratosSalvos) < 2 || count($contratos) == count($contratosSalvos)){ throw new Core_Exception("O protocolo deve possuir ao menos um contrato."); } if( count($contratos) ){ $data = array( 'data_recebimento_fisico' => null, 'obs_recebimento_fisico' => null, 'protocolo_recebimento_fisico' => null ); $where = "id IN (" . implode(",", $contratos) . ")"; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ foreach ($contratos as $contrato) { new Model_FisicosPendentes($this->fetchRow(['id = ?' => $contrato])); } $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } return 0; } public function getPrimeiroContratoCorretor(array $dados) { $fisicoRecebido = $dados['protocolo_fisico'] ? 'IS NOT NULL' : 'IS NULL'; $sql = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.protocolo_recebimento_fisico " . $fisicoRecebido) ->where("contratos.excluido <> 1") ->order("contratos.data_emissao ASC"); if( $dados['ids_convenios'] ){ $sql->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ){ $sql->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $sql->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } return $this->getAdapter()->fetchRow($sql); } public function temProtNaoRecebido(array $dados) { $sql = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' ), array( 'total' => 'count(*)' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.protocolo_recebimento_fisico IS NULL") ->where("contratos.excluido <> 1"); if( $dados['ids_convenios'] ){ $sql->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ){ $sql->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $sql->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } return $this->getAdapter()->fetchRow($sql); } public function temPeriodoSemProducao(array $dados, $periodo = 0, $ultimaData = null) { $fisicoRecebido = $dados['protocolo_fisico'] ? 'IS NOT NULL' : 'IS NULL'; $sqlSemProducao = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' ), array( 'data_emissao' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.protocolo_recebimento_fisico " . $fisicoRecebido) ->where("contratos.excluido <> 1") ->group('contratos.data_emissao') ->order("contratos.data_emissao ASC"); if( $dados['ids_convenios'] ){ $sqlSemProducao->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ){ $sqlSemProducao->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $sqlSemProducao->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } $contratosLiberados = $this->getAdapter()->fetchAll($sqlSemProducao); //inicializa, porque se não tiver contratos cadastrados, então não tem produção $result = array( 'status' => true, 'data' => null, 'periodo' => '', 'msg' => "Não produziu no período de mais de {$dados['p_sem_producao']} dias" ); foreach ( $contratosLiberados as $key => $liberado ) { if( $ultimaData != null && $key == 0 ){ $dt1 = new Zend_Date($ultimaData); } else { $dt1 = new Zend_Date($liberado['data_emissao']); } if( isset($contratosLiberados[$key + 1]) ){ //adiciona a quantidade de dias sem producao à data atual $dt1->addDay($dados['p_sem_producao']); //compara se a data do próximo contrato é superior à data do contrato atual $dt2 = new Zend_Date($contratosLiberados[$key + 1]['data_emissao']); if( $dt2->getTimestamp() > $dt1->getTimestamp() ){ $result = array( 'status' => true, 'data' => $liberado['data_emissao'], 'periodo' => $dt1->get('dd/MM/yyyy') . ' a ' . $dt2->get('dd/MM/yyyy'), 'msg' => "Não produziu no período de mais de {$dados['p_sem_producao']} dias" ); break; } } else { $result = array( 'status' => false, 'data' => $liberado['data_emissao'], 'periodo' => '', 'msg' => NULL ); break; } } return $result; } public function temMediaMensal(array $dados) { $sqlMediaMensal = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' ), array( 'mes' => "DATE_FORMAT(contratos.data_emissao, '%Y-%m')", 'valor_total' => 'SUM(contratos.valor_liquido)' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.excluido <> 1") ->group(array( 'mes' )); if( $dados['protocolo_fisico'] ){ $sqlMediaMensal->where("contratos.protocolo_recebimento_fisico IS NOT NULL"); } if( $dados['ids_convenios'] ){ $sqlMediaMensal->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ){ $sqlMediaMensal->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $sqlMediaMensal->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } $contratosPorProducao = $this->getAdapter()->fetchAll($sqlMediaMensal); $producaoTotal = 0; $qtdMeses = 0; foreach ( $contratosPorProducao as $producao ) { $producaoTotal += $producao['valor_total']; $qtdMeses++; } $dataInicio = new Zend_date($dados['data_emissao_de']); $dataFim = new Zend_date($dados['data_emissao_a']); $diferenca = floor(($dataFim->getTimestamp() - $dataInicio->getTimestamp()) / (3600 * 24)); $media = ($producaoTotal / $diferenca); if( $media <= 0 || $media < $dados['producao_media'] ){ return "Não possui produção média"; } return null; } public function getPontuacao(array $dados) { $sqlSemProducao = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' ), array( 'total' => 'SUM(contratos.valor_liquido)' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.excluido <> 1"); if( $dados['protocolo_fisico'] ){ $sqlSemProducao->where("contratos.protocolo_recebimento_fisico IS NOT NULL"); } if( $dados['ids_convenios'] ){ $sqlSemProducao->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ) { $sqlSemProducao->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $sqlSemProducao->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } $contratosLiberados = $this->getAdapter()->fetchRow($sqlSemProducao); if (array_key_exists('total', $contratosLiberados) && $contratosLiberados['total'] > 0 && array_key_exists('valor_ponto', $dados) && $dados['valor_ponto'] > 0) { return $contratosLiberados['total'] / $dados['valor_ponto']; } return 0; } public function getContratos(array $dados) { $select = $this->getAdapter()->select() ->from(array( 'contratos' => 'tb_contratos' ), array( 'numero_contrato', 'data_emissao', 'protocolo_recebimento_fisico', 'valor_liquido', 'prazo' )) ->joinInner(array( 'clientes' => 'tb_clientes' ), 'contratos.cliente_id = clientes.id', array( 'cliente' => 'nome', 'cpf_cliente' => 'cpf' )) ->joinInner(array( 'corretores' => 'tb_corretores' ), 'contratos.corretor_id = corretores.id', array( 'corretor' => 'nome' )) ->joinInner(array( 'convenios' => 'tb_convenios' ), 'contratos.convenio_id = convenios.id', array( 'convenio' => 'nome' )) ->joinInner(array( 'tabelas' => 'tb_tabelas' ), 'contratos.tabela_id = tabelas.id', array( 'tabela' => 'nome' )) ->joinInner(array( 'bancos' => 'tb_bancos' ), 'contratos.banco_id = bancos.id', array( 'banco' => 'nome' )) ->joinInner(array( 'status_proposta' => 'tb_tipos' ), 'contratos.status_proposta = status_proposta.id', array( 'status' => 'descricao' )) ->where("contratos.corretor_id = " . $dados['corretor_id']) ->where("contratos.data_emissao >= STR_TO_DATE('" . $dados['data_emissao_de'] . "','%d/%m/%Y')") ->where("contratos.data_emissao < STR_TO_DATE('" . $dados['data_emissao_a'] . "','%d/%m/%Y')") ->where("contratos.excluido <> 1") ->order(array( 'contratos.data_emissao ASC' )); if( $dados['protocolo_fisico'] ){ $select->where("contratos.protocolo_recebimento_fisico IS NOT NULL"); } if( $dados['ids_convenios'] ){ $select->where("contratos.convenio_id IN (" . implode(", ", $dados['ids_convenios']) . ")"); } if( $dados['ids_tabelas'] ){ $select->where("contratos.tabela_id IN (" . implode(", ", $dados['ids_tabelas']) . ")"); } if( $dados['ids_status'] ){ $select->where("contratos.status_proposta IN (" . implode(", ", $dados['ids_status']) . ")"); } $contratosLiberados = $this->getAdapter()->fetchAll($select); return $contratosLiberados; } /** * retorna a comissão_corretor/comissao_empresa/bônus_corretor/bônus_empresa * diferimento_corretor/valor_fixo/valor_fixo_empresa/ * base_comissao_valor/base_comissao_valor_empresa por referência * @param array $dadosContrato * @param type $tipoComissao * $tipoComissao = 0 (Pega a comissão da empresa e corretor) * $tipoComissao = 1 (Pega a comissão do corretor) * $tipoComissao = 2 (Pega a comissão da empresa) * @return type */ public function getComissaoCorretorAndEmpresa(array &$dadosContrato, $tipoComissao = 0) { if( !empty($dadosContrato['banco_id']) && !empty($dadosContrato['tabela_id']) && !empty($dadosContrato['convenio_id']) && !empty($dadosContrato['data_emissao']) ){ //verifica se a comissão do banco está desativada $modelBanco = new Model_Banco(); $banco = $modelBanco->exibir($dadosContrato['banco_id']); if( !empty($banco->desativar_comissoes) ){ return null; } $urlSistema = Yuppie_Auth::getSiteKey(); $backtrace = debug_backtrace(0); if( isset($backtrace[1]['class']) ){ $urlSistema .= "_" . $backtrace[1]['class']; } $writer = new Zend_Log_Writer_Stream("/var/log/sistemayuppie/zf_log_{$urlSistema}_" . Zend_Date::now()->get("ddMMyyyy") . ".txt"); $log = new Zend_Log($writer); $corretor = $tipoComissao != 2; $empresa = $tipoComissao != 1; if ($empresa) { $this->setComissaoEmpresa($dadosContrato, $banco, $log); } if ($corretor) { $this->setComissaoCorretor($dadosContrato, $banco, $log); } } } public function setComissaoCorretor(array &$dadosContrato, $banco, $log) { $tiposComissaoCorretor = array( "base_comissao_valor", "base_comissao_adiantamento", "base_comissao_diferimento", "base_comissao_bonus" ); $comissaoCorretor = $this->getComissaoCorretor($dadosContrato, $banco, $log); $percentual = $comissaoCorretor['percentual']; $comissao = $comissaoCorretor['comissao']; foreach($tiposComissaoCorretor as $tipoBaseComissao){ $tipo = $percentual && isset($percentual[$tipoBaseComissao])? $percentual[$tipoBaseComissao] : "VALOR LIQUIDO"; $valor = stristr($tipo, "BRUTO") ? $dadosContrato['valor_bruto'] : $dadosContrato['valor_liquido']; $bc = isset($dadosContrato[$tipoBaseComissao]) ? $dadosContrato[$tipoBaseComissao] : null; $forcarBaseComissao = !empty($dadosContrato['forcar_base_comissao']); if( (empty($bc) || $bc == "0,00") || $forcarBaseComissao ){ $dadosContrato[$tipoBaseComissao] = $valor; $this->_calculaValorLiquidoRefinPortabilidade($dadosContrato, $tipo, $tipoBaseComissao); }elseif($bc != "0,00"){ $dadosContrato[$tipoBaseComissao]; }else{ $dadosContrato[$tipoBaseComissao] = $dadosContrato['valor_liquido']; } } if (!empty($percentual)) { $dadosContrato['comissao_corretor'] = $this->checarIncidenciaComissao( $comissao['incidir_sobre'], $percentual['comissao'], String_Refatorar::parseStringToFloat($dadosContrato['comissao_empresa']) ); $dadosContrato['bonus_corretor'] = $this->checarIncidenciaComissao( $comissao['incidir_sobre'], $percentual['bonus'], String_Refatorar::parseStringToFloat($dadosContrato['comissao_empresa']) ); $dadosContrato['diferimento_corretor'] = $this->checarIncidenciaComissao( $comissao['incidir_sobre'], $percentual['diferimento'], String_Refatorar::parseStringToFloat($dadosContrato['comissao_empresa']) ); } if(isset($comissao['valor_fixo']) && $comissao['valor_fixo'] != null){ $dadosContrato['valor_fixo_corretor'] = number_format($comissao['valor_fixo'], 2, ',', '.'); } } public function setComissaoEmpresa(array &$dadosContrato, $banco, $log) { $tiposComissaoEmpresa = array( "base_comissao_empresa_valor" => "base_comissao_valor", "base_comissao_empresa_adiantamento" => "base_comissao_adiantamento", "base_comissao_empresa_bonus" => "base_comissao_bonus" ); $comissaoEmpresa = $this->getComissaoEmpresa($dadosContrato, $banco, $log); $percentual = $comissaoEmpresa['percentual']; $comissao = $comissaoEmpresa['comissao']; foreach($tiposComissaoEmpresa as $tipoComissaoEmpresa => $tipoComissao){ $tipo = $percentual && isset($percentual[$tipoComissao]) ? $percentual[$tipoComissao] : "VALOR LIQUIDO"; $valor = stristr($tipo, "BRUTO") ? $dadosContrato['valor_bruto'] : $dadosContrato['valor_liquido']; //quando tiver a condição de forçar a base de comissão, atualiza a base empresa do contrato $bc = isset($dadosContrato[$tipoComissaoEmpresa]) ? $dadosContrato[$tipoComissaoEmpresa] : null; $forcarBaseComissao = !empty($dadosContrato['forcar_base_comissao']); if( (empty($bc) || $bc == "0,00") || $forcarBaseComissao ){ $dadosContrato[$tipoComissaoEmpresa] = $valor; $this->_calculaValorLiquidoRefinPortabilidade($dadosContrato, $tipo, $tipoComissaoEmpresa); }elseif($bc != "0,00") { $dadosContrato[$tipoComissaoEmpresa]; }else{ $dadosContrato[$tipoComissaoEmpresa] = $dadosContrato['valor_liquido']; } } if(!empty($percentual)){ if( (empty($dadosContrato['comissao_empresa']) || $dadosContrato['comissao_empresa'] == "0,00" || !empty($dadosContrato['forcar_base_comissao']) )){ $dadosContrato['comissao_empresa'] = number_format($percentual['comissao'], 2, ',', '.'); } if( (empty($dadosContrato['bonus_empresa']) || $dadosContrato['bonus_empresa'] == "0,00" || !empty($dadosContrato['forcar_base_comissao']) )){ $dadosContrato['bonus_empresa'] = number_format($percentual['bonus'], 2, ',', '.'); } if( (empty($dadosContrato['adiantamento_comissao_empresa']) || $dadosContrato['adiantamento_comissao_empresa'] == "0,00" || !empty($dadosContrato['forcar_base_comissao']) ) ){ $dadosContrato['adiantamento_comissao_empresa'] = number_format($percentual['adiantamento'], 2, ',', '.'); } } if(isset($comissao['valor_fixo']) && $comissao['valor_fixo'] != null){ $dadosContrato['valor_fixo_empresa'] = number_format($comissao['valor_fixo'], 2, ',', '.'); } } public function getComissaoCorretor(array &$dadosContrato, $banco, $log = null, $isCallcenter = false) { $corretorId = isset($dadosContrato['corretor_id']) ? $dadosContrato['corretor_id'] : null; if( $corretorId > 0 ){ $log->log('#######################', Zend_Log::INFO); $log->log('Comissao Individual', Zend_Log::INFO); $comissao = $this->_selectComissao($dadosContrato, $banco, 'Model_DbTable_ComissionamentoCorretor', $log, array("corretor_id = " . $dadosContrato['corretor_id']), $isCallcenter); if( $comissao ){ $percentual = $this->_selectComissaoPercentual($dadosContrato, $comissao, 'Model_DbTable_ComissionamentoCorretorPercentual', true, false); } //caso não tenha encontrado a comissão individual, pesquisa pelo comissionamento de grupo do corretor if( empty($percentual) ){ if ($dadosContrato['grupo_comissao'] > 0) { $log->log('#######################', Zend_Log::INFO); $log->log('Comissao Grupo Definido no Recalculo de Comissão', Zend_Log::INFO); $modelGrupoComissao = new Model_GrupoComissao(); $comissao = $modelGrupoComissao->exibir($dadosContrato['grupo_comissao']); if ($comissao && $comissao->percentual_comissionamento > 0) { return [ "comissao" => ['incidir_sobre' => $comissao->incidir_sobre], "percentual" => [ 'comissao' => $comissao->percentual_comissionamento, 'bonus' => $comissao->comissionamento_bonus, 'diferimento' => $comissao->comissionamento_diferimento, 'adiantamento' => $comissao->comissionamento_adiantamento, ] ]; } } $modelCorretor = new Model_Corretor(); $corretor = $modelCorretor->exibir($corretorId); if( $corretor && $corretor->grupo_comissao ){ $log->log('#######################', Zend_Log::INFO); $log->log('Comissionamento por Grupo', Zend_Log::INFO); $where = array("grupo_id = $corretor->grupo_comissao"); $comissao = $this->_selectComissao($dadosContrato, $banco, 'Model_DbTable_ComissionamentoGrupo', null, $where, $isCallcenter); if( $comissao ){ $percentual = $this->_selectComissaoPercentual($dadosContrato, $comissao, 'Model_DbTable_ComissionamentoGrupoPercentual', true, false); } } //caso não tenha encontrado a comissão pelo comissionamento de grupo, pesquisa pelo grupo do corretor if (empty($percentual)) { if ($corretor && $corretor->grupo_comissao) { $log->log('#######################', Zend_Log::INFO); $log->log('Comissao Grupo Corretor', Zend_Log::INFO); $modelGrupoComissao = new Model_GrupoComissao(); $comissao = $modelGrupoComissao->exibir($corretor->grupo_comissao); if ($comissao && $comissao->percentual_comissionamento > 0) { return [ "comissao" => ['incidir_sobre' => $comissao->incidir_sobre], "percentual" => [ 'comissao' => $comissao->percentual_comissionamento, 'bonus' => $comissao->comissionamento_bonus, 'diferimento' => $comissao->comissionamento_diferimento, 'adiantamento' => $comissao->comissionamento_adiantamento, ] ]; } } } } if(!empty($comissao) && !empty($percentual)){ if( (empty($dadosContrato['valor_fixo_corretor']) || $dadosContrato['valor_fixo_corretor'] == "0,00" ) ){ $dadosContrato['valor_fixo_corretor'] = number_format($comissao['valor_fixo'], 2, ',', '.'); } return array( "comissao" => $comissao->toArray(), "percentual" => $percentual->toArray() ); } } return null; } public function getComissaoEmpresa(array &$dadosContrato, $banco, $log = null) { $log->log('#######################', Zend_Log::INFO); $log->log('Comissao Empresa', Zend_Log::INFO); $comissao = $this->_selectComissao($dadosContrato, $banco, 'Model_DbTable_Comissionamento', $log); if( $comissao ){ if( (empty($dadosContrato['valor_fixo_empresa']) || $dadosContrato['valor_fixo_empresa'] == "0,00" ) ){ $dadosContrato['valor_fixo_empresa'] = number_format($comissao['valor_fixo'], 2, ',', '.'); } $percentual = $this->_selectComissaoPercentual($dadosContrato, $comissao, 'Model_DbTable_ComissionamentoPercentual', false, true); return array("comissao" => $comissao, "percentual" => $percentual); } return null; } public function _selectComissao(array &$dadosContrato, $banco, $dbtable = null, $log = null, $where = array(), $isCallcenter = false) { $where[] = "banco_id = {$dadosContrato['banco_id']}"; $where[] = "tabela_id = {$dadosContrato['tabela_id']}"; $where[] = "convenio_id = {$dadosContrato['convenio_id']}"; $where[] = "prazo_de <= '{$dadosContrato['prazo']}'"; $where[] = "prazo_a >= '{$dadosContrato['prazo']}'"; $where[] = "tipo_produto = '{$dadosContrato['tipo']}'"; $where[] = "desativado <> 1"; if ($dbtable == 'Model_DbTable_Comissionamento') { $empresaId = " IS NULL OR empresa_id = 0"; if ($banco->comissao_por_sub && $dadosContrato['subestabelecido_id'] > 0) { $empresaId = " = " . $dadosContrato['subestabelecido_id']; } $where[] = "(empresa_id{$empresaId})"; } $comissionamento = new $dbtable; if ($banco->importacao_valor_contrato > 0) { $valorBruto = !empty($dadosContrato['valor_bruto']) ? String_Refatorar::parseStringToFloat($dadosContrato['valor_bruto']) : 0; $valorLiquido = !empty($dadosContrato['valor_liquido']) ? String_Refatorar::parseStringToFloat($dadosContrato['valor_liquido']) : 0; $where[] = "(" . "((valor_de = 0 AND valor_a = 0 OR valor_de IS NULL AND valor_a IS NULL)) " . " OR ( IF (validar_faixa = 2," . " (valor_de <= $valorBruto AND valor_a >= $valorBruto)," . " (valor_de <= $valorLiquido AND valor_a >= $valorLiquido)" . "))" . ")"; } else { $where[] = "((valor_de = 0 OR valor_de IS NULL) AND (valor_a = 0 OR valor_a IS NULL))"; } if ($banco->comissao_por_taxa > 0) { $taxaContrato = !empty($dadosContrato['taxa_contrato']) ? String_Refatorar::parseStringToFloat($dadosContrato['taxa_contrato']) : 0; $where[] = "(" . "(taxa_contrato_de = 0 AND taxa_contrato_a = 0) OR (taxa_contrato_de IS NULL AND taxa_contrato_a IS NULL)" . " OR (taxa_contrato_de <= $taxaContrato AND taxa_contrato_a >= $taxaContrato)" . ")"; } else { $where[] = "((taxa_contrato_de = 0 OR taxa_contrato_de IS NULL) AND (taxa_contrato_a = 0 OR taxa_contrato_a IS NULL))"; } if (!empty($banco->comissao_por_idade)) { $dadosContrato['idade_cliente'] = (int)$dadosContrato['idade_cliente']; $where[] = "(" . "(idade_inicial = 0 AND idade_final = 0) OR (idade_inicial IS NULL AND idade_final IS NULL)" . " OR (idade_inicial <= {$dadosContrato['idade_cliente']} AND idade_final >= {$dadosContrato['idade_cliente']})" . ")"; } else { $where[] = "((idade_inicial = 0 OR idade_inicial IS NULL) AND (idade_final = 0 OR idade_final IS NULL))"; } if (!empty($banco->comissao_por_especie) && !empty($dadosContrato['especie'])) { $where[] = "(especie = '{$dadosContrato['especie']}' OR especie = 0)"; } else { $where[] = "(especie = 0 or especie is null)"; } if (!empty($where)){ $where = implode(' AND ', $where); } if ($log) { $log->log("Where comissao: " . print_r($where, true), Zend_Log::INFO); } return $comissionamento->fetchRow($where, ['especie DESC', 'id DESC']); } public function _selectComissaoPercentual(array &$dadosContrato, $dadosComissao = null, $dbtable = null) { $comissaoPercentual = $dadosComissao->findDependentRowset( $dbtable, null, $dadosComissao->select()->order("data_inicial ASC")); $comissaoValida = null; if( count($comissaoPercentual) > 0 ){ foreach ( $comissaoPercentual as $comissao ) { $dtBase = $dadosContrato['data_emissao']; //se a data base for liberacao, sobrepoe a data base de pesquisa if( $comissao['data_base'] == "L" && !empty($dadosContrato['data_liberacao']) ){ $dtBase = $dadosContrato['data_liberacao']; } $dtFinal = $comissao['data_final']; if( $dtBase >= $comissao['data_inicial'] ){ if( is_null($dtFinal) || (!is_null($dtFinal) && $dtBase <= $dtFinal) ){ $comissaoValida = $comissao; } } } } return $comissaoValida ? $comissaoValida : false; } /** * Calcula o valor do base comissão (empresa e corretor) quando for REFIN * DA PORTABILIDADE, deduzindo o saldo banco, se o valor encontrado * for o valor liquido * @param mixed $dadosContrato * @param string $base * @param string $campo */ protected function _calculaValorLiquidoRefinPortabilidade(&$dadosContrato, $base, $campo) { if(isset($dadosContrato['tipo'])){ if( $base != "VALOR BRUTO" && $dadosContrato['tipo'] == "REFIN DA PORTABILIDADE" && isset($dadosContrato['saldo_banco']) && $dadosContrato['saldo_banco'] > 0 ){ $filter = new Zend_Filter_Digits(); $valorBruto = $filter->filter($dadosContrato['valor_bruto']) / 100; $saldoBanco = $filter->filter($dadosContrato['saldo_banco']) / 100; $dadosContrato[$campo] = number_format(($valorBruto - $saldoBanco), 2, ',', '.'); } } } public function avaliarFraude(array $dados, $ajax) { $cont = 0; if( count($dados) <= 0 ){ throw new Exception("Nenhum item encontrado."); } $params = $dados; if ($ajax) { $dbtableHistorico = new Model_DbTable_EsteiraAntiFraudeHistorico(); $contratoId = $dados['id']; unset($dados['id']); $dadosContrato = parent::fetchRow("excluido <> 1 and id = {$contratoId}"); $propostaModel = new Model_Proposta(); $data = $propostaModel->exibir($contratoId); if (is_null($data)) { $data = (new Model_Contrato())->exibir($contratoId); } $cliente = $data->findParentRow('Model_DbTable_Cliente'); $dados['usuario_fraude'] = Yuppie_Auth::getIdentity()->id; $dados['data_validacao_fraude'] = Zend_Date::now()->get('yyyy-MM-dd HH:mm:ss'); //se o status for aprovado e nao for digitacao rapida, retira o status if( $dados['status'] == 2 && !$dadosContrato->digitacao_rapida ){ $dados['status'] = 2; } try { parent::update($dados, "id = {$contratoId}"); $data = [ 'cpf_cliente' => $cliente->cpf, 'nome_cliente' => $cliente->nome, 'contrato_id' => $contratoId, 'numero_protocolo' => $dadosContrato['numero_contrato'], 'status' => $dados['status'], 'motivo_fraude' => $dados['descricao_pendencia'], 'data_cadastro' => $dados['data_validacao_fraude'], 'usuario_fraude' => Yuppie_Auth::getIdentity()->id ]; $dbtableHistorico->insert($data); $cont++; } catch ( Exception $ex ) { $cont--; } } else { foreach ( $dados as $key => $value ) { if( preg_match("/^status_/", $key) ){ $convertDados = explode("_", $key); $contratoId = $convertDados[1]; if( !$contratoId ){ $cont--; continue; } $motivo = $params['descricao_pendencia_' . $contratoId]; //se o status for aprovado, retira o status if( $value == 2 ){ $value = 0; } $dados = array( 'status' => $value, 'descricao_pendencia' => $motivo ); try { parent::update($dados, "id = {$contratoId}"); $cont++; } catch ( Exception $ex ) { $cont--; continue; } } } } return $cont; } public function closeConnection() { $db = Zend_Db_Table::getDefaultAdapter(); $db->getConnection(); $db->closeConnection(); } public function fetchPairs($field, $where = null, $order = null, $key = null) { if( !$key ){ $key = $this->getPrimaryKey(); if( is_array($key) ){ if( count($key) != 1 ){ throw new Yuppie_Exception( 'can not fetchPairs with array as $_primary'); } $key = current($key); } } $select = $this->select() ->from($this->_name, array( $key, $field )); if( is_array($where) ){ $where[] = "{$this->_name}.excluido <> 1"; foreach ( $where as $cond => $value ) { if( is_numeric($cond) ){ $select->where($value); } else { $select->where($cond, $value); } } }elseif($where != null ){ $select->where($where); } $select->where("{$this->_name}.excluido <> 1"); $select->order($order ? $order : $field); return $this->getAdapter()->fetchPairs($select); } public function getProducaoAnual($fields) { $statusId = Model_Contrato::findByNameStatus("Operação Finalizada"); $select = $this->getAdapter()->select()->from(array("contratos" => "tb_contratos"), [ 'total_bruto' => 'sum(valor_bruto)', 'total_liquido' => 'sum(valor_liquido)', 'total_base_comissao' => 'sum(base_comissao_empresa_valor)', 'periodo_producao' => "DATE_FORMAT(data_liberacao, '%Y-%m')", 'total_comissao' => 'SUM(contratos.valor_fixo_corretor+contratos.base_comissao_valor*contratos.comissao_corretor/100)', 'total_comissao_empresa' => 'SUM(contratos.base_comissao_empresa_valor*contratos.comissao_empresa/100)', ]) ->joinInner(array('clientes' => 'tb_clientes'), "contratos.cliente_id = clientes.id AND clientes.excluido<>1", array()) ->where("contratos.excluido<>1") ->where("contratos.corretor_id IS NOT NULL AND contratos.corretor_id > 0") ->where("contratos.data_liberacao IS NOT NULL AND contratos.data_liberacao <> '0000-00-00'") ->where("contratos.status_proposta = {$statusId}") ->group(array('periodo_producao')) ->order("periodo_producao"); if( isset($fields['periodo_producao_de']) && $fields['periodo_producao_de'] ){ $dt = new Zend_Date($fields['periodo_producao_de'], 'MM/yyyy'); $select->having("periodo_producao >= '{$dt->get('yyyy-MM')}'"); } if( isset($fields['periodo_producao_a']) && $fields['periodo_producao_a'] ){ $dt = new Zend_Date($fields['periodo_producao_a'], 'MM/yyyy'); $select->having("periodo_producao <= '{$dt->get('yyyy-MM')}'"); } if( isset($fields['empresa_id']) && $fields['empresa_id'] ){ $select->where("contratos.empresa_id = {$fields['empresa_id']}"); } return $this->getAdapter()->fetchAll($select); } public function getSelectContratosPendencias($corretores = null, $max = null) { if(empty($corretores)){ throw new Exception("Nenhum corretor selecionado"); } $contrato = new Model_Contrato(); $status = $contrato->findByNameStatus(array("Operação Finalizada", "Pagamento Enviado")); //entrar na pendência para bloqueio apenas o que já está pago $select = $this->getAdapter()->select()->from(array('contratos' => 'tb_contratos' ), array( 'corretor_id' => 'corretores.id')) ->joinInner(array( 'clientes' => 'tb_clientes' ), 'contratos.cliente_id = clientes.id', array()) ->joinInner(array( 'bancos' => 'tb_bancos' ), 'contratos.banco_id = bancos.id', array()) ->joinInner(array( 'corretores' => 'tb_corretores' ), 'contratos.corretor_id = corretores.id', array('prazo_fisico' => "IF(corretores_prazos.id IS NOT NULL, corretores_prazos.prazo, corretores.prazo_fisico)")) ->joinLeft(array( 'corretores_prazos' => 'tb_corretores_prazos' ), 'contratos.corretor_id = corretores_prazos.corretor_id AND contratos.banco_id = corretores_prazos.banco_id AND corretores_prazos.excluido<>1', array()) ->joinInner(array( 'rotas' => 'tb_rotas' ), "corretores.rota_id = rotas.id", array()) ->joinLeft(array( 'status_propostas' => 'tb_tipos' ), 'contratos.status_proposta = status_propostas.id', array()) ->joinInner(array( 'supervisores' => 'tb_gerente_rota' ), "rotas.gerente_id = supervisores.id", array()); //Trata o critério de cobrança do banco Itaú $wherePendenciaItau = $this->_getWherePendenciaItau(); $wherePrevia = "(contratos.data_recebimento_previa IS NULL OR contratos.data_recebimento_previa = '0000-00-00')"; $select->where("contratos.excluido<>1") ->where("contratos.tipo_registro = 1") ->where("clientes.excluido<>1") ->where("contratos.corretor_id " . (strpos($corretores, ",") ? "IN ($corretores)" : "= $corretores")) ->where("(contratos.data_liberacao <> '0000-00-00' AND contratos.data_liberacao IS NOT NULL " . "AND contratos.status_proposta IN ('" . implode("', '", $status) . "')" . ") OR ({$wherePendenciaItau} AND {$wherePrevia})") ->where("contratos.protocolo_recebimento_fisico IS NULL " . "OR contratos.protocolo_recebimento_fisico <= 0 " . "OR contratos.cobranca_banco = 1") ->group('corretores.id'); if($max){ $select->where("TIMESTAMPDIFF(DAY, data_liberacao, CURDATE()) > $max"); } else { $wherePreviaCorretorSupervisor = $this->getWherePreviaCorretorSupervisor(); $select->where($wherePreviaCorretorSupervisor); } return $select; } public function getWherePreviaCorretorSupervisor(){ $wherePendenciaItau = $this->_getWherePendenciaItau(); $whereCorretor = "(TIMESTAMPDIFF(DAY, IF(({$wherePendenciaItau}), data_emissao, data_liberacao), CURDATE()) > IF(corretores_prazos.id IS NOT NULL, corretores_prazos.prazo, corretores.prazo_fisico))"; $whereNotPrevia = "(contratos.data_recebimento_previa IS NULL OR contratos.data_recebimento_previa = '0000-00-00')"; $whereSupervisor = "(TIMESTAMPDIFF(DAY, contratos.data_recebimento_previa, CURDATE()) > IF(supervisores.prazo IS NOT NULL, supervisores.prazo, 0))"; $wherePrevia = "(contratos.data_recebimento_previa IS NOT NULL AND contratos.data_recebimento_previa <> '0000-00-00')"; return "(($whereCorretor AND $whereNotPrevia) OR ($whereSupervisor AND $wherePrevia))"; } protected function _getWherePendenciaItau() { return "contratos.pendente = 1 AND contratos.motivo_pendencia = 3"; } public function corretorComPendencia($id) { $ns = new Zend_Session_Namespace(); $acl = $ns->acl; $mensagem = ''; if(!$acl->isAllowed(Yuppie_Auth::getIdentity()->grupo, 'pagar-corretores-fisicos-pendentes')){ $contratoModel = new Model_Contrato(); $fisicosPendentes = $contratoModel->getFisicosPendentes(array( 'corretor_id' => $id, 'status_proposta' => '43', 'status_formalizacao' => 'fisico-pendente-alem-prazo' )); if (count($fisicosPendentes) > 0) { $mensagem = "Corretor com pendência de físico, comissão bloqueada."; } } return $mensagem; } public function alterarEstadoPendencia($contratoId, $estado, $motivo) { $where = ["id = ? " => $contratoId]; $data = [ 'pendente' => $estado, 'motivo_pendencia' => $motivo ]; $result = parent::update($data, $where); //grava alteracao no log if( $result > 0 ){ $log = new Model_DbTable_Log(); $log->save($this, $data, $where); } return $result; } public function reprocessarPendencias($bancoId) { if (empty($bancoId)) { return; } $banco = (new Model_Banco())->exibir($bancoId); if (empty($banco) || empty($banco['ativo'])) { return; } //Retira as pendências de físico $where = "banco_id = {$bancoId} AND excluido<>1 AND tipo_registro = 1 " . "AND ((motivo_pendencia = 1 OR motivo_pendencia = 0) AND pendente = 1)"; parent::update(['pendente' => 0, 'motivo_pendencia' => null], $where); //Seta a pendência de físico $where = "banco_id = {$bancoId} AND excluido<>1 AND tipo_registro = 1 AND " . "(protocolo_recebimento_fisico IS NULL OR protocolo_recebimento_fisico = '') AND " . "data_liberacao IS NOT NULL AND data_liberacao <> '0000-00-00' " . "AND pendente = 0 AND status_proposta = 43 AND tipo_formalizacao <> 1"; parent::update(['pendente' => 1, 'motivo_pendencia' => 1], $where); if( stristr($banco->nome, "itau") ){ //retira as pendências Itaú $where = "banco_id = {$bancoId} AND excluido<>1 AND tipo_registro = 1 " . "AND motivo_pendencia = 3 AND pendente = 1"; parent::update(['pendente' => 0, 'motivo_pendencia' => 0], $where); //seta as pendências Itaú $select = $this->getAdapter()->select()->from(array('tb_contratos' => 'c'), array('c.id')) ->joinInner(array('t' => 'tb_tipos'), "c.status_proposta = t.id", array()) ->joinInner(array('b' => 'tb_bancos'), "c.banco_id = b.id", array()) ->where("c.banco_id = {$bancoId}") ->where("c.excluido<>1") ->where("pendente = 0") ->where("t.descricao IN('cancelado', 'cancelada')") ->where("c.data_emissao >= '2017-10-09'") ->where("(protocolo_recebimento_fisico is null OR protocolo_recebimento_fisico = '')") ->where("c.tipo = 'PORTABILIDADE'"); $contratosItau = $this->getAdapter()->fetchCol($select); parent::update(['pendente' => 1, 'motivo_pendencia' => 3], ["id IN(?)" => implode(',', $contratosItau)]); } //retira as pendências de doc ou reabertura banco $where = "banco_id = {$bancoId} AND excluido<>1 AND tipo_registro = 1 AND motivo_pendencia = 2 AND pendente = 1"; parent::update(['pendente' => 0, 'motivo_pendencia' => 0], $where); //seta as pendências de doc ou reabertura banco $where = "banco_id = {$bancoId} AND coalesce(protocolo_recebimento_fisico, 0) > 0 " . "AND (cobranca_banco = 1 OR cobranca_promotora = 1) " . "AND excluido<>1 AND pendente = 0"; parent::update(['pendente' => 1, 'motivo_pendencia' => 2], $where); return true; } public function getSelectProducaoSintetico(array $columns, $order = ['corretores.nome']) { $select = $this->getAdapter()->select()->from(array( 'contratos' => 'tb_contratos' ), array()) ->columns($columns) ->joinInner(array( "clientes" => "tb_clientes" ), "contratos.cliente_id = clientes.id", []) ->joinInner(array( "corretores" => "tb_corretores" ), "contratos.corretor_id = corretores.id", ['corretor' => 'nome', 'corretores.uf']) ->where("contratos.excluido<>1") ->where("contratos.tipo_registro = 1") ->where("clientes.excluido<>1") ->group(array( 'corretores.id' )) ->order($order); return $select; } public function getContratosCancelados($fields) { $select = $this->getAdapter() ->select()->from(['contratos' => 'tb_contratos'], ['corretor_id', 'data_emissao', 'numero_contrato', 'numero_ade', 'obs', 'valor_bruto', 'valor_liquido', 'base_comissao_valor', 'digitador']) ->joinInner(["clientes" => "tb_clientes"], "contratos.cliente_id = clientes.id AND clientes.excluido<>1", ['cpf', 'cliente' => 'nome']) ->joinInner(['bancos' => 'tb_bancos'], "bancos.id = contratos.banco_id", ['banco' => 'nome']) ->joinInner(['status_propostas' => 'tb_tipos'], "status_propostas.id = contratos.status_proposta", ['status_proposta_descricao' => 'status_propostas.descricao']) ->joinLeft(["corretores" => "tb_corretores"], "contratos.corretor_id = corretores.id", ['corretor' => 'nome']) ->joinLeft(['contratos2' => 'tb_contratos'], 'clientes.id = contratos2.cliente_id and contratos2.data_emissao >= contratos.data_emissao AND contratos2.data_emissao <= date_add(contratos.data_emissao, interval 7 day) and contratos2.id <> contratos.id and contratos2.excluido<>1 and contratos2.tipo_registro = 1', []) ->where("contratos.excluido<>1") ->where("contratos.tipo_registro = 1") ->where("status_propostas.descricao like '%cancel%'") ->where('contratos2.id is null') ->order(['corretores.nome', 'clientes.nome', 'contratos.data_emissao']); 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['convenio_id']) ){ $select->where("contratos.convenio_id = ?", $fields['convenio_id']); } if( !empty($fields['rota_id']) ){ $select->where("corretores.rota_id IN (?)", implode(",", $fields['rota_id'])); } if( !empty($fields['banco_id']) ){ $select->where("contratos.banco_id IN(?)", implode(",", $fields['banco_id'])); } if( !empty($fields['empresa_id']) ){ $select->where("contratos.empresa_id = ?", $fields['empresa_id']); } if( Yuppie_Auth::getIdentity()->grupo == 'Corretor' ){ $select->where('contratos.corretor_id = ?', Yuppie_Auth::getIdentity()->id); } if( !empty(Yuppie_Auth::getIdentity()->corretor_id) ){ $select->where('contratos.corretor_id = ?', Yuppie_Auth::getIdentity()->corretor_id); } return $this->getAdapter()->fetchAll($select); } /** * @param string|null $numeroContrato * @param int $bancoId * @return array */ public function findByNumeroContrato(?string $numeroContrato, int $bancoId): array { if (empty($numeroContrato)) { return []; } $sql = $this->getAdapter() ->select() ->from(['c' => $this->_name]) ->where("c.numero_contrato = '" . $numeroContrato . "' OR c.numero_contrato LIKE '" . $numeroContrato . "-%'") ->where("c.banco_id = ?", $bancoId) ->where("c.tipo_registro = ?", 1) ->where('c.excluido <> ?', 1); $data = $this->getAdapter()->fetchRow($sql); return !empty($data) ? $data : []; } /** * @param int $contrato * @return int|null */ public function setContratoSRCC(int $contrato): ?int { $data = $this->getComissoesSRCC($contrato); $data['srcc'] = 1; return parent::update($data, "id = " . $contrato); } /** * @param int|null $contrato * @param array $data * @return array|mixed */ public function getComissoesSRCC(?int $contrato = null, $data = []) { $data['comissao_empresa'] = 0; $data['bonus_empresa'] = 0; $data['adiantamento_comissao_empresa'] = 0; if (!$this->isPaid($contrato)) { $data['comissao_corretor'] = 0; $data['bonus_corretor'] = 0; $data['diferimento_corretor'] = 0; } return $data; } public function getContratosPorCadastro($dataInicial, $dataFinal): array { $select = $this->getAdapter()->select()->from($this->_name, [ "id", "cliente_id", "numero_contrato", "dt_cadastro" => "DATE_FORMAT(data_cadastro, '%Y-%m-%d')" ]) ->where('excluido<>1') ->having("dt_cadastro >= ?", $dataInicial) ->having("dt_cadastro <= ?", $dataFinal); return $this->getAdapter()->fetchAll($select); } /** * @param array $contratos * @throws Core_Exception * @throws Zend_Date_Exception * @throws Zend_Db_Table_Row_Exception */ public function setarFraude(array $contratos) { if (!$contratos) { throw new Exception('Não existem contratos para análise'); } foreach ($contratos as $contrato) { $result = null; $motivoFraude = $this->_verificarFraude($contrato['id']); if ($motivoFraude) { $result = parent::update([ 'status' => 1, 'motivo_fraude' => $motivoFraude ], "id = {$contrato['id']}"); } if ($result) { (new Model_DbTable_EsteiraAntiFraudeHistorico())->gravarHistoricoAntiFraude($contrato, $motivoFraude); } } } /** * @param $contratoId * @return bool|string * @throws Core_Exception * @throws Zend_Date_Exception * @throws Zend_Db_Table_Row_Exception */ public function _verificarFraude($contratoId) { if ($contratoId) { $dados = $this->fetchRow(['id = ?' => $contratoId]); } if (empty($dados)) { return false; } //se a proposta tiver sido aprovada (status 2) não é necessário verificar if ($dados->status == 2) { return false; } $dadosBanco = $dados->findParentRow("Model_DbTable_Banco"); if (!$dadosBanco) { return false; } if ($dadosBanco->anti_fraude <> 1) { return false; } $modelCorretor = new Model_Corretor(); $dadosCorretor = $modelCorretor->exibir($dados->corretor_id); if (empty($dadosCorretor)) { return false; } $select = $this->getAdapter()->select() ->from(['contratos' => 'tb_contratos'], ['id']) ->where("contratos.excluido <> 1"); //verifica se o cliente já possui fraude ou ação judicial $contratosCliente = $select ->joinInner(['contratos_judiciais' => 'tb_contratos_acoes'], 'contratos_judiciais.contrato_id = contratos.id', ['acao_id' => 'id']) ->where("contratos_judiciais.id IS NOT NULL OR contratos.status = 3") ->where("contratos.cliente_id = $dados->cliente_id"); if (count($this->getAdapter()->fetchAll($contratosCliente)) > 0) { return "Cliente possui fraude ou ação judicial registrada no sistema."; } if ($dadosCorretor->nivel_esteira == 0) { return false; } //verifica se o corretor e novo, cadastrado a menos de X dias. $date = new Zend_Date($dadosCorretor->data_cadastro); $diferencaDias = floor((((time() - $date->get()) / 60) / 60) / 24); if ($diferencaDias < 30) { return "Corretor cadastrado a menos de 30 dias"; } //verifica se o corretor já possui fraude $contratosCorretor = $select ->joinInner(['contratos_judiciais_corretor' => 'tb_contratos_acoes'], 'contratos_judiciais_corretor.contrato_id = contratos.id') ->where("contratos_judiciais_corretor.resposta_analise LIKE 'FRAUDE' AND contratos.corretor_id = " . $dados->corretor_id); if (count($this->getAdapter()->fetchAll($contratosCorretor)) > 0) { return "Corretor possui fraude registrada no sistema."; } //verifica se o valor e maior que a media de producao $mediaProducao = (new Model_Proposta())->mediaProducaoCorretor($dados->corretor_id); $tetoProducao = $mediaProducao + ($mediaProducao*10/100); $valorLiquido = Core_FilterValor::filter($dados->valor_liquido); if ($valorLiquido > $tetoProducao) { return "Valor da proposta maior que a média de produção deste corretor."; } //verifica se o valor da proposta é maior que o valor base do convenio if ($dados->convenio_id) { $modelConvenio = new Model_Convenio(); $dadosConvenio = $modelConvenio->exibir($dados->convenio_id); $valorBase = Core_FilterValor::filter($dadosConvenio->valor_base); if ($valorBase > 0 && $valorLiquido > $valorBase) { return "Valor da proposta maior que o valor base do convênio."; } } return false; } public function getContratosPeriodoPorCorretor(int $corretorId, $dataInicial, $dataFinal, int $status = 0) { $select = $this->getAdapter()->select() ->from(['contratos' => 'tb_contratos'], ['qtd_contratos' => 'COUNT(id)']) ->where("contratos.excluido <> 1") ->where('corretor_id = ?', $corretorId) ->where('data_emissao >= ?', $dataInicial) ->where('data_emissao < ?', $dataFinal) ->group('corretor_id'); if (!empty($status)) { $select->where('status = ?', $status); } $result = $this->getAdapter()->fetchRow($select); return $result['qtd_contratos'] ?? 0; } /** * @param array $oldData * @param array $data */ protected function checarEstornadoManual(array $oldData, array &$data) { if (!empty($oldData['data_estornado_manual']) && $oldData['data_estornado_manual'] != '0000-00-00') { unset($data['estornado']); } } /** * @param int $tipo 0 se for em cima do contrato e 1 se for na comissão da empresa * @param float $comissaoCorretor * @param float $comissaoEmpresa * @return string */ public function checarIncidenciaComissao(int $tipo, ?float $comissaoCorretor, ?float $comissaoEmpresa) { if ($tipo != 1) { return number_format($comissaoCorretor, 2, ',', '.'); } if (empty($comissaoEmpresa) || empty($comissaoCorretor)) { return '0,00'; } $comissaoReal = (($comissaoEmpresa / 100) * ($comissaoCorretor / 100)) * 100; return number_format($comissaoReal, 2, ',', '.'); } public function contratosSemCorretor() { $select = $this->getAdapter()->select() ->from(['contratos' => 'tb_contratos'], 'count(distinct contratos.id) as qtd_contratos') ->joinInner(["clientes" => "tb_clientes"], "contratos.cliente_id = clientes.id AND clientes.excluido<>1", []) ->joinInner(['bancos' => 'tb_bancos'], "bancos.id = contratos.banco_id AND bancos.excluido<>1", []) ->where("contratos.excluido <> 1") ->where('contratos.corretor_id = 0 OR contratos.corretor_id is null'); return $this->getAdapter()->fetchCol($select); } }
💾 保存文件
← 返回文件管理器