updatesBookingStatus = $updatesBookingStatus; } /** * Execute the console command. * * @return int */ public function handle() { // 1. Cancel booking without payment & purchase order (1 month) $bookings = Booking::where('status', ApprovalStatus::APPROVED) ->where('created_at', '<', now()->subDays(30)->endOfDay()) ->where(function ($query) { $query->whereDoesntHave('transactions') ->orWhereDoesntHave('transactions', function($transaction) { return $transaction->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); }); })->get(); foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); Log::info("Expired Booking without payment & purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}"); } } // 2. Cancel booking without payment but with purchase order (2 month) $bookings = Booking::where('status', ApprovalStatus::APPROVED) ->where('created_at', '<', now()->subDays(60)->endOfDay()) ->where(function ($query) { $query->whereDoesntHave('transactions', function($transaction) { return $transaction->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); })->whereHas('transactions', function($transaction) { return $transaction->where('type', TransactionType::PURCHASE_ORDER); }); })->get(); foreach ($bookings as $booking) { $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); Log::info("Expired Booking without payment but with purchase order, booking id: " . $booking->id); $transactions = $booking->transactions; foreach ($transactions as $transaction) { $transaction->status = ApprovalStatus::EXPIRED; $transaction->save(); Log::info("Expired Transaction id: {$transaction->id} from Booking id: {$booking->id}"); } } // 3. Cancel fully refunded payment & cancel booking $transactions = Transaction::where('type', TransactionType::CREDIT_NOTE)->get(); foreach ($transactions as $transaction) { // get the booking marking $marking = substr($transaction->payment_reference, -5); // for a special payment reference on transaction id: 152013 if (!is_numeric($marking)) { $payment_reference = explode(" ", trim($transaction->payment_reference)); if (count($payment_reference) > 1) { $marking = $payment_reference[count($payment_reference) - 2]; } } if (is_numeric($marking)) { $booking = Booking::where('marking', $marking)->first(); if ($booking) { if ($booking->status === ApprovalStatus::APPROVED) { $bookingPayment = $booking->transactions()->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->first(); if (!$bookingPayment) { $bookingPayment = $booking->transactions()->payments()->count(); Log::info("Credit note transaction id: {$transaction->id}, there are {$bookingPayment} payment for the booking."); $bookingPayment = $booking->transactions()->payments()->whereIn('status', [ApprovalStatus::EXPIRED, ApprovalStatus::REJECTED])->first(); $status = ApprovalStatus::APPROVAL_STATUS_ID[$bookingPayment->status]; Log::info("Credit note transaction id: {$transaction->id}, the payment for the booking is in status {$status}"); } $bookingPaymentAmount = $bookingPayment->amount; // check if the booking is fully refund $amountDifference = bcsub($transaction->amount, $bookingPaymentAmount); if (abs($amountDifference) < 0.01) { // rejecting booking payment transaction $bookingPayment->status = ApprovalStatus::REJECTED; $bookingPayment->save(); //expired booking $this->updatesBookingStatus->execute($booking, ApprovalStatus::EXPIRED); Log::info("Credit note transaction id: {$transaction->id} is fully refunded, the refunded amount was {$transaction->amount} the payment reference is: {$transaction->payment_reference}"); Log::info("Credit note transaction id: {$transaction->id}, Rejected Booking Transaction Payment id: {$bookingPayment->id}, the payment amount was {$bookingPayment->amount}"); Log::info("Credit note transaction id: {$transaction->id}, Expired Booking id: {$booking->id}"); } else { Log::info("Credit note transaction id: {$transaction->id} is not fully refunded, the refunded amount was {$transaction->amount}, the payment amount was {$bookingPayment->amount}, the payment reference is: {$transaction->payment_reference}"); } } else { $status = ApprovalStatus::APPROVAL_STATUS_ID[$booking->status]; Log::info("Credit note transaction id: {$transaction->id}, booking status is {$status}"); } } else { Log::info("Credit note transaction id: {$transaction->id}, booking marking not found, the payment reference is: {$transaction->payment_reference}"); } } else { Log::info("Credit note transaction id: {$transaction->id} does not have booking marking, the payment reference is: {$transaction->payment_reference}"); } } } }