Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/.env.testing
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ abstract class AccountRazorpayPlatformDomainObjectAbstract extends \HiEvents\Dom
final public const RAZORPAY_ACCOUNT_ID = 'razorpay_account_id';
final public const STATUS = 'status';
final public const RAZORPAY_ACCOUNT_DETAILS = 'razorpay_account_details';
final public const ONBOARDING_DATA = 'onboarding_data';
final public const ACTIVATED_AT = 'activated_at';
final public const CREATED_AT = 'created_at';
final public const UPDATED_AT = 'updated_at';
Expand All @@ -25,6 +26,7 @@ abstract class AccountRazorpayPlatformDomainObjectAbstract extends \HiEvents\Dom
protected ?string $razorpay_account_id = null;
protected string $status = 'created';
protected array|string|null $razorpay_account_details = null;
protected array|string|null $onboarding_data = null;
protected ?string $activated_at = null;
protected ?string $created_at = null;
protected ?string $updated_at = null;
Expand All @@ -38,6 +40,7 @@ public function toArray(): array
'razorpay_account_id' => $this->razorpay_account_id ?? null,
'status' => $this->status ?? null,
'razorpay_account_details' => $this->razorpay_account_details ?? null,
'onboarding_data' => $this->onboarding_data ?? null,
'activated_at' => $this->activated_at ?? null,
'created_at' => $this->created_at ?? null,
'updated_at' => $this->updated_at ?? null,
Expand Down Expand Up @@ -100,6 +103,17 @@ public function getRazorpayAccountDetails(): array|string|null
return $this->razorpay_account_details;
}

public function setOnboardingData(array|string|null $onboarding_data): self
{
$this->onboarding_data = $onboarding_data;
return $this;
}

public function getOnboardingData(): array|string|null
{
return $this->onboarding_data;
}

public function setActivatedAt(?string $activated_at): self
{
$this->activated_at = $activated_at;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace HiEvents\Http\Actions\Accounts\Razorpay;

use HiEvents\Http\Requests\Accounts\Razorpay\RazorpayBusinessStageRequest;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\UpdateRazorpayBusinessStageHandler;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\UpdateRazorpayBusinessStageDTO;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\RegisteredAddressDTO;
use Illuminate\Http\JsonResponse;

class UpdateRazorpayBusinessStageAction
{
public function __construct(
private readonly UpdateRazorpayBusinessStageHandler $handler
) {
}

public function __invoke(RazorpayBusinessStageRequest $request, int $accountId): JsonResponse
{
$dto = new UpdateRazorpayBusinessStageDTO(
accountId: $accountId,
email: $request->validated('email'),
phone: $request->validated('phone'),
legalBusinessName: $request->validated('legalBusinessName'),
businessType: $request->validated('businessType'),
contactName: $request->validated('contactName'),
registeredAddress: new RegisteredAddressDTO(
street1: $request->validated('registeredAddress.street1'),
street2: $request->validated('registeredAddress.street2'),
city: $request->validated('registeredAddress.city'),
state: $request->validated('registeredAddress.state'),
postalCode: $request->validated('registeredAddress.postalCode'),
country: $request->validated('registeredAddress.country'),
),
pan: $request->validated('pan'),
gst: $request->validated('gst'),
);

$response = $this->handler->handle($dto);

return response()->json($response->toArray());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace HiEvents\Http\Actions\Accounts\Razorpay;

use HiEvents\Http\Requests\Accounts\Razorpay\RazorpaySettlementStageRequest;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\UpdateRazorpaySettlementStageHandler;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\UpdateRazorpaySettlementStageDTO;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\SettlementDTO;
use Illuminate\Http\JsonResponse;

class UpdateRazorpaySettlementStageAction
{
public function __construct(
private readonly UpdateRazorpaySettlementStageHandler $handler
) {
}

public function __invoke(RazorpaySettlementStageRequest $request, int $accountId): JsonResponse
{
$dto = new UpdateRazorpaySettlementStageDTO(
accountId: $accountId,
settlement: new SettlementDTO(
accountNumber: $request->validated('settlement.accountNumber'),
ifscCode: $request->validated('settlement.ifscCode'),
beneficiaryName: $request->validated('settlement.beneficiaryName'),
)
);

$response = $this->handler->handle($dto);

return response()->json($response->toArray());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace HiEvents\Http\Actions\Accounts\Razorpay;

use HiEvents\Http\Requests\Accounts\Razorpay\RazorpayStakeholderStageRequest;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\UpdateRazorpayStakeholderStageHandler;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\UpdateRazorpayStakeholderStageDTO;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\StakeholderDTO;
use HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO\ResidentialAddressDTO;
use Illuminate\Http\JsonResponse;

class UpdateRazorpayStakeholderStageAction
{
public function __construct(
private readonly UpdateRazorpayStakeholderStageHandler $handler
) {
}

public function __invoke(RazorpayStakeholderStageRequest $request, int $accountId): JsonResponse
{
$dto = new UpdateRazorpayStakeholderStageDTO(
accountId: $accountId,
stakeholder: new StakeholderDTO(
name: $request->validated('stakeholder.name'),
email: $request->validated('stakeholder.email'),
residentialAddress: new ResidentialAddressDTO(
street: $request->validated('stakeholder.residentialAddress.street'),
city: $request->validated('stakeholder.residentialAddress.city'),
state: $request->validated('stakeholder.residentialAddress.state'),
postalCode: $request->validated('stakeholder.residentialAddress.postalCode'),
country: $request->validated('stakeholder.residentialAddress.country'),
),
pan: $request->validated('stakeholder.pan'),
)
);

$response = $this->handler->handle($dto);

return response()->json($response->toArray());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace HiEvents\Http\Requests\Accounts\Razorpay;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class RazorpayBusinessStageRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}

public function rules(): array
{
return [
'email' => ['required', 'email'],
'phone' => ['required', 'string', 'min:10'],
'legalBusinessName' => ['required', 'string', 'max:255'],
'businessType' => ['required', Rule::in(['partnership', 'proprietorship', 'private_limited', 'public_limited'])],
'contactName' => ['required', 'string', 'max:255'],
'registeredAddress' => ['required', 'array'],
'registeredAddress.street1' => ['required', 'string', 'max:255'],
'registeredAddress.street2' => ['nullable', 'string', 'max:255'],
'registeredAddress.city' => ['required', 'string', 'max:255'],
'registeredAddress.state' => ['required', 'string', 'max:255'],
'registeredAddress.postalCode' => ['required', 'string', 'max:10'],
'registeredAddress.country' => ['required', 'string', 'size:2', 'in:IN'],
'pan' => ['required', 'string', 'size:10'],
'gst' => ['nullable', 'string', 'max:15'],
];
}

public function messages(): array
{
return [
'pan.size' => __('The PAN must be exactly 10 characters.'),
'registeredAddress.country.in' => __('Only Indian addresses are supported.'),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace HiEvents\Http\Requests\Accounts\Razorpay;

use Illuminate\Foundation\Http\FormRequest;

class RazorpaySettlementStageRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}

public function rules(): array
{
return [
'settlement' => ['required', 'array'],
'settlement.accountNumber' => ['required', 'string', 'max:30'],
'settlement.ifscCode' => ['required', 'string', 'size:11'],
'settlement.beneficiaryName' => ['required', 'string', 'max:255'],
];
}

public function messages(): array
{
return [
'settlement.ifscCode.size' => __('The IFSC code must be exactly 11 characters.'),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace HiEvents\Http\Requests\Accounts\Razorpay;

use Illuminate\Foundation\Http\FormRequest;

class RazorpayStakeholderStageRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}

public function rules(): array
{
return [
'stakeholder' => ['required', 'array'],
'stakeholder.name' => ['required', 'string', 'max:255'],
'stakeholder.email' => ['required', 'email'],
'stakeholder.pan' => ['required', 'string', 'size:10'],
'stakeholder.residentialAddress' => ['required', 'array'],
'stakeholder.residentialAddress.street' => ['required', 'string', 'max:255'],
'stakeholder.residentialAddress.city' => ['required', 'string', 'max:255'],
'stakeholder.residentialAddress.state' => ['required', 'string', 'max:255'],
'stakeholder.residentialAddress.postalCode' => ['required', 'string', 'max:10'],
'stakeholder.residentialAddress.country' => ['required', 'string', 'size:2', 'in:IN'],
];
}

public function messages(): array
{
return [
'stakeholder.pan.size' => __('The stakeholder PAN must be exactly 10 characters.'),
'stakeholder.residentialAddress.country.in' => __('Only Indian addresses are supported.'),
];
}
}
2 changes: 2 additions & 0 deletions backend/app/Models/AccountRazorpayPlatform.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ class AccountRazorpayPlatform extends BaseModel
'razorpay_account_id',
'status',
'razorpay_account_details',
'onboarding_data',
'activated_at',
];

protected $casts = [
'razorpay_account_details' => 'array',
'onboarding_data' => 'array',
'activated_at' => 'datetime',
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public function findByAccountId(int $accountId): ?AccountRazorpayPlatformDomainO
return $results->first() ?: null;
}

public function findByRazorpayAccountId(string $razorpayAccountId): ?AccountRazorpayPlatformDomainObject
{
$results = $this->findWhere(['razorpay_account_id' => $razorpayAccountId]);
return $results->first() ?: null;
}

public function updateById(int $id, array $data): bool
{
return (bool) $this->model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ interface AccountRazorpayPlatformRepositoryInterface extends RepositoryInterface
{
public function findByAccountId(int $accountId): ?AccountRazorpayPlatformDomainObject;

public function findByRazorpayAccountId(string $razorpayAccountId): ?AccountRazorpayPlatformDomainObject;

public function updateById(int $id, array $data): bool;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public function __construct(
public readonly ?string $email,
public readonly ?string $legalBusinessName,
public readonly string $country = 'IN',
public readonly ?array $onboardingData = null,
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO;

use HiEvents\DataTransferObjects\BaseDTO;

class UpdateRazorpayBusinessStageDTO extends BaseDTO
{
public function __construct(
public readonly int $accountId,
public readonly string $email,
public readonly string $phone,
public readonly string $legalBusinessName,
public readonly string $businessType,
public readonly string $contactName,
public readonly RegisteredAddressDTO $registeredAddress,
public readonly string $pan,
public readonly ?string $gst = null,
public readonly ?string $profileCategory = null,
public readonly ?string $profileSubcategory = null,
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO;

use HiEvents\DataTransferObjects\BaseDTO;

class UpdateRazorpaySettlementStageDTO extends BaseDTO
{
public function __construct(
public readonly int $accountId,
public readonly SettlementDTO $settlement,
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace HiEvents\Services\Application\Handlers\Account\Payment\Razorpay\DTO;

use HiEvents\DataTransferObjects\BaseDTO;

class UpdateRazorpayStakeholderStageDTO extends BaseDTO
{
public function __construct(
public readonly int $accountId,
public readonly StakeholderDTO $stakeholder,
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,19 @@ public function handle(int $accountId): GetRazorpayLinkedAccountsResponseDTO
}

$razorpayAccounts = $platforms->map(function (AccountRazorpayPlatformDomainObject $platform) use ($account){
$onboardingData = $platform->getOnboardingData();
if (is_string($onboardingData)) {
$onboardingData = json_decode($onboardingData, true) ?: null;
}

return new RazorpayLinkedAccountDTO(
id: $platform->getId(),
status: $platform->getStatus(),
razorpayAccountId: $platform->getRazorpayAccountId(),
email: $account->getEmail(),
legalBusinessName: $account->getName(),
country: 'IN',
onboardingData: $onboardingData,
);
});

Expand Down
Loading