SuiteCRM


Нумерация документов в SuiteCRM

В данной статье мы рассмотрим внедрение автоматической нумерации в модуле Счета (Invoices), используя систему хуков и не внося изменения в основной код системы, что позволяет обновляться без особых проблем.

В SuiteCrm используется сквозная нумерация документов. В модуле Счета берется самый большой номер и присваеватся на единицу больше. И все, больше никаких условий. Более того, номер документа совершенно не привязан к другим объектам и может изменяться как угодно, поскольку в связях используетс так называемый ID номер, который генерируется на лету. Вот его я менять и трогать не рекомендую категорически.

Как мы изменим логику формирования номеров счетов. Первое что мне пришло на ум:

1. Заводим счет в новом периоде, заходим в phpmyadmin - ищем таблицу AOS_Invoices, ищем поле number - вносим туда 1.

2. Используя систему хуков - выбираем по следующему условии номер счета: берем самую последнюю созданную запись, проверяем что она не удалена. Извлекам номер, прибавляем 1, вставляем ее в новый счет. Сохраняем.

Итак, вводная информация:

1. Нам понадобиться phpMyAdmin - внести первоначальную правку в таблицу AOS_Invoices

2. Нужен доступ к файлам и каталогам. Там нам нужно будет разместить два файла, для обработки автоматических действий.

Поехали.

Как я уже писал, после наступления нового периода - вносим изменения в таблицу AOS_Invoices, поле number - вносим туда 1.

Далее. Заходим в калог где лежит SuiteCRM. Идем по пути:

custom/modules/AOS_Invoices

В каталоге создаем два файла:

logic_hooks.php

insert_number.php

Сначала разберемся с logic_hooks.php. Очень полезный файл - позволяет расширять логику модулей, не затрагивая исходный код системы.

В нем сейчас нужно написать (если у вас его не было):

<?php
$hook_version = 1;
$hook_array = Array();
$hook_array['before_save'] = Array();
$hook_array['before_save'][] = Array(1, 'updatenumber', 'custom/modules/AOS_Invoices/insert_number.php', 'invoice_number', 'new_numberrus');
?>
Поясню.

Вы создаете некий массив действий, в котором прописаны действия при возникновении событий. События для модулей бывают:

  • before_delete - Вызывается перед удалением записи
  • after_delete - Вызывается после удаления записи
  • before_restore - Вызывается перед восстановлением ранее удаленной записи
  • after_restore -Вызывается после восстановления удаленной записи
  • after_retrieve -Вызывается после извлечения записи из БД. Не вызывается при создании новой записи
  • before_save -Вызывается перед сохранением записи
  • after_save- После сохранения записи в БД
  • process_record - Вызывается после составления запроса к БД на извлечение записи. Это дает возможность разработчику посмотреть и протестировать автоматически составленный запрос. Это также хороший хук для установки значений полей в форме списка и просмотра, он не вызывается при формировании формы редактирования.

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

Далее, в скобках имеем следующие параметры:

1 - это приоритет хука,

2 - Имя / Описание хука. Нигде не используется, так что называйте как вам угодно, лишь бы вы потом позже могли вспомнить, что делает этот хук.

3 - Путь к файлу с вашим хуком. Желательно располагать данный файл тоже в папке custom того же модуля, чтобы вам было ясно, к какому модулю этот хук относится. Мне удобнее располагать данные файлы в папке custom/Extension/modules/<Название_модуля>.

4. Имя класса вашего logic hook.

5. Имя функции в классе logic hook.

Вот теперь про хуки все (если кратко).

Далее вставляем в файл insert_number.php следующий код:

<?php
class invoice_number {
       function new_numberrus(&$bean, $event, $argument ) {
      $number_real=$bean->number;
      $number_last=$bean->db->getOne("SELECT CAST(number AS UNSIGNED) FROM aos_invoices where deleted = 0 ORDER BY date_entered DESC LIMIT 1");
       if ($number_real > $number_last) {
         $bean->number=$number_last+1;
         }
     }
}
?>


Сохраняем.

Поясняю. Мы проверяем последовательности номеров. Если самый крутой номер больше - чем нужный текущий - то меняем его на наш нужный.

Предупреждаю - это возможно не идеальный метод. Буду рад чего-то другому.

Вот собственно и все. Теперь при сохранении будет вставляться наш номер с нашей последовательностью.

Таким образом возможно изменять логику нумерации очень легко. Только прошу учесть, что в базе номер храниться в формате integer, так что только числа. Для измения по типу - Исх-0116 - вам придеться либо изменить тип поля, либо добавить новое, где вы будете писать тескт (что по мне правильнее - при обновлении не заденет)

Спасибо.

Пишите, готов отвечать на вопросы.