/**
  * Verifica se deve emitir a guia considerando: 
  * 1 - as características do contribuinte no alvará
  * 2 - tributação dentro ou fora do municipio
  * 
  * 
  * @param stdClass $oParametro
  *   $oParametro->inscricao_municipal
  *   $oParametro->data
  * @throws Exception
  * @return boolean
  * 
  * @tutorial: Abaixo constam as regras para emissão de guia
  * 
  * Regime(4)/Exigibilidade(5) |Exigível(23)|Não Incide(24)|Isento(25)|Export.(26)|Imune(27)|Susp.Judic(28)|Susp.Adm(29)
  * ------------------------------------------------------------------------------------------------------------------
  * (--)Optante Simples        |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (14)Normal                 |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (15)Cooperativa            |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (16)EPP                    |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (17)Estimativa             |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (18)Fixado                 |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (19)ME municipal           |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (20)MEI                    |Não         |Não         |Não       |Não        |Não      |Não           |Não
  * (21)ME                     |Sim         |Não         |Não       |sim        |Não      |Não           |Não
  * (22)Sociedade profissional |Não         |Não         |Não       |Não        |Não      |Não           |Não 
  */
 public static function checarEmissaoGuia($oParametro = NULL)
 {
     $oValidaData = new Zend_Validate_Date();
     if (!is_object($oParametro)) {
         throw new Exception('O parâmetro informado deve ser um objeto.');
     } else {
         if (!isset($oParametro->data) || !isset($oParametro->inscricao_municipal)) {
             throw new Exception('Verifique os parâmetros informados.');
         } else {
             if (!$oValidaData->isValid($oParametro->data)) {
                 throw new Exception('Parâmetro "data" inválido.');
             }
         }
     }
     // Busca os dados do contribuinte da sessão
     $oContribuinte = Contribuinte_Model_Contribuinte::getByInscricaoMunicipal($oParametro->inscricao_municipal);
     if (!is_object($oContribuinte)) {
         throw new Exception('Nenhum contribuinte foi encontrado.');
     }
     // Optante pelo simples no período pesquisado, não emite guia
     $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($oParametro->data));
     if ($oContribuinte->isOptanteSimples($oDataSimples)) {
         return FALSE;
     }
     // Verifica se deve emitir a guia conforme as regras de emissão
     $iRegimeTributario = $oContribuinte->getRegimeTributario();
     $iExigibilidade = $oContribuinte->getExigibilidade();
     switch ("{$iRegimeTributario}-{$iExigibilidade}") {
         case '14-23':
         case '14-26':
         case '15-23':
         case '15-26':
         case '16-23':
         case '16-26':
         case '17-23':
         case '17-26':
         case '19-23':
         case '19-26':
         case '21-23':
         case '21-26':
             return TRUE;
             break;
         default:
             return FALSE;
     }
     return FALSE;
 }
 /**
  * Emite e gera as guias conforme a receita e aliquota informadas
  */
 public function emitirGuiaAction()
 {
     parent::noTemplate();
     $aParametros = $this->getAllParams();
     try {
         $iIdImportacao = $aParametros['id'];
         $fAliquota = $aParametros['aliq_issqn'] ? $aParametros['aliq_issqn'] : NULL;
         $oContribuinte = $this->_session->contribuinte;
         $aReceitaDesif = Contribuinte_Model_ImportacaoDesif::getTotalReceitaGuiaDesif($oContribuinte, $iIdImportacao, $fAliquota);
         $sTotalReceita = DBSeller_Helper_Number_Format::toMoney($aReceitaDesif->total_receita, 2, 'R$ ');
         $sTotalIss = DBSeller_Helper_Number_Format::toMoney($aReceitaDesif->total_iss, 2, 'R$ ');
         $oFormEmitirGuia = new Contribuinte_Form_GuiaCompetencia();
         $oFormEmitirGuia->setName('form-emitir-guia');
         $oFormEmitirGuia->setAction('/contribuinte/guia-desif/emitir-guia');
         $oFormEmitirGuia->getElement('ano')->setValue($aReceitaDesif->ano_competencia);
         $oFormEmitirGuia->getElement('mes')->setValue($aReceitaDesif->mes_competencia);
         $oFormEmitirGuia->getElement('aliq_issqn')->setValue($fAliquota);
         $oFormEmitirGuia->getElement('total_servico')->setValue($sTotalReceita);
         $oFormEmitirGuia->getElement('total_iss')->setValue($sTotalIss);
         $oFormEmitirGuia->getElement('data_guia')->setValue(date('d/m/Y'));
         $this->view->form = $oFormEmitirGuia;
         // Verifica se for enviado os dados via $_POST
         if ($this->getRequest()->isPost()) {
             // Formata a data de pagamento da guia
             $sDataInvertida = DBSeller_Helper_Date_Date::invertDate($this->getRequest()->getParam('data_guia'));
             $oDataPagamento = new DateTime($sDataInvertida);
             // Gera a guia e emite o PDF da geração
             $oGuia = Contribuinte_Model_GuiaEcidade::gerarGuiaDesif($oContribuinte, $aParametros['ano'], $aParametros['mes'], $oDataPagamento, $fAliquota, true);
             $this->view->arquivo = $oGuia->arquivo_guia;
         }
     } catch (Exception $oErro) {
         $this->view->mensagem_erro = $oErro->getMessage();
     }
 }
 /**
  * Reemite a guia de pagamento das Guias de DMS
  */
 public function reemitirDmsGuiaAction()
 {
     parent::noTemplate();
     $iIdGuia = $this->getRequest()->getParam('guia', NULL);
     $sDataGuia = $this->getRequest()->getParam('data_guia', NULL);
     $oGuia = Contribuinte_Model_Guia::getById($iIdGuia);
     $oDadosGuia = $oGuia->getEntity();
     if ($this->getRequest()->isPost()) {
         $oValidaDatas = new Zend_Validate_Date();
         $sDataValidacao = DBSeller_Helper_Date_Date::invertDate($sDataGuia, '');
         if ($sDataValidacao < date('Ymd')) {
             $this->view->message = $this->translate->_('Informe uma data posterior a data atual.');
         } else {
             if (!$oValidaDatas->isValid($sDataGuia)) {
                 $this->view->message = $this->translate->_('Informe uma data para pagamento válida.');
             } else {
                 $aNovaGuia = $oGuia->reemitir($sDataGuia);
                 $this->view->arquivo = $aNovaGuia['arquivo'];
                 $this->view->guia = $aNovaGuia['objeto'];
             }
         }
     }
     $oFormCompetencia = new Contribuinte_Form_GuiaCompetencia();
     $oFormCompetencia->setAction('/contribuinte/guia/reemitir-dms-guia');
     $oFormCompetencia->removeElement('total_iss');
     $oFormCompetencia->removeElement('total_servico');
     $oFormCompetencia->getElement('data_guia')->setValue(date('d/m/Y'));
     $oFormCompetencia->preencheDms($oDadosGuia);
     $this->view->form = $oFormCompetencia;
 }
 /**
  * Verifica se o contribuinte é optante pelo simples na data especificada
  * Utiliza o mesmo método utilizado no DMS
  *
  * @see Contribuinte_Lib_Controller_AbstractController::verificarContribuinteOptanteSimplesAction()
  * @throws Exception
  */
 public function verificarContribuinteOptanteSimplesAction()
 {
     try {
         $sData = $this->getRequest()->getParam('data');
         if (!$sData) {
             throw new Exception('Informe a data para verificar.');
         }
         $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($sData, '-'));
         if (!$oDataSimples instanceof DateTime) {
             throw new Exception('Data inválida');
         }
         $oContribuinte = $this->_session->contribuinte;
         $aRetorno['status'] = $oContribuinte->isOptanteSimples($oDataSimples) ? TRUE : FALSE;
         echo $this->getHelper('json')->sendJson($aRetorno);
     } catch (Exception $e) {
         $aRetorno['erro'] = TRUE;
         if ($e->getCode() == Global_Lib_Model_WebService::CODIGO_ERRO_CONSULTA_WEBSERVICE) {
             $aRetorno['mensagem'] = "E-cidade temporariamente insdisponível. Emissão bloqueada!";
         } else {
             $aRetorno['mensagem'] = $e->getMessage();
         }
         echo $this->getHelper('json')->sendJson($aRetorno);
     }
 }
 /**
  * Verifica se a competencia é corrente
  *
  * @return boolean
  */
 public function isCorrente()
 {
     $oDataAtual = new DateTime();
     $oDataCompetencia = new DateTime(DBSeller_Helper_Date_Date::invertDate('01/' . $this->getCompetencia(), '/'));
     $sCompetenciaAtual = $oDataAtual->format('Ym');
     $sCompetencia = $oDataCompetencia->format('Ym');
     return $sCompetencia === $sCompetenciaAtual;
 }
 /**
  * Prepara os dados da guia a ser gerada
  *
  * @param  Administrativo_Model_UsuarioContribuinte $oContribuinte
  * @param  int                                      $iAnoCompetencia
  * @param  int                                      $iMesCompetencia
  * @param  array                                    $aNotas
  * @param  int                                      $iIdGuia
  * @return object                                   $oGuiaGerar
  */
 public static function montaDadosGuia(Administrativo_Model_UsuarioContribuinte $oContribuinte, $iAnoCompetencia, $iMesCompetencia, $aNotas, $sDataPagamento, $iIdGuia)
 {
     $sData = DBSeller_Helper_Date_Date::invertDate($sDataPagamento);
     $oData = new DateTime($sData);
     $oGuiaGerar = new StdClass();
     $oGuiaGerar->inscricao_municipal = $oContribuinte->getIm();
     $oGuiaGerar->cpf_cnpj = $oContribuinte->getCnpjCpf();
     $oGuiaGerar->numcgm = $oContribuinte->getCgm();
     $oGuiaGerar->mes_competencia = $iMesCompetencia;
     $oGuiaGerar->ano_competencia = $iAnoCompetencia;
     $oGuiaGerar->codigo_guia = $iIdGuia;
     $aListaNotas = array();
     foreach ($aNotas as $oDocumentoNota) {
         $oNota = new stdClass();
         $oNota->numero_nota_fiscal = $oDocumentoNota->getNotaNumero();
         $oNota->codigo_documento = $oDocumentoNota->getId();
         $oNota->data_nota_fiscal = $oDocumentoNota->getNotaData()->format('Y-m-d');
         $oNota->serie_nota_fiscal = $oDocumentoNota->getNotaSerie();
         $oNota->valor_base_calculo = $oDocumentoNota->getServicoBaseCalculo();
         $oNota->valor_deducao = $oDocumentoNota->getServicoValorDeducao();
         $oNota->valor_imposto_retido = $oDocumentoNota->getServicoValorImposto();
         $oNota->valor_servico_prestado = $oDocumentoNota->getServicoValorPagar();
         $oNota->aliquota = $oDocumentoNota->getServicoAliquota();
         $oNota->data_pagamento = $oData->format('Y-m-d');
         $oNota->retido = $oDocumentoNota->getServicoImpostoRetido();
         $oNota->situacao = $oDocumentoNota->getSituacaoDocumento() == 'N' ? '0' : '1';
         $oNota->status = 1;
         $oNota->servico_prestado = urlencode($oDocumentoNota->getDescricaoServico());
         // Serviços prestados
         if ($oDocumentoNota->getOperacao() == self::SERVICO_PRESTADO) {
             $oNota->cnpj_prestador = $oDocumentoNota->getPrestadorCpfCnpj();
             $oNota->inscricao_prestador = $oDocumentoNota->getPrestadorInscricaoMunicipal();
             $oNota->nome = urlencode($oDocumentoNota->getPrestadorRazaoSocial());
             $oNota->operacao = 2;
         } else {
             $oNota->cnpj_prestador = $oDocumentoNota->getTomadorCpfCnpj();
             $oNota->inscricao_prestador = $oDocumentoNota->getTomadorInscricaoMunicipal();
             $oNota->nome = $oDocumentoNota->getTomadorRazaoSocial();
             $oNota->operacao = 1;
         }
         // Limita para o tamanho do campo no ecidade
         if (strlen($oNota->nome) > 60) {
             $oNota->nome = substr($oNota->nome, 57) . '...';
         }
         // Adiciona a nota na lista
         $aListaNotas[] = $oNota;
     }
     $oGuiaGerar->notas = $aListaNotas;
     return $oGuiaGerar;
 }
 /**
  * Verifica se o contribuinte é optante pelo simples na data especificada
  * Utiliza o mesmo método utilizado no DMS
  *
  * @see Contribuinte_Lib_Controller_AbstractController::verificarContribuinteOptanteSimplesAction()
  * @throws Exception
  */
 public function verificarContribuinteOptanteSimplesAction()
 {
     try {
         $sData = $this->getRequest()->getParam('data');
         if (!$sData) {
             throw new Exception('Informe a data para verificar.');
         }
         $oDataSimples = new DateTime(DBSeller_Helper_Date_Date::invertDate($sData, '-'));
         if (!$oDataSimples instanceof DateTime) {
             throw new Exception('Data inválida');
         }
         $oContribuinte = $this->_session->contribuinte;
         $oParametros = Contribuinte_Model_ParametroContribuinte::getById($oContribuinte->getIdUsuarioContribuinte());
         $aRetorno['optante_simples_nacional'] = $oContribuinte->isOptanteSimples($oDataSimples) ? TRUE : FALSE;
         $aRetorno['optante_simples_categoria'] = $oContribuinte->getOptanteSimplesCategoria();
         if ($oParametros instanceof Contribuinte_Model_ParametroContribuinte) {
             $fAliquota = $oParametros->getEntity()->getValorIssFixo();
             $aRetorno['valor_iss_fixo'] = DBSeller_Helper_Number_Format::toMoney($fAliquota);
         }
         echo $this->getHelper('json')->sendJson($aRetorno);
     } catch (Exception $oError) {
         $aRetorno['erro'] = TRUE;
         $aRetorno['mensagem'] = $oError->getMessage();
         echo $this->getHelper('json')->sendJson($aRetorno);
     }
 }