✏️ 正在编辑: Mercantil.php
路径:
/srv/systems_dir/yuppiecred-lidernegocios/library/Core/Banco/Remessa/Mercantil.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php class Core_Banco_Remessa_Mercantil extends Core_Banco_Remessa { protected $headerArquivo = array( '01.0' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', ), '02.0' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0000', ), '03.0' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '0', ), '04.0' => array( 'digitos' => 9, 'formato' => 'A', 'default' => '', ), '05.0' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '2', // 1=CPF ou 2=CNPJ ), '06.0' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '07.0' => array( 'digitos' => 20, 'formato' => 'N', 'default' => '', ), '08.0' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '09.0' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '10.0' => array( 'digitos' => 12, 'formato' => 'N', 'default' => '', ), '11.0' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '12.0' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '13.0' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '14.0' => array( 'digitos' => 30, 'formato' => 'A', 'default' => 'BANCO MERCANTIL DO BRASIL, S/A', ), '15.0' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), '16.0' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '1', ), '17.0' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '18.0' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '19.0' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '20.0' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '050', ), '21.0' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '00000', ), '22.0' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '23.0' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '24.0' => array( 'digitos' => 29, 'formato' => 'A', 'default' => '', ), //fim header ); protected $headerLote = array( '01.1' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', //codigo banco na compensação ), '02.1' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0001', ), '03.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '1', ), '04.1' => array( 'digitos' => 1, 'formato' => 'A', 'default' => 'C', ), '05.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '20', //20 ou 98 ), '06.1' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', //01 = Credito em conta correte, 03 = DOC ou TED ), '07.1' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '030', ), '08.1' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '09.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '10.1' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '11.1' => array( 'digitos' => 20, 'formato' => 'N', 'default' => '', ), '12.1' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '13.1' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '14.1' => array( 'digitos' => 12, 'formato' => 'N', 'default' => '', ), '15.1' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '16.1' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '17.1' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '18.1' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '', ), '19.1' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '20.1' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '21.1' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '22.1' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '23.1' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '24.1' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '25.1' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '26.1' => array( 'digitos' => 8, 'formato' => 'A', 'default' => '', ), '27.1' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), //fim do header do lote ); /** * Registro Detalhe - Segmento A (Obrigatório - Remessa) * * @var array */ protected $segmentoA = array( '01.3A' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', ), '02.3A' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0001', ), '03.3A' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '3', ), '04.3A' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '05.3A' => array( 'digitos' => 1, 'formato' => 'A', 'default' => 'A', ), '06.3A' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '07.3A' => array( 'digitos' => 2, 'formato' => 'N', 'default' => '', ), '08.3A' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '09.3A' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '10.3A' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '11.3A' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '12.3A' => array( 'digitos' => 12, 'formato' => 'N', 'default' => '', ), '13.3A' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '14.3A' => array( 'digitos' => 1, 'formato' => 'A', 'default' => '', ), '15.3A' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '16.3A' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '17.3A' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '18.3A' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '19.3A' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '20.3A' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '21.3A' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '22.3A' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '23.3A' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '24.3A' => array( 'digitos' => 40, 'formato' => 'A', 'default' => '', ), '25.3A' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '26.3A' => array( 'digitos' => 5, 'formato' => 'A', 'default' => '', ), '27.3A' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '28.3A' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '29.3A' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '30.3A' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), ); /** * Registro Detalhe - Segmento B (Obrigatório - Remessa) * * @var array */ protected $segmentoB = array( '01.3B' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', ), '02.3B' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0001', ), '03.3B' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '3', ), '04.3B' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '05.3B' => array( 'digitos' => 1, 'formato' => 'A', 'default' => 'B', ), '06.3B' => array( 'digitos' => 3, 'formato' => 'A', 'default' => '', ), '07.3B' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '', ), '08.3B' => array( 'digitos' => 14, 'formato' => 'N', 'default' => '', ), '09.3B' => array( 'digitos' => 30, 'formato' => 'A', 'default' => '', ), '10.3B' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '11.3B' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '12.3B' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '13.3B' => array( 'digitos' => 20, 'formato' => 'A', 'default' => '', ), '14.3B' => array( 'digitos' => 5, 'formato' => 'N', 'default' => '', ), '15.3B' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '', ), '16.3B' => array( 'digitos' => 2, 'formato' => 'A', 'default' => '', ), '17.3B' => array( 'digitos' => 8, 'formato' => 'N', 'default' => '', ), '18.3B' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '19.3B' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '20.3B' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '21.3B' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '22.3B' => array( 'digitos' => 15, 'formato' => 'N', 'default' => '', ), '23.3B' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), '24.3B' => array( 'digitos' => 15, 'formato' => 'A', 'default' => '', ), ); protected $traillerLote = array( '01.5' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', ), '02.5' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '0001', ), '03.5' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '5', ), '04.5' => array( 'digitos' => 9, 'formato' => 'A', 'default' => '', ), '05.5' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '06.5' => array( 'digitos' => 18, 'formato' => 'N', 'default' => '', ), '07.5' => array( 'digitos' => 189, 'formato' => 'A', 'default' => '', ), '08.5' => array( 'digitos' => 10, 'formato' => 'A', 'default' => '', ), ); protected $traillerArquivo = array( '01.9' => array( 'digitos' => 3, 'formato' => 'N', 'default' => '389', ), '02.9' => array( 'digitos' => 4, 'formato' => 'N', 'default' => '9999', ), '03.9' => array( 'digitos' => 1, 'formato' => 'N', 'default' => '9', ), '04.9' => array( 'digitos' => 9, 'formato' => 'A', 'default' => '', ), '05.9' => array( 'digitos' => 6, 'formato' => 'N', 'default' => 1, //quantidade de lotes do arquivo ), '06.9' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '', ), '07.9' => array( 'digitos' => 6, 'formato' => 'N', 'default' => '000000', ), '08.9' => array( 'digitos' => 205, 'formato' => 'A', 'default' => '', ), ); protected $empresa; protected $conta; protected $bancoId; protected $codigoRemessa; protected $pagamentos = array(); protected $dataPagamento = null; protected $tipoTransferencia = 'DOC'; public function __construct($lancamentos, $conta, $tipoTransferencia, $dataPagamento = null, $codigoRemessa = 1) { $this->pagamentos = (new Model_ProtocoloPagamento)->listarProtocolosParaQuitar(['protocolo_pagamento_id' => $lancamentos]); $this->empresa = $conta->findParentRow('Model_DbTable_Empresa'); $this->conta = $conta; $this->bancoId = $conta->banco_id; $this->codigoRemessa = $codigoRemessa; $this->dataPagamento = Zend_Date::now()->get('ddMMyyyy'); $this->tipoTransferencia = $tipoTransferencia; if( !empty($dataPagamento) ){ $dt = new Zend_Date($dataPagamento); $this->dataPagamento = $dt->get('ddMMyyyy'); } $this->setFileName($conta->agencia . $conta->conta . Zend_Date::now()->get('ddMMyyyy')); $this->setExtensao("TXT"); } protected function gerarHeaderArquivo() { $data = Zend_Date::now(); $h = array( '06.0' => $this->empresa->cnpj, '07.0' => $this->conta->convenio, '08.0' => $this->conta->agencia, '09.0' => $this->conta->agencia_dv, '10.0' => $this->conta->conta, '11.0' => $this->conta->conta_dv, '13.0' => $this->empresa->razao_social, '17.0' => $data->get('ddMMyyyy'), '18.0' => $data->get('HHmmss'), '19.0' => $this->numero, ); return $this->formatar($this->headerArquivo, $h); } protected function gerarTrailerArquivo($registroNoLote) { $t = array( '06.9' => $registroNoLote ); return $this->formatar($this->traillerArquivo, $t); } protected function gerarTraillerLote($valorTotal, $qtdRegistros) { $t = array( '05.5' => $qtdRegistros, //quantidade de registros no lote '06.5' => Zend_Locale_Format::toFloat($valorTotal, array('precision' => 2)), //valor total do borderô ); return $this->formatar($this->traillerLote, $t); } protected function gerarHeaderLote() { $h = array( '06.1' => '03', //Forma de pagamento '09.1' => '2', //Tipo de inscrição da empresa. 1= CPF, 2=CNPJ '10.1' => $this->empresa->cnpj, '11.1' => $this->conta->convenio, '12.1' => $this->conta->agencia, '13.1' => $this->conta->agencia_dv, '14.1' => $this->conta->conta, '15.1' => $this->conta->conta_dv, '17.1' => $this->empresa->razao_social, '19.1' => $this->empresa->endereco, '20.1' => $this->empresa->numero, //numero do endereco '21.1' => $this->empresa->complemento, '22.1' => $this->empresa->cidade, '23.1' => substr($this->empresa->cep, 0, 5), '24.1' => substr($this->empresa->cep, 5, 3), '25.1' => $this->empresa->uf, ); return $this->formatar($this->headerLote, $h); } protected function gerarSegmentoA($pagamento, $registroNoLote) { $valorPagamento = $this->_getValorPagto($pagamento); $a = array( '04.3A' => $registroNoLote, '09.3A' => $pagamento['banco'], '10.3A' => $pagamento['agencia'], '12.3A' => substr($pagamento['conta'], 0, strlen($pagamento['conta'])-1), '13.3A' => substr($pagamento['conta'], strlen($pagamento['conta'])-1, 1), '15.3A' => $pagamento['titular'], '16.3A' => $pagamento['id'], //identificação da empresa = nº do protocolo '17.3A' => Zend_Date::now()->get('ddMMyyyy'), //data do pagamento '20.3A' => Zend_Locale_Format::toFloat($valorPagamento, array('precision' => 2)), //valor do pagamento '22.3A' => $this->dataPagamento, //data real da efetivação do pagamento '23.3A' => Zend_Locale_Format::toFloat($valorPagamento, array('precision' => 2)), //valor real da efetivação do pagamento '24.3A' => "Yuppie - Protocolo {$pagamento['id']}", //outras informações '25.3A' => '', //se for DOC ou TED preencher indicando o tipo da conta '26.3A' => '10', //10 = transferência entre contas de titularidade diferentes ); //CC = crédito em conta if( $this->tipoTransferencia != 'CC' ){ if( $pagamento['tipo_conta'] == "CP" ){ $a['25.3A'] = 11; //Crédito em conta poupança }else{ $a['25.3A'] = '01'; //Crédito em conta corrente } } return $this->formatar($this->segmentoA, $a); } protected function gerarSegmentoB($pagamento, $registroNoLote) { $corretor = (new Model_Corretor())->exibir($pagamento['corretor_id']); $valorPagamento = $this->_getValorPagto($pagamento); $b = array( '04.3B' => $registroNoLote, '07.3B' => strlen($pagamento['cpf_titular']) > 11 ? 2 : 1, '08.3B' => $pagamento['cpf_titular'], '09.3B' => $corretor->endereco, '10.3B' => $corretor->numero, //numero endereço '11.3B' => $corretor->complemento, '12.3B' => $corretor->bairro, '13.3B' => $corretor->cidade, '14.3B' => substr($corretor->cep, 0, 5), '15.3B' => substr($corretor->cep, 5, 3), '16.3B' => $corretor->uf, '17.3B' => $this->dataPagamento, '18.3B' => Zend_Locale_Format::toFloat($valorPagamento, array('precision' => 2)), ); return $this->formatar($this->segmentoB, $b); } protected function _getValorPagto($pagamento) { $taxaTransf = isset($pagamento['taxa_transferencia_banco']) && $pagamento['descontar_taxa_transf'] == 1 ? $pagamento['taxa_transferencia_banco'] : 0; if( (isset($pagamento['forma_pagamento_id']) && ($pagamento['forma_pagamento_id'] != 7)) || (!empty($valorComissao) && $valorComissao == 0) ){ $taxaTransf = 0; } $valorComissao = $pagamento['total_comissao']; $total = $valorComissao + $pagamento['acrescimo'] - $pagamento['desconto'] - $taxaTransf - $pagamento['recuperado']; return $total; } public function gerar() { if (count($this->pagamentos) == 0) { throw new Exception('Lista de lançamentos vazia'); } $arquivoRemessa = new Model_DbTable_ArquivoRemessa(); $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->empresa->id, 'banco_id' => $this->bancoId)); $this->numero = $remessa->save(); $arquivo = array( $this->gerarHeaderArquivo(), $this->gerarHeaderLote() ); $i=1; $valorTotal = 0; foreach($this->pagamentos as $pagamento) { $pagamento['codigo_remessa'] = !empty($pagamento['codigo_remessa']) ? $pagamento['codigo_remessa'] : $this->codigoRemessa; $arquivo[] = $this->gerarSegmentoA($pagamento, $i++); $arquivo[] = $this->gerarSegmentoB($pagamento, $i++); $valorTotal += $this->_getValorPagto($pagamento); (new Model_DbTable_ProtocoloPagamento())->update([ 'gerado_remessa' => 1, 'codigo_remessa' => $pagamento['codigo_remessa'], 'numero_remessa' => $this->numero, ], ['id = ?' => $pagamento['id']]); } $i++; //incrementa mais um para contabilizar o trailler do lote $arquivo[] = $this->gerarTraillerLote($valorTotal, $i++); $i++; //incrementa mais um para contabilizar o trailler do arquivo $arquivo[] = $this->gerarTrailerArquivo($i++); return implode("\r\n", $arquivo) . "\r\n"; } }
💾 保存文件
← 返回文件管理器