diff --git a/mirzaev/skillparts/system/controllers/MainController.php b/mirzaev/skillparts/system/controllers/MainController.php
index c6f71ef..0cd57f9 100644
--- a/mirzaev/skillparts/system/controllers/MainController.php
+++ b/mirzaev/skillparts/system/controllers/MainController.php
@@ -22,11 +22,9 @@ class MainController extends Controller
}
/**
- * Displays homepage.
- *
- * @return string
+ * Главная страница
*/
- public function actionIndex()
+ public function actionIndex(): string|array
{
if (Yii::$app->request->isAjax) {
// AJAX-POST-запрос
diff --git a/mirzaev/skillparts/system/controllers/ProfileController.php b/mirzaev/skillparts/system/controllers/ProfileController.php
index 5054382..09c51a7 100644
--- a/mirzaev/skillparts/system/controllers/ProfileController.php
+++ b/mirzaev/skillparts/system/controllers/ProfileController.php
@@ -1,4 +1,5 @@
request->post('Supply') ?? Yii::$app->request->get('Supply'));
+ $model = Yii::$app->user->identity;
+
+ // Генерация
+ $sidebar = $this->renderPartial('sidebar');
if (Yii::$app->request->isAjax) {
// AJAX-POST-запрос
@@ -67,13 +75,39 @@ class ProfileController extends Controller
Yii::$app->response->format = Response::FORMAT_JSON;
return [
- 'main' => $this->renderPartial('index'),
+ 'main' => $this->renderPartial('index', compact('model', 'sidebar')),
'redirect' => '/profile',
'_csrf' => Yii::$app->request->getCsrfToken()
];
}
- return $this->render('index', compact('model'));
+ return $this->render('index', compact('model', 'sidebar'));
+ }
+
+ /**
+ * Страницка поставок
+ */
+ public function actionSupplies(): string|array
+ {
+ // Инициализация
+ $model = new Supply(Yii::$app->request->post('Supply') ?? Yii::$app->request->get('Supply'));
+
+ // Генерация
+ $sidebar = $this->renderPartial('sidebar', compact('model'));
+
+ if (Yii::$app->request->isAjax) {
+ // AJAX-POST-запрос
+
+ Yii::$app->response->format = Response::FORMAT_JSON;
+
+ return [
+ 'main' => $this->renderPartial('supplies', compact('model', 'sidebar')),
+ 'redirect' => '/profile/supplies',
+ '_csrf' => Yii::$app->request->getCsrfToken()
+ ];
+ }
+
+ return $this->render('supplies', compact('model', 'sidebar'));
}
public function actionImport()
@@ -82,6 +116,9 @@ class ProfileController extends Controller
$model = new Supply(Yii::$app->request->post('Supply') ?? Yii::$app->request->get('Supply'));
$model->scenario = $model::SCENARIO_IMPORT;
+ // Генерация
+ $sidebar = $this->renderPartial('sidebar', compact('model'));
+
if (Yii::$app->request->isAjax) {
// AJAX-POST-запрос
@@ -94,12 +131,12 @@ class ProfileController extends Controller
}
return [
- 'main' => $this->renderPartial('index', compact('model')),
+ 'main' => $this->renderPartial('supplies', compact('model', 'sidebar')),
'_csrf' => Yii::$app->request->getCsrfToken()
];
}
- return $this->render('index', compact('model'));
+ return $this->render('supplies', compact('model', 'sidebar'));
}
public static function readGroups()
diff --git a/mirzaev/skillparts/system/controllers/SearchController.php b/mirzaev/skillparts/system/controllers/SearchController.php
index 8894b13..39156a2 100644
--- a/mirzaev/skillparts/system/controllers/SearchController.php
+++ b/mirzaev/skillparts/system/controllers/SearchController.php
@@ -13,7 +13,7 @@ class SearchController extends Controller
public function actionIndex(): array|string
{
// Инициализация
- $request = Yii::$app->request->post('request') ?? Yii::$app->request->get('q');
+ $query = Yii::$app->request->post('request') ?? Yii::$app->request->get('q');
if (Yii::$app->request->post('type') === 'product' || Yii::$app->request->get('type') === 'product') {
// Поиск по продуктам
@@ -51,8 +51,10 @@ class SearchController extends Controller
// Здесь запись истории запросов (в базе данных)
//
- if ($response = Product::search($request)) {
- // Данные найдены
+ $limit = Yii::$app->request->isAjax ? 10 : 30;
+
+ if ($response = Product::searchByCatn($query, $limit)) {
+ // Данные найдены по поиску в полях Каталожного номера
// Запись ответа
$return = [
@@ -66,9 +68,10 @@ class SearchController extends Controller
// Запись ответа
$return['main'] = $this->renderPartial('/search/index', compact('response'));
$return['search_line_window_hide'] = 1;
- $return['redirect'] = '/search?type=product&q=' . $request;
+ $return['redirect'] = '/search?type=product&q=' . $query;
}
} else {
+
// Данные не найдены
Yii::$app->response->statusCode = 404;
diff --git a/mirzaev/skillparts/system/models/Account.php b/mirzaev/skillparts/system/models/Account.php
index 5a9cdb3..08f3193 100644
--- a/mirzaev/skillparts/system/models/Account.php
+++ b/mirzaev/skillparts/system/models/Account.php
@@ -1,23 +1,39 @@
'Аутентификационный хеш',
+ 'mail' => 'Почта',
+ 'pswd' => 'Пароль',
+ 'name' => 'Имя',
+ 'simc' => 'Номер',
+ 'sity' => 'Город',
+ 'comp' => 'Компания',
+ 'taxn' => 'ИНН',
+ 'onec' => 'Данные 1C',
+ 'opts' => 'Параметры'
+ ]
+ );
+ }
+
+ /**
+ * Правила
+ */
+ public function rules(): array
{
return array_merge(
parent::rules(),
@@ -42,24 +84,13 @@ class Account extends Document implements IdentityInterface, PartnerInterface
);
}
- public function attributeLabels()
- {
- return array_merge(
- parent::attributeLabels(),
- [
- 'mail' => 'Почта',
- 'pswd' => 'Пароль',
- 'name' => 'Имя',
- 'simc' => 'Номер',
- 'sity' => 'Город',
- 'comp' => 'Компания',
- 'taxn' => 'ИНН',
- 'auth' => 'Аутентификационный хеш'
- ]
- );
- }
-
- public function beforeSave($data)
+ /**
+ * Перед сохранением
+ *
+ * @todo Подождать обновление от ебаного Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public function beforeSave($data): bool
{
if (parent::beforeSave($data)) {
if ($this->isNewRecord) {
@@ -71,70 +102,143 @@ class Account extends Document implements IdentityInterface, PartnerInterface
return false;
}
- public function getExportFields1c($context = null)
+ /**
+ * Чтение полей для экспорта из 1С
+ */
+ public function getExportFields1c($context = null): array
{
- return [
- 'Ид' => 'id',
- 'Наименование' => 'username',
- 'ПолноеНаименование' => 'full_name',
- 'Фамилия' => 'surname',
- 'Имя' => 'name',
- ];
+ return [];
}
+ /**
+ * Чтение идентификатора
+ *
+ * @see IdentityInterface
+ */
public function getId(): string
{
- return $this->_key;
+ return self::collectionName() . '/' . $this->_key;
}
+ /**
+ * Чтение идентификатора
+ */
public function readId(): string
{
- return self::collectionName() . '/' . $this->getId();
+ return $this->getId();
}
- public function getAuthKey()
+ /**
+ * Чтение аутентификационного ключа
+ */
+ public function getAuthKey(): string
{
return $this->auth;
}
- public static function findIdentity($_key)
+ /**
+ * Идентификация
+ *
+ * @todo Подождать обновление от ебаного Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public static function findIdentity($_id): self
{
- return static::findByKey($_key);
+ return static::findById($_id);
}
- public static function findIdentityByAccessToken($pass, $type = null)
+ /**
+ * Поиск по ключу
+ *
+ * @todo Подождать обновление от ебаного Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public static function findIdentityByAccessToken($pass, $type = null): self
{
return static::findOne(['pass' => $pass]);
}
- public static function findByMail($mail)
+ /**
+ * Поиск по почте
+ *
+ * @todo Подождать обновление Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public static function findByMail($mail): self
{
return static::findOne(['mail' => $mail]);
}
- public static function findByKey($_key)
+ /**
+ * Поиск по идентификатору
+ *
+ * @todo Подождать обновление Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public static function findById($_id): self
{
- return static::findOne(['_key' => $_key]);
+ return static::searchById($_id);
}
- public static function validateMail($mail)
+ /**
+ * Проверка почты
+ */
+ public static function validateMail(string $mail): bool
{
if (static::findByMail($mail)) {
// Почта найдена в базе данных
- return false;
+ return true;
}
- return true;
+ return false;
}
- public function validatePassword($pswd)
+ /**
+ * Проверка пароля
+ */
+ public function validatePassword(string $pswd): bool
{
return Yii::$app->security->validatePassword($pswd, $this->pswd);
}
- public function validateAuthKey($auth)
+ /**
+ * Проверка аутентификационного ключа
+ *
+ * @todo Подождать обновление Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public function validateAuthKey($auth): bool
{
return $this->getAuthKey() === $auth;
}
+
+ /**
+ * Записать параметр
+ *
+ * @param string $name Название параметра
+ * @param mixed $value Значение параметра
+ */
+ public function writeOption(string $name, mixed $value = null): bool
+ {
+ // Запись
+ $this->opts[$name] = $value;
+
+ // Отправка
+ return $this->save();
+ }
+
+ /**
+ * Удалить параметр
+ *
+ * @param string $name Название параметра
+ */
+ public function deleteOption(string $name): bool
+ {
+ // Удаление
+ unset($this->opts[$name]);
+
+ // Отправка
+ return $this->save();
+ }
}
diff --git a/mirzaev/skillparts/system/models/AccountForm.php b/mirzaev/skillparts/system/models/AccountForm.php
index 8dfc105..934db4d 100644
--- a/mirzaev/skillparts/system/models/AccountForm.php
+++ b/mirzaev/skillparts/system/models/AccountForm.php
@@ -56,7 +56,7 @@ class AccountForm extends Model
$account = $this->getAccount();
- if (!$account || !$account->validateMail($this->mail)) {
+ if (!$account || $account->validateMail($this->mail)) {
// Проверка не пройдена
$this->addError($attribute, 'Почта уже привязана');
diff --git a/mirzaev/skillparts/system/models/Document.php b/mirzaev/skillparts/system/models/Document.php
index 6e379d1..27dedd6 100644
--- a/mirzaev/skillparts/system/models/Document.php
+++ b/mirzaev/skillparts/system/models/Document.php
@@ -1,13 +1,31 @@
'Дата',
@@ -24,25 +45,36 @@ abstract class Document extends ActiveRecord
];
}
- public function rules()
+
+ /**
+ * Правила
+ *
+ * @todo Добавить проверку существования аккаунта
+ */
+ public function rules(): array
{
return [
[
'writer',
'string'
- // Надо добавить проверку существования аккаунта
]
];
}
- public function beforeSave($data)
+ /**
+ * Перед сохранением
+ *
+ * @todo Подождать обновление от ебаного Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public function beforeSave($data): bool
{
if (parent::beforeSave($data)) {
if ($this->isNewRecord) {
}
$this->date = time();
- $this->writer = $this->writer ?? Yii::$app->user->identity->readId();
+ $this->writer = $this->writer ?? Yii::$app->user->id;
return true;
}
@@ -50,11 +82,25 @@ abstract class Document extends ActiveRecord
return false;
}
+ /**
+ * Чтение идентификатора
+ */
public function readId(): ?string
{
- return isset($this->_key) ? static::collectionName() . '/' . $this->_key : null;
+ return isset($this->_key) && static::collectionName() ? static::collectionName() . '/' . $this->_key : null;
}
+ /**
+ * Поиск по идентификатору
+ */
+ public static function searchById(string $_id): ?static
+ {
+ return static::findOne(['_id' => $_id]);
+ }
+
+ /**
+ * Чтение количества записей
+ */
public static function readAmount(): int
{
return static::find()->count();
diff --git a/mirzaev/skillparts/system/models/Edge.php b/mirzaev/skillparts/system/models/Edge.php
index b18950d..49a4b75 100644
--- a/mirzaev/skillparts/system/models/Edge.php
+++ b/mirzaev/skillparts/system/models/Edge.php
@@ -1,10 +1,17 @@
_key) ? $this : new static;
+ $edge = new static;
// Настройка
$edge->_from = $_from;
@@ -77,7 +90,14 @@ abstract class Edge extends Document
return $edge;
}
- public function beforeSave($data)
+
+ /**
+ * Перед сохранением
+ *
+ * @todo Подождать обновление от ебаного Yii2 и добавить
+ * проверку типов передаваемых параметров
+ */
+ public function beforeSave($data): bool
{
if (parent::beforeSave($data)) {
if ($this->isNewRecord) {
diff --git a/mirzaev/skillparts/system/models/Product.php b/mirzaev/skillparts/system/models/Product.php
index 0f8c06e..a105a8f 100644
--- a/mirzaev/skillparts/system/models/Product.php
+++ b/mirzaev/skillparts/system/models/Product.php
@@ -1,23 +1,52 @@
'Название (name)',
+ 'ocid' => 'Идентификатор 1C (ocid)',
+ 'catn' => 'Каталожный номер (catn)',
+ 'oemn' => 'OEM номера (oemn)',
+ // 'data' => 'Данные товара (data)',
+ // 'cost' => 'Цены (cost)',
+ // 'time' => 'Сроки доставки (time)',
+ 'file' => 'Документ',
+ 'group' => 'Группа'
+ ]
+ );
+ }
+
+ /**
+ * Правила
+ */
public function rules(): array
{
return array_merge(
@@ -70,25 +123,13 @@ class Product extends Document
);
}
- public function attributeLabels(): array
- {
- return array_merge(
- parent::attributeLabels(),
- [
- 'name' => 'Название (name)',
- 'ocid' => 'Идентификатор 1C (ocid)',
- 'catn' => 'Каталожный номер (catn)',
- 'oemn' => 'OEM номера (oemn)',
- // 'data' => 'Данные товара (data)',
- // 'cost' => 'Цены (cost)',
- // 'time' => 'Сроки доставки (time)',
- 'file' => 'Документ',
- 'group' => 'Группа'
- ]
- );
- }
-
- public function import()
+ /**
+ * Импорт товаров
+ *
+ * На данный момент обрабатывает только импорт из
+ * файлов с расширением .excel
+ */
+ public function import(): bool
{
// Инициализация массива данных
$data = [];
@@ -140,47 +181,15 @@ class Product extends Document
return false;
}
- public static function search(string $text): array
- {
- return (new Query)->limit(10)->search('product_search', ['id' => '_key', 'catn' => 'catn'], ['catn' => $text], 1);
- }
-
- private static function writeEdgeBetweenGroup(string $from, string $to): bool
- {
- // Инициализация
- $edge = new SupplyEdgeSupplyGroup();
-
- // Настройка
- $edge->_from = $from;
- $edge->_to = $to;
-
- // Запись
- return $edge->save();
- }
-
- private static function writeEdgeBetweenRequisite(string $from, string $to): bool
- {
- // Инициализация
- $edge = new SupplyEdgeRequisite();
-
- // Настройка
- $edge->_from = $from;
- $edge->_to = $to;
-
- // Запись
- return $edge->save();
- }
-
- public static function readById(string $_key): ?Product
- {
- return self::findOne(['_key' => $_key]);
- }
-
/**
* Поиск по каталожному номеру
*/
- public static function readByCatn(string $catn): ?Product
+ public static function searchByCatn(string $query, int $limit = 1): Product|array|null
{
- return self::findOne(['catn' => $catn]);
+ if ($limit <= 1) {
+ return static::findOne(['catn' => $query]);
+ }
+
+ return self::find()->limit($limit)->view('product_search', ['id' => '_key', 'catn' => 'catn'], ['catn' => $query], 'START');
}
}
diff --git a/mirzaev/skillparts/system/models/ProductGroup.php b/mirzaev/skillparts/system/models/ProductGroup.php
index 28d1527..a09fe68 100644
--- a/mirzaev/skillparts/system/models/ProductGroup.php
+++ b/mirzaev/skillparts/system/models/ProductGroup.php
@@ -1,26 +1,56 @@
'Название (name)'
+ ]
+ );
+ }
+
+ /**
+ * Правила
+ */
+ public function rules(): array
{
return array_merge(
parent::rules(),
@@ -34,34 +64,18 @@ class ProductGroup extends Document implements GroupInterface
);
}
- public function attributeLabels()
+ /**
+ * Запись члена группы
+ */
+ public function writeMember(Product $member): ProductEdgeProductGroup
{
- return array_merge(
- parent::attributeLabels(),
- [
- 'name' => 'Название (name)',
- 'onec_id' => 'Название 1C (onec_id)',
- 'onec_prnt_id' => 'Название родителя 1C (onec_prnt_id)',
- ]
- );
- }
-
- public function writeMember(Document $member, string $group)
- {
- if (isset($member->_key)) {
- return static::writeEdgeBetweenMember($member->collectionName() . '/' . $member->_key, $this->collectionName() . '/' . $group);
- }
-
- return false;
+ return ProductEdgeProductGroup::write($member->readId(), $this->readId(), 'member');
}
/**
- * Создание дерева групп
- * в параметр передаётся массив всех групп (import.xml > Классификатор > Группы)
- * $groups[0]->parent - родительская группа
- * $groups[0]->children - дочерние группы
+ * Запись рёбер групп
*
- * @param Group[] $groups
+ * Создание взаимоотношений между группами по типу древовидной системы
*/
public static function createTree1c($groups): Document|null
{
@@ -88,10 +102,11 @@ class ProductGroup extends Document implements GroupInterface
}
/**
- * Создаём группу по модели группы CommerceML
- * проверяем все дерево родителей группы, если родителя нет в базе - создаём
+ * Запись группы
*
- * @param Group $group
+ * Создаём группу по модели группы CommerceML
+ * проверяем все дерево родителей группы,
+ * если родителя нет в базе - создаём
*/
public static function createByML(Group $group): static|array|null
{
@@ -124,19 +139,6 @@ class ProductGroup extends Document implements GroupInterface
return $model;
}
- private static function writeEdgeBetweenMember(string $from, string $to): bool
- {
- // Инициализация
- $edge = new ProductEdgeProductGroup();
-
- // Настройка
- $edge->_from = $from;
- $edge->_to = $to;
-
- // Запись
- return $edge->save();
- }
-
private static function writeEdgeBetweenGroup(string $from, string $to): bool
{
// Инициализация
diff --git a/mirzaev/skillparts/system/models/Supply.php b/mirzaev/skillparts/system/models/Supply.php
index 8d2226c..3882a26 100644
--- a/mirzaev/skillparts/system/models/Supply.php
+++ b/mirzaev/skillparts/system/models/Supply.php
@@ -1,24 +1,46 @@
'Данные 1C'
+ 'onec' => 'Данные 1С'
]
);
}
+ /**
+ * После сохранения
+ */
public function afterSave($data, $vars): void
{
// Запись ребра: АККАУНТ -> ПОСТАВКА
- (new AccountEdgeSupply)->write(Yii::$app->user->identity->readId(), $this->readId(), 'import');
+ (new AccountEdgeSupply)->write(Yii::$app->user->id, $this->readId(), 'import');
}
+ /**
+ * Запись реквизитов из 1С
+ */
public function setRequisite1c($name, $value): mixed
{
return true;
}
/**
- * Установка группы, где находится продукт
+ * Запись группы из 1С
*/
public function setGroup1c($group): mixed
{
@@ -64,23 +95,66 @@ class Supply extends Product implements ProductInterface
return true;
}
- public static function createProperties1c($properties): mixed
+ /**
+ * Запись данных свойств по UUID 1C
+ *
+ * Ищет записанные свойства из 1C по их идентификатору и добавляет к ним
+ * недостающие данные. Это костыль оставшийся от реляционных баз данных
+ */
+ public static function createProperties1c($properties): void
{
- return true;
+ // Инициализация
+ $models = static::searchOnecByAccountId(Yii::$app->user->id, true);
+ $properties = self::xml2array($properties->xml);
+
+ foreach ($models as $model) {
+ // Перебор записей
+
+ // Инициализация
+ $changes = false;
+
+ foreach ($model->onec['ЗначенияСвойств'] as &$attribute) {
+ // Перебор аттрибутов
+
+ foreach ($properties as $property) {
+ // Перебор свойств
+
+ if ($attribute['ЗначенияСвойства']['Ид'] === $property['Свойство']['Ид']) {
+ // Совпадение идентификаторов
+
+ // Объединение данных
+ array_merge($attribute, $property);
+
+ // Запись индикатора наличия изменений
+ $changes = true;
+ }
+ }
+ }
+
+ if ($changes) {
+ $model->save();
+ }
+ }
}
+ /**
+ * Запись параметров из 1С
+ */
public function setProperty1c($property): mixed
{
return true;
}
+ /**
+ * Запись изображений из 1С
+ */
public function addImage1c($path, $caption): mixed
{
return true;
}
/**
- * Запись ребра (предложения от поставки к продукту)
+ * Запись ребра (предложения от поставок к продуктам) из 1С
*/
public function getOffer1c($offer): SupplyEdgeProduct
{
@@ -89,7 +163,7 @@ class Supply extends Product implements ProductInterface
// Разработчику библеотеки надо дать по жопе
return new SupplyEdgeProduct;
- } else if (!$catn = Product::readByCatn($this->catn)) {
+ } else if (!$product = Product::searchByCatn($this->catn)) {
// Продукт не найден
if (!$this->initProduct()) {
@@ -100,12 +174,12 @@ class Supply extends Product implements ProductInterface
}
}
- $catn = Product::readByCatn($this->catn);
+ $product = Product::searchByCatn($this->catn);
// Запись ребра: ПОСТАВКА -> ПРОДУКТ
return (new SupplyEdgeProduct)->write(
$this->readId(),
- $catn->readId(),
+ $product->readId(),
'sell',
[
'onec' => self::xml2array($offer->xml)
@@ -114,26 +188,27 @@ class Supply extends Product implements ProductInterface
}
/**
- * Создать продукт
+ * Запись продукта из 1С
*/
- public static function createModel1c($product): self
+ public static function createModel1c($product): ?self
{
// Инициализация
- $model = self::readByOnecId($id = (string) $product->Ид) ?? new self;
+ $model = self::searchByOnecId($id = (string) $product->Ид) ?? new self;
- // Настройки
+ // Настройка
$model->ocid = $id ?? null;
$model->catn = (string) $product->Артикул;
$model->oemn = null;
$model->onec = self::xml2array($product->xml);
// Запись
- $model->save();
-
- return $model;
+ return $model->save() ? $model : null;
}
- protected function initProduct(): bool
+ /**
+ * Инициализация продукта
+ */
+ protected function initProduct(): ?Product
{
// Надо не забыть сделать выборку полей и ручное подключение
@@ -141,7 +216,7 @@ class Supply extends Product implements ProductInterface
// Не передан каталожный номер
return false;
- } else if (Product::readByCatn($this->catn)) {
+ } else if (Product::searchByCatn($this->catn)) {
// Продукт уже был инициализирован
return true;
@@ -154,34 +229,79 @@ class Supply extends Product implements ProductInterface
$product->catn = $this->catn;
// Запись
- return $product->save();
+ return $product->save() ? $product : null;
}
-
- public function setPrice1c($price): void
+ /**
+ * Запись цены из 1С
+ */
+ public function setPrice1c($price): mixed
{
+ return true;
}
+ /**
+ * Запись данных на случай ошибки при экспорте из 1С
+ */
public function setRaw1cData($cml, $object): bool
{
- return false;
+ return true;
}
- public static function readByOnecId(string $ocid): ?Supply
+ /**
+ * Поиск по идентификатору из 1С
+ *
+ * @param string $ocid Идентификатор из 1С
+ *
+ * @return Supply|null
+ */
+ public static function searchByOnecId(string $ocid): ?Supply
{
- return self::findOne([self::getIdFieldName1c() => $ocid]);
+ return static::findOne([static::getIdFieldName1c() => $ocid]);
}
- public function getGroup1c(): SupplyGroup
+ /**
+ * Чтение группы из 1С
+ */
+ public function getGroup1c(): ?SupplyGroup
{
return $this->group;
}
/**
- * Название поля в котором хранится ID из 1C
+ * Чтение названия поля в котором хранится идентификатор из 1С
*/
public static function getIdFieldName1c(): string
{
return 'ocid';
}
+
+ public static function searchOnecByAccountId(string $id, bool $full = false): array
+ {
+ $subquery = static::find()
+ ->for(['account', 'account_edge_supply'])
+ ->traversal('supply')->in('account_edge_supply')
+ ->where(['account._id' => $id])
+ ->select('account_edge_supply')
+ ->createCommand();
+
+ $query = static::find()
+ ->addParams($subquery->getBindVars())
+ ->let('account_edge_supply', '(' . (string) $subquery . ')')
+ ->where('supply._id == account_edge_supply[0]._to')
+ ->andWhere('supply.onec["ЗначенияСвойств"] != null');
+
+ if ($full) {
+ // Если указан полный поиск
+ return $query->select('supply')->all();
+ }
+
+ $query = $query->select('supply.onec["ЗначенияСвойств"]')->createCommand()->execute()->getAll();
+
+ foreach ($query as &$attribute) {
+ $attribute = $attribute->getAll();
+ }
+
+ return $query;
+ }
}
diff --git a/mirzaev/skillparts/system/models/SupplyGroup.php b/mirzaev/skillparts/system/models/SupplyGroup.php
index adbeb8d..0261cc5 100644
--- a/mirzaev/skillparts/system/models/SupplyGroup.php
+++ b/mirzaev/skillparts/system/models/SupplyGroup.php
@@ -1,37 +1,18 @@
_from = $from;
- $edge->_to = $to;
-
- // Запись
- return $edge->save();
- }
-
- protected static function writeEdgeBetweenGroup(string $from, string $to): bool
- {
- // Инициализация
- $edge = new SupplyGroupEdgeSupplyGroup();
-
- // Настройка
- $edge->_from = $from;
- $edge->_to = $to;
-
- // Запись
- return $edge->save();
- }
}
diff --git a/mirzaev/skillparts/system/views/account.php b/mirzaev/skillparts/system/views/account.php
index 2fa994d..9dcc74b 100644
--- a/mirzaev/skillparts/system/views/account.php
+++ b/mirzaev/skillparts/system/views/account.php
@@ -1,5 +1,7 @@
@@ -11,21 +10,15 @@ use app\models\Supply;
-
-
-
Почта:
-
user->identity->mail ?>
-
-
+ = $sidebar ?>
-
-
Личный кабинет
-
-
Не знаю что сюда пока добавить
+
+
Настройки аккаунта
+
Пока не сделана нормальная панель управления я просто буду добавлять все настройки сюда
'form_product_import_excel',
+ 'id' => 'form_profile_options',
'action' => false,
'fieldConfig' => [
'template' => '{label}{input}',
@@ -37,20 +30,26 @@ use app\models\Supply;
]
]);
- $model = $model ?? new Supply;
- $groups = ProfileController::readGroups();
+ $model = $model ?? Yii::$app->user->identity;
+ var_dump($attributes = Supply::searchOnecByAccountId(Yii::$app->user->id));
+
+ // $list = [];
+
+ // //
+ // foreach ($attributes as $attribute) {
+ // $id = $attribute['ЗначенияСвойства']['Ид'];
+
+ // if (in_array($id, $list, true)) {
+ // continue;
+ // }
+
+ // $list[] = $id;
+ // }
?>
-
- = $form->field($model, 'group', ['options' => ['class' => "mb-3"]])->dropDownList($groups ?? ['Нет данных']); ?>
- = $form->field($model, 'file', ['enableLabel' => false])->fileInput(['multiple' => true, 'onChange' => 'supply_import(this.parentElement.parentElement)']) ?>
-
- = $form->errorSummary($model, ['header' => 'В документе были допущены ошибки:' /*, 'footer' => 'Исправьте их и попробуйте снова'*/]); ?>
+ = "a" //$form->field($model, 'opts[import_sections_oem]', ['options' => ['class' => "mb-3"]])->dropDownList($list ?? ['Нет данных']); ?>
-
-
Всего товаров:
-
Всего поставок:
diff --git a/mirzaev/skillparts/system/views/profile/sidebar.php b/mirzaev/skillparts/system/views/profile/sidebar.php
new file mode 100644
index 0000000..1b7a052
--- /dev/null
+++ b/mirzaev/skillparts/system/views/profile/sidebar.php
@@ -0,0 +1,34 @@
+
+
+
+
+
Почта:
+
= Yii::$app->user->identity->mail ?>
+
+
+
+
+ Настройки аккаунта
+
+
+ Управление поставками
+
+
+
+
+
Товары:
+
= Product::readAmount() ?>
+
+
+
Поставки:
+
= Supply::readAmount() ?>
+
+
\ No newline at end of file
diff --git a/mirzaev/skillparts/system/views/profile/supplies.php b/mirzaev/skillparts/system/views/profile/supplies.php
new file mode 100644
index 0000000..497acb5
--- /dev/null
+++ b/mirzaev/skillparts/system/views/profile/supplies.php
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+ = $sidebar ?>
+
+
+
+
Управление поставками
+ 'form_product_import_excel',
+ 'action' => false,
+ 'fieldConfig' => [
+ 'template' => '{label}{input}',
+ 'options' => ['class' => '']
+ ],
+ 'options' => [
+ 'class' => 'mb-3',
+ 'onsubmit' => 'return false;'
+ ]
+ ]);
+
+ $model = $model ?? new Supply;
+ $groups = ProfileController::readGroups();
+
+ ?>
+
+ = $form->field($model, 'group', ['options' => ['class' => "mb-3"]])->dropDownList($groups ?? ['Нет данных']); ?>
+ = $form->field($model, 'file', ['enableLabel' => false])->fileInput(['multiple' => true, 'onChange' => 'supply_import(this.parentElement.parentElement)']) ?>
+
+ = $form->errorSummary($model, ['header' => 'В документе были допущены ошибки:' /*, 'footer' => 'Исправьте их и попробуйте снова'*/]); ?>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mirzaev/skillparts/system/web/debug.txt b/mirzaev/skillparts/system/web/debug.txt
deleted file mode 100644
index e69de29..0000000