-- Миграция со встроенного модуля «Монета» PHPShop 6.7.0 (в таблице настроек версия 1.2). -- Ядро запускает файл кнопкой «Обновить модуль» (PHPShopModules::getUpdate()): режет текст -- по точке с запятой и выполняет запросы с подавлением ошибок, потом пишет версию из module.xml. -- Поэтому точки с запятой — только в конце запросов, а повторный запуск ничего не портит: -- ALTER на существующую колонку молча падает, UPDATE трогают только незаполненные поля. -- Старые колонки (merchant_id, merchant_sig, title, serial) не удаляются, merchant_sig очищается после переноса кода. ALTER TABLE `phpshop_modules_moneta_system` ADD COLUMN `account_id` varchar(20) NOT NULL default '' AFTER `id`, ADD COLUMN `integrity_code` varchar(255) NOT NULL default '' AFTER `account_id`, ADD COLUMN `payment_server` varchar(8) NOT NULL default 'PROD' AFTER `integrity_code`, ADD COLUMN `test_mode` enum('0','1') NOT NULL default '0' AFTER `payment_server`, ADD COLUMN `fiscalization` enum('0','1') NOT NULL default '0' AFTER `test_mode`, ADD COLUMN `receipt_email` varchar(64) NOT NULL default '' AFTER `fiscalization`, ADD COLUMN `sno` varchar(1) NOT NULL default '' AFTER `receipt_email`, ADD COLUMN `payment_method` varchar(32) NOT NULL default 'full_payment' AFTER `sno`, ADD COLUMN `payment_object` varchar(32) NOT NULL default 'commodity' AFTER `payment_method`, ADD COLUMN `goods_vat` varchar(16) NOT NULL default 'platform' AFTER `payment_object`, ADD COLUMN `delivery_vat` varchar(16) NOT NULL default 'platform' AFTER `goods_vat`, ADD COLUMN `paid_status` int(11) NOT NULL default '101' AFTER `status`; -- Номер счёта: встроенный модуль хранил его в merchant_id без проверки, переносим только цифры. UPDATE `phpshop_modules_moneta_system` SET `account_id` = TRIM(`merchant_id`) WHERE `account_id` = '' AND TRIM(`merchant_id`) REGEXP '^[0-9]{1,20}$'; -- «Секретное слово» встроенного модуля подписывало форму оплаты — это код проверки целостности. UPDATE `phpshop_modules_moneta_system` SET `integrity_code` = TRIM(`merchant_sig`) WHERE `integrity_code` = '' AND TRIM(`merchant_sig`) <> ''; -- Секрет не должен оставаться вторым экземпляром в старой колонке: после смены кода в настройках -- прежний лежал бы там дальше. Очищаем, только когда код уже перенесён. UPDATE `phpshop_modules_moneta_system` SET `merchant_sig` = '' WHERE `integrity_code` <> '' AND `merchant_sig` <> ''; -- «Оплата при статусе»: у встроенного модуля колонка допускала NULL, у нас 0 — «Новый заказ». UPDATE `phpshop_modules_moneta_system` SET `status` = 0 WHERE `status` IS NULL; ALTER TABLE `phpshop_modules_moneta_system` MODIFY `status` int(11) NOT NULL default '0'; -- Журнал операций: строка на каждое подписанное уведомление Check/Pay URL. У зачтённой -- оплаты заполнен paid_order_id — UNIQUE не даёт зачесть заказ дважды (MyISAM, транзакций нет). CREATE TABLE IF NOT EXISTS `phpshop_modules_moneta_operations` ( `id` int(11) NOT NULL auto_increment, `created_at` int(11) NOT NULL default '0', `command` varchar(8) NOT NULL default '', `transaction_id` varchar(255) NOT NULL default '', `operation_id` varchar(255) NOT NULL default '', `order_id` int(11) NOT NULL default '0', `order_uid` varchar(64) NOT NULL default '', `amount` varchar(20) NOT NULL default '', `test_mode` enum('0','1') NOT NULL default '0', `result_code` int(11) default NULL, `event` varchar(32) NOT NULL default '', `paid_order_id` int(11) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `paid_order_id` (`paid_order_id`), KEY `order_id` (`order_id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; -- Счётчик журнала отказов колбэка до проверки подписи: не чаще строки в минуту, одна строка. -- Отдельно от настроек — запись в MyISAM блокирует таблицу, а настройки читает каждый колбэк. CREATE TABLE IF NOT EXISTS `phpshop_modules_moneta_log_throttle` ( `id` int(11) NOT NULL default '1', `logged_at` int(11) NOT NULL default '0', `skipped` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; INSERT IGNORE INTO `phpshop_modules_moneta_log_throttle` (`id`, `logged_at`, `skipped`) VALUES (1, 0, 0); -- Способ оплаты 10048: название и иконку встроенного модуля меняем на новые, только если мерчант -- их не правил. Кириллица — с префиксом _cp1251: файл в cp1251, а «Обновить модуль» выполняет -- его без перекодировки (в отличие от install/module.sql при «Включить»), и на магазине с базой -- utf-8 литерал без префикса читался бы в кодировке соединения и не совпал бы с названием. UPDATE `phpshop_payment_systems` SET `name` = _cp1251'Приём платежей банковскими картами, через СБП и Pay-сервисы (Монета)' WHERE `id` = 10048 AND `name` = _cp1251'Мир, Visa, Mastercard (Монета)'; UPDATE `phpshop_payment_systems` SET `icon` = 'phpshop/modules/moneta/templates/moneta.svg' WHERE `id` = 10048 AND `icon` = '/UserFiles/Image/Payments/moneta.png';