Автор Тема: Нестандартный Reference-номер заказа  (Прочитано 7348 раз)

17 Январь 2013, 16:15:52
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Версия движка 1.5.3

Требуется чтобы номер заказа (reference) имел вид [login]-[number] (например 047454-001 по аналогии с нумерацией заказов на Озоне) где [login]-логин пользователя [number]-порядковый номер заказа пользователя.

Где копать? :)
17 Январь 2013, 17:09:01
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
В файле /classes/order/Order.php
Номер заказа и reference - это разные переменные.
Реферанс (String) - $reference.
Порядковый номер заказа - $id_order.
17 Январь 2013, 18:15:28
Ответ #2
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Где формируется уникальный идентификатор заказа я нашел, и поменять его на цифры не составляет труда.

Файл /classes/order/order.php строка 1368.

public static function generateReference()
{
return strtoupper(Tools::passwdGen(9, 'NO_NUMERIC'));
}
Даже с моими более чем скромными познаниями в PHP эта функция понятна на 100%.

Изменим её вот так:

public static function generateReference()
{
return Tools::passwdGen(6, 'NUMERIC');
}
И получим на выходе 6-ти значный номер вместо набора символов.

Задача же состоит в другом.

Предполагается что у каждого клиента есть свой PID (Personal ID). Идентификатор заказа в этом случае должен быть вида [PID]-[NUM]. Т.е. функция generateReference() должна взять PID клиента и номер последнего его заказа+1.


P.S. Пока писал, сам понял примерную схему решения проблемы.  :) Глубоко ковырять придётся.  Хотелось бы услышать мнение гуру.
17 Январь 2013, 19:28:59
Ответ #3
  • Администратор
  • Ветеран
  • *****
  • Сообщений: 102503
  • Репутация: +34219/-0
    • Просмотр профиля
Что такое номер заказа и реф.номер и чем они отличаются, как изменить реф.номер уже обсуждали,  Изменить № счета сбукв на цифры (Преста 1.5)
В prestashop персональный ИД клиента это его порядковый номер. В классе OrderCore узнать его можно из переменной $id_customer.
17 Январь 2013, 21:33:20
Ответ #4
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Уважаемый Виктор и Сообщество!

Думаю стоит внести ясность в некоторые понятия и термины которые обсуждались в теме смены № счёта и которые я использую здесь. Это очень важно при адаптации PrestaShop к российским условиям.

1. № заказа.  В PrestaShop их два!
Первый, это порядковый номер в системе. Номер который хранится в поле id_order таблицы ps_orders. Это поле является индексным. С точки зрения Управленческого Учёта поле бесполезное и нигде не используемое.
Второй, это так называемый "код заказа". он хранится в поле reference и представляет собой сгенерированную комбинацию символов. Поле не является индексным и вероятно нигде не проходит контроль уникальности. (Кстати вероятнее всего смена метода генерации с чисел на буквы произошла именно из-за появления повторов в этом поле). Это поле имеет крайне важное значение как для движка, так и для управленческого учёта. Этот номер используется как для службы поддержки магазина, так и для контроля за состоянием заказа самим покупателем в его личном кабинете.
Исходя из вышеописанного следует понимать  под термином "№ заказа" именно значение поля "reference"!
Принимая во внимание что многие компании используют различные системы бухгалтерского учёта, управленческого учёта и CRM, в которых есть необходимость вести упорядоченный учёт заказов клиентов, механизм формирования этого самого № заказа в PrestaShop, не устроит. (Я как раз из этих :) )

2. Счёт(Счёт-фактура), Товарно-транспортная накладная.

С точки зрения опять-таки управленческого и бухгалтерского учёта в PrestaShop только один документ представляет интерес: "Счёт" Правда по умолчанию в русском переводе он обзывается как "счёт-фактура" что есть в корне неправильно. Нумерацию счетов можно задавать просто и в принципе удовлетворит 99%. Правда требуется серьёзная переделка формы формирующей данный документ чтобы он был хоть на что-то вменяемое похож, но это думаю отдельная большая тема.

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

3. Логин клиента и его ID.

Логином клиента в PrestaShop является адрес электронной почты. ID - это номер в таблице MySQL PrestaShop. Производить манипуляции с ID клиента (так же как и с ID заказа) не следует так как это служебные поля имеющие значение для самого движка.

ИТОГО:

Для того чтобы формировать корректный № заказа (reference) нужно либо копировать в него значение поля id_order добавляя какой-либо префикс по аналогии со счетами (счетами-фактурами), либо изобретать свой "велосипед" внедряя изменения в код PrestaShop. :)

В моём случае, необходимо взять персональный ID из моей внутренней базы клиентов и сохранить его в профиле PrestaShop. Добавить поле для хранения номера последнего заказа. Взять эти два номера и объединив, записать в поле reference очередного заказа клиента.

Надеюсь не утомил.....  ;D
 

17 Январь 2013, 23:31:40
Ответ #5
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 105673
  • Репутация: +39553/-0
    • Просмотр профиля
    • Webstudio UwK
Тема довольно интересная и актуальная.
Очень часто, что под одним и тем же термином разные люди понимают разные вещи. Это мешает успешно решать поставленные задачи. Это особенно проявляется, когда постановкой задачи программисту занимается человек, который опирается на свои приоритеты. Что понятно бухгалтеру, не понятно программисту.

Не совсем согласен с некоторыми пунктами.
п1. № заказа в PrestaShop только один.
Это поле ID в таблице заказов. Т.е. заказы поступают в интернет-магазин и там регистрируются по порядку.

п2. Здесь имеет место не правильный перевод, так как перевод был сделан "дословно" без учета специфики бухгалтерского учёта. "Facture" перевели как "Счет" и одновремено "Счет-фактура".
Но это два раздельных документа, счет выставляется на предоплату до начала выполнения работ услуг, а счет-фактура выставляется по факту выполненных работ, услуг ( цитата из правил ведения бух. учета ).
Для Счета в Prestashop используется другой термин "Devis", есть модули которые позволяют работать с такими счетами.
Что касается "Счет-фактуры", то в Prestashop есть возможность добавить свой шаблон для формирования этого документа и в настройках указать модель для ее формирования.
Товарно-транспортная накладной - в PrestaShop нет такого документа, есть "Bons de livraison". Это документ о составе заказа (товары что входят в заказ), удобен при разделении заказа.

Prestashop сиcтема для интернет-магазина, цель и задачи которой показать товар, дать покупателю больше информации по товару, предоставить возможность купить выбранный товар, принять оплату и т.д., т.е. упростить продажу товаров и услуг, сделать доступной для более широкой аудитории. А не заменить бухгалтерские программы. Задача Prestashop передать данные о заказе в такую программу, это можно реализовать с помощью Webservice. Например, связать интернет-магазин с 1C.

п3. Логин клиента в Prestashop - это его email. Изменить на использование другого формата можно, но зачем проводить такую работу?
Если только для того, чтобы использовать этот логин в номерах документа, то не стоит. Проще добавить Уникальный идентификатор пользователя. Дополнительное поле в таблицу, функции для работы с этим значением. В таком случае этот ид можно использовать и в формировании номеров документов, и связать его с бух.программой и т.д. Мое мнение, такое решение более гибче и дает больше возможностей. Манипулировать с ИД пользователя можно и нужно, только не менять это значение.

В вашем случае, нужно разделить работу по приемке заказов (для Prestashop) и ведению бухгалтерского учета и бухгалтерской отчетности. Информацию о заказе передавать CRM программе и там производить обработку заказов согласно вашим стандартам. Наверное, вы не ограничитесь синхронизацией номеров заказов, но и нужно будет синхронизировать вашу внутреннею базу клиентов с клиентами интернет-магазина, складом и т.д.
Cоздание интернет сайтов Webstudio UwK
18 Январь 2013, 00:04:50
Ответ #6
  • Новичок
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Виталий, большое спасибо за ответ. Решение поставленной задачи я понял. После реализации, подготовлю детальный отчёт с описанием как технической (программистской) части, так и управленческой логики изменения системы.



 
06 Август 2013, 23:31:32
Ответ #7
  • Новичок
  • *
  • Сообщений: 1
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Виталий, большое спасибо за ответ. Решение поставленной задачи я понял. После реализации, подготовлю детальный отчёт с описанием как технической (программистской) части, так и управленческой логики изменения системы.
Уважаемый, как дела, получилось реализовать? Идея очень интересная и не понятно, почему в движках магазинов не используют такую нумерацию. Если вы решили этот вопрос, поделитесь пожалуйста инфой.
17 Август 2013, 10:29:38
Ответ #8
  • Новичок
  • *
  • Сообщений: 2
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
29 Сентябрь 2013, 05:41:47
Ответ #9
  • Новичок
  • *
  • Сообщений: 1
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вот для таких как я, кто пришел с поисковика, но не нашел ответа. Дрозд пропал. Решения нет.
Данное решение найдено на забугорных сайтах.
Это дает порядковый номер заказа. При желании можно доработать префиксом или чем угодно через запрос. Мне было не надо.
public static function generateReference()

{
/*return strtoupper(Tools::passwdGen(6, 'NUMERIC'));*/
{
        $query = new DbQuery();
        $query->select('MAX(id_order) as max');
        $query->from('orders');
        $query->where('id_cart' > 0);
        $order = Db::getInstance()->getRow($query);
        $reference = $order['max'] +1 ;
        return sprintf('%06d', $reference);
     
     
    }
Как бы там не было и рандомные номера придумывались для безопасности, но порядковые мне нужнее, ибо потом будут работать люди, ну как люди.... менеджеры, которых будет подвешивать хаотичное чередование цифр.