• File: index.php
  • Full Path: /var/www/sftpscriptsimo/index.php
  • Date Modified: 10/25/2021 8:19 PM
  • File size: 16.3 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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);

}