└── Magento-Payment-Module-master ├── CopyrightNotice.txt ├── Data.php ├── Helper └── Data.php ├── AUTHORS.md ├── view └── frontend │ ├── web │ ├── img │ │ └── logoPayme.png │ ├── js │ │ └── view │ │ │ └── payment │ │ │ ├── payme.js │ │ │ └── method-renderer │ │ │ └── payme.js │ ├── template │ │ └── payment │ │ │ └── payme-form.html │ └── css │ │ └── style.min.css │ └── layout │ └── checkout_index_index.xml ├── css └── style.css ├── UniversalKernel ├── Core │ ├── Install_Bd │ │ ├── 5_Constraint.sql │ │ ├── 1_payme_s_state.sql │ │ ├── 4_Install_payme_s_state.sql │ │ ├── 2_payme_config.sql │ │ └── 3_payme_transactions.sql │ ├── Error.php │ ├── PaymeCallback.php │ ├── View │ │ └── OrderReturn.html │ ├── Format.php │ ├── Security.php │ ├── MySqli.php │ ├── MySql.php │ └── Payme.php ├── IndexInsert.php ├── IndexOrderReturn.php ├── IndexInsertOrder.php ├── IndexConfigCreate.php └── IndexCallback.php ├── registration.php ├── etc ├── adminhtml │ ├── routes.xml │ ├── events.xml │ └── system.xml ├── module.xml ├── frontend │ └── routes.xml └── config.xml ├── composer.json ├── Model ├── Config │ ├── KiTPaymeYesno.php │ └── AllKiTPaymeCallbackPay.php └── Payme.php ├── Controller ├── Checkout │ ├── Start.php │ └── OrderReturn.php ├── Callback │ └── Start.php └── Adminhtml │ └── System │ └── Config │ ├── Edit.php │ └── Save.php ├── CHANGELOG.md ├── README.md ├── Setup └── InstallData.php ├── LICENSE.txt └── LICENSE_AFL.txt /Magento-Payment-Module-master/CopyrightNotice.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Data.php: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/etc/module.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/etc/frontend/routes.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/etc/adminhtml/events.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Install_Bd/4_Install_payme_s_state.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO `{TABLE_PREFIX}payme_s_state` (`code`, `name`) VALUES 2 | ('-2', 'Транзакция отменена после завершения (начальное состояние 2).'), 3 | ('-1', 'Транзакция отменена (начальное состояние 1).'), 4 | ('0', 'ожидание подтверждения'), 5 | ('1', 'Транзакция успешно создана, ожидание подтверждения (начальное состояние 0).'), 6 | ('2', 'Транзакция успешно завершена (начальное состояние 1).'), 7 | ('3', 'Заказ выполнен. Невозможно отменить транзакцию. Товар или услуга предоставлена покупателю в полном объеме.'); 8 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/view/frontend/web/js/view/payment/payme.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | define( 5 | [ 6 | 'uiComponent', 7 | 'Magento_Checkout/js/model/payment/renderer-list' 8 | ], 9 | function ( 10 | Component, 11 | rendererList 12 | ) { 13 | 'use strict'; 14 | rendererList.push( 15 | { 16 | type: 'payme', 17 | component: 'KiT_Payme/js/view/payment/method-renderer/payme' 18 | } 19 | ); 20 | /** Add view logic here if needed */ 21 | return Component.extend({}); 22 | } 23 | ); 24 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "KiT/Payme", 3 | "description": "N/A", 4 | "require": { 5 | "php": "~7.0.0|~7.0.1|~7.0.2|7.0.4|~7.0.6|~7.0.21", 6 | "magento/module-checkout": "100.1.*", 7 | "magento/module-payment": "100.1.*", 8 | "magento/framework": "100.1.*" 9 | }, 10 | "type": "magento2-module", 11 | "version": "1.0.13", 12 | "license": [ 13 | "OSL-3.0", 14 | "AFL-3.0" 15 | ], 16 | "autoload": { 17 | "files": [ 18 | "registration.php" 19 | ], 20 | "psr-4": { 21 | "KiT\\Payme\\": "" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/etc/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | 1 15 | Payme Payment 16 | KiT\Payme\Model\Payme 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Model/Config/KiTPaymeYesno.php: -------------------------------------------------------------------------------- 1 | 'N', 'label' => __('Нет')], 19 | ['value' => 'Y', 'label' => __('Да')] 20 | ]; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/view/frontend/web/js/view/payment/method-renderer/payme.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | define( 5 | [ 6 | 'Magento_Checkout/js/view/payment/default', 7 | 'mage/url' 8 | ], 9 | function (Component, url) { 10 | 'use strict'; 11 | 12 | return Component.extend({ 13 | defaults: { 14 | template: 'KiT_Payme/payment/payme-form' 15 | }, 16 | redirectAfterPlaceOrder: false, 17 | /** 18 | * After place order callback 19 | */ 20 | afterPlaceOrder: function () { 21 | window.location.replace(url.build('payme/checkout/start')); 22 | } 23 | }); 24 | } 25 | ); 26 | 27 | 28 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Model/Config/AllKiTPaymeCallbackPay.php: -------------------------------------------------------------------------------- 1 | 0, 'label' => __('Моментально')], 19 | ['value' => 15000, 'label' => __('15 секунд')], 20 | ['value' => 30000, 'label' => __('30 секунд')], 21 | ['value' => 60000, 'label' => __('60 секунд')] 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Install_Bd/2_payme_config.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `{TABLE_PREFIX}payme_config` ( 2 | `kass_id` bigint(20) NOT NULL AUTO_INCREMENT, 3 | `merchant_id` char(200) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Идентификатор касса', 4 | `merchant_key` char(200) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Key', 5 | `merchant_key_test` char(200) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Test Key', 6 | `endpoint_url` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'o Опциональный выбор callback url ', 7 | `redirect` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Перенаправление URL', 8 | `endpoint_url_pay_sys` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'размещения ссылки на сайт интернет магазина', 9 | `is_flag_test` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Y' COMMENT 'o Вкл/Выкл тестового режима', 10 | `is_flag_send_tovar` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL COMMENT 'o Вкл/Выкл отправки данных о товарах (объект Detail в форме отправки)', 11 | `callback_timeout` int(11) NOT NULL DEFAULT '0' COMMENT 'Вернуться после оплаты через: 15, 30, 60 сик', 12 | PRIMARY KEY (`kass_id`), 13 | UNIQUE KEY `merchant_id` (`merchant_id`), 14 | UNIQUE KEY `merchant_key` (`merchant_key`) 15 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Параметры метода' AUTO_INCREMENT=2 ; -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/IndexInsert.php: -------------------------------------------------------------------------------- 1 | Insert($Sql); 32 | return $return; 33 | } 34 | 35 | } 36 | 37 | //print_r($db_group); 38 | if(isset($db_group)) 39 | return IndexInsert::Construct($db_group, $Sql); 40 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/IndexOrderReturn.php: -------------------------------------------------------------------------------- 1 | OrderReturn(); 32 | return $return; 33 | } 34 | 35 | } 36 | 37 | //print_r($db_group); 38 | if(isset($db_group)) 39 | return IndexInsertOrder::Construct($db_group); 40 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/IndexInsertOrder.php: -------------------------------------------------------------------------------- 1 | InsertOredr($Get); 32 | return $return; 33 | } 34 | 35 | } 36 | 37 | //print_r($db_group); 38 | if(isset($db_group)) 39 | return IndexInsertOrder::Construct($db_group, $Get); 40 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Error.php: -------------------------------------------------------------------------------- 1 | getMsg($msg).'
ERROR: '.$str); 18 | } 19 | 20 | public function NotFileInclude($str=null){ 21 | exit($this->getMsg($msg).'
ERROR: '.$str); 22 | } 23 | 24 | public function MethodExists($str){ 25 | exit($this->getMsg($msg).'
ERROR: '.$str); 26 | } 27 | public function TryCatch($str=null){ 28 | exit($this->getMsg($msg).'
ERROR: '.$str); 29 | } 30 | public function NotToken($str=null){ 31 | exit($this->getMsg($msg).'
ERROR: '.$str); 32 | } 33 | 34 | public function GetErrorMes($str=null){ 35 | exit($this->getMsg($msg).'
ERROR: '.$str); 36 | } 37 | 38 | private function getMsg ( $msg ) { 39 | $bt = debug_backtrace(); 40 | $this->getMsg = array( 41 | 'class' => $bt[2]['class'], 42 | 'class' => $bt[2]['class'], 43 | 'file' => $bt[1]['file'], 44 | 'line' => $bt[1]['line'] 45 | ); 46 | return "$class::$function: $msg in $file at $line" ; 47 | } 48 | } 49 | ?> 50 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/PaymeCallback.php: -------------------------------------------------------------------------------- 1 | BD = new MySql($db_group); } 18 | if (extension_loaded('mysqli') and !$DbConnect){$DbConnect=true; $this->BD = new DbMySqli($db_group);} 19 | if (extension_loaded('mysql') and !$DbConnect){$DbConnect=true; $this->BD = new MySql($db_group);} 20 | $this->Security = new Security(); 21 | $this->Payme = new Payme($this->BD); 22 | 23 | $this->Get(); 24 | $this->Authorization($this->Get); 25 | } 26 | private function Get(){ 27 | $this->Get = $this->Security->_json(true); 28 | $this->Header = PHP_AUTH_USER.':'.PHP_AUTH_PW; 29 | } 30 | private function Authorization(){ 31 | $this->Payme->MerchantKey(PHP_AUTH_PW); 32 | $this->Payme->FindMerchantKey($this->Get); 33 | } 34 | 35 | //выполнять 36 | public function Execute($Sql=null){ 37 | 38 | $function_name = $this->Get['method']; 39 | 40 | if(method_exists($this->Payme, $function_name)) 41 | { 42 | $rezult = $this->Payme->$function_name($this->Get, $Sql); 43 | } 44 | 45 | return $rezult; 46 | } 47 | } 48 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/View/OrderReturn.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Cостояния оплаты 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 22 | 23 | 24 |
25 | 28 | 31 |
32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Install_Bd/3_payme_transactions.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `{TABLE_PREFIX}payme_transactions` ( 2 | `transaction_id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'идентификатор транзакции ', 3 | `paycom_transaction_id` char(25) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Номер или идентификатор транзакции в биллинге мерчанта. Формат строки определяется мерчантом.', 4 | `paycom_time` varchar(13) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Время создания транзакции Paycom.', 5 | `paycom_time_datetime` datetime NOT NULL COMMENT 'Время создания транзакции Paycom.', 6 | `create_time` datetime NOT NULL COMMENT 'Время добавления транзакции в биллинге мерчанта.', 7 | `perform_time` datetime DEFAULT NULL COMMENT 'Время проведения транзакции в биллинге мерчанта', 8 | `cancel_time` datetime DEFAULT NULL COMMENT 'Время отмены транзакции в биллинге мерчанта.', 9 | `amount` int(11) NOT NULL COMMENT 'Сумма платежа в тийинах.', 10 | `state` int(11) NOT NULL DEFAULT '0' COMMENT 'Состояние транзакции', 11 | `reason` tinyint(2) DEFAULT NULL COMMENT 'причина отмены транзакции.', 12 | `receivers` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'JSON array of receivers', 13 | `order_id` bigint(20) NOT NULL COMMENT 'заказ', 14 | `cms_order_id` char(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 'номер заказа CMS', 15 | `is_flag_test` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL, 16 | PRIMARY KEY (`transaction_id`), 17 | UNIQUE KEY `paycom_transaction_id` (`paycom_transaction_id`), 18 | UNIQUE KEY `order_id` (`order_id`,`paycom_transaction_id`), 19 | KEY `state` (`state`) 20 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Controller/Checkout/Start.php: -------------------------------------------------------------------------------- 1 | _payme = $payme; 38 | $this->_checkoutSession = $checkoutSession; 39 | $this->_resultPageFactory = $resultPageFactory; 40 | parent::__construct($context); 41 | } 42 | 43 | /** 44 | * Start form Submission here 45 | */ 46 | public function execute() 47 | { 48 | $html = $this->_payme->getPostHTML($this->getOrder()); 49 | echo $html; 50 | } 51 | 52 | /** 53 | * Get order object. 54 | * 55 | * @return \Magento\Sales\Model\Order 56 | */ 57 | protected function getOrder() 58 | { 59 | return $this->_checkoutSession->getLastRealOrder(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Controller/Checkout/OrderReturn.php: -------------------------------------------------------------------------------- 1 | _payme = $payme; 38 | $this->_checkoutSession = $checkoutSession; 39 | $this->_resultPageFactory = $resultPageFactory; 40 | parent::__construct($context); 41 | } 42 | 43 | /** 44 | * Start form Submission here 45 | */ 46 | public function execute() 47 | { 48 | $html = $this->_payme->OrderReturn(); 49 | echo $html; 50 | } 51 | 52 | /** 53 | * Get order object. 54 | * 55 | * @return \Magento\Sales\Model\Order 56 | */ 57 | protected function getOrder() 58 | { 59 | return $this->_checkoutSession->getLastRealOrder(); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Controller/Callback/Start.php: -------------------------------------------------------------------------------- 1 | get('Magento\Framework\App\DeploymentConfig'); 27 | $result = $config->get( 28 | ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT 29 | . '/' . $key 30 | ); 31 | return $result; 32 | } 33 | 34 | public function execute() 35 | { 36 | define('TABLE_PREFIX', $this->rm_db(ConfigOptionsListConstants::KEY_PREFIX)); 37 | $port = '3306'; 38 | $db_group = array( 39 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 40 | 'DB_PORT'=>$port, 41 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 42 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 43 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 44 | 'CHARSET'=>'utf8', 45 | 'CHARSETCOLAT'=>'utf8_general_ci' 46 | ); 47 | /* 48 | $db_group = array( 49 | 'DB_HOST'=>'localhost', 50 | 'DB_PORT'=>'3306', 51 | 'DB_NAME'=>'irc_payme', 52 | 'DB_USER'=>'irc_payme', 53 | 'DB_PASS'=>'payme', 54 | 'CHARSET'=>'utf8', 55 | 'CHARSETCOLAT'=>'utf8_general_ci' 56 | ); 57 | */ 58 | //print_r($Db); 59 | 60 | include_once './app/code/KiT/Payme/UniversalKernel/IndexCallback.php'; 61 | exit; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/view/frontend/web/template/payment/payme-form.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 7 | 12 |
13 |
14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 |
22 |
23 | 24 | 25 | 26 |
27 | 28 |
29 |
30 | 41 |
42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | ## [Unreleased] 5 | 6 | ## [1.0.7] - 2018-03-25 7 | ### Added 8 | - Поддержка расширения mysqli 9 | 10 | ## [1.0.6] - 2018-03-06 11 | ### Added 12 | - Изменения в настройках 13 | 14 | 15 | ## [1.0.5] - 2018-03-02 16 | ### Added 17 | - Изменения SQL запроса в УЯ 18 | 19 | ## [1.0.4] - 2018-03-02 20 | ### Added 21 | - Изменения SQL запроса в УЯ 22 | 23 | ## [1.0.3] - 2018-02-28 24 | ### Added 25 | - Изменения приходящий параметры 26 | - Изменения SQL запроса в УЯ 27 | 28 | ## [1.0.2] - 2018-02-22 29 | ### Added 30 | - Исправлено конфигурации 31 | 32 | ## [1.0.1] - 2018-02-21 33 | ### Added 34 | - Изменения префикс таблиц базы 35 | 36 | ## [1.0.0] - 2018-02-08 37 | ### Added 38 | - Новая визуальная идентичность. 39 | - Версия навигации. 40 | - Русский Перевод. 41 | 42 | ## [0.3.0] - 2018-02-02 43 | ### Added 44 | - RU перевод. 45 | 46 | ## [0.2.0] - 2018-01-15 47 | ### Added 48 | - Создания CMS для Magento 2.2.2 49 | - Создания CMS для Magento 2.1.11 50 | 51 | ## [0.1.0] - 2018-01-10 52 | ### Changed 53 | - Транзакционные данные 54 | 55 | ## [0.0.6] - 2018-01-09 56 | ### Added 57 | - БД для сохранения транзакционных сведений и зашифрованных ключей и кодов; 58 | 59 | ## [0.0.5] - 2018-01-08 60 | ### Added 61 | - Создани я база данных УЯ 62 | • Транзакционные данные: 63 | • Транзитный идентификатор (Платежного Плагина); 64 | • Номер заказа; 65 | • Номер транзакции; 66 | • Дату и время транзакции; 67 | • Дату и время ответа из Платежной Системы; 68 | • Состояние транзакции заказа (успешно или оплачено, ошибка и причина, не оплачено и причина); 69 | • Сведения о покупателе; 70 | • Номер аккаунта или идентификатор (генерируемый CMS) 71 | • Зашифрованные идентификационные данные владельца магазина. (KEY&Merchant ID). 72 | 73 | 74 | ## [0.0.4] - 2018-01-07 75 | ### Added 76 | - o репозитарий (регистр) платежных провайдеров и платежных адаптеров. 77 | 78 | ## [0.0.3] - 2018-01-05 79 | ### Added 80 | - o библиотеку для соединения с БД; 81 | 82 | ## [0.0.2] - 2018-01-04 83 | ### Added 84 | - o библиотеку безопасности и функциональную логику; 85 | 86 | 87 | ## 0.0.1 - 2018-01-01 88 | ### Added 89 | - Создания Универсальное ядро 90 | Основная задача УЯ заключается в реализации единой/унифицированной инфраструктурной программной логики плагинов на каждый отдельно взятый CMS. В число инфраструктурных задач можно отнести, например, отправку и получение запросов/ответов, форматирование данных, фиксация данных в БД, журналирование и т.п. УЯ имеет следующие особенности. 91 | • разрабатывается в унифицированном виде для всех CMS; 92 | • непосредственно работает с платежным провайдером и адаптером; 93 | • не нуждается в обновлении при update версии CMS; 94 | • нуждается в обновлении только при обновлении протоколов и требований платежного провайдера; 95 | 96 | 97 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Format.php: -------------------------------------------------------------------------------- 1 | $merchant_id, 43 | 'merchant_key_test' => $merchant_key_test, 44 | 'merchant_key' => $merchant_key, 45 | 'checkout_url' => $checkout_url, 46 | 'endpoint_url' => $endpoint_url, 47 | 'status_test' => $status_test, 48 | 'status_tovar' => $status_tovar, 49 | 'callback_pay' => $callback_pay, 50 | 'redirect' => $redirect 51 | ); 52 | } 53 | $Payme->PaymeConfig($Get); 54 | } 55 | 56 | } 57 | //print_r($db_group); 58 | if(isset($db_group)) 59 | ConfigCreate::Construct($db_group, isset($Get)?$Get:null); 60 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/view/frontend/layout/checkout_index_index.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | uiComponent 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | KiT_Payme/js/view/payment/payme 30 | 31 | 32 | true 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/README.md: -------------------------------------------------------------------------------- 1 | # MAGENTO 2.2.2 - PAYME V1.x.x - УСТАНОВКА МОДУЛЕЙ 2 | 3 | ### ПРЕАМБУЛА 4 | 5 | Господа и, может дамы, я не буду углубляться в процедуру установки `Magento`, априори, подразумевая, что система в рабочей кондиции. Тем не менее, следует убедиться в том, что кеширование отключено (его можно отключить в админке на странице `System/Cache Management`) - это необходимо для того, чтобы сразу видеть производимые вами изменения. 6 | 7 | ### ПОШАГОВАЯ ИНСТРУКЦИЯ ПО УСТАНОВКЕ ПЛАТЕЖНОГО ПЛАГИНА PAYME 8 | 9 | - Создайте директорию: `mk /home/mysite.uz/www/app/code` 10 | - Перейдите в директорию: `cd /home/mysite.uz/www/app/code` 11 | - Скачайте архив с модулем и разархивируйте его на своем компьютере. 12 | - Скопируйте содержимое папки `/home/mysite.uz/www/app/code/` в корень сайта 13 | - Используя командную строку выполните следующие команды: 14 | - Распакуйте дистрибутив в требуемую папку на веб-сервере: `/home/mysite.uz/www/app/code/` 15 | - Периходим в диреторию `cd /home/mysite.uz/www/` 16 | - Структура каталогов 17 | 18 | ``` 19 | home 20 | └── mysite.uz 21 | └── www 22 | └── app 23 | └── code 24 | └── KiT 25 | └── Payme 26 | ├── Controller 27 | │ ├── Adminhtml 28 | │ ├── Callback 29 | │ └── Checkout 30 | ├── css 31 | │ └── style.css 32 | ├── etc 33 | │ ├── adminhtml 34 | │ ├── frontend 35 | │ ├── config.xml 36 | │ └── module.xml 37 | ├── Helper 38 | │ └── Data.php 39 | ├── Model 40 | │ ├── Config 41 | │ └── Payme.php 42 | ├── UniversalKernel 43 | ├── view 44 | ├── AUTHORS.md 45 | ├── CHANGELOG.md 46 | ├── composer.json 47 | ├── CopyrightNotice.txt 48 | ├── Data.php 49 | ├── LICENSE_AFL.txt 50 | ├── LICENSE.txt 51 | ├── README.md 52 | └── registration.php 53 | ``` 54 | - Проверим статус нашего модуля, для это в консоли надо запустить: `php bin/magento module:status` 55 | - После выполнения этой команды вы увидите список всех установленных модулей, а во втором списке, 56 | будут модули, которые еще не установлены, т.е. наш новый модуль: `List of disabled modules: KiT_Payme` 57 | Это означает, что наш модуль правильно настроен, но в данный момент он отключен. 58 | - Дадим доступ `cache` 59 | ```bash 60 | sudo chmod -R 777 var pub 61 | sudo rm -rf var/cache/* var/generation/* 62 | ``` 63 | - Чтобы его активировать, нужно выполнить команду: `php bin/magento module:enable KiT_Payme` 64 | - Если сейчас открыть сайт в браузере вы увидите ошибку: 65 | 66 | `There has been an error processing your request` 67 | 68 | А в логах сайта (`var/reports/`): 69 | 70 | `Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory.` 71 | 72 | - Необходимо выполнить требуемую команду: `php bin/magento setup:upgrade` 73 | - Выполняем команду: `php bin/magento setup:static-content:deploy` 74 | - Очистка `cache`: `php bin/magento cache:clean` 75 | - Если включена компиляция дополнительно, используя командную строку, выполните: 76 | 77 | ```bash 78 | php bin/magento setup:di:compile 79 | php bin/magento cache:clean 80 | ``` 81 | - Наконец, пустой модуль окончательно установлен. 82 | В этом можно убедиться, пройдя по: `Stores -> Configuration -> Advanced -> Advanced -> Disable Modules Output` 83 | - Браво!!! Добро пожаловать в философию `«Payme»` - надежность и успех твоего бизнеса!!! 84 | 85 | ### ВМЕСТО ЭПИЛОГА! 86 | 87 | Работая с `«Payme»`, Вы обрекаете себя на тотальный успех и процветание! 88 | Мы продолжаем уверенно расти, и, порой опережать технологии и задавать новый технологический формат для наших потребителей! 89 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Setup/InstallData.php: -------------------------------------------------------------------------------- 1 | startSetup(); 23 | 24 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/merchant_id','')); 25 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/merchant_key','')); 26 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/merchant_key_test','')); 27 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/status_test','Y')); 28 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/status_tovar','Y')); 29 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/callback_pay','0')); 30 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/endpoint_url','http://magento.uz/payme/callback/start')); 31 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/checkout_url','https://checkout.paycom.uz')); 32 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/view_batten','Отправит')); 33 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/active','1')); 34 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/callback_checkout_url','')); 35 | $installer->getConnection()->insertArray('core_config_data', array('config_id','scope','scope_id','path','value'), array(null,'default', '0','payment/payme/checkout_url_test','https://test.paycom.uz')); 36 | 37 | $port = '3306'; 38 | $db_group = array( 39 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 40 | 'DB_PORT'=>$port, 41 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 42 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 43 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 44 | 'CHARSET'=>'utf8', 45 | 'CHARSETCOLAT'=>'utf8_general_ci' 46 | ); 47 | include './app/code/KiT/Payme/UniversalKernel/IndexConfigCreate.php'; 48 | 49 | $installer->endSetup(); 50 | } 51 | 52 | public function rm_db($key) { 53 | $om = \Magento\Framework\App\ObjectManager::getInstance(); 54 | $config = $om->get('Magento\Framework\App\DeploymentConfig'); 55 | $result = $config->get( 56 | ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT 57 | . '/' . $key 58 | ); 59 | return $result; 60 | } 61 | }*/ -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Security.php: -------------------------------------------------------------------------------- 1 | $v) 32 | { 33 | $param = explode('=', $v); 34 | $r[$param[0]][] = $param[1]; 35 | } 36 | return $r; 37 | } 38 | public function param($value, $param = false) { 39 | 40 | if (gettype ( $value ) == 'integer') { 41 | $value = (int)$value; 42 | }elseif ($value == NULL and $value == '') { 43 | $value = ''; 44 | } 45 | else if($param == 'p_description' 46 | or $param == 'description' 47 | or $param == 'title' 48 | or $param == 'p_title' 49 | ){ 50 | //$value = htmlentities ( $value); 51 | $filter = array("<", ">"); 52 | $value = str_replace ($filter, "|", $value); 53 | $value = htmlentities($value, ENT_QUOTES, "UTF-8"); 54 | } 55 | else { 56 | //$value = htmlentities ( $value); 57 | $value = htmlentities($this->str_trim($value), ENT_QUOTES, "UTF-8"); 58 | } 59 | return $value; 60 | } 61 | public function str_trim($str) 62 | { 63 | $str = trim($str, "\t\r\n\x0B"); 64 | return $str; 65 | } 66 | 67 | public function Decode($data){ 68 | // return $data; 69 | $key = << -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/MySqli.php: -------------------------------------------------------------------------------- 1 | ';print_r($db_group);exit(''); 19 | $this->LibError = new XXI_Error(); 20 | 21 | try { 22 | DbMySqli::connect($db_group); 23 | } catch ( PDOException $e ) { 24 | die ( 'Подключение не удалось:'); 25 | } 26 | } 27 | 28 | public static function connect($db_group) 29 | {// Синглтончик-с в целях экономии 30 | if(empty(self::$link)) 31 | { 32 | self::$link = @mysqli_connect($db_group['DB_HOST'], $db_group['DB_USER'], $db_group['DB_PASS'], $db_group['DB_NAME']) 33 | or die('Подключение не удалось:'); 34 | 35 | mysqli_set_charset(self::$link, 'utf8'); 36 | } 37 | } 38 | public function query($query = false) { 39 | if (! $query) { 40 | $this->sql = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $this->sql); 41 | $query = $this->sql; 42 | } 43 | else 44 | { 45 | $query = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $query); 46 | } 47 | $query = str_replace("'", '"', $query); 48 | $args = func_get_args (); 49 | array_shift ( $args ); 50 | 51 | $this->reponse = mysqli_query(DbMySqli::$link, $query); 52 | if(!$this->reponse) 53 | { 54 | /*$this->reponse = mysqli_query(db::$link, 'SELECT * FROM `wp_payme_config` LIMIT 0 , 30'); 55 | while($row = $this->fetch()) { 56 | print_r ($row); 57 | } 58 | die(mysqli_error(db::$link).' SQL: ');*/ 59 | $this->reponse = false; 60 | } 61 | 62 | return $this; 63 | } 64 | public function fetch(){ 65 | return $this->reponse->fetch_object(); 66 | } 67 | public function paramArray($value) 68 | { 69 | if(is_array($value)) 70 | { 71 | $i = 0; 72 | foreach ($value As $key=>$val) 73 | { 74 | if ($i == 0) { 75 | $id_m .= "'" . $val . "'"; 76 | } else { 77 | $id_m .= ', \'' . $val . "'"; 78 | } 79 | $i++; 80 | } 81 | } 82 | else 83 | { 84 | for($i = 0; $i <= $value->_count - 1; $i ++) { 85 | if ($i == 0) { 86 | $id_m .= "'" . $value->$i . "'"; 87 | } else { 88 | $id_m .= ', \'' . $value->$i . "'"; 89 | } 90 | } 91 | } 92 | return $id_m; 93 | } 94 | public function param($param, $value, $param_Mysql = '') { 95 | if ($param_Mysql == 'in' or is_array($value)) { 96 | $id_m = $this->paramArray($value); 97 | $this->sql = str_replace ( $param, $id_m, $this->sql ); 98 | } 99 | elseif ($value == "NULL") 100 | { 101 | $this->sql = str_replace ( $param, 0, $this->sql ); 102 | } 103 | elseif ($value == "'00'") 104 | { 105 | $this->sql = str_replace ( $param, "'00'", $this->sql ); 106 | } 107 | elseif ($value == '0' And $value != Null) 108 | { 109 | $this->sql = str_replace ( $param, 0, $this->sql ); 110 | } 111 | elseif ($value == 'CONF_PARAM') { 112 | //$value = $$param_Mysql; 113 | $value = explode('::', $param_Mysql); 114 | 115 | if (gettype ( $value ) == 'integer') { 116 | $this->sql = str_replace ( $param, "'" . $value . "'", $this->sql ); 117 | } elseif ($value == 'NOW()') { 118 | $this->sql = str_replace ( $param, 'NOW()', $this->sql ); 119 | } elseif ($value == NULL) { 120 | $this->sql = str_replace ( $param, 'NULL', $this->sql ); 121 | } else { 122 | $this->sql = str_replace ( $param, "'" . $value . "'", $this->sql ); 123 | } 124 | } else { 125 | if (gettype ( $value ) == 'integer') { 126 | $this->sql = str_replace ( $param, $value, $this->sql ); 127 | } elseif ($value == 'NOW()') { 128 | $this->sql = str_replace ( $param, 'NOW()', $this->sql ); 129 | } elseif ($value == NULL) { 130 | $this->sql = str_replace ( $param, 'NULL', $this->sql ); 131 | } else { 132 | $this->sql = str_replace ( $param, "'" . $value . "'", $this->sql ); 133 | } 134 | } 135 | return $this->sql; 136 | } 137 | 138 | } 139 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/IndexCallback.php: -------------------------------------------------------------------------------- 1 | 'Update {TABLE_PREFIX}sales_order Set status=:p_state Where increment_id = :p_cms_order_id', 39 | 'Param'=>array( 40 | ':p_state' => 'payme_paid' 41 | ) 42 | ); 43 | $Sql['PerformTransaction'][] = array( 44 | 'Sql' => 'Update {TABLE_PREFIX}sales_order_grid Set status=:p_state Where increment_id = :p_cms_order_id', 45 | 'Param'=>array( 46 | ':p_state' => 'payme_paid' 47 | ) 48 | ); 49 | $Sql['PerformTransaction'][] = array( 50 | 'Sql' => 'UPDATE {TABLE_PREFIX}sales_order_status_history AS t 51 | JOIN {TABLE_PREFIX}sales_order o 52 | On o.entity_id = t.parent_id 53 | Set t.status=:p_state 54 | Where o.increment_id = :p_cms_order_id', 55 | 'Param'=>array( 56 | ':p_state' => 'payme_paid' 57 | ) 58 | ); 59 | 60 | 61 | $Sql['CancelTransaction'][] = array( 62 | 'Sql' => 'Update {TABLE_PREFIX}sales_order Set status=:p_state Where increment_id = :p_cms_order_id', 63 | 'Param'=>array( 64 | ':p_state' => 'canceled' 65 | ) 66 | ); 67 | $Sql['CancelTransaction'][] = array( 68 | 'Sql' => 'Update {TABLE_PREFIX}sales_order_grid Set status=:p_state Where increment_id = :p_cms_order_id', 69 | 'Param'=>array( 70 | ':p_state' => 'canceled' 71 | ) 72 | ); 73 | $Sql['CancelTransaction'][] = array( 74 | 'Sql' => 'UPDATE {TABLE_PREFIX}sales_order_status_history AS t 75 | JOIN {TABLE_PREFIX}sales_order o 76 | On o.entity_id = t.parent_id 77 | Set t.status=:p_state 78 | Where o.increment_id = :p_cms_order_id', 79 | 'Param'=>array( 80 | ':p_state' => 'canceled' 81 | ) 82 | ); 83 | $rezult = $PaymeCallback->Execute($Sql); 84 | exit(json_encode($rezult)); 85 | } 86 | else 87 | { 88 | 89 | if(!ini_get('register_globals')) 90 | { 91 | if(function_exists('apache_response_headers')){ 92 | $headers = apache_request_headers(); 93 | try { 94 | $headers['Authorization'] = $_SERVER['PHP_AUTH_USER']; 95 | } 96 | catch (Exception $e) { 97 | $headers['Authorization'] = null; 98 | } 99 | } 100 | $Param['error'] = array( 101 | 'code'=>(int)'-32504', 102 | 'message'=>"Скрипты требует включения параметр register_globals данной директивы. Для этого в папке скрипта или в папке домена создайте файл .htaccess и поместите в него следующую директиву: php_flag register_globals on.Если тоже не будут работат тогда добавит файл .htaccess в нужной папке уже существует, то просто добавьте эту строку в конец RewriteEngine on RewriteRule .* - [E=PHP_AUTH_USER:%{HTTP:Authorization},L] ", 103 | "data" => array(function_exists('apache_response_headers')?$headers:headers_list()), 104 | "time"=>Format::timestamp(true) 105 | ); 106 | exit(json_encode($Param)); 107 | } 108 | $Security = new Security(); 109 | $Get = $Security->_json(true); 110 | if(isset($Get['id'])) 111 | { 112 | $Param['id'] = $Get['id']; 113 | $Param['error'] = array( 114 | 'code'=>(int)'-32504', 115 | 'message'=>array("ru"=>'Недостаточно привилегий для выполнения метода.',"uz"=>'Недостаточно привилегий для выполнения метода.',"en"=>'Недостаточно привилегий для выполнения метода.'), 116 | "data" => __METHOD__, 117 | "time"=>Format::timestamp(true) 118 | ); 119 | } 120 | else 121 | { 122 | $Param['id'] = $Get['id']; 123 | $Param['error'] = array( 124 | 'code'=>(int)'-32504', 125 | 'message'=>array("ru"=>'Недостаточно привилегий для выполнения метода.',"uz"=>'Недостаточно привилегий для выполнения метода.',"en"=>'Недостаточно привилегий для выполнения метода.'), 126 | "data" => __METHOD__, 127 | "time"=>Format::timestamp(true) 128 | ); 129 | } 130 | 131 | exit(json_encode($Param)); 132 | } 133 | } 134 | 135 | } 136 | //print_r($db_group); 137 | if(isset($db_group)) 138 | ExePaymeCallback::Construct($db_group); 139 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/MySql.php: -------------------------------------------------------------------------------- 1 | ';print_r($db_group);exit(''); 18 | $this->LibError = new XXI_Error(); 19 | 20 | try { 21 | parent::__construct ( 'mysql:host=' . $db_group['DB_HOST'] . ';port=' . $db_group['DB_PORT'] . ';dbname=' . $db_group['DB_NAME'], $db_group['DB_USER'], $db_group['DB_PASS'] ); 22 | $this->exec ( "set names " . $db_group['CHARSET'] ); 23 | $this->setAttribute ( parent::ATTR_DEFAULT_FETCH_MODE, parent::FETCH_OBJ ); 24 | } catch ( PDOException $e ) { 25 | 26 | die ( 'Подключение не удалось:'); 27 | $this->LibError->TryCatch($e->getMessage()); 28 | } 29 | } 30 | public function LogMysql($LogFile, $str){ 31 | 32 | if (!$fp = fopen(BASEPATH.$LogFile, 'a')) { 33 | $this->FileError = "Не могу открыть файл"; 34 | return false; 35 | } 36 | if (is_writable(BASEPATH.$LogFile)) { 37 | if (fwrite($fp, $str."\r") === FALSE) { 38 | return false; 39 | } 40 | fclose($fp); 41 | return true; 42 | } 43 | } 44 | public function query_($query = false) { 45 | if (! $query) { 46 | $this->sql = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $this->sql); 47 | $query = $this->sql; 48 | } 49 | else 50 | { 51 | $query = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $query); 52 | } 53 | try 54 | { 55 | $this->setAttribute ( parent::ATTR_DEFAULT_FETCH_MODE, parent::FETCH_OBJ ); 56 | $this->SqlInfo = $this->exec($query); 57 | } 58 | catch (Exception $e) { 59 | $this->SqlError = parent::errorInfo(); 60 | $this->LibError->TryCatch($e->getMessage()); 61 | } 62 | 63 | return $this->SqlInfo; 64 | } 65 | 66 | public function query($query = false) { 67 | if (! $query) { 68 | $this->sql = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $this->sql); 69 | $query = $this->sql; 70 | } 71 | else 72 | { 73 | $query = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $query); 74 | } 75 | $args = func_get_args (); 76 | array_shift ( $args ); 77 | 78 | $reponse = parent::prepare ( $query ); 79 | if(!$reponse) 80 | { 81 | $this->SqlError = parent::errorInfo(); 82 | } 83 | try 84 | { 85 | $reponse->execute($args); 86 | } 87 | catch (Exception $e) { 88 | $this->SqlError = parent::errorInfo(); 89 | $this->LibError->TryCatch($e->getMessage()); 90 | } 91 | return $reponse; 92 | } 93 | public function insecureQuery($query) { // you can use the old query at your risk ;) and should use secure quote() function with it 94 | return parent::query ( $query ); 95 | } 96 | 97 | public function paramArray($value) 98 | { 99 | if(is_array($value)) 100 | { 101 | $i = 0; 102 | foreach ($value As $key=>$val) 103 | { 104 | if ($i == 0) { 105 | $id_m .= "'" . $val . "'"; 106 | } else { 107 | $id_m .= ', \'' . $val . "'"; 108 | } 109 | $i++; 110 | } 111 | } 112 | else 113 | { 114 | for($i = 0; $i <= $value->_count - 1; $i ++) { 115 | if ($i == 0) { 116 | $id_m .= "'" . $value->$i . "'"; 117 | } else { 118 | $id_m .= ', \'' . $value->$i . "'"; 119 | } 120 | } 121 | } 122 | return $id_m; 123 | } 124 | public function param($param, $value, $param_Mysql = '') { 125 | if ($param_Mysql == 'in' or is_array($value)) { 126 | $id_m = $this->paramArray($value); 127 | $this->sql = str_replace ( $param, $id_m, $this->sql ); 128 | } 129 | elseif ($value == "NULL") 130 | { 131 | $this->sql = str_replace ( $param, 0, $this->sql ); 132 | } 133 | elseif ($value == "'00'") 134 | { 135 | $this->sql = str_replace ( $param, "'00'", $this->sql ); 136 | } 137 | elseif ($value == '0' And $value != Null) 138 | { 139 | $this->sql = str_replace ( $param, 0, $this->sql ); 140 | } 141 | elseif ($value == 'CONF_PARAM') { 142 | //$value = $$param_Mysql; 143 | $value = explode('::', $param_Mysql); 144 | 145 | if (gettype ( $value ) == 'integer') { 146 | $this->sql = str_replace ( $param, $value, $this->sql ); 147 | } elseif ($value == 'NOW()') { 148 | $this->sql = str_replace ( $param, 'NOW()', $this->sql ); 149 | } elseif ($value == NULL) { 150 | $this->sql = str_replace ( $param, 'NULL', $this->sql ); 151 | } else { 152 | $this->sql = str_replace ( $param, "'" . $value . "'", $this->sql ); 153 | } 154 | } else { 155 | if (gettype ( $value ) == 'integer') { 156 | $this->sql = str_replace ( $param, $value, $this->sql ); 157 | } elseif ($value == 'NOW()') { 158 | $this->sql = str_replace ( $param, 'NOW()', $this->sql ); 159 | } elseif ($value == NULL) { 160 | $this->sql = str_replace ( $param, 'NULL', $this->sql ); 161 | } else { 162 | $this->sql = str_replace ( $param, "'" . $value . "'", $this->sql ); 163 | } 164 | } 165 | return $this->sql; 166 | } 167 | 168 | } 169 | ?> -------------------------------------------------------------------------------- /Magento-Payment-Module-master/etc/adminhtml/system.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 16 | Настройки для кассы можно взять из кабинета поставщика Раздел Параметры для разработчика . 17 | 18 | ]]> 19 | 20 | 21 | Magento\Config\Model\Config\Source\Yesno 22 | payment/payme/active 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | payment/payme/merchant_id 40 | 41 | 42 | 43 | payment/payme/merchant_key 44 | 45 | 46 | 47 | payment/payme/merchant_key_test 48 | 49 | 50 | 51 | KiT\Payme\Model\Config\KiTPaymeYesno 52 | payment/payme/status_test 53 | Настройки оплаты. 54 | 55 | 56 | 57 | 58 | KiT\Payme\Model\Config\KiTPaymeYesno 59 | payment/payme/status_tovar 60 | Настройки оплаты. 61 | 62 | 63 | 69 | 70 | 71 | 72 | KiT\Payme\Model\Config\AllKiTPaymeCallbackPay 73 | payment/payme/callback_pay 74 | Настройки оплаты. 75 | 76 | 77 | 78 | 79 | 80 | Данные URL необходимо внести в настроеки кассы в кабинете поставщика 81 | payment/payme/endpoint_url 82 | 83 | 84 | 85 | Данные URL необходим для размещения ссылки на Ваш магазин в прилжении Payme в разделе Оплаты 86 | payment/payme/callback_checkout_url 87 | 88 | 89 | 90 | 91 | Шаблон кнопки оплаты 92 | payment/payme/view_batten 93 | 94 | 95 | 96 |
97 |
98 |
-------------------------------------------------------------------------------- /Magento-Payment-Module-master/Controller/Adminhtml/System/Config/Edit.php: -------------------------------------------------------------------------------- 1 | resultPageFactory = $resultPageFactory; 34 | } 35 | 36 | /** 37 | * Edit configuration section 38 | * 39 | * @return \Magento\Framework\App\ResponseInterface|void 40 | */ 41 | public function execute() 42 | { 43 | $this->InsertConfig(); 44 | $current = $this->getRequest()->getParam('section'); 45 | $website = $this->getRequest()->getParam('website'); 46 | $store = $this->getRequest()->getParam('store'); 47 | 48 | /** @var $section \Magento\Config\Model\Config\Structure\Element\Section */ 49 | $section = $this->_configStructure->getElement($current); 50 | if ($current && !$section->isVisible($website, $store)) { 51 | /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ 52 | $redirectResult = $this->resultRedirectFactory->create(); 53 | return $redirectResult->setPath('adminhtml/*/', ['website' => $website, 'store' => $store]); 54 | } 55 | 56 | /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ 57 | $resultPage = $this->resultPageFactory->create(); 58 | $resultPage->setActiveMenu('Magento_Config::system_config'); 59 | $resultPage->getLayout()->getBlock('menu')->setAdditionalCacheKeyInfo([$current]); 60 | $resultPage->addBreadcrumb(__('System'), __('System'), $this->getUrl('*\/system')); 61 | $resultPage->getConfig()->getTitle()->prepend(__('Configuration')); 62 | return $resultPage; 63 | } 64 | 65 | public function InsertConfig(){ 66 | $port = '3306'; 67 | define('TABLE_PREFIX', $this->rm_db(ConfigOptionsListConstants::KEY_PREFIX)); 68 | $db_group = array( 69 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 70 | 'DB_PORT'=>$port, 71 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 72 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 73 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 74 | 'CHARSET'=>'utf8', 75 | 'CHARSETCOLAT'=>'utf8_general_ci' 76 | ); 77 | if(isset($_SERVER['HTTP_HOST'])) 78 | $Http_Host = $_SERVER['HTTP_HOST']; 79 | else 80 | $Http_Host = ''; 81 | $Sql[] = "INSERT INTO {TABLE_PREFIX}core_config_data(config_id, scope, scope_id, path, value) 82 | SELECT t.* 83 | from (select null, 'default', 0, 'payment/payme/active', '1' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/active' ) 84 | union 85 | select null, 'default', 0, 'payment/payme/checkout_url', 'https://checkout.paycom.uz' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/checkout_url' ) 86 | union 87 | select null, 'default', 0, 'payment/payme/checkout_url_test', 'https://test.paycom.uz' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/checkout_url_test' ) 88 | union 89 | select null, 'default', 0, 'payment/payme/merchant_id', NULL from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/merchant_id' ) 90 | union 91 | select null, 'default', 0, 'payment/payme/merchant_key', NULL from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/merchant_key' ) 92 | union 93 | select null, 'default', 0, 'payment/payme/merchant_key_test', NULL from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/merchant_key_test' ) 94 | union 95 | select null, 'default', 0, 'payment/payme/status_test', 'Y' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/status_test' ) 96 | union 97 | select null, 'default', 0, 'payment/payme/status_tovar', 'N' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/status_tovar' ) 98 | union 99 | select null, 'default', 0, 'payment/payme/callback_pay', '0' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/callback_pay' ) 100 | union 101 | select null, 'default', 0, 'payment/payme/endpoint_url', 'http://{$Http_Host}/payme/callback/start' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/endpoint_url' ) 102 | union 103 | select null, 'default', 0, 'payment/payme/callback_checkout_url', 'http://{$Http_Host}/?payme=pay' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/callback_checkout_url' ) 104 | union 105 | select null, 'default', 0, 'payment/payme/redirect', 'http://{$Http_Host}/order_return/Checkout/OrderReturn' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/redirects' ) 106 | union 107 | select null, 'default', 0, 'payment/payme/view_batten', 'Отправить' from dual WHERE NOT EXISTS (SELECT 1 FROM {TABLE_PREFIX}core_config_data tt WHERE tt.path = 'payment/payme/view_batten' )) t"; 108 | 109 | $Sql[] = " INSERT INTO `{TABLE_PREFIX}sales_order_status` (`status`, `label`) 110 | Select 'payme_paid', 'Оплачена' 111 | From dual 112 | Where NOT EXISTS (SELECT 1 FROM `sales_order_status` t WHERE t.status = 'payme_paid')"; 113 | 114 | include './app/code/KiT/Payme/UniversalKernel/IndexInsert.php'; 115 | } 116 | 117 | public function rm_db($key) { 118 | $om = \Magento\Framework\App\ObjectManager::getInstance(); 119 | $config = $om->get('Magento\Framework\App\DeploymentConfig'); 120 | $result = $config->get( 121 | ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT 122 | . '/' . $key 123 | ); 124 | return $result; 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Controller/Adminhtml/System/Config/Save.php: -------------------------------------------------------------------------------- 1 | 16 | * @SuppressWarnings(PHPMD.CouplingBetweenObjects) 17 | */ 18 | class Save extends AbstractConfig 19 | { 20 | /** 21 | * Backend Config Model Factory 22 | * 23 | * @var \Magento\Config\Model\Config\Factory 24 | */ 25 | protected $_configFactory; 26 | 27 | /** 28 | * @var \Magento\Framework\Cache\FrontendInterface 29 | */ 30 | protected $_cache; 31 | 32 | /** 33 | * @var \Magento\Framework\Stdlib\StringUtils 34 | */ 35 | protected $string; 36 | 37 | /** 38 | * @param \Magento\Backend\App\Action\Context $context 39 | * @param \Magento\Config\Model\Config\Structure $configStructure 40 | * @param \Magento\Config\Controller\Adminhtml\System\ConfigSectionChecker $sectionChecker 41 | * @param \Magento\Config\Model\Config\Factory $configFactory 42 | * @param \Magento\Framework\Cache\FrontendInterface $cache 43 | * @param \Magento\Framework\Stdlib\StringUtils $string 44 | */ 45 | public function __construct( 46 | \Magento\Backend\App\Action\Context $context, 47 | \Magento\Config\Model\Config\Structure $configStructure, 48 | \Magento\Config\Controller\Adminhtml\System\ConfigSectionChecker $sectionChecker, 49 | \Magento\Config\Model\Config\Factory $configFactory, 50 | \Magento\Framework\Cache\FrontendInterface $cache, 51 | \Magento\Framework\Stdlib\StringUtils $string 52 | ) { 53 | 54 | parent::__construct($context, $configStructure, $sectionChecker); 55 | $this->_configFactory = $configFactory; 56 | $this->_cache = $cache; 57 | $this->string = $string; 58 | 59 | } 60 | 61 | public function CreateConfig(){ 62 | $port = '3306'; 63 | define('TABLE_PREFIX', $this->rm_db(ConfigOptionsListConstants::KEY_PREFIX)); 64 | $db_group = array( 65 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 66 | 'DB_PORT'=>$port, 67 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 68 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 69 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 70 | 'CHARSET'=>'utf8', 71 | 'CHARSETCOLAT'=>'utf8_general_ci' 72 | ); 73 | include './app/code/KiT/Payme/UniversalKernel/IndexConfigCreate.php'; 74 | } 75 | 76 | public function rm_db($key) { 77 | $om = \Magento\Framework\App\ObjectManager::getInstance(); 78 | $config = $om->get('Magento\Framework\App\DeploymentConfig'); 79 | $result = $config->get( 80 | ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT 81 | . '/' . $key 82 | ); 83 | return $result; 84 | } 85 | 86 | /** 87 | * Save configuration 88 | * 89 | * @return \Magento\Backend\Model\View\Result\Redirect 90 | */ 91 | protected function _getGroupsForSave() 92 | { 93 | $groups = $this->getRequest()->getPost('groups'); 94 | $files = $this->getRequest()->getFiles('groups'); 95 | 96 | if ($files && is_array($files)) { 97 | /** 98 | * Carefully merge $_FILES and $_POST information 99 | * None of '+=' or 'array_merge_recursive' can do this correct 100 | */ 101 | foreach ($files as $groupName => $group) { 102 | $data = $this->_processNestedGroups($group); 103 | if (!empty($data)) { 104 | if (!empty($groups[$groupName])) { 105 | $groups[$groupName] = array_merge_recursive((array)$groups[$groupName], $data); 106 | } else { 107 | $groups[$groupName] = $data; 108 | } 109 | } 110 | } 111 | } 112 | return $groups; 113 | } 114 | 115 | /** 116 | * Process nested groups 117 | * 118 | * @param mixed $group 119 | * @return array 120 | */ 121 | protected function _processNestedGroups($group) 122 | { 123 | $data = []; 124 | 125 | if (isset($group['fields']) && is_array($group['fields'])) { 126 | foreach ($group['fields'] as $fieldName => $field) { 127 | if (!empty($field['value'])) { 128 | $data['fields'][$fieldName] = ['value' => $field['value']]; 129 | } 130 | } 131 | } 132 | 133 | if (isset($group['groups']) && is_array($group['groups'])) { 134 | foreach ($group['groups'] as $groupName => $groupData) { 135 | $nestedGroup = $this->_processNestedGroups($groupData); 136 | if (!empty($nestedGroup)) { 137 | $data['groups'][$groupName] = $nestedGroup; 138 | } 139 | } 140 | } 141 | 142 | return $data; 143 | } 144 | 145 | /** 146 | * Custom save logic for section 147 | * 148 | * @return void 149 | */ 150 | protected function _saveSection() 151 | { 152 | $method = '_save' . $this->string->upperCaseWords($this->getRequest()->getParam('section'), '_', ''); 153 | if (method_exists($this, $method)) { 154 | $this->{$method}(); 155 | } 156 | } 157 | 158 | /** 159 | * Advanced save procedure 160 | * 161 | * @return void 162 | */ 163 | protected function _saveAdvanced() 164 | { 165 | $this->_cache->clean(); 166 | } 167 | 168 | /** 169 | * Save configuration 170 | * 171 | * @return \Magento\Backend\Model\View\Result\Redirect 172 | */ 173 | public function execute() 174 | { 175 | $this->CreateConfig(); 176 | try { 177 | // custom save logic 178 | $this->_saveSection(); 179 | $section = $this->getRequest()->getParam('section'); 180 | $website = $this->getRequest()->getParam('website'); 181 | $store = $this->getRequest()->getParam('store'); 182 | 183 | $configData = [ 184 | 'section' => $section, 185 | 'website' => $website, 186 | 'store' => $store, 187 | 'groups' => $this->_getGroupsForSave(), 188 | ]; 189 | /** @var \Magento\Config\Model\Config $configModel */ 190 | $configModel = $this->_configFactory->create(['data' => $configData]); 191 | $configModel->save(); 192 | 193 | $this->messageManager->addSuccess(__('You saved the configuration.')); 194 | } catch (\Magento\Framework\Exception\LocalizedException $e) { 195 | $messages = explode("\n", $e->getMessage()); 196 | foreach ($messages as $message) { 197 | $this->messageManager->addError($message); 198 | } 199 | } catch (\Exception $e) { 200 | $this->messageManager->addException( 201 | $e, 202 | __('Something went wrong while saving this configuration:') . ' ' . $e->getMessage() 203 | ); 204 | } 205 | 206 | $this->_saveState($this->getRequest()->getPost('config_state')); 207 | /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ 208 | $resultRedirect = $this->resultRedirectFactory->create(); 209 | return $resultRedirect->setPath( 210 | 'adminhtml/system_config/edit', 211 | [ 212 | '_current' => ['section', 'website', 'store'], 213 | '_nosid' => true 214 | ] 215 | ); 216 | } 217 | } 218 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Open Software License ("OSL") v. 3.0 3 | 4 | This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: 5 | 6 | Licensed under the Open Software License version 3.0 7 | 8 | 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: 9 | 10 | 1. to reproduce the Original Work in copies, either alone or as part of a collective work; 11 | 12 | 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; 13 | 14 | 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; 15 | 16 | 4. to perform the Original Work publicly; and 17 | 18 | 5. to display the Original Work publicly. 19 | 20 | 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. 21 | 22 | 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. 23 | 24 | 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. 25 | 26 | 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). 27 | 28 | 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 29 | 30 | 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. 31 | 32 | 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. 33 | 34 | 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). 35 | 36 | 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. 37 | 38 | 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. 39 | 40 | 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. 41 | 42 | 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 43 | 44 | 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 45 | 46 | 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. 47 | 48 | 16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. -------------------------------------------------------------------------------- /Magento-Payment-Module-master/LICENSE_AFL.txt: -------------------------------------------------------------------------------- 1 | 2 | Academic Free License ("AFL") v. 3.0 3 | 4 | This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: 5 | 6 | Licensed under the Academic Free License version 3.0 7 | 8 | 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: 9 | 10 | 1. to reproduce the Original Work in copies, either alone or as part of a collective work; 11 | 12 | 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; 13 | 14 | 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License; 15 | 16 | 4. to perform the Original Work publicly; and 17 | 18 | 5. to display the Original Work publicly. 19 | 20 | 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. 21 | 22 | 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. 23 | 24 | 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. 25 | 26 | 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). 27 | 28 | 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 29 | 30 | 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. 31 | 32 | 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. 33 | 34 | 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). 35 | 36 | 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. 37 | 38 | 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. 39 | 40 | 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. 41 | 42 | 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 43 | 44 | 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 45 | 46 | 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. 47 | 48 | 16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. 49 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/Model/Payme.php: -------------------------------------------------------------------------------- 1 | _urlBuilder = $urlBuilder; 80 | $this->_exception = $exception; 81 | $this->_transactionRepository = $transactionRepository; 82 | $this->_transactionBuilder = $transactionBuilder; 83 | $this->_orderFactory = $orderFactory; 84 | $this->_storeManager = $storeManager; 85 | 86 | parent::__construct( 87 | $context, 88 | $registry, 89 | $extensionFactory, 90 | $customAttributeFactory, 91 | $paymentData, 92 | $scopeConfig, 93 | $logger, 94 | $resource, 95 | $resourceCollection, 96 | $data 97 | ); 98 | } 99 | 100 | /** 101 | * Instantiate state and set it to state object. 102 | * 103 | * @param string $paymentAction 104 | * @param \Magento\Framework\DataObject $stateObject 105 | */ 106 | public function initialize($paymentAction, $stateObject) 107 | { 108 | $payment = $this->getInfoInstance(); 109 | $order = $payment->getOrder(); 110 | $order->setCanSendNewEmailFlag(false); 111 | 112 | $stateObject->setState(\Magento\Sales\Model\Order::STATE_PENDING_PAYMENT); 113 | $stateObject->setStatus('pending_payment'); 114 | $stateObject->setIsNotified(false); 115 | } 116 | 117 | public function getPostHTML($order, $storeId = null) 118 | { 119 | 120 | $StatusTest = $this->getConfigData('status_test'); 121 | if($StatusTest == 'Y') 122 | $merchantUrl = $this->getConfigData('checkout_url_test'); 123 | else 124 | $merchantUrl = $this->getConfigData('checkout_url'); 125 | 126 | $merchantId = $this->getConfigData('merchant_id'); 127 | $merchantKey = $this->getConfigData('merchant_key'); 128 | $checkoutUrl = $this->getConfigData('checkout_url'); 129 | $callback_timeout = $this->getConfigData('callback_pay'); 130 | $Redirect = $this->getConfigData('redirect'); 131 | $Amount = $order->getGrandTotal()*100; 132 | $OrderId = $order->getIncrementId(); 133 | 134 | /* 135 | $paymeform = '
'; 136 | 137 | $paymeform.= $this->addHiddenField(array('name'=>'account[order_id]', 'value'=>$OrderId)); 138 | $paymeform.= $this->addHiddenField(array('name'=>'amount', 'value'=>$order->getGrandTotal())); 139 | $paymeform.= $this->addHiddenField(array('name'=>'merchant', 'value'=>$merchantId)); 140 | $paymeform.= $this->addHiddenField(array('name'=>'lang', 'value'=>'ru')); 141 | $paymeform.= $this->addHiddenField(array('name'=>'description', 'value'=>'Payment for Order Id #'.$OrderId)); 142 | 143 | $paymeform.= '
'; 144 | 145 | $paymehtml = ''; 146 | $paymehtml.= $paymeform; 147 | //$paymehtml.= ''; 148 | $paymehtml.= ''; 149 | return $paymehtml; 150 | 151 | $paymeform = '
152 |
153 | 154 | 155 | 156 | 157 | 158 |
159 |
160 | 161 |
'; 162 | 163 | */ 164 | 165 | $Get = array( 166 | 'Amount'=>$Amount, 167 | 'OrderId'=>$OrderId, 168 | 'CmsOrderId'=>$OrderId, 169 | 'IsFlagTest'=>$StatusTest 170 | ); 171 | 172 | $port = '3306'; 173 | $db_group = array( 174 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 175 | 'DB_PORT'=>$port, 176 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 177 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 178 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 179 | 'CHARSET'=>'utf8', 180 | 'CHARSETCOLAT'=>'utf8_general_ci' 181 | ); 182 | 183 | $return = include './app/code/KiT/Payme/UniversalKernel/IndexInsertOrder.php'; 184 | 185 | $Url = "{$merchantUrl}/".base64_encode("m={$merchantId};ac.order_id={$return['id']};a={$Amount};l=ru;c={$Redirect}?order_id={$return['id']};ct={$callback_timeout}"); 186 | //$Url1 = "{$merchantUrl}/".("m={$return['id']};ac.order_id={$OrderId};a={$Amount};l=ru;c=http://magento.uz;ct={$callback_timeout}"); 187 | //print_r($return); 188 | //exit($Url.'
'.$Url1); 189 | header('Location: '.$Url); 190 | exit(); 191 | return $Url; 192 | } 193 | public function OrderReturn() 194 | { 195 | 196 | $StatusTest = $this->getConfigData('status_test'); 197 | if($StatusTest == 'Y') 198 | $merchantUrl = $this->getConfigData('checkout_url_test'); 199 | else 200 | $merchantUrl = $this->getConfigData('checkout_url'); 201 | 202 | $merchantId = $this->getConfigData('merchant_id'); 203 | $merchantKey = $this->getConfigData('merchant_key'); 204 | $checkoutUrl = $this->getConfigData('checkout_url'); 205 | $callback_timeout = $this->getConfigData('callback_pay'); 206 | $Redirect = $this->getConfigData('redirect'); 207 | 208 | $port = '3306'; 209 | $db_group = array( 210 | 'DB_HOST'=>$this->rm_db(ConfigOptionsListConstants::KEY_HOST), 211 | 'DB_PORT'=>$port, 212 | 'DB_NAME'=>$this->rm_db(ConfigOptionsListConstants::KEY_NAME), 213 | 'DB_USER'=>$this->rm_db(ConfigOptionsListConstants::KEY_USER), 214 | 'DB_PASS'=>$this->rm_db(ConfigOptionsListConstants::KEY_PASSWORD), 215 | 'CHARSET'=>'utf8', 216 | 'CHARSETCOLAT'=>'utf8_general_ci' 217 | ); 218 | 219 | $paymeform = include './app/code/KiT/Payme/UniversalKernel/IndexOrderReturn.php'; 220 | 221 | return $paymeform; 222 | } 223 | private function rm_db($key) { 224 | $om = \Magento\Framework\App\ObjectManager::getInstance(); 225 | $config = $om->get('Magento\Framework\App\DeploymentConfig'); 226 | $result = $config->get( 227 | ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT 228 | . '/' . $key 229 | ); 230 | return $result; 231 | } 232 | /** 233 | * 234 | * @param $field 235 | * @return string 236 | */ 237 | 238 | protected function addHiddenField($field) 239 | { 240 | $name = $field['name']; 241 | $value = $field['value']; 242 | $input = ""; 243 | 244 | return $input; 245 | } 246 | 247 | /** 248 | * Get return URL. 249 | * 250 | * @param int|null $storeId 251 | * 252 | * @return string 253 | */ 254 | 255 | public function getSuccessUrl($storeId = null) 256 | { 257 | return $this->_getUrl('checkout/onepage/success', $storeId); 258 | } 259 | 260 | /** 261 | * Build URL for store. 262 | * 263 | * @param string $path 264 | * @param int $storeId 265 | * @param bool|null $secure 266 | * 267 | * @return string 268 | */ 269 | 270 | protected function _getUrl($path, $storeId, $secure = null) 271 | { 272 | $store = $this->_storeManager->getStore($storeId); 273 | 274 | return $this->_urlBuilder->getUrl( 275 | $path, 276 | ['_store' => $store, '_secure' => $secure === null ? $store->isCurrentlySecure() : $secure] 277 | ); 278 | } 279 | } 280 | -------------------------------------------------------------------------------- /Magento-Payment-Module-master/UniversalKernel/Core/Payme.php: -------------------------------------------------------------------------------- 1 | BD = $DB; 12 | $this->Security = new Security(); 13 | } 14 | 15 | public function MerchantKey($MerchantKey){ 16 | $this->MerchantKey = $MerchantKey; 17 | } 18 | public function FindMerchantKey($Get, $Sql = null){ 19 | $this->BD->sql = "Select t.merchant_id MerchantId, 20 | IF(is_flag_test IN ('Y'), t.merchant_key_test, t.merchant_key) MerchantKey, 21 | endpoint_url CheckoutUrl, 22 | endpoint_url_pay_sys, 23 | is_flag_test, 24 | is_flag_send_tovar, 25 | callback_timeout 26 | From {TABLE_PREFIX}payme_config t 27 | /* Where IF(is_flag_test IN ('Y'), t.merchant_key_test, t.merchant_key) = :p_merchant_key */ 28 | "; 29 | $this->BD->param(':p_merchant_key', $this->MerchantKey); 30 | $ret = $this->BD->query(); 31 | 32 | 33 | // $this->MerchantKey = null; 34 | while ( $o = $ret->fetch () ) { 35 | $this->MerchantIdCode = $o->MerchantId; 36 | $this->MerchantId = $this->Security->Decode($o->MerchantId); 37 | if($this->MerchantKey == html_entity_decode($this->Security->Decode($o->MerchantKey))) 38 | $this->MerchantKey = $this->Security->Decode($o->MerchantKey); 39 | else 40 | { 41 | $this->MerchantKey = null; 42 | $this->MerchantId = null; 43 | } 44 | $this->CheckoutUrl = $o->CheckoutUrl; 45 | } 46 | 47 | if(empty($this->MerchantKey) or empty($this->MerchantId)) 48 | { 49 | exit(json_encode($this->Error($Get['id'], '-32504', __METHOD__))); 50 | } 51 | } 52 | 53 | // -- метод 54 | /* -- Если оплата возможна — метод CheckPerformTransaction возвращает результат allow. Если оплата невозможна метод возвращает ошибку. 55 | * На этапе проверки возможности проведения транзакции, рекомендуется проверить все системы задействованные при выполнении методов: CreateTransaction и PerformTransaction. 56 | * Если нарушена работа хотя бы одной из задействованных систем, то при выполнении вышеуказанных методов необходимо вернуть ошибку -32400 (Системная ошибка). 57 | * */ 58 | public function CheckPerformTransaction($Get, $Sql = null){ 59 | 60 | $this->BD->sql = "SELECT t.transaction_id, 61 | t.amount 62 | FROM {TABLE_PREFIX}payme_transactions t 63 | WHERE t.transaction_id = :p_order_id 64 | AND t.state IN ('0', '1')"; 65 | 66 | if(isset($Get['params']['account']['order_id'])) 67 | $this->BD->param(':p_order_id', $Get['params']['account']['order_id']); 68 | if(isset($Get['params']['amount'])) 69 | $this->BD->param(':p_amount', $Get['params']['amount']); 70 | $ret = $this->BD->query (); 71 | $Param = $this->Error($Get['id'], '-31050', __METHOD__); 72 | while ( $o = $ret->fetch () ) { 73 | $this->transaction_id = $o->transaction_id; 74 | $Param = array(); 75 | if($o->amount == $Get['params']['amount']) 76 | { 77 | $this->BD->sql = "UPDATE {TABLE_PREFIX}payme_transactions Set state = '1' 78 | WHERE transaction_id = :p_transaction_id"; 79 | $this->BD->param(':p_transaction_id', $o->transaction_id); 80 | $ret = $this->BD->query (); 81 | //$this->DopSelect('CheckPerformTransaction', $Sql, $o); 82 | $Param['result']['allow'] = true; 83 | } 84 | else 85 | $Param = $this->Error($Get['id'], '-31001', __METHOD__.':amount'); 86 | break; 87 | } 88 | 89 | return $Param; 90 | } 91 | /* 92 | * Метод CreateTransaction возвращает список получателей платежа. Когда инициатор платежа является получателем, поле receivers можно опустить или присвоить ему значение NULL. 93 | * Если транзакция уже создана, приложение мерчанта производит базовую проверку транзакции и возвращает результат проверки в Paycom. 94 | */ 95 | public function CreateTransaction($Get, $Sql = null){ 96 | $this->BD->sql = "SELECT t.transaction_id, 97 | t.cms_order_id, 98 | t.order_id, 99 | t.amount, 100 | t.paycom_transaction_id, 101 | t.state 102 | FROM {TABLE_PREFIX}payme_transactions t 103 | WHERE t.transaction_id = :p_order_id 104 | /* AND t.state IN ('1')*/"; 105 | 106 | $this->BD->param(':p_order_id', $Get['params']['account']['order_id']); 107 | if(isset($Get['params']['amount'])) 108 | $this->BD->param(':p_amount', $Get['params']['amount']); 109 | $ret = $this->BD->query (); 110 | 111 | $Param = $this->Error($Get['id'], '-31050', __METHOD__); 112 | 113 | while ( $o = $ret->fetch () ) { 114 | if($o->amount == $Get['params']['amount'] and $o->state == 1) 115 | { 116 | if($Get['params']['id'] == $o->paycom_transaction_id or is_null($o->paycom_transaction_id)) 117 | { 118 | $this->transaction_id = $o->transaction_id; 119 | $Param = array(); 120 | 121 | if(is_null($o->paycom_transaction_id)){ 122 | $this->BD->sql = "UPDATE {TABLE_PREFIX}payme_transactions 123 | Set paycom_transaction_id = :p_paycom_transaction_id, paycom_time = :p_paycom_time, paycom_time_datetime = :p_paycom_time_datetime 124 | WHERE transaction_id = :p_transaction_id"; 125 | $this->BD->param(':p_transaction_id', $o->transaction_id); 126 | $this->BD->param(':p_paycom_transaction_id', $Get['params']['id']); 127 | $this->BD->param(':p_paycom_time_datetime', Format::timestamp2datetime($Get['params']['time'])); 128 | $this->BD->param(':p_paycom_time', $Get['params']['time']); 129 | $ret = $this->BD->query (); 130 | 131 | // $this->DopSelect('CreateTransaction', $Sql, $o); 132 | } 133 | $Param = $this->Result($Get['id'], $this->transaction_id); 134 | 135 | } 136 | } 137 | else if($o->amount == $Get['params']['amount'] and $o->state != 1) 138 | { 139 | $Param = $this->Error($Get['id'], '-31050', __METHOD__.':state'); 140 | } 141 | else 142 | $Param = $this->Error($Get['id'], '-31001', __METHOD__.':amount'); 143 | } 144 | 145 | return $Param; 146 | } 147 | 148 | 149 | /* 150 | * Метод CancelTransaction отменяет как созданную, так и проведенную транзакцию. 151 | * */ 152 | public function CancelTransaction($Get, $Sql = null){ 153 | 154 | $this->BD->sql = "SELECT t.transaction_id, 155 | t.cms_order_id, 156 | t.order_id, 157 | t.amount, 158 | t.paycom_transaction_id, 159 | t.state 160 | FROM {TABLE_PREFIX}payme_transactions t 161 | WHERE t.paycom_transaction_id = :p_paycom_transaction_id"; 162 | 163 | $this->BD->param(':p_paycom_transaction_id', $Get['params']['id']); 164 | $ret = $this->BD->query (); 165 | $Param = $this->Error($Get['id'], '-31050', __METHOD__); 166 | 167 | while ( $o = $ret->fetch () ) { 168 | if(in_array($o->state, array(1,2, -1, -2))) 169 | { 170 | $this->transaction_id = $o->transaction_id; 171 | $Param = array(); 172 | 173 | if($Get['params']['id'] == $o->paycom_transaction_id and in_array($o->state, array(1,2))) 174 | { 175 | $this->BD->sql = "UPDATE {TABLE_PREFIX}payme_transactions 176 | Set reason=:p_reason, state = :p_state, cancel_time=NOW() 177 | WHERE transaction_id = :p_transaction_id"; 178 | $this->BD->param(':p_transaction_id', $o->transaction_id); 179 | $this->BD->param(':p_reason', $Get['params']['reason']); 180 | $this->BD->param(':p_state', $o->state==1?-1:-2); 181 | 182 | $ret = $this->BD->query (); 183 | $this->DopSelect('CancelTransaction', $Sql, $o); 184 | 185 | } 186 | // print_r($sql);exit(); 187 | $Param = $this->Result($Get['id'], $this->transaction_id); 188 | 189 | } 190 | else 191 | $Param = $this->Error($Get['id'], -31007, __METHOD__.':state'); 192 | } 193 | 194 | return $Param; 195 | } 196 | /* 197 | * CheckTransaction 198 | * */ 199 | public function CheckTransaction($Get, $Sql = null){ 200 | $this->BD->sql = "SELECT t.transaction_id, 201 | t.cms_order_id, 202 | t.amount, 203 | t.state 204 | FROM {TABLE_PREFIX}payme_transactions t 205 | WHERE t.paycom_transaction_id = :p_paycom_transaction_id"; 206 | 207 | $this->BD->param(':p_paycom_transaction_id', $Get['params']['id']); 208 | $ret = $this->BD->query (); 209 | $Param = $this->Error($Get['id'], '-31050', __METHOD__); 210 | 211 | while ( $o = $ret->fetch () ) { 212 | $this->transaction_id = $o->transaction_id; 213 | $Param = array(); 214 | $Param = $this->Result($Get['id'], $this->transaction_id); 215 | } 216 | 217 | return $Param; 218 | } 219 | 220 | /* 221 | * Метод PerformTransaction зачисляет средства на счет мерчанта и выставляет у заказа статус «оплачен». 222 | */ 223 | public function PerformTransaction($Get, $Sql = null){ 224 | $this->BD->sql = "SELECT t.transaction_id, 225 | t.amount, 226 | t.paycom_transaction_id, 227 | t.state, 228 | t.cms_order_id, 229 | t.order_id 230 | FROM {TABLE_PREFIX}payme_transactions t 231 | WHERE t.paycom_transaction_id = :p_paycom_transaction_id"; 232 | 233 | $this->BD->param(':p_paycom_transaction_id', $Get['params']['id']); 234 | $ret = $this->BD->query (); 235 | $Param = $this->Error($Get['id'], '-31050', __METHOD__); 236 | 237 | while ( $o = $ret->fetch () ) { 238 | 239 | $this->transaction_id = $o->transaction_id; 240 | $Param = array(); 241 | 242 | if($Get['params']['id'] == $o->paycom_transaction_id and in_array($o->state, array(1))) 243 | { 244 | $this->BD->sql = "UPDATE {TABLE_PREFIX}payme_transactions 245 | Set perform_time=NOW(), state = :p_state, cancel_time=null 246 | WHERE transaction_id = :p_transaction_id"; 247 | $this->BD->param(':p_transaction_id', $o->transaction_id); 248 | $this->BD->param(':p_state', 2); 249 | 250 | $ret = $this->BD->query (); 251 | 252 | $this->DopSelect('PerformTransaction', $Sql, $o); 253 | } 254 | 255 | $Param = $this->Result($Get['id'], $this->transaction_id); 256 | } 257 | 258 | return $Param; 259 | } 260 | /* 261 | * Метод ChangePassword Для изменения пароля доступа биллингу мерчанта Paycom использует метод ChangePassword 262 | */ 263 | public function ChangePassword($Get, $Sql = null){ 264 | $this->BD->sql = "SELECT t.merchant_id, 265 | IF(is_flag_test IN ('Y'), t.merchant_key_test, t.merchant_key) MerchantKey 266 | FROM {TABLE_PREFIX}payme_config t 267 | WHERE t.merchant_id = :p_merchant_id"; 268 | 269 | $this->BD->param(':p_merchant_id',$this->MerchantIdCode); 270 | $ret = $this->BD->query (); 271 | 272 | $Param = $this->Error($Get['id'], '-32400', __METHOD__); //32504 273 | $Param = array("result"=>array('success'=>$this->BD->sql)); 274 | while ( $o = $ret->fetch () ) { 275 | $this->BD->sql = "UPDATE {TABLE_PREFIX}payme_config 276 | Set merchant_key = :p_merchant_key WHERE merchant_id = :p_merchant_id"; 277 | $this->BD->param(':p_merchant_id', $this->MerchantIdCode); 278 | $this->BD->param(':p_merchant_key', $this->Security->Encode($Get['params']['password'])); 279 | $ret = $this->BD->query(); 280 | $Param = array("result"=>array('success'=>true)); 281 | } 282 | 283 | return $Param; 284 | } 285 | //-- 286 | public function Error( 287 | $Id, // Идентификатор транзакции Paycom. 288 | $CodeError=null, // Код ошибки. 289 | $Data = __METHOD__ // Дополнительные сведения об ошибке. 290 | ){ 291 | $Param['id'] = $Id; 292 | $Param['error'] = array( 293 | 'code'=>(int)$CodeError, 294 | 'message'=>array("ru"=>$this->Sp_Error($CodeError, 'ru'),"uz"=>$this->Sp_Error($CodeError, 'uz'),"en"=>$this->Sp_Error($CodeError, 'en')), // Локализованный текст сообщения об ошибке. Сообщение выводится пользователю. 295 | "data" => $Data, 296 | "time"=>Format::timestamp(true) 297 | ); 298 | 299 | return $Param; 300 | } 301 | public function Result($Id, $Transaction_id) 302 | { 303 | 304 | $this->BD->sql = "SELECT t.transaction_id, 305 | t.paycom_transaction_id, 306 | t.paycom_time, 307 | t.paycom_time_datetime, 308 | t.create_time, 309 | t.perform_time, 310 | t.cancel_time, 311 | t.amount, 312 | t.state, 313 | t.reason, 314 | t.receivers, 315 | t.order_id, 316 | t.cms_order_id 317 | FROM {TABLE_PREFIX}payme_transactions t 318 | WHERE t.transaction_id = :p_transaction_id"; 319 | 320 | $this->BD->param(':p_transaction_id', $Transaction_id); 321 | $ret = $this->BD->query (); 322 | $Param = $this->Error($Id, '-31003', __METHOD__); 323 | 324 | while ( $o = $ret->fetch () ) { 325 | $Param = array(); 326 | $Param['id'] = $Id; 327 | $Param['result'] = array( 328 | 'id' => $o->paycom_transaction_id, 329 | 'receivers' => $o->receivers, 330 | "perform_time" => is_null($o->perform_time)?0:(Format::datetime2timestamp($o->perform_time)*1000), // Время проведения транзакции в биллинге мерчанта. 331 | "state" => (int)$o->state, 332 | "create_time" => is_null($o->create_time)?0:(Format::datetime2timestamp($o->create_time)*1000), 333 | "cancel_time" => is_null($o->cancel_time)?0:(Format::datetime2timestamp($o->cancel_time)*1000), 334 | "reason" => is_null($o->reason)?null:(int)$o->reason, 335 | "transaction" => $o->order_id, //Номер или идентификатор транзакции в биллинге мерчанта. Формат строки определяется мерчантом. 336 | "time" => (int)$o->paycom_time 337 | ); 338 | } 339 | return $Param; 340 | } 341 | // настроекаларни саклаб куяди 342 | public function PaymeConfig($Get=null){ 343 | $this->CreateTable(); 344 | $this->BD->sql = "INSERT INTO `{TABLE_PREFIX}payme_config` (`kass_id`, redirect, `merchant_id`, `merchant_key`, `merchant_key_test`, `endpoint_url`, `endpoint_url_pay_sys`, `is_flag_test`, `is_flag_send_tovar`, `callback_timeout`) VALUES 345 | (1, :p_redirect, :p_merchant_id, :p_merchant_key, :p_merchant_key_test, :p_endpoint_url, :p_endpoint_url_pay_sys, :p_is_flag_test, :p_is_flag_send_tovar, IFNULL(:p_callback_timeout, 0)) 346 | ON DUPLICATE KEY UPDATE 347 | merchant_id = :p_merchant_id, 348 | merchant_key = :p_merchant_key, 349 | merchant_key_test = :p_merchant_key_test, 350 | endpoint_url = :p_endpoint_url, 351 | endpoint_url_pay_sys = :p_endpoint_url_pay_sys, 352 | is_flag_test = :p_is_flag_test, 353 | is_flag_send_tovar = :p_is_flag_send_tovar, 354 | callback_timeout = IFNULL(:p_callback_timeout, 0), 355 | redirect =:p_redirect"; 356 | $this->BD->param(':p_merchant_id', $this->Security->Encode($Get['merchant_id'])); 357 | $this->BD->param(':p_merchant_key_test', $this->Security->Encode($Get['merchant_key_test'])); 358 | $this->BD->param(':p_merchant_key', $this->Security->Encode($Get['merchant_key'])); 359 | 360 | $this->BD->param(':p_redirect', $Get['redirect']); 361 | $this->BD->param(':p_endpoint_url_pay_sys', $Get['checkout_url']); 362 | $this->BD->param(':p_endpoint_url', $Get['endpoint_url']); 363 | $this->BD->param(':p_is_flag_test', $Get['status_test']); 364 | $this->BD->param(':p_is_flag_send_tovar', $Get['status_tovar']); 365 | $this->BD->param(':p_callback_timeout', $Get['callback_pay']); 366 | $Param = $this->BD->query(); 367 | //exit($this->BD->sql); 368 | return $Param; 369 | } 370 | //-- Заказни яратади 371 | public function InsertOredr($Get=null){ 372 | $this->BD->sql = "INSERT INTO `{TABLE_PREFIX}payme_s_state` (`code`, `name`) VALUES 373 | (-2, 'Транзакция отменена после завершения (начальное состояние 2).'), 374 | (-1, 'Транзакция отменена (начальное состояние 1).'), 375 | (0, 'ожидание подтверждения'), 376 | (1, 'Транзакция успешно создана, ожидание подтверждения (начальное состояние 0).'), 377 | (2, 'Транзакция успешно завершена (начальное состояние 1).'), 378 | (3, 'Заказ выполнен. Невозможно отменить транзакцию. Товар или услуга предоставлена покупателю в полном объеме.');"; 379 | $ret = $this->BD->query(); 380 | $this->BD->sql = "INSERT INTO {TABLE_PREFIX}payme_transactions VALUES 381 | (Null, NULL, :p_paycom_time, NOW(), NOW(), null, NULL, :p_amount, 0, NULL, NULL, :p_order_id, :p_cms_order_id, :p_is_flag_test)"; 382 | 383 | $this->BD->param(':p_paycom_time', Format::timestamp2milliseconds(time())); 384 | 385 | $this->BD->param(':p_amount', $Get['Amount']); 386 | 387 | $this->BD->param(':p_order_id', is_null($Get['OrderId'])?0:$Get['OrderId']); 388 | 389 | $this->BD->param(':p_cms_order_id', is_null($Get['CmsOrderId'])?0:$Get['CmsOrderId']); 390 | $this->BD->param(':p_is_flag_test', $Get['IsFlagTest']); 391 | 392 | $Param = $this->BD->query(); 393 | $Param = array(); 394 | $this->BD->sql = "SELECT t.transaction_id, 395 | t.paycom_transaction_id, 396 | t.paycom_time, 397 | t.paycom_time_datetime, 398 | t.create_time, 399 | t.perform_time, 400 | t.cancel_time, 401 | t.amount, 402 | t.state, 403 | t.reason, 404 | t.receivers, 405 | t.order_id, 406 | t.cms_order_id, 407 | c.redirect 408 | FROM {TABLE_PREFIX}payme_transactions t 409 | Join {TABLE_PREFIX}payme_config c 410 | On 1 = 1 411 | WHERE t.cms_order_id = :p_order_id 412 | Limit 0,1"; 413 | $this->BD->param(':p_order_id', is_null($Get['OrderId'])?0:$Get['OrderId']); 414 | $ret = $this->BD->query (); 415 | $Param = $this->Error($Get['OrderId'], '-31003', __METHOD__); 416 | while ( $o = $ret->fetch () ) { 417 | $Param = array(); 418 | $Param = array( 419 | 'id' => $o->transaction_id, 420 | 'Redirect' => $o->redirect, 421 | 'paycom_time' => $o->paycom_time, 422 | /*"transaction" => $o->order_id, //Номер или идентификатор транзакции в биллинге мерчанта. Формат строки определяется мерчантом. 423 | "transaction" => $o->cms_order_id,*/ 424 | "time" => (int)$o->paycom_time 425 | ); 426 | } 427 | return $Param; 428 | } 429 | //-- Def настроекаларни юклиди 430 | public function Insert($Sql=null){ 431 | if(is_array($Sql)) 432 | { 433 | foreach($Sql as $k=>$v) 434 | { 435 | $this->BD->sql = $v; 436 | $Param = $this->BD->query(); 437 | } 438 | } 439 | return $Param; 440 | } 441 | 442 | private function CreateTable(){ 443 | $SqlList = $this->ScanFile("/Install_Bd/"); 444 | 445 | if(!is_null($SqlList)) 446 | { 447 | foreach($SqlList as $k=>$v) 448 | { 449 | $this->BD->sql = $v; 450 | $Param = $this->BD->query(); 451 | } 452 | } 453 | //echo'
';print_r($Get);exit('
');
454 | 		// DROP TABLE `payme_config`, `payme_s_state`, `payme_transactions`;
455 | 	} 
456 | 	
457 | 	private function ScanFile($BasePath)
458 | 	{
459 | 		$FileList = null;
460 | 		$dir = opendir(__DIR__.$BasePath);
461 | 		$i=0;
462 | 		while($file = readdir($dir))
463 | 		{
464 | 			if (($file != ".") && ($file != "..")) {
465 | 				if(is_file(__DIR__.$BasePath.$file))
466 | 				{
467 | 					$FileList[] = file_get_contents(__DIR__.$BasePath.$file);
468 | 				}
469 | 			}
470 | 		}
471 | 		closedir($dir);
472 | 		
473 | 		return $FileList;
474 | 	}
475 | 	private function DopSelect($Type, $Sql, $o){
476 | 		if(!is_null($Sql))
477 | 		{
478 | 			if(is_array($Sql[$Type]))
479 | 			{
480 | 				foreach($Sql[$Type] as $k=>$v)
481 | 				{
482 | 					$this->BD->sql = str_replace('{TABLE_PREFIX}', TABLE_PREFIX, $v['Sql']);
483 | 					$this->BD->param(':p_transaction_id', $this->transaction_id);
484 | 					if(isset($o->cms_order_id))
485 | 						$this->BD->param(':p_cms_order_id', $o->cms_order_id);
486 | 					if(isset($o->cms_order_id))
487 | 						$this->BD->param(':p_order_id', $o->order_id);
488 | 
489 | 					foreach($v['Param'] as $k1=>$v1)
490 | 					{
491 | 						$this->BD->param($k1, $v1);
492 | 					}
493 | 					$ret = $this->BD->query ();
494 | 					/*
495 | 					if($Type=='CancelTransaction')
496 | 						print_r($this->BD->sql);exit();*/
497 | 					//	$sql[] = $this->BD->sql;
498 | 				}
499 | 			}
500 | 		}
501 | 	}
502 | // Тулов утганлиги тугрисида малумот
503 | 	public function OrderReturn($order_id=null){
504 | 		if(is_null($order_id)){
505 | 			$order_id = $_GET['order_id'];
506 | 		}
507 | 		$return = $this->Result('', $order_id);
508 | 		$GetHtml = file_get_contents(__DIR__.'/View/OrderReturn.html');
509 | 		//print_r($return); exit();
510 | 		$Str = $this->TransactionState($return['result']['state']);
511 | 		$GetHtml = str_replace('{OREDR_RETURN}', $Str, $GetHtml);
512 | 	
513 | 		return $GetHtml;
514 | 	}
515 | 
516 | //  Состояния транзакции (Transaction State)
517 | 	public function TransactionState($code){
518 | 		$State[0] = 'Транзакция успешно создана.';
519 | 		$State[1] = 'Транзакция успешно создана, ожидание подтверждения.';
520 | 		$State[2] = 'Транзакция успешно завершена.';
521 | 		$State[-1] = 'Транзакция отменена.';
522 | 		$State[-2] = 'Транзакция отменена после завершения.';
523 | 		
524 | 		return $State[$code];
525 | 	}	
526 | //  Причина отмены транзакции (Reason)
527 | 	public function Reason($code){
528 | 		$State[1] = 'Один или несколько получателей не найдены или не активны в Paycom.';
529 | 		$State[2] = 'Ошибка при выполнении дебетовой операции в процессингом центре.';
530 | 		$State[3] = 'Ошибка выполнения транзакции.';
531 | 		$State[4] = 'Транзакция отменена по таймауту.';
532 | 		$State[5] = 'Возврат денег.';
533 | 		$State[10] = 'Неизвестная ошибка.';
534 | 		
535 | 		return $State[$code];
536 | 	}
537 | //  Состояния чека
538 | 	public function Cheka($code){
539 | 		$State[0] = 'Чек создан. Ожидание подтверждения оплаты.';
540 | 		$State[1] = 'Первая стадия проверок. Создание транзакции в биллинге мерчанта.';
541 | 		$State[2] = 'Списание денег с карты.';
542 | 		$State[3] = 'Закрытие транзакции в биллинге мерчанта.';
543 | 		$State[4] = 'Чек оплачен.';
544 | 		$State[20] = 'Чек стоит на паузе для ручного вмешательства.';
545 | 		$State[21] = 'Чек в очереди на отмену.';
546 | 		$State[30] = 'Чек в очереди на закрытие транзакции в биллинге мерчанта.';
547 | 		$State[50] = 'Чек отменен.';
548 | 		
549 | 		return $State[$code];
550 | 	}	
551 | 	
552 | //	Ошибки, которые возвращает определённый метод, см. в описании метода.
553 | 	public function Sp_Error($code, $Lang){
554 | //		Общие ошибки
555 | 		$Error['-32300'] = 'Ошибка возникает если метод запроса не POST.';
556 | 		$Error['-32700'] = 'Ошибка парсинга JSON.';
557 | 		$Error['-32600'] = 'Отсутствуют обязательные поля в RPC-запросе или тип полей не соответствует спецификации.';
558 | 		$Error['-32601'] = 'Запрашиваемый метод не найден. В RPC-запросе имя запрашиваемого метода содержится в поле data.';
559 | 		$Error['-32504'] = 'Недостаточно привилегий для выполнения метода.';
560 | 		$Error['-32400'] = 'Системная (внутренняя ошибка). Ошибку следует использовать в случае системных сбоев: отказа базы данных, отказа файловой системы, неопределенного поведения и т.д.';
561 | //		Ошибки в ответах сервера мерчанта
562 | 		$Error['-31001'] = 'Неверная сумма. Ошибка возникает когда сумма транзакции не совпадает с суммой заказа. Актуальна если выставлен одноразовый счёт.';
563 | 		$Error['-31003'] = 'Транзакция не найдена.';
564 | 		$Error['-31007'] = 'Невозможно отменить транзакцию. Товар или услуга предоставлена потребителю в полном объеме.';
565 | 		$Error['-31008'] = 'Невозможно выполнить операцию. Ошибка возникает если состояние транзакции, не позволяет выполнить операцию.';
566 | 		$Error['-31050'] = 'Ошибки связанные с неверным пользовательским вводом “account“, например: введенный логин не найден, введенный номер телефона не найден и т.д. В ошибках, локализованное поле “message';
567 | 		$Error['-31099'] = '“ обязательно. Поле “data“ должно содержать название субполя “account“.';
568 | 		
569 | //		Ошибки метода CheckPerformTransaction
570 | 		$Error['-31001'] = 'Неверная сумма.';
571 | 		$Error['-31050'] = 'Ошибки неверного ввода данных покупателем account, например: введенный логин не найден, введенный номер телефона не найден и т.д. Локализованное поле “message“ обязательно.';
572 | 		$Error['-31099'] = 'Поле “data“ должно содержать название субполя “account“.';
573 | //		Ошибки метода CreateTransaction
574 | 		$Error['-31001'] = 'Неверная сумма.';
575 | 		$Error['-31008'] = 'Невозможно выполнить операцию.';
576 | 		$Error['-31050'] = 'Ошибки неверного ввода данных покупателем account, например: не найден введёный логин, не найден введенный номер телефона и т.д. Локализованное поле message обязательно.';
577 | 		$Error['-31099'] = 'Поле data должно содержать название субполя account.';
578 | //		Ошибки метода PerformTransaction
579 | 		$Error['-31003'] = 'Транзакция не найдена.';
580 | 		$Error['-31008'] = 'Невозможно выполнить данную операцию.';
581 | 		$Error['-31050'] = 'Ошибки неверного ввода данных покупателем account, например: не найден введёный логин, не найден введенный номер телефона и т.д. Локализованное поле message обязательно.';
582 | 		$Error['-31099'] = 'Поле data должно содержать название субполя account.';
583 | // 		Ошибки метода CancelTransaction
584 | 		$Error['-31003'] = 'Транзакция не найдена.';
585 | 		$Error['-31007'] = 'Заказ выполнен. Невозможно отменить транзакцию. Товар или услуга предоставлена покупателю в полном объеме.';
586 | // 		Ошибки метода CheckTransaction
587 | 		$Error['-31003'] = 'Транзакция не найдена';
588 | 		return $Error[$code];
589 | 	}
590 | 	
591 | 	//-- Тест учун ясалган
592 | 	public function Test($Get, $not_json =false){
593 | 		$Url = 'http://magento.uz/payme/callback/start';
594 | 		$this->Param = $Get;
595 | 		/*$this->Param['jsonrpc'] = '2.0';
596 | 		$this->Param['id'] = '1';
597 | 		$this->Param['method'] = 'PerformTransaction';
598 | 		$this->Param['params'] = array('id'=>1111111111);*/
599 | 	
600 | 		$ch = curl_init();
601 | 		$content = json_encode($this->Param);
602 | 	
603 | 		curl_setopt($ch, CURLOPT_URL, $Url);
604 | 		curl_setopt($ch, CURLOPT_POST, 1);
605 | 		curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
606 | 		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization:Basic '.base64_encode('Paycom:&qtyKDwu8HXm80rRxyXMDmSbQmIIs8G99cST')));
607 | 		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
608 | 		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
609 | 	
610 | 		$server_output = curl_exec ($ch);
611 | 		curl_close ($ch);
612 | 		$this->Param = json_decode($server_output, true);
613 | 	
614 | 		if($not_json) exit($server_output);
615 | 		$this->Out = $server_output;
616 | 	
617 | 		return $this->Param;
618 | 	}
619 | }
620 | ?>


--------------------------------------------------------------------------------
/Magento-Payment-Module-master/view/frontend/web/css/style.min.css:
--------------------------------------------------------------------------------
1 | 
2 | @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);/*!
3 |  *   AdminLTE v2.3.0
4 |  *   Author: Almsaeed Studio
5 |  *	 Website: Almsaeed Studio 
6 |  *   License: Open source - MIT
7 |  *           Please visit http://opensource.org/licenses/MIT for more information
8 | !*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:static;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header>.navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header>.navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:420px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:hover,.btn-adn:focus,.btn-adn.focus,.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook.focus,.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr.focus,.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover,.btn-foursquare:focus,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github.focus,.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:hover,.btn-google:focus,.btn-google.focus,.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram.focus,.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover,.btn-microsoft:focus,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:hover,.btn-openid:focus,.btn-openid.focus,.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover,.btn-reddit:focus,.btn-reddit.focus,.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover,.btn-soundcloud:focus,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter.focus,.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover,.btn-vimeo:focus,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk.focus,.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover,.btn-yahoo:focus,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}}


--------------------------------------------------------------------------------