Архитектура

С точки зрения веб-приложения, учетная система базируется на архитектуре, определяемой фреймворком 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;

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