diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bfa0621
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+
+.idea/*
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..551ab9a
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+### v1.0.1
+* Добавлена отправка информации о имени CMS и версии используемого модуля в параметре metadata платежа
+
+### v1.0.0
+* Добавлена возможность создания платежей через API Яндекс.Кассы с использованием Yandex Checkout SDK
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..7e1177d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,3 @@
+Лицензионный договор.
+
+Любое использование Вами программы означает полное и безоговорочное принятие Вами условий лицензионного договора, размещенного по адресу https://money.yandex.ru/doc.xml?id=527132 (далее – «Лицензионный договор»). Если Вы не принимаете условия Лицензионного договора в полном объёме, Вы не имеете права использовать программу в каких-либо целях.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b90e93d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,66 @@
+# yandexmoney-joomla-joomshopping
+
+С помощью модуля можно настроить прием платежей через Яндекс.Кассу
+
+[Инструкция по настройке](https://kassa.yandex.ru/manuals/joomshopping)
+
+### Установка модуля
+Для установки данного модуля необходимо:
+* перейти в раздел установка/обновление компонента JoomShopping
+* указать [архив](https://github.com/yandex-money/yandex-money-cms-v2-joomshopping/blob/master/yandex-money-cms-v2-joomshopping.zip?raw=true) в качестве файла пакета обновления
+* загрузить пакет, щелкнув по `Загрузить`
+
+Пожалуйста, обязательно делайте бекапы!
+
+Внимание! Если у вас пустая страница конфигурации - у вас неправильно настроен `tmp_path` в файле настроек `configuration.php`и/или папка `/tmp` недоступна для записи на момент установки модуля (исправляется командой `chmod 777 /tmp`).
+
+### Требования к CMS Joomla:
+* версия 2.5.x, 3.2.х - 3.8.х;
+* компонент JoomShopping версии 4.х
+
+### О Кассе
+Сервис, который позволяет включить прием платежей на сайте.
+
+[Сайт Кассы](http://kassa.yandex.ru/)
+
+#### Условия
+* подходит для юрлиц и ИП,
+* деньги приходят на расчетный счет,
+* комиссия берется с каждого успешного платежа.
+
+Для использования нужно [подключиться к Яндекс.Кассе](https://money.yandex.ru/joinups) и получить в личном кабинете на сайте Кассы параметры **shopId** и **Секретный ключ**.
+
+### Способы приема платежей
+Вы можете выбрать любое количество способов из списка:
+
+* Банковские карты — Visa, Mastercard и Maestro, «Мир»;
+* Яндекс.Деньги;
+* Webmoney;
+* QIWI Wallet;
+* Наличные;
+* Альфа-Клик;
+* Сбербанк Онлайн;
+* Баланс мобильного — Билайн, Мегафон, МТС, Tele2.
+
+### Дополнительные возможности
+
+**Оплата на стороне Яндекса**
+
+Включите в модуле оплату на стороне Яндекса — и не придется размещать на своем сайте все способы оплаты. Вместо этого останется одна кнопка «Заплатить».
+
+[Пример в демо-магазине Кассы](https://kassa.yandex.ru/demo/index.html)
+
+**Отправка данных для чеков по 54-фз**
+
+Если вы подключите решение Кассы для 54-фз, модуль будет отправлять в Кассу данные для чека вместе с информацией о заказе.
+
+[Подробности на сайте Кассы](https://kassa.yandex.ru/features)
+
+### Контакты
+Если у вас есть вопросы или идеи для модуля, напишите нам: cms@yamoney.ru
+
+В письме укажите:
+* версию платформы,
+* версию модуля (его можно посмотреть на странице настроек),
+* идею или проблему,
+* снимок экрана, о котором говорите.
diff --git a/src/components/com_jshopping/images/yandex_money/ab.png b/src/components/com_jshopping/images/yandex_money/ab.png
new file mode 100644
index 0000000..691305a
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ab.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/ac.png b/src/components/com_jshopping/images/yandex_money/ac.png
new file mode 100644
index 0000000..ef7b29b
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ac.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/gp.png b/src/components/com_jshopping/images/yandex_money/gp.png
new file mode 100644
index 0000000..e2633f7
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/gp.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/ma.png b/src/components/com_jshopping/images/yandex_money/ma.png
new file mode 100644
index 0000000..c18599f
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/ma.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/mc.png b/src/components/com_jshopping/images/yandex_money/mc.png
new file mode 100644
index 0000000..af88e5a
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/mc.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/pb.png b/src/components/com_jshopping/images/yandex_money/pb.png
new file mode 100644
index 0000000..de8fd95
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/pb.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/pc.png b/src/components/com_jshopping/images/yandex_money/pc.png
new file mode 100644
index 0000000..c503dea
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/pc.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/qp.png b/src/components/com_jshopping/images/yandex_money/qp.png
new file mode 100644
index 0000000..7158f7c
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/qp.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/qw.png b/src/components/com_jshopping/images/yandex_money/qw.png
new file mode 100644
index 0000000..8bc2679
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/qw.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/sb.png b/src/components/com_jshopping/images/yandex_money/sb.png
new file mode 100644
index 0000000..7d67983
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/sb.png differ
diff --git a/src/components/com_jshopping/images/yandex_money/wm.png b/src/components/com_jshopping/images/yandex_money/wm.png
new file mode 100644
index 0000000..62beb31
Binary files /dev/null and b/src/components/com_jshopping/images/yandex_money/wm.png differ
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php
new file mode 100644
index 0000000..516563f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_kassa.php
@@ -0,0 +1,159 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php
new file mode 100644
index 0000000..7ac5e32
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_money.php
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'PC','cards2'=>'AC');
+ foreach ($list_methods as $m_long => $m_short){?>
+
+
+
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php
new file mode 100644
index 0000000..838980e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/3x/yandex_payments.php
@@ -0,0 +1,66 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php
new file mode 100644
index 0000000..8b15d69
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/adminparamsform2x.php
@@ -0,0 +1,316 @@
+
+
+
+
+
+
+
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php b/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php
new file mode 100644
index 0000000..70d29b6
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lang/ru-RU.php
@@ -0,0 +1,117 @@
+Яндекс.Кассе.");
+define('_JSHOP_YM_VERSION_DESCRIPTION','Версия модуля ');
+
+define('_JSHOP_YM_TAB_MONEY', 'Яндекс.Деньги');
+define('_JSHOP_YM_TAB_KASSA', 'Яндекс.Касса');
+define('_JSHOP_YM_TAB_PAYMENTS', 'Яндекс.Платежка');
+
+define('_JSHOP_YM_KASSA_ON', 'Включить приём платежей через Яндекс.Кассу');
+define('_JSHOP_YM_KASSA_TEST', 'Тестовый режим');
+define('_JSHOP_YM_KASSA_WORK', 'Реальный режим');
+define('_JSHOP_YM_KASSA_HELP_CHECKURL', 'Этот адрес понадобится, только если его попросят специалисты Яндекс.Кассы');
+define('_JSHOP_YM_KASSA_HELP_SUCCESSURL', 'Включите «Использовать страницы успеха и ошибки с динамическими адресами» в настройках личного кабинета Яндекс.Кассы');
+define('_JSHOP_YM_KASSA_HELP_DYNAMICURL', 'Страницы с динамическими адресами');
+
+define('_JSHOP_YM_KASSA_HEAD_LK', 'Параметры из личного кабинета Яндекс.Кассы');
+define('_JSHOP_YM_KASSA_SHOP_ID_LABEL', 'shopId');
+define('_JSHOP_YM_KASSA_SHOP_ID_DESCRIPTION', 'Скопируйте shopId из личного кабинета Яндекс.Кассы');
+define('_JSHOP_YM_KASSA_PASSWORD_LABEL', 'Секретный ключ');
+define('_JSHOP_YM_KASSA_PASSWORD_DESCRIPTION', 'Выпустите и активируйте секретный ключ в личном кабинете Яндекс.Кассы. Потом скопируйте его сюда.');
+define('_JSHOP_YM_KASSA_PARAMS', 'Shop ID, scid, ShopPassword можно посмотреть в личном кабинете после подключения Яндекс.Кассы.');
+
+define('_JSHOP_YM_KASSA_PAYMODE_HEAD', 'Настройка сценария оплаты');
+define('_JSHOP_YM_KASSA_PAYMODE_LABEL', 'Выбор способа оплаты');
+define('_JSHOP_YM_KASSA_SEND_RECEIPT_LABEL', 'Отправлять в Яндекс.Кассу данные для чеков (54-ФЗ)');
+define('_JSHOP_YM_KASSA_PAYMODE_KASSA', 'На стороне Кассы');
+define('_JSHOP_YM_KASSA_PAYMODE_SHOP', 'На стороне магазина');
+define('_JSHOP_YM_KASSA_PAYMODE_LINK', 'Подробнее о сценариях оплаты');
+define('_JSHOP_YM_KASSA_SELECT_TEXT', 'Отметьте способы оплаты, которые указаны в вашем договоре с Яндекс.Деньгами');
+define('_JSHOP_YM_METHOD_YANDEX_MONEY_DESCRIPTION', 'Яндекс.Деньги');
+define('_JSHOP_YM_METHOD_CARDS_DESCRIPTION', 'Банковские карты');
+define('_JSHOP_YM_METHOD_BANK_CARD_DESCRIPTION', 'Банковские карты');
+define('_JSHOP_YM_METHOD_CASH_DESCRIPTION', 'Наличные через терминалы');
+define('_JSHOP_YM_METHOD_MOBILE_BALANCE_DESCRIPTION', 'Баланс мобильного');
+define('_JSHOP_YM_METHOD_WEBMONEY_DESCRIPTION', 'Кошелек WebMoney');
+define('_JSHOP_YM_METHOD_ALFABANK_DESCRIPTION', 'Альфа-Клик');
+define('_JSHOP_YM_METHOD_SBERBANK_DESCRIPTION', 'Сбербанк Онлайн');
+define('_JSHOP_YM_METHOD_MA_DESCRIPTION', 'MasterPass');
+define('_JSHOP_YM_METHOD_PB_DESCRIPTION', 'Интернет-банк Промсвязьбанка');
+define('_JSHOP_YM_METHOD_QIWI_DESCRIPTION', 'QIWI Wallet');
+define('_JSHOP_YM_METHOD_QP_DESCRIPTION', 'Доверительный платеж (Куппи.ру)');
+define('_JSHOP_YM_METHOD_MP_DESCRIPTION', 'Мобильный терминал');
+define('_JSHOP_YM_KASSA_MPOS_LABEL', 'Страница успеха для способа «Оплата картой при доставке»');
+define('_JSHOP_YM_KASSA_MPOS_HELP', 'Это страница с информацией о доставке. Укажите на ней, когда привезут товар и как его можно будет оплатить');
+
+define('_JSHOP_YM_MONEY_HEAD', 'Для работы с модулем нужно открыть кошелек на Яндексе и
+ зарегистрировать приложение на сайте Яндекс.Денег');
+define('_JSHOP_YM_MONEY_ON', 'Включить прием платежей в кошелек на Яндексе');
+define('_JSHOP_YM_MONEY_REDIRECT_HELP', 'Скопируйте эту ссылку в поле Redirect URL на странице регистрации приложения.');
+
+define('_JSHOP_YM_MONEY_SET_HEAD', 'Настройки приема платежей');
+define('_JSHOP_YM_MONEY_WALLET', 'Номер кошелька');
+define('_JSHOP_YM_MONEY_PSW', 'Секретное слово');
+
+define('_JSHOP_YM_MONEY_SELECT_HEAD', 'Настройка сценария оплаты');
+define('_JSHOP_YM_MONEY_SELECT_LABEL', 'Способы оплаты');
+define('_JSHOP_YM_METHOD_YM2_DESCRIPTION', 'Кошелек Яндекс.Деньги');
+define('_JSHOP_YM_METHOD_CARDS2_DESCRIPTION', 'Банковская карта');
+
+define('_JSHOP_YM_COMMON_HEAD', 'Дополнительные настройки для администратора');
+define('_JSHOP_YM_COMMON_STATUS', 'Статус заказа после оплаты');
+
+define('_JSHOP_YM_PAYMENTS_HEAD', 'Это платежная форма на ваш сайт. Позволяет принимать платежи на счет компании — с
+карт и из кошельков Яндекс.Денег, без договора.
+Для настройки нужен ID формы: он придет в письме, когда вы
+соберете форму в конструкторе.');
+
+define('_JSHOP_YM_PAYMENTS_ON', 'Включить прием платежей через Платежку');
+define('_JSHOP_YM_PAYMENTS_ID_LABEL', 'ID формы');
+define('_JSHOP_YM_PAYMENTS_DESCRIPTION_LABEL', 'Назначение платежа');
+define('_JSHOP_YM_PAYMENTS_DESCRIPTION_PLACEHOLDER', 'Номер заказа %order_id%. Оплата через Яндекс.Платежку');
+define('_JSHOP_YM_PAYMENTS_DESCRIPTION_INFO', 'Назначение будет в платежном поручении от банка. Напишите в нем всё,
+что поможет отличить заказ, который оплатили через Платежку.');
+define('_JSHOP_YM_PAYMENTS_STATUS_LABEL', 'Статус заказа');
+define('_JSHOP_YM_PAYMENTS_STATUS_INFO', 'Статус должен показать, что результат платежа неизвестен: о том, что клиент
+заплатил, можно узнать только из письма от Платежки или в своем банке.');
+define('_JSHOP_YM_PAYMENTS_FIO_LABEL', 'ФИО плательщика');
+define('_JSHOP_YM_PAYMENTS_CONFIRM_LABEL', 'Далее');
+define('_JSHOP_YM_PAYMENTS_EMPTY_NAME_ERROR', 'Укажите ФИО плательщика');
+define('_JSHOP_YM_PAYMENTS_INVALID_NAME_ERROR', 'ФИО плательщика должно состоять из фамилии, имени и отчества, разделённых пробелами');
+
+// версия 2.х
+define('_JSHOP_YM_LICENSE','Лицензионный договор:');
+define('_JSHOP_YM_LICENSE_TEXT2',"
Любое использование Вами программы означает полное и безоговорочное принятие Вами условий лицензионного договора, размещенного по адресу https://money.yandex.ru/doc.xml?id=527132 (далее – «Лицензионный договор»). Если Вы не принимаете условия Лицензионного договора в полном объёме, Вы не имеете права использовать программу в каких-либо целях.
");
+define('_JSHOP_YM_TESTMODE_DESCRIPTION', 'Использовать в тестовом режиме?');
+define('_JSHOP_YM_MODE_DESCRIPTION', 'Способ приема платежей:');
+define('_JSHOP_YM_MODE1_DESCRIPTION', 'Яндекс.Денеги');
+define('_JSHOP_YM_MODE2_DESCRIPTION', 'Яндекс.Касса (выбор оплаты на стороне сайта)');
+define('_JSHOP_YM_MODE3_DESCRIPTION', 'Яндекс.Касса (выбор оплаты на стороне Яндекс.Кассы)');
+define('_JSHOP_YM_MODE4_DESCRIPTION', 'Яндекс.Платежка (банковские карты, кошелек)');
+define('_JSHOP_YM_REG_IND', 'Если у вас нет аккаунта в Яндекс-Деньги, то следует зарегистрироваться тут - https://money.yandex.ru/ ВАЖНО! Вам нужно будет указать ссылку для приема HTTP уведомлений здесь - https://sp-money.yandex.ru/myservices/online.xml');
+
+define('_JSHOP_YM_REG_ORG', 'Для работы с модулем необходимо подключить магазин к Яндек.Кассе. После подключения вы получите параметры для приема платежей (идентификатор магазина — shopId и номер витрины — scid).');
+define('_JSHOP_YM_METHODS_DESCRIPTION', 'Укажите необходимые способы оплаты');
+define('_JSHOP_YM_PASSWORD', 'Секретное слово (shopPassword) для обмена сообщениями:');
+define('_JSHOP_YM_SHOPID', 'Идентификатор вашего магазина в Яндекс.Деньгах (ShopID):');
+define('_JSHOP_YM_SCID', 'Идентификатор витрины вашего магазина в Яндекс.Деньгах (scid):');
+define('_JSHOP_YM_PARAM', 'Название параметра');
+define('_JSHOP_YM_VALUE', 'Значение');
+define('_JSHOP_YM_RETURNURL', 'Динамический');
+define('_JSHOP_YM_ACCOUNT_DESCRIPTION', 'Номер кошелька Яндекс:');
+
+define('_JSHOP_YM_PAY', 'Оплатить!');
+define('_JSHOP_YM_TRANSACTION_END', 'Статус заказа для успешных транзакций');
+define('_JSHOP_YM_TEXT_MPOS', 'Страница с инструкцией для платеждей через мобильный терминал!');
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php
new file mode 100644
index 0000000..f1c9683
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/KassaPaymentMethod.php
@@ -0,0 +1,241 @@
+module = $module;
+ $this->shopId = $pmConfig['shop_id'];
+ $this->password = $pmConfig['shop_password'];
+
+ $this->defaultTaxRateId = 1;
+ if (isset($pmConfig['tax_id'])) {
+ if (isset($pmConfig['ya_kassa_tax_'.$pmConfig['tax_id']])) {
+ $this->defaultTaxRateId = $pmConfig['ya_kassa_tax_'.$pmConfig['tax_id']];
+ }
+ }
+
+ $this->taxRates = array();
+ foreach ($pmConfig as $key => $value) {
+ if (strncmp('ya_kassa_tax_', $key, 13) === 0) {
+ $taxRateId = substr($key, 13);
+ $this->taxRates[$taxRateId] = $value;
+ }
+ }
+ }
+
+ public function getShopId()
+ {
+ return $this->shopId;
+ }
+
+ public function getPassword()
+ {
+ return $this->password;
+ }
+
+ public function createPayment($order, $cart, $returnUrl)
+ {
+ try {
+ $builder = CreatePaymentRequest::builder();
+ $builder->setAmount($order->order_total)
+ ->setCapture(false)
+ ->setClientIp($_SERVER['REMOTE_ADDR'])
+ ->setMetadata(array(
+ 'order_id' => $order->order_id,
+ 'cms_name' => 'ya_api_joomshopping',
+ 'module_version' => _JSHOP_YM_VERSION,
+ ));
+
+ $confirmation = array(
+ 'type' => ConfirmationType::REDIRECT,
+ 'returnUrl' => $returnUrl,
+ );
+ $params = unserialize($order->payment_params_data);
+ if (!empty($params['payment_type'])) {
+ $paymentType = $params['payment_type'];
+ if ($paymentType === PaymentMethodType::ALFABANK) {
+ $paymentType = array(
+ 'type' => $paymentType,
+ 'login' => trim($params['alfaLogin']),
+ );
+ $confirmation = ConfirmationType::EXTERNAL;
+ } elseif ($paymentType === PaymentMethodType::QIWI) {
+ $paymentType = array(
+ 'type' => $paymentType,
+ 'phone' => preg_replace('/[^\d]+/', '', $params['qiwiPhone']),
+ );
+ }
+ $builder->setPaymentMethodData($paymentType);
+ }
+ $builder->setConfirmation($confirmation);
+
+ $receipt = null;
+ if (count($cart->products) && isset($pmConfigs['ya_kassa_send_check']) && $pmConfigs['ya_kassa_send_check']) {
+ $this->factoryReceipt($builder, $cart, $order);
+ }
+
+ $request = $builder->build();
+ if ($request->hasReceipt()) {
+ $request->getReceipt()->normalize($request->getAmount());
+ }
+ } catch (\Exception $e) {
+ $this->module->log('error', 'Failed to build request: ' . $e->getMessage());
+ return null;
+ }
+
+ try {
+ $tries = 0;
+ $key = uniqid('', true);
+ do {
+ $payment = $this->getClient()->createPayment($request, $key);
+ if ($payment === null) {
+ $tries++;
+ if ($tries > 3) {
+ break;
+ }
+ sleep(2);
+ }
+ } while ($payment === null);
+ } catch (\Exception $e) {
+ $this->module->log('error', 'Failed to create payment: ' . $e->getMessage());
+ return null;
+ }
+ return $payment;
+ }
+
+ /**
+ * @param PaymentInterface $notificationPayment
+ * @param bool $fetchPayment
+ * @return PaymentInterface|null
+ */
+ public function capturePayment($notificationPayment, $fetchPayment = true)
+ {
+ if ($fetchPayment) {
+ $payment = $this->fetchPayment($notificationPayment->getId());
+ } else {
+ $payment = $notificationPayment;
+ }
+ if ($payment->getStatus() !== PaymentStatus::WAITING_FOR_CAPTURE) {
+ return $payment->getStatus() === PaymentStatus::SUCCEEDED ? $payment : null;
+ }
+
+ try {
+ $builder = CreateCaptureRequest::builder();
+ $builder->setAmount($payment->getAmount());
+ $request = $builder->build();
+ } catch (\Exception $e) {
+ $this->module->log('error', 'Failed to create capture payment: ' . $e->getMessage());
+ return null;
+ }
+
+ try {
+ $tries = 0;
+ $key = uniqid('', true);
+ do {
+ $response = $this->getClient()->capturePayment($request, $payment->getId(), $key);
+ if ($response === null) {
+ $tries++;
+ if ($tries > 3) {
+ break;
+ }
+ sleep(2);
+ }
+ } while ($response === null);
+ } catch (\Exception $e) {
+ $this->module->log('error', 'Failed to capture payment: ' . $e->getMessage());
+ return null;
+ }
+
+ return $response;
+ }
+
+ /**
+ * @param string $paymentId
+ * @return PaymentInterface|null
+ */
+ public function fetchPayment($paymentId)
+ {
+ $payment = null;
+ try {
+ $payment = $this->getClient()->getPaymentInfo($paymentId);
+ } catch (\Exception $e) {
+ $this->module->log('error', 'Failed to fetch payment information from API: ' . $e->getMessage());
+ }
+ return $payment;
+ }
+
+ /**
+ * @param \YaMoney\Request\Payments\CreatePaymentRequestBuilder $builder
+ * @param $cart
+ * @param $order
+ */
+ private function factoryReceipt($builder, $cart, $order)
+ {
+ $shippingModel = \JSFactory::getTable('shippingMethod', 'jshop');
+ $shippingMethods = $shippingModel->getAllShippingMethodsCountry($order->d_country, $order->payment_method_id);
+
+ $builder->setTaxSystemCode($this->defaultTaxRateId);
+ $builder->setReceiptEmail($order->email);
+
+ $shipping = false;
+ foreach ($shippingMethods as $tmp) {
+ if ($tmp->shipping_id == $order->shipping_method_id) {
+ $shipping = $tmp;
+ }
+ }
+
+ foreach ($cart->products as $product) {
+ if (isset($product['tax_id']) && isset($this->taxRates[$product['tax_id']])) {
+ $taxId = $this->taxRates[$product['tax_id']];
+ $builder->addReceiptItem($product['product_name'], $product['price'], $product['quantity'], $taxId);
+ } else {
+ $builder->addReceiptItem($product['product_name'], $product['price'], $product['quantity']);
+ }
+ }
+
+ if ($order->shipping_method_id && $shipping) {
+ if (isset($this->taxRates[$shipping->shipping_tax_id])) {
+ $taxId = $this->taxRates[$shipping->shipping_tax_id];
+ $builder->addReceiptShipping($shipping->name, $shipping->shipping_stand_price, $taxId);
+ } else {
+ $builder->addReceiptShipping($shipping->name, $shipping->shipping_stand_price);
+ }
+ }
+ }
+
+ /**
+ * @return YandexMoneyApi
+ */
+ private function getClient()
+ {
+ if ($this->client === null) {
+ $this->client = new YandexMoneyApi();
+ $this->client->setAuth($this->shopId, $this->password);
+ $this->client->setLogger($this->module);
+ }
+ return $this->client;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php
new file mode 100644
index 0000000..c5e5de4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/Model/OrderModel.php
@@ -0,0 +1,119 @@
+_db = \JFactory::getDbo();
+ }
+
+ public function savePayment($orderId, $payment)
+ {
+ $query = $this->_db->getQuery(true);
+ $query->select('payment_id')
+ ->from('#__ya_money_payments')
+ ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId);
+ $this->_db->setQuery($query);
+ $record = $this->_db->loadRow();
+ if (empty($record)) {
+ $this->insertPayment($orderId, $payment);
+ } else {
+ $this->updatePayment($orderId, $payment);
+ }
+ }
+
+ public function getPaymentIdByOrderId($orderId)
+ {
+ $query = $this->_db->getQuery(true);
+ $query->select('payment_id')
+ ->from('#__ya_money_payments')
+ ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId);
+ $this->_db->setQuery($query);
+ $record = $this->_db->loadRow();
+ if (empty($record)) {
+ return null;
+ }
+ return $record[0];
+ }
+
+ /**
+ * @param int $orderId
+ * @param PaymentInterface $payment
+ */
+ private function insertPayment($orderId, $payment)
+ {
+ $paymentMethodId = '';
+ if ($payment->getPaymentMethod() !== null) {
+ $paymentMethodId = $payment->getPaymentMethod()->getId();
+ }
+
+ $query = $this->_db->getQuery(true);
+ $query->clear()->insert('#__ya_money_payments')
+ ->columns(
+ array(
+ $this->_db->quoteName('order_id'), $this->_db->quoteName('payment_id'),
+ $this->_db->quoteName('status'), $this->_db->quoteName('amount'),
+ $this->_db->quoteName('currency'), $this->_db->quoteName('payment_method_id'),
+ $this->_db->quoteName('paid'), $this->_db->quoteName('created_at')
+ )
+ )
+ ->values(
+ (int)$orderId . ','
+ . $this->_db->quote($payment->getId()) . ","
+ . $this->_db->quote($payment->getStatus()) . ","
+ . $this->_db->quote($payment->getAmount()->getValue()) . ","
+ . $this->_db->quote($payment->getAmount()->getCurrency()) . ","
+ . $this->_db->quote($paymentMethodId) . ","
+ . "'" . ($payment->getPaid() ? 'Y' : 'N') . "',"
+ . $this->_db->quote($payment->getCreatedAt()->format('Y-m-d H:i:s'))
+ );
+ $this->_db->setQuery($query);
+ try {
+ $this->_db->execute();
+ }
+ catch (\JDatabaseExceptionExecuting $e) {
+ \JError::raiseError(500, $e->getMessage());
+ }
+ }
+
+ /**
+ * @param int $orderId
+ * @param PaymentInterface $payment
+ */
+ private function updatePayment($orderId, $payment)
+ {
+ $paymentMethodId = '';
+ if ($payment->getPaymentMethod() !== null) {
+ $paymentMethodId = $payment->getPaymentMethod()->getId();
+ }
+
+ $query = $this->_db->getQuery(true);
+ $query->update('#__ya_money_payments')
+ ->set(
+ $this->_db->quoteName('payment_id') . ' = ' . $this->_db->quoteName('payment_id') . ',' .
+ $this->_db->quoteName('status') . ' = ' . $this->_db->quote($payment->getStatus()) . ',' .
+ $this->_db->quoteName('amount') . ' = ' . $this->_db->quote($payment->getAmount()->getValue()) . ',' .
+ $this->_db->quoteName('currency') . ' = ' . $this->_db->quote($payment->getAmount()->getCurrency()) . ',' .
+ $this->_db->quoteName('payment_method_id') . ' = ' . $this->_db->quote($paymentMethodId) . ',' .
+ $this->_db->quoteName('paid') . ' = \'' . ($payment->getPaid() ? 'Y' : 'N') . '\',' .
+ $this->_db->quoteName('created_at') . ' = ' . $this->_db->quote($payment->getCreatedAt()->format('Y-m-d H:i:s'))
+ )
+ ->where($this->_db->quoteName('order_id') . ' = ' . (int)$orderId);
+ $this->_db->setQuery($query);
+ try {
+ $this->_db->execute();
+ }
+ catch (\JDatabaseExceptionExecuting $e) {
+ \JError::raiseError(500, $e->getMessage());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php
new file mode 100644
index 0000000..b3ca8b2
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/autoload.php
@@ -0,0 +1,36 @@
+ 'application/json',
+ 'Accept' => 'application/json'
+ );
+
+ /**
+ * @var resource
+ */
+ private $curl;
+
+ /**
+ * @var LoggerInterface|null
+ */
+ private $logger;
+
+ /**
+ * @param LoggerInterface|null $logger
+ */
+ public function setLogger($logger)
+ {
+ $this->logger = $logger;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function call($path, $method, $queryParams, $httpBody = null, $headers = array())
+ {
+ if ($this->logger !== null) {
+ $message = 'Send request: ' . $method . ' ' . $path;
+ if (!empty($queryParams)) {
+ $message .= ' with query params: ' . json_encode($queryParams);
+ }
+ if (!empty($httpBody)) {
+ $message .= ' with body: ' . $httpBody;
+ }
+ if (!empty($httpBody)) {
+ $message .= ' with headers: ' . json_encode($headers);
+ }
+ $this->logger->info($message);
+ }
+
+ $url = $this->getUrl() . $path;
+
+ if (!empty($queryParams)) {
+ $url = $url . '?' . http_build_query($queryParams);
+ }
+
+ $headers = $this->prepareHeaders($headers);
+
+ $this->initCurl();
+
+ $this->setCurlOption(CURLOPT_URL, $url);
+
+ $this->setCurlOption(CURLOPT_RETURNTRANSFER, true);
+
+ $this->setCurlOption(CURLOPT_HEADER, true);
+
+ $this->setCurlOption(CURLOPT_BINARYTRANSFER, true);
+
+ if (!$this->shopId || !$this->shopPassword) {
+ throw new AuthorizeException('shopId or shopPassword not set');
+ } else {
+ $this->setCurlOption(CURLOPT_USERPWD, "{$this->shopId}:{$this->shopPassword}");
+ }
+
+ $this->setBody($method, $httpBody);
+
+ $this->setCurlOption(CURLOPT_HTTPHEADER, $headers);
+
+ $this->setCurlOption(CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout);
+
+ $this->setCurlOption(CURLOPT_TIMEOUT, $this->timeout);
+
+ list($httpHeaders, $httpBody, $responseInfo) = $this->sendRequest();
+
+ if (!$this->keepAlive) {
+ $this->closeCurlConnection();
+ }
+
+ if ($this->logger !== null) {
+ $message = 'Response with code ' . $responseInfo['http_code'] . ' received with headers: '
+ . json_encode($httpHeaders);
+ if (!empty($httpBody)) {
+ $message .= ' and body: ' . $httpBody;
+ }
+ $this->logger->info($message);
+ }
+
+ return new ResponseObject(array(
+ 'code' => $responseInfo['http_code'],
+ 'headers' => $httpHeaders,
+ 'body' => $httpBody
+ ));
+ }
+
+ /**
+ * @param $optionName
+ * @param $optionValue
+ * @return bool
+ */
+ public function setCurlOption($optionName, $optionValue)
+ {
+ return curl_setopt($this->curl, $optionName, $optionValue);
+ }
+
+
+ /**
+ * @return resource
+ */
+ private function initCurl()
+ {
+ if (!$this->curl || !$this->keepAlive) {
+ $this->curl = curl_init();
+ }
+
+ return $this->curl;
+ }
+
+ /**
+ * Close connection
+ */
+ public function closeCurlConnection()
+ {
+ if ($this->curl !== null) {
+ curl_close($this->curl);
+ }
+ }
+
+ /**
+ * @return array
+ */
+ public function sendRequest()
+ {
+ $response = curl_exec($this->curl);
+ $httpHeaderSize = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
+ $httpHeaders = RawHeadersParser::parse(substr($response, 0, $httpHeaderSize));
+ $httpBody = substr($response, $httpHeaderSize);
+ $responseInfo = curl_getinfo($this->curl);
+ $curlError = curl_error($this->curl);
+ $curlErrno = curl_errno($this->curl);
+ if ($response === false) {
+ $this->handleCurlError($curlError, $curlErrno);
+ }
+
+ return array($httpHeaders, $httpBody, $responseInfo);
+ }
+
+ /**
+ * @param $method
+ * @param $httpBody
+ * @throws ApiException
+ */
+ public function setBody($method, $httpBody)
+ {
+ switch ($method) {
+ case HttpVerb::POST:
+ $this->setCurlOption(CURLOPT_POST, true);
+ $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
+ break;
+ case HttpVerb::PUT:
+ $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "PUT");
+ $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
+ break;
+ case HttpVerb::DELETE:
+ $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "DELETE");
+ $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
+ break;
+ case HttpVerb::PATCH:
+ $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "PATCH");
+ $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
+ break;
+ case HttpVerb::OPTIONS:
+ $this->setCurlOption(CURLOPT_CUSTOMREQUEST, "OPTIONS");
+ $this->setCurlOption(CURLOPT_POSTFIELDS, $httpBody);
+ break;
+ case HttpVerb::HEAD:
+ $this->setCurlOption(CURLOPT_NOBODY, true);
+ break;
+ case HttpVerb::GET:
+ break;
+ default:
+ throw new ApiException('Invalid method verb: ' . $method);
+ }
+ }
+
+ /**
+ * @param mixed $shopId
+ * @return CurlClient
+ */
+ public function setShopId($shopId)
+ {
+ $this->shopId = $shopId;
+ return $this;
+ }
+
+ /**
+ * @param mixed $shopPassword
+ * @return CurlClient
+ */
+ public function setShopPassword($shopPassword)
+ {
+ $this->shopPassword = $shopPassword;
+ return $this;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getTimeout()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * @param mixed $timeout
+ */
+ public function setTimeout($timeout)
+ {
+ $this->timeout = $timeout;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getConnectionTimeout()
+ {
+ return $this->connectionTimeout;
+ }
+
+ /**
+ * @param mixed $connectionTimeout
+ */
+ public function setConnectionTimeout($connectionTimeout)
+ {
+ $this->connectionTimeout = $connectionTimeout;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * @param mixed $config
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param string $error
+ * @param int $errno
+ * @throws ApiConnectionException
+ */
+ private function handleCurlError($error, $errno)
+ {
+ switch ($errno) {
+ case CURLE_COULDNT_CONNECT:
+ case CURLE_COULDNT_RESOLVE_HOST:
+ case CURLE_OPERATION_TIMEOUTED:
+ $msg = "Could not connect to Yandex Money API. Please check your internet connection and try again.";
+ break;
+ case CURLE_SSL_CACERT:
+ case CURLE_SSL_PEER_CERTIFICATE:
+ $msg = "Could not verify SSL certificate.";
+ break;
+ default:
+ $msg = "Unexpected error communicating.";
+ }
+ $msg .= "\n\n(Network error [errno $errno]: $error)";
+ throw new ApiConnectionException($msg);
+ }
+
+ /**
+ * @return mixed
+ */
+ private function getUrl()
+ {
+ $config = $this->config;
+ return $config['url'];
+ }
+
+ /**
+ * @param bool $keepAlive
+ * @return CurlClient
+ */
+ public function setKeepAlive($keepAlive)
+ {
+ $this->keepAlive = $keepAlive;
+ return $this;
+ }
+
+ /**
+ * @param $headers
+ * @return array
+ */
+ private function prepareHeaders($headers)
+ {
+ $headers = array_merge($this->defaultHeaders, $headers);
+ $headers = array_map(function ($key, $value) {
+ return $key . ":" . $value;
+ }, array_keys($headers), $headers);
+
+ return $headers;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php
new file mode 100644
index 0000000..f2871e4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/StreamClient.php
@@ -0,0 +1,280 @@
+logger = $logger;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function call($path, $method, $queryParams, $httpBody = null, $headers = array())
+ {
+ if ($this->logger !== null) {
+ $message = 'Send request: ' . $method . ' ' . $path;
+ if (!empty($queryParams)) {
+ $message .= ' with query params: ' . json_encode($queryParams);
+ }
+ if (!empty($httpBody)) {
+ $message .= ' with body: ' . $httpBody;
+ }
+ if (!empty($httpBody)) {
+ $message .= ' with headers: ' . json_encode($headers);
+ }
+ $this->logger->info($message);
+ }
+
+ $url = $this->getUrl() . $path;
+
+ $options = array(
+ 'http' => array(
+ 'method' => $method,
+ 'header' => $this->prepareHeaders($headers),
+ 'content' => $httpBody,
+ 'timeout' => $this->timeout,
+ 'ignore_errors' => true
+ ),
+ 'ssl' => array(
+ 'verify_peer' => true,
+ 'verify_peer_name' => true,
+ ),
+ );
+
+ $this->initStream($options);
+ if ($this->sendRequest($url)) {
+ $httpHeaders = array_map(function ($header) {
+ return explode(':', $header);
+ }, $this->responseHeaders);
+ $httpBody = $this->responseBody;
+
+ if ($this->logger !== null) {
+ $message = 'Response with code 200 received with headers: '
+ . json_encode($httpHeaders);
+ if (!empty($httpBody)) {
+ $message .= ' and body: ' . $httpBody;
+ }
+ $this->logger->info($message);
+ }
+
+ return new ResponseObject(array(
+ 'headers' => $httpHeaders,
+ 'body' => $httpBody
+ ));
+ } else {
+ throw new ApiConnectionException('Stream returned an empty response', 660);
+ }
+ }
+
+ /**
+ * @param $url
+ * @return bool
+ */
+ public function sendRequest($url)
+ {
+ $response = $this->fileGetContents($url);
+ $this->setData($response);
+ return (bool)$response;
+ }
+
+ /**
+ * @param array $headers
+ * @return string
+ */
+ public function prepareHeaders($headers)
+ {
+ $headers = array_merge($this->getDefaultHeaders(), $headers);
+
+ $headersPrepared = array_map(function ($key, $value) {
+ return $key . ":" . $value;
+ }, array_keys($headers), $headers);
+
+ return implode("\r\n", $headersPrepared);
+ }
+
+ /**
+ * @return array
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * @param array $config
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param array $options
+ */
+ public function initStream($options)
+ {
+ $this->stream = stream_context_create($options);
+ }
+
+ /**
+ * @param $url
+ * @return bool|string
+ */
+ private function fileGetContents($url)
+ {
+ $fp = fopen($url, 'rb', false, $this->stream);
+ $metadata = stream_get_meta_data($fp);
+ $response = stream_get_contents($fp);
+ return $response;
+ }
+
+ /**
+ * @param $response
+ */
+ private function setData($response)
+ {
+ $this->responseBody = $response;
+ $this->responseHeaders = $http_response_header ?: array();
+ }
+
+ /**
+ * @return string
+ */
+ private function getUrl()
+ {
+ $config = $this->config;
+ return $config['url'];
+ }
+
+ /**
+ * @return string
+ */
+ public function getShopId()
+ {
+ return $this->shopId;
+ }
+
+ /**
+ * @param string $shopId
+ * @return $this
+ */
+ public function setShopId($shopId)
+ {
+ $this->shopId = $shopId;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getShopPassword()
+ {
+ return $this->shopPassword;
+ }
+
+ /**
+ * @param string $shopPassword
+ * @return $this
+ */
+ public function setShopPassword($shopPassword)
+ {
+ $this->shopPassword = $shopPassword;
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ private function getDefaultHeaders()
+ {
+ return array(
+ 'Authorization' => $this->generateAuth(),
+ 'Content-Type' => 'application/json',
+ 'Accept' => 'application/json'
+ );
+ }
+
+ /**
+ * @return string
+ * @throws AuthorizeException
+ */
+ private function generateAuth()
+ {
+ if (!$this->shopId || !$this->shopPassword) {
+ throw new AuthorizeException('shopId or shopPassword not set');
+ }
+ return 'Basic ' . base64_encode($this->shopId . $this->shopPassword);
+ }
+
+ /**
+ * @return int
+ */
+ public function getTimeout()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * @param int $timeout
+ */
+ public function setTimeout($timeout)
+ {
+ $this->timeout = $timeout;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php
new file mode 100644
index 0000000..170d453
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Client/YandexMoneyApi.php
@@ -0,0 +1,487 @@
+load()->getConfig();
+ $this->setConfig($config);
+ $apiClient->setConfig($config);
+ }
+
+ $this->apiClient = $apiClient;
+ }
+
+ /**
+ * @param $login
+ * @param $password
+ * @return YandexMoneyApi $this
+ */
+ public function setAuth($login, $password)
+ {
+ $this->login = $login;
+ $this->password = $password;
+
+ $this->apiClient
+ ->setShopId($this->login)
+ ->setShopPassword($this->password);
+
+ return $this;
+ }
+
+ /**
+ * @return ApiClientInterface
+ */
+ public function getApiClient()
+ {
+ return $this->apiClient;
+ }
+
+ /**
+ * @param ApiClientInterface $apiClient
+ *
+ * @return YandexMoneyApi
+ */
+ public function setApiClient(ApiClientInterface $apiClient)
+ {
+ $this->apiClient = $apiClient;
+ $this->apiClient->setConfig($this->config);
+ $this->apiClient->setLogger($this->logger);
+
+ return $this;
+ }
+
+ /**
+ * Устанавливает логгер приложения
+ * @param null|callable|object|LoggerInterface $value Инстанс логгера
+ */
+ public function setLogger($value)
+ {
+ if ($value === null || $value instanceof LoggerInterface) {
+ $this->logger = $value;
+ } else {
+ $this->logger = new LoggerWrapper($value);
+ }
+ if ($this->apiClient !== null) {
+ $this->apiClient->setLogger($this->logger);
+ }
+ }
+
+ /**
+ * Доступные способы оплаты.
+ * Используйте этот метод, чтобы получить способы оплаты и сценарии, доступные для вашего заказа.
+ * @param PaymentOptionsRequestInterface $paymentOptionsRequest
+ * @return PaymentOptionsResponse
+ */
+ public function getPaymentOptions(PaymentOptionsRequestInterface $paymentOptionsRequest = null)
+ {
+ $path = "/payment_options";
+
+ if ($paymentOptionsRequest === null) {
+ $queryParams = array();
+ } else {
+ $serializer = new PaymentOptionsRequestSerializer();
+ $serializedData = $serializer->serialize($paymentOptionsRequest);
+ $queryParams = $serializedData;
+ }
+
+ $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams);
+
+ $result = null;
+ if ($response->getCode() == 200) {
+ $responseArray = json_decode($response->getBody(), true);
+ $result = new PaymentOptionsResponse($responseArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * Получить список платежей магазина.
+ * @param PaymentsRequestInterface $payments
+ * @return PaymentsResponse
+ */
+ public function getPayments(PaymentsRequestInterface $payments = null)
+ {
+ $path = '/payments';
+
+ if ($payments) {
+ $serializer = new PaymentsRequestSerializer();
+ $serializedData = $serializer->serialize($payments);
+ $queryParams = $serializedData;
+ } else {
+ $queryParams = array();
+ }
+
+ $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams);
+ $paymentResponse = null;
+ if ($response->getCode() == 200) {
+ $responseArray = json_decode($response->getBody(), true);
+ $paymentResponse = new PaymentsResponse($responseArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $paymentResponse;
+ }
+
+ /**
+ * Проведение оплаты.
+ *
+ * @param CreatePaymentRequestInterface $payment
+ * @param null $idempotencyKey
+ *
+ * @return CreatePaymentResponse
+ * @throws BadApiRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerError
+ * @throws UnauthorizedException
+ */
+ public function createPayment(CreatePaymentRequestInterface $payment, $idempotencyKey = null)
+ {
+ $path = '/payments';
+
+ $headers = array();
+
+ if ($idempotencyKey) {
+ $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
+ }
+
+ $serializer = new CreatePaymentRequestSerializer();
+ $serializedData = $serializer->serialize($payment);
+ $httpBody = $this->encodeData($serializedData);
+
+ $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers);
+ $paymentResponse = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $paymentResponse = new CreatePaymentResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $paymentResponse;
+ }
+
+ /**
+ * Получить информацию о платеже
+ * @param $paymentId
+ * @return PaymentResponse
+ */
+ public function getPaymentInfo($paymentId)
+ {
+ if ($paymentId === null) {
+ throw new \InvalidArgumentException('Missing the required parameter $paymentId');
+ }
+
+ $path = '/payments/' . $paymentId;
+
+ $response = $this->apiClient->call($path, HttpVerb::GET, null);
+ $result = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $result = new PaymentResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * Подтвердить оплату.
+ * @param CreateCaptureRequestInterface $captureRequest
+ * @param $paymentId
+ * @param null $idempotencyKey
+ * @return CreateCaptureResponse
+ */
+ public function capturePayment(CreateCaptureRequestInterface $captureRequest, $paymentId, $idempotencyKey = null)
+ {
+ if ($paymentId === null) {
+ throw new \InvalidArgumentException('Missing the required parameter $paymentId');
+ }
+
+ $path = '/payments/' . $paymentId . '/capture';
+
+ $headers = array();
+
+ if ($idempotencyKey) {
+ $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
+ }
+
+ $serializer = new CreateCaptureRequestSerializer();
+ $serializedData = $serializer->serialize($captureRequest);
+ $httpBody = $this->encodeData($serializedData);
+ $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers);
+
+ $result = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $result = new CreateCaptureResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * Отменить незавершенную оплату заказа.
+ * @param $paymentId
+ * @param null $idempotencyKey
+ * @return CancelResponse
+ */
+ public function cancelPayment($paymentId, $idempotencyKey = null)
+ {
+ if ($paymentId === null) {
+ throw new \InvalidArgumentException('Missing the required parameter $paymentId');
+ }
+
+ $path = '/payments/' . $paymentId . '/cancel';
+
+ $headers = array();
+
+ if ($idempotencyKey) {
+ $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
+ }
+
+ $response = $this->apiClient->call($path, HttpVerb::POST, null, null, $headers);
+
+ $result = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $result = new CancelResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * Получить список возвратов платежей
+ * @param RefundsRequestInterface $refundsRequest
+ * @return RefundsResponse
+ */
+ public function getRefunds(RefundsRequestInterface $refundsRequest = null)
+ {
+ $path = '/refunds';
+
+ if ($refundsRequest) {
+ $serializer = new RefundsRequestSerializer();
+ $serializedData = $serializer->serialize($refundsRequest);
+
+ $queryParams = $serializedData;
+ } else {
+ $queryParams = array();
+ }
+
+ $response = $this->apiClient->call($path, HttpVerb::GET, $queryParams);
+ $refundsResponse = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $refundsResponse = new RefundsResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $refundsResponse;
+ }
+
+ /**
+ * Проведение возврата платежа
+ * @param CreateRefundRequestInterface $refundsRequest
+ * @param null $idempotencyKey
+ * @return CreateRefundResponse
+ */
+ public function createRefund(CreateRefundRequestInterface $refundsRequest, $idempotencyKey = null)
+ {
+ $path = '/refunds';
+
+ $headers = array();
+
+ if ($idempotencyKey) {
+ $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotencyKey;
+ }
+
+ $serializer = new CreateRefundRequestSerializer();
+ $serializedData = $serializer->serialize($refundsRequest);
+ $httpBody = $this->encodeData($serializedData);
+ $response = $this->apiClient->call($path, HttpVerb::POST, null, $httpBody, $headers);
+
+ $result = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $result = new CreateRefundResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * Получить информацию о возврате
+ * @param $refundId
+ * @return RefundResponse
+ */
+ public function getRefundInfo($refundId)
+ {
+ if ($refundId === null) {
+ throw new \InvalidArgumentException('Missing the required parameter $refundId');
+ }
+
+ $path = '/refunds/' . $refundId;
+ $response = $this->apiClient->call($path, HttpVerb::GET, null);
+
+ $result = null;
+ if ($response->getCode() == 200) {
+ $resultArray = json_decode($response->getBody(), true);
+ $result = new RefundResponse($resultArray);
+ } else {
+ $this->handleError($response);
+ }
+ return $result;
+ }
+
+ /**
+ * @return array
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * @param array $config
+ */
+ public function setConfig($config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param $serializedData
+ * @return string
+ * @throws \Exception
+ */
+ private function encodeData($serializedData)
+ {
+ $result = json_encode($serializedData);
+ if ($result === false) {
+ $errorCode = json_last_error();
+ throw new JsonException("Failed serialize json.", $errorCode);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param ResponseObject $response
+ * @throws BadApiRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerError
+ * @throws UnauthorizedException
+ * @throws ApiException
+ */
+ private function handleError(ResponseObject $response)
+ {
+ switch ($response->getCode()) {
+ case BadApiRequestException::HTTP_CODE:
+ throw new BadApiRequestException($response->getHeaders(), $response->getBody());
+ break;
+ case ForbiddenException::HTTP_CODE:
+ throw new ForbiddenException($response->getHeaders(), $response->getBody());
+ break;
+ case UnauthorizedException::HTTP_CODE:
+ throw new UnauthorizedException($response->getHeaders(), $response->getBody());
+ break;
+ case InternalServerError::HTTP_CODE:
+ throw new InternalServerError($response->getHeaders(), $response->getBody());
+ break;
+ case NotFoundException::HTTP_CODE:
+ throw new NotFoundException($response->getHeaders(), $response->getBody());
+ break;
+ default:
+ if ($response->getCode() > 399) {
+ throw new ApiException(
+ 'Unexpected response error code',
+ $response->getCode(),
+ $response->getHeaders(),
+ $response->getBody()
+ );
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php
new file mode 100644
index 0000000..9b68071
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractEnum.php
@@ -0,0 +1,50 @@
+ $enabled) {
+ if ($enabled) {
+ $result[] = $key;
+ }
+ }
+ return $result;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php
new file mode 100644
index 0000000..39c2681
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractObject.php
@@ -0,0 +1,120 @@
+unknownProperties);
+ }
+
+ /**
+ * Возвращает значение свойства
+ * @param string $offset Имя свойства
+ * @return mixed Значение свойства
+ */
+ public function offsetGet($offset)
+ {
+ $method = 'get' . ucfirst($offset);
+ if (method_exists($this, $method)) {
+ return $this->{$method} ();
+ }
+ return array_key_exists($offset, $this->unknownProperties) ? $this->unknownProperties[$offset] : null;
+ }
+
+ /**
+ * Устанавливает значение свойства
+ * @param string $offset Имя свойства
+ * @param mixed $value Значение свойства
+ */
+ public function offsetSet($offset, $value)
+ {
+ $method = 'set' . ucfirst($offset);
+ if (method_exists($this, $method)) {
+ $this->{$method} ($value);
+ } else {
+ $this->unknownProperties[$offset] = $value;
+ }
+ }
+
+ /**
+ * Удаляет свойство
+ * @param string $offset Имя удаляемого свойства
+ */
+ public function offsetUnset($offset)
+ {
+ $method = 'set' . ucfirst($offset);
+ if (method_exists($this, $method)) {
+ $this->{$method} (null);
+ } else {
+ unset($this->unknownProperties[$offset]);
+ }
+ }
+
+ /**
+ * Возвращает значение свойства
+ * @param string $propertyName Имя свойства
+ * @return mixed Значение свойства
+ */
+ public function __get($propertyName)
+ {
+ return $this->offsetGet($propertyName);
+ }
+
+ /**
+ * Устанавливает значение свойства
+ * @param string $propertyName Имя свойства
+ * @param mixed $value Значение свойства
+ */
+ public function __set($propertyName, $value)
+ {
+ $this->offsetSet($propertyName, $value);
+ }
+
+ /**
+ * Проверяет наличие свойства
+ * @param string $propertyName Имя проверяемого свойства
+ * @return bool True если свойство имеется, false если нет
+ */
+ public function __isset($propertyName)
+ {
+ return $this->offsetExists($propertyName);
+ }
+
+ /**
+ * Удаляет свойство
+ * @param string $propertyName Имя удаляемого свойства
+ */
+ public function __unset($propertyName)
+ {
+ $this->offsetUnset($propertyName);
+ }
+
+ /**
+ * @return array
+ */
+ protected function getUnknownProperties()
+ {
+ return $this->unknownProperties;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php
new file mode 100644
index 0000000..7582de8
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequest.php
@@ -0,0 +1,48 @@
+_validationError = null;
+ }
+
+ /**
+ * Устанавливает ошибку валидации
+ * @param string $value Ошибка, произошедшая при валидации объекта
+ */
+ protected function setValidationError($value)
+ {
+ $this->_validationError = $value;
+ }
+
+ /**
+ * Возвращает последнюю ошибку валидации
+ * @return string Последняя произошедшая ошибка валидации
+ */
+ public function getLastValidationError()
+ {
+ return $this->_validationError;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php
new file mode 100644
index 0000000..7c06f2d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/AbstractRequestBuilder.php
@@ -0,0 +1,88 @@
+currentObject = $this->initCurrentObject();
+ }
+
+ /**
+ * Инициализирует пустой запрос
+ * @return AbstractRequest Инстанс запроса который будем собирать
+ */
+ abstract protected function initCurrentObject();
+
+ /**
+ * Строит запрос, валидирует его и возвращает, если все прошло нормально
+ * @param array $options Массив свойств запроса, если нужно их установить перед сборкой
+ * @return AbstractRequest Инстанс собранного запроса
+ *
+ * @throws InvalidRequestException Выбрасывается если при валидации запроса произошла ошибка
+ * @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданныч в
+ * массиве настроек
+ */
+ public function build(array $options = null)
+ {
+ if (!empty($options)) {
+ $this->setOptions($options);
+ }
+ try {
+ $this->currentObject->clearValidationError();
+ if (!$this->currentObject->validate()) {
+ throw new InvalidRequestException($this->currentObject);
+ }
+ } catch (InvalidRequestException $e) {
+ throw $e;
+ } catch (\Exception $e) {
+ throw new InvalidRequestException($this->currentObject, 0, $e);
+ }
+ $result = $this->currentObject;
+ $this->currentObject = $this->initCurrentObject();
+ return $result;
+ }
+
+ /**
+ * Устанавливает свойства запроса из массива
+ * @param array|\Traversable $options Массив свойств запроса
+ * @return AbstractRequestBuilder Инстанс текущего билдера запросов
+ *
+ * @throws \InvalidArgumentException Выбрасывается если аргумент не массив и не итерируемый объект
+ * @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданныч
+ * в массиве настроек
+ */
+ public function setOptions($options)
+ {
+ if (empty($options)) {
+ return $this;
+ }
+ if (!is_array($options) && !($options instanceof \Traversable)) {
+ throw new \InvalidArgumentException('Invalid options value in setOptions method');
+ }
+ foreach ($options as $property => $value) {
+ $method = 'set' . ucfirst($property);
+ if (method_exists($this, $method)) {
+ $this->{$method} ($value);
+ }
+ }
+ return $this;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php
new file mode 100644
index 0000000..e3d360a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/ApiConnectionException.php
@@ -0,0 +1,10 @@
+responseHeaders = $responseHeaders;
+ $this->responseBody = $responseBody;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getResponseHeaders()
+ {
+ return $this->responseHeaders;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getResponseBody()
+ {
+ return $this->responseBody;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php
new file mode 100644
index 0000000..3f501af
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/AuthorizeException.php
@@ -0,0 +1,9 @@
+retryAfter = $errorData['retry_after'];
+ }
+
+ if (isset($errorData['type'])) {
+ $this->retryAfter = $errorData['type'];
+ }
+
+ parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php
new file mode 100644
index 0000000..f310c35
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/EmptyPropertyValueException.php
@@ -0,0 +1,17 @@
+retryAfter = $errorData['retry_after'];
+ }
+
+ if (isset($errorData['type'])) {
+ $this->type = $errorData['type'];
+ }
+
+ parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php
new file mode 100644
index 0000000..2bd1f8a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InternalServerError.php
@@ -0,0 +1,41 @@
+retryAfter = $errorData['retry_after'];
+ }
+
+ if (isset($errorData['type'])) {
+ $this->type = $errorData['type'];
+ }
+
+ parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php
new file mode 100644
index 0000000..56b51d9
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyException.php
@@ -0,0 +1,31 @@
+propertyName = (string)$property;
+ }
+
+ /**
+ * @return string
+ */
+ public function getProperty()
+ {
+ return $this->propertyName;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php
new file mode 100644
index 0000000..4ae6bbe
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueException.php
@@ -0,0 +1,34 @@
+invalidValue = $value;
+ }
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->invalidValue;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php
new file mode 100644
index 0000000..d083c0d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidPropertyValueTypeException.php
@@ -0,0 +1,38 @@
+type = 'null';
+ } elseif (is_object($value)) {
+ $this->type = get_class($value);
+ } else {
+ $this->type = gettype($value);
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php
new file mode 100644
index 0000000..5ce802a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/InvalidRequestException.php
@@ -0,0 +1,38 @@
+getLastValidationError().'"';
+ $this->errorRequest = $error;
+ } else {
+ $message = $error;
+ }
+ parent::__construct($message, $code, $previous);
+ }
+
+ /**
+ * @return AbstractRequest|null
+ */
+ public function getRequestObject()
+ {
+ return $this->errorRequest;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php
new file mode 100644
index 0000000..8a266e7
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/JsonException.php
@@ -0,0 +1,24 @@
+ 'No error',
+ JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
+ JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
+ JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
+ JSON_ERROR_SYNTAX => 'Syntax error',
+ JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
+ );
+
+ public function __construct($message = "", $code = 0, \Throwable $previous = null)
+ {
+ $errorMsg = isset(self::$errorLabels[$code]) ? self::$errorLabels[$code] : 'Unknown error';
+ $message = sprintf('%s %s', $message, $errorMsg);
+ parent::__construct($message, $code, $previous);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php
new file mode 100644
index 0000000..e8d052c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/NotFoundException.php
@@ -0,0 +1,42 @@
+retryAfter = $errorData['retry_after'];
+ }
+
+ if (isset($errorData['type'])) {
+ $this->type = $errorData['type'];
+ }
+
+ parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php
new file mode 100644
index 0000000..4defc17
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/Exceptions/TechnicalError.php
@@ -0,0 +1,16 @@
+retryAfter = $errorData['retry_after'];
+ }
+
+ if (isset($errorData['type'])) {
+ $this->type = $errorData['type'];
+ }
+
+ parent::__construct($message, self::HTTP_CODE, $responseHeaders, $responseBody);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php
new file mode 100644
index 0000000..b1228ba
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/HttpVerb.php
@@ -0,0 +1,26 @@
+ true,
+ 'POST' => true,
+ 'PATCH' => true,
+ 'HEAD' => true,
+ 'OPTIONS' => true,
+ 'PUT' => true,
+ 'DELETE' => true
+ );
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php
new file mode 100644
index 0000000..87731cd
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/LoggerWrapper.php
@@ -0,0 +1,168 @@
+loggerInstance = $wrapped;
+ } elseif (is_callable($wrapped)) {
+ $this->loggerCallback = $wrapped;
+ } else {
+ throw new InvalidArgumentException('Invalid wrapped logger');
+ }
+ }
+
+ /**
+ * System is unusable.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function emergency($message, array $context = array())
+ {
+ $this->log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function log($level, $message, array $context = array())
+ {
+ if ($this->loggerInstance !== null) {
+ $this->loggerInstance->log($level, $message, $context);
+ } elseif ($this->loggerCallback !== null) {
+ call_user_func_array($this->loggerCallback, array($level, $message, $context));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php
new file mode 100644
index 0000000..68bf80f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Common/RequestObjectInterface.php
@@ -0,0 +1,9 @@
+headers = $config['headers'];
+ }
+
+ if (isset($config['body'])) {
+ $this->body = $config['body'];
+ }
+
+ if (isset($config['code'])) {
+ $this->code = $config['code'];
+ }
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getHeaders()
+ {
+ return $this->headers;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getBody()
+ {
+ return $this->body;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getCode()
+ {
+ return $this->code;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php
new file mode 100644
index 0000000..bb60e43
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoader.php
@@ -0,0 +1,28 @@
+configParams = $paramsArray;
+
+ return $this;
+ }
+
+ public function getConfig()
+ {
+ return $this->configParams;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php
new file mode 100644
index 0000000..8f922e0
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/Config/ConfigurationLoaderInterface.php
@@ -0,0 +1,8 @@
+value = (string)$value;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->value;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php
new file mode 100644
index 0000000..c5cb556
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Helpers/TypeCast.php
@@ -0,0 +1,88 @@
+= 0;
+ } elseif (is_string($value)) {
+ return $value !== '';
+ } elseif (is_object($value)) {
+ return method_exists($value, '__toString') && ((string)$value) !== '';
+ }
+ return false;
+ }
+
+ /**
+ * @param string|int|\DateTime $value
+ * @return \DateTime|null
+ */
+ public static function castToDateTime($value)
+ {
+ if ($value instanceof \DateTime) {
+ return clone $value;
+ }
+ if (is_numeric($value)) {
+ $date = new \DateTime();
+ $date->setTimestamp((int)$value);
+ } elseif (is_string($value) || (is_object($value) && method_exists($value, '__toString'))) {
+ $date = date_create((string)$value);
+ if ($date === false) {
+ $date = null;
+ }
+ } else {
+ $date = null;
+ }
+ return $date;
+ }
+
+ /**
+ * @param mixed $value
+ * @return bool
+ */
+ public static function canCastToBoolean($value)
+ {
+ if (is_numeric($value) || is_bool($value)) {
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php
new file mode 100644
index 0000000..907b9e4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/AmountInterface.php
@@ -0,0 +1,32 @@
+_type;
+ }
+
+ /**
+ * @param string $value
+ */
+ protected function _setType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty value for "type" parameter in Confirmation', 0, 'confirmation.type'
+ );
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (ConfirmationType::valueExists($value)) {
+ $this->_type = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in Confirmation', 0, 'confirmation.type', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "type" parameter in Confirmation', 0, 'confirmation.type', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php
new file mode 100644
index 0000000..e7be14e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationCodeVerification.php
@@ -0,0 +1,18 @@
+_setType(ConfirmationType::CODE_VERIFICATION);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php
new file mode 100644
index 0000000..1ce066e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationDeepLink.php
@@ -0,0 +1,18 @@
+_setType(ConfirmationType::DEEPLINK);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php
new file mode 100644
index 0000000..e3b7a73
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationExternal.php
@@ -0,0 +1,19 @@
+_setType(ConfirmationType::EXTERNAL);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php
new file mode 100644
index 0000000..0a3923f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationFactory.php
@@ -0,0 +1,62 @@
+ 'ConfirmationCodeVerification',
+ ConfirmationType::DEEPLINK => 'ConfirmationDeepLink',
+ ConfirmationType::EXTERNAL => 'ConfirmationExternal',
+ ConfirmationType::REDIRECT => 'ConfirmationRedirect',
+ );
+
+ /**
+ * @param string $type
+ * @return AbstractConfirmation
+ */
+ public function factory($type)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException('Invalid confirmation value in confirmation factory');
+ }
+ if (!array_key_exists($type, $this->typeClassMap)) {
+ throw new \InvalidArgumentException('Invalid confirmation value type "'.$type.'"');
+ }
+ $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type];
+ return new $className();
+ }
+
+ /**
+ * @param array $data
+ * @param string|null $type
+ * @return AbstractConfirmation
+ */
+ public function factoryFromArray(array $data, $type = null)
+ {
+ if ($type === null) {
+ if (array_key_exists('type', $data)) {
+ $type = $data['type'];
+ unset($data['type']);
+ } else {
+ throw new \InvalidArgumentException(
+ 'Parameter type not specified in ConfirmationFactory.factoryFromArray()'
+ );
+ }
+ }
+ $confirmation = $this->factory($type);
+ foreach ($data as $key => $value) {
+ if ($confirmation->offsetExists($key)) {
+ $confirmation->offsetSet($key, $value);
+ }
+ }
+ return $confirmation;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php
new file mode 100644
index 0000000..b30a186
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Confirmation/ConfirmationRedirect.php
@@ -0,0 +1,116 @@
+_setType(ConfirmationType::REDIRECT);
+ }
+
+ /**
+ * @return bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
+ * оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
+ */
+ public function getEnforce()
+ {
+ return $this->_enforce;
+ }
+
+ /**
+ * @param bool $value Требование принудительного подтверждения платежа покупателем, требование 3-D Secure
+ * для оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
+ */
+ public function setEnforce($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_enforce = null;
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_enforce = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid enforce value type', 0, 'confirmationRedirect.enforce', $value
+ );
+ }
+ }
+
+ /**
+ * @return string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
+ */
+ public function getReturnUrl()
+ {
+ return $this->_returnUrl;
+ }
+
+ /**
+ * @param string $value URL на который вернется плательщик после подтверждения или отмены платежа на
+ * странице партнера.
+ */
+ public function setReturnUrl($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_returnUrl = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_returnUrl = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid returnUrl value type', 0, 'confirmationRedirect.returnUrl', $value
+ );
+ }
+ }
+
+ /**
+ * @return string URL на который необходимо перенаправить плательщика для подтверждения оплаты.
+ */
+ public function getConfirmationUrl()
+ {
+ return $this->_confirmationUrl;
+ }
+
+ /**
+ * @param string $value URL на который необходимо перенаправить плательщика для подтверждения оплаты.
+ */
+ public function setConfirmationUrl($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_confirmationUrl = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_confirmationUrl = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid confirmationUrl value type', 0, 'confirmationRedirect.confirmationUrl', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php
new file mode 100644
index 0000000..a3893b5
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/AbstractConfirmationAttributes.php
@@ -0,0 +1,55 @@
+_type;
+ }
+
+ /**
+ * @param string $value
+ */
+ protected function _setType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty value for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type'
+ );
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (ConfirmationType::valueExists($value)) {
+ $this->_type = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "type" parameter in ConfirmationAttributes', 0, 'confirmationAttributes.type', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php
new file mode 100644
index 0000000..63760a4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesCodeVerification.php
@@ -0,0 +1,18 @@
+_setType(ConfirmationType::CODE_VERIFICATION);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php
new file mode 100644
index 0000000..43203d4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesDeepLink.php
@@ -0,0 +1,18 @@
+_setType(ConfirmationType::DEEPLINK);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php
new file mode 100644
index 0000000..91017d0
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesExternal.php
@@ -0,0 +1,18 @@
+_setType(ConfirmationType::EXTERNAL);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php
new file mode 100644
index 0000000..31b5ecb
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesFactory.php
@@ -0,0 +1,62 @@
+ 'ConfirmationAttributesCodeVerification',
+ ConfirmationType::DEEPLINK => 'ConfirmationAttributesDeepLink',
+ ConfirmationType::EXTERNAL => 'ConfirmationAttributesExternal',
+ ConfirmationType::REDIRECT => 'ConfirmationAttributesRedirect',
+ );
+
+ /**
+ * @param string $type
+ * @return AbstractConfirmationAttributes
+ */
+ public function factory($type)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException('Invalid confirmation attributes value in confirmation factory');
+ }
+ if (!array_key_exists($type, $this->typeClassMap)) {
+ throw new \InvalidArgumentException('Invalid confirmation attributes value type "'.$type.'"');
+ }
+ $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type];
+ return new $className();
+ }
+
+ /**
+ * @param array $data
+ * @param string|null $type
+ * @return AbstractConfirmationAttributes
+ */
+ public function factoryFromArray(array $data, $type = null)
+ {
+ if ($type === null) {
+ if (array_key_exists('type', $data)) {
+ $type = $data['type'];
+ unset($data['type']);
+ } else {
+ throw new \InvalidArgumentException(
+ 'Parameter type not specified in ConfirmationAttributesFactory.factoryFromArray()'
+ );
+ }
+ }
+ $confirmation = $this->factory($type);
+ foreach ($data as $key => $value) {
+ if ($confirmation->offsetExists($key)) {
+ $confirmation->offsetSet($key, $value);
+ }
+ }
+ return $confirmation;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php
new file mode 100644
index 0000000..dc122da
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationAttributes/ConfirmationAttributesRedirect.php
@@ -0,0 +1,83 @@
+_setType(ConfirmationType::REDIRECT);
+ }
+
+ /**
+ * @return bool Требование принудительного подтверждения платежа покупателем, требование 3-D Secure для
+ * оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
+ */
+ public function getEnforce()
+ {
+ return $this->_enforce;
+ }
+
+ /**
+ * @param bool $value Требование принудительного подтверждения платежа покупателем, требование 3-D Secure
+ * для оплаты банковскими картами. По умолчанию определяется политикой платежной системы.
+ */
+ public function setEnforce($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_enforce = null;
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_enforce = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid enforce value type', 0, 'confirmationAttributesRedirect.enforce', $value
+ );
+ }
+ }
+
+ /**
+ * @return string URL на который вернется плательщик после подтверждения или отмены платежа на странице партнера.
+ */
+ public function getReturnUrl()
+ {
+ return $this->_returnUrl;
+ }
+
+ /**
+ * @param string $value URL на который вернется плательщик после подтверждения или отмены платежа
+ * на странице партнера.
+ */
+ public function setReturnUrl($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_returnUrl = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_returnUrl = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid returnUrl value type', 0, 'confirmationAttributesRedirect.returnUrl', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php
new file mode 100644
index 0000000..e2ceebc
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ConfirmationType.php
@@ -0,0 +1,30 @@
+ true,
+ self::EXTERNAL => true,
+ self::DEEPLINK => false,
+ self::CODE_VERIFICATION => false,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php
new file mode 100644
index 0000000..3c87cbb
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/CurrencyCode.php
@@ -0,0 +1,21 @@
+ true,
+ self::USD => true,
+ self::EUR => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php
new file mode 100644
index 0000000..3b798ff
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Metadata.php
@@ -0,0 +1,35 @@
+getUnknownProperties();
+ }
+
+ /**
+ * @return \Iterator
+ */
+ public function getIterator()
+ {
+ return new \ArrayIterator($this->getUnknownProperties());
+ }
+
+ /**
+ * @return int
+ */
+ public function count()
+ {
+ return count($this->getUnknownProperties());
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php
new file mode 100644
index 0000000..d5535e9
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/MonetaryAmount.php
@@ -0,0 +1,189 @@
+ 0.0) {
+ $this->setValue($value);
+ }
+ if ($currency !== null) {
+ $this->setCurrency($currency);
+ }
+ }
+
+ /**
+ * Возвращает значение суммы
+ * @return string Сумма
+ */
+ public function getValue()
+ {
+ if ($this->_value < 10) {
+ return '0.0' . $this->_value;
+ } elseif ($this->_value < 100) {
+ return '0.' . $this->_value;
+ } else {
+ return substr($this->_value, 0, -2) . '.' . substr($this->_value, -2);
+ }
+ }
+
+ /**
+ * Устанавливает сумму
+ * @param string $value Сумма
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если было передано не валидное значение
+ */
+ public function setValue($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty amount value', 0, 'amount.value');
+ }
+ if (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException('Invalid amount value type', 0, 'amount.value', $value);
+ }
+ if ($value <= 0.0) {
+ throw new InvalidPropertyValueException('Invalid amount value: "'.$value.'"', 0, 'amount.value', $value);
+ }
+ $castedValue = (int)round($value * 100.0);
+ if ($castedValue <= 0.0) {
+ throw new InvalidPropertyValueException('Invalid amount value: "'.$value.'"', 0, 'amount.value', $value);
+ }
+ $this->_value = $castedValue;
+ }
+
+ /**
+ * Возвращает сумму в копейках в виде целого числа
+ * @return int Сумма в копейках/центах
+ */
+ public function getIntegerValue()
+ {
+ return $this->_value;
+ }
+
+ /**
+ * Возвращает валюту
+ * @return string Код валюты
+ */
+ public function getCurrency()
+ {
+ return $this->_currency;
+ }
+
+ /**
+ * Устанавливает код валюты
+ * @param string $value Код валюты
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты
+ */
+ public function setCurrency($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty currency value', 0, 'amount.currency');
+ }
+ if (TypeCast::canCastToEnumString($value)) {
+ $value = strtoupper((string)$value);
+ if (CurrencyCode::valueExists($value)) {
+ $this->_currency = $value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid currency value: "' . $value . '"', 0, 'amount.currency', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid currency value type', 0, 'amount.currency', $value);
+ }
+ }
+
+ /**
+ * Умножает текущую сумму на указанный коэффициент
+ * @param float $coefficient Множитель
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение меньше или равно нулю, либо если
+ * после умножения получили значение равное нулю
+ */
+ public function multiply($coefficient)
+ {
+ if ($coefficient === null || $coefficient === '') {
+ throw new EmptyPropertyValueException('Empty coefficient in multiply method', 0, 'amount.value');
+ }
+ if (!is_numeric($coefficient)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid coefficient type in multiply method', 0, 'amount.value', $coefficient
+ );
+ }
+ if ($coefficient <= 0.0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid coefficient in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient
+ );
+ }
+ $castedValue = (int)round($coefficient * $this->_value);
+ if ($castedValue === 0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid coefficient value in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient
+ );
+ }
+ $this->_value = $castedValue;
+ }
+
+ /**
+ * Увеличивает сумму на указанное значение
+ * @param int $value Значение которое будет прибавлено к текущему
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число
+ * @throws InvalidPropertyValueException Выбрасывается если после сложения получилась сумма меньше или равная нулю
+ */
+ public function increase($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty amount value in increase method', 0, 'amount.value');
+ }
+ if (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid amount value type in increase method', 0, 'amount.value', $value
+ );
+ }
+ $castedValue = (int)round($this->_value + $value * 100.0);
+ if ($castedValue <= 0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid amount value in increase method: "' . $value . '"', 0, 'amount.value', $value
+ );
+ }
+ $this->_value = $castedValue;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php
new file mode 100644
index 0000000..64fd145
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/AbstractNotification.php
@@ -0,0 +1,88 @@
+_type;
+ }
+
+ /**
+ * @param string $value
+ */
+ protected function _setType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty parameter "type" in Notification', 0, 'notification.type');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (NotificationType::valueExists($value)) {
+ $this->_type = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in Notification', 0, 'notification.type', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "type" parameter in Notification', 0, 'notification.type', $value
+ );
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getEvent()
+ {
+ return $this->_event;
+ }
+
+ /**
+ * @param string $value
+ */
+ protected function _setEvent($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty parameter "event" in Notification', 0, 'notification.event');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (NotificationEventType::valueExists($value)) {
+ $this->_event = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "event" parameter in Notification', 0, 'notification.event', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "event" parameter in Notification', 0, 'notification.event', $value
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php
new file mode 100644
index 0000000..e2cc659
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Notification/NotificationWaitingForCapture.php
@@ -0,0 +1,56 @@
+_setType(NotificationType::NOTIFICATION);
+ $this->_setEvent(NotificationEventType::PAYMENT_WAITING_FOR_CAPTURE);
+ if (!empty($source['type'])) {
+ if ($this->getType() !== $source['type']) {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in Notification', 0, 'notification.type', $source['type']
+ );
+ }
+ }
+ if (!empty($source['event'])) {
+ if ($this->getEvent() !== $source['event']) {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "event" parameter in Notification', 0, 'notification.event', $source['event']
+ );
+ }
+ }
+ if (empty($source['object'])) {
+ throw new EmptyPropertyValueException('Parameter object in NotificationWaitingForCapture is empty');
+ }
+ $this->_object = new PaymentResponse($source['object']);
+ }
+
+ /**
+ * @return PaymentInterface
+ */
+ public function getObject()
+ {
+ return $this->_object;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php
new file mode 100644
index 0000000..b3eb3df
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationEventType.php
@@ -0,0 +1,14 @@
+ true,
+ );
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php
new file mode 100644
index 0000000..bf732e5
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/NotificationType.php
@@ -0,0 +1,14 @@
+ true,
+ );
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php
new file mode 100644
index 0000000..1dfbe39
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Order.php
@@ -0,0 +1,81 @@
+_amount = new MonetaryAmount();
+ }
+
+ /**
+ * @return AmountInterface
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * @param AmountInterface $value
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * @return ReceiptInterface Данные фискального чека 54-ФЗ
+ */
+ public function getReceipt()
+ {
+ return $this->_receipt;
+ }
+
+ /**
+ * @param ReceiptInterface $value Данные фискального чека 54-ФЗ
+ */
+ public function setReceipt(ReceiptInterface $value)
+ {
+ $this->_receipt = $value;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasReceipt()
+ {
+ return $this->_receipt !== null;
+ }
+
+ /**
+ *
+ */
+ public function removeReceipt()
+ {
+ $this->_receipt = null;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php
new file mode 100644
index 0000000..9568e7f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/OrderInterface.php
@@ -0,0 +1,29 @@
+_id;
+ }
+
+ /**
+ * Устанавливает идентификатор платежа
+ * @param string $value Идентификатор платежа
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setId($value)
+ {
+ if (TypeCast::canCastToString($value)) {
+ $length = mb_strlen($value, 'utf-8');
+ if ($length != 36) {
+ throw new InvalidPropertyValueException('Invalid payment id value', 0, 'Payment.id', $value);
+ }
+ $this->_id = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid payment id value type', 0, 'Payment.id', $value);
+ }
+ }
+
+ /**
+ * Возвращает состояние платежа
+ * @return string Текущее состояние платежа
+ */
+ public function getStatus()
+ {
+ return $this->_status;
+ }
+
+ /**
+ * Устанавливает статус платежа
+ * @param string $value Статус платежа
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданная строка не является валидным статусом
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setStatus($value)
+ {
+ if (TypeCast::canCastToEnumString($value)) {
+ if (!PaymentStatus::valueExists((string)$value)) {
+ throw new InvalidPropertyValueException('Invalid payment status value', 0, 'Payment.status', $value);
+ }
+ $this->_status = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid payment status value type', 0, 'Payment.status', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает описание ошибки, возникшей при проведении платежа
+ * @return PaymentErrorInterface|null Описание ошибки или null если ошибка не задана
+ */
+ public function getError()
+ {
+ return $this->_error;
+ }
+
+ /**
+ * Устанавливает описание ошибки
+ * @param PaymentErrorInterface $value Инстанс объекта с описанием ошибки
+ */
+ public function setError(PaymentErrorInterface $value)
+ {
+ $this->_error = $value;
+ }
+
+ /**
+ * Возвращает получателя платежа
+ * @return RecipientInterface|null Получатель платежа или null если получатель не задан
+ */
+ public function getRecipient()
+ {
+ return $this->_recipient;
+ }
+
+ /**
+ * Устанавливает получателя платежа
+ * @param RecipientInterface $value Объект с информацией о получателе платежа
+ */
+ public function setRecipient(RecipientInterface $value)
+ {
+ $this->_recipient = $value;
+ }
+
+ /**
+ * Возвращает сумму
+ * @return AmountInterface Сумма платежа
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Устанавливает сумму платежа
+ * @param AmountInterface $value Сумма платежа
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * Возвращает используемый способ проведения платежа
+ * @return AbstractPaymentMethod Способ проведения платежа
+ */
+ public function getPaymentMethod()
+ {
+ return $this->_paymentMethod;
+ }
+
+ /**
+ * @param AbstractPaymentMethod $value
+ */
+ public function setPaymentMethod(AbstractPaymentMethod $value)
+ {
+ $this->_paymentMethod = $value;
+ }
+
+ /**
+ * Возвращает время создания заказа
+ * @return \DateTime Время создания заказа
+ */
+ public function getCreatedAt()
+ {
+ return $this->_createdAt;
+ }
+
+ /**
+ * Устанавливает время создания заказа
+ * @param \DateTime|string|int $value Время создания заказа
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если в метод была передана пустая дата
+ * @throws InvalidPropertyValueException Выбрасвается если передали строку, которую не удалось привести к дате
+ * @throws InvalidPropertyValueTypeException Выбрасывается если был передан аргумент, который невозможно
+ * интерпретировать как дату или время
+ */
+ public function setCreatedAt($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty created_at value', 0, 'payment.createdAt');
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException('Invalid created_at value', 0, 'payment.createdAt', $value);
+ }
+ $this->_createdAt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid created_at value', 0, 'payment.createdAt', $value);
+ }
+ }
+
+ /**
+ * Возвращает время подтверждения платежа магазином или null если если время не задано
+ * @return \DateTime|null Время подтверждения платежа магазином
+ */
+ public function getCapturedAt()
+ {
+ return $this->_capturedAt;
+ }
+
+ /**
+ * Устанавливает время подтверждения платежа магазином
+ * @param \DateTime|string|int|null $value Время подтверждения платежа магазином
+ *
+ * @throws InvalidPropertyValueException Выбрасвается если передали строку, которую не удалось привести к дате
+ * @throws InvalidPropertyValueTypeException Выбрасывается если был передан аргумент, который невозможно
+ * интерпретировать как дату или время
+ */
+ public function setCapturedAt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_capturedAt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException('Invalid captured_at value', 0, 'payment.capturedAt', $value);
+ }
+ $this->_capturedAt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid captured_at value', 0, 'payment.capturedAt', $value);
+ }
+ }
+
+ /**
+ * Возвращает способ подтверждения платежа
+ * @return Confirmation\AbstractConfirmation Способ подтверждения платежа
+ */
+ public function getConfirmation()
+ {
+ return $this->_confirmation;
+ }
+
+ /**
+ * Устанавливает способ подтверждения платежа
+ * @param Confirmation\AbstractConfirmation $value Способ подтверждения платежа
+ */
+ public function setConfirmation(Confirmation\AbstractConfirmation $value)
+ {
+ $this->_confirmation = $value;
+ }
+
+ /**
+ * Возвращает сумму возвращенных средств
+ * @return AmountInterface Сумма возвращенных средств платежа
+ */
+ public function getRefundedAmount()
+ {
+ return $this->_refundedAmount;
+ }
+
+ /**
+ * Устанавливает сумму возвращенных средств
+ * @param AmountInterface $value Сумма возвращенных средств платежа
+ */
+ public function setRefundedAmount(AmountInterface $value)
+ {
+ $this->_refundedAmount = $value;
+ }
+
+ /**
+ * Проверяет был ли уже оплачен заказ
+ * @return bool Признак оплаты заказа, true если заказ оплачен, false если нет
+ */
+ public function getPaid()
+ {
+ return $this->_paid;
+ }
+
+ /**
+ * Устанавливает флаг оплаты заказа
+ * @param bool $value Признак оплаты заказа
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если переданный аргумент пуст
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не кастится в булево значение
+ */
+ public function setPaid($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty payment paid flag value', 0, 'Payment.paid');
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_paid = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid payment paid flag value type', 0, 'Payment.paid', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает состояние регистрации фискального чека
+ * @return string Состояние регистрации фискального чека
+ */
+ public function getReceiptRegistration()
+ {
+ return $this->_receiptRegistration;
+ }
+
+ /**
+ * Устанавливает состояние регистрации фискального чека
+ * @param string $value Состояние регистрации фискального чека
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное состояние регистрации не существует
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не строка
+ */
+ public function setReceiptRegistration($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_receiptRegistration = null;
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (ReceiptRegistrationStatus::valueExists($value)) {
+ $this->_receiptRegistration = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid receipt_registration value', 0, 'payment.receiptRegistration', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid receipt_registration value type', 0, 'payment.receiptRegistration', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает метаданные платежа установленные мерчантом
+ * @return Metadata Метаданные платежа указанные мерчантом
+ */
+ public function getMetadata()
+ {
+ return $this->_metadata;
+ }
+
+ /**
+ * Устанавливает метаданные платежа
+ * @param Metadata $value Метаданные платежа указанные мерчантом
+ */
+ public function setMetadata(Metadata $value)
+ {
+ $this->_metadata = $value;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php
new file mode 100644
index 0000000..acf4294
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/AbstractPaymentData.php
@@ -0,0 +1,54 @@
+_type;
+ }
+
+ /**
+ * @param string $value
+ */
+ protected function _setType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty payment data type', 0, 'paymentData.type'
+ );
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (PaymentMethodType::valueExists($value)) {
+ $this->_type = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in PaymentData', 0, 'paymentData.type', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "type" parameter in PaymentData', 0, 'paymentData.type', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php
new file mode 100644
index 0000000..021d26b
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAlfabank.php
@@ -0,0 +1,50 @@
+_setType(PaymentMethodType::ALFABANK);
+ }
+
+ /**
+ * @return string Имя пользователя в Альфа-Клике
+ */
+ public function getLogin()
+ {
+ return $this->_login;
+ }
+
+ /**
+ * @param string $value Имя пользователя в Альфа-Клике
+ */
+ public function setLogin($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty login value', 0, 'PaymentDataAlfabank.login');
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_login = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid login value type', 0, 'PaymentDataAlfabank.login', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php
new file mode 100644
index 0000000..7a8a356
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataAndroidPay.php
@@ -0,0 +1,52 @@
+_setType(PaymentMethodType::ANDROID_PAY);
+ }
+
+ /**
+ * @return string содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
+ */
+ public function getPaymentData()
+ {
+ return $this->_paymentData;
+ }
+
+ /**
+ * @param string $value содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
+ */
+ public function setPaymentData($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty value for paymentData', 0, 'PaymentDataAndroidPay.paymentData'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_paymentData = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for paymentData', 0, 'PaymentDataAndroidPay.paymentData', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php
new file mode 100644
index 0000000..3d7fd1f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataApplePay.php
@@ -0,0 +1,53 @@
+_setType(PaymentMethodType::APPLE_PAY);
+ }
+
+ /**
+ * @return string содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
+ */
+ public function getPaymentData()
+ {
+ return $this->_paymentData;
+ }
+
+ /**
+ * @param string $value содержимое поля paymentData объекта PKPaymentToken, закодированное в Base64
+ */
+ public function setPaymentData($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty value for paymentData', 0, 'PaymentDataApplePay.paymentData'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_paymentData = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for paymentData', 0, 'PaymentDataApplePay.paymentData', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php
new file mode 100644
index 0000000..f102148
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCard.php
@@ -0,0 +1,56 @@
+_setType(PaymentMethodType::BANK_CARD);
+ }
+
+ /**
+ * @return PaymentDataBankCardCard Данные банковской карты
+ */
+ public function getBankCard()
+ {
+ return $this->_card;
+ }
+
+ /**
+ * @param PaymentDataBankCardCard|array $value Данные банковской карты
+ */
+ public function setBankCard($value)
+ {
+ if ($value === null || $value === '' || $value === array()) {
+ $this->_card = null;
+ } elseif (is_object($value) && $value instanceof PaymentDataBankCardCard) {
+ $this->_card = $value;
+ } elseif (is_array($value) || $value instanceof \Traversable) {
+ $card = new PaymentDataBankCardCard();
+ foreach ($value as $property => $val) {
+ $card->offsetSet($property, $val);
+ }
+ $this->_card = $card;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid card value type in PaymentDataBankCard', 0, 'PaymentDataBankCard.card', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php
new file mode 100644
index 0000000..59e3ce9
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataBankCardCard.php
@@ -0,0 +1,213 @@
+_number;
+ }
+
+ /**
+ * @param string $value Номер банковской карты
+ */
+ public function setNumber($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty card number value', 0, 'PaymentDataBankCardCard.number');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{16,19}$/', (string)$value)) {
+ $this->_number = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card number value', 0, 'PaymentDataBankCardCard.number', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid card number value type', 0, 'PaymentDataBankCardCard.number', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Срок действия, год, YYYY
+ */
+ public function getExpiryYear()
+ {
+ return $this->_expiryYear;
+ }
+
+ /**
+ * @param string $value Срок действия, год, YYYY
+ */
+ public function setExpiryYear($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear'
+ );
+ } elseif (is_numeric($value)) {
+ if (!preg_match('/^\d\d\d\d$/', $value) || $value < 2000 || $value > 2200) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear', $value
+ );
+ }
+ $this->_expiryYear = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry year value', 0, 'PaymentDataBankCardCard.expiryYear', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Срок действия, месяц, MM
+ */
+ public function getExpiryMonth()
+ {
+ return $this->_expiryMonth;
+ }
+
+ /**
+ * @param string $value Срок действия, месяц, MM
+ */
+ public function setExpiryMonth($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth'
+ );
+ } elseif (is_numeric($value)) {
+ if (!preg_match('/^\d\d$/', $value)) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
+ );
+ }
+ if (is_string($value) && $value[0] == '0') {
+ $month = (int)($value[1]);
+ } else {
+ $month = (int)$value;
+ }
+ if ($month < 1 || $month > 12) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
+ );
+ } else {
+ $this->_expiryMonth = (string)$value;
+ }
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentDataBankCardCard.expiryMonth', $value
+ );
+ }
+ }
+
+ /**
+ * @return string CVV2/CVC2 код
+ */
+ public function getCsc()
+ {
+ return $this->_csc;
+ }
+
+ /**
+ * @param string $value CVV2/CVC2 код
+ */
+ public function setCsc($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card CSC code value', 0, 'PaymentDataBankCardCard.csc'
+ );
+ } elseif (is_numeric($value)) {
+ if (preg_match('/^\d{3,4}$/', $value)) {
+ $this->_csc = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card CSC code value', 0, 'PaymentDataBankCardCard.csc', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card CSC code value', 0, 'PaymentDataBankCardCard.csc', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Имя держателя карты
+ */
+ public function getCardholder()
+ {
+ return $this->_cardholder;
+ }
+
+ /**
+ * @param string $value Имя держателя карты
+ */
+ public function setCardholder($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card holder value', 0, 'PaymentDataBankCardCard.cardholder'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[a-zA-Z\s]{1,26}$/', $value)) {
+ $this->_cardholder = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card holder value', 0, 'PaymentDataBankCardCard.cardholder', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card holder value', 0, 'PaymentDataBankCardCard.cardholder', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php
new file mode 100644
index 0000000..a56cb3b
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataCash.php
@@ -0,0 +1,57 @@
+_setType(PaymentMethodType::CASH);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_phone = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentDataCash.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentDataCash.phone', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php
new file mode 100644
index 0000000..270d85a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataFactory.php
@@ -0,0 +1,63 @@
+ 'PaymentDataYandexWallet',
+ PaymentMethodType::BANK_CARD => 'PaymentDataBankCard',
+ PaymentMethodType::SBERBANK => 'PaymentDataSberbank',
+ PaymentMethodType::CASH => 'PaymentDataCash',
+ PaymentMethodType::MOBILE_BALANCE => 'PaymentDataMobileBalance',
+ PaymentMethodType::APPLE_PAY => 'PaymentDataApplePay',
+ PaymentMethodType::ANDROID_PAY => 'PaymentDataAndroidPay',
+ PaymentMethodType::QIWI => 'PaymentDataQiwi',
+ PaymentMethodType::WEBMONEY => 'PaymentDataWebmoney',
+ PaymentMethodType::ALFABANK => 'PaymentDataAlfabank',
+ );
+
+ /**
+ * @param string $type
+ * @return AbstractPaymentData
+ */
+ public function factory($type)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException('Invalid payment type value in payment factory');
+ }
+ if (!array_key_exists($type, $this->typeClassMap)) {
+ throw new \InvalidArgumentException('Invalid payment data type "'.$type.'"');
+ }
+ $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type];
+ return new $className();
+ }
+
+ /**
+ * @param array $data
+ * @param string|null $type
+ * @return AbstractPaymentData
+ */
+ public function factoryFromArray(array $data, $type = null)
+ {
+ if ($type === null) {
+ if (array_key_exists('type', $data)) {
+ $type = $data['type'];
+ unset($data['type']);
+ } else {
+ throw new \InvalidArgumentException(
+ 'Parameter type not specified in PaymentDataFactory.factoryFromArray()'
+ );
+ }
+ }
+ $paymentData = $this->factory($type);
+ foreach ($data as $key => $value) {
+ if ($paymentData->offsetExists($key)) {
+ $paymentData->offsetSet($key, $value);
+ }
+ }
+ return $paymentData;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php
new file mode 100644
index 0000000..76c6f00
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataMobileBalance.php
@@ -0,0 +1,58 @@
+_setType(PaymentMethodType::MOBILE_BALANCE);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataMobileBalance.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentDataMobileBalance.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentDataMobileBalance.phone', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php
new file mode 100644
index 0000000..e9cc7a6
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataQiwi.php
@@ -0,0 +1,57 @@
+_setType(PaymentMethodType::QIWI);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataQiwi.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentDataQiwi.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentDataQiwi.phone', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php
new file mode 100644
index 0000000..70202ac
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataSberbank.php
@@ -0,0 +1,89 @@
+_setType(PaymentMethodType::SBERBANK);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataSberbank.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentDataSberbank.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentDataSberbank.phone', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Идентификатор привязки клиента СБОЛ.
+ */
+ public function getBindId()
+ {
+ return $this->_bindId;
+ }
+
+ /**
+ * @param string $value Идентификатор привязки клиента СБОЛ.
+ */
+ public function setBindId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty bindId value', 0, 'PaymentDataSberbank.bindId');
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_bindId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid bindId value type', 0, 'PaymentDataSberbank.bindId', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php
new file mode 100644
index 0000000..a578235
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataWebmoney.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::WEBMONEY);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php
new file mode 100644
index 0000000..7ff8039
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentData/PaymentDataYandexWallet.php
@@ -0,0 +1,95 @@
+_setType(PaymentMethodType::YANDEX_MONEY);
+ }
+
+ /**
+ * @return string Номер телефона в формате ITU-T E.164 на который зарегестрирован аккаунт в Яндекс Денгах. Необходим для оплаты `waiting` сценарием
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value Номер телефона в формате ITU-T E.164 на который зарегестрирован аккаунт в Яндекс Денгах. Необходим для оплаты `waiting` сценарием
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentDataYandexWallet.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentDataYandexWallet.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentDataYandexWallet.phone', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Номер кошелька в Яндекс.Деньгах, из которого спишутся деньги при оплате. Необходим для оплаты `waiting` сценарием
+ */
+ public function getAccountNumber()
+ {
+ return $this->_accountNumber;
+ }
+
+ /**
+ * @param string $value Номер кошелька в Яндекс.Деньгах, из которого спишутся деньги при оплате. Необходим для оплаты `waiting` сценарием
+ */
+ public function setAccountNumber($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty accountNumber value', 0, 'PaymentDataYandexWallet.accountNumber'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{11,33}$/', $value)) {
+ $this->_accountNumber = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid accountNumber value', 0, 'PaymentDataYandexWallet.accountNumber', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid accountNumber value type', 0, 'PaymentDataYandexWallet.accountNumber', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php
new file mode 100644
index 0000000..fad2fdc
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentError.php
@@ -0,0 +1,97 @@
+_code;
+ }
+
+ /**
+ * @param string $value Код ошибки
+ */
+ public function setCode($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty code value in PaymentError', 0, 'PaymentError.code');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ $castedValue = (string)$value;
+ if (PaymentErrorCode::valueExists($castedValue)) {
+ $this->_code = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid code value in PaymentError', 0, 'PaymentError.code', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid code value type in PaymentError', 0, 'PaymentError.code', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Дополнительное текстовое пояснение ошибки
+ */
+ public function getDescription()
+ {
+ return $this->_description;
+ }
+
+ /**
+ * @param string $value Дополнительное текстовое пояснение ошибки
+ */
+ public function setDescription($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_description = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_description = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid description value type in PaymentError', 0, 'PaymentError.description', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php
new file mode 100644
index 0000000..59e9309
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorCode.php
@@ -0,0 +1,26 @@
+ true,
+ self::AUTHORIZATION_REJECTED => true,
+ self::PAYMENT_EXPIRED => true,
+ self::IDENTIFICATION_REQUIRED => true,
+ self::INSUFFICIENT_FUNDS => true,
+ self::PAYER_NOT_FOUND => true,
+ self::INAPPROPRIATE_STATUS => true,
+ );
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php
new file mode 100644
index 0000000..d1e6fa1
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentErrorInterface.php
@@ -0,0 +1,24 @@
+_type;
+ }
+
+ /**
+ * @param string $value Тип объекта
+ */
+ protected function _setType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty payment data type', 0, 'PaymentMethod.type'
+ );
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (PaymentMethodType::valueExists($value)) {
+ $this->_type = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid value for "type" parameter in PaymentMethod', 0, 'PaymentMethod.type', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid value type for "type" parameter in PaymentMethod', 0, 'PaymentMethod.type', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Идентификатор записи о сохраненных платежных данных
+ */
+ public function getId()
+ {
+ return $this->_id;
+ }
+
+ /**
+ * @param string $value Идентификатор записи о сохраненных платежных данных
+ */
+ public function setId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_id = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_id = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid id value type', 0, 'PaymentMethod.id', $value);
+ }
+ }
+
+ /**
+ * @return bool Возможность многократного использования
+ */
+ public function getSaved()
+ {
+ return $this->_saved;
+ }
+
+ /**
+ * @param bool $value Возможность многократного использования
+ */
+ public function setSaved($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty saved value', 0, 'PaymentMethod.saved');
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_saved = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid saved value type', 0, 'PaymentMethod.saved', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Название метода оплаты
+ */
+ public function getTitle()
+ {
+ return $this->_title;
+ }
+
+ /**
+ * @param string $value Название метода оплаты
+ */
+ public function setTitle($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_title = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_title = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid title value type', 0, 'PaymentMethod.title', $value);
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php
new file mode 100644
index 0000000..7a20a3c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAlfaBank.php
@@ -0,0 +1,51 @@
+_setType(PaymentMethodType::ALFABANK);
+ }
+
+ /**
+ * @return string Имя пользователя в Альфа-Клике
+ */
+ public function getLogin()
+ {
+ return $this->_login;
+ }
+
+ /**
+ * @param string $value Имя пользователя в Альфа-Клике
+ */
+ public function setLogin($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty login value', 0, 'PaymentMethodAlfaBank.login');
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_login = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid login value type', 0, 'PaymentMethodAlfaBank.login', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php
new file mode 100644
index 0000000..5cf2572
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodAndroidPay.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::ANDROID_PAY);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php
new file mode 100644
index 0000000..151b4b1
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodApplePay.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::APPLE_PAY);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php
new file mode 100644
index 0000000..854ecf7
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodBankCard.php
@@ -0,0 +1,179 @@
+_setType(PaymentMethodType::BANK_CARD);
+ }
+
+ /**
+ * @return string Последние 4 цифры номера карты
+ */
+ public function getLast4()
+ {
+ return $this->_last4;
+ }
+
+ /**
+ * @param string $value Последние 4 цифры номера карты
+ */
+ public function setLast4($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty card last4 value', 0, 'PaymentMethodBankCard.last4');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4}$/', (string)$value)) {
+ $this->_last4 = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card last4 value', 0, 'PaymentMethodBankCard.last4', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid card last4 value type', 0, 'PaymentMethodBankCard.last4', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Срок действия, год
+ */
+ public function getExpiryYear()
+ {
+ return $this->_expiryYear;
+ }
+
+ /**
+ * @param string $value Срок действия, год
+ */
+ public function setExpiryYear($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card expiry year value', 0, 'PaymentMethodBankCard.expiryYear'
+ );
+ } elseif (is_numeric($value)) {
+ if (!preg_match('/^\d\d\d\d$/', $value) || $value < 2000 || $value > 2200) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry year value', 0, 'PaymentMethodBankCard.expiryYear', $value
+ );
+ }
+ $this->_expiryYear = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry year value', 0, 'PaymentMethodBankCard.expiryYear', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Срок действия, месяц
+ */
+ public function getExpiryMonth()
+ {
+ return $this->_expiryMonth;
+ }
+
+ /**
+ * @param string $value Срок действия, месяц
+ */
+ public function setExpiryMonth($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth'
+ );
+ } elseif (is_numeric($value)) {
+ if (!preg_match('/^\d\d$/', $value)) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth', $value
+ );
+ }
+ if (is_string($value) && $value[0] == '0') {
+ $month = (int)($value[1]);
+ } else {
+ $month = (int)$value;
+ }
+ if ($month < 1 || $month > 12) {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth', $value
+ );
+ } else {
+ $this->_expiryMonth = (string)$value;
+ }
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid card expiry month value', 0, 'PaymentMethodBankCard.expiryMonth', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Тип банковской карты
+ */
+ public function getCardType()
+ {
+ return $this->_cardType;
+ }
+
+ /**
+ * @param string $value Тип банковской карты
+ */
+ public function setCardType($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty cardType value', 0, 'PaymentMethodBankCard.cardType');
+ } elseif (TypeCast::canCastToString($value)) {
+ $castedValue = (string)$value;
+ if (PaymentMethodCardType::valueExists($castedValue)) {
+ $this->_cardType = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid cardType value', 0, 'PaymentMethodBankCard.cardType', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid cardType value type', 0, 'PaymentMethodBankCard.cardType', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php
new file mode 100644
index 0000000..924e30c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCardType.php
@@ -0,0 +1,26 @@
+ true,
+ self::VISA => true,
+ self::MIR => true,
+ self::UNION_PAY => true,
+ self::JCB => true,
+ self::AMERICAN_EXPRESS => true,
+ self::UNKNOWN => true,
+ );
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php
new file mode 100644
index 0000000..6028acd
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodCash.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::CASH);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php
new file mode 100644
index 0000000..1da3b77
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodFactory.php
@@ -0,0 +1,74 @@
+ 'PaymentMethodYandexWallet',
+ PaymentMethodType::BANK_CARD => 'PaymentMethodBankCard',
+ PaymentMethodType::SBERBANK => 'PaymentMethodSberbank',
+ PaymentMethodType::CASH => 'PaymentMethodCash',
+ PaymentMethodType::MOBILE_BALANCE => 'PaymentMethodMobileBalance',
+ PaymentMethodType::APPLE_PAY => 'PaymentMethodApplePay',
+ PaymentMethodType::ANDROID_PAY => 'PaymentMethodAndroidPay',
+ PaymentMethodType::QIWI => 'PaymentMethodQiwi',
+ PaymentMethodType::WEBMONEY => 'PaymentMethodWebmoney',
+ PaymentMethodType::ALFABANK => 'PaymentMethodAlfaBank',
+ );
+
+ private $optionsMap = array(
+ 'card_type' => 'cardType',
+ 'expiry_month' => 'expiryMonth',
+ 'expiry_year' => 'expiryYear',
+ 'bind_id' => 'bindId',
+ 'account_number' => 'accountNumber',
+ );
+
+ /**
+ * @param string $type
+ * @return AbstractPaymentMethod
+ */
+ public function factory($type)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException('Invalid payment method type value in payment factory');
+ }
+ if (!array_key_exists($type, $this->typeClassMap)) {
+ throw new \InvalidArgumentException('Invalid payment method data type "'.$type.'"');
+ }
+ $className = __NAMESPACE__ . '\\' . $this->typeClassMap[$type];
+ return new $className();
+ }
+
+ /**
+ * @param array $data
+ * @param string|null $type
+ * @return AbstractPaymentMethod
+ */
+ public function factoryFromArray(array $data, $type = null)
+ {
+ if ($type === null) {
+ if (array_key_exists('type', $data)) {
+ $type = $data['type'];
+ unset($data['type']);
+ } else {
+ throw new \InvalidArgumentException(
+ 'Parameter type not specified in PaymentDataFactory.factoryFromArray()'
+ );
+ }
+ }
+ $paymentData = $this->factory($type);
+ foreach ($data as $key => $value) {
+ if (array_key_exists($key, $this->optionsMap)) {
+ $key = $this->optionsMap[$key];
+ }
+ if ($paymentData->offsetExists($key)) {
+ $paymentData->offsetSet($key, $value);
+ }
+ }
+ return $paymentData;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php
new file mode 100644
index 0000000..1f1e18c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodMobileBalance.php
@@ -0,0 +1,58 @@
+_setType(PaymentMethodType::MOBILE_BALANCE);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodMobileBalance.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentMethodMobileBalance.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentMethodMobileBalance.phone', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php
new file mode 100644
index 0000000..9ba59e4
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodQiwi.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::QIWI);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php
new file mode 100644
index 0000000..60b2599
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodSberbank.php
@@ -0,0 +1,89 @@
+_setType(PaymentMethodType::SBERBANK);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodSberbank.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentMethodSberbank.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentMethodSberbank.phone', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Идентификатор привязки клиента СБОЛ.
+ */
+ public function getBindId()
+ {
+ return $this->_bindId;
+ }
+
+ /**
+ * @param string $value Идентификатор привязки клиента СБОЛ.
+ */
+ public function setBindId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty bindId value', 0, 'PaymentMethodSberbank.bindId');
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_bindId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid bindId value type', 0, 'PaymentMethodSberbank.bindId', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php
new file mode 100644
index 0000000..0b74320
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodWebmoney.php
@@ -0,0 +1,17 @@
+_setType(PaymentMethodType::WEBMONEY);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php
new file mode 100644
index 0000000..d1686f8
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethod/PaymentMethodYandexWallet.php
@@ -0,0 +1,95 @@
+_setType(PaymentMethodType::YANDEX_MONEY);
+ }
+
+ /**
+ * @return string Номер телефона в формате ITU-T E.164 с которого была произведена оплата.
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value Номер телефона в формате ITU-T E.164 с которого была произведена оплата.
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty phone value', 0, 'PaymentMethodYandexWallet.phone');
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{4,15}$/', $value)) {
+ $this->_phone = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid phone value', 0, 'PaymentMethodYandexWallet.phone', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid phone value type', 0, 'PaymentMethodYandexWallet.phone', $value
+ );
+ }
+ }
+
+ /**
+ * @return string Номер кошелька в Яндекс.Деньгах с которого была произведена оплата.
+ */
+ public function getAccountNumber()
+ {
+ return $this->_accountNumber;
+ }
+
+ /**
+ * @param string $value Номер кошелька в Яндекс.Деньгах с которого была произведена оплата.
+ */
+ public function setAccountNumber($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty accountNumber value', 0, 'PaymentMethodYandexWallet.accountNumber'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ if (preg_match('/^[0-9]{11,33}$/', $value)) {
+ $this->_accountNumber = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid accountNumber value', 0, 'PaymentMethodYandexWallet.accountNumber', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid accountNumber value type', 0, 'PaymentMethodYandexWallet.accountNumber', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php
new file mode 100644
index 0000000..514025e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentMethodType.php
@@ -0,0 +1,46 @@
+ true,
+ self::BANK_CARD => true,
+ self::SBERBANK => true,
+ self::CASH => true,
+ self::MOBILE_BALANCE => false,
+ self::APPLE_PAY => false,
+ self::ANDROID_PAY => false,
+ self::QIWI => true,
+ self::ALFABANK => true,
+ self::WEBMONEY => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php
new file mode 100644
index 0000000..738a3c1
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/PaymentStatus.php
@@ -0,0 +1,30 @@
+ true,
+ self::WAITING_FOR_CAPTURE => true,
+ self::SUCCEEDED => true,
+ self::CANCELED => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php
new file mode 100644
index 0000000..b89d42c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Receipt.php
@@ -0,0 +1,256 @@
+_items;
+ }
+
+ /**
+ * @param array $value Список товаров в заказе
+ */
+ public function setItems($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty items value in receipt', 0, 'receipt.items');
+ }
+ if (!is_array($value) && !($value instanceof \Traversable)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid items value type in receipt', 0, 'receipt.items', $value
+ );
+ }
+ $this->_items = array();
+ $this->_shippingItems = array();
+ foreach ($value as $key => $val) {
+ $this->_items[$key] = $val;
+ if ($val->isShipping()) {
+ $this->_shippingItems[] = $val;
+ }
+ }
+ }
+
+ public function addItem(ReceiptItemInterface $value)
+ {
+ $this->_items[] = $value;
+ if ($value->isShipping()) {
+ $this->_shippingItems[] = $value;
+ }
+ }
+
+ /**
+ * @return int Код системы налогообложения. Число 1-6.
+ */
+ public function getTaxSystemCode()
+ {
+ return $this->_taxSystemCode;
+ }
+
+ /**
+ * Устанавливает код системы налогообложения
+ * @param int $value Код системы налогообложения. Число 1-6
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число
+ * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести
+ */
+ public function setTaxSystemCode($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_taxSystemCode = null;
+ } elseif (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid taxSystemCode value type', 0, 'receipt.taxSystemCode'
+ );
+ } else {
+ $castedValue = (int)$value;
+ if ($castedValue < 1 || $castedValue > 6) {
+ throw new InvalidPropertyValueException(
+ 'Invalid taxSystemCode value: ' . $value, 0, 'receipt.taxSystemCode'
+ );
+ }
+ $this->_taxSystemCode = $castedValue;
+ }
+ }
+
+ /**
+ * @return string Номер телефона плательщика в формате ITU-T E.164 на который будет выслан чек.
+ */
+ public function getPhone()
+ {
+ return $this->_phone;
+ }
+
+ /**
+ * @param string $value Номер телефона плательщика в формате ITU-T E.164 на который будет выслан чек.
+ */
+ public function setPhone($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_phone = null;
+ } elseif (!TypeCast::canCastToString($value)) {
+ throw new InvalidPropertyValueTypeException('Invalid phone value type', 0, 'receipt.phone');
+ } elseif (!preg_match('/^[0-9]{4,15}$/', (string)$value)) {
+ throw new InvalidPropertyValueException('Invalid phone value: "' . $value . '"', 0, 'receipt.phone');
+ } else {
+ $this->_phone = (string)$value;
+ }
+ }
+
+ /**
+ * @return string E-mail адрес плательщика на который будет выслан чек.
+ */
+ public function getEmail()
+ {
+ return $this->_email;
+ }
+
+ /**
+ * @param string $value E-mail адрес плательщика на который будет выслан чек.
+ */
+ public function setEmail($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_email = null;
+ } elseif (!TypeCast::canCastToString($value)) {
+ throw new InvalidPropertyValueTypeException('Invalid email value type', 0, 'receipt.email');
+ } else {
+ $this->_email = (string)$value;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function notEmpty()
+ {
+ return !empty($this->_items);
+ }
+
+ /**
+ * Возвращает стоимость заказа исходя из состава чека
+ * @param bool $withShipping Добавить ли к стоимости заказа стоимость доставки
+ * @return int Общая стоимость заказа в центах/копейках
+ */
+ public function getAmountValue($withShipping = true)
+ {
+ $result = 0;
+ foreach ($this->_items as $item) {
+ if ($withShipping || !$item->isShipping()) {
+ $result += $item->getAmount();
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Возвращает стоимость доставки исходя из состава чека
+ * @return int Стоимость доставки из состава чека в центах/копейках
+ */
+ public function getShippingAmountValue()
+ {
+ $result = 0;
+ foreach ($this->_items as $item) {
+ if ($item->isShipping()) {
+ $result += $item->getAmount();
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Подгоняет стоимость товаров в чеке к общей цене заказа
+ * @param AmountInterface $orderAmount Общая стоимость заказа
+ * @param bool $withShipping Поменять ли заодно и цену доставки
+ */
+ public function normalize(AmountInterface $orderAmount, $withShipping = false)
+ {
+ $amount = $orderAmount->getIntegerValue();
+ if (!$withShipping) {
+ if ($this->_shippingItems !== null) {
+ $amount -= $this->getShippingAmountValue();
+ }
+ }
+ $realAmount = $this->getAmountValue($withShipping);
+ if ($realAmount !== $amount) {
+ $coefficient = (float)$amount / (float)$realAmount;
+ $realAmount = 0;
+ $aloneId = null;
+ foreach ($this->_items as $index => $item) {
+ if ($withShipping || !$item->isShipping()) {
+ $item->applyDiscountCoefficient($coefficient);
+ $realAmount += $item->getAmount();
+ if ($aloneId === null && $item->getQuantity() === 1.0 && !$item->isShipping()) {
+ $aloneId = $index;
+ }
+ }
+ }
+ if ($aloneId === null) {
+ foreach ($this->_items as $index => $item) {
+ if (!$item->isShipping()) {
+ $aloneId = $index;
+ break;
+ }
+ }
+ }
+ if ($aloneId === null) {
+ $aloneId = 0;
+ }
+ $diff = $amount - $realAmount;
+ if (abs($diff) >= 0.1) {
+ if ($this->_items[$aloneId]->getQuantity() === 1.0) {
+ $this->_items[$aloneId]->increasePrice($diff / 100.0);
+ } elseif ($this->_items[$aloneId]->getQuantity() > 1.0) {
+ $item = $this->_items[$aloneId]->fetchItem(1);
+ $item->increasePrice($diff / 100.0);
+ array_splice($this->_items, $aloneId + 1, 0, array($item));
+ } else {
+ $item = $this->_items[$aloneId]->fetchItem($this->_items[$aloneId]->getQuantity() / 2);
+ $item->increasePrice($diff / 100.0);
+ array_splice($this->_items, $aloneId + 1, 0, array($item));
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php
new file mode 100644
index 0000000..fd1236a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptInterface.php
@@ -0,0 +1,41 @@
+_description;
+ }
+
+ /**
+ * Устанавливает наименование товара
+ * @param string $value Наименование товара
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка
+ */
+ public function setDescription($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ $castedValue = (string)$value;
+ if ($castedValue === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description'
+ );
+ }
+ $this->_description = $castedValue;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает количество товара
+ * @return float Количество купленного товара
+ */
+ public function getQuantity()
+ {
+ return $this->_quantity;
+ }
+
+ /**
+ * Устанавливает количество покупаемого товара
+ * @param int $value Количество
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль
+ * или отрицательное число
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число
+ */
+ public function setQuantity($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty quantity value in ReceiptItem', 0, 'ReceiptItem.quantity');
+ } elseif (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid quantity value type in ReceiptItem', 0, 'ReceiptItem.quantity', $value
+ );
+ } elseif ($value <= 0.0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid quantity value in ReceiptItem', 0, 'ReceiptItem.quantity', $value
+ );
+ } else {
+ $this->_quantity = (float)$value;
+ }
+ }
+
+ /**
+ * Возвращает общую стоимость покупаемого товара в копейках/центах
+ * @return int Сумма стоимости покупаемого товара
+ */
+ public function getAmount()
+ {
+ return (int)round($this->_amount->getIntegerValue() * $this->_quantity);
+ }
+
+ /**
+ * Возвращает цену товара
+ * @return AmountInterface Цена товара
+ */
+ public function getPrice()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Устанавливает цену товара
+ * @param AmountInterface $value Цена товара
+ */
+ public function setPrice(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * Возвращает ставку НДС
+ * @return int|null Ставка НДС, число 1-6, или null если ставка не задана
+ */
+ public function getVatCode()
+ {
+ return $this->_vatCode;
+ }
+
+ /**
+ * Устанавливает ставку НДС
+ * @param int $value Ставка НДС, число 1-6
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента было передано число меньше одного
+ * или больше шести
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число
+ */
+ public function setVatCode($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_vatCode = null;
+ } elseif (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid vatId value type in ReceiptItem', 0, 'ReceiptItem.vatId', $value
+ );
+ } elseif ($value < 1 || $value > 6) {
+ throw new InvalidPropertyValueException(
+ 'Invalid vatId value in ReceiptItem', 0, 'ReceiptItem.vatId', $value
+ );
+ } else {
+ $this->_vatCode = (int)$value;
+ }
+ }
+
+ /**
+ * Устанавливает флаг доставки для текущего объекта айтема в чеке
+ * @param bool $value True если айтем является доставкой, false если нет
+ *
+ * @throws InvalidPropertyValueException Генерируется если передано значение невалидного типа
+ */
+ public function setIsShipping($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_shipping = false;
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_shipping = $value ? true : false;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid isShipping value in ReceiptItem', 0, 'ReceiptItem.isShipping', $value
+ );
+ }
+ }
+
+ /**
+ * Проверяет, является ли текущий элемент чека доствкой
+ * @return bool True если доставка, false если обычный товар
+ */
+ public function isShipping()
+ {
+ return $this->_shipping;
+ }
+
+ /**
+ * Применяет для товара скидку
+ * @param float $coefficient Множитель скидки
+ */
+ public function applyDiscountCoefficient($coefficient)
+ {
+ $this->_amount->multiply($coefficient);
+ }
+
+ /**
+ * Увеличивает цену товара на указанную величину
+ * @param float $value Сумма на которую цену товара увеличиваем
+ */
+ public function increasePrice($value)
+ {
+ $this->_amount->increase($value);
+ }
+
+ /**
+ * Уменьшает количество покупаемого товара на указанное, возвращает объект позиции в чеке с уменьшаемым количеством
+ * @param float $count Количество на которое уменьшаем позицию в чеке
+ * @return ReceiptItem Новый инстанс позиции в чеке
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль
+ * или отрицательное число, или число больше текущего количества покупаемого товара
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число
+ */
+ public function fetchItem($count)
+ {
+ if ($count === null || $count === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity'
+ );
+ } elseif (!is_numeric($count)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid quantity value type in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count
+ );
+ } elseif ($count <= 0.0 || $count >= $this->_quantity) {
+ throw new InvalidPropertyValueException(
+ 'Invalid quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count
+ );
+ }
+ $result = new ReceiptItem();
+ $result->_description = $this->_description;
+ $result->_quantity = $count;
+ $result->_vatCode = $this->_vatCode;
+ $result->_amount = new MonetaryAmount(
+ $this->_amount->getValue(),
+ $this->_amount->getCurrency()
+ );
+ $this->_quantity -= $count;
+ return $result;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php
new file mode 100644
index 0000000..8c5728a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/ReceiptItemInterface.php
@@ -0,0 +1,53 @@
+ true,
+ self::SUCCEEDED => true,
+ self::CANCELED => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php
new file mode 100644
index 0000000..2b5bd0f
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Recipient.php
@@ -0,0 +1,85 @@
+_accountId;
+ }
+
+ /**
+ * Устанавливает идентификатор магазина
+ * @param string $value Идентификатор магазина
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение
+ */
+ public function setAccountId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty accountId value in Recipient', 0, 'Recipient.accountId');
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_accountId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid accountId value type in Recipient', 0, 'Recipient.accountId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор товара
+ * @return string Идентификатор товара
+ */
+ public function getGatewayId()
+ {
+ return $this->_gatewayId;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string $value Идентификатор товара
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение
+ */
+ public function setGatewayId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty gatewayId value in Recipient', 0, 'Recipient.gatewayId'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_gatewayId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid gatewayId value type in Recipient', 0, 'Recipient.gatewayId', $value
+ );
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php
new file mode 100644
index 0000000..6df4b3d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RecipientInterface.php
@@ -0,0 +1,24 @@
+_id;
+ }
+
+ /**
+ * Устанавливает идентификатор возврата
+ * @param string $value Идентификатор возврата
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент
+ * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой
+ */
+ public function setId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund id', 0, 'Refund.id');
+ } elseif (TypeCast::canCastToString($value)) {
+ $castedValue = (string)$value;
+ $length = mb_strlen($castedValue, 'utf-8');
+ if ($length === 36) {
+ $this->_id = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException('Invalid refund id value', 0, 'Refund.id', $value);
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid refund id value type', 0, 'Refund.id', $value);
+ }
+ }
+
+ /**
+ * Возвращает идентификатор платежа
+ * @return string Идентификатор платежа
+ */
+ public function getPaymentId()
+ {
+ return $this->_paymentId;
+ }
+
+ /**
+ * Устанавливает идентификатор платежа
+ * @param string $value Идентификатор платежа
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент
+ * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой
+ */
+ public function setPaymentId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund paymentId', 0, 'Refund.paymentId');
+ } elseif (TypeCast::canCastToString($value)) {
+ $castedValue = (string)$value;
+ $length = mb_strlen($castedValue, 'utf-8');
+ if ($length === 36) {
+ $this->_paymentId = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid refund paymentId value', 0, 'Refund.paymentId', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid refund paymentId value type', 0, 'Refund.paymentId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает статус текущего возврата
+ * @return string Статус возврата
+ */
+ public function getStatus()
+ {
+ return $this->_status;
+ }
+
+ /**
+ * Усианавливает стутус возврата платежа
+ * @param string $value Статус возврата платежа
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент
+ * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой
+ */
+ public function setStatus($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund status', 0, 'Refund.status');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ $castedValue = (string)$value;
+ if (RefundStatus::valueExists($castedValue)) {
+ $this->_status = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid refund status value', 0, 'Refund.status', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid refund status value type', 0, 'Refund.status', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает описание ошибки, если она есть, либо null
+ * @return RefundErrorInterface Инстанс объекта с описанием ошибки или null
+ */
+ public function getError()
+ {
+ return $this->_error;
+ }
+
+ /**
+ * Устанавливает информацию о ошибке проведения возврата
+ * @param RefundErrorInterface $value Инстанс объекта с описанием ошибки
+ */
+ public function setError(RefundErrorInterface $value)
+ {
+ $this->_error = $value;
+ }
+
+ /**
+ * Возвращает дату создания возврата
+ * @return \DateTime Время создания возврата
+ */
+ public function getCreatedAt()
+ {
+ return $this->_createdAt;
+ }
+
+ /**
+ * Устанавливает вермя создания возврата
+ * @param \DateTime $value Время создания возврата
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если быо передано пустое значение
+ * @throws InvalidPropertyValueException Выбрасывается если переданную строку или число не удалось интерпретировать
+ * как дату и время
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано значение невалидного типа
+ */
+ public function setCreatedAt($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund created_at value', 0, 'Refund.createdAt');
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException('Invalid created_at value', 0, 'Refund.createdAt', $value);
+ }
+ $this->_createdAt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid created_at value', 0, 'Refund.createdAt', $value);
+ }
+ }
+
+ /**
+ * Возвращает дату проведения возврата
+ * @return \DateTime|null Время проведения возврата
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданную строку или число не удалось интерпретировать
+ * как дату и время
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано значение невалидного типа
+ */
+ public function getAuthorizedAt()
+ {
+ return $this->_authorizedAt;
+ }
+
+ /**
+ * Устанавливает время проведения возврата
+ * @param \DateTime|null $value Время проведения возврата
+ *
+ *
+ */
+ public function setAuthorizedAt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedAt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException('Invalid authorizedAt value', 0, 'Refund.authorizedAt', $value);
+ }
+ $this->_authorizedAt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid authorizedAt value', 0, 'Refund.authorizedAt', $value);
+ }
+ }
+
+ /**
+ * Возвращает сумму возврата
+ * @return AmountInterface Сумма возврата
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Устанавливает сумму возврата
+ * @param AmountInterface $value Сумма возврата
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданная сумма меньше или равна нулю
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ if ($value->getIntegerValue() <= 0) {
+ throw new InvalidPropertyValueException('Invalid refund amount', 0, 'Refund.amount', $value->getValue());
+ }
+ $this->_amount = $value;
+ }
+
+ /**
+ * Возвращает статус регистрации чека
+ * @return string Статус регистрации чека
+ */
+ public function getReceiptRegistration()
+ {
+ return $this->_receiptRegistration;
+ }
+
+ /**
+ * Устанавливает статус регистрации чека
+ * @param string $value Статус регистрации чека
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент
+ * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой
+ */
+ public function setReceiptRegistration($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund receiptRegistration', 0, 'Refund.receiptRegistration');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ $castedValue = (string)$value;
+ if (ReceiptRegistrationStatus::valueExists($castedValue)) {
+ $this->_receiptRegistration = $castedValue;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid refund receiptRegistration value', 0, 'Refund.receiptRegistration', $value
+ );
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid refund receiptRegistration value type', 0, 'Refund.receiptRegistration', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает комментарий к возврату
+ * @return string Комментарий, основание для возврата средств покупателю
+ */
+ public function getComment()
+ {
+ return $this->_comment;
+ }
+
+ /**
+ * Устанавливает комментарий к возврату
+ * @param string $value Комментарий, основание для возврата средств покупателю
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если был передан пустой аргумент
+ * @throws InvalidPropertyValueException Выбрасывается если було передано невалидное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если аргумент не является строкой
+ */
+ public function setComment($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty refund comment', 0, 'Refund.comment');
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ $length = mb_strlen((string)$value, 'utf-8');
+ if ($length > 250) {
+ throw new InvalidPropertyValueException('Empty refund comment', 0, 'Refund.comment', $value);
+ }
+ $this->_comment = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException('Empty refund comment', 0, 'Refund.comment', $value);
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php
new file mode 100644
index 0000000..a0a2526
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundError.php
@@ -0,0 +1,62 @@
+_code;
+ }
+
+ /**
+ * @param string $value Код ошибки
+ */
+ public function setCode($value)
+ {
+ if ($value === null || $value === '') {
+ throw new \InvalidArgumentException('Invalid value');
+ }
+ $this->_code = (string)$value;
+ }
+
+ /**
+ * @return string Дополнительное текстовое пояснение ошибки
+ */
+ public function getDescription()
+ {
+ return $this->_description;
+ }
+
+ /**
+ * @param string $value Дополнительное текстовое пояснение ошибки
+ */
+ public function setDescription($value)
+ {
+ $this->_description = (string)$value;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php
new file mode 100644
index 0000000..a1fbe18
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/RefundErrorInterface.php
@@ -0,0 +1,24 @@
+ true,
+ self::SUCCEEDED => true,
+ self::CANCELED => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php
new file mode 100644
index 0000000..c7e1558
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Model/Status.php
@@ -0,0 +1,21 @@
+ true,
+ self::PENDING => true,
+ self::CANCELED => true,
+ );
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php
new file mode 100644
index 0000000..c04c3c5
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequest.php
@@ -0,0 +1,257 @@
+_accountId;
+ }
+
+ /**
+ * Проверяет, был ли установлен идентификатор магазина
+ * @return bool True если идентификатор магазина был установлен, false если нет
+ */
+ public function hasAccountId()
+ {
+ return $this->_accountId !== null;
+ }
+
+ /**
+ * Устанавливает идентификатор магазина
+ * @param string|null $value Значение идентификатора магазина, null если требуется удалить значение
+ */
+ public function setAccountId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_accountId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_accountId = (string)$value;
+ } else {
+ throw new \InvalidArgumentException('Invalid account_id value type "' . gettype($value) . '"');
+ }
+ }
+
+ /**
+ * Возвращает идентификатор товара
+ * @return string Идентификатор товара
+ */
+ public function getGatewayId()
+ {
+ return $this->_gatewayId;
+ }
+
+ /**
+ * Проверяет, был ли установлен идентификатор товара
+ * @return bool True если идентификатор товара был установлен, false если нет
+ */
+ public function hasGatewayId()
+ {
+ return !empty($this->_gatewayId);
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Значение идентификатора товара, null если требуется удалить значение
+ */
+ public function setGatewayId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_gatewayId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_gatewayId = (string)$value;
+ } else {
+ throw new \InvalidArgumentException('Invalid gateway_id value type "' . gettype($value) . '"');
+ }
+ }
+
+ /**
+ * Возвращает сумму заказа
+ * @return string Сумма заказа
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Проверяет, была ли установлена сумма заказа
+ * @return bool True если сумма заказа была установлена, false если нет
+ */
+ public function hasAmount()
+ {
+ return !empty($this->_amount);
+ }
+
+ /**
+ * Устанавливает сумму платежа
+ * @param string|null $value Сумма платежа, null если требуется удалить значение
+ */
+ public function setAmount($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_amount = null;
+ } else {
+ if (!is_scalar($value)) {
+ if (!is_object($value) || !method_exists($value, '__toString')) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid amount value type', 0, 'amount.value', $value
+ );
+ }
+ $value = (string)$value;
+ }
+ if (!is_numeric($value) || $value < 0.0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid amount value "' . $value . '"', 0, 'amount.value', $value
+ );
+ } elseif ($value < 0.01) {
+ $this->_amount = null;
+ } else {
+ $this->_amount = (string)round($value, 2);
+ }
+ }
+ }
+
+ /**
+ * Возвращает код валюты, в которой осуществляется покупка
+ * @return string Код валюты
+ */
+ public function getCurrency()
+ {
+ return $this->_currency;
+ }
+
+ /**
+ * Проверяет был ли установлен код валюты
+ * @return bool True если код валюты был установлен, false если нет
+ */
+ public function hasCurrency()
+ {
+ return !empty($this->_currency);
+ }
+
+ /**
+ * Устанавливает код валюты в которой требуется провести платёж
+ * @param string $value Код валюты, null если требуется удалить значение
+ */
+ public function setCurrency($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_currency = null;
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ $value = strtoupper($value);
+ if (!CurrencyCode::valueExists($value)) {
+ throw new \InvalidArgumentException('Invalid currency value: "' . $value . '"');
+ }
+ $this->_currency = $value;
+ } else {
+ throw new \InvalidArgumentException('Invalid currency value type: "' . gettype($value) . '"');
+ }
+ }
+
+ /**
+ * Возвращает сценарий подтверждения платежа, для которого запрашивается список способов оплаты
+ * @return string Сценарий подтверждения платежа
+ */
+ public function getConfirmationType()
+ {
+ return $this->_confirmationTypes;
+ }
+
+ /**
+ * Проверяет был ли установлен сценарий подтверждения платежа
+ * @return bool True если сценарий подтверждения платежа был установлен, false если нет
+ */
+ public function hasConfirmationType()
+ {
+ return !empty($this->_confirmationTypes);
+ }
+
+ /**
+ * Устанавливает сценарий подтверждения платежа, для которого запрашивается список способов оплаты
+ * @param string $value Сценарий подтверждения платежа
+ */
+ public function setConfirmationType($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_confirmationTypes = null;
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (!ConfirmationType::valueExists((string)$value)) {
+ throw new \InvalidArgumentException('Invalid confirmation_type value: "' . $value . '"');
+ }
+ $this->_confirmationTypes = $value;
+ } else {
+ throw new \InvalidArgumentException('Invalid confirmation_type value type: "' . gettype($value) . '"');
+ }
+ }
+
+ /**
+ * Валидирует текущий запрос, проверяет все ли нужные свойства установлены
+ * @return bool True если запрос валиден, false если нет
+ */
+ public function validate()
+ {
+ if (empty($this->_accountId)) {
+ $this->setValidationError('Account id not specified');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Возвращает инстанс билдера объектов запросов списока способов оплаты
+ * @return PaymentOptionsRequestBuilder Билдер запросов списока способов оплаты
+ */
+ public static function builder()
+ {
+ return new PaymentOptionsRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php
new file mode 100644
index 0000000..01bf9a9
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestBuilder.php
@@ -0,0 +1,102 @@
+currentObject->setAccountId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Значение идентификатора товара, null если требуется удалить значение
+ * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов
+ */
+ public function setGatewayId($value)
+ {
+ $this->currentObject->setGatewayId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает сумму платежа
+ * @param string|AmountInterface|null $value Сумма платежа, null если требуется удалить значение
+ * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов
+ */
+ public function setAmount($value)
+ {
+ if (empty($value)) {
+ $this->currentObject->setAmount(null);
+ } elseif ($value instanceof AmountInterface) {
+ if ($value->getValue() > 0.0) {
+ $this->currentObject->setAmount($value->getValue());
+ }
+ $this->currentObject->setCurrency($value->getCurrency());
+ } else {
+ $this->currentObject->setAmount($value);
+ }
+ return $this;
+ }
+
+ /**
+ * Устанавливает код валюты в которой требуется провести платёж
+ * @param string $value Код валюты, null если требуется удалить значение
+ * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов
+ */
+ public function setCurrency($value)
+ {
+ $this->currentObject->setCurrency($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает сценарий подтверждения платежа, для которого запрашивается список способов оплаты
+ * @param string $value Сценарий подтверждения платежа
+ * @return PaymentOptionsRequestBuilder Инстанс текущего билдера запросов
+ */
+ public function setConfirmationType($value)
+ {
+ $this->currentObject->setConfirmationType($value);
+ return $this;
+ }
+
+ /**
+ * Собирает и возвращает готовый объект запроса получения списка возможных способов оплаты
+ * @param array|null $options Массив для устанавливаемых значений
+ * @return PaymentOptionsRequestInterface Инстанс объекта запроса
+ */
+ public function build(array $options = null)
+ {
+ return parent::build($options);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php
new file mode 100644
index 0000000..d0002db
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsRequestInterface.php
@@ -0,0 +1,77 @@
+ $request->getAccountId(),
+ );
+ if ($request->hasGatewayId()) {
+ $result['gateway_id'] = $request->getGatewayId();
+ }
+ if ($request->hasAmount()) {
+ $result['amount'] = $request->getAmount();
+ }
+ if ($request->hasCurrency()) {
+ $result['currency'] = $request->getCurrency();
+ }
+ if ($request->hasConfirmationType()) {
+ $result['confirmation_types'] = $request->getConfirmationType();
+ }
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php
new file mode 100644
index 0000000..aadb869
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponse.php
@@ -0,0 +1,44 @@
+_items = array();
+ foreach ($response['items'] as $item) {
+ $this->_items[] = new PaymentOptionsResponseItem($item);
+ }
+ }
+
+ /**
+ * Возаращает список способов оплаты подходящих для оплаты заказа
+ * Если нет ни одного доступного способа оплаты, список будет пустым
+ * @return PaymentOptionsResponseItem[] Список способов оплаты
+ */
+ public function getItems()
+ {
+ return $this->_items;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php
new file mode 100644
index 0000000..93126c0
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/PaymentOptionsResponseItem.php
@@ -0,0 +1,118 @@
+_paymentMethodType = $options['payment_method_type'];
+ $this->_confirmationTypes = array();
+ foreach ($options['confirmation_types'] as $opt) {
+ $this->_confirmationTypes[] = $opt;
+ }
+
+ $this->_charge = new MonetaryAmount($options['charge']['value'], $options['charge']['currency']);
+ $this->_fee = new MonetaryAmount();
+ if (!empty($options['fee'])) {
+ $this->_fee->setValue($options['fee']['value']);
+ $this->_fee->setCurrency($options['fee']['currency']);
+ } else {
+ $this->_fee->setCurrency($options['charge']['currency']);
+ }
+
+ $this->_extraFee = false;
+ if (!empty($options['extra_fee'])) {
+ $this->_extraFee = (bool)$options['extra_fee'];
+ }
+ }
+
+ /**
+ * Возвращает тип источника средств для проведения платежа
+ * @return string Тип источника средств для проведения платежа
+ * @see PaymentMethodType
+ */
+ public function getPaymentMethodType()
+ {
+ return $this->_paymentMethodType;
+ }
+
+ /**
+ * Возвращает список возможных сценариев подтверждения платежа
+ * @return string[] Список возможных сценариев подтверждения платежа
+ * @see ConfirmationType
+ */
+ public function getConfirmationTypes()
+ {
+ return $this->_confirmationTypes;
+ }
+
+ /**
+ * Возвращает сумму платежа
+ * @return AmountInterface Сумма платежа
+ */
+ public function getCharge()
+ {
+ return $this->_charge;
+ }
+
+ /**
+ * Возвращает сумму дополнительной комиссии при проведении платежа с помощью текущего способа оплаты
+ * @return AmountInterface Сумма комиссии
+ */
+ public function getFee()
+ {
+ return $this->_fee;
+ }
+
+ /**
+ * Возвращает признак присутствия дополнительной комиссии на стороне партнера
+ * @return bool True если комиссия на стороне партнёра имеется, false если нет
+ */
+ public function getExtraFee()
+ {
+ return $this->_extraFee;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php
new file mode 100644
index 0000000..262a7c8
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/AbstractPaymentResponse.php
@@ -0,0 +1,115 @@
+setId($paymentInfo['id']);
+ $this->setStatus($paymentInfo['status']);
+ $this->setAmount($this->factoryAmount($paymentInfo['amount']));
+ $this->setCreatedAt($paymentInfo['created_at']);
+ $this->setPaid($paymentInfo['paid']);
+ if (!empty($paymentInfo['payment_method'])) {
+ $this->setPaymentMethod($this->factoryPaymentMethod($paymentInfo['payment_method']));
+ }
+
+ if (!empty($paymentInfo['error'])) {
+ $error = new PaymentError();
+ $error->setCode($paymentInfo['error']['code']);
+ if (!empty($paymentInfo['error']['description'])) {
+ $error->setDescription($paymentInfo['error']['description']);
+ }
+ $this->setError($error);
+ }
+ /* @todo не устанавливаем пока реципиента
+ if (!empty($paymentInfo['recipient'])) {
+ $recipient = new Recipient();
+ $recipient->setAccountId($paymentInfo['recipient']['account_id']);
+ $recipient->setGatewayId($paymentInfo['recipient']['gateway_id']);
+ $this->setRecipient($recipient);
+ }
+ */
+ if (!empty($paymentInfo['captured_at'])) {
+ $this->setCapturedAt(strtotime($paymentInfo['captured_at']));
+ }
+ if (!empty($paymentInfo['confirmation'])) {
+ if ($paymentInfo['confirmation']['type'] === ConfirmationType::REDIRECT) {
+ $confirmation = new ConfirmationRedirect();
+ $confirmation->setConfirmationUrl($paymentInfo['confirmation']['confirmation_url']);
+ if (empty($paymentInfo['confirmation']['enforce'])) {
+ $confirmation->setEnforce(false);
+ } else {
+ $confirmation->setEnforce($paymentInfo['confirmation']['enforce']);
+ }
+ if (!empty($paymentInfo['confirmation']['return_url'])) {
+ $confirmation->setReturnUrl($paymentInfo['confirmation']['return_url']);
+ }
+ } else {
+ $confirmation = new ConfirmationExternal();
+ }
+ $this->setConfirmation($confirmation);
+ }
+ if (!empty($paymentInfo['refunded_amount'])) {
+ $this->setRefundedAmount($this->factoryAmount($paymentInfo['refunded_amount']));
+ }
+ if (!empty($paymentInfo['receipt_registration'])) {
+ $this->setReceiptRegistration($paymentInfo['receipt_registration']);
+ }
+ if (!empty($paymentInfo['metadata'])) {
+ $metadata = new Metadata();
+ foreach ($paymentInfo['metadata'] as $key => $value) {
+ $metadata->offsetSet($key, $value);
+ }
+ $this->setMetadata($metadata);
+ }
+ }
+
+ /**
+ * Фабричный метод для создания способа оплаты
+ * @param array $options Настройки способа оплаты в массиве
+ * @return AbstractPaymentMethod Инстанс способа оплаты нужного типа
+ */
+ private function factoryPaymentMethod($options)
+ {
+ $factory = new PaymentMethodFactory();
+ return $factory->factoryFromArray($options);
+ }
+
+ /**
+ * Фабричный метод создания суммы
+ * @param array $options Сумма в виде ассоциативного массива
+ * @return AmountInterface Созданный инстанс суммы
+ */
+ private function factoryAmount($options)
+ {
+ $amount = new MonetaryAmount(null, $options['currency']);
+ if ($options['value'] > 0) {
+ $amount->setValue($options['value']);
+ }
+ return $amount;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php
new file mode 100644
index 0000000..5bcd8be
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequest.php
@@ -0,0 +1,561 @@
+_recipient;
+ }
+
+ /**
+ * Проверяет наличие получателя платежа в запросе
+ * @return bool True если получатель платежа задан, false если нет
+ */
+ public function hasRecipient()
+ {
+ return !empty($this->_recipient);
+ }
+
+ /**
+ * Возвращает сумму заказа
+ * @return AmountInterface Сумма заказа
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Устанавливает сумму платежа
+ * @param AmountInterface $value Сумма платежа
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * Возвращает чек, если он есть
+ * @return ReceiptInterface|null Данные фискального чека 54-ФЗ или null если чека нет
+ */
+ public function getReceipt()
+ {
+ return $this->_receipt;
+ }
+
+ /**
+ * Устанавливает чек
+ * @param ReceiptInterface $value Данные фискального чека 54-ФЗ
+ */
+ public function setReceipt(ReceiptInterface $value)
+ {
+ $this->_receipt = $value;
+ }
+
+ /**
+ * Проверяет наличие чека в создаваемом платеже
+ * @return bool True если чек есть, false если нет
+ */
+ public function hasReceipt()
+ {
+ return $this->_receipt !== null;
+ }
+
+ /**
+ * Удаляет чек из запроса
+ */
+ public function removeReceipt()
+ {
+ $this->_receipt = null;
+ }
+
+ /**
+ * Устанавливает объект с информацией о получателе платежа
+ * @param RecipientInterface|null $value Инстанс объекта информации о получателе платежа или null
+ */
+ public function setRecipient($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_recipient = null;
+ } elseif (is_object($value) && $value instanceof RecipientInterface) {
+ $this->_recipient = $value;
+ } else {
+ throw new \InvalidArgumentException('Invalid recipient value type');
+ }
+ }
+
+ /**
+ * Возвращает одноразовый токен для проведения оплаты
+ * @return string Одноразовый токен для проведения оплаты, сформированный Yandex.Checkout JS widget
+ */
+ public function getPaymentToken()
+ {
+ return $this->_paymentToken;
+ }
+
+ /**
+ * Проверяет наличие одноразового токена для проведения оплаты
+ * @return bool True если токен установлен, false если нет
+ */
+ public function hasPaymentToken()
+ {
+ return !empty($this->_paymentToken);
+ }
+
+ /**
+ * Устанавливает одноразовый токен для проведения оплаты, сформированный Yandex.Checkout JS widget
+ * @param string $value Одноразовый токен для проведения оплаты
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение длинее 200 символов
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой
+ */
+ public function setPaymentToken($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_paymentToken = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen((string)$value, 'utf-8');
+ if ($length > 200) {
+ throw new InvalidPropertyValueException(
+ 'Invalid paymentToken value', 0, 'CreatePaymentRequest.paymentToken', $value
+ );
+ }
+ $this->_paymentToken = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid paymentToken value type', 0, 'CreatePaymentRequest.paymentToken', $value
+ );
+ }
+ }
+
+ /**
+ * Устанавливает идентификатор закиси платёжных данных покупателя
+ * @return string Идентификатор записи о сохраненных платежных данных покупателя
+ */
+ public function getPaymentMethodId()
+ {
+ return $this->_paymentMethodId;
+ }
+
+ /**
+ * Проверяет наличие идентификатора записи о платёжных данных покупателя
+ * @return bool True если идентификатор задан, false если нет
+ */
+ public function hasPaymentMethodId()
+ {
+ return !empty($this->_paymentMethodId);
+ }
+
+ /**
+ * Устанавливает идентификатор записи о сохранённых данных покупателя
+ * @param string $value Идентификатор записи о сохраненных платежных данных покупателя
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданные значение не является строкой или null
+ */
+ public function setPaymentMethodId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_paymentMethodId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_paymentMethodId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid paymentMethodId value type in CreatePaymentRequest',
+ 0,
+ 'CreatePaymentRequest.CreatePaymentRequest',
+ $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает данные для создания метода оплаты
+ * @return AbstractPaymentData Данные используемые для создания метода оплаты
+ */
+ public function getPaymentMethodData()
+ {
+ return $this->_paymentMethodData;
+ }
+
+ /**
+ * Проверяет установлен ли объект с методом оплаты
+ * @return bool True если объект метода оплаты установлен, false если нет
+ */
+ public function hasPaymentMethodData()
+ {
+ return !empty($this->_paymentMethodData);
+ }
+
+ /**
+ * Устанавливает объект с информацией для создания метода оплаты
+ * @param AbstractPaymentData|null $value Объект с создания метода оплаты или null
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если был передан объект невалидного типа
+ */
+ public function setPaymentMethodData($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_paymentMethodData = null;
+ } elseif (is_object($value) && $value instanceof AbstractPaymentData) {
+ $this->_paymentMethodData = $value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid paymentMethodData value type in CreatePaymentRequest',
+ 0,
+ 'CreatePaymentRequest.paymentMethodData',
+ $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает способ подтверждения платежа
+ * @return AbstractConfirmationAttributes Способ подтверждения платежа
+ */
+ public function getConfirmation()
+ {
+ return $this->_confirmation;
+ }
+
+ /**
+ * Проверяет был ли установлен способ подтверждения платежа
+ * @return bool True если способ подтверждения платежа был установлен, false если нет
+ */
+ public function hasConfirmation()
+ {
+ return $this->_confirmation !== null;
+ }
+
+ /**
+ * Устанавливает способ подтверждения платежа
+ * @param AbstractConfirmationAttributes|null $value Способ подтверждения платежа
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является объектом типа
+ * AbstractConfirmationAttributes или null
+ */
+ public function setConfirmation($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_confirmation = null;
+ } elseif (is_object($value) && $value instanceof AbstractConfirmationAttributes) {
+ $this->_confirmation = $value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid confirmation value type in CreatePaymentRequest',
+ 0,
+ 'CreatePaymentRequest.confirmation',
+ $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает флаг сохранения платёжных данных
+ * @return bool Флаг сохранения платёжных данных
+ */
+ public function getSavePaymentMethod()
+ {
+ return $this->_savePaymentMethod;
+ }
+
+ /**
+ * Проверяет был ли установлен флаг сохранения платёжных данных
+ * @return bool True если флыг был установлен, false если нет
+ */
+ public function hasSavePaymentMethod()
+ {
+ return $this->_savePaymentMethod !== null;
+ }
+
+ /**
+ * Устанавливает флаг сохранения платёжных данных. Значение true инициирует создание многоразового payment_method.
+ * @param bool $value Сохранить платежные данные для последующего использования
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool
+ */
+ public function setSavePaymentMethod($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_savePaymentMethod = null;
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_savePaymentMethod = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid savePaymentMethod value type in CreatePaymentRequest',
+ 0,
+ 'CreatePaymentRequest.savePaymentMethod',
+ $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает флаг автоматического принятия поступившей оплаты
+ * @return bool True если требуется автоматически принять поступившую оплату, false если нет
+ */
+ public function getCapture()
+ {
+ return $this->_capture;
+ }
+
+ /**
+ * Проверяет был ли установлен флаг автоматического приняти поступившей оплаты
+ * @return bool True если флаг автоматического принятия оплаты был установлен, false если нет
+ */
+ public function hasCapture()
+ {
+ return $this->_capture !== null;
+ }
+
+ /**
+ * Устанавливает флаг автоматического принятия поступившей оплаты
+ * @param bool $value Автоматически принять поступившую оплату
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool
+ */
+ public function setCapture($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_capture = null;
+ } elseif (TypeCast::canCastToBoolean($value)) {
+ $this->_capture = (bool)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid capture value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.capture', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает IPv4 или IPv6-адрес покупателя
+ * @return string IPv4 или IPv6-адрес покупателя
+ */
+ public function getClientIp()
+ {
+ return $this->_clientIp;
+ }
+
+ /**
+ * Проверяет был ли установлен IPv4 или IPv6-адрес покупателя
+ * @return bool True если IP адрес покупателя был установлен, false если нет
+ */
+ public function hasClientIp()
+ {
+ return $this->_clientIp !== null;
+ }
+
+ /**
+ * Устанавливает IP адрес покупателя
+ * @param string $value IPv4 или IPv6-адрес покупателя
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не является строкой
+ */
+ public function setClientIp($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_clientIp = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_clientIp = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid clientIp value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.clientIp', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает данные оплаты установленные мерчантом
+ * @return Metadata Метаданные, привязанные к платежу
+ */
+ public function getMetadata()
+ {
+ return $this->_metadata;
+ }
+
+ /**
+ * Проверяет были ли установлены метаданные заказа
+ * @return bool True если метаданные были установлены, false если нет
+ */
+ public function hasMetadata()
+ {
+ return !empty($this->_metadata) && $this->_metadata->count() > 0;
+ }
+
+ /**
+ * Устанавливает метаданные, привязанные к платежу
+ * @param Metadata|null $value Метаданные платежа, устанавливаемые мерчантом
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданные данные не удалось интерпретировать как
+ * метаданные платежа
+ */
+ public function setMetadata($value)
+ {
+ if ($value === null || (is_array($value) && empty($value))) {
+ $this->_metadata = null;
+ } elseif (is_object($value) && $value instanceof Metadata) {
+ $this->_metadata = $value;
+ } elseif (is_array($value)) {
+ $this->_metadata = new Metadata();
+ foreach ($value as $key => $val) {
+ $this->_metadata->offsetSet($key, (string)$val);
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid metadata value type in CreatePaymentRequest', 0, 'CreatePaymentRequest.metadata', $value
+ );
+ }
+ }
+
+ /**
+ * Проверяет на валидность текущий объект
+ * @return bool True если объект запроса валиден, false если нет
+ */
+ public function validate()
+ {
+ $amount = $this->_amount;
+ if ($amount === null) {
+ $this->setValidationError('Payment amount not specified');
+ return false;
+ }
+ if ($amount->getValue() <= 0.0) {
+ $this->setValidationError('Invalid payment amount value: ' . $amount->getValue());
+ return false;
+ }
+ if ($this->_receipt !== null && $this->_receipt->notEmpty()) {
+ $email = $this->_receipt->getEmail();
+ $phone = $this->_receipt->getPhone();
+ if (empty($email) && empty($phone)) {
+ $this->setValidationError('Both email and phone values are empty in receipt');
+ return false;
+ }
+ if ($this->_receipt->getTaxSystemCode() === null) {
+ foreach ($this->_receipt->getItems() as $item) {
+ if ($item->getVatCode() === null) {
+ $this->setValidationError('Item vat_id and receipt tax_system_id not specified');
+ return false;
+ }
+ }
+ }
+ }
+ if ($this->hasPaymentToken()) {
+ if ($this->hasPaymentMethodId()) {
+ $this->setValidationError('Both paymentToken and paymentMethodID values are specified');
+ return false;
+ }
+ if ($this->hasPaymentMethodData()) {
+ $this->setValidationError('Both paymentToken and paymentData values are specified');
+ return false;
+ }
+ } elseif ($this->hasPaymentMethodId()) {
+ if ($this->hasPaymentMethodData()) {
+ $this->setValidationError('Both paymentMethodID and paymentData values are specified');
+ return false;
+ }
+ } /* elseif (!$this->hasPaymentMethodData()) {
+ $this->setValidationError('Payment method not specified, set paymentToken, paymentMethodID or paymentData');
+ return false;
+ }*/
+ return true;
+ }
+
+ /**
+ * Возвращает билдер объектов запросов создания платежа
+ * @return CreatePaymentRequestBuilder Инстанс билдера объектов запрсов
+ */
+ public static function builder()
+ {
+ return new CreatePaymentRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php
new file mode 100644
index 0000000..7e63547
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestBuilder.php
@@ -0,0 +1,447 @@
+recipient = new Recipient();
+ $this->receipt = new Receipt();
+ $this->amount = new MonetaryAmount();
+
+ return $request;
+ }
+
+ /**
+ * Устанавливает идентификатор магазина получателя платежа
+ * @param string $value Идентификатор магазина
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение
+ */
+ public function setAccountId($value)
+ {
+ $this->recipient->setAccountId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string $value Идентификатор товара
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение
+ */
+ public function setGatewayId($value)
+ {
+ $this->recipient->setGatewayId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает сумму заказа
+ * @param AmountInterface|string $value Сумма заказа
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение
+ * @throws InvalidPropertyValueException Выбрасывается если был передан ноль или отрицательное значение
+ * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не строковое значение
+ */
+ public function setAmount($value)
+ {
+ if ($value instanceof AmountInterface) {
+ $this->amount->setValue($value->getValue());
+ $this->amount->setCurrency($value->getCurrency());
+ } elseif ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty payment amount value', 0, 'CreatePaymentRequest.amount');
+ } elseif (!is_numeric($value)) {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid payment amount value type', 0, 'CreatePaymentRequest.amount', $value
+ );
+ } elseif ($value > 0) {
+ $this->amount->setValue($value);
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid payment amount value', 0, 'CreatePaymentRequest.amount', $value
+ );
+ }
+ return $this;
+ }
+
+ /**
+ * Устанавливает валюту в которой заказ оплачивается
+ * @param string $value Код валюты заказа
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты
+ */
+ public function setCurrency($value)
+ {
+ $this->amount->setCurrency($value);
+ foreach ($this->receipt->getItems() as $item) {
+ $item->getPrice()->setCurrency($value);
+ }
+ return $this;
+ }
+
+ /**
+ * Устанавлвиает список товаров в заказе для создания чека
+ * @param array $value Массив товаров в заказе
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если хотя бы один из товаров имеет неверную структуру
+ */
+ public function setReceiptItems($value)
+ {
+ $this->receipt->setItems(array());
+ $index = 0;
+ foreach ($value as $item) {
+ if ($item instanceof ReceiptItemInterface) {
+ $this->receipt->addItem($item);
+ } else {
+ if (empty($item['title']) && empty($item['description'])) {
+ throw new InvalidPropertyValueException(
+ 'Item#' . $index . ' title or description not specified',
+ 0,
+ 'CreatePaymentRequest.items[' . $index . '].title',
+ json_encode($item)
+ );
+ }
+ if (empty($item['price'])) {
+ throw new InvalidPropertyValueException(
+ 'Item#' . $index . ' price not specified',
+ 0,
+ 'CreatePaymentRequest.items[' . $index . '].price',
+ json_encode($item)
+ );
+ }
+ $this->addReceiptItem(
+ empty($item['title']) ? $item['description'] : $item['title'],
+ $item['price'],
+ empty($item['quantity']) ? 1.0 : $item['quantity'],
+ empty($item['vatCode']) ? null : $item['vatCode']
+ );
+ }
+ $index++;
+ }
+ return $this;
+ }
+
+ /**
+ * Добавляет в чек товар
+ * @param string $title Название или описание товара
+ * @param string $price Цена товара в валюте, заданной в заказе
+ * @param float $quantity Количество покупаемого товара
+ * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ */
+ public function addReceiptItem($title, $price, $quantity = 1.0, $vatCode = null)
+ {
+ $item = new ReceiptItem();
+ $item->setDescription($title);
+ $item->setQuantity($quantity);
+ $item->setVatCode($vatCode);
+ $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency()));
+ $this->receipt->addItem($item);
+ return $this;
+ }
+
+ /**
+ * Добавляет в чек доставку товара
+ * @param string $title Название доставки в чеке
+ * @param string $price Стоимость доставки
+ * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ */
+ public function addReceiptShipping($title, $price, $vatCode = null)
+ {
+ $item = new ReceiptItem();
+ $item->setDescription($title);
+ $item->setQuantity(1);
+ $item->setVatCode($vatCode);
+ $item->setIsShipping(true);
+ $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency()));
+ $this->receipt->addItem($item);
+ return $this;
+ }
+
+ /**
+ * Устанавливает адрес электронной почты получателя чека
+ * @param string $value Email получателя чека
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ */
+ public function setReceiptEmail($value)
+ {
+ $this->receipt->setEmail($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает телефон получателя чека
+ * @param string $value Телефон получателя чека
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если был передан не телефон, а что-то другое
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ */
+ public function setReceiptPhone($value)
+ {
+ $this->receipt->setPhone($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает код системы налогообложения.
+ * @param int $value Код системы налогообложения. Число 1-6.
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число
+ * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести
+ */
+ public function setTaxSystemCode($value)
+ {
+ $this->receipt->setTaxSystemCode($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает одноразовый токен для проведения оплаты
+ * @param string $value Одноразовый токен для проведения оплаты
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение длинее 200 символов
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является строкой
+ */
+ public function setPaymentToken($value)
+ {
+ $this->currentObject->setPaymentToken($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор записи о сохранённых данных покупателя
+ * @param string $value Идентификатор записи о сохраненных платежных данных покупателя
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданные значение не является строкой или null
+ */
+ public function setPaymentMethodId($value)
+ {
+ $this->currentObject->setPaymentMethodId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает объект с информацией для создания метода оплаты
+ * @param AbstractPaymentData|string|array|null $value Объект с создания метода оплаты или null
+ * @param array $options Настройки способа оплаты в виде ассоциативного массива
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если был передан объект невалидного типа
+ */
+ public function setPaymentMethodData($value, array $options = null)
+ {
+ if (is_string($value) && $value !== '') {
+ if (empty($options)) {
+ $value = $this->getPaymentDataFactory()->factory($value);
+ } else {
+ $value = $this->getPaymentDataFactory()->factoryFromArray($options, $value);
+ }
+ } elseif (is_array($value)) {
+ $value = $this->getPaymentDataFactory()->factoryFromArray($value);
+ }
+ $this->currentObject->setPaymentMethodData($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает способ подтверждения платежа
+ * @param AbstractConfirmationAttributes|string|array|null $value Способ подтверждения платежа
+ * @param array|null $options Настройки способа подтверждения платежа в виде массива
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданное значение не является объектом типа
+ * AbstractConfirmationAttributes или null
+ */
+ public function setConfirmation($value, array $options = null)
+ {
+ if (is_string($value) && $value !== '') {
+ if (empty($options)) {
+ $value = $this->getConfirmationFactory()->factory($value);
+ } else {
+ $value = $this->getConfirmationFactory()->factoryFromArray($options, $value);
+ }
+ } elseif (is_array($value)) {
+ $value = $this->getConfirmationFactory()->factoryFromArray($value);
+ }
+ $this->currentObject->setConfirmation($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает флаг сохранения платёжных данных. Значение true инициирует создание многоразового payment_method.
+ * @param bool $value Сохранить платежные данные для последующего использования
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool
+ */
+ public function setSavePaymentMethod($value)
+ {
+ $this->currentObject->setSavePaymentMethod($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает флаг автоматического принятия поступившей оплаты
+ * @param bool $value Автоматически принять поступившую оплату
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если переданный аргумент не кастится в bool
+
+ */
+ public function setCapture($value)
+ {
+ $this->currentObject->setCapture($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает IP адрес покупателя
+ * @param string $value IPv4 или IPv6-адрес покупателя
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент не является строкой
+ */
+ public function setClientIp($value)
+ {
+ $this->currentObject->setClientIp($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает метаданные, привязанные к платежу
+ * @param Metadata|null $value Метаданные платежа, устанавливаемые мерчантом
+ * @return CreatePaymentRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданные данные не удалось интерпретировать как
+ * метаданные платежа
+ */
+ public function setMetadata($value)
+ {
+ $this->currentObject->setMetadata($value);
+ return $this;
+ }
+
+ /**
+ * Строит и возвращает объект запроса для отправки в API яндекс денег
+ * @param array|null $options Массив параметров для установки в объект запроса
+ * @return CreatePaymentRequestInterface Инстанс объекта запроса
+ *
+ * @throws InvalidRequestException Выбрасывается если собрать объект запроса не удалось
+ */
+ public function build(array $options = null)
+ {
+ if (!empty($options)) {
+ $this->setOptions($options);
+ }
+ $accountId = $this->recipient->getAccountId();
+ $gatewayId = $this->recipient->getGatewayId();
+ if (!empty($accountId) && !empty($gatewayId)) {
+ $this->currentObject->setRecipient($this->recipient);
+ }
+ if ($this->receipt->notEmpty()) {
+ $this->currentObject->setReceipt($this->receipt);
+ }
+ $this->currentObject->setAmount($this->amount);
+ return parent::build();
+ }
+
+ /**
+ * Возвращает фабрику методов проведения платежей
+ * @return PaymentDataFactory Фабрика методов проведения платежей
+ */
+ protected function getPaymentDataFactory()
+ {
+ if ($this->paymentDataFactory === null) {
+ $this->paymentDataFactory = new PaymentDataFactory();
+ }
+ return $this->paymentDataFactory;
+ }
+
+ /**
+ * Возвращает фабрику для создания методов подтверждения платежей
+ * @return ConfirmationAttributesFactory Фабрика объектов методов подтверждения платежей
+ */
+ protected function getConfirmationFactory()
+ {
+ if ($this->confirmationFactory === null) {
+ $this->confirmationFactory = new ConfirmationAttributesFactory();
+ }
+ return $this->confirmationFactory;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php
new file mode 100644
index 0000000..e36c803
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentRequestInterface.php
@@ -0,0 +1,157 @@
+ 'referenceId',
+ 'payment_token' => 'paymentToken',
+ 'payment_method_id' => 'paymentMethodId',
+ 'save_payment_method' => 'savePaymentMethod',
+ 'capture' => 'capture',
+ 'client_ip' => 'clientIp',
+ );
+
+ private static $paymentDataSerializerMap = array(
+ PaymentMethodType::BANK_CARD => 'serializePaymentDataBankCard',
+ PaymentMethodType::YANDEX_MONEY => 'serializePaymentDataYandexWallet',
+ PaymentMethodType::APPLE_PAY => 'serializePaymentDataMobile',
+ PaymentMethodType::ANDROID_PAY => 'serializePaymentDataMobile',
+ PaymentMethodType::SBERBANK => 'serializePaymentDataSberbank',
+ PaymentMethodType::ALFABANK => 'serializePaymentDataAlfabank',
+ PaymentMethodType::WEBMONEY => 'serializePaymentData',
+ PaymentMethodType::QIWI => 'serializePaymentDataMobilePhone',
+ PaymentMethodType::CASH => 'serializePaymentDataMobilePhone',
+ PaymentMethodType::MOBILE_BALANCE => 'serializePaymentDataMobilePhone',
+ );
+
+ public function serialize(CreatePaymentRequestInterface $request)
+ {
+ $result = array(
+ 'amount' => $this->serializeAmount($request->getAmount()),
+ );
+ if ($request->hasReceipt()) {
+ $receipt = $request->getReceipt();
+ if ($receipt->notEmpty()) {
+ $result['receipt'] = array();
+ foreach ($receipt->getItems() as $item) {
+ $vatId = $item->getVatCode();
+ if ($vatId === null) {
+ $vatId = $receipt->getTaxSystemCode();
+ }
+ $result['receipt']['items'][] = array(
+ 'description' => $item->getDescription(),
+ 'amount' => $this->serializeAmount($item->getPrice()),
+ 'quantity' => $item->getQuantity(),
+ 'vat_code' => $vatId,
+ );
+ }
+ $value = $receipt->getEmail();
+ if (!empty($value)) {
+ $result['receipt']['email'] = $value;
+ }
+ $value = $receipt->getPhone();
+ if (!empty($value)) {
+ $result['receipt']['phone'] = $value;
+ }
+ $value = $receipt->getTaxSystemCode();
+ if (!empty($value)) {
+ $result['receipt']['tax_system_code'] = $value;
+ }
+ }
+ }
+ if ($request->hasRecipient()) {
+ $result['recipient']['account_id'] = $request->getRecipient()->getAccountId();
+ $result['recipient']['gateway_id'] = $request->getRecipient()->getGatewayId();
+ }
+ if ($request->hasPaymentMethodData()) {
+ $method = self::$paymentDataSerializerMap[$request->getPaymentMethodData()->getType()];
+ $result['payment_method_data'] = $this->{$method}($request->getPaymentMethodData());
+ }
+ if ($request->hasConfirmation()) {
+ $result['confirmation'] = array(
+ 'type' => $request->getConfirmation()->getType(),
+ );
+ $confirmation = $request->getConfirmation();
+ if ($confirmation->getType() === ConfirmationType::REDIRECT) {
+ if ($confirmation->getEnforce()) {
+ $result['confirmation']['enforce'] = $confirmation->getEnforce();
+ }
+ $result['confirmation']['return_url'] = $confirmation->getReturnUrl();
+ }
+ }
+ if ($request->hasMetadata()) {
+ $result['metadata'] = $request->getMetadata()->toArray();
+ }
+
+ foreach (self::$propertyMap as $name => $property) {
+ $value = $request->{$property};
+ if (!empty($value)) {
+ $result[$name] = $value;
+ }
+ }
+ return $result;
+ }
+
+ private function serializeAmount(AmountInterface $amount)
+ {
+ return array(
+ 'value' => $amount->getValue(),
+ 'currency' => $amount->getCurrency(),
+ );
+ }
+
+ private function serializePaymentDataBankCard(PaymentDataBankCard $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getBankCard() !== null) {
+ $result['bank_card'] = array(
+ 'cardholder' => $paymentData->getBankCard()->getCardholder(),
+ 'expiry_year' => $paymentData->getBankCard()->getExpiryYear(),
+ 'expiry_month' => $paymentData->getBankCard()->getExpiryMonth(),
+ 'number' => $paymentData->getBankCard()->getNumber(),
+ 'csc' => $paymentData->getBankCard()->getCsc(),
+ );
+ }
+ return $result;
+ }
+
+ private function serializePaymentDataYandexWallet(PaymentDataYandexWallet $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getAccountNumber() !== null) {
+ $result['account_number'] = $paymentData->getAccountNumber();
+ }
+ if ($paymentData->getPhone() !== null) {
+ $result['phone'] = $paymentData->getPhone();
+ }
+ return $result;
+ }
+
+ private function serializePaymentDataMobile(AbstractPaymentData $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getPaymentData() !== null) {
+ $result['payment_data'] = $paymentData->getPaymentData();
+ }
+ return $result;
+ }
+
+ private function serializePaymentDataSberbank(PaymentDataSberbank $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getBindId() !== null) {
+ $result['bind_id'] = $paymentData->getBindId();
+ }
+ if ($paymentData->getPhone() !== null) {
+ $result['phone'] = $paymentData->getPhone();
+ }
+ return $result;
+ }
+
+ private function serializePaymentDataAlfabank(PaymentDataAlfabank $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getLogin() !== null) {
+ $result['login'] = $paymentData->getLogin();
+ }
+ return $result;
+ }
+
+ private function serializePaymentData(AbstractPaymentData $paymentData)
+ {
+ return array(
+ 'type' => $paymentData->getType(),
+ );
+ }
+
+ private function serializePaymentDataMobilePhone(AbstractPaymentData $paymentData)
+ {
+ $result = array(
+ 'type' => $paymentData->getType(),
+ );
+ if ($paymentData->getPhone() !== null) {
+ $result['phone'] = $paymentData->getPhone();
+ }
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php
new file mode 100644
index 0000000..35c05de
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/CreatePaymentResponse.php
@@ -0,0 +1,11 @@
+_amount;
+ }
+
+ /**
+ * Проверяет была ли установлена сумма оплаты
+ * @return bool True если сумма оплаты была установлена, false если нет
+ */
+ public function hasAmount()
+ {
+ return !empty($this->_amount);
+ }
+
+ /**
+ * Устанавливает сумму оплаты
+ * @param AmountInterface $value Подтверждаемая сумма оплаты
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * Валидирует объект запроса
+ * @return bool True если запрос валиден и его можно отправить в API, false если нет
+ */
+ public function validate()
+ {
+ if ($this->_amount === null) {
+ $this->setValidationError('Amount not specified in CreateCaptureRequest');
+ return false;
+ }
+ $value = $this->_amount->getValue();
+ if (empty($value) || $value <= 0.0) {
+ $this->setValidationError('Invalid amount value: ' . $value);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Возвращает билдер объектов запросов на подтверждение оплаты
+ * @return CreateCaptureRequestBuilder Инстанс билдера
+ */
+ public static function builder()
+ {
+ return new CreateCaptureRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php
new file mode 100644
index 0000000..2ff2613
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestBuilder.php
@@ -0,0 +1,97 @@
+amount = new MonetaryAmount();
+ return new CreateCaptureRequest();
+ }
+
+ /**
+ * Устанавливает сумму оплаты
+ * @param AmountInterface|string $value Подтверждаемая сумма оплаты
+ * @return CreateCaptureRequestBuilder Инстанс билдера запросов на подтверждение суммы оплаты
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueException Выбрасывается если переданная сумма меньше или равна нулю
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданная сумма не является числом или объектом
+ * типа AmountInterface
+ */
+ public function setAmount($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException('Empty currency value', 0, 'amount.currency');
+ } elseif (is_object($value) && $value instanceof AmountInterface) {
+ $this->amount->setValue($value->getValue());
+ $this->amount->setCurrency($value->getCurrency());
+ } elseif (is_numeric($value)) {
+ $this->amount->setValue($value);
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid amount value type in CreateCaptureRequestBuilder',
+ 0,
+ 'CreateCaptureRequestBuilder.amount',
+ $value
+ );
+ }
+ return $this;
+ }
+
+ /**
+ * Устанавливает валюту в которой будет происходить подтверждение оплаты заказа
+ * @param string $value Валюта в которой подтверждается оплата
+ * @return CreateCaptureRequestBuilder Инстанс билдера запросов на подтверждение суммы оплаты
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты
+ */
+ public function setCurrency($value)
+ {
+ $this->amount->setCurrency($value);
+ return $this;
+ }
+
+ /**
+ * Осуществляет сборку объекта запроса к API
+ * @param array|null $options Массив дополнительных настроек объекта
+ * @return CreateCaptureRequestInterface Иснатс объекта запроса к API
+ *
+ * @throws InvalidRequestException Выбрасывается если при валидации запроса произошла ошибка
+ * @throws InvalidPropertyException Выбрасывается если не удалось установить один из параметров, переданных в
+ * массиве настроек
+ */
+ public function build(array $options = null)
+ {
+ if (!empty($options)) {
+ $this->setOptions($options);
+ }
+ $this->currentObject->setAmount($this->amount);
+ return parent::build();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php
new file mode 100644
index 0000000..90d5d1e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureRequestInterface.php
@@ -0,0 +1,28 @@
+ array(
+ 'value' => $request->getAmount()->getValue(),
+ 'currency' => $request->getAmount()->getCurrency(),
+ ),
+ );
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php
new file mode 100644
index 0000000..368675e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/Payment/CreateCaptureResponse.php
@@ -0,0 +1,13 @@
+_paymentId;
+ }
+
+ /**
+ * Проверяет, был ли задан идентификатор платежа
+ * @return bool True если идентификатор был задан, false если нет
+ */
+ public function hasPaymentId()
+ {
+ return $this->_paymentId !== null;
+ }
+
+ /**
+ * Устанавливает идентификатор платежа или null если требуется его удалить
+ * @param string|null $value Идентификатор платежа
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setPaymentId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_paymentId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen((string)$value, 'utf-8');
+ if ($length != 36) {
+ throw new InvalidPropertyValueException(
+ 'Invalid payment_id value length in PaymentsRequest (' . $length . ' != 36)',
+ 0, 'PaymentsRequest.paymentId', $value
+ );
+ }
+ $this->_paymentId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid payment_id value type in PaymentsRequest', 0, 'PaymentsRequest.paymentId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор магазина, если он был задан
+ * @return string|null Идентификатор магазина
+ */
+ public function getAccountId()
+ {
+ return $this->_accountId;
+ }
+
+ /**
+ * Проверяет, был ли установлен идентификатор магазина
+ * @return bool True если идентификатор магазина был установлен, false если нет
+ */
+ public function hasAccountId()
+ {
+ return $this->_accountId !== null;
+ }
+
+ /**
+ * Устанавлвиает идентификатор магазина
+ * @param string $value Идентификатор магазина или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setAccountId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_accountId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_accountId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid accountId value type in PaymentsRequest', 0, 'PaymentsRequest.accountId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор товара
+ * @return string|null Идентификатор товара
+ */
+ public function getGatewayId()
+ {
+ return $this->_gatewayId;
+ }
+
+ /**
+ * Проверяет был ли установлен идентификатор товара
+ * @return bool True если идентификатор товара был установлен, false если нет
+ */
+ public function hasGatewayId()
+ {
+ return $this->_gatewayId !== null;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Идентификатор товара или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setGatewayId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_gatewayId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_gatewayId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid gatewayId value type in PaymentsRequest', 0, 'PaymentsRequest.gatewayId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания от которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время создания, от (включительно)
+ */
+ public function getCreatedGte()
+ {
+ return $this->_createdGte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания от которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedGte()
+ {
+ return $this->_createdGte !== null;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdGte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_gte value in PaymentsRequest', 0, 'PaymentRequest.createdGte'
+ );
+ }
+ $this->_createdGte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_gte value type in PaymentsRequest', 0, 'PaymentRequest.createdGte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания от которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время создания, от (не включая)
+ */
+ public function getCreatedGt()
+ {
+ return $this->_createdGt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания от которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedGt()
+ {
+ return $this->_createdGt !== null;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdGt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_gt value in PaymentsRequest', 0, 'PaymentRequest.createdGt'
+ );
+ }
+ $this->_createdGt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_gt value type in PaymentsRequest', 0, 'PaymentRequest.createdGt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания до которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время создания, до (включительно)
+ */
+ public function getCreatedLte()
+ {
+ return $this->_createdLte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания до которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedLte()
+ {
+ return $this->_createdLte !== null;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdLte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_lte value in PaymentsRequest', 0, 'PaymentRequest.createdLte'
+ );
+ }
+ $this->_createdLte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_lte value type in PaymentsRequest', 0, 'PaymentRequest.createdLte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания до которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время создания, до (не включая)
+ */
+ public function getCreatedLt()
+ {
+ return $this->_createdLt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания до которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedLt()
+ {
+ return $this->_createdLt !== null;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdLt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_lt value in PaymentsRequest', 0, 'PaymentRequest.createdLt'
+ );
+ }
+ $this->_createdLt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_lt value type in PaymentsRequest', 0, 'PaymentRequest.createdLt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения от которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время проведения операции, от (включительно)
+ */
+ public function getAuthorizedGte()
+ {
+ return $this->_authorizedGte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения от которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedGte()
+ {
+ return $this->_authorizedGte !== null;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedGte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_gte value in PaymentsRequest', 0, 'PaymentRequest.authorizedGte'
+ );
+ }
+ $this->_authorizedGte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_gte value type in PaymentsRequest', 0, 'PaymentRequest.authorizedGte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения от которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время проведения операции, от (не включая)
+ */
+ public function getAuthorizedGt()
+ {
+ return $this->_authorizedGt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения от которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedGt()
+ {
+ return $this->_authorizedGt !== null;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedGt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_gt value in PaymentsRequest', 0, 'PaymentRequest.authorizedGt'
+ );
+ }
+ $this->_authorizedGt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_gt value type in PaymentsRequest', 0, 'PaymentRequest.authorizedGt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения до которой будут возвращены платежи или null если дата не была установлена
+ * @return \DateTime|null Время проведения, до (включительно)
+ */
+ public function getAuthorizedLte()
+ {
+ return $this->_authorizedLte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения до которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedLte()
+ {
+ return $this->_authorizedLte !== null;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedLte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_lte value in PaymentsRequest', 0, 'PaymentRequest.authorizedLte'
+ );
+ }
+ $this->_authorizedLte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_lte value type in PaymentsRequest', 0, 'PaymentRequest.authorizedLte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения до которой будут возвращены платежи платежи или null если она не была установлена
+ * @return \DateTime|null Время проведения, до (не включая)
+ */
+ public function getAuthorizedLt()
+ {
+ return $this->_authorizedLt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения до которой выбираются платежи
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedLt()
+ {
+ return $this->_authorizedLt !== null;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedLt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_lt value in PaymentsRequest', 0, 'PaymentRequest.authorizedLt'
+ );
+ }
+ $this->_authorizedLt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_lt value type in PaymentsRequest', 0, 'PaymentRequest.authorizedLt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает статус выбираемых платежей или null если он до этого не был установлен
+ * @return string|null Статус выбираемых платежей
+ */
+ public function getStatus()
+ {
+ return $this->_status;
+ }
+
+ /**
+ * Проверяет был ли установлен статус выбираемых платежей
+ * @return bool True если статус был установлен, false если нет
+ */
+ public function hasStatus()
+ {
+ return $this->_status !== null;
+ }
+
+ /**
+ * Устанавливает статус выбираемых платежей
+ * @param string $value Статус выбираемых платежей или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setStatus($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_status = null;
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (!Status::valueExists((string)$value)) {
+ throw new InvalidPropertyValueException(
+ 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value
+ );
+ } else {
+ $this->_status = (string)$value;
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает токен для получения следующей страницы выборки
+ * @return string|null Токен для получения следующей страницы выборки
+ */
+ public function getNextPage()
+ {
+ return $this->_nextPage;
+ }
+
+ /**
+ * Проверяет был ли установлен токен следующей страницы
+ * @return bool True если токен был установлен, false если нет
+ */
+ public function hasNextPage()
+ {
+ return $this->_nextPage !== null;
+ }
+
+ /**
+ * Устанавливает токен следующей страницы выборки
+ * @param string $value Токен следующей страницы выборки или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setNextPage($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_nextPage = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_nextPage = (string) $value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value
+ );
+ }
+ }
+
+ /**
+ * Проверяет валидность текущего объекта запроса
+ * @return bool True если объект валиден, false если нет
+ */
+ public function validate()
+ {
+ if (empty($this->_accountId)) {
+ $this->setValidationError('Shop id not specified');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Возвращает инстанс билдера объектов запросов списка платежей магазина
+ * @return PaymentsRequestBuilder Билдер объектов запросов списка платежей
+ */
+ public static function builder()
+ {
+ return new PaymentsRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php
new file mode 100644
index 0000000..8d2e92d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestBuilder.php
@@ -0,0 +1,236 @@
+currentObject->setPaymentId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор магазина
+ * @param string|null $value Идентификатор магазина или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setAccountId($value)
+ {
+ $this->currentObject->setAccountId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Идентификатор товара или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setGatewayId($value)
+ {
+ $this->currentObject->setGatewayId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает статус выбираемых платежей
+ * @param string $value Статус выбираемых платежей или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setStatus($value)
+ {
+ $this->currentObject->setStatus($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает токен следующей страницы выборки
+ * @param string $value Токен следующей страницы выборки или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setNextPage($value)
+ {
+ $this->currentObject->setNextPage($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGt($value)
+ {
+ $this->currentObject->setCreatedGt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGte($value)
+ {
+ $this->currentObject->setCreatedGte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLt($value)
+ {
+ $this->currentObject->setCreatedLt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLte($value)
+ {
+ $this->currentObject->setCreatedLte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGt($value)
+ {
+ $this->currentObject->setAuthorizedGt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGte($value)
+ {
+ $this->currentObject->setAuthorizedGte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLt($value)
+ {
+ $this->currentObject->setAuthorizedLt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются платежи
+ * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение
+ * @return PaymentsRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLte($value)
+ {
+ $this->currentObject->setAuthorizedLte($value);
+ return $this;
+ }
+
+ /**
+ * Собирает и возвращает объект запроса списка платежей магазина
+ * @param array|null $options Массив с настройками запроса
+ * @return PaymentsRequestInterface Инстанс объекта запроса к API для получения списка плаитежей магазина
+ */
+ public function build(array $options = null)
+ {
+ return parent::build($options);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php
new file mode 100644
index 0000000..abda6af
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsRequestInterface.php
@@ -0,0 +1,181 @@
+ 'payment_id',
+ 'gatewayId' => 'gateway_id',
+ 'createdGte' => 'created_gte',
+ 'createdGt' => 'created_gt',
+ 'createdLte' => 'created_lte',
+ 'createdLt' => 'created_lt',
+ 'authorizedGte' => 'authorized_gte',
+ 'authorizedGt' => 'authorized_gt',
+ 'authorizedLte' => 'authorized_lte',
+ 'authorizedLt' => 'authorized_lt',
+ 'status' => 'status',
+ 'nextPage' => 'next_page',
+ );
+
+ /**
+ * Сериализует объект запроса к API для дальнейшей его отправки
+ * @param PaymentsRequestInterface $request Сериализуемый объект
+ * @return array Массив с инфомрацией, отпарвляемый в дальнейшем в API
+ */
+ public function serialize(PaymentsRequestInterface $request)
+ {
+ $result = array(
+ 'account_id' => $request->getAccountId(),
+ );
+ foreach (self::$propertyMap as $property => $name) {
+ $value = $request->{$property};
+ if (!empty($value)) {
+ if ($value instanceof \DateTime) {
+ if ($value->getTimestamp() > 1) {
+ $result[$name] = $value->format(DATE_ATOM);
+ }
+ } else {
+ $result[$name] = $value;
+ }
+ }
+ }
+ return $result;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php
new file mode 100644
index 0000000..9fa0df6
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Payments/PaymentsResponse.php
@@ -0,0 +1,141 @@
+items = array();
+ foreach ($options['items'] as $paymentInfo) {
+ $payment = new Payment();
+ $payment->setId($paymentInfo['id']);
+ $payment->setStatus($paymentInfo['status']);
+ $payment->setAmount(new MonetaryAmount(
+ $paymentInfo['amount']['value'],
+ $paymentInfo['amount']['currency']
+ ));
+ $payment->setCreatedAt(strtotime($paymentInfo['created_at']));
+ $payment->setPaymentMethod($this->factoryPaymentMethod($paymentInfo['payment_method']));
+ $payment->setPaid($paymentInfo['paid']);
+
+ if (!empty($paymentInfo['error'])) {
+ $error = new PaymentError();
+ $error->setCode($paymentInfo['error']['code']);
+ if (!empty($paymentInfo['error']['description'])) {
+ $error->setDescription($paymentInfo['error']['description']);
+ }
+ $payment->setError($error);
+
+ }
+ if (!empty($paymentInfo['recipient'])) {
+ $recipient = new Recipient();
+ $recipient->setAccountId($paymentInfo['recipient']['account_id']);
+ $recipient->setGatewayId($paymentInfo['recipient']['gateway_id']);
+ $payment->setRecipient($recipient);
+ }
+ if (!empty($paymentInfo['captured_at'])) {
+ $payment->setCapturedAt(strtotime($paymentInfo['captured_at']));
+ }
+ if (!empty($paymentInfo['confirmation'])) {
+ if ($paymentInfo['confirmation']['type'] === ConfirmationType::REDIRECT) {
+ $confirmation = new ConfirmationRedirect();
+ $confirmation->setConfirmationUrl($paymentInfo['confirmation']['confirmation_url']);
+ $confirmation->setEnforce($paymentInfo['confirmation']['enforce']);
+ $confirmation->setReturnUrl($paymentInfo['confirmation']['return_url']);
+ } else {
+ $confirmation = new ConfirmationExternal();
+ }
+ $payment->setConfirmation($confirmation);
+ }
+ if (!empty($paymentInfo['refunded_amount'])) {
+ $payment->setRefundedAmount(new MonetaryAmount(
+ $paymentInfo['refunded_amount']['value'], $paymentInfo['refunded_amount']['currency']
+ ));
+ }
+ if (!empty($paymentInfo['receipt_registration'])) {
+ $payment->setReceiptRegistration($paymentInfo['receipt_registration']);
+ }
+ if (!empty($paymentInfo['metadata'])) {
+ $metadata = new Metadata();
+ foreach ($paymentInfo['metadata'] as $key => $value) {
+ $metadata->offsetSet($key, $value);
+ }
+ $payment->setMetadata($metadata);
+ }
+ $this->items[] = $payment;
+ }
+ if (!empty($options['next_page'])) {
+ $this->nextPage = $options['next_page'];
+ }
+ }
+
+ /**
+ * Возвращает список платежей
+ * @return PaymentInterface[] Список платежей
+ */
+ public function getItems()
+ {
+ return $this->items;
+ }
+
+ /**
+ * Возвращает токен следующей страницы, если он задан, или null
+ * @return string|null Токен следующей страницы
+ */
+ public function getNextPage()
+ {
+ return $this->nextPage;
+ }
+
+ /**
+ * Проверяет имееотся ли в ответе токен следующей страницы
+ * @return bool True если токен следующей страницы есть, false если нет
+ */
+ public function hasNextPage()
+ {
+ return $this->nextPage !== null;
+ }
+
+ /**
+ * Фабричный метод для создания объектов методов оплаты
+ * @param array $options Массив настроек метода оплаты
+ * @return AbstractPaymentMethod Используемый способ оплаты
+ */
+ private function factoryPaymentMethod($options)
+ {
+ $factory = new PaymentMethodFactory();
+ return $factory->factoryFromArray($options);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php
new file mode 100644
index 0000000..6f13bfd
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/AbstractRefundResponse.php
@@ -0,0 +1,49 @@
+setId(empty($options['id']) ? null : $options['id']);
+ $this->setPaymentId(empty($options['payment_id']) ? null : $options['payment_id']);
+ $this->setStatus(empty($options['status']) ? null : $options['status']);
+ $this->setCreatedAt(empty($options['created_at']) ? null : $options['created_at']);
+ $this->setAmount(new MonetaryAmount($options['amount']['value'], $options['amount']['currency']));
+
+ if (!empty($options['error'])) {
+ $error = new RefundError();
+ $error->setCode($options['error']['code']);
+ if (!empty($options['error']['description'])) {
+ $error->setDescription($options['error']['description']);
+ }
+ $this->setError($error);
+ }
+
+ if (!empty($options['authorized_at'])) {
+ $this->setAuthorizedAt($options['authorized_at']);
+ }
+
+ if (!empty($options['receipt_registration'])) {
+ $this->setReceiptRegistration($options['receipt_registration']);
+ }
+
+ if (!empty($options['comment'])) {
+ $this->setComment($options['comment']);
+ }
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php
new file mode 100644
index 0000000..7f4b04e
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequest.php
@@ -0,0 +1,222 @@
+_paymentId;
+ }
+
+ /**
+ * Устанавливает айди платежа для которого создаётся возврат
+ * @param string $value Айди платежа
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение айди платежа
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение является строкой, но не является
+ * валидным значением айди платежа
+ * @throws InvalidPropertyValueTypeException Выбрасывается если передано значение не валидного типа
+ */
+ public function setPaymentId($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty payment id value in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId'
+ );
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen($value, 'utf-8');
+ if ($length != 36) {
+ throw new InvalidPropertyValueException(
+ 'Invalid payment id value in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId', $value
+ );
+ }
+ $this->_paymentId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueException(
+ 'Invalid payment id value type in CreateRefundRequest', 0, 'CreateRefundRequest.paymentId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает сумму возвращаемых средств
+ * @return AmountInterface Сумма возврата
+ */
+ public function getAmount()
+ {
+ return $this->_amount;
+ }
+
+ /**
+ * Устанавливает сумму возвращаемых средств
+ * @param AmountInterface $value Сумма возврата
+ */
+ public function setAmount(AmountInterface $value)
+ {
+ $this->_amount = $value;
+ }
+
+ /**
+ * Возвращает комментарий к возврату или null, если комментарий не задан
+ * @return string Комментарий к операции возврата, основание для возврата средств покупателю.
+ */
+ public function getComment()
+ {
+ return $this->_comment;
+ }
+
+ /**
+ * Проверяет задан ли комментарий к создаваемому возврату
+ * @return bool True если комментарий установлен, false если нет
+ */
+ public function hasComment()
+ {
+ return $this->_comment !== null;
+ }
+
+ /**
+ * Устанавливает комментарий к возврату
+ * @param string $value Комментарий к операции возврата, основание для возврата средств покупателю
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданная строка длинее 250 символов
+ * @throws InvalidPropertyValueTypeException Выбрасывается если была передана не строка
+ */
+ public function setComment($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_comment = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen($value, 'utf-8');
+ if ($length > 250) {
+ throw new InvalidPropertyValueException(
+ 'Invalid commend value in CreateRefundRequest', 0, 'CreateRefundRequest.comment', $value
+ );
+ }
+ $this->_comment = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid commend value type in CreateRefundRequest', 0, 'CreateRefundRequest.comment', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает инстанс чека или null если чек не задан
+ * @return ReceiptInterface|null Инстанс чека или null
+ */
+ public function getReceipt()
+ {
+ return $this->_receipt;
+ }
+
+ /**
+ * Проверяет задан ли чек
+ * @return bool True если чек есть, false если нет
+ */
+ public function hasReceipt()
+ {
+ return $this->_receipt !== null && $this->_receipt->notEmpty();
+ }
+
+ /**
+ * Устанавливает чек для печати
+ * @param ReceiptInterface|null $value Инстанс чека или null для удаления информации о чеке
+ * @throws InvalidPropertyValueTypeException Выбрасывается если передан не инстанс класса чека и не null
+ */
+ public function setReceipt($value)
+ {
+ if ($value === null || $value instanceof ReceiptInterface) {
+ $this->_receipt = $value;
+ } else {
+ throw new InvalidPropertyValueTypeException('Invalid receipt in Refund', 0, 'Refund.receipt', $value);
+ }
+ }
+
+ /**
+ * Валидирует текущий объект запроса
+ * @return bool True если текущий объект запроса валиден, false если нет
+ */
+ public function validate()
+ {
+ if (empty($this->_paymentId)) {
+ $this->setValidationError('Payment id not specified');
+ return false;
+ }
+ if (empty($this->_amount)) {
+ $this->setValidationError('Amount not specified');
+ return false;
+ }
+ if ($this->_amount->getValue() <= 0.0) {
+ $this->setValidationError('Invalid amount value: ' . $this->_amount->getValue());
+ return false;
+ }
+ if ($this->_receipt !== null && $this->_receipt->notEmpty()) {
+ $email = $this->_receipt->getEmail();
+ $phone = $this->_receipt->getPhone();
+ if (empty($email) && empty($phone)) {
+ $this->setValidationError('Both email and phone values are empty in receipt');
+ return false;
+ }
+ if ($this->_receipt->getTaxSystemCode() === null) {
+ foreach ($this->_receipt->getItems() as $item) {
+ if ($item->getVatCode() === null) {
+ $this->setValidationError('Item vat_id and receipt tax_system_id not specified');
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Возвращает билдер объектов текущего типа
+ * @return CreateRefundRequestBuilder Инстанс билдера запрсов
+ */
+ public static function builder()
+ {
+ return new CreateRefundRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php
new file mode 100644
index 0000000..13a40da
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestBuilder.php
@@ -0,0 +1,252 @@
+amount = new MonetaryAmount();
+ $this->receipt = new Receipt();
+ return $request;
+ }
+
+ /**
+ * Устанавливает айди платежа для которого создаётся возврат
+ * @param string $value Айди платежа
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение айди платежа
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение является строкой, но не является
+ * валидным значением айди платежа
+ * @throws InvalidPropertyValueTypeException Выбрасывается если передано значение не валидного типа
+ */
+ public function setPaymentId($value)
+ {
+ $this->currentObject->setPaymentId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает сумму возвращаемых средств
+ * @param AmountInterface $value Сумма возврата
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если было передано не валидное значение
+ */
+ public function setAmount($value)
+ {
+ if ($value instanceof AmountInterface) {
+ $this->amount->setValue($value->getValue());
+ $this->amount->setCurrency($value->getCurrency());
+ } else {
+ $this->amount->setValue($value);
+ }
+ return $this;
+ }
+
+ /**
+ * Устанавливает валюту в которой средства возвращаются
+ * @param string $value Код валюты
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws EmptyPropertyValueException Генерируется если было передано пустое значение
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ * @throws InvalidPropertyValueException Генерируется если был передан неподдерживаемый код валюты
+ */
+ public function setCurrency($value)
+ {
+ $this->amount->setCurrency($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает комментарий к возврату
+ * @param string $value Комментарий к возврату
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданная строка длинее 250 символов
+ * @throws InvalidPropertyValueTypeException Выбрасывается если была передана не строка
+ */
+ public function setComment($value)
+ {
+ $this->currentObject->setComment($value);
+ return $this;
+ }
+
+ /**
+ * Устанавлвиает список товаров в заказе для создания чека
+ * @param array $value Массив товаров в заказе
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если хотя бы один из товаров имеет неверную структуру
+ */
+ public function setReceiptItems($value)
+ {
+ $this->receipt->setItems(array());
+ $index = 0;
+ foreach ($value as $item) {
+ if ($item instanceof ReceiptItemInterface) {
+ $this->receipt->addItem($item);
+ } else {
+ if (empty($item['title']) && empty($item['description'])) {
+ throw new InvalidPropertyValueException(
+ 'Item#' . $index . ' title or description not specified',
+ 0,
+ 'CreatePaymentRequest.items[' . $index . '].title',
+ json_encode($item)
+ );
+ }
+ if (empty($item['price'])) {
+ throw new InvalidPropertyValueException(
+ 'Item#' . $index . ' price not specified',
+ 0,
+ 'CreatePaymentRequest.items[' . $index . '].price',
+ json_encode($item)
+ );
+ }
+ $this->addReceiptItem(
+ empty($item['title']) ? $item['description'] : $item['title'],
+ $item['price'],
+ empty($item['quantity']) ? 1.0 : $item['quantity'],
+ empty($item['vatCode']) ? null : $item['vatCode']
+ );
+ }
+ $index++;
+ }
+ return $this;
+ }
+
+ /**
+ * Добавляет в чек товар
+ * @param string $title Название или описание товара
+ * @param string $price Цена товара в валюте, заданной в заказе
+ * @param float $quantity Количество покупаемого товара
+ * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ */
+ public function addReceiptItem($title, $price, $quantity = 1.0, $vatCode = null)
+ {
+ $item = new ReceiptItem();
+ $item->setDescription($title);
+ $item->setQuantity($quantity);
+ $item->setVatCode($vatCode);
+ $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency()));
+ $this->receipt->addItem($item);
+ return $this;
+ }
+
+ /**
+ * Добавляет в чек доставку товара
+ * @param string $title Название доставки в чеке
+ * @param string $price Стоимость доставки
+ * @param int|null $vatCode Ставка НДС, или null если используется ставка НДС заказа
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ */
+ public function addReceiptShipping($title, $price, $vatCode = null)
+ {
+ $item = new ReceiptItem();
+ $item->setDescription($title);
+ $item->setQuantity(1);
+ $item->setVatCode($vatCode);
+ $item->setIsShipping(true);
+ $item->setPrice(new MonetaryAmount($price, $this->amount->getCurrency()));
+ $this->receipt->addItem($item);
+ return $this;
+ }
+
+ /**
+ * Устанавливает адрес электронной почты получателя чека
+ * @param string $value Email получателя чека
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ */
+ public function setReceiptEmail($value)
+ {
+ $this->receipt->setEmail($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает телефон получателя чека
+ * @param string $value Телефон получателя чека
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если был передан не телефон, а что-то другое
+ * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа
+ */
+ public function setReceiptPhone($value)
+ {
+ $this->receipt->setPhone($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает код системы налогообложения.
+ * @param int $value Код системы налогообложения. Число 1-6.
+ * @return CreateRefundRequestBuilder Инстанс текущего билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если переданный аргумент - не число
+ * @throws InvalidPropertyValueException Выбрасывается если переданный аргумент меньше одного или больше шести
+ */
+ public function setTaxSystemCode($value)
+ {
+ $this->receipt->setTaxSystemCode($value);
+ return $this;
+ }
+
+ /**
+ * Строит объект запроса к API
+ * @param array|null $options Устаналвиваемые параметры запроса
+ * @return CreateRefundRequestInterface Инстанс сгенерированного объекта запроса к API
+ */
+ public function build(array $options = null)
+ {
+ if (!empty($options)) {
+ $this->setOptions($options);
+ }
+ $this->currentObject->setAmount($this->amount);
+ if ($this->receipt->notEmpty()) {
+ $this->currentObject->setReceipt($this->receipt);
+ }
+ return parent::build();
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php
new file mode 100644
index 0000000..a6ec6fa
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundRequestInterface.php
@@ -0,0 +1,55 @@
+ $request->getPaymentId(),
+ 'amount' => array(
+ 'value' => $request->getAmount()->getValue(),
+ 'currency' => $request->getAmount()->getCurrency(),
+ ),
+ );
+ if ($request->hasComment()) {
+ $result['comment'] = $request->getComment();
+ }
+ if ($request->hasReceipt()) {
+ $receipt = $request->getReceipt();
+ $result['receipt'] = array();
+ foreach ($receipt->getItems() as $item) {
+ $vatId = $item->getVatCode();
+ if ($vatId === null) {
+ $vatId = $receipt->getTaxSystemCode();
+ }
+ $result['receipt']['items'][] = array(
+ 'description' => $item->getDescription(),
+ 'amount' => array(
+ 'value' => $item->getPrice()->getValue(),
+ 'currency' => $item->getPrice()->getCurrency(),
+ ),
+ 'quantity' => $item->getQuantity(),
+ 'vat_code' => $vatId,
+ );
+ }
+ $value = $receipt->getEmail();
+ if (!empty($value)) {
+ $result['receipt']['email'] = $value;
+ }
+ $value = $receipt->getPhone();
+ if (!empty($value)) {
+ $result['receipt']['phone'] = $value;
+ }
+ $value = $receipt->getTaxSystemCode();
+ if (!empty($value)) {
+ $result['receipt']['tax_system_code'] = $value;
+ }
+ }
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php
new file mode 100644
index 0000000..faf77a6
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/CreateRefundResponse.php
@@ -0,0 +1,11 @@
+_refundId;
+ }
+
+ /**
+ * Проверяет был ли установлен идентификатор возврата
+ * @return bool True если идентификатор возврата был установлен, false если не был
+ */
+ public function hasRefundId()
+ {
+ return $this->_refundId !== null;
+ }
+
+ /**
+ * Устанавливает идентификатор возврата
+ * @param string $value Идентификатор возврата, который ищется в API
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если длина переданного значения не равна 36
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setRefundId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_refundId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen((string)$value, 'utf-8');
+ if ($length != 36) {
+ throw new InvalidPropertyValueException(
+ 'Invalid refund id value', 0, 'RefundsRequest.refundId', $value
+ );
+ }
+ $this->_refundId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid refund id value type', 0, 'RefundsRequest.refundId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор платежа если он задан или null
+ * @return string|null Идентификатор платежа
+ */
+ public function getPaymentId()
+ {
+ return $this->_paymentId;
+ }
+
+ /**
+ * Проверяет, был ли задан идентификатор платежа
+ * @return bool True если идентификатор был задан, false если нет
+ */
+ public function hasPaymentId()
+ {
+ return !empty($this->_paymentId);
+ }
+
+ /**
+ * Устанавливает идентификатор платежа или null если требуется его удалить
+ * @param string|null $value Идентификатор платежа
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setPaymentId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_paymentId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $length = mb_strlen((string)$value, 'utf-8');
+ if ($length != 36) {
+ throw new InvalidPropertyValueException(
+ 'Invalid payment id value in RefundsRequest', 0, 'RefundsRequest.paymentId', $value
+ );
+ }
+ $this->_paymentId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid payment id value type in RefundsRequest', 0, 'RefundsRequest.paymentId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор магазина, если он был задан
+ * @return string|null Идентификатор магазина
+ */
+ public function getAccountId()
+ {
+ return $this->_accountId;
+ }
+
+ /**
+ * Проверяет, был ли установлен идентификатор магазина
+ * @return bool True если идентификатор магазина был установлен, false если нет
+ */
+ public function hasAccountId()
+ {
+ return !empty($this->_accountId);
+ }
+
+ /**
+ * Устанавлвиает идентификатор магазина
+ * @param string $value Идентификатор магазина или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setAccountId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_accountId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_accountId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid accountId value type in RefundsRequest', 0, 'RefundsRequest.accountId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает идентификатор товара
+ * @return string|null Идентификатор товара
+ */
+ public function getGatewayId()
+ {
+ return $this->_gatewayId;
+ }
+
+ /**
+ * Проверяет был ли установлен идентификатор товара
+ * @return bool True если идентификатор товара был установлен, false если нет
+ */
+ public function hasGatewayId()
+ {
+ return !empty($this->_gatewayId);
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Идентификатор товара или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setGatewayId($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_gatewayId = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_gatewayId = (string)$value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid gatewayId value type in RefundsRequest', 0, 'RefundsRequest.gatewayId', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания от которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время создания, от (включительно)
+ */
+ public function getCreatedGte()
+ {
+ return $this->_createdGte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания от которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedGte()
+ {
+ return !empty($this->_createdGte);
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdGte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_gte value in RefundsRequest', 0, 'RefundsRequest.createdGte'
+ );
+ }
+ $this->_createdGte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_gte value type in RefundsRequest', 0, 'RefundsRequest.createdGte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания от которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время создания, от (не включая)
+ */
+ public function getCreatedGt()
+ {
+ return $this->_createdGt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания от которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedGt()
+ {
+ return !empty($this->_createdGt);
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdGt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_gt value in RefundsRequest', 0, 'RefundsRequest.createdGt'
+ );
+ }
+ $this->_createdGt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_gt value type in RefundsRequest', 0, 'RefundsRequest.createdGt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания до которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время создания, до (включительно)
+ */
+ public function getCreatedLte()
+ {
+ return $this->_createdLte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания до которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedLte()
+ {
+ return !empty($this->_createdLte);
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdLte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_lte value in RefundsRequest', 0, 'RefundsRequest.createdLte'
+ );
+ }
+ $this->_createdLte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_lte value type in RefundsRequest', 0, 'RefundsRequest.createdLte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату создания до которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время создания, до (не включая)
+ */
+ public function getCreatedLt()
+ {
+ return $this->_createdLt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата создания до которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasCreatedLt()
+ {
+ return !empty($this->_createdLt);
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_createdLt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid created_lt value in RefundsRequest', 0, 'RefundsRequest.createdLt'
+ );
+ }
+ $this->_createdLt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid created_lt value type in RefundsRequest', 0, 'RefundsRequest.createdLt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения от которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время проведения операции, от (включительно)
+ */
+ public function getAuthorizedGte()
+ {
+ return $this->_authorizedGte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения от которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedGte()
+ {
+ return !empty($this->_authorizedGte);
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedGte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_gte value in RefundsRequest', 0, 'RefundsRequest.authorizedGte'
+ );
+ }
+ $this->_authorizedGte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_gte value type in RefundsRequest', 0, 'RefundsRequest.authorizedGte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения от которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время проведения операции, от (не включая)
+ */
+ public function getAuthorizedGt()
+ {
+ return $this->_authorizedGt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения от которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedGt()
+ {
+ return !empty($this->_authorizedGt);
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedGt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_gt value in RefundsRequest', 0, 'RefundsRequest.authorizedGt'
+ );
+ }
+ $this->_authorizedGt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_gt value type in RefundsRequest', 0, 'RefundsRequest.authorizedGt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения до которой будут возвращены возвраты или null если дата не была установлена
+ * @return \DateTime|null Время проведения, до (включительно)
+ */
+ public function getAuthorizedLte()
+ {
+ return $this->_authorizedLte;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения до которой выбираются возвраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedLte()
+ {
+ return !empty($this->_authorizedLte);
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLte($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedLte = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_lte value in RefundsRequest', 0, 'RefundsRequest.authorizedLte'
+ );
+ }
+ $this->_authorizedLte = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_lte value type in RefundsRequest', 0, 'RefundsRequest.authorizedLte'
+ );
+ }
+ }
+
+ /**
+ * Возвращает дату проведения до которой будут возвращены платежи возвраты или null если она не была установлена
+ * @return \DateTime|null Время проведения, до (не включая)
+ */
+ public function getAuthorizedLt()
+ {
+ return $this->_authorizedLt;
+ }
+
+ /**
+ * Проверяет была ли установлена дата проведения до которой выбираются вовзраты
+ * @return bool True если дата была установлена, false если нет
+ */
+ public function hasAuthorizedLt()
+ {
+ return !empty($this->_authorizedLt);
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLt($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_authorizedLt = null;
+ } elseif (TypeCast::canCastToDateTime($value)) {
+ $dateTime = TypeCast::castToDateTime($value);
+ if ($dateTime === null) {
+ throw new InvalidPropertyValueException(
+ 'Invalid authorized_lt value in RefundsRequest', 0, 'RefundsRequest.authorizedLt'
+ );
+ }
+ $this->_authorizedLt = $dateTime;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid authorized_lt value type in RefundsRequest', 0, 'RefundsRequest.authorizedLt'
+ );
+ }
+ }
+
+ /**
+ * Возвращает статус выбираемых возвратов или null если он до этого не был установлен
+ * @return string|null Статус выбираемых возвратов
+ */
+ public function getStatus()
+ {
+ return $this->_status;
+ }
+
+ /**
+ * Проверяет был ли установлен статус выбираемых возвратов
+ * @return bool True если статус был установлен, false если нет
+ */
+ public function hasStatus()
+ {
+ return !empty($this->_status);
+ }
+
+ /**
+ * Устанавливает статус выбираемых возвратов
+ * @param string $value Статус выбираемых платежей или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setStatus($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_status = null;
+ } elseif (TypeCast::canCastToEnumString($value)) {
+ if (!RefundStatus::valueExists((string)$value)) {
+ throw new InvalidPropertyValueException(
+ 'Invalid status value in RefundsRequest', 0, 'RefundsRequest.status', $value
+ );
+ } else {
+ $this->_status = (string)$value;
+ }
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid status value in RefundsRequest', 0, 'RefundsRequest.status', $value
+ );
+ }
+ }
+
+ /**
+ * Возвращает токен для получения следующей страницы выборки
+ * @return string|null Токен для получения следующей страницы выборки
+ */
+ public function getNextPage()
+ {
+ return $this->_nextPage;
+ }
+
+ /**
+ * Проверяет был ли установлен токен следующей страницы
+ * @return bool True если токен был установлен, false если нет
+ */
+ public function hasNextPage()
+ {
+ return !empty($this->_nextPage);
+ }
+
+ /**
+ * Устанавливает токен следующей страницы выборки
+ * @param string $value Токен следующей страницы выборки или null чтобы удалить значение
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setNextPage($value)
+ {
+ if ($value === null || $value === '') {
+ $this->_nextPage = null;
+ } elseif (TypeCast::canCastToString($value)) {
+ $this->_nextPage = (string) $value;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid status value in PaymentsRequest', 0, 'PaymentsRequest.status', $value
+ );
+ }
+ }
+
+ /**
+ * Проверяет валидность текущего объекта запроса
+ * @return bool True если объект валиден, false если нет
+ */
+ public function validate()
+ {
+ if (empty($this->_accountId)) {
+ $this->setValidationError('Shop id not specified');
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Возвращает инстанс билдера объектов запросов списка возвратов магазина
+ * @return RefundsRequestBuilder Билдер объектов запросов списка возвратов
+ */
+ public static function builder()
+ {
+ return new RefundsRequestBuilder();
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php
new file mode 100644
index 0000000..8dd8c7d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestBuilder.php
@@ -0,0 +1,250 @@
+currentObject->setRefundId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор платежа или null если требуется его удалить
+ * @param string|null $value Идентификатор платежа
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если длина переданной строки не равна 36 символам
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setPaymentId($value)
+ {
+ $this->currentObject->setPaymentId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавлвиает идентификатор магазина
+ * @param string $value Идентификатор магазина или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setAccountId($value)
+ {
+ $this->currentObject->setAccountId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает идентификатор товара
+ * @param string|null $value Идентификатор товара или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setGatewayId($value)
+ {
+ $this->currentObject->setGatewayId($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает статус выбираемых возвратов
+ * @param string $value Статус выбираемых платежей или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Выбрасывается если переданное значение не является валидным статусом
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setStatus($value)
+ {
+ $this->currentObject->setStatus($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает токен следующей страницы выборки
+ * @param string $value Токен следующей страницы выборки или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueTypeException Выбрасывается если в метод была передана не строка
+ */
+ public function setNextPage($value)
+ {
+ $this->currentObject->setNextPage($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, от (не включая) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGt($value)
+ {
+ $this->currentObject->setCreatedGt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, от (включительно) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedGte($value)
+ {
+ $this->currentObject->setCreatedGte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, до (не включая) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLt($value)
+ {
+ $this->currentObject->setCreatedLt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату создания до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время создания, до (включительно) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setCreatedLte($value)
+ {
+ $this->currentObject->setCreatedLte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGt($value)
+ {
+ $this->currentObject->setAuthorizedGt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения от которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения операции, от (не включая) или null чтобы удалить
+ * значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedGte($value)
+ {
+ $this->currentObject->setAuthorizedGte($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения, до (не включая) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLt($value)
+ {
+ $this->currentObject->setAuthorizedLt($value);
+ return $this;
+ }
+
+ /**
+ * Устанавливает дату проведения до которой выбираются возвраты
+ * @param \DateTime|string|int|null $value Время проведения, до (включительно) или null чтобы удалить значение
+ * @return RefundsRequestBuilder Инстанс текущего объекта билдера
+ *
+ * @throws InvalidPropertyValueException Генерируется если была передана дата в невалидном формате (была передана
+ * строка или число, которые не удалось преобразовать в валидную дату)
+ * @throws InvalidPropertyValueTypeException Генерируется если была передана дата с не тем типом (передана не
+ * строка, не число и не значение типа \DateTime)
+ */
+ public function setAuthorizedLte($value)
+ {
+ $this->currentObject->setAuthorizedLte($value);
+ return $this;
+ }
+
+ /**
+ * Собирает и возвращает объект запроса списка возвратов магазина
+ * @param array|null $options Массив с настройками запроса
+ * @return RefundsRequestInterface Инстанс объекта запроса к API для получения списка возвратов магазина
+ */
+ public function build(array $options = null)
+ {
+ return parent::build($options);
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php
new file mode 100644
index 0000000..db6ece9
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsRequestInterface.php
@@ -0,0 +1,194 @@
+ 'refund_id',
+ 'paymentId' => 'payment_id',
+ 'gatewayId' => 'gateway_id',
+ 'createdGte' => 'created_gte',
+ 'createdGt' => 'created_gt',
+ 'createdLte' => 'created_lte',
+ 'createdLt' => 'created_lt',
+ 'authorizedGte' => 'authorized_gte',
+ 'authorizedGt' => 'authorized_gt',
+ 'authorizedLte' => 'authorized_lte',
+ 'authorizedLt' => 'authorized_lt',
+ 'status' => 'status',
+ 'nextPage' => 'next_page',
+ );
+
+ /**
+ * Сериализует объект запроса к API для дальнейшей его отправки
+ * @param RefundsRequestInterface $request Сериализуемый объект
+ * @return array Массив с инфомрацией, отпарвляемый в дальнейшем в API
+ */
+ public function serialize(RefundsRequestInterface $request)
+ {
+ $result = array(
+ 'account_id' => $request->getAccountId(),
+ );
+ foreach (self::$propertyMap as $property => $name) {
+ $value = $request->{$property};
+ if (!empty($value)) {
+ if ($value instanceof \DateTime) {
+ if ($value->getTimestamp() > 1) {
+ $result[$name] = $value->format(DATE_ATOM);
+ }
+ } else {
+ $result[$name] = $value;
+ }
+ }
+ }
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php
new file mode 100644
index 0000000..977d092
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/Refunds/RefundsResponse.php
@@ -0,0 +1,65 @@
+items = array();
+ foreach ($options['items'] as $item) {
+ $this->items[] = new RefundResponse($item);
+ }
+ if (!empty($options['next_page'])) {
+ $this->nextPage = $options['next_page'];
+ }
+ }
+
+ /**
+ * Возвращает список возвратов
+ * @return RefundInterface[] Список возвратов
+ */
+ public function getItems()
+ {
+ return $this->items;
+ }
+
+ /**
+ * Возвращает токен следующей страницы, если он задан, или null
+ * @return string|null Токен следующей страницы
+ */
+ public function getNextPage()
+ {
+ return $this->nextPage;
+ }
+
+ /**
+ * Проверяет имееотся ли в ответе токен следующей страницы
+ * @return bool True если токен следующей страницы есть, false если нет
+ */
+ public function hasNextPage()
+ {
+ return $this->nextPage !== null;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php
new file mode 100644
index 0000000..658ae5b
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/Request/StateUnknownResponse.php
@@ -0,0 +1,71 @@
+_retryAfter = 5;
+ }
+
+ /**
+ * Возвращает рекомендуемое время спустя которое следует повторить запрос
+ * @return int Рекомендуемое время спустя которое следует повторить запрос
+ */
+ public function getRetryAfter()
+ {
+ return $this->_retryAfter;
+ }
+
+ /**
+ * Устанавливает рекомендуемое время спустя которое следует повторить запрос
+ * @param int $value Время через которое рекомендуется повторить запрос
+ *
+ * @throws EmptyPropertyValueException Выкидывается если было передано пустое значение
+ * @throws InvalidPropertyValueException Выкидывается если значение невалидно
+ * @throws InvalidPropertyValueTypeException Выкидывается если переданное значение не является числом
+ */
+ public function setRetryAfter($value)
+ {
+ if ($value === null || $value === '') {
+ throw new EmptyPropertyValueException(
+ 'Empty retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter'
+ );
+ } elseif (is_numeric($value)) {
+ $castedValue = (int)$value;
+ if ($castedValue <= 0) {
+ throw new InvalidPropertyValueException(
+ 'Invalid retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter', $value
+ );
+ }
+ $this->_retryAfter = (int)$castedValue;
+ } else {
+ throw new InvalidPropertyValueTypeException(
+ 'Invalid retry after value in StateUnknownResponse', 0, 'StateUnknownResponse.retryAfter', $value
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json
new file mode 100644
index 0000000..76a5a21
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/lib/configuration.json
@@ -0,0 +1,3 @@
+{
+ "url" : "https://payment.yandex.net/api/v3"
+}
\ No newline at end of file
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php
new file mode 100644
index 0000000..90e721a
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/AbstractLogger.php
@@ -0,0 +1,128 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php
new file mode 100644
index 0000000..67f852d
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/InvalidArgumentException.php
@@ -0,0 +1,7 @@
+logger = $logger;
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php
new file mode 100644
index 0000000..5ea7243
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/LoggerInterface.php
@@ -0,0 +1,123 @@
+log(LogLevel::EMERGENCY, $message, $context);
+ }
+
+ /**
+ * Action must be taken immediately.
+ *
+ * Example: Entire website down, database unavailable, etc. This should
+ * trigger the SMS alerts and wake you up.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->log(LogLevel::ALERT, $message, $context);
+ }
+
+ /**
+ * Critical conditions.
+ *
+ * Example: Application component unavailable, unexpected exception.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->log(LogLevel::CRITICAL, $message, $context);
+ }
+
+ /**
+ * Runtime errors that do not require immediate action but should typically
+ * be logged and monitored.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function error($message, array $context = array())
+ {
+ $this->log(LogLevel::ERROR, $message, $context);
+ }
+
+ /**
+ * Exceptional occurrences that are not errors.
+ *
+ * Example: Use of deprecated APIs, poor use of an API, undesirable things
+ * that are not necessarily wrong.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->log(LogLevel::WARNING, $message, $context);
+ }
+
+ /**
+ * Normal but significant events.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->log(LogLevel::NOTICE, $message, $context);
+ }
+
+ /**
+ * Interesting events.
+ *
+ * Example: User logs in, SQL logs.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function info($message, array $context = array())
+ {
+ $this->log(LogLevel::INFO, $message, $context);
+ }
+
+ /**
+ * Detailed debug information.
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->log(LogLevel::DEBUG, $message, $context);
+ }
+
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ abstract public function log($level, $message, array $context = array());
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php
new file mode 100644
index 0000000..d8cd682
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/NullLogger.php
@@ -0,0 +1,28 @@
+logger) { }`
+ * blocks.
+ */
+class NullLogger extends AbstractLogger
+{
+ /**
+ * Logs with an arbitrary level.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ public function log($level, $message, array $context = array())
+ {
+ // noop
+ }
+}
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md
new file mode 100644
index 0000000..574bc1c
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/lib/yandex-checkout-sdk/vendor/psr-log/README.md
@@ -0,0 +1,45 @@
+PSR Log
+=======
+
+This repository holds all interfaces/classes/traits related to
+[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md).
+
+Note that this is not a logger of its own. It is merely an interface that
+describes a logger. See the specification for more details.
+
+Usage
+-----
+
+If you need a logger, you can use the interface like this:
+
+```php
+logger = $logger;
+ }
+
+ public function doSomething()
+ {
+ if ($this->logger) {
+ $this->logger->info('Doing work');
+ }
+
+ // do something useful
+ }
+}
+```
+
+You can then pick one of the implementations of the interface to get a logger.
+
+If you want to implement the interface, you can require this package and
+implement `Psr\Log\LoggerInterface` in your code. Please read the
+[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+for details.
diff --git a/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php b/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php
new file mode 100644
index 0000000..105c516
--- /dev/null
+++ b/src/components/com_jshopping/payments/pm_yandex_money/payment_form_kassa.php
@@ -0,0 +1,106 @@
+
+