Commit 65465a28 authored by Muhammad Fahrul's avatar Muhammad Fahrul

Initial commit

parents
<?php
class SingleSettlement
{
public $operator_code;
public $site_code;
public function __construct($operator_code, $site_code) {
$this->operator_code = $operator_code;
$this->site_code = $site_code;
}
public function create($data) {
$results['status'] = false;
$results['message'] = 'Empty data!';
$results['data'] = [];
// Perform validation
$data = $this->validateData($data);
// Display errors if any
if (!empty($data['errors'])) {
foreach ($data['errors'] as $field => $fieldErrors) {
$listErrorValidate[] = $fieldErrors;
}
$results['message'] = implode(", ", $listErrorValidate);
$results['data'] = $data['data'];
return $results;
}
$data = $data['data'];
// Sorting the transactions by timestamp_format in descending order
usort($data, function($a, $b) {
return strtotime($b['timestamp_format']) - strtotime($a['timestamp_format']);
});
$newline = "\r\n";
$operatorCode = $this->operator_code;
$terminalCode = $this->site_code;
$locationCode = $operatorCode . $terminalCode;
// Last Transaction Time
$selectDate = $data[0]['timestamp_format'];
$date = new \DateTime($selectDate);
// $timestampFormat = $date->format('dmy') . "235959";
$timestampFormat = $date->format('dmyHis');
$sendDate = $date->format('dmy') . "235959";
$forFuture = "0000";
$sequence = "01";
$totalRowContent = 0;
$totalTrx = $this->whereBankCode($data, ['0', '3', '2', '1', '5', '4', '7']);
$totalRowTrx = $totalTrx['count'];
$totalRowTrx = str_pad($totalRowTrx, 6, "0", STR_PAD_LEFT);
$totalAmountTrx = $totalTrx['sum'];
$totalAmountTrx = str_pad($totalAmountTrx, 9, "0", STR_PAD_LEFT);
$str = $totalRowTrx . $totalAmountTrx . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = 0;
$totalTrxMandiri = $this->whereBankCode($data, ['0']);
$totalRowTrxMandiri = $totalTrxMandiri['count'];
$totalAmountTrxMandiri = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxMandiri > 0) {
$totalRowTrxMandiri = str_pad($totalRowTrxMandiri, 6, "0", STR_PAD_LEFT);
$totalAmountTrxMandiri = $totalTrxMandiri['sum'];
$totalAmountTrxMandiri = str_pad($totalAmountTrxMandiri, 9, "0", STR_PAD_LEFT);
$str .= '01' . $totalRowTrxMandiri . $totalAmountTrxMandiri . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
$totalTrxBNI = $this->whereBankCode($data, ['3']);
$totalRowTrxBNI = $totalTrxBNI['count'];
$totalAmountTrxBNI = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxBNI > 0) {
$totalRowTrxBNI = str_pad($totalRowTrxBNI, 6, "0", STR_PAD_LEFT);
$totalAmountTrxBNI = $totalTrxBNI['sum'];
$totalAmountTrxBNI = str_pad($totalAmountTrxBNI, 9, "0", STR_PAD_LEFT);
$str .= '02' . $totalRowTrxBNI . $totalAmountTrxBNI . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
$totalTrxBRIDesfire = $this->whereBankCode($data, ['2']);
$totalRowTrxBRIDesfire = $totalTrxBRIDesfire['count'];
$totalAmountTrxBRIDesfire = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxBRIDesfire > 0) {
$totalRowTrxBRIDesfire = str_pad($totalRowTrxBRIDesfire, 6, "0", STR_PAD_LEFT);
$totalAmountTrxBRIDesfire = $totalTrxBRIDesfire['sum'];
$totalAmountTrxBRIDesfire = str_pad($totalAmountTrxBRIDesfire, 9, "0", STR_PAD_LEFT);
$str .= '03' . $totalRowTrxBRIDesfire . $totalAmountTrxBRIDesfire . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
$totalTrxBRIJava = $this->whereBankCode($data, ['1']);
$totalRowTrxBRIJava = $totalTrxBRIJava['count'];
$totalAmountTrxBRIJava = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxBRIJava > 0) {
$totalRowTrxBRIJava = str_pad($totalRowTrxBRIJava, 6, "0", STR_PAD_LEFT);
$totalAmountTrxBRIJava = $totalTrxBRIJava['sum'];
$totalAmountTrxBRIJava = str_pad($totalAmountTrxBRIJava, 9, "0", STR_PAD_LEFT);
$str .= '04' . $totalRowTrxBRIJava . $totalAmountTrxBRIJava . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
$totalTrxBCA = $this->whereBankCode($data, ['5']);
$totalRowTrxBCA = $totalTrxBCA['count'];
$totalAmountTrxBCA = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxBCA > 0) {
$totalRowTrxBCA = str_pad($totalRowTrxBCA, 6, "0", STR_PAD_LEFT);
$totalAmountTrxBCA = $totalTrxBCA['sum'];
$totalAmountTrxBCA = str_pad($totalAmountTrxBCA, 9, "0", STR_PAD_LEFT);
$str .= '05' . $totalRowTrxBCA . $totalAmountTrxBCA . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
$totalTrxDKI = $this->whereBankCode($data, ['4', '7']);
$totalRowTrxDKI = $totalTrxDKI['count'];
$totalAmountTrxDKI = str_pad(0, 9, "0", STR_PAD_LEFT);
if ($totalRowTrxDKI > 0) {
$totalRowTrxDKI = str_pad($totalRowTrxDKI, 6, "0", STR_PAD_LEFT);
$totalAmountTrxDKI = $totalTrxDKI['sum'];
$totalAmountTrxDKI = str_pad($totalAmountTrxDKI, 9, "0", STR_PAD_LEFT);
$str .= '06' . $totalRowTrxDKI . $totalAmountTrxDKI . $newline;
$totalRowContent = $totalRowContent + 1;
$totalBank = $totalBank + 1;
}
if ($totalRowTrx > 0) {
for ($i = 0; $i < count($data); $i++) {
$str .= base64_encode($data[$i]['sam_report']) . $newline;
$totalRowContent = $totalRowContent + 1;
}
$totalRowContent = $totalRowContent + 1;
$totalRowContent = str_pad($totalRowContent, 4, "0", STR_PAD_LEFT);
$totalBank = str_pad($totalBank, 2, "0", STR_PAD_LEFT);
$str .= $operatorCode . $totalBank . $totalRowContent;
$formatfile = $operatorCode . $locationCode . $timestampFormat . $sendDate . $forFuture . '_' . $sequence;
$settlement_id = str_replace('.', '', microtime(true));
$results['status'] = true;
$results['message'] = 'Success create settlement';
$results['data'] = [
'settlement_id' => $settlement_id,
'filename' => $formatfile,
'business_date' => $date->format('Y-m-d'),
'total_row' => ($totalRowTrx + 0),
'total_amount' => ($totalAmountTrx + 0),
'bri_row' => ($totalRowTrxBRIDesfire + $totalRowTrxBRIJava),
'bri_amount' => ($totalAmountTrxBRIDesfire + $totalAmountTrxBRIJava),
'bca_row' => ($totalRowTrxBCA + 0),
'bca_amount' => ($totalAmountTrxBCA + 0),
'bni_row' => ($totalRowTrxBNI + 0),
'bni_amount' => ($totalAmountTrxBNI + 0),
'mandiri_row' => ($totalRowTrxMandiri + 0),
'mandiri_amount' => ($totalAmountTrxMandiri + 0),
'dki_row' => ($totalRowTrxDKI + 0),
'dki_amount' => ($totalAmountTrxDKI + 0),
'content' => $str,
// 'sent_at' => date('Y-m-d H:i:s'),
// 'last_sent_at' => date('Y-m-d H:i:s'),
'created_at' => date('Y-m-d H:i:s')
];
}
return $results;
}
function validateData($data) {
$errors = [];
foreach ($data as $key => $item) {
if (!isset($item['sam_report']) || empty($item['sam_report'])) {
$errors[] = "sam_report is required for item at index $key.";
}
}
if (!empty($errors)) {
return [
'errors' => $errors,
'data' => $data
];
}
foreach ($data as $key => $item) {
$parsingSamReport = $this->parsingSamReport($item['sam_report']);
$data[$key] = array_merge($item, $parsingSamReport);
}
foreach ($data as $key => $item) {
if (!isset($item['deduct_report']) || empty($item['deduct_report'])) {
$errors[] = "deduct_report is required for item at index $key.";
}
if (!isset($item['bank_code']) || empty($item['bank_code'])) {
$zeroValidation = isset($item['bank_code']) && ($item['bank_code'] == "0" && $item['bank_code'] == 0);
if (!$zeroValidation) {
$errors[] = "bank_code is required for item at index $key.";
}
}
if (!isset($item['bank_mid']) || empty($item['bank_mid'])) {
$errors[] = "bank_mid is required for item at index $key.";
}
if (!isset($item['bank_tid']) || empty($item['bank_tid'])) {
$errors[] = "bank_tid is required for item at index $key.";
}
if (!isset($item['card_no']) || empty($item['card_no'])) {
$errors[] = "card_no is required for item at index $key.";
}
if (!isset($item['timestamp']) || empty($item['timestamp'])) {
$errors[] = "timestamp is required for item at index $key.";
}
if (!isset($item['amount']) || empty($item['amount']) || !is_numeric($item['amount'])) {
$errors[] = "amount is required and must be numeric for item at index $key.";
}
if (!isset($item['last_deposit']) || empty($item['last_deposit']) || !is_numeric($item['last_deposit'])) {
$errors[] = "last_deposit is required and must be numeric for item at index $key.";
}
}
if (!empty($errors)) {
return [
'errors' => $errors,
'data' => $data
];
}
foreach ($data as $key => $item) {
$item['timestamp_format'] = $this->extractTimestamp($item['timestamp']);
$item['amount_format'] = (int) $item['amount'];
$data[$key] = $item;
}
foreach ($data as $key => $item) {
if (!isset($item['timestamp_format']) || empty($item['timestamp_format']) || !strtotime($item['timestamp_format'])) {
$errors[] = "timestamp_format is required and must be in Y-m-d H:i:s format for item at index $key.";
}
if (!isset($item['amount_format']) || empty($item['amount_format']) || !is_numeric($item['amount_format'])) {
$errors[] = "amount_format is required and must be numeric for item at index $key.";
}
}
if (!($this->validateTimestampFormat($data))) {
$errors[] = "timestamp_format must be same date";
}
return [
'errors' => $errors,
'data' => $data
];
}
function parsingSamReport($sam_report)
{
$sam_report = explode(',', $sam_report);
$deductReport = $sam_report[0];
$bankCode = $sam_report[1];
$bankMid = $sam_report[2];
$bankTid = $sam_report[3];
$cardNo = $sam_report[4];
$timestamp = $sam_report[5];
$amount = $sam_report[6];
$lastDeposit = $sam_report[7];
$typeFW = !empty($sam_report[8]) ? $sam_report[8] : '1.0.0';
$results = [
'deduct_report' => $deductReport,
'bank_code' => $bankCode,
'bank_mid' => $bankMid,
'bank_tid' => $bankTid,
'card_no' => $cardNo,
'timestamp' => $timestamp,
'amount' => $amount,
'last_deposit' => $lastDeposit,
'type_fw' => $typeFW
];
return $results;
}
function extractTimestamp($timestamp)
{
$dateTimestamp = substr($timestamp, 0, -6);
$dateMonth = substr($dateTimestamp, 0, 4);
$date = substr($dateMonth, 0, 2);
$month = substr($dateMonth, 2, 2);
$year = str_replace($dateMonth, '', $dateTimestamp);
$timeTimestamp = str_replace($dateTimestamp, '', $timestamp);
$hour = substr($timeTimestamp, 0, 2);
$minute = substr($timeTimestamp, 2, 2);
$second = substr($timeTimestamp, 4, 2);
$results = $year . '-' . $month . '-' . $date . ' ' . $hour . ':' . $minute . ':' . $second;
return $results;
}
function validateTimestampFormat($data)
{
// Extract date from the first timestamp
$firstTimestamp = strtotime($data[0]['timestamp_format']);
$firstDate = date('Y-m-d', $firstTimestamp);
// Iterate through the rest of the timestamps
foreach ($data as $entry) {
$timestamp = strtotime($entry['timestamp_format']);
$date = date('Y-m-d', $timestamp);
// If any date is different from the first date, return false
if ($date !== $firstDate) {
return false;
}
}
// If all dates are the same, return true
return true;
}
function whereBankCode($data, $param) {
// Initialize count variable
$count = 0;
// Initialize sum variable
$sum = 0;
// Loop through the data array
foreach ($data as $item) {
// Check if the 'bank_code' of the current item is in the bankCodes array
if (in_array($item['bank_code'], $param)) {
// Increment count if the condition is met
$count++;
// Add the 'amount_format' value to the sum
$sum += $item['amount_format'];
}
}
return [
'count' => $count,
'sum' => $sum
];
}
}
?>
\ No newline at end of file
<?php
require_once('./SingleSettlement.php');
$operatorCode = '0053';
echo "Operator Code : $operatorCode";
echo PHP_EOL;
$siteCode = '00';
echo "Site Code : $siteCode";
echo PHP_EOL;
$data = json_decode('[{"report_sam":"603298407594505900840D706E89064206151301000120F2030000AFB8000023012416510000000006000283386FC8,0,0084,15130100,6032984075945059,23012024165100,0000001010,0000047279,R80.41uc"},{"report_sam":"603298100004665600030D706E86285851060128000120010000007D03000010112310575600060000E802038AF3F2,0,0001,06012800,6032981000046656,23012024105758,0000000001,0000000893,2.0.7"},{"report_sam":"603298407594505900840D706E8906420615130100012001000000A6BC0000220124151700000000000000834D1658,0,0084,15130100,6032984075945059,23012024151700,0000000001,0000048294,R80.41uc"},{"report_sam":"603298407594505900840D706E8906420615130100012001000000AEB80000230124190600000000070003832E39D4,0,0084,15130100,6032984075945059,23012024190600,0000000001,0000047278,R80.41uc"}]', true);
$results = (new SingleSettlement($operatorCode, $siteCode))->create($data);
echo "Data : " . json_encode($data, JSON_PRETTY_PRINT);
echo PHP_EOL;
echo "Results : " . json_encode($results, JSON_PRETTY_PRINT);
?>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment