1.3.2.1. Конфигурация

Основной файл конфигурации представляет из себя XML-документ и находится в корневой директории проекта: ..bps/projects/<ИМЯ_ПРОЕКТА>/config.xml Приводим для примера сокращенный файл одного их проектов

<xml>
    <title>Заявка</title>  <!-- Название проекта -->
    <group_title>Страховые события</group_title>  <!-- В какую группу входит проект (Опционально) -->
    <rows_on_page>25</rows_on_page>  <!-- Сколько документов выводить на страницу журнала -->

    <!-- Роли пользователей, которые имеют доступ к проекту
    и кто может создавать карточки в этих проектах -->
    <roles>admin, clerk, auditor, expert, customer</roles>
    <roles_creator>admin, clerk</roles_creator>

    <!--
    Пути к отдельным шаблонам карточки и списка документов для кастомизации
    внешнего вида. <не обязателен>
    -->
    <templates>
        <document_list>request/document_list.html</document_list>
        <document_form>request/document_form.html</document_form>
        <gallery_page>sphere_conf/gallery.html</gallery_page>
    </templates>

    <!-- Список полей журнала -->
    <document_fields_table>
        d_get_request,
        d_create,
        status_display,
        status_services_display,
        customer,
        inscompany,
        responsible,
        n_loss,
        d_service_send,
        services_lnk
    </document_fields_table>

    <!--
    Структура файлового архива.
    Типы файлы находятся в группах.
    mixin_path: Класс примеси к модели файла, добавляющий объекту файла дополнительные параметры,
    или перекрывающий стандартные параметры
    -->
    <files mixin_path="sphere_conf.bps.projects.service.model_mixins.FileMixin">
        <main title="Документы">
            <full_set_docs title="Полный комплект документов"/>
            <state_mop title="Заявление о СС"/>
            <notice_accident title="Извещение о ДТП"/>
        </main>
        <project title="Проекты">
            <act_executed_works_project title="Акт выполненных работ (проект)"/>
            <register_services_draft title="Реестр оказанных услуг (проект)"/>
        </project>
        <harmonization title="Согласование">
            <harmonization_avr title="Согласование АВР"/>
            <disagreements_on_avr title="Разногласия по АВР"/>
        </harmonization>
        <avr title="АВР">
            <certificate_completion title="Акт выполненных работ"/>
            <register_services_provided title="Реестр оказанных услуг"/>
        </avr>
    </files>

    <!--
    Параметры документа (поля) в группах.
    Более подробное описание полей смотри чуть ниже.
    -->
    <document_fields>
        <request title="Заявка">
            <customer title="Заказчик" data_type="choices" source="Customer"/>
            <customer_request_email_sender title="Автор заявки у Заказчика" data_type="string"/>
            <customer_request_sender_email title="Email Автора заявки" data_type="string" tags="system"/>
            <customer_request_email title="Email заявки" data_type="string"/>  <!-- Откуда пришла в реале -->
            <ecuu title="Наименование ЕЦУУ" data_type="property"/>
            <contacts data_type="table" title="Контакты" model_name="ContractorContact" mixin_path="sphere_conf.bps.projects.contractor.subdocument_mixins.ContactMixin">
                <contact_type data_type="choices" source="ContractorContactType" title="Тип контакта"/>
                <phone data_type="string" title="Телефон" tags="index"/>
                <email data_type="email" title="Адрес e-mail" tags="index"/>
                <main data_type="bool" title="Осн."/>
            </contacts>
        </request>
        <auto title="Транспортное средство">
            <car_model data_type="choices" title="Марка/Модель" source="CarModelAutoComplete"/>
            <auto_type title="Тип ТС" data_type="choices" source="AutoType"/>
            <auto_create_year title="Год выпуска" data_type="choices" source="Dummy"/>
            <auto_vin title="VIN" data_type="string"/>
            <plate_number data_type="string" title="Гос. номер" />
            <auto_d_use title="Дата начала эксплуатации" data_type="date"/>
        </auto>
        <damagers title="Виновник">
            <damagers data_type="table" title="Виновник" model_name="RequestDamager">
                <n_police_osago title="Полис ОСАГО" data_type="string"/>
                <car_model data_type="choices" title="Марка / Модель" source="CarModelAutoComplete"/>
            </damagers>
        </damagers>
        <auto_owner title="Сведения о собственнике ТС">
            <auto_owner_type title="Тип контрагента" data_type="choices" source="ContractorType" />
            <auto_owner_inscompany title="Страховая компания" data_type="choices" source="Inscompany"/>
            <auto_owner_police_start title="Дата начала действия полиса" data_type="date"/>
            <auto_owner_contacts data_type="table" title="Контакты" model_name="RequestAutoOwnerContact">
                <contact_type data_type="choices" source="ContractorContactType" title="Тип контакта"/>
                <phone data_type="string" title="Телефон" tags="index"/>
                <email data_type="email" title="Адрес e-mail" tags="index"/>
                <main data_type="bool" title="Осн."/>
            </auto_owner_contacts>
            <passport_exists title="Паспорт предоставлен?" data_type="nullboolean"/>
        </auto_owner>
        <recension title="Рецензия">
            <s_all_whithout_wear title="Итого (без учета износа) исходные" data_type="property"/>
            <s_all_whith_wear title="Итого (с учетом износа) исходные" data_type="property"/>
            <s_spare_parts_whithout_wear title="Детали исх (без учета износа) исходные" data_type="decimal"/>
            <wear_ratio title="Износ %% исходный" data_type="float"/>
        </recension>
        <inspection_visit title="Осмотр / Прием документов">
            <income_channel title="Канал поступления" data_type="choices" source="IncomeChannel"/>
            <income_place_set title="Место визита определено СК?" data_type="nullboolean"/>
            <income_type title="Тип визита" data_type="choices" source="IncomeType"/>
            <income_place_not_kladr title="Адрес не найден в КЛАДР" data_type="bool"/>
            <income_place title="Адрес визита СК" data_type="textarea"/>
            <income_place_kladr title="Адрес визита СК" data_type="choices" source="Kladr" modal_widget="sphere_conf.kladr_modal_widget"/>
        </inspection_visit>
        <process title="Сдача результатов работ">
            <user_transfer_to_inscompany title="Передал результаты работ в СК" data_type="choices" source="User"/>
            <d_service_send title="Дата направления результатов Заказчику (факт)" data_type="date"/>
        </process>
        <it_service title="ИТ Услуги">
            <price_sphere title="Стоимость Сфера"  data_type="property"/>
            <d_accrua_sphere title="Дата начисления Сфера"  data_type="property"/>
            <n_avr_sphere title="Номер АВР (Сфера)"  data_type="property"/>
        </it_service>
        <system title="Системные">
            <d_create title="Дата создания заявки" data_type="property"/>
            <status_display title="Статус заявки" data_type="property" tags="system"/>
            <status_services_display title="Статус услуг" data_type="property" tags="system, content_popup"/>
            <responsible data_type="property" title="Ответственный"/>
            <avr_sphere title="АВР Cфера" data_type="choices" source="Avr" tags="system"/>
        </system>
    </document_fields>

    <!-- Описание формы поиска. Поля описываются таким же образом, что и поля системы -->
    <filter_fields>
        <request title="Основное">
            <status title="Статус" data_type="choices" source="Dummy"/>
            <id title="Код заявки" data_type="integer"/>
            <author title="Автор" data_type="choices" source="User"/>
            <executor title="Исполнитель" data_type="choices" source="User"/>
            <customer title="Заказчик" data_type="choices" source="Customer"/>
            <inscompany title="Страховая компания" data_type="choices" source="Inscompany"/>
            <n_loss title="Номер убытка" data_type="string"/>
            <service_type title="Услуга" data_type="choices" source="ServiceType"/>
            <auto_owner_osago title="Полис ОСАГО" data_type="string"/>
            <plate_number data_type="string" title="Гос. номер" />
            <customer_request_email_sender title="Автор заявки у Заказчика" data_type="string"/>
        </request>
        <dates title="Контрольные даты">
            <d_create title="Дата создания заявки" data_type="date_range"/>
            <d_service_plan title="Дата оказания услуги (план)" data_type="date_range"/>
            <d_pay_customer_fact title="Дата оплаты (факт)" data_type="date_range"/>
            <d_service_fact title="Дата оказания услуги (факт)" data_type="date_range"/>
            <d_service_send title="Дата направления результатов Заказчику (факт)" data_type="date_range"/>
            <d_pay_executor_fact title="Дата оплаты Исполнителю (факт)" data_type="date_range"/>
        </dates>
    </filter_fields>

    <!-- Преднастроенные условия отбора карточкек -->
    <fiter_presets>
        <draft>Регистрация</draft>
        <auto_owner_accept>Согласования заявки с владельцем ТС</auto_owner_accept>
        <process>Ожидает оказания услуг(и)</process>
        <wait_add_documents>Ожидание от Заказчика документов / реквизитов</wait_add_documents>
        <expired>Просрочена</expired>
        <transfer_to_inscompany>Передача результатов работ в СК</transfer_to_inscompany>
        <fix_warnings>Устранение замечаний от Заказчика</fix_warnings>
        <wait_pay_customer>Ожидает оплаты от Заказчика</wait_pay_customer>
        <wait_pay_executor>Ожидает оплаты Исполнителю</wait_pay_executor>
        <wait_pay_rpo>Ожидает оплаты РПО</wait_pay_rpo>
        <wait_pay_sfera>Ожидает оплаты Сфера</wait_pay_sfera>
        <archive_reject>Архив (отказ)</archive_reject>
        <archive_success>Архив (выполнена)</archive_success>
    </fiter_presets>

    <!-- Этапы процесса, на которых может находится карточка -->
    <states>
        <draft title="Регистрация заявки"/>
        <process title="Ожидание оказания услуг(и)"/>
        <auto_owner_accept title="Согласования заявки с владельцем ТС"/>
        <transfer_to_inscompany title="Передача результатов работ в СК"/>
        <request_documents title="Ожидание документов / реквизитов"/>
        <settlements title="Взаиморасчеты по заявке"/>
        <fix_warnings title="Устранение замечаний по Услугам"/>
        <archive title="Архив"/>
    </states>
</xml>

1.3.2.1.1. Поле документа

Описывает аттрибуты карточки документа и аттрибуты фильтра поиска

  • Название XML-тэга

    Является системным значением параметра. Значение в таблице базы данных хранится в одноименной колонке

  • data_type: Тип данных
    • string: Строка текста

    • textarea: Несколько строк текста

    • email: Email-Адрес

    • integer: Целое число

    • float: Дробное число

    • decimal: Дробное число повышенной точности

    • date: Дата без времени

    • datetime: Дата с временем и учетом часового пояса

    • bool: Логический тип да/нет

    • nullboolean: Логический тип тернарной логики да/нет/не_известно

    • choices: Выбор из фиксированного списка одного значения

    • multi_choices: Выбор из фиксированного списка нескольких значений

    • integer_range: Диапазон чисел «от и до» для поиска

    • float_range: Диапазон дробных чисел «от и до» для поиска

    • date_range: Диапазон дат «от и до» для поиска

  • title

    Название поля

  • tags: Различные признаки
    • content_popup: В таблице длинный текст выводить в виде всплывающего окна

    • system: Системное поле. В форму не выводится

    • unique: В БД на колонку добавляет уникальный индекс

    • hidden: В форму выводится в скрытом виде и заполняется только через js

    • index: К полю создается индекс базы данных. Используется для поиска

    • custom_choices: Используются кастомные опции, запрос на получение опций по умолчанию не делается. Опции получаются через метод «filter_choices_НАЗВАНИЕ_ПОЛЯ»

  • source

    Название источника данных для полей choices, multi_choices

  • modal_widget

    Специфичный виджет для выбора значения в отдельном окне, если происходит выбор из большого кол-ва значений с встроенным поиском, возможно создание значений перед выбором «на лету», использование КЛАДР и системы поиска по нему и так далее

  • layout

    Тип отображения поля. formset для табличного поля, column_wide для других полей

1.3.2.1.1.1. Поле документа с выбором из списка

Для полей с типами «choices», «multi_choices» возможные значения получаются из источников данных, информация о которых размещена в файле sphere_conf/bps/data_sources.xml.

<xml>
    <!--
        data_type = "reference"
        Значения берутся из модели данных (в данном случае, "User"),
        которые хранятся в таблице (в данном случае "auth_user").
        Источники типа reference кэшируются на 5 минут с размыванием на +- 20 секунд
        для сглаживания пика инвалидации и обновления, но это время можно задать через параметр cache_time
    -->
    <User data_type="reference" table_name='auth_user' cache_time="100"/>

    <!--
        data_type = "autocomplete"
        Похожий на reference, но опции из такого источника в формах
        выбираются по мере набора текста с поиском подходящих вариантов.
        Используется, если данных в таблице много и форма, сформированная
        со всеми опциями занимает много ресурсов (10 млн опций
        для выбора клиента, например)
    -->
    <Bank data_type="autocomplete" table_name="base_bank" model_name="Bank" function_path="sphere_conf.bps.autocomplete.auto_bank_ds"/>

    <!--
        data_type = "xml"
        Значения берутся из файлов XML, размещенных в директории sphere_conf/bps/choices
        Их название соответствует xml-тэгу с расширением "xml", то есть
        в данном случае, sphere_conf/bps/choices/AutoType.xml
    -->
    <AutoType data_type="xml"/>
</xml>

Пример источника данных XML

<xml>
    <residential_adr>Адрес проживания</residential_adr>
    <registration_adr>Адрес регистрации</registration_adr>
    <post_adr>Почтовый адрес</post_adr>
    <actual_adr>Фактический адрес</actual_adr>
    <legal_adr>Юридический адрес</legal_adr>
</xml>

1.3.2.1.1.2. Вычисляемый параметр

Этот тип полей не вводится пользователями вручную и в форме всегда выводится в режиме «просмотр». Логика расчета параметров задается в коде, в свойствах примеси к модели документа. В ядре описаны в виде свойств параметры:

  • d_create: Дата создания документа

  • active: Статус активности документа (Удален или Активный). True/False

  • state: Этап, на котором находится документ

  • state_display: Человеко-читаемое название текущего этапа

  • d_change: Дата последнего изменения документа

  • author_id: Id автора документа

  • author: Автор документ

  • responsible_id: ID Ответственного за документ в данный момент

  • responsible: Ответственный за документ в данный момент

  • events: Список этапов, на которых может находиться докумен

  • last_event: Последнее событие по документу (определяет текущее состояние)

  • get_last_event: Последнее событие по переходу с этапа / на этап

  • get_first_event: Первое событие по переходу с этапа / на этап

  • user: Текущий оператор

  • roles: Список ролей у текущего оператора

  • url: Ссылка на карточку этого документа

  • is_draft: Документ пока еще не сохранен в БД и является черновиком

  • is_responsible: Проверяет, что текущий оператор отвечает за текущий документ

1.3.2.1.1.3. Табличное поле

Поля с типами данных «table» представляют собой строки из полей стандартного типа. В табличном поле допускается использование табличных полей и так далее на любую глубину вложенности, но в этом случае требуется задать способ отрисовки таких форм вручную. Стандартными средствами (layout=formset) поддерживается 2 уровня вложенности таблицы. Смотрите пример поля «contacts» выше. Можно указать примесь к модели такой таблицы, описывающую дополнительные параметры и строк такой таблицы и вычисляемые параметры

<contacts data_type="table" title="Контакты" model_name="ContractorContact" mixin_path="sphere_conf.bps.projects.contractor.subdocument_mixins.ContactMixin">
    <contact_type data_type="choices" source="ContractorContactType" title="Тип контакта"/>
    <phone data_type="string" title="Телефон" tags="index"/>
    <email data_type="email" title="Адрес e-mail" tags="index"/>
    <main data_type="bool" title="Осн."/>
</contacts>