✏️ 正在编辑: ArquivoRemessaBb400.php
路径:
/srv/systems_dir/contemax/library/Core/ArquivoRemessaBb400.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Core_ArquivoRemessaBb400 { 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 Ou Teste ), '04.0' => array( //010 a 011 'digitos' => 2, 'formato' => 'N', 'default' => '01', ), '05.0' => array( 'digitos' => 8, 'formato' => 'A', 'default' => 'COBRANCA', ), '06.0' => array( 'digitos' => 7, 'formato' => 'A', 'default' => '', ), '07.0' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '', ), '08.0' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '09.0' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '10.0' => array(//Dígito Verificador - D.V. – do Número da Conta Corrente do Cedente 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '11.0' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '000000', ), '12.0' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '13.0' => array( 'digitos' => 18, 'formato' => 'A', 'default' => '001BANCODOBRASIL', ), '14.0' => array( //Data da Gravação: Informe no formato “DDMMAA” 'digitos' => 6,//Data correspondente a geração do arquivo remessa 'formato' => 'N', 'default' => '', ), '15.0' => array( 'digitos' => 7, 'formato' => 'N', 'default' => '', ), '16.0' => array( 'digitos' => 22, 'formato' => 'A', 'default' => '', ), '17.0' => array( 'digitos' => 7, 'formato' => 'N', 'default' => '', ), '18.0' => array( 'digitos' => 258, 'formato' => 'A', 'default' => '', ), '19.0' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '000001', ), //fim bb ); //registro detalhe protected $detalhe = array( '01.7' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '02.7' => array(//tipo de inscrição = 01 - CPF; 02 - CNPJ 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '03.7' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '04.7' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '', ), '05.7' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '06.7' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '07.7' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '08.7' => array( 'digitos' => 7, 'formato' => 'N', 'default' => '', ), '09.7' => array( 'digitos' => 25, 'formato' => 'A', 'default' => '', ), '10.7' => array( 'digitos' => 17, 'formato' => 'N', 'default' => '0', ), '11.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '00', ), '12.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '00', ), '13.7' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '14.7' => array(//Indicativo de Mensagem ou Sacador/Avalista 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '15.7' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '16.7' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '17.7' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '0', ), '18.7' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '000000', ), '19.7' => array( 'digitos' => 5, 'formato' => 'A', 'default' => '', ), '20.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '21.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '22.7' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), '23.7' => array( //data de vencimento 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '24.7' => array( //000,00 'digitos' => 11, 'formato' => 'N', 'default' => '', 'decimais' => 2 ), '25.7' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '001', ), '26.7' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0000', ), '27.7' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '28.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '01', ), '29.7' => array( 'digitos' => 1, 'formato' => 'A', 'default' => 'N', ), '30.7' => array( //DDMMAA 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '31.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '32.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '33.7' => array( 'digitos' => 11, 'formato' => 'N', 'default' => '', 'decimais' => 2 ), '34.7' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '35.7' => array( 'digitos' => 11, 'formato' => 'N', 'default' => '', 'decimais' => 2 ), '36.7' => array( 'digitos' => 11, 'formato' => 'N', 'default' => '', 'decimais' => 2 ), '37.7' => array( 'digitos' => 11, 'formato' => 'N', 'default' => '', 'decimais' => 2 ), '38.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '2', ), '39.7' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '40.7' => array( 'digitos' => 37, 'formato' => 'A', 'default' => '', ), '41.7' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '42.7' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '' ), '43.7' => array( 'digitos' => 12, 'formato' => 'A', 'default' => '', ), '44.7' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '45.7' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '46.7' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '47.7' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '', ), '48.7' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '49.7' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '50.7' => 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( '07.0' => $conta->agencia, '08.0' => $conta->agencia_dv, '09.0' => $conta->conta, '10.0' => $conta->conta_dv, '12.0' => $empresa->razao_social, '14.0' => $data->get("ddMMyy"), '15.0' => $this->numero, '17.0' => $conta->convenio, ); return $this->formatar($this->headerArquivo, $h); } protected function gerarDetalhe($empresa, $pagamento, $conta, $registroNoLote){ $d = array( '01.7' => 7, '02.7' => '02', '03.7' => $empresa->cnpj, '04.7' => $pagamento->agencia, '05.7' => $pagamento->agencia_dv, '06.7' => $conta->conta, '07.7' => $conta->conta_dv, '08.7' => $conta->convenio, '10.7' => $pagamento->nossonumero, '16.7' => $conta->variacao_carteira, '20.7' => $conta->carteira == 'RG' ? '17' : '01',//17 - Cobrança simples '21.7' => $pagamento->codigo_remessa ? $pagamento->codigo_remessa : '01', '24.7' => Zend_Locale_Format::toFloat($pagamento->valor, array('precision' => 2)), '31.7' => '00', //Ausência de instruções '32.7' => '07', //Não protestar '33.7' => Zend_Locale_Format::toFloat($conta->percentual_juros, array('precision' => 2)), //'34.7' => //Data Limite de concenção a validar '38.7' => strlen($pagamento->cpf_candidato) > 11 ? '02' : '01', '39.7' => $pagamento->cpf_candidato, '40.7' => $pagamento->candidato, '42.7' => $pagamento->endereco, '43.7' => $pagamento->bairro, '44.7' => $pagamento->cep, '45.7' => $pagamento->cidade, '46.7' => $pagamento->uf, '48.7' => $pagamento->dias_protesto, '50.7' => $registroNoLote, ); if ($pagamento->data_vencimento) { $dataVencimento = new Zend_Date($pagamento->data_vencimento, 'yyyy-MM-dd'); $d['23.7'] = $dataVencimento->get('ddMMyy'); } if ($pagamento->data_lancamento) { $dataLancamento = new Zend_Date($pagamento->data_lancamento, 'yyyy-MM-dd'); $d['30.7'] = $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() { ######################################################## 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(001, array( 'agencia' => $conta->agencia, 'agencia_dv' => $conta->agencia_dv, 'conta' => $conta->conta, 'conta_dv' => $conta->conta_dv, '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['nosso_numero']; $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++)); // pr(array( // strlen($arquivo[0]), //header // strlen($arquivo[1]), //detalhe // strlen($arquivo[2]), //trailer do arquivo // )); // 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 " . "candidato está inválido."); } $validate = new Validators_Uf(); if( !$validate->isValid($pagamento->uf) ){ throw new Core_Exception("UF {$pagamento->uf} do candidato de " . "CPF {$pagamento->cpf_candidato}, é inválida."); } if( !$pagamento->endereco || !$pagamento->bairro || !$pagamento->cidade || !$pagamento->cep){ throw new Core_Exception("Favor verificar o endereço completo " . "do candidato de CPF {$pagamento->cpf_candidato}"); } } }
💾 保存文件
← 返回文件管理器