Перейти к содержанию
Официальный форум поддержки Simpla

Проблема с контрагентами в выгрузке с Мой склад


Рекомендуемые сообщения

Кто сталкивался с таким интересным подходом добавлять контрагентов?

Кто то до меня придумал у клиента такую фичу,

			if(empty($order->user_id))
            $order->user_id = $order->id;

В целом костыль норм, но потом если человек регается и user_id совпадает с номером заказа, то происходит каша в контрагентах при выгрузке в Мой склад.

Кто сталкивался и какое решение было оптимальным? 

Изменено пользователем Kami
Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Kami сказал:

Кто сталкивался с таким интересным подходом добавлять контрагентов?

Кто то до меня придумал у клиента такую фичу,


			if(empty($order->user_id))
            $order->user_id = $order->id;

В целом костыль норм, но потом если человек регается и user_id совпадает с номером заказа, то происходит каша в контрагентах при выгрузке в Мой склад.

Кто сталкивался и какое решение было оптимальным? 

В вашем коде предполагается, что если у заказа нет user_id, то используется номер заказа в качестве user_id. Это может быть полезным, если пользователь оформляет заказ без регистрации, и его данные не сохранены в базе данных. Однако, как вы указали, это может привести к проблемам при регистрации пользователей, когда user_id будет совпадать с номером заказа.

Чтобы избежать такой ситуации, я рекомендую изменить логику кода. Вместо того, чтобы использовать номер заказа в качестве user_id, можно создать отдельное поле в базе данных для номера заказа и сохранять его туда при оформлении заказа. Также можно добавить проверку на совпадение user_id и номера заказа при регистрации пользователей, и если они совпадают, то происходит автоматическое обновление user_id на другой уникальный идентификатор, который не будет совпадать с номером заказа.

Также, возможно, стоит пересмотреть процесс выгрузки контрагентов в Мой склад, чтобы учесть возможные изменения в логике кода.

1. Конкретный пример кода для изменения логики оформления заказов может выглядеть следующим образом:
Создайте новое поле "order_number" в таблице "orders". Для этого откройте файл "engine/init.php" и добавьте следующий код в функцию "init_db()":

 

$this->db->query("
    ALTER TABLE `{$this->db_prefix}orders` ADD COLUMN `order_number` INT(11) DEFAULT NULL;
");


2. В файле "engine/classes/Order.php" найдите функцию "create_order()". Замените код
 

if (empty($order->user_id)) {
    $order->user_id = $order->id;
}

на

if (empty($order->user_id)) {
    $order->user_id = $this->generate_user_id();
}

$order->order_number = $order->id;


3. Добавьте функцию "generate_user_id()" в тот же файл "engine/classes/Order.php":

 

private function generate_user_id() {
    $user_id = null;
    do {
        $user_id = rand(100000, 999999);
        $count = $this->orders->count_orders("user_id = '{$user_id}'");
    } while ($count > 0);

    return $user_id;
}

Эта функция генерирует случайный уникальный идентификатор для пользователя. Если пользователь уже существует с таким идентификатором, то функция генерирует новый идентификатор, пока не найдет уникальный.

4. Добавьте проверку на совпадение user_id и order_number в файле "engine/ajax/User.php" в функции "signup()":

 

// Проверяем, совпадают ли user_id и order_number
if (!empty($_SESSION['order_id']) && !empty($_POST['password'])) {
    $order = $this->orders->get_order(intval($_SESSION['order_id']));
    if ($order && $order->user_id == $order->order_number) {
        // Generate new user_id
        $user_id = $this->orders->generate_user_id();
        $this->orders->update_order($order->id, array('user_id' => $user_id));
    }
}

 

Этот код проверяет, существует ли заказ, связанный с текущей сессией, и был ли создан пользователь с помощью регистрации. Если user_id и order_number совпадают, то генерируется новый user_id и обновляется соответствующий заказ.

Надеюсь, это поможет вам решить проблему!

Ссылка на сообщение
Поделиться на другие сайты

Опять вспоминается товарищ Огурцов, который в старом фильме говорил:

- Так, ну что ж, товарищи, коллектив большой, народ квалифицированный, работа проделана большая, у меня лично сомнений нет, это дело так не пойдёт...

Для начала, судя по тому, что в инструкции встречаются несуществующие в актуальной версии пути"engine/init.php", "engine/classes/Order.php" и другие подобные, инструкция написано для какой-то специфичной переработанной версии Simpla. А может, для очень-очень старой. В любом случае, об этом надо бы сообщать...

Миниатюрная простенькая функция generate_user_id написана настолько неверно, что в ней прямо с ходу видны грубые ошибки.
1. Подсчет числа заказов в функции ВСЕГДА будет давать общее число заказов в магазине, без какой-либо фильтрации.
2. Если в магазине до выполнения нового кода ЕСТЬ заказы, то в результате в новом заказе в качестве user_id будет просто случайное число в диапазоне, возможно совпадающее с зарегистрированным пользователем. То есть заявленный функцонал просто не работает.
3. Если в магазине до выполнения нового кода НЕТ заказов, то функция войдет в бесконечный цикл и пользователь при попытке заказа после долгого ожидания увидит сообщение о серверной ошибке. 
4. Автор решения явно проверкой себя не затруднял.


Но самое главное, предложенное решение неоправданно сложное.
Куда как проще честно создать, если требуется, нового пользователя. Простенький код для этого можно подсмотреть в RegisterView.php.

Для текущей версии простое короткое решение может выглядеть примерно так:

if(empty($order->user_id)) {
            $order->user_id = $this->users->add_user(array(
                'name'=>'autogeristered by order '.$order->id, 
                'email'=>$order->id.'@autogeristered.mail', 
                'password'=>rand(100000, 999999), 
                'enabled'=>1, 
                'last_ip'=>$_SERVER['REMOTE_ADDR']
            ));
}

 

Изменено пользователем phukortsin
Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...
В 20.03.2023 в 10:05, phukortsin сказал:

Опять вспоминается товарищ Огурцов, который в старом фильме говорил:

- Так, ну что ж, товарищи, коллектив большой, народ квалифицированный, работа проделана большая, у меня лично сомнений нет, это дело так не пойдёт...

Для начала, судя по тому, что в инструкции встречаются несуществующие в актуальной версии пути"engine/init.php", "engine/classes/Order.php" и другие подобные, инструкция написано для какой-то специфичной переработанной версии Simpla. А может, для очень-очень старой. В любом случае, об этом надо бы сообщать...

Миниатюрная простенькая функция generate_user_id написана настолько неверно, что в ней прямо с ходу видны грубые ошибки.
1. Подсчет числа заказов в функции ВСЕГДА будет давать общее число заказов в магазине, без какой-либо фильтрации.
2. Если в магазине до выполнения нового кода ЕСТЬ заказы, то в результате в новом заказе в качестве user_id будет просто случайное число в диапазоне, возможно совпадающее с зарегистрированным пользователем. То есть заявленный функцонал просто не работает.
3. Если в магазине до выполнения нового кода НЕТ заказов, то функция войдет в бесконечный цикл и пользователь при попытке заказа после долгого ожидания увидит сообщение о серверной ошибке. 
4. Автор решения явно проверкой себя не затруднял.


Но самое главное, предложенное решение неоправданно сложное.
Куда как проще честно создать, если требуется, нового пользователя. Простенький код для этого можно подсмотреть в RegisterView.php.

Для текущей версии простое короткое решение может выглядеть примерно так:

if(empty($order->user_id)) {
            $order->user_id = $this->users->add_user(array(
                'name'=>'autogeristered by order '.$order->id, 
                'email'=>$order->id.'@autogeristered.mail', 
                'password'=>rand(100000, 999999), 
                'enabled'=>1, 
                'last_ip'=>$_SERVER['REMOTE_ADDR']
            ));
}

 

Согласен, написал неверное решение, той ночю я мало спал)

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...