По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Поговорим про популярную утилиту IP – АТС Asterisk FOP2 (Flash Operator Panel 2) . Данная панель позволяет видеть и понимать детальную real-time (реального времени) статистику вашей АТС, например, кто с кем разговаривает, продолжительность вызовов, количество вызовов в очереди или на удержании и так далее. Помимо этого, FOP2 предлагает полноценный телефон в браузере, с помощью которого можно осуществлять вызов и прием звонков, трансфер, перевод на мобильный и запись разговора, а для супервизора доступны опции прослушивания (шпионский канал) разговоров операторов в реальном времени и просмотр статистики по звонкам. /p> В бесплатной версии приложения вы можете работать максимум с пятнадцатью сущностями (экстеншены, конференц - румы, транки и так далее). В терминологии продукта их называют «кнопками. »Интересный функционал, не правда ли? В статье расскажем про установку и первичную настройку продукта. Пошаговое видео Установка Установку мы производим на операционную систему CentOS 6. Начнем с того, что определим разрядность нашей операционной системы: Важно! Перед установкой убедитесь, что у вас установлена компонента make. Для этого, дайте команду yum -y install make в консоль сервера. uname -m i686 - у вас 32 – х битная система; x86_64 - у вас 64 – х битная система; Отлично, теперь необходимо скачать нужный нам дистрибутив. Перейдем в директорию для загрузки файла командой cd /usr/src. Для 32-х битной системы: wget http://www.fop2.com/download/centos32 -O fop2.tgz Для 64-х битной системы: wget http://www.fop2.com/download/centos64 -O fop2.tgz Распаковываем скачанный архив и переходим в директорию установки: tar zxvf fop2.tgz cd fop2 Запускаем инсталлятор, который установит все необходимые файлы конфигурации, клиентской и серверной части программного комплекса: make install Настройка AMI Один из самых главных файлов конфигурации FOP2 это /usr/local/fop2/fop2.cfg. В нем находятся опции настройки подключения к AMI (Asterisk Management Interface). Для начала, давайте создадим параметры подключения для FOP2. Для этого, откроем файл конфигурации /etc/asterisk/manager.conf: vim /etc/asterisk/manager.conf Добавляем пользователя fop2 в конфигурацию следующим образом: [fop2] secret = ваш_пароль(устойчивый к взлому) deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message writetimeout = 500 Сохраняем конфигурацию файла и даем следующую команду в консоль (перегружаем AMI): [root@asterisk ~]# asterisk -rx "manager reload" Вносим изменения в файл конфигурации FOP2: vim /usr/local/fop2/fop2.cfg Меняем значение параметров manager_user и manager_secret на созданные выше. Должно получиться вот так: Сохраняем изменения. Проверим подключение между FOP2 и AMI. Для этого в консоль сервера дадим следующую команду: /usr/local/fop2/fop2_server --test Если все в порядке, то вы увидите следующий вывод: Запускаем приложение FOP2 командой: [root@asterisk ~]# service fop2 start Starting Flash Operator Panel 2: [ OK ] Установка одной командой Недавно, разработчики FOP2 разработали специальный скрипт, который последовательно установит панель оператора всего с помощью одной команды: wget -O - http://download.fop2.com/install_fop2.sh | bash Скрипт загрузит необходимые файлы, распакует и установит их. После, административный интерфейс будет доступен по ссылке http://ваш_сервер/fop2/admin, а интерфейс пользователя по ссылке http://ваш_сервер/fop2. Подключение по WEB Подключаемся к интерфейсу администратора FOP2. Для этого, откройте URL администраторской консоли по адресу http://IP-адрес/fop2/admin/: Если вы используете FreePBX, то можете указать при входе тот же логин и пароль. Как видно на скриншоте, с нашим сервером FOP2 все хорошо (FOP2 Server Status: OK – Version: 2.31.08): Создадим пользователя. Для этого, перейдите в раздел Users. В главной консоли будет отображен список текущих сущностей, настроенных в Asterisk. Выберем для редактирования нужную и создадим параметры доступа. Самое важное поле - Secret, которое представляет из себя пароль для доступа пользователя и интерфейс: Теперь переходим по адресу http://IP-адрес/fop2 для доступ к пользовательской консоли: Указываем логи и пароль, созданные ранее. Вуаля, мы вошли в операторскую панель :) Возможные проблемы Зачастую, при инсталляциях, может появиться проблема с доступом к пользовательской консоли (http://IP-адрес/fop2). Пользователи видят постоянную загрузку с надписью One moment please и счетчиком подключения к серверу. Для решения этой проблемы воспользуйтесь следующим алгоритмом: Проверьте, запущен ли сервер FOP2. Дайте команду ps -uax | grep fop2 в консоль Если сервер вернул значение в выводе команды: Проверяем наличие записей в iptables. Дайте команду iptables -vnL INPUT: Вывод команды содержит более 2 записей → Добавляем в iptables правило, которое разрешает подключение к порту 4445 по TCP командой sudo iptables -I INPUT -p tcp -m tcp --dport 4445 -j ACCEPT Вывод команды содержит менее 2 записей Ваш компьютер и сервер FOP2 находятся в одном сетевом сегменте (в одном LAN)? Да → Скорее всего проблема в Вашем браузере. Рекомендуемый для подключения браузер – Google Chrome. Попробуйте очистить куки браузера. Нет → Проблема на сетевом уровне. Скорее всего в сети имеет место фаервол, которые не пропускает трафик по tcp на порт 4454. Вывод отсутствует Проверяем, запущен ли сервис FOP. Дайте команду netstat -lnp | grep 444 Вывод команды присутствует. → Дайте команду service fop2 start Вывод отсутствует. Попробуйте запустить FOP2 прямо из CLI с помощью команды /usr/local/fop2/fop2_server -X 15 и с помощью service fop2 start Появляется ошибка FOP2 was unable to find an eth0 interface... → Наличие данной ошибки говорит об отсутствии на вашем сервере интерфейса eth0. Если вы используете eth1, то вам необходимо открыть файл /etc/sysconfig/fop2 и добавить туда опцию OPTIONS="-d -i eth1". Соответственно, если у вас иное обозначение NIC, то вместо eth1 укажите его. После этого даем рестарт FOP2 командой service fop2 start Появляется ошибка Segmentation Fault → Вам необходимо установить пакет ssl совместимости с помощью yum. Для этого, дайте команду yum install openssl098e в консоль сервера. После этого, делаем рестарт командой service fop2 start
img
Сегодня хотим поговорить про модуль «Web Callback» для FreePBX 13. Модуль является платным и стоит $50. Платеж единоразовый. В сравнении с популярными сервисами обратного звонка, покупка модуля окупается в среднем за полгода. Интересно? Тогда читайте ниже: настройка и адаптация стиля под свой сайт. Процесс настройки Данный модуль находится в меню Applications. Он позволяет легко и просто добавить HTML “Позвоните Мне” код на ваш веб-сайт. Посетители просто вводят свой телефонный номер для соединения с нужной вам очередью или ринг-группой. Далее, этот модуль позволяет выставить префикс для поступающего номера, что позволит определить, что вызов идет именно с модуля обратного звонка. Так же можно указать правила набора номера, для определения номеров, на которые можно совершить вызов. Как только вы установите направление для вызова и подтвердите настройки модуля, вы получите HTML-код для добавления на вашу страницу. Итак, пошаговый процесс создания кода для помещения на веб-страницу: Нажмите на + Add Web Callback Заполните поля: Описание полей: Name – Название коллбэка CID Prepend – Префикс при определении номера, в данном случае – «CALLBACK» Number Prepend – Префикс при наборе номера Dial Matches – Маска, для определения номеров, которые можно набирать Icon – Выбор иконки из предложенных Valid Message – Сообщение, которое высвечивается при правильном наборе Invalid Message – Сообщение, которое высвечивается при неправильном наборе Error Message – Сообщение, которое высвечивается, если произошла какая-либо ошибка Destination – Направление вызова, в данном случае – ринг-группа с названием “web callback” HTML Code – Код, который появится после сохранения настроек Нажмите Submit Далее нужно только добавить получившийся код на сайт и пользоваться. Только надо учитывать два момента: первый – данный модуль надо купить у Shmooze и иметь публичный адрес вашей АТС/или пробрасывать порты. Изменения стиля формы обратного звонка После того как мы создали форму обратного звонка на сайт, нам необходимо доработать ее внешне, так как встроенные формы имеют не привлекательный дизайн. Открываем файл /etc/schmooze/wcb.html и добавляем в него следующий код: <style type="text/css"> #frame { background-image: url('/admin/images/webcallback.png'); background-repeat: no-repeat; background-size: 200px; height: 65px; cursor: pointer; cursor: hand; } #webcallbackinput { position: relative; left: 66px; top: 30px; width: 125px; } </style> <div id="frame"> <input type="text" name="num" placeholder="Укажите ваш номер" id="webcallbackinput" value=""> <input type="hidden" id="dest" value="http://1.2.3.4:12345/wcb.php"> <input type="hidden" id="i" value="1"> </div> <div id="link"></div> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $('#frame').click(function(){ if ($('#webcallbackinput').val()) { var valid_msg = 'Спасибо. Мы уже звоним Вам!'; var invalid_msg = 'Ошибка. Пожалуйста, укажите все параметры согласно требованию полей'; var but = $(this); $.ajax({ url: $('#dest').val(), type: 'post', data: {p: $('#webcallbackinput').val(), i: $('#i').val()}, cache: false, success: function(data, b, c) { data = $.parseJSON(data); switch (data.Response) { case 'Error': switch (data.Message) { case 'Originate failed': alert(invalid_msg); break; default: alert(data.Message); break; } break; case 'Success': alert(valid_msg); break; default: break; } }, error: function(a, b, c) { alert(invalid_msg); } }) } }) }); </script> Обратите внимание, чтобы форма работала корректно, вам необходимо указать корректное значение параметра value в поле input ниже (это значение было сгенерировано на этапе настройки в поле) и значение параметр id в поле, следующем следом за ним. В нашем примере, id=2: <input type="hidden" id="dest" value="http://1.2.3.4:12345/wcb.php"> <input type="hidden" id="i" value="1"> В данном примере указано значение http://1.2.3.4:12345/wcb.php , где значение 1.2.3.4 – внешний IP – адрес нашего маршрутизатора, а 12345 – это проброс нестандартного порта в наш Asterisk. Рекомендуем в настройках проброшенного порта указать разрешенные сети (source address), с которых можно подключиться через этот порт. Это необходимо в целях безопасности, если ваш Web – сервер находится не в локальной сети, а например, на хостинге Так же здесь вы можете настроить сообщения, которые будут показаны пользователю при успешном и неуспешном исходе вызова обратного звонка var valid_msg = 'Спасибо. Мы уже звоним Вам!'; var invalid_msg = 'Ошибка. Пожалуйста, укажите все параметры согласно требованию полей ';
img
SQL расшифровывается как Structured Query Language, или структурированный язык запросов. Команды SQL – это инструкции, которые даются базе данных для выполнения задач, функций и запросов с данными. SQL-командами можно пользоваться для поиска по базе данных и выполнения различных функций: создания и удаления таблиц, добавления данных в таблицы и их редактирования. Ниже приведен список основных команд (их иногда называют операторами), которые необходимо знать при работе с SQL. SELECT и FROM SELECT в запросе определяет, какие столбцы данных отобразить в результатах. Кроме того, в SQL есть возможности отображать данные не из столбца таблицы. В примере ниже показаны 3 столбца, взятые из таблицы студентов Student (через SELECT и FROM) и один вычисляемый столбец. В базе данных хранятся ID (studentID), имя (FirstName) и фамилия (LastName) студента. Мы можем объединить столбцы с именем и фамилией и создать вычисляемое поле с полным именем (FullName). SELECT studentID, FirstName, LastName, FirstName + ' ' + LastName AS FullName FROM student; Вывод: +-----------+-------------------+------------+------------------------+ | studentID | FirstName | LastName | FullName | +-----------+-------------------+------------+------------------------+ | 1 | Monique | Davis | Monique Davis | | 2 | Teri | Gutierrez | Teri Gutierrez | | 3 | Spencer | Pautier | Spencer Pautier | | 4 | Louis | Ramsey | Louis Ramsey | | 5 | Alvin | Greene | Alvin Greene | | 6 | Sophie | Freeman | Sophie Freeman | | 7 | Edgar Frank "Ted" | Codd | Edgar Frank "Ted" Codd | | 8 | Donald D. | Chamberlin | Donald D. Chamberlin | | 9 | Raymond F. | Boyce | Raymond F. Boyce | +-----------+-------------------+------------+------------------------+ 9 rows in set (0.00 sec) CREATE TABLE Название CREATE TABLE говорит само за себя – оператор создает таблицу. Вы можете задать название таблицы и настроить, какие столбцы будут присутствовать в таблице. CREATE TABLE table_name ( column_1 datatype, column_2 datatype, column_3 datatype ); ALTER TABLE ALTER TABLE изменяет структуру таблицы. Вот так можно добавить столбец в базу данных: ALTER TABLE table_name ADD column_name datatype; CHECK CHECK ограничивает диапазон значений, которые можно добавить в столбец. Когда вы настраиваете ограничение CHECK для отдельного столбца, оператор проверяет, что в этом столбце присутствуют строго определенные значения. Если же CHECK настраивается для таблицы, то он может ограничивать значения в отдельных столбцах на основании значений из других столбцов этой строки. В следующем примере при создании таблицы Persons используется ограничение CHECK для столбца «Возраст» (Age). Таким образом проверяется, что в таблицу не попадают лица младше 18 лет. CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CHECK (Age>=18) ); Следующий синтаксис используется для присвоения названия оператору CHECK и настройки CHECK для нескольких столбцов: CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, City varchar(255), CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') ); WHERE (AND, OR, IN, BETWEEN и LIKE) Оператор WHERE используется для ограничения количества возвращаемых строк. Сначала, в качестве примере, мы покажем оператор SELECT и его результат без оператора WHERE. Затем добавим оператор WHERE, в котором используются сразу 5 из вышеуказанных квалификаторов. SELECT studentID, FullName, sat_score, rcd_updated FROM student; +-----------+------------------------+-----------+---------------------+ | studentID | FullName | sat_score | rcd_updated | +-----------+------------------------+-----------+---------------------+ | 1 | Monique Davis | 400 | 2017-08-16 15:34:50 | | 2 | Teri Gutierrez | 800 | 2017-08-16 15:34:50 | | 3 | Spencer Pautier | 1000 | 2017-08-16 15:34:50 | | 4 | Louis Ramsey | 1200 | 2017-08-16 15:34:50 | | 5 | Alvin Greene | 1200 | 2017-08-16 15:34:50 | | 6 | Sophie Freeman | 1200 | 2017-08-16 15:34:50 | | 7 | Edgar Frank "Ted" Codd | 2400 | 2017-08-16 15:35:33 | | 8 | Donald D. Chamberlin | 2400 | 2017-08-16 15:35:33 | | 9 | Raymond F. Boyce | 2400 | 2017-08-16 15:35:33 | +-----------+------------------------+-----------+---------------------+ 9 rows in set (0.00 sec) Теперь повторим запрос SELECT, но ограничим возвращаемые строки оператором WHERE. STUDENT studentID, FullName, sat_score, recordUpdated FROM student WHERE (studentID BETWEEN 1 AND 5 OR studentID = 8) AND sat_score NOT IN (1000, 1400); +-----------+----------------------+-----------+---------------------+ | studentID | FullName | sat_score | rcd_updated | +-----------+----------------------+-----------+---------------------+ | 1 | Monique Davis | 400 | 2017-08-16 15:34:50 | | 2 | Teri Gutierrez | 800 | 2017-08-16 15:34:50 | | 4 | Louis Ramsey | 1200 | 2017-08-16 15:34:50 | | 5 | Alvin Greene | 1200 | 2017-08-16 15:34:50 | | 8 | Donald D. Chamberlin | 2400 | 2017-08-16 15:35:33 | +-----------+----------------------+-----------+---------------------+ 5 rows in set (0.00 sec) UPDATE Для обновления записи в таблице используется оператор UPDATE. Условием WHERE можно уточнить, какие именно записи вы бы хотели обновить. Вы можете обновлять по одному или нескольким столбцам сразу. Синтаксис выглядит так: UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; В примере ниже обновляется название записи (поле Name) с Id 4: UPDATE Person SET Name = “Elton John” WHERE Id = 4; Помимо этого, можно обновлять столбцы в таблице значениями из других таблиц. Чтобы получить данные из нескольких таблиц, воспользуйтесь оператором JOIN. Синтаксис выглядит так: UPDATE table_name1 SET table_name1.column1 = table_name2.columnA table_name1.column2 = table_name2.columnB FROM table_name1 JOIN table_name2 ON table_name1.ForeignKey = table_name2.Key В примере ниже мы обновляем поле «Менеджер» (Manager) для всех записей: UPDATE Person SET Person.Manager = Department.Manager FROM Person JOIN Department ON Person.DepartmentID = Department.ID GROUP BY GROUP BY позволяет объединять строки и агрегировать данные. Вот так выглядит синтаксис GROUP BY: SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; HAVING HAVING позволяет сортировать данные, которые собираются через GROUP BY. Таким образом, пользователю показывается лишь ограниченный набор записей. Вот так выглядит синтаксис HAVING: SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name HAVING COUNT(*) > value; AVG() AVG, или среднее, вычисляет среднее значение числового столбца из набора строк, которые возвращает оператор SQL. Вот так выглядит синтаксис: SELECT groupingField, AVG(num_field) FROM table1 GROUP BY groupingField А вот пример этого оператора для таблицы Student: SELECT studentID, FullName, AVG(sat_score) FROM student GROUP BY studentID, FullName; AS AS позволяет переименовать столбец или таблицу с помощью псевдонима. SELECT user_only_num1 AS AgeOfServer, (user_only_num1 - warranty_period) AS NonWarrantyPeriod FROM server_table И вот так будет выглядеть результат. +-------------+------------------------+ | AgeOfServer | NonWarrantyPeriod | +-------------+------------------------+ | 36 | 24 | | 24 | 12 | | 61 | 49 | | 12 | 0 | | 6 | -6 | | 0 | -12 | | 36 | 24 | | 36 | 24 | | 24 | 12 | +-------------+------------------------+ Кроме того, через оператор AS вы можете задать название таблицы – так будет проще обращаться к ней в JOIN. SELECT ord.product, ord.ord_number, ord.price, cust.cust_name, cust.cust_number FROM customer_table AS cust JOIN order_table AS ord ON cust.cust_number = ord.cust_number Результат выглядит так. +-------------+------------+-----------+-----------------+--------------+ | product | ord_number | price | cust_name | cust_number | +-------------+------------+-----------+-----------------+--------------+ | RAM | 12345 | 124 | John Smith | 20 | | CPU | 12346 | 212 | Mia X | 22 | | USB | 12347 | 49 | Elise Beth | 21 | | Cable | 12348 | 0 | Paul Fort | 19 | | Mouse | 12349 | 66 | Nats Back | 15 | | Laptop | 12350 | 612 | Mel S | 36 | | Keyboard| 12351 | 24 | George Z | 95 | | Keyboard| 12352 | 24 | Ally B | 55 | | Air | 12353 | 12 | Maria Trust | 11 | +-------------+------------+-----------+-----------------+--------------+ ORDER BY ORDER BY позволяет сортировать результирующий набор данных по одному или нескольким элементам в разделе SELECT. Ниже дан пример сортировки студентов по имени (FullName) в порядке убывания. Изначально используется стандартная сортировка по возрастанию (ASC), поэтому для сортировки в обратном порядке мы применяем DESC. SELECT studentID, FullName, sat_score FROM student ORDER BY FullName DESC; COUNT COUNT вычисляет количество строк и возвращает результирующее значение в столбце. Ниже приводятся возможные сценарии использования COUNT: Подсчет всех строк в таблице (не требуется Group by) Подсчет общего числа подмножеств данных (в операторе обязательно прописывается Group By) Этот оператор SQL выводит количество всех строк. Кроме того, что вы можете настроить название результирующего столбца COUNT с помощью AS. SELECT count(*) AS studentCount FROM student; DELETE DELETE используется для удаления записи из таблицы. Будьте внимательны! Вы можете удалить несколько записей в таблице, либо сразу все. С помощью условия WHERE вы указываете, какие записи необходимо удалить. Синтаксис выглядит так: DELETE FROM table_name WHERE condition; Вот так выглядит удаление из таблицы Person записи с Id 3: DELETE FROM Person WHERE Id = 3; INNER JOIN JOIN, или внутреннее соединение, выбирает записи, соответствующие значениям в двух таблицах. SELECT * FROM A x JOIN B y ON y.aId = x.Id LEFT JOIN LEFT JOIN возвращает все строки из левой таблицы и соответствующие им строки из правой таблицы. Строки из левой таблицы возвращаются даже при пустых значениях в правой таблице. Если для строк из левой таблицы нет соответствия в правой, то в значениях последней будет стоять null. SELECT * FROM A x LEFT JOIN B y ON y.aId = x.Id RIGHT JOIN RIGHT JOIN возвращает все строки из правой таблицы и соответствующие им строки из левой. В отличие от левого соединения, здесь возвращаются все строки из правой таблицы, даже если им ничего не соответствует в левой. В таком случае, в значениях столбцов из левой таблицы будет стоять null. SELECT * FROM A x RIGHT JOIN B y ON y.aId = x.Id FULL OUTER JOIN FULL OUTER JOIN возвращает все строки, соответствующие условиям в любой из таблиц. Если в левой таблице есть строки, которым ничего не соответствует в правой, то они все равно отобразятся в результирующих значениях. То же самое распространяется и на строки из правой таблицы без соответствующих значений в левой. SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName INSERT INSERT используется для добавления данных в таблицу. INSERT INTO table_name (column_1, column_2, column_3) VALUES (value_1, 'value_2', value_3); LIKE LIKE используется в связке с WHERE или HAVING (в составе оператора GROUP BY) и ограничивает выбранные строки по элементам, если в столбце содержится определенный шаблон символов. Этот SQL запрос выбирает студентов, чье значение в FullName начинается с «Monique» или заканчивается с «Greene». SELECT studentID, FullName, sat_score, rcd_updated FROM student WHERE FullName LIKE 'Monique%' OR FullName LIKE '%Greene'; +-----------+---------------+-----------+---------------------+ | studentID | FullName | sat_score | rcd_updated | +-----------+---------------+-----------+---------------------+ | 1 | Monique Davis | 400 | 2017-08-16 15:34:50 | | 5 | Alvin Greene | 1200 | 2017-08-16 15:34:50 | +-----------+---------------+-----------+---------------------+ 2 rows in set (0.00 sec) Перед LIKE вы можете добавить NOT, и тогда строки, соответствующие условию, будут исключаться, а не добавляться. Этот SQL исключает записи, у которых в столбце FULL NAME содержится «cer Pau» и «Ted». SELECT studentID, FullName, sat_score, rcd_updated FROM student WHERE FullName NOT LIKE '%cer Pau%' AND FullName NOT LIKE '%"Ted"%'; +-----------+----------------------+-----------+---------------------+ | studentID | FullName | sat_score | rcd_updated | +-----------+----------------------+-----------+---------------------+ | 1 | Monique Davis | 400 | 2017-08-16 15:34:50 | | 2 | Teri Gutierrez | 800 | 2017-08-16 15:34:50 | | 4 | Louis Ramsey | 1200 | 2017-08-16 15:34:50 | | 5 | Alvin Greene | 1200 | 2017-08-16 15:34:50 | | 6 | Sophie Freeman | 1200 | 2017-08-16 15:34:50 | | 8 | Donald D. Chamberlin | 2400 | 2017-08-16 15:35:33 | | 9 | Raymond F. Boyce | 2400 | 2017-08-16 15:35:33 | +-----------+----------------------+-----------+---------------------+ 7 rows in set (0.00 sec)
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59