<?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);
}