You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2440 lines
120 KiB

<?php
if (file_exists(__DIR__."/../pp-config.php")) {
if (file_exists(__DIR__.'/../maintenance.lock')) {
if (file_exists(__DIR__.'/../pp-include/pp-maintenance.php')) {
}else{
die('System is under maintenance. Please try again later.');
}
exit();
}else{
if (file_exists(__DIR__.'/../pp-include/pp-controller.php')) {
}else{
echo 'System is under maintenance. Please try again later.';
exit();
}
}
}else{
echo 'System is under maintenance. Please try again later.';
exit();
}
if(isset($_GET['logout'])){
logoutCookie();
?>
<script>
location.href="https://<?php echo $_SERVER['HTTP_HOST']?>/admin/login";
</script>
<?php
exit();
}
if (!defined('pp_allowed_access')) {
die('Direct access not allowed');
}
$global_setting_response = json_decode(getData($db_prefix.'settings', 'WHERE id="1"'), true);
$global_version = json_decode(file_get_contents(__DIR__.'/../version.json'), true);
if(checkCookie('pp_admin')){
$global_cookie_response = json_decode(getData($db_prefix.'browser_log', 'WHERE cookie="'.getCookie('pp_admin').'" AND status="active"'), true);
if($global_cookie_response['status'] == true){
$global_user_response = json_decode(getData($db_prefix.'admins', 'WHERE id="'.$global_cookie_response['response'][0]['a_id'].'" AND a_status="active"'), true);
if($global_user_response['status'] == true){
$global_user_login = true;
}else{
$global_user_login = false;
}
}else{
$global_user_login = false;
}
}else{
if(isset($_POST['pp_admin_session'])){
$global_cookie_response = json_decode(getData($db_prefix.'browser_log', 'WHERE cookie="'.$_POST['pp_admin_session'].'" AND status="active"'), true);
if($global_cookie_response['status'] == true){
$global_user_response = json_decode(getData($db_prefix.'admins', 'WHERE id="'.$global_cookie_response['response'][0]['a_id'].'" AND a_status="active"'), true);
if($global_user_response['status'] == true){
$global_user_login = true;
}else{
$global_user_login = false;
}
}else{
$global_user_login = false;
}
}else{
$global_user_login = false;
}
}
if(isset($_POST['action'])){
$action = escape_string($_POST['action']);
if($action == ""){
echo json_encode(['status' => "false", 'message' => 'Something Wrong!']);
}else{
if($action == "pp_admin_info"){
echo json_encode(['status' => "true", 'full_name' => $global_user_response['response'][0]['name'], 'username' => $global_user_response['response'][0]['username'], 'email' => $global_user_response['response'][0]['email']]);
}
if($action == "login"){
$email_username = escape_string($_POST['email_username']);
$password = escape_string($_POST['password']);
if($email_username == "" || $password == ""){
echo json_encode(['status' => "false", 'message' => 'Incorrect credentials']);
}else{
if (filter_var($email_username, FILTER_VALIDATE_EMAIL)) {
$sql_email_username = 'email = "'.$email_username.'" AND a_status = "active"';
}else{
$sql_email_username = 'username = "'.$email_username.'" AND a_status = "active"';
}
$response = json_decode(getData($db_prefix.'admins','WHERE '.$sql_email_username),true);
if($response['status'] == true){
if (password_verify($password, $response['response'][0]['password'])) {
$cookie = rand();
$userInfo = getUserDeviceInfo();
$columns = ['a_id', 'cookie', 'browser', 'device', 'ip', 'status', 'created_at'];
$values = [$response['response'][0]['id'], $cookie, $userInfo['browser'], $userInfo['device'], $userInfo['ip_address'], 'active', getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'browser_log', $columns, $values);
setsCookie('pp_admin', $cookie);
echo json_encode(['status' => "true", 'target' => "dashboard", 'session_token' => $cookie]);
}else{
echo json_encode(['status' => "false", 'message' => 'Incorrect credentials']);
}
}else{
echo json_encode(['status' => "false", 'message' => 'Incorrect credentials']);
}
}
}
if($action == "forgot-password"){
$password = escape_string($_POST['password']);
if($password == ""){
echo json_encode(['status' => "false", 'message' => 'Enter new password']);
}else{
if (isset($password_reset)) {
if($password_reset == "on"){
$hashedPass = password_hash($password, PASSWORD_BCRYPT);
$columns = ['password'];
$values = [$hashedPass];
$condition = "id = '1'";
updateData($db_prefix.'admins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => 'Password changed successfully']);
}else{
echo json_encode(['status' => "false", 'message' => 'Forgot Password is Disabled']);
}
}else{
echo json_encode(['status' => "false", 'message' => 'Forgot Password is Disabled']);
}
}
}
if ($action == "pp_view_dashboard") {
$total_transaction = 0;
$pending_transaction = 0;
$unpaid_invoice = 0;
$total_customers = 0;
$total_payment_links = 0;
$total_amount_received = 0;
$total_amount_refunded = 0;
$response = json_decode(getData($db_prefix.'transaction','WHERE transaction_status NOT IN ("initialize")'),true);
foreach($response['response'] as $row){
$total_transaction = $total_transaction+1;
if($row['transaction_status'] == "pending"){
$pending_transaction = $pending_transaction+1;
}
if($row['transaction_status'] == "refunded"){
$total_amount_refunded = $total_amount_refunded+1;
}else{
if($row['transaction_status'] == "failed"){
$total_amount_received = $total_amount_received+1;
}else{
$total_amount_received = $total_amount_received+1;
}
}
}
$response = json_decode(getData($db_prefix.'invoice','WHERE i_status = "unpaid"'),true);
foreach($response['response'] as $row){
$unpaid_invoice = $unpaid_invoice+1;
}
$response = json_decode(getData($db_prefix.'customer',''),true);
foreach($response['response'] as $row){
$total_customers = $total_customers+1;
}
$response = json_decode(getData($db_prefix.'payment_link','WHERE pl_status="active"'),true);
foreach($response['response'] as $row){
$total_payment_links = $total_payment_links+1;
}
$normal_data = [
"full_name" => $global_user_response['response'][0]['name'],
"total_transaction" => $total_transaction,
"pending_transaction" => $pending_transaction,
"unpaid_invoice" => $unpaid_invoice,
"total_customers" => $total_customers,
"total_payment_links" => $total_payment_links,
"total_amount_received" => $total_amount_received,
"total_amount_refunded" => $total_amount_refunded
];
$total_report_overview = 0;
$total_report_overview_complete = 0;
$global_cal= json_decode(getData($db_prefix.'transaction', 'WHERE transaction_status = "completed"'), true);
foreach($global_cal['response'] as $cal){
$total_amount = $cal['transaction_amount']+$cal['transaction_fee'];
$net_amount = $total_amount-$cal['transaction_refund_amount'];
$total_report_overview_complete += convertToDefault($net_amount, $cal['transaction_currency'], $global_setting_response['response'][0]['default_currency']);
}
$total_report_overview_pending = 0;
$global_cal= json_decode(getData($db_prefix.'transaction', 'WHERE transaction_status = "pending"'), true);
foreach($global_cal['response'] as $cal){
$total_amount = $cal['transaction_amount']+$cal['transaction_fee'];
$net_amount = $total_amount-$cal['transaction_refund_amount'];
$total_report_overview_pending += convertToDefault($net_amount, $cal['transaction_currency'], $global_setting_response['response'][0]['default_currency']);
}
$total_report_overview_refunded = 0;
$global_cal= json_decode(getData($db_prefix.'transaction', 'WHERE transaction_status = "refunded"'), true);
foreach($global_cal['response'] as $cal){
$total_amount = $cal['transaction_amount']+$cal['transaction_fee'];
$net_amount = $total_amount-$cal['transaction_refund_amount'];
$total_report_overview_refunded += convertToDefault($net_amount, $cal['transaction_currency'], $global_setting_response['response'][0]['default_currency']);
}
$total_report_overview_failed = 0;
$global_cal= json_decode(getData($db_prefix.'transaction', 'WHERE transaction_status = "failed"'), true);
foreach($global_cal['response'] as $cal){
$total_amount = $cal['transaction_amount']+$cal['transaction_fee'];
$net_amount = $total_amount-$cal['transaction_refund_amount'];
$total_report_overview_failed += convertToDefault($net_amount, $cal['transaction_currency'], $global_setting_response['response'][0]['default_currency']);
}
$total_report_overview = $total_report_overview_complete+$total_report_overview_pending+$total_report_overview_refunded+$total_report_overview_failed;
$total = $total_report_overview_complete
+ $total_report_overview_pending
+ $total_report_overview_refunded
+ $total_report_overview_failed;
if ($total > 0) {
$percent_complete = round(($total_report_overview_complete / $total) * 100, 2);
$percent_pending = round(($total_report_overview_pending / $total) * 100, 2);
$percent_refunded = round(($total_report_overview_refunded / $total) * 100, 2);
$percent_failed = round(($total_report_overview_failed / $total) * 100, 2);
} else {
// All values are 0 — so all percentages are 0%
$percent_complete = 0;
$percent_pending = 0;
$percent_refunded = 0;
$percent_failed = 0;
}
$data_full_life_report = [
"completed" => $total_report_overview_complete,
"pending" => $total_report_overview_pending,
"refunded" => $total_report_overview_refunded,
"failed" => $total_report_overview_failed,
"currency" => $global_setting_response['response'][0]['default_currency']
];
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'today', null, null, 'transaction_status = "completed"');
$completedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'today', null, null, 'transaction_status = "pending"');
$pendingchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'today', null, null, 'transaction_status = "refunded"');
$refundedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'today', null, null, 'transaction_status = "failed"');
$failedchartData = json_decode($chartJson, true);
$data_every_day_month_year_report = [];
$data_every_day_month_year_report['today'] = [
"completed" => isset($completedchartData['data'][0]) ? str_replace(['[', ']'], '', $completedchartData['data'][0]) : "0",
"pending" => isset($pendingchartData['data'][0]) ? str_replace(['[', ']'], '', $pendingchartData['data'][0]) : "0",
"refunded" => isset($refundedchartData['data'][0]) ? str_replace(['[', ']'], '', $refundedchartData['data'][0]) : "0",
"failed" => isset($failedchartData['data'][0]) ? str_replace(['[', ']'], '', $failedchartData['data'][0]) : "0",
"currency" => ''
];
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'monthly', null, null, 'transaction_status = "completed"');
$completedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'monthly', null, null, 'transaction_status = "pending"');
$pendingchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'monthly', null, null, 'transaction_status = "refunded"');
$refundedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'monthly', null, null, 'transaction_status = "failed"');
$failedchartData = json_decode($chartJson, true);
$data_every_day_month_year_report['monthly'] = [
"completed" => isset($completedchartData['data'][0]) ? str_replace(['[', ']'], '', $completedchartData['data'][0]) : "0",
"pending" => isset($pendingchartData['data'][0]) ? str_replace(['[', ']'], '', $pendingchartData['data'][0]) : "0",
"refunded" => isset($refundedchartData['data'][0]) ? str_replace(['[', ']'], '', $refundedchartData['data'][0]) : "0",
"failed" => isset($failedchartData['data'][0]) ? str_replace(['[', ']'], '', $failedchartData['data'][0]) : "0",
"currency" => ''
];
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'yearly', null, null, 'transaction_status = "completed"');
$completedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'yearly', null, null, 'transaction_status = "pending"');
$pendingchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'yearly', null, null, 'transaction_status = "refunded"');
$refundedchartData = json_decode($chartJson, true);
$chartJson = getChart($db_prefix.'transaction', 'created_at', 'yearly', null, null, 'transaction_status = "failed"');
$failedchartData = json_decode($chartJson, true);
$data_every_day_month_year_report['yearly'] = [
"completed" => isset($completedchartData['data'][0]) ? str_replace(['[', ']'], '', $completedchartData['data'][0]) : "0",
"pending" => isset($pendingchartData['data'][0]) ? str_replace(['[', ']'], '', $pendingchartData['data'][0]) : "0",
"refunded" => isset($refundedchartData['data'][0]) ? str_replace(['[', ']'], '', $refundedchartData['data'][0]) : "0",
"failed" => isset($failedchartData['data'][0]) ? str_replace(['[', ']'], '', $failedchartData['data'][0]) : "0",
"currency" => ''
];
$json = [
"status" => "true",
"normal_data" => $normal_data,
"data_full_life_report" => $data_full_life_report,
"data_every_day_month_year_report" => $data_every_day_month_year_report
];
echo json_encode($json);
}
if($action == "pp_transaction"){
$transaction_status = $_POST['transaction_status'];
$search = escape_string($_POST['search']);
$visibility = escape_string($_POST['visibility']);
if($transaction_status == "all"){
$sql_rn = 'transaction_status NOT IN ("initialize") AND c_name LIKE "%'.$search.'%" OR transaction_status NOT IN ("initialize") AND c_email_mobile LIKE "%'.$search.'%" OR transaction_status NOT IN ("initialize") AND payment_method LIKE "%'.$search.'%" OR transaction_status NOT IN ("initialize") AND transaction_product_name LIKE "%'.$search.'%"';
}else{
$sql_rn = 'transaction_status = "'.$transaction_status.'" AND c_name LIKE "%'.$search.'%" OR transaction_status = "'.$transaction_status.'" AND c_email_mobile LIKE "%'.$search.'%" OR transaction_status = "'.$transaction_status.'" AND payment_method LIKE "%'.$search.'%" OR transaction_status = "'.$transaction_status.'" AND transaction_product_name LIKE "%'.$search.'%"';
}
if($visibility == 'limited'){
$limit = 10;
}else{
$limit = 20;
}
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$total = 0;
$response = json_decode(getData($db_prefix.'transaction','WHERE '.$sql_rn),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'transaction','WHERE '.$sql_rn.' ORDER BY 1 DESC LIMIT '.$limit.' OFFSET '.$offset),true);
foreach($response['response'] as $row){
$showing = $showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"pp_id" => $row["pp_id"],
"c_name" => $row["c_name"],
"c_email_mobile" => $row["c_email_mobile"],
"payment_method" => $row["payment_method"],
"transaction_amount" => number_format($row["transaction_amount"]+$row["transaction_fee"]-$row["transaction_refund_amount"], 2).' '.$row["transaction_currency"],
"sender" => $row["payment_sender_number"],
"transaction_id" => ($row["payment_verify_way"] ?? '') === 'slip' ? 'View Slip' : ($row["payment_verify_id"] ?? ''),
"transaction_fee" => $row["transaction_fee"],
"transaction_refund_amount" => $row["transaction_refund_amount"],
"transaction_currency" => $row["transaction_currency"],
"transaction_status" => $row["transaction_status"],
"created_at" => convertDateTime($row["created_at"])
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"showing" => $showing,
"total" => $total,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_view_transaction"){
$payment_id = $_POST['payment_id'];
// Fetch the transaction
$response = json_decode(getData($db_prefix . 'transaction', 'WHERE id="' . $payment_id . '"'), true);
$row = $response['response'][0]; // just to shorten notation
$product_meta = json_decode($row['transaction_product_meta'], true);
$view_product = [];
if (!empty($product_meta)) {
foreach ($product_meta as $key => $value) {
$view_product[] = [
"value_name" => ucwords(str_replace('_', ' ', $key)),
"value" => $value
];
}
}
$product_visibility = "true";
if($row["transaction_product_name"] == "" || $row["transaction_product_name"] == "--"){
$product_visibility = "false";
}
$json = [
"status" => "true",
"view_product" => $view_product,
"payment_id" => "#" . $row["id"],
"payment_date" => convertDateTime($row["created_at"]),
"payment_status" => $row["transaction_status"],
"txninfo_payment_method" => $row["payment_method"],
"txninfo_payment_currency" => $row["transaction_currency"],
"txninfo_transaction_id" => $row["payment_verify_id"],
"txninfo_amount" => number_format($row["transaction_amount"], 2).' '.$row["transaction_currency"],
"txninfo_processing_fee" => number_format($row["transaction_fee"], 2).' '.$row["transaction_currency"],
"txninfo_total_amount" => number_format($row["transaction_amount"] + $row["transaction_fee"], 2).' '.$row["transaction_currency"],
"txninfo_refunded_amount" => number_format($row["transaction_refund_amount"], 2).' '.$row["transaction_currency"],
"txninfo_net_amount" => number_format($row["transaction_amount"] + $row["transaction_fee"] - $row["transaction_refund_amount"], 2).' '.$row["transaction_currency"],
"customer_name" => $row["c_name"],
"customer_email_mobile" => $row["c_email_mobile"],
"product_visibility" => $product_visibility,
"product_name" => $row["transaction_product_name"] ?? "N/A",
"product_description" => $row["transaction_product_description"] ?? "N/A"
];
echo json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
if($action == "pp_basicinfo"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$fullname = escape_string($_POST['fullname']);
$username = escape_string($_POST['username']);
if($fullname == "" || $username == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['name', 'username'];
$values = [$fullname, $username];
$condition = "id = '".$global_user_response['response'][0]['id']."'";
updateData($db_prefix.'admins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Basic information updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_basicemail"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$email = escape_string($_POST['email']);
if($email == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['email'];
$values = [$email];
$condition = "id = '".$global_user_response['response'][0]['id']."'";
updateData($db_prefix.'admins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Email address updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_newpassword"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$currentpassword = escape_string($_POST['currentpassword']);
$newPassword = escape_string($_POST['newPassword']);
$confirmpassword = escape_string($_POST['confirmpassword']);
if($currentpassword == "" || $newPassword == "" || $confirmpassword == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
if (password_verify($currentpassword, $global_user_response['response'][0]['password'])) {
if($newPassword == $confirmpassword){
$hashedPass = password_hash($newPassword, PASSWORD_BCRYPT);
$columns = ['password'];
$values = [$hashedPass];
$condition = "id = '".$global_user_response['response'][0]['id']."'";
updateData($db_prefix.'admins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Password updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Incorrect New password & Confirm password']);
}
}else{
echo json_encode(['status' => "false", 'message' => 'Incorrect current password']);
}
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_systembasicinfo"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$sitename = escape_string($_POST['sitename']);
$default_timezone = escape_string($_POST['default_timezone']);
$default_currency = escape_string($_POST['default_currency']);
$currency_symbol = escape_string($_POST['currency_symbol']);
$currency_rate = escape_string($_POST['currency_rate']);
if($sitename == "" || $default_timezone == "" || $default_currency == "" || $currency_symbol == "" || $currency_rate == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['site_name', 'default_timezone', 'default_currency', 'currency_symbol'];
$values = [$sitename, $default_timezone, $default_currency, $currency_symbol];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Basic information updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp-theme-plugins-import"){
if ($mode == "demo") {
echo json_encode(["status" => "error", "message" => "Error: Demo mode is active"]);
exit();
}
if (!isset($_FILES['zip_file']) || $_FILES['zip_file']['error'] !== 0) {
echo json_encode(["status" => "error", "message" => "No file uploaded."]);
exit;
}
$zipTmpPath = $_FILES['zip_file']['tmp_name'];
$tempDir = __DIR__ . "/../temp_upload_" . time() . "/";
mkdir($tempDir, 0755, true);
// Extract ZIP
$zip = new ZipArchive();
if ($zip->open($zipTmpPath) === TRUE) {
$zip->extractTo($tempDir);
$zip->close();
} else {
echo json_encode(["status" => "error", "message" => "Failed to extract ZIP."]);
exit;
}
// Find plugin.json
$pluginJson = "";
foreach (glob($tempDir . "*/meta.json") as $file) {
$pluginJson = $file;
break;
}
if (!$pluginJson) {
// Try directly in root
if (file_exists($tempDir . "meta.json")) {
$pluginJson = $tempDir . "meta.json";
} else {
echo json_encode(["status" => "error", "message" => "meta.json not found in the ZIP."]);
exit;
}
}
// Parse plugin.json
$data = json_decode(file_get_contents($pluginJson), true);
$type = $data['type'] ?? null; // plugin or theme
$slug = $data['slug'] ?? null;
$mrdr = $data['mrdr'] ?? null;
if (!$type || !$slug || !$mrdr) {
echo json_encode(["status" => "error", "message" => "plugin.json must include type, slug, and mrdr."]);
exit;
}
// Final destination: pp-content/plugins/modules/myplugin/
$basePath = __DIR__ . "/../pp-content/" . $type . "/" . $mrdr . "/" . $slug . "/";
if (!is_dir($basePath)) {
mkdir($basePath, 0755, true);
}
// Copy files
function copyFolder($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..') {
$srcPath = $src . '/' . $file;
$dstPath = $dst . '/' . $file;
if (is_dir($srcPath)) {
copyFolder($srcPath, $dstPath);
} else {
copy($srcPath, $dstPath);
}
}
}
closedir($dir);
}
// Figure out if zip had subfolder (e.g., myplugin/plugin.json)
$rootItems = glob($tempDir . "*");
if (count($rootItems) === 1 && is_dir($rootItems[0])) {
// ZIP had a folder
copyFolder($rootItems[0], $basePath);
} else {
// ZIP had files directly
copyFolder($tempDir, $basePath);
}
// Cleanup
function deleteFolders($folder) {
foreach (glob($folder . '/*') as $file) {
if (is_dir($file)) {
deleteFolders($file);
} else {
unlink($file);
}
}
rmdir($folder);
}
deleteFolders($tempDir);
echo json_encode([
"status" => "success",
"message" => "Uploaded successfully to $type/$mrdr/$slug/"
]);
}
if($action == "pp_savecolorscheme"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$global_text_color = escape_string($_POST['global_text_color']);
$primary_button_color = escape_string($_POST['primary_button_color']);
$button_text_color = escape_string($_POST['button_text_color']);
$button_hover_color = escape_string($_POST['button_hover_color']);
$button_hover_text_color = escape_string($_POST['button_hover_text_color']);
$navigation_background = escape_string($_POST['navigation_background']);
$navigation_text_color = escape_string($_POST['navigation_text_color']);
$active_tab_color = escape_string($_POST['active_tab_color']);
$active_tab_text_color = escape_string($_POST['active_tab_text_color']);
if($global_text_color == "" || $primary_button_color == "" || $button_text_color == "" || $button_hover_color == "" || $button_hover_text_color == "" || $navigation_background == "" || $navigation_text_color == "" || $active_tab_color == "" || $active_tab_text_color == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['global_text_color', 'primary_button_color', 'button_text_color', 'button_hover_color', 'button_hover_text_color', 'navigation_background', 'navigation_text_color', 'active_tab_color', 'active_tab_text_color'];
$values = [$global_text_color, $primary_button_color, $button_text_color, $button_hover_color, $button_hover_text_color, $navigation_background, $navigation_text_color, $active_tab_color, $active_tab_text_color];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Color scheme updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_resetcolorscheme"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
if($global_user_login == true){
$columns = ['global_text_color', 'primary_button_color', 'button_text_color', 'button_hover_color', 'button_hover_text_color', 'navigation_background', 'navigation_text_color', 'active_tab_color', 'active_tab_text_color'];
$values = ['#3bb77e', '#3bb77e', '#FFFFFF', '#20bb74', '#FFFFFF', '#20bb74', '#FFFFFF', '#20bb74', '#FFFFFF'];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Color scheme updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
if($action == "pp_branding"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
if($global_user_login == true){
$max_file_size = 10 * 1024 * 1024;
$branding_favicon = json_decode(uploadImage($_FILES['branding_favicon']?? null, $max_file_size), true);
if($branding_favicon['status'] == true){
$branding_favicon = 'https://'.$_SERVER['HTTP_HOST'].'/pp-external/media/'.$branding_favicon['file'];
deleteImage($global_setting_response['response'][0]['favicon']);
}else{
$branding_favicon = $global_setting_response['response'][0]['favicon'];
}
$branding_logo = json_decode(uploadImage($_FILES['branding_logo']?? null, $max_file_size), true);
if($branding_logo['status'] == true){
$branding_logo = 'https://'.$_SERVER['HTTP_HOST'].'/pp-external/media/'.$branding_logo['file'];
deleteImage($global_setting_response['response'][0]['logo']);
}else{
$branding_logo = $global_setting_response['response'][0]['logo'];
}
$columns = ['logo', 'favicon'];
$values = [$branding_logo, $branding_favicon];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Branding updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
if($action == "pp_savebusiness_details"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$business_details_street_address = escape_string($_POST['business_details_street_address']);
$business_details_city_town = escape_string($_POST['business_details_city_town']);
$business_details_postal_code = escape_string($_POST['business_details_postal_code']);
$business_details_country = escape_string($_POST['business_details_country']);
if($business_details_street_address == "" || $business_details_city_town == "" || $business_details_postal_code == "" || $business_details_country == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['street_address', 'city_town', 'postal_zip_code', 'country'];
$values = [$business_details_street_address, $business_details_city_town, $business_details_postal_code, $business_details_country];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Business details updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_savesupport_contact"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$support_contact_phone_mobile = escape_string($_POST['support_contact_phone_mobile']);
$support_contact_email_addrss = escape_string($_POST['support_contact_email_addrss']);
$support_contact_support_website = escape_string($_POST['support_contact_support_website']);
$support_contact_facebok_page = escape_string($_POST['support_contact_facebok_page']);
$support_contact_messenger = escape_string($_POST['support_contact_messenger']);
$support_contact_whatsapp = escape_string($_POST['support_contact_whatsapp']);
$support_contact_telegram = escape_string($_POST['support_contact_telegram']);
$support_contact_youtube = escape_string($_POST['support_contact_youtube']);
if($support_contact_phone_mobile == "" || $support_contact_email_addrss == "" || $support_contact_support_website == "" || $support_contact_facebok_page == "" || $support_contact_messenger == "" || $support_contact_whatsapp == "" || $support_contact_telegram == "" || $support_contact_youtube == ""){
echo json_encode(['status' => "false", 'message' => 'Fill all required field']);
}else{
if($global_user_login == true){
$columns = ['support_phone_number', 'support_email_address', 'support_website', 'facebook_page', 'facebook_messenger', 'whatsapp_number', 'telegram', 'youtube_channel'];
$values = [$support_contact_phone_mobile, $support_contact_email_addrss, $support_contact_support_website, $support_contact_facebok_page, $support_contact_messenger, $support_contact_whatsapp, $support_contact_telegram, $support_contact_youtube];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Contact information updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
}
if($action == "pp_generate_api"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$api_key = rand().uniqid().rand().rand().uniqid().rand();
if($global_user_login == true){
$columns = ['api_key'];
$values = [$api_key];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'api' => $api_key]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
if($action == "pp_view_currency_list"){
$pp_transaction = [];
$response = json_decode(getData($db_prefix.'currency',""),true);
foreach($response['response'] as $row){
$pp_transaction[] = [
"name" => $row["currency_name"].' - ('.$row["currency_code"].')'
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
]);
}
if($action == "pp_currency_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$total = 0;
$response = json_decode(getData($db_prefix.'currency',"WHERE currency_code LIKE '%$search%' OR currency_name LIKE '%$search%'"),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'currency',"WHERE currency_code LIKE '%$search%' OR currency_name LIKE '%$search%' LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"currency_code" => $row["currency_code"],
"currency_name" => $row["currency_name"],
"currency_symbol" => $row["currency_symbol"],
"currency_rate" => $row["currency_rate"],
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_currencysetting"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$currency_id = escape_string($_POST['currency_id']);
$currency_rate = escape_string($_POST['currency_rate']);
$response = json_decode(getData($db_prefix.'currency',"WHERE id ='".$currency_id."'"),true);
if($response['status'] == true){
$columns = ['currency_rate', 'created_at'];
$values = [$currency_rate, getCurrentDatetime('Y-m-d H:i:s')];
$condition = "id = '".$currency_id."'";
updateData($db_prefix.'currency', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Currency Updated"]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
if($action == "pp_faq_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$total = 0;
$response = json_decode(getData($db_prefix.'faq',"WHERE title LIKE '%$search%'"),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'faq',"WHERE title LIKE '%$search%' ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"title" => $row["title"],
"content" => $row["content"],
"status" => $row["status"],
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_addfaq"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$faq_title = escape_string($_POST['faq_title']);
$faq_content = escape_string($_POST['faq_content']);
if($faq_title == "" || $faq_content == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$columns = ['title', 'content', 'status', 'created_at'];
$values = [$faq_title, $faq_content, 'active', getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'faq', $columns, $values);
echo json_encode(['status' => "true", 'message' => "FAQ added"]);
}
}
if($action == "pp_editfaq"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$faq_id = escape_string($_POST['id']);
$faq_title = escape_string($_POST['faq_title']);
$faq_content = escape_string($_POST['faq_content']);
$faq_status = escape_string($_POST['status']);
if($faq_title == "" || $faq_content == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$columns = ['title', 'content', 'status', 'created_at'];
$values = [$faq_title, $faq_content, $faq_status, getCurrentDatetime('Y-m-d H:i:s')];
$condition = "id = '".$faq_id."'";
updateData($db_prefix.'faq', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "FAQ updated"]);
}
}
if($action == "pp_bulk_action_transaction"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'transaction','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."transaction", $condition);
}
if($action_name == "refund"){
$columns = ['transaction_status', 'transaction_refund_amount'];
$values = ['refunded', $response_transaction_checker['response'][0]['transaction_amount']];
$condition = "id = '".$id."'";
updateData($db_prefix."transaction", $columns, $values, $condition);
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_transaction_ipn', $response_transaction_checker['response'][0]['pp_id']);
}
}
if($action_name == "approved"){
$columns = ['transaction_status'];
$values = ['completed'];
$condition = "id = '".$id."'";
updateData($db_prefix."transaction", $columns, $values, $condition);
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_transaction_ipn', $response_transaction_checker['response'][0]['pp_id']);
}
}
if($action_name == "send-ipn"){
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_transaction_ipn', $response_transaction_checker['response'][0]['pp_id']);
}
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Transaction Updated']);
}
}
if($action == "pp_addcustomer"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$c_name = escape_string($_POST['c_name']);
$c_email_mobile = escape_string($_POST['c_email_mobile']);
if($c_name == "" || $c_email_mobile == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$response = json_decode(getData($db_prefix.'customer','WHERE c_email_mobile="'.$c_email_mobile.'"'),true);
if($response['status'] == true){
echo json_encode(['status' => "false", 'message' => "Email address already exit."]);
}else{
$columns = ['c_id', 'c_name', 'c_email_mobile', 'c_status', 'created_at'];
$values = [rand(), $c_name, $c_email_mobile, 'active', getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'customer', $columns, $values);
echo json_encode(['status' => "true", 'message' => "Customer added"]);
}
}
}
if($action == "pp_customer_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$total = 0;
$response = json_decode(getData($db_prefix.'customer',"WHERE c_name LIKE '%$search%' OR c_email_mobile LIKE '%$search%'"),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'customer',"WHERE c_name LIKE '%$search%' OR c_email_mobile LIKE '%$search%' ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"c_id" => $row["c_id"],
"c_name" => $row["c_name"],
"c_email_mobile" => $row["c_email_mobile"],
"c_status" => $row["c_status"],
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_editcustomer"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$c_id = escape_string($_POST['id']);
$c_name = escape_string($_POST['c_name']);
$c_email_mobile = escape_string($_POST['c_email_mobile']);
$c_status = escape_string($_POST['status']);
if($c_name == "" || $c_email_mobile == "" || $c_status == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$response = json_decode(getData($db_prefix.'customer','WHERE id="'.$c_id.'"'),true);
if($response['status'] == true){
$columns = ['c_name', 'c_email_mobile', 'c_status'];
$values = [$c_name, $c_email_mobile, $c_status];
$condition = "id = '".$c_id."'";
updateData($db_prefix.'customer', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "Customer Edited"]);
}else{
echo json_encode(['status' => "false", 'message' => "Invalid Data."]);
}
}
}
if($action == "pp_bulk_action_customer"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'customer','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."customer", $condition);
}
if($action_name == "active"){
$columns = ['c_status'];
$values = ['active'];
$condition = "id = '".$id."'";
updateData($db_prefix."customer", $columns, $values, $condition);
}
if($action_name == "inactive"){
$columns = ['c_status'];
$values = ['inactive'];
$condition = "id = '".$id."'";
updateData($db_prefix."customer", $columns, $values, $condition);
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Invalid Data']);
}
}
if($action == "pp_sms_data_devices"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$sms_status = $_POST['sms_status'];
if($sms_status == "all"){
$sms_status = "";
}else{
$sms_status = "AND d_status='".$sms_status."'";
}
$total = 0;
$response = json_decode(getData($db_prefix.'devices',"WHERE d_model LIKE '%$search%' ".$sms_status." OR d_brand LIKE '%$search%' ".$sms_status." OR d_version LIKE '%$search%' ".$sms_status),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'devices',"WHERE d_model LIKE '%$search%' ".$sms_status." OR d_brand LIKE '%$search%' ".$sms_status." OR d_version LIKE '%$search%' ".$sms_status." ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
if($row["d_status"] == "Disconnected"){
$d_status = $row["d_status"];
}else{
if (getConnectionStatus($row["created_at"], 31)) {
$d_status = 'Connected';
} else {
$d_status = 'Disconnected';
}
}
$pp_transaction[] = [
"id" => $row["id"],
"d_model" => $row["d_model"],
"d_brand" => $row["d_brand"],
"d_version" => $row["d_version"],
"d_api_level" => $row["d_api_level"],
"d_status" => $d_status,
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_bulk_action_devices"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'devices','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."devices", $condition);
}
if($action_name == "Connected"){
$columns = ['d_status'];
$values = ['Connected'];
$condition = "id = '".$id."'";
updateData($db_prefix."devices", $columns, $values, $condition);
}
if($action_name == "review"){
$columns = ['d_status'];
$values = ['Disconnected'];
$condition = "id = '".$id."'";
updateData($db_prefix."devices", $columns, $values, $condition);
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Invalid Data']);
}
}
if($action == "pp_sms_data_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$sms_status = $_POST['sms_status'];
if($sms_status == "all"){
$sms_status = "";
}else{
$sms_status = "AND status='".$sms_status."'";
}
$total = 0;
$response = json_decode(getData($db_prefix.'sms_data',"WHERE payment_method LIKE '%$search%' ".$sms_status." OR sim LIKE '%$search%' ".$sms_status." OR message LIKE '%$search%' ".$sms_status),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'sms_data',"WHERE payment_method LIKE '%$search%' ".$sms_status." OR sim LIKE '%$search%' ".$sms_status." OR message LIKE '%$search%' ".$sms_status." ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"entry_type" => isset($row["entry_type"]) ? ($row["entry_type"] === 'manual' ? 'Manual' : ($row["entry_type"] === 'automatic' ? 'Automatic' : 'Unknown')) : 'Not set',
"payment_method" => $row["payment_method"],
"sim" => isset($row["sim"]) ? ($row["sim"] === 'sim1' ? 'SIM 1' : ($row["sim"] === 'sim2' ? 'SIM 2' : 'Unknown')) : 'Not set',
"mobile_number" => $row["mobile_number"],
"transaction_id" => $row["transaction_id"],
"message" => $row["message"],
"amount" => $row["amount"],
"balance" => $row["balance"],
"status" => $row["status"],
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if($action == "pp_bulk_action_sms_data"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'sms_data','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."sms_data", $condition);
}
if($action_name == "approved"){
$columns = ['status'];
$values = ['approved'];
$condition = "id = '".$id."'";
updateData($db_prefix."sms_data", $columns, $values, $condition);
}
if($action_name == "review"){
$columns = ['status'];
$values = ['review'];
$condition = "id = '".$id."'";
updateData($db_prefix."sms_data", $columns, $values, $condition);
}
if($action_name == "used"){
$columns = ['status'];
$values = ['used'];
$condition = "id = '".$id."'";
updateData($db_prefix."sms_data", $columns, $values, $condition);
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Invalid Data']);
}
}
if($action == "pp_generate_webhook"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$api_key = rand().uniqid().rand().rand().uniqid().rand();
if($global_user_login == true){
$columns = ['webhook'];
$values = [$api_key];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'api' => $api_key]);
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}
}
if($action == "pp_sms-new-message"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$method = escape_string($_POST['method']);
$amount = escape_string($_POST['amount']);
$phone_number = escape_string($_POST['phone_number']);
$transaction_id = escape_string($_POST['transaction_id']);
$sim_slot = escape_string($_POST['sim_slot']);
$status = escape_string($_POST['status']);
if($method == "" || $amount == "" || $phone_number == "" || $transaction_id == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$response = json_decode(getData($db_prefix.'sms_data','WHERE transaction_id="'.$transaction_id.'"'),true);
if($response['status'] == true){
echo json_encode(['status' => "false", 'message' => "Transaction id already exit."]);
}else{
$columns = ['entry_type', 'sim', 'payment_method', 'mobile_number', 'transaction_id', 'amount', 'balance', 'status', 'created_at'];
$values = ['manual', $sim_slot, $method, $phone_number, $transaction_id, $amount, 0, $status, getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'sms_data', $columns, $values);
echo json_encode(['status' => "true", 'message' => "SMS added"]);
}
}
}
if($action == "pp_sms-edit-message"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$sms_id = escape_string($_POST['sms_id']);
$method = escape_string($_POST['method']);
$amount = escape_string($_POST['amount']);
$phone_number = escape_string($_POST['phone_number']);
$transaction_id = escape_string($_POST['transaction_id']);
$sim_slot = escape_string($_POST['sim_slot']);
$status = escape_string($_POST['status']);
if($method == "" || $amount == "" || $phone_number == "" || $transaction_id == "" || $sms_id == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
$response = json_decode(getData($db_prefix.'sms_data','WHERE id="'.$sms_id.'"'),true);
if($response['status'] == true){
$columns = ['sim', 'payment_method', 'mobile_number', 'transaction_id', 'amount', 'status'];
$values = [$sim_slot, $method, $phone_number, $transaction_id, $amount, $status];
$condition = "id = '".$sms_id."'";
updateData($db_prefix.'sms_data', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => "SMS Edited"]);
}else{
echo json_encode(['status' => "false", 'message' => "Invalid Data."]);
}
}
}
if($action == "pp_payment_links_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$payment_link_status = $_POST['payment_link_status'];
if($payment_link_status == "all"){
$payment_link_status = "";
}else{
$payment_link_status = "AND pl_status='".$payment_link_status."'";
}
$total = 0;
$response = json_decode(getData($db_prefix.'payment_link',"WHERE pl_name LIKE '%$search%' ".$payment_link_status." OR pl_description LIKE '%$search%' ".$payment_link_status." OR pl_currency LIKE '%$search%' ".$payment_link_status),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'payment_link',"WHERE pl_name LIKE '%$search%' ".$payment_link_status." OR pl_description LIKE '%$search%' ".$payment_link_status." OR pl_currency LIKE '%$search%' ".$payment_link_status." ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$pp_transaction[] = [
"id" => $row["id"],
"pl_id" =>$row['pl_id'],
"pl_link" =>'https://'.$_SERVER['HTTP_HOST'].'/payment-link/'.$row['pl_id'],
"pl_name" => $row["pl_name"],
"pl_quantity" => $row["pl_quantity"],
"pl_description" => $row["pl_description"],
"pl_currency" => $row["pl_currency"],
"pl_amount" => number_format($row["pl_amount"], 2).' '.$row["pl_currency"],
"pl_expiry_date" => $row["pl_expiry_date"],
"pl_status" => $row["pl_status"],
"created_at" => $row["created_at"]
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if ($action == "pp_view_payment_link") {
$pl_id = $_POST['pl_id'];
// Fetch the transaction
$response = json_decode(getData($db_prefix . 'payment_link', 'WHERE pl_id="' . $pl_id . '"'), true);
$row = $response['response'][0];
$input_filed = json_decode(getData($db_prefix . 'payment_link_input', 'WHERE pl_id="' . $row['pl_id'] . '"'), true);
$input_fild = [];
if (!empty($input_filed)) {
foreach ($input_filed['response'] as $input) {
$input_fild[] = [
"form_type" => $input['pl_form_type'],
"required" => $input['pl_is_require'],
"field_name" => $input['pl_field_name']
];
}
}
$currency_response = json_decode(getData($db_prefix . 'currency', 'WHERE currency_code="' . $row['pl_currency'] . '"'), true);
$data = [
"product_name" => $row['pl_name'],
"invoice_quantity" => $row['pl_quantity'],
"product_amount" => $row['pl_amount'],
"expire_date" => $row['pl_expiry_date'],
"product_currency" => $currency_response['response'][0]['currency_name'].' - ('.$currency_response['response'][0]['currency_code'].')',
"product_description" => $row['pl_description'],
"product_status" => $row['pl_status']
];
$json = [
"status" => "true",
"input_fild" => $input_fild,
"data" => $data
];
echo json_encode($json);
}
if($action == "pp_payment_links_manage"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$pl_id = escape_string($_POST['pl_id']);
$pl_product_name = escape_string($_POST['payment-link-product-name']);
$pl_quantity = escape_string($_POST['payment-link-quantity']);
$pl_description = escape_string($_POST['payment-link-product-description']);
$pl_currency = escape_string($_POST['payment-link-currency']);
$pl_amount = escape_string($_POST['payment-link-amount']);
$pl_expiry = escape_string($_POST['payment-link-expiry']);
$pl_status = escape_string($_POST['payment-link-status']);
if (preg_match('/\((.*?)\)/', $pl_currency, $matches)) {
$pl_currency = $matches[1]; // Found in parentheses
} else {
$pl_currency = trim($pl_currency); // Just plain code like "USD"
}
if($pl_product_name == "" || $pl_quantity == "" || $pl_description == "" || $pl_currency == "" || $pl_amount == "" || $pl_expiry == "" || $pl_status == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
if($pl_currency == "-"){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
exit();
}
if($pl_id == ""){
$payment_link_create = true;
$pl_id = rand();
}else{
$response_payment_link_checker = json_decode(getData($db_prefix.'payment_link','WHERE pl_id="'.$pl_id.'"'),true);
if($response_payment_link_checker['status'] == true){
$payment_link_create = false;
}else{
$payment_link_create = true;
$pl_id = rand();
}
}
if($payment_link_create == true){
$columns = ['pl_id', 'pl_name', 'pl_quantity', 'pl_description', 'pl_currency', 'pl_amount', 'pl_expiry_date', 'pl_status', 'created_at'];
$values = [$pl_id, $pl_product_name, safeNumber($pl_quantity), $pl_description, $pl_currency, safeNumber($pl_amount), $pl_expiry, $pl_status, getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'payment_link', $columns, $values);
}else{
$columns = ['pl_name', 'pl_quantity', 'pl_description', 'pl_currency', 'pl_amount', 'pl_expiry_date', 'pl_status'];
$values = [$pl_product_name, safeNumber($pl_quantity, $response_payment_link_checker['response'][0]['pl_quantity']), $pl_description, $pl_currency, safeNumber($pl_amount, $response_payment_link_checker['response'][0]['pl_amount']), $pl_expiry, $pl_status];
$condition = "pl_id = '".$pl_id."'";
updateData($db_prefix.'payment_link', $columns, $values, $condition);
}
$condition = "pl_id = '".$pl_id."'";
deleteData($db_prefix."payment_link_input", $condition);
if(isset($_POST['payment-link-input-field-type'])){
$fieldTypes = $_POST['payment-link-input-field-type'];
$fieldNames = $_POST['payment-link-input-field-name'];
$fieldRequirements = $_POST['payment-link-input-field-is-require'];
$fields = [];
for ($i = 0; $i < count($fieldTypes); $i++) {
$columns = ['pl_id', 'pl_form_type', 'pl_field_name', 'pl_is_require', 'created_at'];
$values = [$pl_id, escape_string($fieldTypes[$i]), escape_string($fieldNames[$i]), escape_string($fieldRequirements[$i]), getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'payment_link_input', $columns, $values);
}
}
echo json_encode(['status' => "true", 'message' => 'Payment Link Created']);
}
}
if($action == "pp_bulk_action_payment_link"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'payment_link','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."payment_link", $condition);
$condition = "pl_id = '".$response_transaction_checker['response'][0]['pl_id']."'";
deleteData($db_prefix."payment_link_input", $condition);
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Invalid Data']);
}
}
if($action == "pp_invoice_list"){
$limit = 50;
$search = escape_string($_POST['search']);
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$offset = ($page - 1) * $limit;
$payment_link_status = $_POST['payment_link_status'];
if($payment_link_status == "all"){
$payment_link_status = "";
}else{
$payment_link_status = "AND i_status='".$payment_link_status."'";
}
$total = 0;
$response = json_decode(getData($db_prefix.'invoice',"WHERE c_name LIKE '%$search%' ".$payment_link_status." OR c_email_mobile LIKE '%$search%' ".$payment_link_status." OR i_currency LIKE '%$search%' ".$payment_link_status),true);
foreach($response['response'] as $res){
$total = $total+1;
}
$totalPages = ceil($total / $limit);
$pp_transaction = [];
$showing = 0;
$response = json_decode(getData($db_prefix.'invoice',"WHERE c_name LIKE '%$search%' ".$payment_link_status." OR c_email_mobile LIKE '%$search%' ".$payment_link_status." OR i_currency LIKE '%$search%' ".$payment_link_status." ORDER BY 1 DESC LIMIT ".$limit." OFFSET ".$offset),true);
foreach($response['response'] as $row){
$showing =$showing+1;
$subtotal = 0;
$totalVat = 0;
$totalDiscount = 0;
$response_items = json_decode(getData($db_prefix.'invoice_items',"WHERE i_id='".$row['i_id']."'"),true);
foreach ($response_items['response'] as $item) {
$quantity = isset($item['quantity']) ? floatval($item['quantity']) : 0;
$amount = isset($item['amount']) ? floatval($item['amount']) : 0;
$discount = isset($item['discount']) ? floatval($item['discount']) : 0;
$vatPercentage = isset($item['vat']) ? floatval($item['vat']) : 0;
$itemSubtotal = $quantity * $amount;
$itemDiscount = min($discount, $itemSubtotal);
$totalDiscount += $itemDiscount;
$itemAmountAfterDiscount = $itemSubtotal - $itemDiscount;
$itemVat = $itemAmountAfterDiscount * ($vatPercentage / 100);
$totalVat += $itemVat;
$subtotal += $itemSubtotal;
}
$shipping = $row['i_amount_shipping'];
$totalAmount = $subtotal - $totalDiscount + $totalVat + $shipping;
$pp_transaction[] = [
"id" => $row["id"],
"i_id" =>$row['i_id'],
"c_name" => $row["c_name"],
"c_email_mobile" => $row["c_email_mobile"],
"i_currency" => $row["i_currency"],
"i_due_date" => $row["i_due_date"],
"i_status" => $row["i_status"],
"i_note" => $row["i_note"],
"amount" => number_format($totalAmount, 2).' '.$row["i_currency"],
"i_amount_shipping" => number_format($row["i_amount_shipping"], 2).' '.$row["i_currency"],
"i_link" => 'https://'.$_SERVER['HTTP_HOST'].'/invoice/'.$row['i_id'],
"created_at" => $row["created_at"],
];
}
echo json_encode([
"status" => 'true',
"data" => $pp_transaction,
"total" => $total,
"showing" => $showing,
"totalPages" => $totalPages,
"currentPage" => $page
]);
}
if ($action == "pp_view_invoice") {
$invoice_id = $_POST['invoice_id'];
// Fetch the transaction
$response = json_decode(getData($db_prefix . 'invoice', 'WHERE id="' . $invoice_id . '"'), true);
$row = $response['response'][0];
// Fix here: make it an object, not array
$selected_customer = [
"id" => $row['c_id'],
"name" => $row['c_name']
];
$invoice_prefill_response = json_decode(getData($db_prefix . 'invoice_items', 'WHERE i_id="' . $row['i_id'] . '"'), true);
$invoice_prefill = [];
if (!empty($invoice_prefill_response)) {
foreach ($invoice_prefill_response['response'] as $invoice) {
$invoice_prefill[] = [
"description" => $invoice['description'],
"quantity" => $invoice['quantity'],
"amount" => $invoice['amount'],
"discount" => $invoice['discount'],
"vat" => $invoice['vat']
];
}
}
$customer_response = json_decode(getData($db_prefix . 'customer', 'WHERE c_status="active"'), true);
$customer_list = [];
if (!empty($customer_response)) {
foreach ($customer_response['response'] as $customer) {
$customer_list[] = [
"c_id" => $customer['c_id'],
"c_name" => $customer['c_name']
];
}
}
$currency_response = json_decode(getData($db_prefix . 'currency', 'WHERE currency_code="' . $row['i_currency'] . '"'), true);
$json = [
"status" => "true",
"customer_list" => $customer_list,
"selected_customer" => $selected_customer,
"invoice_prefill" => $invoice_prefill,
"currency" => $currency_response['response'][0]['currency_name'].' - ('.$currency_response['response'][0]['currency_code'].')',
"payment_status" => $row['i_status'],
"due_date" => $row["i_due_date"],
"etShipping" => $row['i_amount_shipping'],
"invoicenote" => $row['i_note']
];
echo json_encode($json);
}
if ($action == "pp_view_invoice_customer") {
$customer_response = json_decode(getData($db_prefix . 'customer', 'WHERE c_status="active"'), true);
$customer_list = [];
if (!empty($customer_response)) {
foreach ($customer_response['response'] as $customer) {
$customer_list[] = [
"c_id" => $customer['c_id'],
"c_name" => $customer['c_name']
];
}
}
$json = [
"status" => "true",
"customer_list" => $customer_list,
];
echo json_encode($json);
}
if($action == "pp_invoice_manage"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$i_id = escape_string($_POST['i_id']);
$invoice_customer = escape_string($_POST['invoice_customer']);
$invoice_currency = escape_string($_POST['invoice_currency']);
$invoice_due = escape_string($_POST['invoice_due']);
$invoice_status = strtolower(escape_string($_POST['invoice_status']));
$invoice_notes = escape_string($_POST['invoice_notes']);
$invoice_shipping = escape_string($_POST['invoice_shipping']);
if (preg_match('/\((.*?)\)/', $invoice_currency, $matches)) {
$invoice_currency = $matches[1]; // Found in parentheses
} else {
$invoice_currency = trim($invoice_currency); // Just plain code like "USD"
}
if($invoice_customer == "" || $invoice_currency == "" || $invoice_due == "" || $invoice_status == "" || $invoice_shipping == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
if($invoice_currency == "--"){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
exit();
}
if($i_id == ""){
$invoice_create = true;
$i_id = rand();
}else{
$response_invoice_checker = json_decode(getData($db_prefix.'invoice','WHERE i_id="'.$i_id.'"'),true);
if($response_invoice_checker['status'] == true){
$invoice_create = false;
}else{
$invoice_create = true;
$i_id = rand();
}
}
$response_invoice_customer = json_decode(getData($db_prefix.'customer','WHERE c_id="'.$invoice_customer.'"'),true);
if($response_invoice_customer['status'] == true){
}else{
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
exit();
}
if($invoice_create == true){
$columns = ['i_id', 'c_id', 'c_name', 'c_email_mobile', 'i_currency', 'i_due_date', 'i_status', 'i_note', 'i_amount_shipping', 'created_at'];
$values = [$i_id, $invoice_customer, $response_invoice_customer['response'][0]['c_name'], $response_invoice_customer['response'][0]['c_email_mobile'], $invoice_currency, $invoice_due, $invoice_status, $invoice_notes, safeNumber($invoice_shipping), getCurrentDatetime('Y-m-d H:i:s')];
insertData($db_prefix.'invoice', $columns, $values);
}else{
$columns = ['c_id', 'c_name', 'c_email_mobile', 'i_currency', 'i_due_date', 'i_status', 'i_note', 'i_amount_shipping', ];
$values = [$invoice_customer, $response_invoice_customer['response'][0]['c_name'], $response_invoice_customer['response'][0]['c_email_mobile'], $invoice_currency, $invoice_due, $invoice_status, $invoice_notes, safeNumber($invoice_shipping),];
$condition = "i_id = '".$i_id."'";
updateData($db_prefix.'invoice', $columns, $values, $condition);
}
$condition = "i_id = '".$i_id."'";
deleteData($db_prefix."invoice_items", $condition);
if(isset($_POST['invoice-items-description'])){
$invoice_items_description = $_POST['invoice-items-description'];
$invoice_items_quantity = $_POST['invoice-items-quantity'];
$invoice_items_amount = $_POST['invoice-items-amount'];
$invoice_items_discount = $_POST['invoice-items-discount'];
$invoice_items_vat = $_POST['invoice-items-vat'];
$fields = [];
for ($i = 0; $i < count($invoice_items_description); $i++) {
$columns = ['i_id', 'description', 'quantity', 'amount', 'discount', 'vat'];
$values = [$i_id, escape_string($invoice_items_description[$i]), escape_string(safeNumber($invoice_items_quantity[$i])), escape_string(safeNumber($invoice_items_amount[$i])), escape_string(safeNumber($invoice_items_discount[$i])), escape_string(safeNumber($invoice_items_vat[$i]))];
insertData($db_prefix.'invoice_items', $columns, $values);
}
}
if($invoice_status == "paid" || $invoice_status == "canceled" || $invoice_status == "refunded" || $invoice_status == "unpaid"){
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_invoice_ipn', $i_id);
}
}
echo json_encode(['status' => "true", 'message' => 'Invoice Saved']);
}
}
if($action == "pp_bulk_action_invoice"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$ids = escape_string($_POST['ids']);
if (!is_array($ids)) {
$ids = explode(",", $ids);
}
$ids = array_map('intval', $ids);
$count = 0;
foreach ($ids as $id) {
$action_name = escape_string($_POST['action_name']);
$response_transaction_checker = json_decode(getData($db_prefix.'invoice','WHERE id="'.$id.'"'),true);
if($response_transaction_checker['status'] == true){
$count = 1;
if($action_name == "delete"){
$condition = "id = '".$id."'";
deleteData($db_prefix."invoice", $condition);
$condition = "i_id = '".$response_transaction_checker['response'][0]['i_id']."'";
deleteData($db_prefix."invoice_items", $condition);
}
if($action_name == "paid"){
$columns = ['i_status'];
$values = ['paid'];
$condition = "id = '".$id."'";
updateData($db_prefix."invoice", $columns, $values, $condition);
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_invoice_ipn', $response_transaction_checker['response'][0]['i_id']);
}
}
if($action_name == "unpaid"){
$columns = ['i_status'];
$values = ['unpaid'];
$condition = "id = '".$id."'";
updateData($db_prefix."invoice", $columns, $values, $condition);
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_invoice_ipn', $response_transaction_checker['response'][0]['i_id']);
}
}
if($action_name == "refund"){
$columns = ['i_status'];
$values = ['refunded'];
$condition = "id = '".$id."'";
updateData($db_prefix."invoice", $columns, $values, $condition);
if (function_exists('pp_trigger_hook')) {
pp_trigger_hook('pp_invoice_ipn', $response_transaction_checker['response'][0]['i_id']);
}
}
}
}
if($count == 0){
echo json_encode(['status' => "false", 'message' => 'Invalid Data']);
}else{
echo json_encode(['status' => "true", 'message' => 'Invalid Data']);
}
}
if($action == "pp_plugin_manager"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$type = escape_string($_POST['type']);
$mainfolder = escape_string($_POST['mainfolder']);
$pluginfolder = escape_string($_POST['pluginfolder']);
if($type == "" || $mainfolder == "" || $pluginfolder == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
if($type == "delete"){
if (is_dir(__DIR__.'/../pp-content/plugins/'.$mainfolder.'/'.$pluginfolder)) {
if (deleteFolder(__DIR__.'/../pp-content/plugins/'.$mainfolder.'/'.$pluginfolder)) {
$condition = "plugin_slug = '".$pluginfolder."'";
deleteData($db_prefix."plugins", $condition);
echo json_encode(['status' => "true", 'message' => "Plugin delete successfully."]);
} else {
echo json_encode(['status' => "false", 'message' => "Failed to delete plugin."]);
}
}else{
echo json_encode(['status' => "false", 'message' => "Plugin not exits."]);
}
}else{
$response = json_decode(getData($db_prefix.'plugins','WHERE plugin_slug="'.$pluginfolder.'"'),true);
if($response['status'] == true){
if($type == "activate"){
$columns = ['status', 'plugin_dir'];
$values = ['active', $mainfolder];
$condition = "id = '".$response['response'][0]['id']."'";
updateData($db_prefix.'plugins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => ""]);
}
if($type == "deactivate"){
$columns = ['status', 'plugin_dir'];
$values = ['inactive', $mainfolder];
$condition = "id = '".$response['response'][0]['id']."'";
updateData($db_prefix.'plugins', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => ""]);
}
}else{
$pluginInfo = parsePluginHeader(__DIR__.'/../pp-content/plugins/'.$mainfolder.'/'.$pluginfolder.'/'.$pluginfolder.'-class.php');
if($type == "activate"){
$columns = ['plugin_name', 'plugin_slug', 'plugin_dir', 'plugin_array', 'status', 'created_at'];
$values = [escape_string(htmlspecialchars($pluginInfo['Plugin Name'] ?? '')), escape_string($pluginfolder), $mainfolder, '--', 'active', escape_string(getCurrentDatetime('Y-m-d H:i:s'))];
insertData($db_prefix.'plugins', $columns, $values);
echo json_encode(['status' => "true", 'message' => ""]);
}
}
}
}
}
if($action == "pp_appearance_themes_manager"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$type = escape_string($_POST['type']);
$mainfolder = escape_string($_POST['mainfolder']);
$themesfolder = escape_string($_POST['themesfolder']);
if($type == "" || $mainfolder == "" || $themesfolder == ""){
echo json_encode(['status' => "false", 'message' => 'Invalid data']);
}else{
if($global_setting_response['response'][0]['gateway_theme'] == $themesfolder){
}else{
if($type == "activate"){
$columns = ['gateway_theme', 'invoice_theme'];
$values = [$themesfolder, $themesfolder];
$condition = "id = '1'";
updateData($db_prefix.'settings', $columns, $values, $condition);
echo json_encode(['status' => "true", 'message' => ""]);
}
}
}
}
if($action == "plugin_update-submit"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$plugin_slug = $_POST['plugin_slug'];
$newData = $_POST;
unset($newData['action']);
unset($newData['plugin_slug']);
$success = pp_set_plugin_setting($plugin_slug, $newData);
header('Content-Type: application/json');
if ($success) {
echo json_encode(['status' => true, 'message' => 'Settings saved successfully!']);
} else {
echo json_encode(['status' => false, 'message' => 'Failed to save settings.']);
}
}
if($action == "theme_update-submit"){
if ($mode == "demo") {
echo json_encode(["status" => "false", "message" => "Error: Demo mode is active"]);
exit();
}
$theme_slug = $_POST['theme_slug'];
$newData = $_POST;
unset($newData['action']);
unset($newData['theme_slug']);
$success = pp_set_theme_setting($theme_slug, $newData);
header('Content-Type: application/json');
if ($success) {
echo json_encode(['status' => true, 'message' => 'Settings saved successfully!']);
} else {
echo json_encode(['status' => false, 'message' => 'Failed to save settings.']);
}
}
if($action == "pp-invoice-payment-link"){
$full_name = $_POST['full-name'] ?? '';
$email_mobile = $_POST['email-mobile'] ?? '';
$paymentid = $_POST['pp-paymentid'] ?? '';
$response_transaction_checker = json_decode(getData($db_prefix.'payment_link','WHERE pl_id="'.$paymentid.'"'),true);
if($response_transaction_checker['status'] == true){
$meta = [];
foreach ($_POST as $key => $value) {
if (!in_array($key, ['full-name', 'email-mobile', 'submit', 'action', 'pp-paymentid'])) {
$meta[$key] = $value;
}
}
foreach ($_FILES as $key => $file) {
if (is_array($file['name'])) {
// Multiple files (file input had name="something[]")
for ($i = 0; $i < count($file['name']); $i++) {
if ($file['error'][$i] === 0) {
$single_file = [
'name' => $file['name'][$i],
'type' => $file['type'][$i],
'tmp_name' => $file['tmp_name'][$i],
'error' => $file['error'][$i],
'size' => $file['size'][$i],
];
$upload = json_decode(uploadImage($single_file, 10 * 1024 * 1024), true);
if ($upload['status'] === true) {
$file_url = 'https://' . $_SERVER['HTTP_HOST'] . '/pp-external/media/' . $upload['file'];
$meta[$key][] = $file_url;
} else {
$meta[$key][] = 'upload_failed';
}
}
}
} else {
// Single file input
if ($file['error'] === 0) {
$upload = json_decode(uploadImage($file, 10 * 1024 * 1024), true);
if ($upload['status'] === true) {
$file_url = 'https://' . $_SERVER['HTTP_HOST'] . '/pp-external/media/' . $upload['file'];
$meta[$key] = $file_url;
} else {
$meta[$key] = 'upload_failed';
}
}
}
}
$baseURL = 'https://'.$_SERVER['HTTP_HOST'].'/api/create-charge';
$payload = [
'full_name' => $full_name,
'email_mobile' => $email_mobile,
'amount' => $response_transaction_checker['response'][0]['pl_amount'],
'currency' => $response_transaction_checker['response'][0]['pl_currency'],
'metadata' => [
'paymentid' => $paymentid
],
'redirect_url' => '--',
'cancel_url' => 'https://'.$_SERVER['HTTP_HOST'].'/payment-link/'.$paymentid,
'webhook_url' => '--',
'return_type' => 'POST',
'product_name' => $response_transaction_checker['response'][0]['pl_name'],
'product_description' => $response_transaction_checker['response'][0]['pl_description'],
'product_meta' => $meta
];
// Initialize cURL
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'mh-piprapay-api-key:' .$global_setting_response['response'][0]['api_key']
],
]);
$response = curl_exec($curl);
echo $response;
curl_close($curl);
}else{
echo json_encode(['status' => false, 'message' => 'Failed.']);
}
}
if($action == "pp-invoice-link"){
$invoiceid = $_POST['pp-invoiceid'] ?? '';
$response_transaction_checker = json_decode(getData($db_prefix.'invoice','WHERE i_id="'.$invoiceid.'"'),true);
if($response_transaction_checker['status'] == true){
$invoice_details = pp_get_invoice($invoiceid);
$invoice_details_items = pp_get_invoice_items($invoiceid);
$subtotal = 0;
$total_discount = 0;
$total_vat = 0;
foreach ($invoice_details_items['response'] as $items) {
$item_subtotal = $items['amount'] * $items['quantity'];
$item_discount = min($items['discount'], $item_subtotal);
$item_amount_after_discount = $item_subtotal - $item_discount;
$item_vat = $item_amount_after_discount * ($items['vat'] / 100);
$subtotal += $item_subtotal;
$total_discount += $item_discount;
$total_vat += $item_vat;
}
$shipping_cost = isset($invoice_details['response'][0]['i_amount_shipping']) ? floatval($invoice_details['response'][0]['i_amount_shipping']) : 0;
$total_amount = $subtotal - $total_discount + $total_vat + $shipping_cost;
$currency = $invoice_details['response'][0]['i_currency'];
$baseURL = 'https://'.$_SERVER['HTTP_HOST'].'/api/create-charge';
$payload = [
'full_name' => $invoice_details['response'][0]['c_name'],
'email_mobile' => $invoice_details['response'][0]['c_email_mobile'],
'amount' => $total_amount,
'currency' => $currency,
'metadata' => [
'invoiceid' => $invoiceid
],
'redirect_url' => 'https://'.$_SERVER['HTTP_HOST'].'/invoice/'.$invoiceid,
'cancel_url' => 'https://'.$_SERVER['HTTP_HOST'].'/invoice/'.$invoiceid,
'webhook_url' => 'https://'.$_SERVER['HTTP_HOST'].'/invoice/'.$invoiceid,
'return_type' => 'POST'
];
// Initialize cURL
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'mh-piprapay-api-key:' .$global_setting_response['response'][0]['api_key']
],
]);
$response = curl_exec($curl);
echo $response;
curl_close($curl);
}else{
echo json_encode(['status' => false, 'message' => 'Failed.']);
}
}
}
exit();
}
?>