Skip to content

Payment#1

Open
woodgas wants to merge 3 commits into
mulenokd:mainfrom
woodgas:payment
Open

Payment#1
woodgas wants to merge 3 commits into
mulenokd:mainfrom
woodgas:payment

Conversation

@woodgas
Copy link
Copy Markdown

@woodgas woodgas commented Sep 22, 2023

Привет)
Выполнил тестовое задание. По нему стоит отметить следующее:

  • Добавил полную валидацию карты через пакет LVR\CreditCard (дата окончания действия и cvc карты).
  • wire:model везде поставил в ленивый режим. Запрос на сервер отправляется при уходе с формы, при использовании банковской карты можно поправить сумму платежа.
  • Оставил маску и валидацию лишь для русского номера, для международных номеров нужен выпадающий список с кодом страны. Коды стран имеют длину 1-3 знака и маска не может отличить код страны от начала самого номера. Например в Узбекистане номер будет +998 (71) 209-41-00.
  • Требовалось двойное нажатие на кнопку при отправке оплаты, пофиксил в button.blade.php.
    Тесты пока не накидывал, логотипы систем оплаты не ставил.

	modified:   public/js/app.js
	modified:   composer.json
	modified:   app/Actions/Pay.php
	modified:   app/Actions/Status.php
	new file:   app/Http/Livewire/CardForm.php
	modified:   app/Http/Livewire/PaymentForm.php
	new file:   app/Http/Livewire/QiwiForm.php
	new file:   app/Http/Livewire/YoomoneyForm.php
	new file:   app/Rules/YooNumber.php
	new file:   config/livewire.php
	modified:   public/js/app.js
	new file:   public/vendor/livewire/livewire.js
	new file:   public/vendor/livewire/livewire.js.map
	new file:   public/vendor/livewire/manifest.json
	modified:   resources/js/components/payment-form-mask.js
	modified:   resources/lang/en/validation.php
	modified:   resources/views/components/form/button.blade.php
	modified:   resources/views/components/form/input.blade.php
	new file:   resources/views/components/payment/method-wrap.blade.php
	new file:   resources/views/components/payment/methods.blade.php
	new file:   resources/views/components/payment/wrap.blade.php
	new file:   resources/views/livewire/card-form.blade.php
	deleted:    resources/views/livewire/payment-form.blade.php
	new file:   resources/views/livewire/qiwi-form.blade.php
	new file:   resources/views/livewire/yoomoney-form.blade.php
	modified:   resources/views/pages/pay.blade.php
Copy link
Copy Markdown
Owner

@mulenokd mulenokd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В целом хотелось бы видеть более динамичный и расширяемый подход. В идеале - чтобы при введении нового способа оплаты мы могли добавить только компонент формы по типу YoomoneyForm, который отвечал бы за конкретные данные и их валидацию. Но в текущем подходе нам нужно будет добавить его в список табов, в список форм, а так же прописать ему какую-то дополнительную логику для дозапроса данных.

public string $phoneReq = '';
public bool $needPhone = false;

public function submit()
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Метод submit() дублируется практически во всех формах. Решение - добавить некий метод needToRequestExtraData() в базовый класс, который отвечает за дозапрос данных.

{
$this->validate();

if ($this->hasPhoneService()) {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Представим ситуацию, что теперь бизнес хочет запрашивать e-mail для отправки чека об оплате, причем только для плательщиков из РФ. В этом случае нам придется вводить ещё одну проверку внутри карточной формы, что не есть хорошо. Было бы здорово, если бы за это отвечал отдельный сервис, который понимал, какие данные и когда нам нужно запросить.

'cvc' => ['required', 'size:3', new CardCvc($this->card)],
'phoneReq' => [
'sometimes',
'regex:/^\+\d{1,2}\(\d{3}\)\d{3}-\d{2}-\d{2}$/',
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Валидация номера телефона уже есть в QiwiForm - поэтому для избежания дублирования это правило можно было вынести в Rule по типу App\Rules\YooNumber.php

{
return [
'card' => ['required', new CardNumber],
'exp' => ['required', new CardExpirationDate('m/y')],
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я намеренно не использовал это правило, потому что есть банковские карты РФ с истекшим сроком действия, но которые до сих пор работают. Не считаю за ошибку, т.к. это особенности внутренней кухни.

Payment methods
</div>

<x-payment.method-wrap :type="'BANK_CARD'" :typeName="'Bank card'"/>
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если добавятся другие способы оплаты - придется идти в код и добавлять их. Было бы лучше, если бы компонент payment.methods принимал на вход доступные способы оплаты и отображал их через простой foreach


<x-payment.methods/>

<x-payment.wrap :type="'BANK_CARD'">
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Та же история с динамическим рендером компонентов. При внесении ещё одного - нужно добавлять его и тут.

@@ -0,0 +1,59 @@
<div wire:init="componentInit" class="w-full"
x-data="{ needPhone: @entangle('needPhone') }">
<div class="max-w-sm w-full mx-auto rounded-lg bg-white px-4 pt-4 pb-6 shadow-md">
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выглядит так, что можно ещё много кода вынести в payment.wrap. Рамка, логотип, кнопка - всё дублируется в каждой форме. Было бы лучше, если бы каждый компонент формы отвечал только за ввод и валидацию данных, но не за отображение рамок и логотипов.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants