Документация разработчика

Архитектура

С точки зрения веб-приложения, учетная система базируется на архитектуре, определяемой фреймворком Zippy. Она состоит из двух базовых частей - ядра, с общими страницами и функционалом (пользователи, управление системой и т.д.), и собственно ERP части куда входят объекты метаданных (документы, справочники, отчеты) реализующие основную бизнес логику. Также предусмотренно подключение любых дополнительных модулей по аналогии с ZippyCMS.

Основа учетной системы - объекты метаданных - справочники, документы. отчеты, журналы. Объекты спроектированы с минимальной зависимостью друг от друга и доступны через общее меню, которое строится динамически, согласно списку объектов, задаваемому администатором. Это позволяет независимо модифицировать их без изменения остальных объектов и модулей системы. Алгоритмы бизнес-логики реализуются непосредственно на языке PHP.
Шаблоны (бланки) печатных форм документов и отчетов выполнены в чистом HTML, что позволяет как печатать их непосредственно так и экспортировать в Word, Excel или PDF, а также корректировать их с помощью обычного текстового редактора.
Еще одним объектом метаданных является пользовательская страница. Разработчик может создать собственную страницу (класс страницы и ее шаблон) которая появится в меню наряду с остальными метаобъектами.

Таким образом, разработка настройка и сопровождение решений на основе Zippy ERP не требует знаний специальных технологий и не зависит от какого либо производителя. Разработчики по аналогии с конструктором Lego могут легко создавать различные конфигурации (в терминологии 1С) под различные типы бизнеса, обмениваться реализацией отдельных объектов системы и печатными формами простым копированием файлов.

Организация данных

Основные бизнес-сущности

ТМЦ товары, материалы, продукция
Места хранения склады, магазины, МОЛ
Контрагенты поставщики, покупатели
Документы первичные документы фиксирующие хозяйственные операции
План счетов бухгалтерские счета для синтетического учета
Денежные счета касса, банковские счета

В соответствии с архитектурой фреймворка, все бизнес сущности реализованы классами, наследованными от Entity.

Структура данных информационной системы

Бухгалтерские проводки (таблица erp_account_entry) содержат счета дебета и кредита а также сумму. Положительное значение означает оборот по дебету отрицательное - по кредиту. Такая структура позволяет легко получать остатки и обороты простым суммированием на любой период.

Аналитический учет ведется на основании движения материальных и денежных средств, в соответствии с хозяйственными операциями. Система не хранит начальные и текущие остатки за период (используется полный пересчет движений). Это упрощает огранизацию данных и позволяет вводить и изменять информацию задним числом а также передним, что позволяет выполнять резервирование товара и планирование операций.
Аналитические данные хранятся в одной таблице erp_account_subconto, по сути таблице фактов в ROLAP где измерения - бизнес сущности.
С каждой аналитической записью (субконто в терминах 1С) связан синтетический счет, но документы построены так что ,к примеру, складской учет можно вести без знания и использования бухгалтерии. либо использовать синтетические счета для управленческого учета. Также аналитические данные, как и данные, ссылающиеся на другие бизнес-сущности, хранятся в самом документе в упакованом виде. Подобная денормализация позволяет избежать перекрестных ссылок и "исторических" атрибутов - документ хранит все оперативные данные.

Складской учет ведется по партиям. Партия - тот же товар по той же учетной цене (цена поступления) независимо от поставщика. Записси о движениях на складе хранятся в таблице erp_store_stock где кроме ссылки на склад и а ТМЦ указана учетная цена (партия) и отпускная цена (для розницы).

Структура основных объектов

Справочники

Элементы справочников - объекты, находящиеся в пространстве имен ZippyERP\ERP\Entity. Объекты предназначены дл хранения справоных бизнес-сущностей.
Для редактирования списков объектов предназначены соответствующие страницы в пространстве имен ZippyERP\ERP\Pages\Reference.

Отчеты

Страницы отчетов находятся в пространстве имен ZippyERP\ERP\Pages\Report. С каждым отчетом связана печатная форма которая находится в папке /templates/erp/printforms

Журналы

Журналы обьединяют объекты и бизнес-сущности по типу использования. Например - журнал документов, журнал проводок, журнал заказов.
Страницы журналов находятся в пространстве имен ZippyERP\ERP\Pages\Register.

Кастомные страницы

Страницы, создающиеся разработчиками и предназначенные для расширения стандартной функциональности системы. Например, разного рода нестандартные отчеты..
Страницы находятся в пространстве имен ZippyERP\ERP\Pages\CustomPage.

Документы

Для каждого типа документа реализован класс в пространстве имен ZippyERP\ERP\Entity\Doc, унаследованный от базового класса Document. Класс документа реализует бизнес логику в соответствии с типом хоз. операции и обеспечивает хранение документа в БД. С каждым типом документа связаны страница редактирования документа в пространстве имен ZippyERP\ERP\Pages\Doc и шаблон печатной формы в папке /templates/erp/printforms.

Каждый класс документа переопределяет два метода: generateReport и ExecuteImpl. Метод generateReport предназначен для заполнения печатной формы данными документа. Метод Execute выполняет изменение данных аналитического учета - фиксирует движение материальных и денежных средств а также, при необходимости может выполнять бухгалтерские проводки. За сохранение документа в БД и прочие общие операции над всеми типами документов отвечает базовый класс Document.
Все документы хранятся в одной таблице. Таблица содержит несколько общих полей (таких как дата, номер документа) и текстовое поле где хранится детализация документа в виде XML. Использование XML позволяет, при необходимости, выполнять поиск по документам, ориентируясь на XML теги а также использовать XPath.. Упаковку и распаковку детальных данных документа выполняет базовый класс. Для этого класс содержит массивы $headerdata и $detaildata для шапки и табличной части документа. Страница редактирования документа должна записывать атрибуты в эти массивы.

Пример операции - оплата поставщику. Выполняется в методе Execute() при проведении документа (в данном случае банковская выписка).

            
 

        $acc = 63;
        if ($prepayment == 'true') {  //предоплата
            $acc = 371;
        }

        //проводка
        Entry::AddEntry($acc, 31, $amount, $this->document_id, $this->document_date);
        //аналитика
        $sc = new SubConto($this, $acc, $amount);
        $sc->setCustomer($customer_id);
        $sc->save();
        $sc = new SubConto($this, 31, 0 - $amount);
        $sc->setMoneyfund($bankaccount_id);
        $sc->save();

        if ($nds > 0) {   //НДС
            //проводка
            Entry::AddEntry(644, $acc, $nds, $this->document_id, $this->document_date);
            //аналитика
            $sc = new SubConto($this, $acc, 0 - $nds);
            $sc->setCustomer($customer_id);
            $sc->save();
        }

  
            
                    

Все объекты зарегистрированы в таблице метаданных на соответствующей странице настроек. По таблице метаданных автоматически формируется меню.
В таблице указывается тип, название обьекта, имя класса (пространство имен вычисляется по типу), группа (для второго уровня меню).

Пример создания документа

Допустим нужно добавить в систему документ Банковская выписка. Необходимо внести запись в метаданные, создать страницу редактирования документа, класс-сущность для хранения документа в БД и HTML шаблон печатной формы.

Необходимая последовательность:
  1. Добавляем запись на странице метаданных с именем класса BankStatemet.
  2. Создаем в пространстве имен ZippyERP\ERP\Entity\Doc класс сущности BankStatemet отнаследованный от класса Document.
  3. Переопределим методы generateReport и ExecuteImpl. Метод ExecuteImpl выполняет соответствующие проводки на бухгалтерских счетах и делает записи в таблице аналитического учета . Метод generateReport обращается к генератору отчетов, передавая ему шаблон печатной формы и данные из детализации документа, создавая на выходе HTML файл с заполненным бланком для печати или експорта.
  4. Файл с классом сущности копируем в каталог /erp/entity/doc/
  5. Создаем страницу редактирования документа. Страница создается с именем класса BankStatement в пространстве имен ZippyERP\ERP\Pages\Doc как обычная страница в соответствии с архитектурой фреймворка Zippy. Файл с классом страницы создаем в каталоге /erp/pages/doc шаблон страницы в каталоге /templates/erp/pages/doc
  6. Создаем файл bankstatement.tml с печатной формой в каталоге /templates/erp/printforms;

Документ банковская выписка появится в главном меню и будет готов к использованию.