diff --git a/mirzaev/skillparts/system/controllers/CartController.php b/mirzaev/skillparts/system/controllers/CartController.php index c7a68f9..95cb2ed 100644 --- a/mirzaev/skillparts/system/controllers/CartController.php +++ b/mirzaev/skillparts/system/controllers/CartController.php @@ -89,7 +89,7 @@ class CartController extends Controller $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? 'Комментарий к заказу'; $comm = $edge->comm ?? null; - $edge->comm = $text; + $edge->comm = empty($text) ? 'Комментарий к заказу' : $text; if ($edge->save()) { // Ребро обновлено @@ -101,7 +101,7 @@ class CartController extends Controller ++$amount; // Запись в буфер ответа - $return['comm'] = $text; + $return['comm'] = $edge->comm; } } diff --git a/mirzaev/skillparts/system/controllers/OfferController.php b/mirzaev/skillparts/system/controllers/OfferController.php index bb58c18..a1bc077 100644 --- a/mirzaev/skillparts/system/controllers/OfferController.php +++ b/mirzaev/skillparts/system/controllers/OfferController.php @@ -5,11 +5,63 @@ declare(strict_types=1); namespace app\controllers; use yii; - +use yii\filters\AccessControl; +use yii\web\Cookie; +use yii\web\Response; use yii\web\Controller; class OfferController extends Controller { + public function behaviors() + { + return [ + 'access' => [ + 'class' => AccessControl::class, + 'rules' => [ + [ + 'allow' => true, + 'roles' => ['@'], + 'actions' => ['index', 'accept'] + ], + [ + 'allow' => false, + 'roles' => ['?'], + 'denyCallback' => [$this, 'accessDenied'] + ] + ] + ] + ]; + } + + public function accessDenied() + { + // Инициализация + $cookies = yii::$app->response->cookies; + + // Запись cookie с редиректом, который выполнится после авторизации + $cookies->add(new Cookie([ + 'name' => 'offer', + 'value' => yii::$app->request->pathInfo + ])); + + if (Yii::$app->request->isPost) { + // POST-запрос + + // Настройка + Yii::$app->response->format = Response::FORMAT_JSON; + + // Генерация ответа + Yii::$app->response->content = json_encode([ + 'redirect' => '/authentication', + '_csrf' => Yii::$app->request->getCsrfToken() + ]); + } else if (Yii::$app->request->isGet) { + // GET-запрос + + $this->redirect('/authentication'); + } + } + public function actionIndex() { return $this->render('/offer/index'); diff --git a/mirzaev/skillparts/system/controllers/OrderController.php b/mirzaev/skillparts/system/controllers/OrderController.php index 0275fa7..bb48339 100644 --- a/mirzaev/skillparts/system/controllers/OrderController.php +++ b/mirzaev/skillparts/system/controllers/OrderController.php @@ -8,6 +8,7 @@ use yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\web\Response; +use yii\web\Cookie; use app\models\Order; use app\models\AccountEdgeOrder; diff --git a/mirzaev/skillparts/system/controllers/ProductController.php b/mirzaev/skillparts/system/controllers/ProductController.php index 2f65a1d..4d9c9e6 100644 --- a/mirzaev/skillparts/system/controllers/ProductController.php +++ b/mirzaev/skillparts/system/controllers/ProductController.php @@ -264,6 +264,7 @@ class ProductController extends Controller // Инициализация $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? '0'; + $product->wght = $text; if ($product->save()) { diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php index 0392afc..0b4dcbc 100644 --- a/mirzaev/skillparts/system/controllers/ProfileController.php +++ b/mirzaev/skillparts/system/controllers/ProfileController.php @@ -184,11 +184,18 @@ class ProfileController extends Controller { // Инициализация $model_notifications = null; - $model_settings = Settings::readLast(); $panel = yii::$app->request->post('panel') ?? yii::$app->request->get('panel'); $sidebar = $this->renderPartial('sidebar'); - if (!is_null($vars = yii::$app->request->post('Notification') ?? yii::$app->request->get('Notification'))) { + if (!$model_settings = Settings::readLast()) { + $model_settings = new Settings(); + + if(!$model_settings->save()) { + $this->redirect('/'); + } + } + + if ($vars = yii::$app->request->post('Notification') ?? yii::$app->request->get('Notification')) { // Обнаружены входные параметры из раздела "Уведомления" // Реинициализация с новыми параметрами @@ -196,7 +203,7 @@ class ProfileController extends Controller // Запись уведомления и отправка (запись ребра до аккаунта) $model_notifications->write(); - } else if (!is_null($vars = yii::$app->request->post('Settings') ?? yii::$app->request->get('Settings'))) { + } else if ($vars = yii::$app->request->post('Settings') ?? yii::$app->request->get('Settings')) { // Обнаружены входные параметры из раздела "Настройки" if ($to = new Settings($vars)) { diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php index 1ce2dac..23d45f6 100644 --- a/mirzaev/skillparts/system/controllers/SearchController.php +++ b/mirzaev/skillparts/system/controllers/SearchController.php @@ -15,6 +15,8 @@ use app\models\Search; use app\models\connection\Dellin; +use Exception; + class SearchController extends Controller { /** @@ -148,7 +150,7 @@ class SearchController extends Controller // Перебор продуктов // Поиск поставок привязанных к продуктам - $row['supplies'] = Supply::searchByEdge( + $connections = Supply::searchByEdge( from: 'product', to: 'supply', edge: 'supply_edge_product', @@ -160,30 +162,43 @@ class SearchController extends Controller ['supply_edge_product.type' => 'connect'] ], where: 'supply._id == supply_edge_product[0]._from', - select: 'supply_edge_product[0]' + select: '{supply, supply_edge_product}' ); - if (count($row['supplies']) === 11) { + if (count($connections) === 11) { // Если в базе данных хранится много поставок // Инициализация $row['overload'] = true; } - foreach ($row['supplies'] as &$edge) { + foreach ($connections as &$connection) { // Перебор поставок // Инициализация аккаунта - $edge['account'] = Account::searchBySupplyId($edge['_from']); + $connection['account'] = Account::searchBySupplyId($connection['supply_edge_product'][0]['_from']); - // Инициализация доставки - $edge['delivery'] = Dellin::calcDelivery($edge['account']['opts']['delivery_from_city'] ?? $settings['delivery_from_city_default'] ?? '2700000100000000000000000', yii::$app->user->identity->opts['delivery_to_city'] ?? $settings['delivery_to_city_default'] ?? '2700000100000000000000000')['terminals_standard']; - $edge['delivery']['max'] = $edge['delivery']['period_to']; - $edge['delivery']['price'] = $edge['delivery']['price']; + try { + // Инициализация доставки + $connection['delivery'] = Dellin::calcDeliveryAdvanced( + explode('_', $connection['account']['opts']['delivery_from_terminal'])[1], + explode('_', yii::$app->user->identity->opts['delivery_to_terminal'])[1], + (int) ($connection['product']['wght'] ?? 0), + (int) ($connection['product']['dmns']['x'] ?? 0), + (int) ($connection['product']['dmns']['y'] ?? 0), + (int) ($connection['product']['dmns']['z'] ?? 0) + ); + } catch (Exception $e) { + $connection['delivery']['error'] = true; + + // var_dump(json_decode($e->getMessage(), true)['errors']); die; + } // Инициализация цены (цена поставки + цена доставки + наша наценка) - $edge['prce'] = ($edge['prce'] ?? $edge['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($edge['delivery']['price'] ?? 0) + ($settings['increase'] ?? 0); + $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply_edge_product'][0]['onec']['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0); } + + $row = $connections; } // Запись ответа diff --git a/mirzaev/skillparts/system/controllers/SuppliersController.php b/mirzaev/skillparts/system/controllers/SuppliersController.php index dfeb747..297431f 100644 --- a/mirzaev/skillparts/system/controllers/SuppliersController.php +++ b/mirzaev/skillparts/system/controllers/SuppliersController.php @@ -6,10 +6,16 @@ namespace app\controllers; use yii\web\Controller; +use app\models\Request; + class SuppliersController extends Controller { public function actionIndex() { return $this->renderPartial('/suppliers/index'); } + + public function actionRequest() { + return $this->renderPartial('/suppliers/request'); + } } diff --git a/mirzaev/skillparts/system/migrations/arangodb/m210510_180939_create_request_collection.php b/mirzaev/skillparts/system/migrations/arangodb/m210510_180939_create_request_collection.php new file mode 100644 index 0000000..12652c9 --- /dev/null +++ b/mirzaev/skillparts/system/migrations/arangodb/m210510_180939_create_request_collection.php @@ -0,0 +1,20 @@ +createCollection('request', ['type' => 2]); + } + + public function down() + { + $this->dropCollection('request'); + } +} diff --git a/mirzaev/skillparts/system/models/Document.php b/mirzaev/skillparts/system/models/Document.php index 67435be..69fcd36 100644 --- a/mirzaev/skillparts/system/models/Document.php +++ b/mirzaev/skillparts/system/models/Document.php @@ -177,7 +177,7 @@ abstract class Document extends ActiveRecord if (is_array($this->$attribute)) { foreach ($this->$attribute as $value) { - if (!(bool) preg_match('/^[0-9]*$/m', $value)) { + if (!(bool) preg_match('/^[0-9\.]*$/m', $value)) { $this->addError($attribute, 'В массиве найдены запрещённые символы'); } } diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php index 2f6cb00..2d80a99 100644 --- a/mirzaev/skillparts/system/models/Order.php +++ b/mirzaev/skillparts/system/models/Order.php @@ -381,12 +381,11 @@ class Order extends Document implements DocumentInterface } catch (Exception $e) { $connection['delivery']['error'] = true; - // var_dump(json_decode($e->getMessage(), true)['errors']); die; } // Запись цены (цена поставки + цена доставки + наша наценка) - $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price'] ?? 0) + ($settings['increase'] ?? 0); + $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0); // Запись валюты $connection['currency'] = $cost['Валюта']; @@ -465,7 +464,7 @@ class Order extends Document implements DocumentInterface } } - file_put_contents('supplies.txt', print_r($supplies, true)); + // file_put_contents('supplies.txt', print_r($supplies, true)); if (count($supplies) > 0) { // Поставки были записаны @@ -489,7 +488,7 @@ class Order extends Document implements DocumentInterface return $supplies_buffer; } - file_put_contents('AAAAAAAAAAAAAAAAAAA.txt', print_r(1, true)); + // file_put_contents('AAAAAAAAAAAAAAAAAAA.txt', print_r(1, true)); return []; } diff --git a/mirzaev/skillparts/system/models/OrderEdgeSupply.php b/mirzaev/skillparts/system/models/OrderEdgeSupply.php index 17a5648..ffc174c 100644 --- a/mirzaev/skillparts/system/models/OrderEdgeSupply.php +++ b/mirzaev/skillparts/system/models/OrderEdgeSupply.php @@ -54,8 +54,8 @@ class OrderEdgeSupply extends Edge 'comm' ], 'string', - 'length' => [3, 256], - 'message' => '{attribute} должен быть строкой от 3 до 256 символов' + 'length' => [0, 300], + 'message' => '{attribute} должен быть строкой от 0 до 300 символов' ] ] ); diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php index 21ddaee..4325a12 100644 --- a/mirzaev/skillparts/system/models/Product.php +++ b/mirzaev/skillparts/system/models/Product.php @@ -196,8 +196,9 @@ class Product extends Document [ 'wght', 'integer', - 'max' => 9999, - 'message' => '{attribute} должен быть строкой от 0 до 6 символов' + 'min' => 0, + 'max' => 30000, + 'message' => '{attribute} должен иметь значение от 0 до 30000' ] ] ); diff --git a/mirzaev/skillparts/system/models/Request.php b/mirzaev/skillparts/system/models/Request.php new file mode 100644 index 0000000..df7982e --- /dev/null +++ b/mirzaev/skillparts/system/models/Request.php @@ -0,0 +1,95 @@ + 'Обращение', + 'phon' => 'Номер', + 'mail' => 'Почта', + 'file' => 'Юридические данные' + ] + ); + } + + /** + * Правила + * + * @todo Правило для всех трёх габаритов + */ + public function rules(): array + { + return array_merge( + parent::rules(), + [ + [ + [ + 'file', + 'mail' + ], + 'required', + 'message' => 'Обязательные поля: {attribute}' + ], + [ + 'file', + 'file', + 'skipOnEmpty' => false, + // 'extensions' => 'xlsx', + 'checkExtensionByMimeType' => false, + 'maxFiles' => 1, + 'maxSize' => 1024 * 1024 * 30, + // 'wrongExtension' => 'Разрешены только документы в формате: ".xlsx"', + 'message' => 'Проблема при чтении документа' + ] + ] + ); + } +} diff --git a/mirzaev/skillparts/system/models/connection/Dellin.php b/mirzaev/skillparts/system/models/connection/Dellin.php index 08ab2d3..ea932f8 100644 --- a/mirzaev/skillparts/system/models/connection/Dellin.php +++ b/mirzaev/skillparts/system/models/connection/Dellin.php @@ -59,39 +59,40 @@ class Dellin extends Model /** * Рассчет доставки (расширенный) * + * Рассчет нескольких товаров идет через простое перемножение результатов доставки одного товара + * В API всегда идет рассчет для одного товара, так было решено + * * @param string $from Номер КЛАДР * @param string $to Номер КЛАДР - * @param int $weight Вес (кг) - * @param int $x Ширина (м) - * @param int $y Высота (м) - * @param int $z Длинна (м) + * @param int $weight Вес (г) + * @param int $x Ширина (cм) + * @param int $y Высота (cм) + * @param int $z Длинна (cм) * @param int $amount Количество * * @return string * - * @todo Переработать "weight" (если посылок больше чем одна, то отправить вес самого тяжелого груза), хотя здесь же копии обрабатываются и вес у них один... Надо думать + * @todo Загружать помимо терминалов ещё и адреса, чтобы доделать доставку малогабаритных грузов + * Разрабраться с параметрами 0,54м * 0,39м * 0,39м (0.082134м) и 0.1 куб метр в чем разница */ public static function calcDeliveryAdvanced(string $from, string $to, int $weight, int $x, int $y, int $z, int $amount = 1): array { return self::handle(function () use ($from, $to, $weight, $x, $y, $z, $amount) { // Всё готово к работе - // Рассчёт типа доставки - if ( - $weight <= 10 - && (($x <= 5.4 && $y <= 3.9 && $z <= 3.9) - || ($x <= 3.9 && $y <= 5.4 && $z <= 3.9) - || ($x <= 3.9 && $y <= 3.9 && $z <= 5.4)) - && $x * $y * $z <= 0.1 - ) { - // Доставка категории "small" + // Значения по умолчанию, если указан 0 + $x === 0 and $x = 25; + $y === 0 and $y = 55; + $z === 0 and $z = 25; + $weight === 0 and $weight = 300; - $type = 'small'; - } else { - // Доставка категории "auto" + // Конвертация из сантиметров в метры + $x /= 100; + $y /= 100; + $z /= 100; - $type = 'auto'; - } + // Конвертация из граммов в килограммы + $weight /= 1000; // Вычисление самой крупной стороны, так как ДеловыеЛинии имеют ограничения на все три поля и у длинны оно больше всех if ($x > $z && $x > $y) { @@ -108,15 +109,36 @@ class Dellin extends Model $width = $x; $height = $z; $length = $y; - } else if ($z > $x && $z > $y) { + } else { + // } else if ($z > $x && $z > $y) { // "Z" больше всех // Инициализация $width = $x; $height = $y; $length = $z; + } + + + // Рассчёт типа доставки + // if ( + // $weight <= 30 && + // $x * $y * $z <= 0.082134 // && + // // $x * $y * $z <= 0.1 + if ( + $weight <= 30 + && ($length <= 0.54 && $width <= 0.39 && $height <= 0.39) + && $length * $width * $height <= 0.1 + ) { + // Доставка категории "small" + + $type = 'small'; + $variant = 'address'; } else { - echo 'Ошибка'; + // Доставка категории "auto" + + $type = 'auto'; + $variant = 'terminal'; } // Запрос @@ -130,12 +152,12 @@ class Dellin extends Model ], 'derival' => [ 'produceDate' => date('Y-m-d', time() + ($settings['delivery_handle_time'] ?? 86400)), - 'variant' => 'terminal', + 'variant' => $variant, 'terminalID' => $from, ], 'arrival' => [ - 'variant' => 'terminal', + 'variant' => $variant, 'terminalID' => $to ] ], @@ -145,7 +167,7 @@ class Dellin extends Model ] ], 'cargo' => [ - 'quantity' => $amount, + 'quantity' => 1, 'width' => $width, 'height' => $height, 'length' => $length, @@ -167,6 +189,11 @@ class Dellin extends Model if ($response['metadata']['status'] === 200) { // Со стороны ДеловыеЛинии ошибок нет + $response['data']['price'] = [ + 'one' => $response['data']['price'], + 'all' => $response['data']['price'] * $amount + ]; + return $response['data']; } diff --git a/mirzaev/skillparts/system/views/buyers/index.php b/mirzaev/skillparts/system/views/buyers/index.php index d04ff24..5bf9907 100644 --- a/mirzaev/skillparts/system/views/buyers/index.php +++ b/mirzaev/skillparts/system/views/buyers/index.php @@ -60,25 +60,26 @@ AppAsset::register($this); -
-
-

Что ценят покупатели SkillParts?

-
+
+
+

Что в нас ценят?

+
- -
Удобный сервис для заказа и отслеживания
+ +
Подробное отслеживание
- -
Бесплатное экспедирование товаров в городах присутствия SkillParts
+ +
Бесплатное экспедирование
- -
Все поставщики России в одном месте
+ +
Наличие всех поставщиков
diff --git a/mirzaev/skillparts/system/views/cart/index.php b/mirzaev/skillparts/system/views/cart/index.php index 159bf4f..f28b583 100644 --- a/mirzaev/skillparts/system/views/cart/index.php +++ b/mirzaev/skillparts/system/views/cart/index.php @@ -47,7 +47,7 @@ use DateTime; } else { // Удалось рассчитать доставку - $delivery = date('d', DateTime::createFromFormat('Y-m-d', $connection['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()); + $delivery = (DateTime::createFromFormat('Y-m-d', $connection['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp() - time()) / 60 / 60 / 24 + 1; } // Инициализация цены @@ -119,4 +119,5 @@ use DateTime;
+ diff --git a/mirzaev/skillparts/system/views/offer/index.php b/mirzaev/skillparts/system/views/offer/index.php index 0b42652..bbced32 100644 --- a/mirzaev/skillparts/system/views/offer/index.php +++ b/mirzaev/skillparts/system/views/offer/index.php @@ -6,20 +6,21 @@

Оферта покупателям

1. Общие условия

-

1.1. Поставщик предлагает заключить договор купли-продажи потребителю, компании и предпринимателю (далее- покупатель) на описанных ниже условиях.

-

1.2. Договор считается заключенным в момент заказа товара на сайте (www.SkillParts.ru).

-

1.3. Стороны признают юридическую силу скан-копий подписанных документов, переписки, записей в протоколе работы программ, хранящихся на серверах Торговой площадки.

+

1.1. Поставщик предлагает заключить договор купли-продажи потребителю, компании и предпринимателю (далее - покупатель) на описанных ниже условиях

+

1.2. Договор считается заключенным в момент заказа товара на сайте (skillparts.ru)

+

1.3. Стороны признают юридическую силу скан-копий подписанных документов, переписки, записей в протоколе работы программ, хранящихся на серверах Торговой площадки

+

1.4 Условия оферты могут быть изменены, дополнены, в этом случае поставщик высылает покупателю уведомление на согласование в личный кабинет или на почту

2. Термины и определения Поставщик — компания ООО «СтандартМашинери», либо филиал компании ООО «СтандартМашинери» - Торговая площадка — ООО «СтнадартМашинери», предоставляющий программно-аппаратный комплекс организационных, информационных и технических решений, обеспечивающих взаимодействие поставщика и покупателя через электронные каналы связи.

+ Торговая площадка — ООО «СтандартМашинери», предоставляющий программно-аппаратный комплекс организационных, информационных и технических решений, обеспечивающих взаимодействие поставщика и покупателя через электронные каналы связи

3. Условия работы и оплата

-

3.1. Поставщик обязуется приобрести в собственность товар, заказанный покупателем на сайте, для последующей продажи покупателю, а потребитель обязуется оплатить заказанный Товар.

-

3.2. Цена, количество, наименование заказанного покупателем товара, определяются в момент отправки заказа поставщику.

-

3.3. Покупатель может оплатить заказ или пополнить баланс на сайте. Оплата произведённая на сайте, осуществляется на счёт торговой площадки и учитывается поставщиком как оплата заказа покупателем.

-

3.4. Условия возврата товара отражены и регулируются в личном кабинете покупателя.

+

3.1. Поставщик обязуется приобрести в собственность товар, заказанный покупателем на сайте, для последующей продажи покупателю, а потребитель обязуется оплатить заказанный Товар

+

3.2. Цена, количество, наименование заказанного покупателем товара, определяются в момент отправки заказа поставщику

+

3.3. Покупатель может оплатить заказ или пополнить баланс на сайте. Оплата произведённая на сайте, осуществляется на счёт торговой площадки и учитывается поставщиком как оплата заказа покупателем

+

3.4. Условия возврата товара отражены и регулируются в личном кабинете покупателя

3.5. Покупатель направляет претензии по исполнению заказа поставщику. В случае неудовлетворения требований, покупатель может информировать торговую площадку на адрес электронной почты info@skillparts.ru

4. Предоставление информации

-

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

+

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


Торговая площадка ООО «СтандартМашинери» ИНН: 2724241607
@@ -30,7 +31,7 @@

- Принять + Принять
diff --git a/mirzaev/skillparts/system/views/product/index.php b/mirzaev/skillparts/system/views/product/index.php index 254c2fe..e99c967 100644 --- a/mirzaev/skillparts/system/views/product/index.php +++ b/mirzaev/skillparts/system/views/product/index.php @@ -167,22 +167,22 @@ use app\models\Product;

- Габариты:мxмxм + Габариты:смxсмxсм

- Вес:кг + Вес:г

- Габариты:мxмxм + Габариты:смxсмxсм

- Габариты:кг + Габариты:г

diff --git a/mirzaev/skillparts/system/views/profile/index.php b/mirzaev/skillparts/system/views/profile/index.php index 6a78bad..2ecfb2e 100644 --- a/mirzaev/skillparts/system/views/profile/index.php +++ b/mirzaev/skillparts/system/views/profile/index.php @@ -60,7 +60,8 @@ if ( field($model, 'opts[delivery_to_terminal]', ['options' => ['class' => "mb-1"]]) ->dropDownList($delivery_to_terminal_list, [ - 'onChange' => 'page_profile_settings(this.parentElement.parentElement, \'profile_panel_settings_account\')' + 'onChange' => 'page_profile_settings(this.parentElement.parentElement, \'profile_panel_settings_account\')', + 'disabled' => count($delivery_to_terminal_list) <= 1 ])->label('Терминал'); ?> Выберите терминал получателя для рассчёта доставки @@ -91,7 +92,8 @@ if ( field($model, 'opts[delivery_from_terminal]', ['options' => ['class' => "mb-1"]]) ->dropDownList($delivery_from_terminal_list, [ - 'onChange' => 'page_profile_settings(this.parentElement.parentElement, \'profile_panel_settings_company\')' + 'onChange' => 'page_profile_settings(this.parentElement.parentElement, \'profile_panel_settings_company\')', + 'disabled' => count($delivery_from_terminal_list) <= 1 ])->label('Терминал'); ?> Выберите терминал отправителя для рассчёта доставки diff --git a/mirzaev/skillparts/system/views/profile/panel.php b/mirzaev/skillparts/system/views/profile/panel.php index fe43d0a..913aa7d 100644 --- a/mirzaev/skillparts/system/views/profile/panel.php +++ b/mirzaev/skillparts/system/views/profile/panel.php @@ -29,26 +29,26 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
- /> + />
Отправка уведомления
'form_profile_panel_notifications', - 'action' => false, - 'fieldConfig' => [ - 'template' => '{label}{input}' - ], - 'options' => [ - 'onsubmit' => 'return false;' - ] - ]); + $form = ActiveForm::begin([ + 'id' => 'form_profile_panel_notifications', + 'action' => false, + 'fieldConfig' => [ + 'template' => '{label}{input}' + ], + 'options' => [ + 'onsubmit' => 'return false;' + ] + ]); - // Значения по умолчанию - $model_notifications ?? $model_notifications = new Notification; - $model_notifications->account ?? $model_notifications->account = null; - $model_notifications->text ?? $model_notifications->text = ''; + // Значения по умолчанию + $model_notifications ?? $model_notifications = new Notification; + $model_notifications->account ?? $model_notifications->account = null; + $model_notifications->text ?? $model_notifications->text = ''; ?> errorSummary($model_notifications) ?> @@ -60,28 +60,34 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications'; Множественная отправка: @all или перечислить через запятую Тестирование: @test или оставить поле пустым - field($model_notifications, 'text', ['options' => ['class' => "mb-3"]])->textarea(); ?> + field($model_notifications, 'text', ['options' => ['class' => "mb-1"]])->textarea(["maxlength" => '300']); ?> - 'submitNotification', 'onclick' => 'page_profile_panel_notification_create(this.parentElement);', 'class' => 'flex-grow-1 mr-2 btn button_white button_clean']) ?> - 'submitNotification', 'onclick' => 'page_profile_panel_notification_create(this.parentElement, 1);', 'class' => 'flex-grow-1 mr-2 btn button_white button_clean']) ?> +

+ 0 + / + 300 +

+ + 'submitNotification', 'onclick' => 'page_profile_panel_notification_create(this.parentElement);', 'id' => 'notification-button-send', 'class' => 'flex-grow-1 mr-2 btn button_white button_clean']) ?> + 'submitNotification', 'onclick' => 'page_profile_panel_notification_create(this.parentElement, 1);', 'id' => 'notification-button-send-html', 'class' => 'flex-grow-1 mr-2 btn button_white button_clean']) ?>
- /> + />
'form_profile_panel_settings_search_period', - 'action' => false, - 'fieldConfig' => [ - 'template' => '{label}{input}', - ], - 'options' => [ - 'onsubmit' => 'return false;', - 'class' => 'mb-4' - ] - ]); + $form = ActiveForm::begin([ + 'id' => 'form_profile_panel_settings_search_period', + 'action' => false, + 'fieldConfig' => [ + 'template' => '{label}{input}', + ], + 'options' => [ + 'onsubmit' => 'return false;', + 'class' => 'mb-4' + ] + ]); ?> errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?> @@ -142,4 +148,33 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
- \ No newline at end of file + + + diff --git a/mirzaev/skillparts/system/views/search/index.php b/mirzaev/skillparts/system/views/search/index.php index 86acb26..e2c362c 100644 --- a/mirzaev/skillparts/system/views/search/index.php +++ b/mirzaev/skillparts/system/views/search/index.php @@ -31,7 +31,7 @@ - + getTimestamp() - time()) / 60 / 60 / 24 + 1; + } - if ($amount_raw < 1 || $price_raw < 1) { - // Нет в наличии или цена 0 рублей + // Инициализация индекса аккаунта + $index = $account['indx'] ?? 'Неизвестен'; - $supplies_html .= << @@ -97,10 +103,10 @@
HTML; - } else { - // Есть в наличии + } else { + // Есть в наличии - $supplies_html .= << $index @@ -119,10 +125,8 @@ HTML; - } - ?> - - + } + ?>
diff --git a/mirzaev/skillparts/system/views/search/panel.php b/mirzaev/skillparts/system/views/search/panel.php index 56c0f78..8f8e6bd 100644 --- a/mirzaev/skillparts/system/views/search/panel.php +++ b/mirzaev/skillparts/system/views/search/panel.php @@ -38,7 +38,7 @@ if (isset($history) && $history) { foreach ($response as $row) { // Перебор найденных данных - $catn = $row['catn']; + $catn = $row[0]['supply']['catn']; echo <<$catn diff --git a/mirzaev/skillparts/system/views/suppliers/index.php b/mirzaev/skillparts/system/views/suppliers/index.php index 7544a6c..9754cec 100644 --- a/mirzaev/skillparts/system/views/suppliers/index.php +++ b/mirzaev/skillparts/system/views/suppliers/index.php @@ -63,28 +63,32 @@ AppAsset::register($this);
-
-
-

Продавайте свои товары на
площадке SkillParts по всей России

-
+
+
+

Преимущества наших партнёров

+
- -
Дополнительный инструмент продаж для вашего бизнеса
+ +
Современный инструмент

Не требует размещения штата сотрудников

- -
Расширяйте географию продаж
+ +
Расширение географии

Тысячи клиентов по всей России

- -
Своевременные взаиморасчеты
+ +
Безопасный расчёт

В течение 5-7 банковских дней

- Стать поставщиком +
+ Присоединиться + Ответ в течение суток +
+ Оферта
diff --git a/mirzaev/skillparts/system/views/suppliers/request.php b/mirzaev/skillparts/system/views/suppliers/request.php new file mode 100644 index 0000000..3d21938 --- /dev/null +++ b/mirzaev/skillparts/system/views/suppliers/request.php @@ -0,0 +1,134 @@ + + +beginPage() ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + registerCsrfMetaTags() ?> + + <?= Html::encode($this->title ?? 'Поставщикам | SkillParts') ?> + + head() ?> + + + + beginBody() ?> + +
+
+ +
+
+ +
+
+

Заявка на подключение

+ 'form_suppliers_request', + 'action' => false, + 'fieldConfig' => [ + 'template' => '{label}{input}', + ], + // 'options' => [ + // 'onsubmit' => 'return false;' + // ] + ]); + + // Инициализация + $model_request ?? $model_request = new Request(); + ?> + + +
+ field($model_request, 'phon', ['options' => ['class' => "mb-1 col-3"]])->input('tel', ['aria-invalid' => false, 'aria-required' => true, 'pattern' => '7[0-9]{3}[0-9]{3}[0-9]{2}[0-9]{2}', 'placeholder' => '79091112233', 'title' => '79091112233']); ?> + field($model_request, 'mail', ['options' => ['class' => "mb-1 col-4"]])->input('email', ['placeholder' => 'company@mail.ru']); ?> + field($model_request, 'file', ['options' => ['class' => "mb-1 col-5 d-flex flex-column justify-content-center"]])->fileInput(['multiple' => true, 'class' => 'my-auto px-0']) ?> +
+ + field($model_request, 'text', ['options' => ['class' => "mb-1"]])->textarea(['rows' => '5', 'maxlength' => '300']) ?> + +

+ 0 + / + 300 +

+ +
+ 'submitRequest', 'id' => 'request-button-send', 'class' => 'col-auto mx-auto btn button_white button_clean']) ?> +
+ + +
+
+ + + + + endBody() ?> + + + + +endPage() ?> diff --git a/mirzaev/skillparts/system/web/css/pages/buyers.css b/mirzaev/skillparts/system/web/css/pages/buyers.css index d87db4e..a9b5e4f 100644 --- a/mirzaev/skillparts/system/web/css/pages/buyers.css +++ b/mirzaev/skillparts/system/web/css/pages/buyers.css @@ -13,17 +13,3 @@ main { #page_buyers article>div p { color: #617fca; } - -#page_buyers article>div .button_become_buyer { - border: 3px solid; - border-radius: 0; - transition: .2s; -} - -#page_buyers article>div .button_become_buyer:hover { - background-color: rgb(250, 249, 253); -} - -#page_buyers article>div .button_become_buyer:active { - background-color: rgb(229, 225, 243); -} diff --git a/mirzaev/skillparts/system/web/css/pages/offer.css b/mirzaev/skillparts/system/web/css/pages/offer.css index e627317..f8af7e4 100644 --- a/mirzaev/skillparts/system/web/css/pages/offer.css +++ b/mirzaev/skillparts/system/web/css/pages/offer.css @@ -1,17 +1,3 @@ #page_offer article { background-color: #fff; } - -#page_offer article>div .button_accept_offer { - border: 3px solid; - border-radius: 0; - transition: .2s; -} - -#page_offer article>div .button_accept_offer:hover { - background-color: rgb(250, 249, 253); -} - -#page_offer article>div .button_accept_offer:active { - background-color: rgb(229, 225, 243); -} diff --git a/mirzaev/skillparts/system/web/css/pages/suppliers.css b/mirzaev/skillparts/system/web/css/pages/suppliers.css index 88947ea..0fdd98f 100644 --- a/mirzaev/skillparts/system/web/css/pages/suppliers.css +++ b/mirzaev/skillparts/system/web/css/pages/suppliers.css @@ -16,10 +16,6 @@ main { transition: .2s; } -#page_suppliers article>div .button_become_supplier:hover { - background-color: rgb(250, 249, 253); -} - -#page_suppliers article>div .button_become_supplier:active { - background-color: rgb(229, 225, 243); +#page_suppliers article>div .button_offer_supplier { + height: min-content; } diff --git a/mirzaev/skillparts/system/web/img/icons/assortiment.png b/mirzaev/skillparts/system/web/img/icons/assortiment.png new file mode 100644 index 0000000..6663dc2 Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/assortiment.png differ diff --git a/mirzaev/skillparts/system/web/img/icons/brain.png b/mirzaev/skillparts/system/web/img/icons/brain.png new file mode 100644 index 0000000..92d108e Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/brain.png differ diff --git a/mirzaev/skillparts/system/web/img/icons/map.png b/mirzaev/skillparts/system/web/img/icons/map.png new file mode 100644 index 0000000..dd95249 Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/map.png differ diff --git a/mirzaev/skillparts/system/web/img/icons/shield.png b/mirzaev/skillparts/system/web/img/icons/shield.png new file mode 100644 index 0000000..1de858f Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/shield.png differ diff --git a/mirzaev/skillparts/system/web/img/icons/track.png b/mirzaev/skillparts/system/web/img/icons/track.png new file mode 100644 index 0000000..ebbe542 Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/track.png differ diff --git a/mirzaev/skillparts/system/web/img/icons/truck.png b/mirzaev/skillparts/system/web/img/icons/truck.png new file mode 100644 index 0000000..6136c5e Binary files /dev/null and b/mirzaev/skillparts/system/web/img/icons/truck.png differ diff --git a/mirzaev/skillparts/system/web/js/cart.js b/mirzaev/skillparts/system/web/js/cart.js index 788f5c2..9ee0544 100644 --- a/mirzaev/skillparts/system/web/js/cart.js +++ b/mirzaev/skillparts/system/web/js/cart.js @@ -191,12 +191,60 @@ function cart_cost_calculate() { /** * Изменить количество товара в корзине */ - function cart_list_comment_edit(catn, element) { +function cart_list_comment_edit(catn, element) { if (catn !== null && catn !== undefined && element !== null && element !== undefined) { - element.innerHTML = ''; + // Инициализация textarea + element.innerHTML = ''; element.removeAttribute('onclick'); + // Инициализация счетчика + let counter = document.createElement('p'); + + counter.setAttribute('id', element.id + '-textarea-counter'); + counter.setAttribute('class', "text-right"); + + // Инициализация значения текущего количества символов + let counter_current = document.createElement('span'); + + counter_current.setAttribute('id', element.id + '-textarea-counter-current'); + counter_current.innerText = document.getElementById(element.id + '-textarea').value.length; + + // Инициализация разделителя между текущим и максимальным значениями + let counter_delimiter = document.createElement('span'); + + counter_delimiter.innerText = ' / '; + + // Инициализация значения максиального количества символов + let counter_maximum = document.createElement('span'); + + counter_maximum.setAttribute('id', element.id + '-textarea-counter-maximum'); + counter_maximum.innerText = 300; + + // Формирование счетчика + counter.append(counter_current); + counter.append(counter_delimiter); + counter.append(counter_maximum); + + // Запись счетчика после textarea + element.after(counter); + + // Инициализация счетчика + initTextarea( + '#' + element.id + '-textarea', + '#' + counter_current.id, + '#' + counter_maximum.id, + function () { + let textarea = document.getElementById(element.id + '-textarea'); + + textarea.removeAttribute('onchange'); + }, + function () { + let textarea = document.getElementById(element.id + '-textarea'); + + textarea.setAttribute('onchange', 'return cart_list_comment_save(\'' + catn + '\', this.parentElement)'); + }); + return false; } @@ -209,11 +257,19 @@ function cart_list_comment_save(catn, element) { let text = element.children[0].value; // Обновление заголовка (предзагрузка) - element.innerHTML = text; + if (text.trim() == '') { + element.innerHTML = 'Комментарий к заказу'; + } else { + element.innerHTML = text; + } + + // Деинициализация счетчика + document.getElementById(element.id + '-textarea-counter').remove(); // Запись аттрибута (предзагрузка) element.setAttribute('onclick', 'return cart_list_comment_edit(\'' + catn + '\', this);'); + $.ajax({ url: '/cart/' + catn + '/edit/comm', type: 'post', @@ -224,7 +280,7 @@ function cart_list_comment_save(catn, element) { }, success: function (data, status) { // Заголовок - if (data.comm !== undefined && element !== null && element !== undefined) { + if (data.comm !== undefined) { // Обновление заголовка element.innerHTML = data.comm; diff --git a/mirzaev/skillparts/system/web/js/profile.js b/mirzaev/skillparts/system/web/js/profile.js index 02d4e5b..aa9d00d 100644 --- a/mirzaev/skillparts/system/web/js/profile.js +++ b/mirzaev/skillparts/system/web/js/profile.js @@ -174,23 +174,3 @@ function page_profile_response(data, status) { $('meta[name=csrf-token]').prop("content", data._csrf); } } - -// Сокрытие первого элемента