Как стать автором
Обновить

Делаем донаты для telegram бота, через интеграцию ЮKassa для самозанятых

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров5.9K
Всего голосов 13: ↑13 и ↓0+13
Комментарии7

Комментарии 7

Спасибо, очень интересно, особенно про налоги и комиссии.


Не очень понятна структура класса Payment. Например почему данные плательщика прописаны в классе а не берутся из настроек. И почему цена и описание фактически присваиваются по два раза. Не проще вместо конструктора сделать getPaymentData, и заполнять массив в нем? Мне кажется поаккуратнее будет. А в конструкторе задавать сумму и назначение платежа. И вызывать


$paymentData = (new Payment($price))->getPaymentData();

В классе Payment дефолтные значения свойств, которые могут быть переопределены. Свойства в классе Payment они динамические и могут меняться. По-этой причине, я решил, что здесь лучше будет применить паттерн Builder, чтобы можно было легко переопределять свойства объекта. То, что вы предлагаете, тоже удобно и может выглядеть еще чище, попробую реализовать. Итак, можно было бы создать DTO, например:

class PaymentDataDto
{
    /**
     * @var string $fullName Имя и фамилия пользователя.
     */
    private string $fullName = 'My name is Aleksandr';

    /**
     * @var string $email Email пользователя.
     */
    private string $email = '****@gmail.com';

    /**
     * @var string $phone Телефон пользователя.
     */
    private string $phone = '7905*******';

    /**
     * @var int $price Сумма платежа.
     */
    private int $price = 100;

    /**
     * @var string $currency Валюта платежа.
     */
    private string $currency = 'RUB';

    /**
     * @var string $description Описание платежа.
     */
    private string $description = 'Донат от пользователя';

    /**
     * @var array $data Данные платежа.
     */
    public array $data;

    /**
     * @var array $receiptData Данные чека
     */
    public array $receiptData;

    public function __construct($properties = [])
    {
        if (!empty($properties)) {
            foreach ($properties as $name => $value) {
            $this->$name = $value;
        }
    }
}

Инициализация объекта платежа будет следующей:

$paymentDataDto = new paymentDataDto([
  'fullName' => 'User name',
  'email' => 'habrouser2023@gmail.com',
  'phone' => '+7*********',
  'price' => 1500,
  'description' => 'Оплата услуги',
]);

$payment = new Payment($paymentDataDto);

$client = new Client();
$client->setAuth(env('YOOKASSA_SHOP_ID'), env('YOOKASSA_SECRET_KEY'));

$YooKassaPayment = $client->createPayment(
    $payment->data,
    uniqid('', true)
);

Я не люблю когда при создании объекта, в сигнатуре передается одно свойство, потому что, через неделю, другой разработчик захочет передать второе свойство, например скидку $discount. Через год другой разработчик захочет передать еще несколько свойств в конструктор и мы получим приблизительно следующее.

$paymentData = (new Payment($price))->getPaymentData();

// Через месяц
$paymentData = (new Payment($price, $discount))->getPaymentData();

// Через 6 месяцев
$paymentData = (new Payment($price, $discount, $description))->getPaymentData();

// Через год
$paymentData = (new Payment($price, $discount, $description, $userId, $email))->getPaymentData();

Выглядит не очень, куда лучше использовать инверсию зависимости и передавать обьект paymentDataDto, который в дальнейшем может имплементировать интерфейс BaseDtoInterface или расширять родительский класс BaseDto, что в будущем позволяет нам иметь чистый и понятный обьектно ориентированный код, который легко поддерживать и расширять.

Вообщем, тут есть несколько вариантов, ваш тоже приемлем.

Вот да, с DTO получается гораздо лучше. Но только с нормальным конструктором, а не с вот этим вот отростком. Как-то от этого "иф нот емпти" четвертой версией попыхивает :)


Сейчас мне кажется для DTO вообще уже нет других вариантов кроме constructor property promotion. Тем более что кода получится в 5 раз меньше


class PaymentDataDto
{
    public function __construct(
        private string $fullName = '',
        private string $email = '',
        private string $phone = '',
        private int $price = 100,
        private string $currency = 'RUB',
        private string $description = 'Донат от пользователя',
        ) {}
}

Для оформления самозанятости необходимо наличие карты Tinkoff

Вы нагло врёте. Почему нагло? Потому что для оформления самозанятости Тинькофф нафиг не нужен, а у вас дальше идёт реферальная ссылка.

Опа. А слона-то я и не заметил. Ну это совсем уже зашквар. Lead Software Engineer побирается реферальными ссылками.

Вы плохо читаете статью. Я же написал:

Не могу сказать, можно ли оформить самозанятость через приложения других банков. Но встать на учет самозанятому можно в приложении «Мой налог» по учетной записи Госуслуг. Если у вас есть банковский счет в другом банке, вы можете подать заявление на самозанятого, в приложении «Мой налог».

Ого, вы и в комментарии делаете то же самое, что в статье - не обоснованные и при этом неверные утверждения в категоричном ключе. Давайте разбираться?

Disclaimer: Я понимаю, что вышло много букв. Я осознаю и принимаю, что вы можете не понять написанное в точности так, как понимаю я, или не принять его полностью или частично, и принимаю возможные последствия. Далее я детально поясняю свою логику, так как действую не с целью уязвить вас, а с целью сделать любимый мной ресурс лучше.

Во-первых, я читаю ровно то, что написано, а не то, что вы имели в виду, так как не умею читать мысли. Поэтому я привел цитату, где вы утверждаете, что для оформления самозанятости необходимо наличие карты и нужно открыть счет. Необходимо означает, что без этого не обойтись. Это очевидно не так: нет, не необходимо, и нет, открывать счет в Тинькофф не нужно (а всего лишь можно, ибо, вероятно, удобно).

То есть сильное утверждение подано без оговорок. Ни в этом, ни в следующем абзаце оговорок нет - "необходимо", "нужно", "оформляем", "откройте", только таймера нет и зачеркнутой цены. А вот рефералка есть. Это факт. И да, я проверил - на момент написания этого комментария текст не изменился. А я люблю точные формулировки.

Во-вторых, понимаете, даже если принять ваш аргумент, что далее упоминаются альтернативы (это так, упоминаются), то ваш текст всё равно построен так, что категоричное и неверное суждение идет до верного утверждения. А между ними рефералка. И тут я вижу несколько вариантов, как это получилось:

  • вы сознательно выбрали такой порядок изложения, чтобы подтолкнуть читателя к регистрации по вашей рефералке (наиболее вероятный вариант, подтверждается собственно наличием именно реферальной ссылки и использованием слова "необходимо", причем вы защищаете его использование, одновременно нападая на меня формулировкой "вы плохо читаете статью" - хотя прочитать следующие два абзаца я смог, пусть вы об этом и не могли знать; синхронные минусы комментам из ветки тоже косвенное подтверждение; само по себе желание получить доп. доход я не осуждаю, но зачем же вводить в заблуждение?);

  • вы написали, как думали, и не озаботились критическим прочтением своего текста, либо не оценили, как он может восприниматься (тоже вероятный вариант, я давно не оптимист по отношению к качеству текстов в сети, и да, возможно у меня завышенные ожидания к авторам Хабра);

  • вы вообще не перечитывали написанное для проверки (менее вероятно, но возможно);

  • ну как-то так оно само вышло, "не виноватая я" (мы на Хабре, такой аргумент тут не должен прокатывать, тем более от разработчиков - поэтому всего лишь маловероятно);

  • нечто мной неучтенное либо то, что я, в силу ограниченности, не могу представить.

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

В-третьих, даже абзац с верным утверждением (встать на учет самозанятому можно в приложении "Мой налог") сформулирован так, что он создает ложное впечатление:

Не могу сказать, можно ли оформить самозанятость через приложения других банков.

Формально правильно. По факту гуглится за 1 (одну) минуту список на официальном ресурсе, куда входят уполномоченные банки для регистрации самозанятости в количестве 32 (тридцать две) штуки, и там не только Тинькофф предлагает полностью онлайн подать заявку.

И да, я считаю, что если вы могли это проверить за 1 минуту при подготовке статьи - это стоило сделать при подготовке статьи. Вы пишете один раз, а читать вас будут много раз. А значит, либо вы серийный писатель, либо повышается вероятность первых двух вариантов из предыдущего пункта, либо неучтенные мной альтернативы.

Если у вас есть банковский счет в другом банке, вы можете подать заявление на самозанятого, в приложении «Мой налог».

Внезапно, банковский счет вообще не требуется для подачи заявки на самозанятого. Да, вот так вот. Конечно, с ним удобнее (особенно для бота, принимающего донаты через Юкассу). Но в общем случае, именно для подачи заявления он не необходим. То есть правильно будет так: независимо от наличия счета, вы можете подать заявление на самозанятого в приложении "Мой налог".

P.S. Поймите, я просто хочу, чтобы на Хабре были качественные статьи, чтобы я мог в голос орать "Хабр - торт!" и пихать полные карманы плюсов в карму авторам, чтобы они писали ещё больше годноты. А получаю обвинения в том, что я плохо читаю, когда вижу в туториале (если судить по тегам) почему-то реферальные ссылки вместо прямых ссылок, да еще сомнительно поданные. Ну штош, видимо, такова жизнь.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории