Files
Business-credit-asistant/app/Console/Commands/SubscriptionUpdateByCronJob.php
2026-06-29 13:00:18 +06:00

218 lines
8.4 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Recurring;
use App\Models\Sale;
use App\Models\User;
use App\Services\Payment\GateWay;
use App\Services\Payment\Payment;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class SubscriptionUpdateByCronJob extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'subscription:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Update subscription and payment date by payment api';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$this->info('Start subscription:update');
$this->updateSubscription();
$this->info('End subscription:update');
}
private function updateSubscription()
{
$recurringData = (new Recurring())->getRecurringDataForScheduler();
$log_id = time() . rand();
$logData['log_id'] = $log_id;
$logData['action'] = "CLIENT_SUBSCRIPTION_UPDATE_START";
appLog($logData);
if (!empty($recurringData)) {
foreach ($recurringData as $recurring) {
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "CLIENT_SUBSCRIPTION_UPDATE_START_IN_LOOP";
appLog($logData);
$paymentData = [];
// dd(getStringToDateTime('20230130082542'));
$paymentData['start_date'] = getDateAfterSpicificDay($recurring['last_process_date'], 1, 'YmdHis');
$paymentData['end_date'] = getCurrentDateTime('YmdHis');
$paymentData['subscription_id'] = $recurring['subscription_id'];
$response = (new Payment(GateWay::getGateWayInstance(config('constant.PAYMENT_GATEWAY.NMI')), $paymentData))->getSubscriptionInfoBySubscriptionId();
// log api response
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "SUBSCRIPTION_FROM_API_LOG";
$logData['response'] = $response;
$logData['inputData'] = $recurring;
appLog($logData);
if (!empty($response['data'])) {
$search_data_by_date = $response['data'];
if (!array_key_exists(0, $search_data_by_date)) {
$search_data_by_date = [];
$search_data_by_date[] = $response['data'];
}
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "PER_RESPONSE_DATA";
$logData['data'] = $search_data_by_date;
appLog($logData);
foreach ($search_data_by_date as $item) {
if (!empty($item)) {
$logData_subscription['log_id'] = $log_id;
$logData_subscription['action_by_subscription_start'] = "CLIENT_SUBSCRIPTION_START";
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "PER_ITEM_DATA";
$logData['item'] = $item;
appLog($logData);
$date = isset($item['action']['date']) ? $item['action']['date'] : $item['action'][0]['date'];
// $last_payment_date = getStringToDateTime($item['action'][0]['date']);
$last_payment_date = getStringToDateTime($date);
try {
DB::beginTransaction();
// user update
/*
$user_input['last_payment_date'] = $last_payment_date;
$user_input['user_access_end_date'] = getDateAfterSpicificDay($last_payment_date, config('constant.PAYMENT_INTERVAL_DAY'));
$user_input['subscription_status'] = config('constant.SUBSCRIPTION_STATUS.SUBSCRIBED');
$user_input['status'] = config('constant.SUBSCRIPTION_STATUS.SUBSCRIBED');
(new User())->userupdate($user_input, $recurring['user_id']);
*/
$this->updateUserData($last_payment_date,$recurring['user_id']);
// recurring update
$recurring_input['last_process_date'] = $last_payment_date;
$recurring->update($recurring_input);
// sales insert
$this->insertSalesData($recurring,$last_payment_date,$item);
/*
$order_id = !empty($item['order_id']) ? $item['order_id'] : generateUniqueId();
$salesData['order_id'] = $order_id;
$salesData['cc_number'] = $item['cc_number'];
$salesData['status'] = "1";
$salesData['auth_code'] = '';
$salesData['transaction_id'] = $item['transaction_id'];
$salesData['ip'] = getClientIpAddress();
$salesData['user_id'] = $recurring['user_id'];
$salesData['recurring_id'] = $recurring['id'];
$salesData['created_at'] = $last_payment_date;
$saleData = (new Sale())->getDataByTransactionId($item['transaction_id']);
if (empty($saleData)) {
(new Sale())->createSale($salesData);
}
*/
$logData_subscription['message'] = 'Update and insert data successfully';
DB::commit();
} catch (\Exception $ex) {
DB::rollback();
$logData_subscription['message'] = $ex->getMessage();
}
$logData_subscription['transaction'] = $item;
$logData_subscription['action_by_subscription_end'] = "CLIENT_SUBSCRIPTION_END";
appLog($logData_subscription);
}
}
}
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "CLIENT_SUBSCRIPTION_UPDATE_END_IN_LOOP";
appLog($logData);
}
}
$logData = [];
$logData['log_id'] = $log_id;
$logData['action'] = "CLIENT_SUBSCRIPTION_UPDATE_END";
appLog($logData);
}
private function updateUserData($last_payment_date,$user_id)
{
$user_input['last_payment_date'] = $last_payment_date;
$user_input['user_access_end_date'] = getDateAfterSpicificDay($last_payment_date, config('constant.PAYMENT_INTERVAL_DAY'));
$user_input['subscription_status'] = config('constant.SUBSCRIPTION_STATUS.SUBSCRIBED');
$user_input['status'] = config('constant.SUBSCRIPTION_STATUS.SUBSCRIBED');
(new User())->userupdate($user_input, $user_id);
}
private function insertSalesData($recurring,$last_payment_date,$item)
{
$order_id = !empty($item['order_id']) ? $item['order_id'] : generateUniqueId();
$salesData['order_id'] = $order_id;
$salesData['cc_number'] = $item['cc_number'];
$salesData['status'] = "1";
$salesData['auth_code'] = '';
$salesData['transaction_id'] = $item['transaction_id'];
$salesData['ip'] = getClientIpAddress();
$salesData['user_id'] = $recurring['user_id'];
$salesData['recurring_id'] = $recurring['id'];
$salesData['created_at'] = $last_payment_date;
$saleData = (new Sale())->getDataByTransactionId($item['transaction_id']);
if (empty($saleData)) {
(new Sale())->createSale($salesData);
}
}
}