diff --git a/app/Classes/Modules/Addresses/ControllersLogic/ListStatesLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/ListStatesLogic.php
new file mode 100644
index 00000000..60ecd262
--- /dev/null
+++ b/app/Classes/Modules/Addresses/ControllersLogic/ListStatesLogic.php
@@ -0,0 +1,51 @@
+ 'Retrieved States',
+ 'message' => 'You have successfully retrieved a list of States'
+ ];
+ }
+
+ /** @var ListsStates */
+ private $listsStates;
+
+ /**
+ * ListStatesLogic constructor.
+ * @param ListsStates $listsStates
+ */
+ public function __construct(ListsStates $listsStates)
+ {
+ $this->listsStates = $listsStates;
+ }
+
+ /**
+ * @param Request $request
+ * @return JsonResponse
+ * @throws \App\Classes\Exceptions\MalformedRequestException
+ */
+ public function logic(Request $request) : JsonResponse
+ {
+ $query = $this->listsStates->execute($this->listsStates->deserializeFilters($request->input('filters')));
+
+ return $this->collectionResponse(StateResource::collection($query));
+
+ }
+
+}
diff --git a/app/Classes/Modules/Addresses/Services/ListsStates.php b/app/Classes/Modules/Addresses/Services/ListsStates.php
new file mode 100644
index 00000000..c7ac955f
--- /dev/null
+++ b/app/Classes/Modules/Addresses/Services/ListsStates.php
@@ -0,0 +1,33 @@
+repository = $repository;
+ }
+
+
+ /**
+ * @return Builder
+ */
+ function getRepository(): Builder
+ {
+ return $this->repository->newQuery();
+ }
+}
diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php
index 75c2daf2..e3260a73 100644
--- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php
+++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php
@@ -17,14 +17,15 @@ 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\Rules\DataTransferObjects\ConfirmBookingDTO;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedEInvoicePromptedRule;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedPurchaseOrderRule;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedTINRule;
+use App\Classes\Modules\Bookings\DataTransferObjects\ConfirmBookingDTO;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassEInvoicePromptedRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassPurchaseOrderRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassTINRule;
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\Modules\Rules\Services\RuleEvaluator;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassOrderDurationLimitRule;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\ValueObjects\Constants\TransactionType;
@@ -126,9 +127,10 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic
{
$dto = new ConfirmBookingDTO($request->all());
$result = $this->ruleEvaluator->evaluate([
- App()->make(CanProceedEInvoicePromptedRule::class),
- App()->make(CanProceedTINRule::class),
- App()->make(CanProceedPurchaseOrderRule::class),
+ App()->make(CanPassOrderDurationLimitRule::class),
+ App()->make(CanPassEInvoicePromptedRule::class),
+ App()->make(CanPassTINRule::class),
+ App()->make(CanPassPurchaseOrderRule::class),
], $dto);
if ($result->failed()) {
diff --git a/app/Classes/Modules/Rules/DataTransferObjects/ConfirmBookingDTO.php b/app/Classes/Modules/Bookings/DataTransferObjects/ConfirmBookingDTO.php
similarity index 89%
rename from app/Classes/Modules/Rules/DataTransferObjects/ConfirmBookingDTO.php
rename to app/Classes/Modules/Bookings/DataTransferObjects/ConfirmBookingDTO.php
index 2c154833..49f7e727 100644
--- a/app/Classes/Modules/Rules/DataTransferObjects/ConfirmBookingDTO.php
+++ b/app/Classes/Modules/Bookings/DataTransferObjects/ConfirmBookingDTO.php
@@ -1,6 +1,6 @@
e_invoice){
$district = $this->fetchesDistrict->execute(['id' => $dto->districtId]);
- $addObj = new AddressObject($dto->streetOne, $dto->streetTwo, $district->country_id, $district->state_id, $district->id, $dto->postCode);
+ $addObj = new AddressObject($dto->streetOne, $dto->streetTwo, $district->country_id, $dto->stateId, $district->id, $dto->postCode);
$this->canCreateAddress->passes($addObj);
$address = $this->upsertsAddress->execute($company, $addObj, $dto->addressId);
diff --git a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogic.php b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogic.php
index 9978006f..3b7006ae 100644
--- a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogic.php
+++ b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogic.php
@@ -12,9 +12,9 @@ use App\Classes\Modules\Addresses\Standards\Rules\CanCreateAddress;
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Companies\Services\UpdatesCompanyEInvoiceInfo;
-use App\Classes\Modules\Rules\DataTransferObjects\EInvoiceInfoDTO;
+use App\Classes\Modules\Companies\DataTransferObjects\EInvoiceInfoDTO;
use App\Classes\Modules\Rules\Services\RuleEvaluator;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedEInvoicePromptedRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassEInvoicePromptedRule;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -85,7 +85,7 @@ class UpdateCompanyEInvoiceInfoLogic extends AbstractControllerLogic
{
$dto = new EInvoiceInfoDTO($request->all());
$result = $this->ruleEvaluator->evaluate([
- App()->make(CanProceedEInvoicePromptedRule::class),
+ App()->make(CanPassEInvoicePromptedRule::class),
], $dto);
if ($result->failed()) {
@@ -93,7 +93,7 @@ class UpdateCompanyEInvoiceInfoLogic extends AbstractControllerLogic
}
$district = $this->fetchesDistrict->execute(['id' => $dto->districtId]);
- $object = new AddressObject($dto->streetOne, $dto->streetTwo, $district->country_id, $district->state_id, $district->id, $dto->postCode);
+ $object = new AddressObject($dto->streetOne, $dto->streetTwo, $district->country_id, $dto->stateId, $district->id, $dto->postCode);
//Update Address
$this->canCreateAddress->passes($object);
diff --git a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceRequestLogic.php b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceRequestLogic.php
index 86051447..09700f5d 100644
--- a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceRequestLogic.php
+++ b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyEInvoiceRequestLogic.php
@@ -6,7 +6,7 @@ namespace App\Classes\Modules\Companies\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Companies\Services\UpdatesCompanyEInvoiceRequest;
use App\Classes\Modules\Companies\Services\FetchesCompany;
-use App\Classes\Modules\Rules\DataTransferObjects\EInvoiceRequestDTO;
+use App\Classes\Modules\Companies\DataTransferObjects\EInvoiceRequestDTO;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
diff --git a/app/Classes/Modules/Rules/DataTransferObjects/EInvoiceInfoDTO.php b/app/Classes/Modules/Companies/DataTransferObjects/EInvoiceInfoDTO.php
similarity index 63%
rename from app/Classes/Modules/Rules/DataTransferObjects/EInvoiceInfoDTO.php
rename to app/Classes/Modules/Companies/DataTransferObjects/EInvoiceInfoDTO.php
index f768b2c1..893f20c7 100644
--- a/app/Classes/Modules/Rules/DataTransferObjects/EInvoiceInfoDTO.php
+++ b/app/Classes/Modules/Companies/DataTransferObjects/EInvoiceInfoDTO.php
@@ -1,14 +1,15 @@
tin = (int) ($data['tin'] ?? '');
- $this->msicCode = (int) ($data['msic_code'] ?? '');
- $this->districtId = (int) ($data['district_id'] ?? '');
- $this->companyId = (int) ($data['company_id'] ?? '');
+ $this->tin = (string) ($data['tin'] ?? '');
+ $this->msicCode = (int) ($data['msic_code'] ?? 0);
+ $this->districtId = (int) ($data['district_id'] ?? 0);
+ $this->stateId = (int) ($data['state_id'] ?? 0);
+ $this->companyId = (int) ($data['company_id'] ?? 0);
$this->streetOne = (string) ($data['street_one'] ?? '');
$this->streetTwo = (string) ($data['street_two'] ?? '');
- $this->postCode = (int) ($data['post_code'] ?? '');
+ $this->postCode = (int) ($data['post_code'] ?? 0);
}
public function toArray(): array
@@ -31,6 +33,7 @@ class EInvoiceInfoDTO implements DataTransferObject
'tin' => $this->tin,
'msic_code' => $this->msicCode,
'district_id' => $this->districtId,
+ 'state_id' => $this->stateId,
'company_id' => $this->companyId,
'street_one' => $this->streetOne,
'street_two' => $this->streetTwo,
diff --git a/app/Classes/Modules/Rules/DataTransferObjects/EInvoiceRequestDTO.php b/app/Classes/Modules/Companies/DataTransferObjects/EInvoiceRequestDTO.php
similarity index 89%
rename from app/Classes/Modules/Rules/DataTransferObjects/EInvoiceRequestDTO.php
rename to app/Classes/Modules/Companies/DataTransferObjects/EInvoiceRequestDTO.php
index cbc2b0ea..4d56cd20 100644
--- a/app/Classes/Modules/Rules/DataTransferObjects/EInvoiceRequestDTO.php
+++ b/app/Classes/Modules/Companies/DataTransferObjects/EInvoiceRequestDTO.php
@@ -1,6 +1,6 @@
reference = (string) ($data['reference'] ?? '');
$this->type = (int) ($data['type'] ?? 0);
- $this->tin = (int) ($data['tin'] ?? 0);
+ $this->tin = (string) ($data['tin'] ?? 0);
$this->msicCode = (int) ($data['msic_code'] ?? 0);
$this->addressId = (int) ($data['address_id'] ?? 0);
$this->districtId = (int) ($data['district_id'] ?? 0);
+ $this->stateId = (int) ($data['state_id'] ?? 0);
$this->companyId = (int) ($data['company_id'] ?? 0);
$this->streetOne = (string) ($data['street_one'] ?? '');
$this->streetTwo = (string) ($data['street_two'] ?? '');
@@ -52,6 +54,7 @@ class UpdateCompanyDetailsDTO implements DataTransferObject
'msic_code' => $this->msicCode,
'address_id' => $this->addressId,
'district_id' => $this->districtId,
+ 'state_id' => $this->stateId,
'company_id' => $this->companyId,
'street_one' => $this->streetOne,
'street_two' => $this->streetTwo,
diff --git a/app/Classes/Modules/Rules/ControllersLogic/CheckEInvoiceRuleLogic.php b/app/Classes/Modules/Rules/ControllersLogic/CheckEInvoiceRuleLogic.php
index dd19bec1..b2c314d9 100644
--- a/app/Classes/Modules/Rules/ControllersLogic/CheckEInvoiceRuleLogic.php
+++ b/app/Classes/Modules/Rules/ControllersLogic/CheckEInvoiceRuleLogic.php
@@ -7,8 +7,8 @@ use App\Classes\Exceptions\CriteriaNotFulfilledException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Rules\DataTransferObjects\CheckEInvoiceRuleDTO;
use App\Classes\Modules\Rules\Services\RuleEvaluator;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedEInvoicePromptedRule;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedTINRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassEInvoicePromptedRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassTINRule;
use App\Http\Resources\RuleResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -49,8 +49,8 @@ class CheckEInvoiceRuleLogic extends AbstractControllerLogic
$dto = new CheckEInvoiceRuleDTO($request->all());
$result = $this->ruleEvaluator->evaluate([
- App()->make(CanProceedEInvoicePromptedRule::class),
- App()->make(CanProceedTINRule::class),
+ App()->make(CanPassEInvoicePromptedRule::class),
+ App()->make(CanPassTINRule::class),
], $dto);
if ($result->failed()) {
diff --git a/app/Classes/Modules/Rules/ControllersLogic/CheckPurchaseOrderRuleLogic.php b/app/Classes/Modules/Rules/ControllersLogic/CheckPurchaseOrderRuleLogic.php
index 577e4618..a1c74aee 100644
--- a/app/Classes/Modules/Rules/ControllersLogic/CheckPurchaseOrderRuleLogic.php
+++ b/app/Classes/Modules/Rules/ControllersLogic/CheckPurchaseOrderRuleLogic.php
@@ -7,8 +7,9 @@ use App\Classes\Exceptions\CriteriaNotFulfilledException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Rules\DataTransferObjects\CheckPurchaseOrderRuleDTO;
use App\Classes\Modules\Rules\Services\RuleEvaluator;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedEInvoicePromptedRule;
-use App\Classes\Modules\Rules\Standards\Rules\CanProceedPurchaseOrderRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassEInvoicePromptedRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassOrderDurationLimitRule;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassPurchaseOrderRule;
use App\Http\Resources\RuleResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -49,8 +50,9 @@ class CheckPurchaseOrderRuleLogic extends AbstractControllerLogic
$dto = new CheckPurchaseOrderRuleDTO($request->all());
$result = $this->ruleEvaluator->evaluate([
- App()->make(CanProceedEInvoicePromptedRule::class),
- App()->make(CanProceedPurchaseOrderRule::class),
+ App()->make(CanPassOrderDurationLimitRule::class),
+ App()->make(CanPassEInvoicePromptedRule::class),
+ App()->make(CanPassPurchaseOrderRule::class),
], $dto);
if ($result->failed()) {
diff --git a/app/Classes/Modules/Rules/ControllersLogic/CheckTransferRuleLogic.php b/app/Classes/Modules/Rules/ControllersLogic/CheckTransferRuleLogic.php
new file mode 100644
index 00000000..b17d8ed0
--- /dev/null
+++ b/app/Classes/Modules/Rules/ControllersLogic/CheckTransferRuleLogic.php
@@ -0,0 +1,60 @@
+ 'Rule Check Transfer',
+ 'message' => 'You have successfully passed all rules evaluated'
+ ];
+ }
+
+ /** @var RuleEvaluator */
+ private $ruleEvaluator;
+
+ /**
+ * CheckTransferRuleLogic constructor.
+ */
+ public function __construct(RuleEvaluator $ruleEvaluator)
+ {
+ $this->ruleEvaluator = $ruleEvaluator;
+ }
+
+ /**
+ * @param Request $request
+ * @return JsonResponse
+ * @throws \App\Classes\Exceptions\AccessForbiddenException
+ * @throws \App\Classes\Exceptions\MalformedRequestException
+ * @throws \App\Classes\Exceptions\RequestValidationException
+ * @throws \App\Classes\Exceptions\CriteriaNotFulfilledException
+ */
+ public function logic(Request $request) : JsonResponse
+ {
+ $dto = new CheckTransferRuleDTO($request->all());
+
+ $result = $this->ruleEvaluator->evaluate([
+ App()->make(CanPassOrderDurationLimitRule::class),
+ ], $dto);
+
+ if ($result->failed()) {
+ throw new CriteriaNotFulfilledException("- " . implode("
- ", $result->messages()));
+ }
+
+ return $this->resourceResponse(new RuleResource((object)$result));
+ }
+}
diff --git a/app/Classes/Modules/Rules/DataTransferObjects/CheckTransferRuleDTO.php b/app/Classes/Modules/Rules/DataTransferObjects/CheckTransferRuleDTO.php
new file mode 100644
index 00000000..35f630f2
--- /dev/null
+++ b/app/Classes/Modules/Rules/DataTransferObjects/CheckTransferRuleDTO.php
@@ -0,0 +1,25 @@
+bookingId = $data['booking_id'];
+ $this->companyId = $data['company_id'];
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'booking_id' => $this->bookingId,
+ 'company_id' => $this->companyId,
+ ];
+ }
+}
diff --git a/app/Classes/Modules/Rules/Standards/Rules/CanProceedEInvoicePromptedRule.php b/app/Classes/Modules/Rules/Standards/Rules/CanPassEInvoicePromptedRule.php
similarity index 85%
rename from app/Classes/Modules/Rules/Standards/Rules/CanProceedEInvoicePromptedRule.php
rename to app/Classes/Modules/Rules/Standards/Rules/CanPassEInvoicePromptedRule.php
index dcddbcdd..5ab57fdf 100644
--- a/app/Classes/Modules/Rules/Standards/Rules/CanProceedEInvoicePromptedRule.php
+++ b/app/Classes/Modules/Rules/Standards/Rules/CanPassEInvoicePromptedRule.php
@@ -6,14 +6,14 @@ use App\Classes\Exceptions\CriteriaNotFulfilledException;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Companies\Services\FetchesCompany;
-class CanProceedEInvoicePromptedRule extends AbstractRule
+class CanPassEInvoicePromptedRule extends AbstractRule
{
/** @var FetchesCompany */
private $fetchesCompany;
/**
- * CanProceedEInvoicePromptedRule constructor.
+ * CanPassEInvoicePromptedRule constructor.
* @param FetchesCompany $fetchesCompany
*/
public function __construct(FetchesCompany $fetchesCompany)
@@ -48,7 +48,7 @@ class CanProceedEInvoicePromptedRule extends AbstractRule
//Check if account requires E-Invoice
$company = $this->fetchesCompany->execute(['id' => $object->companyId]);
if($company->e_invoice === null){
- throw new CriteriaNotFulfilledException("Please refresh page to answer question related to E-Invoice.");
+ throw new CriteriaNotFulfilledException("Please refresh page and click 'Make Payment' first to answer question related to E-Invoice.");
}
return true;
}
diff --git a/app/Classes/Modules/Rules/Standards/Rules/CanPassEditingPORule.php b/app/Classes/Modules/Rules/Standards/Rules/CanPassEditingPORule.php
new file mode 100644
index 00000000..62293b6d
--- /dev/null
+++ b/app/Classes/Modules/Rules/Standards/Rules/CanPassEditingPORule.php
@@ -0,0 +1,67 @@
+fetchesBooking = $fetchesBooking;
+ $this->fetchesCompany = $fetchesCompany;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function authorized($object): bool
+ {
+ return true;
+
+ }
+
+ /**
+ * @return bool
+ */
+ protected function validators($object): bool
+ {
+ return true;
+
+ }
+
+
+ /**
+ * @return bool
+ */
+ protected function criteria($object): bool
+ {
+ //Check if user is allow to edit purchase order
+ $booking = $this->fetchesBooking->execute(['id' => $object->bookingId]);
+
+ $paidAmount = floatval((App()->make(CalculatesBookingPayableAmount::class))->execute($booking, $booking->fix_currency_id)) - floatval((App()->make(CalculatesBookingRefundAmount::class))->execute($booking, $booking->fix_currency_id));
+
+ if($paidAmount > 0){
+ throw new CriteriaNotFulfilledException("Purchase order form is no longer allow to be edited.");
+ }
+ return true;
+ }
+}
diff --git a/app/Classes/Modules/Rules/Standards/Rules/CanPassOrderDurationLimitRule.php b/app/Classes/Modules/Rules/Standards/Rules/CanPassOrderDurationLimitRule.php
new file mode 100644
index 00000000..46739d2b
--- /dev/null
+++ b/app/Classes/Modules/Rules/Standards/Rules/CanPassOrderDurationLimitRule.php
@@ -0,0 +1,113 @@
+fetchesBooking = $fetchesBooking;
+ $this->fetchesCompanyPaymentAttemptLimit = $fetchesCompanyPaymentAttemptLimit;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function authorized($object): bool
+ {
+ return true;
+
+ }
+
+ /**
+ * @return bool
+ */
+ protected function validators($object): bool
+ {
+ return true;
+
+ }
+
+
+ /**
+ * @return bool
+ */
+ protected function criteria($object): bool
+ {
+ //Check if order is still valid (within duration limit, reused PAYMENT_ATTEMPT_DURATION_LIMIT)
+
+ $isExpired = false;
+ $booking = $this->fetchesBooking->execute(['id' => $object->bookingId]);
+ $paymentAttemptLimit = $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company);
+ // $paymentAttemptLimit = 5; //Manual testing must pay in minutes
+
+ $createdAt = Carbon::parse($booking->created_at);
+ $bookingExpiresAt = $createdAt->addMinutes($paymentAttemptLimit);
+ $now = Carbon::now();
+
+ if ($now->greaterThan($bookingExpiresAt)) {
+ $isExpired = true;
+ }
+
+ $allPayments = $booking->transactions()
+ ->payments()
+ ->get();
+
+ if ($isExpired) {
+ $filteredPayments = $allPayments->filter(function ($payment) use ($bookingExpiresAt) {
+ return Carbon::parse($payment->created_at)->lessThanOrEqualTo($bookingExpiresAt);
+ });
+
+ if ($filteredPayments->isNotEmpty()) {
+ // Use the earlier payment to recalculate bookingExpiresAt
+ $earliestPayment = $filteredPayments->sortBy('created_at')->first();
+ $newBookingExpiresAt = Carbon::parse($earliestPayment->created_at)->addMinutes($paymentAttemptLimit);
+
+ $logDetails = [
+ 'booking_id' => $booking->id,
+ 'initial_created_at' => $booking->created_at,
+ 'original_expiry' => $bookingExpiresAt->toDateTimeString(),
+ 'new_expiry' => $newBookingExpiresAt->toDateTimeString(),
+ 'valid_payments' => []
+ ];
+ foreach ($filteredPayments as $payment) {
+ $logDetails['valid_payments'][] = [
+ 'payment_id' => $payment->id,
+ 'created_at' => $payment->created_at,
+ 'amount' => $payment->amount,
+ ];
+ }
+ Log::info("Booking initially expired, but found valid pending payment(s).", $logDetails);
+
+ $bookingExpiresAt = $newBookingExpiresAt;
+ $isExpired = Carbon::now()->greaterThan($bookingExpiresAt);
+ } else {
+ Log::info("Booking expired and no valid pending payments for booking ID: {$booking->id}");
+ }
+ }
+
+ if($isExpired){
+ throw new CriteriaNotFulfilledException("Transfer has already expired.");
+ }
+ return true;
+ }
+}
diff --git a/app/Classes/Modules/Rules/Standards/Rules/CanProceedPurchaseOrderRule.php b/app/Classes/Modules/Rules/Standards/Rules/CanPassPurchaseOrderRule.php
similarity index 96%
rename from app/Classes/Modules/Rules/Standards/Rules/CanProceedPurchaseOrderRule.php
rename to app/Classes/Modules/Rules/Standards/Rules/CanPassPurchaseOrderRule.php
index f9483835..c6782cf5 100644
--- a/app/Classes/Modules/Rules/Standards/Rules/CanProceedPurchaseOrderRule.php
+++ b/app/Classes/Modules/Rules/Standards/Rules/CanPassPurchaseOrderRule.php
@@ -13,7 +13,7 @@ use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\ServiceType;
use Illuminate\Support\Facades\Log;
-class CanProceedPurchaseOrderRule extends AbstractRule
+class CanPassPurchaseOrderRule extends AbstractRule
{
/** @var FetchesBooking */
@@ -23,7 +23,7 @@ class CanProceedPurchaseOrderRule extends AbstractRule
private $fetchesCompany;
/**
- * CanProceedPurchaseOrderRule constructor.
+ * CanPassPurchaseOrderRule constructor.
* @param FetchesBooking $fetchesBooking
* @param FetchesCompany $fetchesCompany
*/
diff --git a/app/Classes/Modules/Rules/Standards/Rules/CanProceedTINRule.php b/app/Classes/Modules/Rules/Standards/Rules/CanPassTINRule.php
similarity index 93%
rename from app/Classes/Modules/Rules/Standards/Rules/CanProceedTINRule.php
rename to app/Classes/Modules/Rules/Standards/Rules/CanPassTINRule.php
index a4adc674..3f767912 100644
--- a/app/Classes/Modules/Rules/Standards/Rules/CanProceedTINRule.php
+++ b/app/Classes/Modules/Rules/Standards/Rules/CanPassTINRule.php
@@ -7,14 +7,14 @@ use App\Classes\Exceptions\CriteriaNotFulfilledException;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Companies\Services\FetchesCompany;
-class CanProceedTINRule extends AbstractRule
+class CanPassTINRule extends AbstractRule
{
/** @var FetchesCompany */
private $fetchesCompany;
/**
- * CanProceedTINRule constructor.
+ * CanPassTINRule constructor.
* @param FetchesCompany $fetchesCompany
*/
public function __construct(FetchesCompany $fetchesCompany)
diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreatePurchaseOrderTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreatePurchaseOrderTransactionLogic.php
index 68072a6e..0b827c46 100644
--- a/app/Classes/Modules/Transactions/ControllersLogic/CreatePurchaseOrderTransactionLogic.php
+++ b/app/Classes/Modules/Transactions/ControllersLogic/CreatePurchaseOrderTransactionLogic.php
@@ -3,9 +3,11 @@
namespace App\Classes\Modules\Transactions\ControllersLogic;
+use App\Classes\Exceptions\CriteriaNotFulfilledException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use App\Classes\Modules\Companies\Services\FetchesCompany;
+use App\Classes\Modules\Transactions\DataTransferObjects\CreatePurchaseOrderDTO;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\Processors\CreatePurchaseOrderTransactionProcessor;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
@@ -15,14 +17,18 @@ use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Transactions\Services\UpdatesTransaction;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
+use App\Classes\Modules\Rules\Services\RuleEvaluator;
+use App\Classes\Modules\Rules\Standards\Rules\CanPassEditingPORule;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
+use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Http\Resources\TransactionResource;
use App\Models\Booking;
use App\Models\Transaction;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
class CreatePurchaseOrderTransactionLogic extends AbstractControllerLogic
{
@@ -46,17 +52,27 @@ class CreatePurchaseOrderTransactionLogic extends AbstractControllerLogic
/** @var CreatePurchaseOrderTransactionProcessor */
private $createPurchaseOrderTransactionProcessor;
+ /** @var RuleEvaluator */
+ private $ruleEvaluator;
+
+ /** @var CanPassEditingPORule */
+ private $canPassEditingPORule;
+
/**
* CreatePurchaseOrderTransactionLogic constructor.
* @param FetchesBooking $fetchesBooking
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
* @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor
+ * @param RuleEvaluator $ruleEvaluator
+ * @param CanPassEditingPORule $canPassEditingPORule
*/
- public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor)
+ public function __construct(FetchesBooking $fetchesBooking, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, RuleEvaluator $ruleEvaluator, CanPassEditingPORule $canPassEditingPORule)
{
$this->fetchesBooking = $fetchesBooking;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
$this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor;
+ $this->ruleEvaluator = $ruleEvaluator;
+ $this->canPassEditingPORule = $canPassEditingPORule;
}
/**
@@ -64,9 +80,21 @@ class CreatePurchaseOrderTransactionLogic extends AbstractControllerLogic
* @param string $id
* @return JsonResponse
* @throws \App\Classes\Exceptions\MalformedRequestException
+ * @throws \App\Classes\Exceptions\CriteriaNotFulfilledException
*/
public function logic(Request $request, $id = '') : JsonResponse
{
+ if(!in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES)){
+ $dto = new CreatePurchaseOrderDTO($request->all());
+ $result = $this->ruleEvaluator->evaluate([
+ $this->canPassEditingPORule
+ ], $dto);
+
+ if ($result->failed()) {
+ throw new CriteriaNotFulfilledException("- " . implode("
- ", $result->messages()));
+ }
+ }
+
/** @var Booking $booking */
$booking = $this->fetchesBooking->execute(['id' => $request->route('id') ?? $id]);
@@ -105,7 +133,4 @@ class CreatePurchaseOrderTransactionLogic extends AbstractControllerLogic
return $this->resourceResponse(new TransactionResource($transaction));
}
-
-
-
}
diff --git a/app/Classes/Modules/Transactions/DataTransferObjects/CreatePurchaseOrderDTO.php b/app/Classes/Modules/Transactions/DataTransferObjects/CreatePurchaseOrderDTO.php
new file mode 100644
index 00000000..074640ad
--- /dev/null
+++ b/app/Classes/Modules/Transactions/DataTransferObjects/CreatePurchaseOrderDTO.php
@@ -0,0 +1,25 @@
+bookingId = $data['booking_id'];
+ $this->companyId = $data['company_id'];
+ }
+
+ public function toArray(): array
+ {
+ return [
+ 'booking_id' => $this->bookingId,
+ 'company_id' => $this->companyId,
+ ];
+ }
+}
diff --git a/app/Http/Controllers/Addresses/ListStatesController.php b/app/Http/Controllers/Addresses/ListStatesController.php
new file mode 100644
index 00000000..a881ad6c
--- /dev/null
+++ b/app/Http/Controllers/Addresses/ListStatesController.php
@@ -0,0 +1,19 @@
+execute($request);
+ }
+}
diff --git a/app/Http/Controllers/Rules/CheckRuleController.php b/app/Http/Controllers/Rules/CheckRuleController.php
index 881c6abe..59b24cd0 100644
--- a/app/Http/Controllers/Rules/CheckRuleController.php
+++ b/app/Http/Controllers/Rules/CheckRuleController.php
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Rules;
use App\Classes\Modules\Rules\ControllersLogic\CheckEInvoiceRuleLogic;
use App\Classes\Modules\Rules\ControllersLogic\CheckPurchaseOrderRuleLogic;
+use App\Classes\Modules\Rules\ControllersLogic\CheckTransferRuleLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -26,4 +27,13 @@ class CheckRuleController
public function checkPurchaseOrderRule(Request $request, CheckPurchaseOrderRuleLogic $logic): JsonResponse {
return $logic->execute($request);
}
+
+ /**
+ * @param Request $request
+ * @param CheckTransferRuleLogic $logic
+ * @return JsonResponse
+ */
+ public function checkTransferRule(Request $request, CheckTransferRuleLogic $logic): JsonResponse {
+ return $logic->execute($request);
+ }
}
diff --git a/app/Http/Resources/EInvoiceInfoResource.php b/app/Http/Resources/EInvoiceInfoResource.php
index 9bf8c8c1..565e86a7 100644
--- a/app/Http/Resources/EInvoiceInfoResource.php
+++ b/app/Http/Resources/EInvoiceInfoResource.php
@@ -24,7 +24,7 @@ class EInvoiceInfoResource extends JsonResource
'country' => $this->country,
'billing' => (int) $this->billing,
'msic_code' => (int) $this->msic_code,
- 'tin' => (int) $this->tin,
+ 'tin' => (string) $this->tin,
'e_invoice' => (int) $this->e_invoice,
];
}
diff --git a/app/Http/Resources/StateResource.php b/app/Http/Resources/StateResource.php
new file mode 100644
index 00000000..d73c455c
--- /dev/null
+++ b/app/Http/Resources/StateResource.php
@@ -0,0 +1,22 @@
+ $this->id,
+ 'state' => $this->name,
+ ];
+ }
+}
diff --git a/app/Http/Resources/V2/BookingV2Resource.php b/app/Http/Resources/V2/BookingV2Resource.php
index a41d7e35..e1735081 100644
--- a/app/Http/Resources/V2/BookingV2Resource.php
+++ b/app/Http/Resources/V2/BookingV2Resource.php
@@ -53,15 +53,19 @@ class BookingV2Resource extends JsonResource
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
'created_at_with_time' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'),
$this->mergeWhen($this->relationLoaded('transactions'), [
- 'purchase_order' => new V2\TransactionV2Resource($this->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first()),
+ 'purchase_order' => new V2\TransactionV2Resource(
+ $this->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first()),
'payment_attempts' => V2\TransactionV2Resource::collection(
$this->transactions()
->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION)
->whereDate('expires_on', '>=', Carbon::now())
->get()
),
- 'expired_payment_attempts' => V2\TransactionV2Resource::collection($this->transactions()->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION)->whereDate('expires_on', '>=', Carbon::now())->where('expires_on', '>', Carbon::now()->toTimeString())->get()),
- 'payment_history' => V2\TransactionV2Resource::collection($this->transactions()->where(function($query){
+ 'expired_payment_attempts' => V2\TransactionV2Resource::collection(
+ $this->transactions()->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION)->whereDate('expires_on', '>=', Carbon::now())->where('expires_on', '>', Carbon::now()->toTimeString())->get()
+ ),
+ 'payment_history' => V2\TransactionV2Resource::collection(
+ $this->transactions()->where(function($query){
$query->where(function($query){
$query->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::COMPLETED, ApprovalStatus::REJECTED]);
})->orWhere(function($query){
diff --git a/resources/assets/vue/components/address/forms/EInvoiceInfoFormComponent.vue b/resources/assets/vue/components/address/forms/EInvoiceInfoFormComponent.vue
index 5478b2f3..0b8c20e5 100644
--- a/resources/assets/vue/components/address/forms/EInvoiceInfoFormComponent.vue
+++ b/resources/assets/vue/components/address/forms/EInvoiceInfoFormComponent.vue
@@ -32,7 +32,7 @@
Billing Address
-{{parameters.street_one}} {{parameters.street_two}}, {{districts[parseFloat(parameters.district_id) - 1].city}} {{parameters.post_code}} {{districts[parseFloat(parameters.district_id) - 1].state.name}}, {{districts[parseFloat(parameters.district_id) - 1].country.name}}
+{{parameters.street_one}} {{parameters.street_two}}, {{districts[parseFloat(parameters.district_id) - 1].city}} {{parameters.post_code}} {{states[parseFloat(parameters.state_id) - 1].state}}, {{districts[parseFloat(parameters.district_id) - 1].country.name}}