*** Begin Patch *** Update File: app/Services/Hiscon/HisconParser.php @@ - = preg_replace( - [ - '/(BENEFICIO)(BASE)/', - '/(CALCULOTOTAL)/', - '/(COMPROMETIDOMAXIMO)/', - '/(PERMITIDOMARGEM)/', - '/(DISPONIVEL)(RMCR)/', - '/(DISPONIVEL)(RCC)/', - '/(EMPRESTIMOS)(RMC)/', - '/(RMC)(R\$)/', - '/(RCC)(R\$)/', - '/(CONSIGNAVEL)(MARGEM)/', - '/(UTILIZADA\*\*)(RCC)/', - '/(R\$[\d\.,]+)(VALORES)/' - ], - [ - "\nBASE", - "CALCULO\nTOTAL", - "COMPROMETIDO\nMAXIMO", - "PERMITIDO\nMARGEM", - "DISPONIVEL\nRMCR", - "DISPONIVEL\nRCC", - " ", - " ", - " ", - "\n", - "\n", - "\n" - ], - - ); + = preg_replace( + [ + '/(BENEFICIO)(BASE)/', + '/(CALCULOTOTAL)/', + '/(COMPROMETIDOMAXIMO)/', + '/(PERMITIDOMARGEM)/', + '/(DISPONIVEL)(RMCR)/', + '/(DISPONIVEL)(RCC)/', + '/(EMPRESTIMOS)(RMC)/', + '/(RMC)(R\$)/', + '/(RCC)(R\$)/', + '/(CONSIGNAVEL)(MARGEM)/', + '/(UTILIZADA\*\*)(RCC)/', + '/(R\$[\d\.,]+)(VALORES)/' + ], + [ + "\nBASE", + "CALCULO\nTOTAL", + "COMPROMETIDO\nMAXIMO", + "PERMITIDO\nMARGEM", + "DISPONIVEL\nRMCR", + "DISPONIVEL\nRCC", + " ", + " ", + " ", + "\n", + "\n", + "\n" + ], + + ); + + = preg_replace('/(R\$\s*[-\d\.,]+)(?=R\$)/', ' ', ); + = preg_replace('/(R\$\s*[-\d\.,]+)(?=[A-Z])/', ' ', ); return trim(); } @@ - private function parseMargins(string ): array - { - = []; - = [ - 'emprestimos' => [], - 'rmc' => [], - 'rcc' => [], - ]; - - if (preg_match('/VALORES DO BENEFICIO(.*?)(?:EMPRESTIMOS BANCARIOS|CONTRATOS ATIVOS|$)/su', , )) { - = ->extractCurrencyTokens([1] ?? ''); - = [ - 'base_de_calculo', - 'total_comprometido', - 'maximo_de_comprometimento_permitido', - 'margem_extrapolada', - ]; - - foreach ( as => ) { - = [] ?? null; - if ( === null || === '-') { - [] = null; - continue; - } - [] = ->toFloat(); - } - } - - if (preg_match('/Margem para Emprestimo\/Cartao e Resumo Financeiro(.*?)(?:VALORES DO BENEFICIO|EMPRESTIMOS BANCARIOS|CONTRATOS ATIVOS|$)/su', , )) { - = strtoupper((string) [1]); - = str_replace('-R$', ' -R$', ); - - = ['emprestimos', 'rmc', 'rcc']; - = [ - 'margem_disponivel' => 'MARGEM DISPONIVEL', - 'margem_reservada' => 'MARGEM RESERVADA', - 'margem_extrapolada' => 'MARGEM EXTRAPOLADA', - 'margem_utilizada' => 'MARGEM UTILIZADA', - ]; - - = []; - foreach ( as => ) { - = strpos(, ); - if ( !== false) { - [] = ; - } - } - asort(); - - = function (string , array ) use (&, ): void { - foreach ( as => ) { - = [] ?? null; - if ( === null || === '-') { - continue; - } - [][] = ->toFloat(); - } - }; - - = [array_key_first()] ?? null; - = strpos(, 'EMPRESTIMOS'); - if ( !== false && !== null && > ) { - = substr(, , - ); - = array_slice(->extractCurrencyTokens(), 0, count()); - if ( !== []) { - ('margem_consignavel', ); - } - } - - = array_keys(); - foreach ( as => ) { - = []; - = [ + 1] ?? null; - = !== null && isset([]) ? [] : strlen(); - = substr(, , - ); - = array_slice(->extractCurrencyTokens(), 0, count()); - if ( === []) { - continue; - } - (, ); - } - } - - = [ - 'margem_consignavel', - 'margem_disponivel', - 'margem_reservada', - 'margem_extrapolada', - 'margem_utilizada', - ]; - - foreach ( as => ) { - = []; - foreach ( as ) { - [] = [] ?? null; - } - [] = ; - } - - return [ - 'benefit' => , - 'per_modality' => , - ]; - } + private function parseMargins(string ): array + { + = [ + 'base_de_calculo' => null, + 'maximo_de_comprometimento_permitido' => null, + 'total_comprometido' => null, + 'margem_extrapolada' => null, + ]; + + = [ + 'emprestimos' => ->defaultModalityRow(), + 'rmc' => ->defaultModalityRow(), + 'rcc' => ->defaultModalityRow(), + ]; + + = ->extractBlock(, 'VALORES DO BENEFICIO', 'VALORES POR MODALIDADE'); + if ( !== null) { + = ->parseBenefitTable(); + } + + = ->extractBlock(, 'VALORES POR MODALIDADE', 'EMPRESTIMOS BANCARIOS'); + if ( !== null) { + = ->parseModalityTable(); + } + + return [ + 'benefit' => , + 'per_modality' => , + ]; + } + + /** + * @return array + */ + private function parseBenefitTable(string ): array + { + = [ + 'base_de_calculo' => null, + 'maximo_de_comprometimento_permitido' => null, + 'total_comprometido' => null, + 'margem_extrapolada' => null, + ]; + + = strtoupper(); + = [ + 'BASE DE CALCULO' => 'base_de_calculo', + 'MAXIMO DE COMPROMETIMENTO PERMITIDO' => 'maximo_de_comprometimento_permitido', + 'TOTAL COMPROMETIDO' => 'total_comprometido', + 'MARGEM EXTRAPOLADA' => 'margem_extrapolada', + ]; + + foreach ( as => ) { + if (preg_match('/' . preg_quote(, '/') . '\s*R\$\s*([-\d\.,]+)/u', , )) { + [] = ->toFloat('R$' . [1]); + } + } + + return ; + } + + /** + * @return array> + */ + private function parseModalityTable(string ): array + { + = ['emprestimos', 'rmc', 'rcc']; + = [ + 'emprestimos' => ->defaultModalityRow(), + 'rmc' => ->defaultModalityRow(), + 'rcc' => ->defaultModalityRow(), + ]; + + = strtoupper(); + = [ + 'MARGEM CONSIGNAVEL' => 'margem_consignavel', + 'MARGEM UTILIZADA' => 'margem_utilizada', + 'MARGEM RESERVADA' => 'margem_reservada', + 'MARGEM DISPONIVEL' => 'margem_disponivel', + 'MARGEM EXTRAPOLADA' => 'margem_extrapolada', + ]; + + = array_keys(); + = count(); + + for ( = 0; < ; ++) { + = []; + = [ + 1] ?? null; + = ->extractRowSegment(, , ); + = ->extractModalityValues(); + + foreach ( as => ) { + = [] ?? null; + [][[]] = ; + } + } + + return ; + } + + private function defaultModalityRow(): array + { + return [ + 'margem_consignavel' => null, + 'margem_utilizada' => null, + 'margem_reservada' => null, + 'margem_disponivel' => null, + 'margem_extrapolada' => null, + ]; + } + + private function extractBlock(string , string , ?string = null): ?string + { + = preg_quote(, '/'); + + if ( !== null) { + = preg_quote(, '/'); + if (preg_match('/' . . '.*?(?=' . . ')/is', , )) { + return trim([0]); + } + } elseif (preg_match('/' . . '.*$/is', , )) { + return trim([0]); + } + + return null; + } + + private function extractRowSegment(string , string , ?string ): string + { + = preg_quote(, '/'); + + if ( !== null) { + = preg_quote(, '/'); + if (preg_match('/' . . '.*?(?=' . . ')/s', , )) { + return [0]; + } + } elseif (preg_match('/' . . '.*$/s', , )) { + return [0]; + } + + return ''; + } + + /** + * @return array + */ + private function extractModalityValues(string ): array + { + if ( === '') { + return []; + } + + preg_match_all('/R\$\s*[-\d\.,]+|-/', , ); + + = []; + foreach ([0] as ) { + = trim(); + if ( === '-' || === '') { + [] = null; + continue; + } + + = rtrim(, '-'); + [] = ->toFloat(); + } + + return array_values(array_slice(, 0, 3)); + } *** End Patch