diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php index 1d3be5c9..f9c79326 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php @@ -4,24 +4,22 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; - use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\Banks\Services\FetchesBank; -use App\Classes\Modules\Currencies\Services\FetchesCurrency; - use App\Classes\Modules\Bookings\Standards\Rules\CanCreateBooking; use App\Classes\Modules\Bookings\Services\CreatesBooking; use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking; - use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor; use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor; +use App\Classes\Modules\Vouchers\DataTransferObjects\CreateVoucherifyOrderObject; +use App\Classes\Modules\Vouchers\Services\Voucherify\CreatesVoucherifyOrder; +use App\Classes\Modules\Vouchers\Services\CreatesVoucherEntityMapping; +use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherEntityObject; use App\Classes\ValueObjects\Constants\BookingAttributeNames; -use App\Classes\ValueObjects\Constants\Milestones; +use App\Classes\ValueObjects\Constants\VoucherifyEntityType; use App\Http\Resources\BookingResource; - +use App\Models\User; use App\Models\Booking; -use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -56,6 +54,11 @@ class CreateBookingLogic extends AbstractControllerLogic /** @var CheckMilestonesForRewardProcessor */ private $checkMilestonesForRewardProcessor; + /** @var CreatesVoucherifyOrder */ + private $createsVoucherifyOrder; + + /** @var CreatesVoucherEntityMapping */ + private $createsVoucherEntityMapping; /** * CreateBookingLogic constructor. @@ -65,8 +68,10 @@ class CreateBookingLogic extends AbstractControllerLogic * @param FetchesCompany $fetchesCompany * @param BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor * @param CheckMilestoneForRewardProcessor $checkMilestonesForRewardProcessor + * @param CreatesVoucherifyOrder $createsVoucherifyOrder + * @param CreatesVoucherEntityMapping $createsVoucherEntityMapping */ - public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor) + public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor, CreatesVoucherifyOrder $createsVoucherifyOrder, CreatesVoucherEntityMapping $createsVoucherEntityMapping) { $this->canCreateBooking = $canCreateBooking; $this->createsBooking = $createsBooking; @@ -74,6 +79,8 @@ class CreateBookingLogic extends AbstractControllerLogic $this->fetchesCompany = $fetchesCompany; $this->bookingToPerfexCRMProcessor = $bookingToPerfexCRMProcessor; $this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor; + $this->createsVoucherifyOrder = $createsVoucherifyOrder; + $this->createsVoucherEntityMapping = $createsVoucherEntityMapping; } @@ -123,6 +130,23 @@ class CreateBookingLogic extends AbstractControllerLogic } } + $voucherify_customer_id = ""; + $voucherify_order_id = ""; + + $user = $company->employees()->first(); + $createVoucherifyOrderObject = new CreateVoucherifyOrderObject($user, $company->id, $booking->id, 0, 0, false, false); + $createVoucherufyOrderResult = $this->createsVoucherifyOrder->execute($createVoucherifyOrderObject); + + if($createVoucherufyOrderResult && isset($createVoucherufyOrderResult->id)){ + $voucherify_order_id = $createVoucherufyOrderResult->id; + if(isset($createVoucherufyOrderResult->customer)){ + $voucherify_customer_id = $createVoucherufyOrderResult->customer->id; + } + } + + $this->recordVoucherifyOrderInfo($voucherify_order_id, $booking); + $this->recordVoucherifyCustomerInfo($voucherify_customer_id, $user); + //cief todo: case study 5 voucherify // $user = $company->employees()->first(); // $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_5]); @@ -130,4 +154,24 @@ class CreateBookingLogic extends AbstractControllerLogic return $this->resourceResponse(new BookingResource($booking)); } + + private function recordVoucherifyOrderInfo(string $voucherify_order_id, Booking $booking){ + if($voucherify_order_id){ + $voucherify_entity = $booking->voucherifyEntities()->first(); + if(!$voucherify_entity){ + $voucherEntityObject = new VoucherEntityObject($voucherify_order_id, VoucherifyEntityType::ORDER); + $this->createsVoucherEntityMapping->execute($booking, $voucherEntityObject); + } + } + } + + private function recordVoucherifyCustomerInfo(string $voucherify_customer_id, User $user){ + if($voucherify_customer_id){ + $voucherify_entity = $user->voucherifyEntities()->first(); + if(!$voucherify_entity){ + $voucherEntityObject = new VoucherEntityObject($voucherify_customer_id, VoucherifyEntityType::CUSTOMER); + $this->createsVoucherEntityMapping->execute($user, $voucherEntityObject); + } + } + } } diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php index c652e773..ab013c75 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php @@ -15,22 +15,21 @@ use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\Modules\Billplzs\Services\CreatesBillplzBill; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance; +use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject; +use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; +use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor; +use App\Classes\Modules\Vouchers\Processors\Voucherify\BookingToVoucherifyProcessor; +use App\Classes\Modules\Wallets\Services\RecalculatesWalletBalance; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\TransactionType; -use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject; use App\Http\Resources\TransactionResource; -use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; - -use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor; -use App\Classes\Modules\Vouchers\Processors\Voucherify\BookingToVoucherifyProcessor; - use App\Models\Booking; use App\Models\Transaction; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use App\Classes\Modules\Wallets\Services\RecalculatesWalletBalance; +use Illuminate\Support\Facades\Log; class CreateBookingPaymentLogic extends AbstractControllerLogic { @@ -130,7 +129,7 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic /** @var Transaction $transaction */ $transaction = $this->createsTransaction->execute($booking, $object); - $this->bookingToVoucherifyProcessor->execute($booking->company->employees()->first(), $transaction, $booking->company->id, $configurations->getSubTotal(), $configurations->getVoucherDiscountAmount(), $voucherCode); + $this->bookingToVoucherifyProcessor->execute($booking->company->employees()->first(), $transaction, $booking->company->id, $configurations->getSubTotal(), $configurations->getServiceCharge(), $configurations->getVoucherDiscountAmount(), $voucherCode); if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::PAYMENT_GATEWAY){ $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_VERIFICATION); diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 5534b6a0..35a55f79 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -125,7 +125,6 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $redemptionId = null; if ($transaction->voucherRedemption) { - // $voucherCode = $transaction->voucherRedemption->voucher->code; $redemptionId = $transaction->voucherRedemption->redemption_id; } @@ -133,13 +132,12 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $conversionObjectAfterRefund = new CurrencyConversionObject($isFullyRefund ? $request->input('amount') : $bookingAmountAfterRefunded, $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, $transaction->payment_method); - $quotationBeforeCurrentRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectBeforeCurrentRefund, $voucherCode, $redemptionId); + $quotationBeforeCurrentRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectBeforeCurrentRefund, $voucherCode, $redemptionId, $booking); - $quotationAfterRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectAfterRefund, $voucherCode, $redemptionId); + $quotationAfterRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectAfterRefund, $voucherCode, $redemptionId, $booking); $service_charges_to_refund = $isFullyRefund ? $quotationBeforeCurrentRefund->getServiceCharge() : $quotationBeforeCurrentRefund->getServiceCharge() - $quotationAfterRefund->getServiceCharge(); - // refund service charges if booking is not E2E $refundTotal = $refundAmount; diff --git a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php index e9a42101..1c9cdcfd 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php @@ -50,6 +50,7 @@ class FetchBookingPaymentQuotationLogic extends AbstractControllerLogic * @param GeneratesBookingQuotation $generatesBookingQuotation * @param FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit * @param CalculatesBookingOutstanding $calculatesBookingOutstanding + * @param CalculatesBookingRefundAmount $calculatesBookingRefundAmount */ public function __construct(FetchesBookingQuotation $fetchBookingQuotation, GeneratesBookingQuotation $generatesBookingQuotation, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, CalculatesBookingOutstanding $calculatesBookingOutstanding, CalculatesBookingRefundAmount $calculatesBookingRefundAmount) { @@ -78,7 +79,7 @@ class FetchBookingPaymentQuotationLogic extends AbstractControllerLogic $voucherCode = $request->input('voucherCode'); return $this->response(['data' => $this->generatesBookingQuotation->execute( - $this->fetchBookingQuotation->execute($booking->company, $conversionObject, $voucherCode), + $this->fetchBookingQuotation->execute($booking->company, $conversionObject, $voucherCode, null, $booking), $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company), $conversionObject )]); diff --git a/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php b/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php index a1291207..6015519b 100644 --- a/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php +++ b/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php @@ -12,8 +12,11 @@ use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherOb use App\Classes\Modules\Currencies\Services\FetchesCurrency; use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher; use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyRedemption; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher; +use App\Models\Booking; use App\Models\Company; use App\Models\Currency; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Log; class FetchesBookingQuotation @@ -31,19 +34,24 @@ class FetchesBookingQuotation /** @var FetchesVoucherifyRedemption */ private $fetchesVoucherifyRedemption; + /** @var FetchesVoucherifyVoucher */ + private $fetchesVoucherifyVoucher; + /** * FetchesBookingQuotation constructor. * @param FetchesCompanyServiceSettings $fetchesCompanyServiceSettings * @param FetchesCurrency $fetchesCurrency * @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher * @param FetchesVoucherifyRedemption $fetchesVoucherifyRedemption + * @param FetchesVoucherifyVoucher $fetchesVoucherifyVoucher */ - public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher, FetchesVoucherifyRedemption $fetchesVoucherifyRedemption) + public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher, FetchesVoucherifyRedemption $fetchesVoucherifyRedemption, FetchesVoucherifyVoucher $fetchesVoucherifyVoucher) { $this->fetchesCompanyServiceSettings = $fetchesCompanyServiceSettings; $this->fetchesCurrency = $fetchesCurrency; $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; $this->fetchesVoucherifyRedemption = $fetchesVoucherifyRedemption; + $this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher; } @@ -55,7 +63,7 @@ class FetchesBookingQuotation * @return CalculationObject * @throws MalformedRequestException */ - public function execute(Company $company, CurrencyConversionObject $conversionObject, ?string $voucherCode = null, ?string $redemptionId = null){ + public function execute(Company $company, CurrencyConversionObject $conversionObject, ?string $voucherCode = null, ?string $redemptionId = null, ?Booking $booking = null){ if($conversionObject->getAmount() <= 0) throw new MalformedRequestException('Your transfer must be greater than zero.'); $configurations = $this->fetchesCompanyServiceSettings->execute($company, $conversionObject); @@ -66,9 +74,8 @@ class FetchesBookingQuotation $calculationObject = new CalculationObject($conversionObject, $configurations, null); - $voucher = null; - //Voucherify + $voucher = null; if($voucherCode){ $employeeWhoOwnsTheVoucher = null; @@ -89,13 +96,27 @@ class FetchesBookingQuotation $employeeWhoOwnsTheVoucher = $company->employees()->first(); } - $validateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject($company->id, $voucherCode, $calculationObject->getSubTotal(), $employeeWhoOwnsTheVoucher); + $isNewOrder = false; + $voucherifyVoucherFetched = $this->fetchesVoucherifyVoucher->execute($employeeWhoOwnsTheVoucher, $voucherCode); + if($booking && $voucherifyVoucherFetched && isset($voucherifyVoucherFetched->created_at)) { + $voucherifyDate = Carbon::parse($voucherifyVoucherFetched->created_at); + $bookingDate = Carbon::parse($booking->created_at); + + if ($voucherifyDate->gt($bookingDate)) { // 'gt' means 'greater than' + Log::info("voucherifyVoucherFetched created_at: " . json_encode($voucherifyVoucherFetched->created_at). ", voucher code: " . $voucherCode); + Log::info("booking created_at: " . json_encode($booking->created_at) . ", booking id: " . json_encode($booking->id)); + } else { + $isNewOrder = true; + } + } + + $validateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject($company->id, $voucherCode, $calculationObject->getSubTotal(), $calculationObject->getServiceCharge(), $employeeWhoOwnsTheVoucher, $isNewOrder); $result = $this->validatesVoucherifyVoucher->execute($validateVoucherifyVoucherObject); $voucher = [ "code" => $result->code, "discount" => property_exists($result, 'discount') ? $result->discount : null, - "metadata" => $result->metadata, - "order" => $result->order, + "metadata" => property_exists($result, 'metadata') ? $result->metadata : null, + "order" => property_exists($result, 'order') ? $result->order : null, ]; } else if($redemptionId){ @@ -109,12 +130,22 @@ class FetchesBookingQuotation } if($voucher){ + $totalDiscountAmount = 0; + $totalAmount = 0; + + if(isset($voucher['order']->total_discount_amount)){ + $totalDiscountAmount = $voucher['order']->total_discount_amount; + } + if(isset($voucher['order']->total_amount)){ + $totalAmount = $voucher['order']->total_amount; + } + $validatedVoucherObject = new ValidatedVoucherObject( isset($voucher['metadata']->name) ? $voucher['metadata']->name : "", $voucher['code'], $voucher['discount']->type ?? 'AMOUNT', - $voucher['order']->total_discount_amount, - $voucher['order']->total_amount); + $totalDiscountAmount, + $totalAmount); $calculationObject = new CalculationObject($conversionObject, $configurations, $validatedVoucherObject); } diff --git a/app/Classes/Modules/Companies/ControllersLogic/FetchCompanyBookingQuotationLogic.php b/app/Classes/Modules/Companies/ControllersLogic/FetchCompanyBookingQuotationLogic.php index 2fc53955..5d628411 100644 --- a/app/Classes/Modules/Companies/ControllersLogic/FetchCompanyBookingQuotationLogic.php +++ b/app/Classes/Modules/Companies/ControllersLogic/FetchCompanyBookingQuotationLogic.php @@ -65,7 +65,7 @@ class FetchCompanyBookingQuotationLogic extends AbstractControllerLogic $conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $request->input('amount'))), $request->input('currency_id'), $request->input('service_id'), $request->input('type')); - $calculationObject = $this->fetchBookingQuotation->execute($company, $conversionObject); + $calculationObject = $this->fetchBookingQuotation->execute($company, $conversionObject); //cief todo: 76 /** @var Currency $currency */ $currency = $this->fetchesCurrency->execute(['id' => $conversionObject->getCurrencyId()]); @@ -77,4 +77,4 @@ class FetchCompanyBookingQuotationLogic extends AbstractControllerLogic } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php b/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php index 805e8555..1cb9cf4c 100644 --- a/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php +++ b/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php @@ -139,7 +139,7 @@ class CheckMilestonesForRewardProcessor } else{ //Voucherify - Validates Voucher - $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $reward->value, 0.00, $user); + $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $reward->value, 0, 0, $user); $voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject); if(!isset($voucherifyVoucherValidated->reason)){ diff --git a/app/Classes/Modules/Transactions/ControllersLogic/SuspendTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/SuspendTransactionLogic.php index 0500d6ae..7b253317 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/SuspendTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/SuspendTransactionLogic.php @@ -5,14 +5,10 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transactions\Services\FetchesTransaction; -use App\Classes\Modules\Transactions\Services\ListsTransactions; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\Modules\Vouchers\Services\FetchesVoucherRedemption; use App\Classes\Modules\Vouchers\Services\CreatesVoucherRedemption; use App\Classes\Modules\Vouchers\Services\RollbacksRedemption; use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Http\Resources\BookingResource; -use App\Http\Resources\TransactionResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -38,9 +34,6 @@ class SuspendTransactionLogic extends AbstractControllerLogic /** @var RollbacksRedemption */ private $rollbacksRedemption; - /** @var FetchesVoucherRedemption */ - private $fetchesVoucherRedemption; - /** @var CreatesVoucherRedemption */ private $createsVoucherRedemption; @@ -49,35 +42,34 @@ class SuspendTransactionLogic extends AbstractControllerLogic * @param FetchesTransaction $fetchesTransaction * @param UpdatesTransactionStatus $updatesTransactionStatus */ - public function __construct(FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, RollbacksRedemption $rollbacksRedemption, FetchesVoucherRedemption $fetchesVoucherRedemption, CreatesVoucherRedemption $createsVoucherRedemption) + public function __construct(FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, RollbacksRedemption $rollbacksRedemption, CreatesVoucherRedemption $createsVoucherRedemption) { $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->rollbacksRedemption = $rollbacksRedemption; - $this->fetchesVoucherRedemption = $fetchesVoucherRedemption; $this->createsVoucherRedemption = $createsVoucherRedemption; } public function logic(Request $request) : JsonResponse { - $transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::SUSPENDED); if($transaction->voucherRedemption) { $result = $this->rollbacksRedemption->execute($transaction->voucherRedemption->redemption_id); + //Soft delete voucher redeemed record + $transaction->voucherRedemption->delete(); if($result){ $redemptionId = $result->id; - $this->createsVoucherRedemption->execute($transaction, $transaction->voucherRedemption->voucher, $redemptionId, $transaction->voucherRedemption->value); + $rollbackRecord = $this->createsVoucherRedemption->execute($transaction, $transaction->voucherRedemption->voucher, $redemptionId, $transaction->voucherRedemption->value); + + //Soft delete the rollback record immediately, for recording purpose only + $rollbackRecord->delete(); } } return $this->response([]); - } - - - } diff --git a/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php index 079e55d9..7880187b 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php @@ -117,11 +117,11 @@ class CreateProformaInvoiceTransactionProcessor $outstanding = $this->calculatesBookingOutstanding->execute($booking); $conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $outstanding)), $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0 : 1, PaymentMethodType::CASH); - - $configurations = $this->fetchesBookingQuotation->execute($booking->company, $conversionObject); - + + $configurations = $this->fetchesBookingQuotation->execute($booking->company, $conversionObject); //cief todo: 76 + $paymentAttemptLimit = $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company); - + $billNumber = $this->generatesTransactionBillNumber->execute('PYMT-'); $object = new TransactionObject( diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php index e345ebcf..bf809212 100644 --- a/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php +++ b/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php @@ -142,7 +142,7 @@ class CreateVoucherLogic extends AbstractControllerLogic } //Voucherify - creates new voucher at voucherify - if ($voucherCodeInput === Vouchers::SORRY_50 || $voucherCodeInput === Vouchers::SORRY_100 || $voucherCodeInput === Vouchers::SORRY_200 ) { + if ($voucherCodeInput === Vouchers::SORRY_50 || $voucherCodeInput === Vouchers::SORRY_100 || $voucherCodeInput === Vouchers::SORRY_200 || $voucherCodeInput === Vouchers::CIEFPC30) { $result = $this->newVoucherifyVoucherIssuanceHandler($voucherCodeInput); } else //Voucherify - validates existing voucher at voucherify @@ -190,6 +190,9 @@ class CreateVoucherLogic extends AbstractControllerLogic if(isset($campaignMetadata) && isset($campaignMetadata['voucher_limit_per_month'])){ $limit = (int) $campaignMetadata['voucher_limit_per_month']; } + else{ + $limit = 9999; + } $voucherCampaignObject= new VoucherCampaignObject($campaignId, $campaignName, null, $limit); $this->updatesVoucherCampaign->execute($voucherCampaign, $voucherCampaignObject); @@ -231,7 +234,7 @@ class CreateVoucherLogic extends AbstractControllerLogic private function existingVoucherValidationHandler(string $voucherCodeInput, User $user){ $result = []; - $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $voucherCodeInput, 0.00, $user); + $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $voucherCodeInput, 0, 0, $user, true); //When adding voucher into user account, isNewOrder is marked as true, some campaign has validation on this property $voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject); //Remote Voucherify if(isset($voucherifyVoucherValidated->reason)){ diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/ValidateVoucherLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/ValidateVoucherLogic.php index 41b2724d..1a98dfde 100644 --- a/app/Classes/Modules/Vouchers/ControllersLogic/ValidateVoucherLogic.php +++ b/app/Classes/Modules/Vouchers/ControllersLogic/ValidateVoucherLogic.php @@ -7,10 +7,16 @@ use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher; use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherObject; +use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher; +use App\Classes\Modules\Bookings\DataTransferObjects\CalculationObject; +use App\Classes\Modules\Companies\Services\FetchesCompanyServiceSettings; +use App\Classes\Modules\Currencies\Services\FetchesCurrency; +use App\Models\Booking; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use App\Models\Booking; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Carbon; class ValidateVoucherLogic extends AbstractControllerLogic { @@ -19,21 +25,36 @@ class ValidateVoucherLogic extends AbstractControllerLogic */ protected function notification():array { return [ - 'title' => 'Fetch Voucher', - 'message' => 'You have successfully fetched a voucher' + 'title' => 'Validate Voucher', + 'message' => 'You have successfully validated a voucher' ]; } /** @var ValidatesVoucherifyVoucher */ private $validatesVoucherifyVoucher; + /** @var FetchesVoucherifyVoucher */ + private $fetchesVoucherifyVoucher; + + /** @var FetchesCompanyServiceSettings */ + private $fetchesCompanyServiceSettings; + + /** @var FetchesCurrency */ + private $fetchesCurrency; + /** * ValidateVoucherLogic constructor. * @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher + * @param FetchesVoucherifyVoucher $fetchesVoucherifyVoucher + * @param FetchesCompanyServiceSettings $fetchesCompanyServiceSettings + * @param FetchesCurrency $fetchesCurrency */ - public function __construct(ValidatesVoucherifyVoucher $validatesVoucherifyVoucher) + public function __construct(ValidatesVoucherifyVoucher $validatesVoucherifyVoucher, FetchesVoucherifyVoucher $fetchesVoucherifyVoucher, FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency) { $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; + $this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher; + $this->fetchesCompanyServiceSettings = $fetchesCompanyServiceSettings; + $this->fetchesCurrency = $fetchesCurrency; } /** @@ -45,6 +66,21 @@ class ValidateVoucherLogic extends AbstractControllerLogic { $employeeWhoOwnsTheVoucher = null; $booking = Booking::find($request->input('itemId')); + + //Need to get amount in MYR, not currency to be exchanged - starts + $conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $request->input('amount'))), $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1); //default $paymentMethod = PaymentMethodType::CASH + + if($conversionObject->getAmount() <= 0) throw new MalformedRequestException('Your transfer must be greater than zero.'); + + $configurations = $this->fetchesCompanyServiceSettings->execute($booking->company, $conversionObject); + + /** @var Currency $currency */ + $currency = $this->fetchesCurrency->execute(['id' => $conversionObject->getCurrencyId()]); + if($conversionObject->getAmount() > $configurations->getMaxLimit()) throw new MalformedRequestException('Your transfer can\'t be greater than '.number_format( floatval(str_replace(',', '', $configurations->getMaxLimit())), 2, '.', ',').' '.$currency->short_code); + + $calculationObject = new CalculationObject($conversionObject, $configurations, null); + //Need to get amount in MYR, not currency to be exchanged - ends + $employees = $booking->company->employees()->get(); if(count($employees) > 1){ @@ -63,10 +99,26 @@ class ValidateVoucherLogic extends AbstractControllerLogic $employeeWhoOwnsTheVoucher = $booking->company->employees()->first(); } - $amount = $this->floatvalue($request->input('amount')); - $validateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject($booking->company_id, $request->input('voucherCode'), $amount, $employeeWhoOwnsTheVoucher); + $isNewOrder = false; + $voucherifyVoucherFetched = $this->fetchesVoucherifyVoucher->execute($employeeWhoOwnsTheVoucher, $request->input('voucherCode')); + if($voucherifyVoucherFetched && isset($voucherifyVoucherFetched->created_at)) { + $voucherifyDate = Carbon::parse($voucherifyVoucherFetched->created_at); + $bookingDate = Carbon::parse($booking->created_at); + + if ($voucherifyDate->gt($bookingDate)) { // 'gt' means 'greater than' + Log::info("voucherifyVoucherFetched created_at: " . json_encode($voucherifyVoucherFetched->created_at). ", voucher code: " . $request->input('voucherCode')); + Log::info("booking created_at: " . json_encode($booking->created_at) . ", booking id: " . json_encode($booking->id)); + Log::info("The voucherify voucher was created later than the booking."); + } else { + $isNewOrder = true; + } + } + + $validateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject($booking->company_id, $request->input('voucherCode'), $calculationObject->getTotal(), $calculationObject->getServiceCharge(), $employeeWhoOwnsTheVoucher, $isNewOrder); $result = $this->validatesVoucherifyVoucher->execute($validateVoucherifyVoucherObject); + Log::info("ValidateVoucherLogic validatesVoucherifyVoucher: " .json_encode($result)); + return $this->response(['data' => $result]); } diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherifyOrderObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherifyOrderObject.php index c483d45e..c0d02b0e 100644 --- a/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherifyOrderObject.php +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherifyOrderObject.php @@ -15,11 +15,14 @@ class CreateVoucherifyOrderObject implements DataTransferObject private $companyId; /** @var int */ - private $transactionId; + private $ownerId; /** @var float */ private $amount; + /** @var float */ + private $serviceCharge; + /** @var bool */ private $isNoVoucher; @@ -30,17 +33,19 @@ class CreateVoucherifyOrderObject implements DataTransferObject * CreateVoucherifyOrderObject constructor. * @param User $employee * @param int $companyId - * @param int $transactionId + * @param int $ownerId * @param float $amount + * @param float $serviceCharge * @param bool $isNoVoucher * @param bool $isTopUpWallet */ - public function __construct(User $employee, int $companyId, int $transactionId, float $amount, bool $isNoVoucher, bool $isTopUpWallet) + public function __construct(User $employee, int $companyId, int $ownerId, float $amount, float $serviceCharge, bool $isNoVoucher = false, bool $isTopUpWallet = false) { $this->employee = $employee; $this->companyId = $companyId; - $this->transactionId = $transactionId; + $this->ownerId = $ownerId; $this->amount = $amount; + $this->serviceCharge = $serviceCharge; $this->isNoVoucher = $isNoVoucher; $this->isTopUpWallet = $isTopUpWallet; } @@ -56,9 +61,9 @@ class CreateVoucherifyOrderObject implements DataTransferObject /** * @return int */ - public function getTransactionId(): int + public function getOwnerId(): int { - return $this->transactionId; + return $this->ownerId; } /** @@ -69,6 +74,14 @@ class CreateVoucherifyOrderObject implements DataTransferObject return $this->amount; } + /** + * @return float + */ + public function getServiceCharge(): float + { + return $this->serviceCharge; + } + /** * @return User */ diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/RedeemVoucherifyVoucherObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/RedeemVoucherifyVoucherObject.php index 325df2f4..3882c610 100644 --- a/app/Classes/Modules/Vouchers/DataTransferObjects/RedeemVoucherifyVoucherObject.php +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/RedeemVoucherifyVoucherObject.php @@ -15,27 +15,42 @@ class RedeemVoucherifyVoucherObject implements DataTransferObject /** @var string */ private $promoCode; - /** @var string */ + /** @var float */ private $amount; + /** @var float */ + private $serviceCharge; + /** @var object */ private $employee; + /** @var string */ + private $voucherifyOrderId; + + /** @var bool */ + private $isNewOrder; //comparing booking and voucher date, an order is deemed new when booking is created after receiving voucher + /** * RedeemVoucherifyVoucherObject constructor. * @param int $companyId * @param int $transactionId - * @param string $name - * @param string $email + * @param string $promoCode + * @param float $amount + * @param float $serviceCharge * @param object $employee + * @param string $voucherifyOrderId + * @param bool $isNewOrder */ - public function __construct(int $companyId, int $transactionId, string $promoCode, string $amount, object $employee) + public function __construct(int $companyId, int $transactionId, string $promoCode, float $amount, float $serviceCharge, object $employee, string $voucherifyOrderId, ?bool $isNewOrder = null) { $this->companyId = $companyId; $this->transactionId = $transactionId; $this->promoCode = $promoCode; $this->amount = $amount; + $this->serviceCharge = $serviceCharge; $this->employee = $employee; + $this->voucherifyOrderId = $voucherifyOrderId; + $this->isNewOrder = $isNewOrder; } /** @@ -65,13 +80,21 @@ class RedeemVoucherifyVoucherObject implements DataTransferObject } /** - * @return string + * @return float */ - public function getAmount(): string + public function getAmount(): float { return $this->amount; } + /** + * @return float + */ + public function getServiceCharge(): float + { + return $this->serviceCharge; + } + /** * @return object */ @@ -80,4 +103,19 @@ class RedeemVoucherifyVoucherObject implements DataTransferObject return $this->employee; } + /** + * @return string + */ + public function getVoucherifyOrderId(): string + { + return $this->voucherifyOrderId; + } + + /** + * @return bool|null + */ + public function getIsNewOrder(): ?bool + { + return $this->isNewOrder; + } } diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherifyOrderObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherifyOrderObject.php index bc49ee86..72457b48 100644 --- a/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherifyOrderObject.php +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/UpdateVoucherifyOrderObject.php @@ -8,28 +8,54 @@ use App\Classes\General\Interfaces\DataTransferObject; class UpdateVoucherifyOrderObject implements DataTransferObject { /** @var string */ - private $id; + private $voucherifyOrderId; + + /** @var int */ + private $bookingId; + + /** @var int */ + private $transactionId; /** @var string */ private $status; /** * UpdateVoucherifyOrderObject constructor. - * @param string $id + * @param string $voucherifyOrderId + * @param int $bookingId + * @param int $transactionId * @param string $status */ - public function __construct(string $id, string $status) + public function __construct(string $voucherifyOrderId, int $bookingId, int $transactionId, string $status) { - $this->id = $id; + $this->voucherifyOrderId = $voucherifyOrderId; + $this->bookingId = $bookingId; + $this->transactionId = $transactionId; $this->status = $status; } /** * @return string */ - public function getId(): string + public function getVoucherifyOrderId(): string { - return $this->id; + return $this->voucherifyOrderId; + } + + /** + * @return int + */ + public function getBookingId(): int + { + return $this->bookingId; + } + + /** + * @return int + */ + public function getTransactionId(): int + { + return $this->transactionId; } /** diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/ValidateVoucherifyVoucherObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/ValidateVoucherifyVoucherObject.php index 956afc00..d42d80a2 100644 --- a/app/Classes/Modules/Vouchers/DataTransferObjects/ValidateVoucherifyVoucherObject.php +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/ValidateVoucherifyVoucherObject.php @@ -17,22 +17,32 @@ class ValidateVoucherifyVoucherObject implements DataTransferObject /** @var float */ private $amount; + /** @var float */ + private $serviceCharge; + /** @var User */ private $user; //this will affect certain voucher that limit user redemption e.g. one user one redemption per campaign + /** @var bool */ + private $isNewOrder; //comparing booking and voucher date, an order is deemed new when booking is created after receiving voucher + /** * ValidateVoucherifyVoucherObject constructor. * @param int $companyId * @param string $voucherCode * @param float $amount + * @param float $serviceCharge * @param User $user + * @param bool $isNewOrder */ - public function __construct(int $companyId, string $voucherCode, float $amount, User $user) + public function __construct(int $companyId, string $voucherCode, float $amount, float $serviceCharge, User $user, ?bool $isNewOrder = null) { $this->companyId = $companyId; $this->voucherCode = $voucherCode; $this->amount = $amount; + $this->serviceCharge = $serviceCharge; $this->user = $user; + $this->isNewOrder = $isNewOrder; } /** @@ -59,6 +69,14 @@ class ValidateVoucherifyVoucherObject implements DataTransferObject return $this->amount; } + /** + * @return float + */ + public function getServiceCharge(): float + { + return $this->serviceCharge; + } + /** * @return User */ @@ -67,4 +85,12 @@ class ValidateVoucherifyVoucherObject implements DataTransferObject return $this->user; } + /** + * @return bool|null + */ + public function getIsNewOrder(): ?bool + { + return $this->isNewOrder; + } + } diff --git a/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php b/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php index 92a3a484..ecaae0b1 100644 --- a/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php +++ b/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php @@ -69,6 +69,10 @@ class CreateVoucherProcessor $voucherStartDate = $voucherifyVoucherFetched->start_date; $voucherEndDate = $voucherifyVoucherFetched->expiration_date; + if(isset($voucherifyVoucherFetched->discount->amount_off_formula)){ + $voucherType = 'PERCENT'; + } + //Locally - Create and Fetch Voucher $voucherObject = new VoucherObject( $voucherCode, diff --git a/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php b/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php index c4d959d2..ab887aa3 100644 --- a/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php +++ b/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php @@ -11,6 +11,7 @@ use App\Classes\Modules\Vouchers\DataTransferObjects\RedeemVoucherifyVoucherObje use App\Classes\Modules\Vouchers\DataTransferObjects\CreateVoucherifyOrderObject; use App\Classes\Modules\Vouchers\Services\Voucherify\CreatesVoucherifyOrder; use App\Classes\Modules\Vouchers\Services\CreatesVoucherEntityMapping; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher; use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherEntityObject; use App\Classes\Modules\Rewards\Services\CreatesUserReward; use App\Classes\ValueObjects\Constants\TransactionType; @@ -19,6 +20,7 @@ use App\Models\User; use App\Models\Transaction; use App\Models\Voucher; use App\Models\VoucherCampaign; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Log; class BookingToVoucherifyProcessor @@ -44,6 +46,9 @@ class BookingToVoucherifyProcessor /** @var CreatesUserReward */ private $createsUserReward; + /** @var FetchesVoucherifyVoucher */ + private $fetchesVoucherifyVoucher; + /** * BookingToVoucherifyProcessor constructor. * @param CreatesVoucher $createsVoucher @@ -53,8 +58,9 @@ class BookingToVoucherifyProcessor * @param CreatesVoucherifyOrder $createsVoucherifyOrder * @param CreatesVoucherEntityMapping $createsVoucherEntityMapping * @param CreatesUserReward $createsUserReward + * @param FetchesVoucherifyVoucher $fetchesVoucherifyVoucher */ - public function __construct(CreatesVoucher $createsVoucher, FetchesVoucher $fetchesVoucher, CreatesVoucherRedemption $createsVoucherRedemption, RedeemsVoucherifyVoucher $redeemsVoucherifyVoucher, CreatesVoucherifyOrder $createsVoucherifyOrder, CreatesVoucherEntityMapping $createsVoucherEntityMapping, CreatesUserReward $createsUserReward) + public function __construct(CreatesVoucher $createsVoucher, FetchesVoucher $fetchesVoucher, CreatesVoucherRedemption $createsVoucherRedemption, RedeemsVoucherifyVoucher $redeemsVoucherifyVoucher, CreatesVoucherifyOrder $createsVoucherifyOrder, CreatesVoucherEntityMapping $createsVoucherEntityMapping, CreatesUserReward $createsUserReward, FetchesVoucherifyVoucher $fetchesVoucherifyVoucher) { $this->createsVoucher = $createsVoucher; $this->fetchesVoucher = $fetchesVoucher; @@ -63,6 +69,7 @@ class BookingToVoucherifyProcessor $this->createsVoucherifyOrder = $createsVoucherifyOrder; $this->createsVoucherEntityMapping = $createsVoucherEntityMapping; $this->createsUserReward = $createsUserReward; + $this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher; } @@ -71,13 +78,14 @@ class BookingToVoucherifyProcessor * @param Transaction $transaction * @param int $companyId * @param float $amount + * @param float $serviceCharge * @param float $voucherDiscountAmount * @param string $voucherCode * @return void * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \Voucherify\ClientException */ - public function execute(User $user, Transaction $transaction, int $companyId, float $amount, float $voucherDiscountAmount, ?string $voucherCode = "") + public function execute(User $user, Transaction $transaction, int $companyId, float $amount, float $serviceCharge, float $voucherDiscountAmount, ?string $voucherCode = "") { try{ $voucherify_customer_id = ""; @@ -102,11 +110,25 @@ class BookingToVoucherifyProcessor $employeeWhoOwnsTheVoucher = $user; } - $redeemVoucherifyVoucherObject = new RedeemVoucherifyVoucherObject($companyId, $transaction->id, $voucherCode, $amount, $employeeWhoOwnsTheVoucher); + $isNewOrder = false; + $booking = $transaction->booking; + $voucherifyVoucherFetched = $this->fetchesVoucherifyVoucher->execute($employeeWhoOwnsTheVoucher, $voucherCode); + if($voucherifyVoucherFetched && isset($voucherifyVoucherFetched->created_at)) { + $voucherifyDate = Carbon::parse($voucherifyVoucherFetched->created_at); + $bookingDate = Carbon::parse($booking->created_at); + if ($voucherifyDate->gt($bookingDate)) { // 'gt' means 'greater than' + Log::info("voucherifyVoucherFetched created_at: " . json_encode($voucherifyVoucherFetched->created_at). ", voucher code: " . $voucherCode); + Log::info("booking created_at: " . json_encode($booking->created_at) . ", booking id: " . json_encode($booking->id)); + Log::info("The voucherify voucher was created later than the booking."); + } else { + $isNewOrder = true; + } + } + + + $voucherify_entity = $booking->voucherifyEntities()->first(); //cief todo: 76 could be filtered more precisely to prevent fetching wrong record + $redeemVoucherifyVoucherObject = new RedeemVoucherifyVoucherObject($companyId, $transaction->id, $voucherCode, $amount, $serviceCharge, $employeeWhoOwnsTheVoucher, $voucherify_entity->voucherify_entity_id, $isNewOrder); $redeemVoucherResult = $this->redeemsVoucherifyVoucher->execute($redeemVoucherifyVoucherObject); - - // Log::info('redeemVoucherResult: '.json_encode($redeemVoucherResult)); - $redeemedVoucher = $redeemVoucherResult->voucher; $redemptionId = $redeemVoucherResult->id; @@ -123,7 +145,8 @@ class BookingToVoucherifyProcessor $this->recordVoucherForUserInfo($employeeWhoOwnsTheVoucher, $voucher); } else{ - $createVoucherifyOrderObject = new CreateVoucherifyOrderObject($user, $companyId, $transaction->id, $amount, true, $transaction->type == TransactionType::TOP_UP); + $ownerId = $transaction->owner->id; + $createVoucherifyOrderObject = new CreateVoucherifyOrderObject($user, $companyId, $ownerId, $amount, $transaction->service_charge, true, $transaction->type == TransactionType::TOP_UP); $createVoucherufyOrderResult = $this->createsVoucherifyOrder->execute($createVoucherifyOrderObject); if($createVoucherufyOrderResult && isset($createVoucherufyOrderResult->id)){ diff --git a/app/Classes/Modules/Vouchers/Processors/Voucherify/TransactionToVoucherifyProcessor.php b/app/Classes/Modules/Vouchers/Processors/Voucherify/TransactionToVoucherifyProcessor.php index 46dbf7a1..34ce2d2d 100644 --- a/app/Classes/Modules/Vouchers/Processors/Voucherify/TransactionToVoucherifyProcessor.php +++ b/app/Classes/Modules/Vouchers/Processors/Voucherify/TransactionToVoucherifyProcessor.php @@ -32,9 +32,10 @@ class TransactionToVoucherifyProcessor public function execute(Transaction $transaction, string $status) { try{ - $voucherify_entity = $transaction->voucherifyEntities()->first(); + $voucherify_entity = $transaction->voucherifyEntities()->first(); //cief todo: 76 could be filtered more precisely to prevent fetching wrong record if($voucherify_entity){ - $updateVoucherifyOrderObject = new UpdateVoucherifyOrderObject($voucherify_entity->voucherify_entity_id, $status); + $booking = $transaction->booking; + $updateVoucherifyOrderObject = new UpdateVoucherifyOrderObject($voucherify_entity->voucherify_entity_id, $booking->id, $transaction->id, $status); $this->updatesVoucherifyOrder->execute($updateVoucherifyOrderObject); } } catch (\Exception $e) { diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php index 2abb6166..d62be356 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php @@ -31,7 +31,7 @@ class CreatesVoucherifyOrder { try { $orderObj = [ - "source_id" => $obj->getTransactionId(), + "source_id" => $obj->getIsTopUpWallet() ? 0 :$obj->getOwnerId(), "customer" => [ "source_id" => $obj->getEmployee()->id, "name" => $obj->getEmployee()->name, @@ -50,6 +50,11 @@ class CreatesVoucherifyOrder if ($obj->getIsTopUpWallet()) { $orderObj['metadata']["is_wallet_top_up"] = true; + $orderObj['metadata']["wallet_id"] = $obj->getOwnerId(); + } + + if ($obj->getServiceCharge()) { + $orderObj['metadata']["service_charge"] = $obj->getServiceCharge(); } $result = $this->voucherifyClient->orders->create($orderObj); diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php index eca9d611..46f867da 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php @@ -29,7 +29,7 @@ class RedeemsVoucherifyVoucher public function execute(RedeemVoucherifyVoucherObject $redeemVoucherifyVoucherObject) { try { - $result = $this->voucherifyClient->redemptions->redeem($redeemVoucherifyVoucherObject->getPromoCode(), [ + $redeemVoucherObject = [ "customer" => [ "source_id" => $redeemVoucherifyVoucherObject->getEmployee()->id, "name" => $redeemVoucherifyVoucherObject->getEmployee()->name, @@ -40,10 +40,24 @@ class RedeemsVoucherifyVoucher ] ], "order" => [ - "source_id" => $redeemVoucherifyVoucherObject->getTransactionId(), - "amount" => $redeemVoucherifyVoucherObject->getAmount() * 100 //converting it to cents + "id" => $redeemVoucherifyVoucherObject->getVoucherifyOrderId(), + // "source_id" => $redeemVoucherifyVoucherObject->getTransactionId(), //replaced with booking_id + "amount" => $redeemVoucherifyVoucherObject->getAmount() * 100, //converting it to cents ] - ]); + ]; + + $redeemVoucherObject['order']['metadata']['transaction_id'] = $redeemVoucherifyVoucherObject->getTransactionId(); + + if ($redeemVoucherifyVoucherObject->getServiceCharge()) { + $serviceCharge = round($redeemVoucherifyVoucherObject->getServiceCharge(), 2); + $redeemVoucherObject['order']['metadata']['service_charge'] = $serviceCharge; + } + if ($redeemVoucherifyVoucherObject->getIsNewOrder()) { + $redeemVoucherObject['order']['metadata']['is_new_order'] = $redeemVoucherifyVoucherObject->getIsNewOrder(); + } + + $result = $this->voucherifyClient->redemptions->redeem($redeemVoucherifyVoucherObject->getPromoCode(), $redeemVoucherObject); + return $result; } catch (\Voucherify\ClientException $e) { Log::error('RedeemsVoucherifyVoucher '.$e); diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php b/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php index 51c6c29e..5c83f95b 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php @@ -30,10 +30,14 @@ class UpdatesVoucherifyOrder public function execute(UpdateVoucherifyOrderObject $obj) { try { - $result = $this->voucherifyClient->orders->update([ - "id" => $obj->getId(), + $updateOrderObject = [ + "id" => $obj->getVoucherifyOrderId(), "status" => $obj->getStatus(), - ]); + ]; + + $updateOrderObject['metadata']['transaction_id'] = $obj->getTransactionId(); + + $result = $this->voucherifyClient->orders->update($updateOrderObject); return $result; } catch (\Voucherify\ClientException $e) { Log::error('UpdatesVoucherifyOrder '.$e); diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php index 7c22db5c..549c6959 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php @@ -29,6 +29,7 @@ class ValidatesVoucherifyVoucher */ public function execute(ValidateVoucherifyVoucherObject $validateVoucherifyVoucherObject) { + try { $validateVoucherObj = [ "customer" => [ @@ -42,15 +43,19 @@ class ValidatesVoucherifyVoucher ] ]; - if ($validateVoucherifyVoucherObject->getAmount()) { - $validateVoucherObj['order'] = [ - "amount" => $validateVoucherifyVoucherObject->getAmount() * 100 //converting it to cents - ]; + $validateVoucherObj['order']['amount'] = $validateVoucherifyVoucherObject->getAmount() * 100; // converting to cents + + if ($validateVoucherifyVoucherObject->getServiceCharge()) { + $serviceCharge = round($validateVoucherifyVoucherObject->getServiceCharge(), 2); + $validateVoucherObj['order']['metadata']['service_charge'] = $serviceCharge; + } + if ($validateVoucherifyVoucherObject->getIsNewOrder()) { + $validateVoucherObj['order']['metadata']['is_new_order'] = $validateVoucherifyVoucherObject->getIsNewOrder(); } $result = $this->voucherifyClient->validations->validateVoucher($validateVoucherifyVoucherObject->getVoucherCode(), $validateVoucherObj); - if (isset($result->metadata) && isset($result->metadata->email)) { + if (isset($result->metadata) && isset($result->metadata->email)) { // used in CheckMilestonesForRewardProcessor if($validateVoucherifyVoucherObject->getUser()->email != $result->metadata->email){ $result->reason = 'Invalid Code'; } diff --git a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php index 86e344ec..903cf129 100644 --- a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php +++ b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php @@ -113,7 +113,7 @@ class TopUpWalletLogic extends AbstractControllerLogic $transaction = $this->createsTransaction->execute($wallet, $transaction_object); - $this->bookingToVoucherifyProcessor->execute($company->employees()->first(), $transaction, $company->id, $amount, 0); + $this->bookingToVoucherifyProcessor->execute($company->employees()->first(), $transaction, $company->id, $amount, 0, 0); return $this->resourceResponse(new WalletTransactionResource($transaction)); } diff --git a/app/Classes/ValueObjects/Constants/Vouchers.php b/app/Classes/ValueObjects/Constants/Vouchers.php index 4c6c8bb1..622e6c0d 100644 --- a/app/Classes/ValueObjects/Constants/Vouchers.php +++ b/app/Classes/ValueObjects/Constants/Vouchers.php @@ -10,11 +10,13 @@ final class Vouchers { public const SORRY_100 = 'SORRY100'; public const SORRY_200 = 'SORRY200'; public const PROM150PERCENT = 'PROM150%'; + public const CIEFPC30 = 'CIEFPC30'; const OPTIONS_SORRY = [ ['text' => 'SORRY 50', 'id' => Vouchers::SORRY_50], ['text' => 'SORRY 100', 'id' => Vouchers::SORRY_100], ['text' => 'SORRY 200', 'id' => Vouchers::SORRY_200], ['text' => 'PROM150%', 'id' => Vouchers::PROM150PERCENT], + ['text' => 'CIEFPC30', 'id' => Vouchers::CIEFPC30], ]; } diff --git a/app/Http/Middleware/LogRequestPathMiddleware.php b/app/Http/Middleware/LogRequestPathMiddleware.php index a6a88f49..804c3440 100644 --- a/app/Http/Middleware/LogRequestPathMiddleware.php +++ b/app/Http/Middleware/LogRequestPathMiddleware.php @@ -23,11 +23,12 @@ class LogRequestPathMiddleware $fullUrl = $request->fullUrl(); LogHelper::channel('request_path')->info('Request Method: ' . $method); LogHelper::channel('request_path')->info('Request URL: ' . $fullUrl); - } - if ($request->isMethod('post')) { - $payload = $request->all(); - LogHelper::channel('request_path')->info('Request Payload POST: ', $payload); + + if ($request->isMethod('post')) { + $payload = $request->all(); + LogHelper::channel('request_path')->info('Request Payload POST: ', $payload); + } } return $next($request); diff --git a/app/Models/Booking.php b/app/Models/Booking.php index 2f1b4074..70d30b03 100644 --- a/app/Models/Booking.php +++ b/app/Models/Booking.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; use App\Classes\General\Interfaces\Transactionable; +use App\Classes\General\Interfaces\Voucherifiable; use App\Classes\General\Traits\LogData; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Classes\General\Interfaces\KeyValueInterface; @@ -27,7 +28,7 @@ use Staudenmeir\EloquentHasManyDeep\HasRelationships; * @property int convertible_currency_id * @property int conversion_currency_id */ -class Booking extends AbstractModel implements Documentable, Transactionable, KeyValueInterface +class Booking extends AbstractModel implements Documentable, Transactionable, KeyValueInterface, Voucherifiable { use HasRelationships; use SoftDeletes; @@ -130,4 +131,12 @@ class Booking extends AbstractModel implements Documentable, Transactionable, Ke { return $this->morphMany(KeyValuePair::class, 'owner'); } + + /** + * @return MorphMany + */ + public function voucherifyEntities(): MorphMany + { + return $this->morphMany(VoucherEntityMapping::class, 'owner'); + } } diff --git a/app/Models/VoucherRedemption.php b/app/Models/VoucherRedemption.php index aa37487b..ca989657 100644 --- a/app/Models/VoucherRedemption.php +++ b/app/Models/VoucherRedemption.php @@ -3,11 +3,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\HasOne; - +use Illuminate\Database\Eloquent\SoftDeletes; class VoucherRedemption extends AbstractModel { + use SoftDeletes; + protected $table = 'voucher_redemptions'; /** diff --git a/database/migrations/2024_12_09_031738_add_deleted_at_to_voucher_redemptions_table.php b/database/migrations/2024_12_09_031738_add_deleted_at_to_voucher_redemptions_table.php new file mode 100644 index 00000000..8a6d4e93 --- /dev/null +++ b/database/migrations/2024_12_09_031738_add_deleted_at_to_voucher_redemptions_table.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('voucher_redemptions', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +} diff --git a/resources/assets/vue/components/bookings/elements/AvailableVouchersComponent.vue b/resources/assets/vue/components/bookings/elements/AvailableVouchersComponent.vue index b19b236f..14397818 100644 --- a/resources/assets/vue/components/bookings/elements/AvailableVouchersComponent.vue +++ b/resources/assets/vue/components/bookings/elements/AvailableVouchersComponent.vue @@ -11,6 +11,7 @@
50% Discount + {{ item.voucher.name }}
diff --git a/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue b/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue index 3e36308a..cc3474f5 100644 --- a/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue +++ b/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue @@ -697,7 +697,8 @@ this.parameters = { voucherCode: this.voucherCode, amount: this.amount, - itemId: this.item.id + itemId: this.item.id, + payment_method: this.paymentMethod.id, }; if(this.voucherCode.trim() !== ''){ this.submit(route('api.voucher.validate'), 'post', '', false, false); diff --git a/resources/assets/vue/components/companies/elements/SingleRewardDetailsItemComponent.vue b/resources/assets/vue/components/companies/elements/SingleRewardDetailsItemComponent.vue index 55e3c1b5..a70b2eae 100644 --- a/resources/assets/vue/components/companies/elements/SingleRewardDetailsItemComponent.vue +++ b/resources/assets/vue/components/companies/elements/SingleRewardDetailsItemComponent.vue @@ -3,10 +3,14 @@
{{ item.name }}

{{ item.description }}

+

{{ item.voucher.code }}

{{ item.voucher.code }}

+

RM{{ item.voucher.value/100 }} Discount

-

{{ item.voucher.value }}% Discount

+ +

{{ item.voucher.value }}% Discount

+

Discount