<?php //diretório onde estão localizados os ficheiros $currentDirectoryPath = "/var/sftp/uploads_simorede/"; //caminhos de ficheiros $validFilesPath = '/var/sftp/bkp/validfiles/'; $invalidFilesPath = '/var/sftp/bkp/invalidfiles/'; $env = "prod"; // se não for diretório não faz nada if (!is_dir($currentDirectoryPath)) { exit(); } // verificar se na pasta corrente tem ficheiros inválidos check_and_remove_invalid_files_to_dir(filesInDirectoryFn($currentDirectoryPath), $currentDirectoryPath, $invalidFilesPath); // executar o programa if ($env === "dev" && count(filesInDirectoryFn($currentDirectoryPath)) > 0) { execProgram(filesInDirectoryFn($currentDirectoryPath), $validFilesPath, $invalidFilesPath, $currentDirectoryPath, $env); } else if ($env === "prod" && count(filesInDirectoryFn($currentDirectoryPath)) > 0) { execProgram(filesInDirectoryFn($currentDirectoryPath), $validFilesPath, $invalidFilesPath, $currentDirectoryPath, $env); } else { return; } function filesInDirectoryFn($currentDirectoryPath) { //se for directório, remove os ficheiros desnecessários $filesInDirectory = scandir($currentDirectoryPath); if (count($filesInDirectory) != 0) { if ($filesInDirectory[0] == '.' && $filesInDirectory[1] == '..') { array_splice($filesInDirectory, 0, 2); } } return $filesInDirectory; } function execProgram($filesInDirectory, $validFilesPath, $invalidFilesPath, $currentDirectory, $env) { foreach ($filesInDirectory as $file) { if ($file !== 'index.php' && substr($file, 0, 10) === 'MEPS_11900') { $fileLines = read_file_and_get_lines($file, $currentDirectory); $treatedData = treat_file_lines($fileLines, $file, $invalidFilesPath, $currentDirectory, $env); if (is_array($treatedData)) { echo "<script> console.log(" . json_encode($treatedData) . "); </script>"; remove_valid_to_backup($currentDirectory . $file, $validFilesPath . $file); } } } } function check_invalid_content_on_meps_file( $header, $footer, $content, $file, $invalidFilesPath, $currentDirectory ) { $dirPath = $invalidFilesPath . $file; $filePath = $currentDirectory . $file; $total = 0; foreach ($content['contentData'] as $data) { $total += (double) $data['paid_amount']; } $totalFilePaidAmount = (double) $footer['footer']['total_net_transaction_amount']; $nrOfRecordsFile = (int) $footer['footer']['nr_of_content_recod']; $fileIsRemoved = false; if ( (count($content['contentData']) != $nrOfRecordsFile) || ($total != $totalFilePaidAmount) ) { $fileIsRemoved = rename($filePath, $dirPath); } if ( ($content['contentData'][0]['filler'] != 1) || ($header['header']['filler'] != 54) || ($footer['footer']['filler'] != 57) ) { if (!$fileIsRemoved) { $fileIsRemoved = rename($filePath, $dirPath); } } $dateOfContent = $content['contentData'][0]['datetime_of_transaction']; $dateOfContent = substr($dateOfContent, 0, 8); $dateOfContent = substr($dateOfContent, 0, 4) . '-' . substr($dateOfContent, 4, 2) . '-' . substr($dateOfContent, 6, 2); // timezone $dtz = new DateTimeZone("Africa/Maputo"); $dt = new DateTime("now", $dtz); $currentDate = $dt->format("Y-m-d"); $days = strtotime($currentDate) - strtotime($dateOfContent); $days = floor($days / (60 * 60 * 24)); if ($days > 1 && !$fileIsRemoved) { rename($filePath, $dirPath); } return $fileIsRemoved; } function check_and_remove_invalid_files_to_dir( $filesInDirectory, $currentDirectoryPath, $invalidFilesPath ) { $isRemoved = false; // echo "Existe somente o ficheiro index.php"; for ($i = 0; $i < sizeof($filesInDirectory); $i++) { // ficheiro $file = $filesInDirectory[$i]; // timezone $dtz = new DateTimeZone("Africa/Maputo"); $dt = new DateTime("now", $dtz); $currentDate = $dt->format("Y-m-d"); $currentDate = (int) str_replace("-", "", $currentDate); $currentTime = $dt->format('H:i:s'); $currentTime = (int) str_replace(":", "", $currentTime); $entity = substr($file, 0, 10); $fileDate = (int) substr($file, 11, 8); $fileTime = (int) substr($file, 20, 6); $lastOccurStr = (int) strripos($file, '_1'); if ($lastOccurStr == 25) { $fileTime = (int) substr($file, 19, 6); } /** Ficheiros diferentes de meps são removidos **/ if (($file !== 'index.php') && ($entity !== 'MEPS_11900')) { $isRemoved = rename($currentDirectoryPath . $file, $invalidFilesPath . $file); } /**Não consideramos ficheiros futuros**/ if (($entity == 'MEPS_11900') && ($currentDate < $fileDate) && !$isRemoved) { rename($currentDirectoryPath . $file, $invalidFilesPath . $file); } /**Ficheiros meps do mesmo dia, a hora do ficheiro não deve ser maior que a hora corrent**/ if (($entity == 'MEPS_11900') && ($currentDate === $fileDate) && ($currentTime <= $fileTime) && !$isRemoved) { rename($currentDirectoryPath . $file, $invalidFilesPath . $file); } /**Ficheiros meps a data corrente deve ser maior que a data do ficheiros, mais com dias não superiores a 1*/ $days = (int) $currentDate - (int) $fileDate; if (($entity == 'MEPS_11900') && ($currentDate > $fileDate) && ($days > 1) && !$isRemoved) { rename($currentDirectoryPath . $file, $invalidFilesPath . $file); } } } function remove_valid_to_backup($filePath, $dirPath) { rename($filePath, $dirPath); } function treat_file_lines($fileLines, $file, $invalidFilesPath, $currentDirectory, $env) { $header = $fileLines[0]; //primeira linha do ficheiro $footer = $fileLines[sizeof($fileLines) - 1]; //ultima linha do ficheiros $contentLength = sizeof($fileLines) - 2; //tamanho do conteúdo detalhe do ficheiro // resultado do tratamento das linhas do ficheiro $content_result = array('contentData' => get_content_line_data($fileLines, $contentLength)); $header_result = array('header' => get_header_line_data($header)); $footer_result = array('footer' => get_footer_line_data($footer)); if (check_invalid_content_on_meps_file( $header_result, $footer_result, $content_result, $file, $invalidFilesPath, $currentDirectory) ) { return true; } // salvar na base de dados dos dados $dbConnection = database_connection($env); // add header to db $header_id = add_header_to_database($dbConnection, $header_result['header']); // add footer to db $footer_id = add_footer_to_database($dbConnection, $footer_result['footer']); // Add content to db foreach ($content_result['contentData'] as $key => $content) { $content_id = add_content_to_database($dbConnection, $content, $header_id, $footer_id); $content_result['contentData'][$key]['content_id'] = $content_id; } // juntando os 3 array(header,footer e content) $meps_json_data = array_merge($header_result, $content_result, $footer_result); $url = null; //fechando a conneção com a base de dados ob_flush(); if ($env === "dev") { $url = "http://160.242.36.118:81/imaliapitest/public/api/recharge-by-reference"; } else if ($env === "prod") { $url = "https://172.16.50.2/imaliapi/public/api/recharge-by-reference"; } send_http_request_to_server($meps_json_data, $url); return $meps_json_data; } function get_content_line_data($fileLines, $contentLength) { $content = array(); for ($i = 1; $i <= $contentLength; $i++) { $record_type = (int) substr($fileLines[$i], 0, 1); $process_code = (int) substr($fileLines[$i], 1, 2); $log_id_interbancos_idenfifier = (int) substr($fileLines[$i], 3, 4); $interbancos_log_number = (int) substr($fileLines[$i], 7, 8); $datetime_of_transaction = (int) substr($fileLines[$i], 15, 12); $paid_amount = ((double) substr($fileLines[$i], 27, 13) * 0.01); $paid_tariff_fee = ((int) substr($fileLines[$i], 40, 9) * 0.01); $terminal_type = (int) substr($fileLines[$i], 49, 2); $terminal_id = (int) substr($fileLines[$i], 51, 10); $transaction_id = (int) substr($fileLines[$i], 61, 5); $terminal_locality = substr($fileLines[$i], 66, 15); $payment_reference = (int) substr($fileLines[$i], 81, 11); $communication_sending_mode = substr($fileLines[$i], 92, 1); $company_response_code = substr($fileLines[$i], 93, 1); $answer_identification_number = (int) substr($fileLines[$i], 94, 12); $filler = 1; // $filler=substr($fileLines[$i], 106,1); backup $newContent = array( 'record_type' => $record_type, 'process_code' => $process_code, 'log_id_interbancos_idenfifier' => $log_id_interbancos_idenfifier, 'interbancos_log_number' => $interbancos_log_number, 'datetime_of_transaction' => $datetime_of_transaction, 'paid_amount' => $paid_amount, 'paid_tariff_fee' => $paid_tariff_fee, 'terminal_type' => $terminal_type, 'terminal_id' => $transaction_id, 'transaction_id' => $transaction_id, 'terminal_locality' => $terminal_locality, 'payment_reference' => $payment_reference, 'communication_sending_mode' => $communication_sending_mode, 'company_response_code' => $company_response_code, 'answer_identification_number' => $answer_identification_number, 'filler' => $filler, ); array_push($content, $newContent); } return $content; } function get_header_line_data($header) { $recod_type = (int) substr($header, 0, 1); $file_type = substr($header, 1, 4); $id_of_origin_institution = (int) substr($header, 5, 8); $id_of_destiny_institution = (int) substr($header, 13, 8); $date_of_process = (int) substr($header, 21, 9); $id_last_file = (int) substr($header, 30, 9); $entity = (int) substr($header, 39, 5); $coin_code = (int) substr($header, 44, 3); $iva_fee = (int) substr($header, 47, 2); $log_identifier = (int) substr($header, 49, 4); $filler = 54; // $filler=substr($header,53,54); backup $header = array( 'record_type' => $recod_type, 'file_type' => $file_type, 'id_of_origin_institution' => $id_of_origin_institution, 'id_of_destiny_institution' => $id_of_destiny_institution, 'date_of_process' => $date_of_process, 'id_last_file' => $id_last_file, 'entity' => $entity, 'coin_code' => $coin_code, 'iva_fee' => $iva_fee, 'log_identifier' => $log_identifier, 'filler' => $filler, ); return $header; } function get_footer_line_data($footer) { $recod_type = (int) substr($footer, 0, 1); $nr_of_content_recod = (int) substr($footer, 1, 8); $total_net_transaction_amount = ((int) substr($footer, 9, 17) * 0.01); $total_tariff_fee = ((int) substr($footer, 26, 12) * 0.01); $iva = (int) substr($footer, 38, 12); $filler = 57; // $filler=substr($footer,50,57); backup $footer = array( 'record_type' => $recod_type, 'nr_of_content_recod' => $nr_of_content_recod, 'total_net_transaction_amount' => $total_net_transaction_amount, 'total_tariff_fee' => $total_tariff_fee, 'iva' => $iva, 'filler' => $filler, ); return $footer; } function read_file_and_get_lines($file, $currentDirectory) { $lines = array(); // abrir o ficheiro $fh = fopen($currentDirectory . $file, 'r'); //adicione as linhas do ficheiro no array $lines while ($line = fgets($fh)) { array_push($lines, $line); } fclose($fh); //fechar o ficheiro return $lines; } function add_content_to_database($con, $content, $header_id, $footer_id) { $ain = $content['answer_identification_number']; $csm = $content['communication_sending_mode']; $crc = $content['company_response_code']; $dot = $content['datetime_of_transaction']; $iln = $content['interbancos_log_number']; $liii = $content['log_id_interbancos_idenfifier']; $pa = $content['paid_amount']; $ptf = $content['paid_tariff_fee']; $pr = $content['payment_reference']; $pc = $content['process_code']; $rt = $content['record_type']; $ti = $content['terminal_id']; $tl = $content['terminal_locality']; $tt = $content['terminal_type']; $tsi = $content['transaction_id']; $filler = $content['filler']; $creates_at = date('Y-m-d H:i:s'); $updated_at = date('Y-m-d H:i:s'); mysqli_query($con, "INSERT INTO contents VALUES( null, '$ain', '$csm', '$crc', '$dot', '$iln', '$liii', '$pa', '$ptf', '$pr', '$pc', '$rt', '$ti', '$tl', '$tt', '$tsi', '$filler', 1, '$header_id', '$footer_id', '$creates_at','$updated_at');" ); return $con->insert_id; } function add_header_to_database($con, $header) { $cic = $header['coin_code']; $dofp = $header['date_of_process']; $entt = $header['entity']; $flt = $header['file_type']; $ilf = $header['id_last_file']; $lodi = $header['id_of_destiny_institution']; $iooi = $header['id_of_origin_institution']; $ivf = $header['iva_fee']; $lgi = $header['log_identifier']; $rct = $header['record_type']; $filler = $header['filler']; $creates_at = date('Y-m-d H:i:s'); $updated_at = date('Y-m-d H:i:s'); mysqli_query($con, "INSERT INTO headers VALUES( null, '$cic', '$dofp', '$entt', '$flt', '$ilf', '$lodi', '$iooi', '$ivf', '$lgi', '$rct', '$filler','$creates_at','$updated_at' );" ); return $con->insert_id; } function add_footer_to_database($con, $footer) { $rt = $footer['record_type']; $tnta = $footer['total_net_transaction_amount']; $ttf = $footer['total_tariff_fee']; $nocr = $footer['nr_of_content_recod']; $iva = $footer['iva']; $filler = $footer['filler']; $creates_at = date('Y-m-d H:i:s'); $updated_at = date('Y-m-d H:i:s'); mysqli_query($con, "INSERT INTO footers VALUES ( null, '$rt', '$tnta', '$ttf', '$nocr', '$iva', '$filler','$creates_at','$updated_at')" ); return $con->insert_id; } function database_connection($env) { $con = null; // iniciar sessão na base de dados ob_start(); // configurando o fuso horário $timezone = date_default_timezone_set('Africa/Maputo'); if ($env === "dev") { $con = mysqli_connect("127.0.0.1", "root", "", "paytekaf_meps"); } else if ($env === "prod") { $con = mysqli_connect("172.16.50.1", "rodb", "Ro_DB_1994", "payments"); } if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } return $con; } function send_http_request_to_server($data, $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Accept:application/json")); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (curl_error($ch)) { echo "Error: " . curl_error($ch); echo "\nStatusCode: :" . $httpCode; } echo "\Resultado:" . $result; curl_close($ch); }