✏️ 正在编辑: ArquivoRemessaCaixa400.php
路径:
/srv/systems_dir/contemax/library/Core/ArquivoRemessaCaixa400.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Core_ArquivoRemessaCaixa400 { const QUEBRA_LINHA = "\r\n"; protected $headerArquivo = array( '01.0' => array( //001 a 001 'digitos' => 1, 'formato' => 'N', 'default' => '0', ), '02.0' => array( //002 a 002 'digitos' => 1, 'formato' => 'N', 'default' => '1', ), '03.0' => array( //003 a 009 'digitos' => 7, 'formato' => 'A', 'default' => 'REMESSA', // Literal Remessa ), '04.0' => array( //010 a 011 'digitos' => 2, 'formato' => 'N', 'default' => '01', ), '05.0' => array( 'digitos' => 15, 'formato' => 'A', 'default' => 'COBRANCA', ), '06.0' => array( //Preencher com o Código agência de vinculação do Beneficiário 'digitos' => 4, 'formato' => 'N', 'default' => '', ), '07.0' => array( 'digitos' => 7, 'formato' => 'N', 'default' => '', ), '08.0' => array( 'digitos' => 9, 'formato' => 'A', 'default' => '', ), '09.0' => array( //Preencher com o Nome da Empresa 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '10.0' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '104', ), '11.0' => array( 'digitos' => 15, 'formato' => 'A', 'default' => 'C ECON FEDERAL', ), '12.0' => array( 'digitos' => 6, 'formato' => 'A', 'default' => '', ), '13.0' => array( 'digitos' => 289, 'formato' => 'A', 'default' => '007', //Número da versão do layout ), '14.0' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '15.0' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '000001', ) //fim caixa 400 ); //registro detalhe protected $detalhe = array( '01.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '1', ), '02.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '03.1' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '04.1' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '05.1' => array( 'digitos' => 7, 'formato' => 'N', 'default' => '', ), '06.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '07.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '09.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '00', ), '10.1' => array( 'digitos' => 25, 'formato' => 'A', 'default' => '0', ), '11.1' => array( 'digitos' => 17, 'formato' => 'N', 'default' => '', ), '12.1' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '13.1' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '14.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '01', ), '15.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '16.1' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), '17.1' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '18.1' => array( 'digitos' => 13, 'formato' => 'N', 'default' => '', ), '19.1' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '104', ), '20.1' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '21.1' => array( //Espécie do Título 'digitos' => 2, 'formato' => 'N', 'default' => '02', //02 = Duplicata mercantil ), '22.1' => array( //Identificação de Título - Aceito / Não Aceito 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '23.1' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '24.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '25.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '0', ), '26.1' => array( 'digitos' => 13, 'formato' => 'N', 'default' => '', ), '27.1' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '28.1' => array( 'digitos' => 13, 'formato' => 'N', 'default' => '', ), '29.1' => array( 'digitos' => 13, 'formato' => 'N', 'default' => '', ), '30.1' => array( 'digitos' => 13, 'formato' => 'N', 'default' => '', ), '31.1' => array( //Identificador do Tipo de Inscrição do Pagador 'digitos' => 2, 'formato' => 'N', 'default' => '01', ), '32.1' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '33.1' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '', ), '34.1' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '', ), '35.1' => array( 'digitos' => 12, 'formato' => 'A', 'default' => '', ), '36.1' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '37.1' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '38.1' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '39.1' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '40.1' => array( 'digitos' => 10, 'formato' => 'N', 'default' => '', ), '41.1' => array( 'digitos' => 22, 'formato' => 'A', 'default' => '', ), '42.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '43.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '44.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '1', ), '45.1' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ) ); protected $trailerArquivo = array( '01.9' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '9', ), '02.9' => array( 'digitos' => 393, 'formato' => 'A', 'default' => '', ), '03.9' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ) ); protected $empresaId; protected $contaId; protected $bancoId; protected $dataVencimentoDe; protected $dataVencimentoA; protected $numero; protected $codigoRemessa; protected $dataCriacaoArquivo; protected $pagamentos = array(); public function __construct($empresaId, $dataVencimentoDe, $dataVencimentoA, $lancamentos, $codigoRemessa, $contaId, $bancoId, $clienteId = 0) { $lancamento = Financeiro_Model_Container::getLancamento(); $this->empresaId = $empresaId; $this->contaId = $contaId; $this->bancoId = $bancoId; $this->dataVencimentoDe = $dataVencimentoDe; $this->dataVencimentoA = $dataVencimentoA; $this->codigoRemessa = $codigoRemessa; $this->pagamentos = $lancamento->getLancamentosRemessa(array( 'empresa_id' => $empresaId, 'data_vencimento_de' => $dataVencimentoDe, 'data_vencimento_a' => $dataVencimentoA, 'lancamentos' => $lancamentos, 'conta_id' => $contaId, 'banco_id' => $bancoId, 'cliente_id' => $clienteId ), array( 'lancamento.empresa_id', 'data_vencimento ASC' ) ); } public function getNumero() { return $this->numero; } protected function formatar(array $tabela, array $valores) { require_once 'Core/Filter/Alnum.php'; require_once 'Core/Filter/RemoverAcentos.php'; foreach ( $tabela as $sCod => $sInfo ) { if( !isset($valores[$sCod]) ){ $valores[$sCod] = $sInfo['default']; } if( $sInfo['formato'] == 'N' ){ $filter = new Zend_Filter_Digits(); } else { $filter = new Zend_Filter(); $filter->addFilter(new Core_Filter_Alnum(true, true)) ->addFilter(new Core_Filter_RemoverAcentos()) ->addFilter(new Zend_Filter_StringToUpper()); } if( $sCod != "05.0" ){ $valores[$sCod] = $filter->filter($valores[$sCod]); } $digitos = ($sInfo['formato'] == 'N' && isset($sInfo['decimais']) && $sInfo['decimais']) ? $sInfo['digitos'] + $sInfo['decimais'] : $sInfo['digitos']; if( strlen($valores[$sCod]) < $digitos ){ $restante = $digitos - strlen($valores[$sCod]); for ( $i = 0; $i < $restante; $i++ ) { if( $sInfo['formato'] == 'N' ){ $valores[$sCod] = '0' . $valores[$sCod]; } else { $valores[$sCod] .= ' '; } } } else if( strlen(utf8_decode($valores[$sCod])) > $digitos ){ $valores[$sCod] = substr($valores[$sCod], 0, $digitos); } } ksort($valores); return $valores; } protected function gerarHeaderArquivo($empresa, $conta, $registroNoLote) { $data = Zend_Date::now(); $h = array( '06.0' => $conta->agencia, '07.0' => $conta->codigo_cedente, '09.0' => $empresa->razao_social, '12.0' => $data->get("ddMMyy"), '14.0' => $this->numero, '15.0' => $registroNoLote ); return $this->formatar($this->headerArquivo, $h); } /** * @param $empresa * @param $pagamento * @param $conta * @param $registroNoLote * @return array * @throws Core_Exception * @throws Zend_Date_Exception */ protected function gerarDetalhe($empresa, $pagamento, $conta, $registroNoLote) { $jurosDeMora = Zend_Locale_Format::toFloat($pagamento->valor * $conta->percentual_juros / 100, array( 'precision' => 2 )); $multa = Zend_Locale_Format::toFloat($pagamento->valor * $conta->percentual_multa / 100, array( 'precision' => 2 )); $d = array( '01.1' => 1, '02.1' => '02', '03.1' => $empresa->cnpj, '04.1' => $pagamento->agencia, '05.1' => $pagamento->codigo_cedente, '06.1' => $pagamento->emissao_bloqueto, '07.1' => '0', //(Postagem pelo Beneficiário) '10.1' => $pagamento->id, '11.1' => $pagamento->nossonumero, '13.1' => $conta->mensagem_1, '14.1' => $conta->carteira == 'RG' ? '01' : '02', '15.1' => $pagamento->codigo_remessa ? $pagamento->codigo_remessa : '01', '16.1' => $pagamento->id, '18.1' => Zend_Locale_Format::toFloat($pagamento->valor, array( 'precision' => 2 )), '22.1' => 'A', '24.1' => '02', //Devolver (Não protestar) '26.1' => $jurosDeMora, '31.1' => strlen($pagamento->cpf_candidato) > 11 ? '02' : '01', '32.1' => $pagamento->cpf_candidato, '33.1' => $pagamento->candidato, '34.1' => $pagamento->endereco, '35.1' => $pagamento->bairro, '36.1' => $pagamento->cep, '37.1' => $pagamento->cidade, '38.1' => $pagamento->uf, '40.1' => $multa, '43.1' => $pagamento->dias_protesto, '45.1' => $registroNoLote, ); //se houver multa, a data da multa será preenchido com a data de vencimento + 1 if( $conta->percentual_multa > 0 ){ $dataVencimento = new Zend_Date($pagamento->data_vencimento, 'yyyy-MM-dd'); $d['39.1'] = $dataVencimento->addDay(1)->get('ddMMyy'); } if( $pagamento->data_vencimento ){ $dataVencimento = new Zend_Date($pagamento->data_vencimento, 'yyyy-MM-dd'); $d['17.1'] = $dataVencimento->get('ddMMyy'); } if( $pagamento->data_lancamento ){ $dataLancamento = new Zend_Date($pagamento->data_lancamento, 'yyyy-MM-dd'); $d['23.1'] = $dataLancamento->get('ddMMyy'); } return $this->formatar($this->detalhe, $d); } protected function gerarTrailerArquivo($registroNoLote) { $t = array( '03.9' => $registroNoLote ); return $this->formatar($this->trailerArquivo, $t); } public function gerar() { // $trecho = $this->detalhe; // $total = 0; // foreach($trecho as $value){ // echo $value['digitos'] . "<br>"; // $total += $value['digitos']; // } // echo "Total: " . $total; // pr($trecho, 1); ######################################################## if( count($this->pagamentos) == 0 ){ throw new Exception('Lista de lançamentos vazia'); } $mEmpresa = Operacional_Model_Container::getEmpresa(); $mConta = Financeiro_Model_Container::getConta(); $rows = array(); $arquivo = array(); $qtdRegistros = 1; $arquivoRemessa = Financeiro_Model_Container::getArquivoRemessa(); $remessa = $arquivoRemessa->createRow(array( 'usuario_id' => Yuppie_Auth::getIdentity()->id, 'data_criacao' => Zend_Date::now()->get('yyyy-MM-dd HH:mm:ss'), 'empresa_id' => $this->empresaId, 'data_vencimento_de' => $this->dataVencimentoDe, 'data_vencimento_a' => $this->dataVencimentoA, 'banco_id' => $this->bancoId )); $this->dataCriacaoArquivo = Zend_Date::now()->get('ddMMyy'); $this->numero = $remessa->save(); $empresa = $mEmpresa->findById($this->empresaId); $conta = $mConta->findById($this->contaId); $numeroSequencial = 1; $rows['headerArquivo'] = $this->gerarHeaderArquivo($empresa, $conta, $numeroSequencial++); $arquivo[] = utf8_decode(implode('', $rows['headerArquivo'])); $remessasLancadas = Financeiro_Model_Container::getRemessasLancadas(); $lancamento = Financeiro_Model_Container::getLancamento(); foreach ( $this->pagamentos as $pagamento ) { $boleto = Yuppie_Banco_Boleto::factory(104, array( 'agencia' => $conta->agencia, 'agencia_dv' => $conta->agencia_dv, 'conta' => $conta->conta, //$numConta[0], 'conta_dv' => $conta->conta_dv, //isset($numConta[1]) ? $numConta[1] : '', 'convenio' => $conta->convenio, 'carteira' => $conta->carteira, 'cedente_codigo' => $conta->codigo_cedente, 'data_documento' => $pagamento->data_lancamento, 'instrucoes1' => $conta->mensagem_1, 'instrucoes2' => $conta->mensagem_2, 'instrucoes3' => $conta->mensagem_3, 'instrucoes4' => $conta->mensagem_4, 'demonstrativo1' => 'Inscricao: '. $pagamento->inscricao, 'demonstrativo2' => 'Parcela: ' . $pagamento->parcela, 'taxa_boleto' => $conta->tarifa_boleto, 'nosso_numero' => $pagamento->id, 'numero_documento' => $pagamento->id, 'data_vencimento' => date('d/m/Y', strtotime($pagamento->data_vencimento)), 'valor_cobrado' => $pagamento->valor )); $dadosBoleto = $boleto->gerar(); $pagamento->nossonumero = $dadosBoleto['nossonumero']; $rows['detalhe'] = $this->gerarDetalhe($empresa, $pagamento, $conta, $numeroSequencial++); $arquivo[] = implode('', $rows['detalhe']); $re = $remessasLancadas->createRow( array( 'lancamento_id' => $pagamento->id, 'arquivo_remessa_id' => $this->numero, 'codigo_remessa' => !empty($pagamento->codigo_remessa) ? $pagamento->codigo_remessa : $this->codigoRemessa )); if( $re->save() ){ //caso tenha gerado remessa, seta a flag no lançamento e o código da remessa $lancamento->update(array( 'gerado_remessa' => 1, 'codigo_remessa' => !empty($pagamento->codigo_remessa) ? $pagamento->codigo_remessa : $this->codigoRemessa //'numero_remessa' => $this->numero ), "id = " . $pagamento->id); } } foreach ( $rows as $row ) { $qtdRegistros += count($row); } $arquivo[] = implode('', $this->gerarTrailerArquivo($numeroSequencial++)); // echo strlen($arquivo[0]); // echo strlen($arquivo[1]); // echo strlen($arquivo[2]); // pr($arquivo, 1); return implode(self::QUEBRA_LINHA, $arquivo) . self::QUEBRA_LINHA; } protected function validateDetalhe($empresa, $pagamento) { $validate = new Validators_Cnpj(); if( !$validate->isValid($empresa->cnpj) ){ throw new Core_Exception("CNPJ da empresa está inválido."); } if( strlen($pagamento->cpf_candidato) <= 11 ){ $validate = new Validators_Cpf(); } if( !$validate->isValid($pagamento->cpf_candidato) ){ throw new Core_Exception("CPF/CNPJ {$pagamento->cpf_candidato} do " . "cliente está inválido."); } $validate = new Validators_Uf(); if( !$validate->isValid($pagamento->uf) ){ throw new Core_Exception("UF {$pagamento->uf} do cliente de " . "CPF {$pagamento->cpf_cliente}, é inválida."); } if( !$pagamento->endereco || !$pagamento->bairro || !$pagamento->cidade || !$pagamento->cep ){ throw new Core_Exception("Favor verificar o endereço completo " . "do cliente de CPF {$pagamento->cpf_cliente}"); } } }
💾 保存文件
← 返回文件管理器