Top.Mail.Ru

Бюджетирование в AX 2012 (AXAPTA)(Часть 2)


Реализация системы бюджетного контроля

Часть 1

В AX 2012 бюджетный контроль базируется на главной книге юридического лица. Контроль может быть использован для мониторинга бюджетов и предоставления обратной связи о наличии средств во время формирования бюджетных операций, журналов платежей или других документов, например, заказов на покупку или накладных.

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

Пользователи могут установить расчет, чтобы определить фонды бюджета, которые доступны и указать операции, которые являются предметом бюджетного контроля. Дополнительно, можно указать аналитики и значения аналитик отдельно от основного счета бюджетного контроля.

Конфигурирование бюджетного контроля

Настройка имеет ключевое значение в системе бюджетного контроля. Конфигурация определяет все параметры и настройки, которые управляют поведением API бюджетного контроля. Пользователь вводить параметры и значения настроек в форме BudgetControlConfiguration, чтобы установить бюджетный контроль главной книги.

Все таблицы бюджетного контроля имеют значение No свойства SaveDataPerCompany. Таблица BudgetControlConfiguration является головной таблицей для конфигурации бюджетного контроля. Эта таблица содержит ссылку на таблицу Ledger (поле PrimaryLedger). Ссылка идентифицирует юридическое лицо, связанное с данными конфигурирования бюджетного контроля. Данная таблица также имеет поле статуса (IsActive), которое определяет активную версию конфигурации. Эту версию система бюджетного контроля будет использоват+ь в течение обработки документа. Только одна конфигурация бюджетного контроля может быть активна для главной книги. Пока конфигурация изменяется, отслеживается ее черновая версия. После завершения редактирования, пользователь запускает процесс активации из формы. Этот процесс выполняет требуемые проверки, чтобы перевести черновую версию в активную.

Пример настроек конфигурации бюджетного контроля, которые вводятся на форме BudgetControlConfiguration:

  • Конфигурация создается для одной структуры счетов. Основывается на аналитиках, которые включены для бюджетирования главной книги и на структуре счетов указанной для бюджетного контроля. На форме можно выбрать набор атрибутов аналитик бюджетного контроля.
  • Используя выбранные атрибуты аналитик, можно установить критерии для значений аналитики, которые бюджетный контроль мог бы применять. Эти значения указываются с помощью правил бюджетного контроля и бюджетных групп, которые являются общими средствами бюджетных фондов.
  • Конфигурация бюджетного контроля предоставляет настройку, при помощи которой указывается возможность пользователя продолжать обработку в случае срабатывания условия «сверх бюджета» или «сверх порога бюджета». Настройка может быть применена на уровне пользовательских групп для пользователей принадлежащих конкретной группе.

API бюджетного контроля

Ядром API для системы бюджетного контроля главной книги является класс BudgetControlProcessor. Класс выполняет бюджетные проверки в соответствии с конфигурацией бюджетного контроля. Бюджетные проверки включают проверку, расчет доступных средств бюджетных фондов и предупреждает в случае перерасхода бюджета.

Класс BudgetControlProcessor реализован по шаблону «singleton» и находится под управлением экземпляра класса Application, находящегося на стороне сервера и связанного с каждой клиентской сессией. Класс BudgetControlProcessor вызывается в методах ttsNotifyPostBegin, ttsNotifyPreCommit, ttsNotifyCommit, ttsNotifyAbort класса Application, чтобы логика выполнялась с операторами ttsBegin, ttsCommit и ttsAbort.

Ядро бюджетных проверок реализовано на языке Х++ в классе BudgetControlProcessor и также на Transact-SQL в виде хранимых процедур. Хранимые процедуры устанавливаются, когда активируется конфигурация резервного контроля (на форме BudgetControlConfiguration) или при первом вызове логики бюджетного контроля. Код в Transact-SQL реализован в классе BudgetControlSQLObjects.

Последовательность логики бюджетных проверок начинается с кода Х++, где данные записываются в отслеживаемые, бюджетным контролем, системные таблицы. Это подготовленные данные для методов класса BudgetControlProcessor, который вызывает хранимые процедуры для выполнения бюджетных проверок и для ведения отслеживаемых сводных данных бюджетного контроля. Таблицы BudgetSource, BudgetSourceTracking, BudgetSourceTrackingDetail, BudgetSourceTrackingRelievingDetail и BudgetCheckResultErrorWarningDetail входят в состав системы отслеживания бюджетного контроля, поддерживаемой классом BudgetControlProcessor и его вспомогательными классами. Таблица BudgetSourceTrackingSummary используется для расчета доступных фондов бюджетными проверками. Эта таблица содержит сводные данные системы отслеживания бюджетного контроля. Данными в таблице и выполненными расчетами управляет хранимая процедура.

Чтобы сформировать запрос на обработку в систему бюджетного контроля, необходимо находиться в открытой транзакции. Бюджетный контроль передает запрос для обработки в класс BudgetControlProcessor пока открыта транзакция. Запросы собираются и выполняются во внешнем операторе ttsCommit.

Запросы для бюджета

Существует 3 типа запросов:

  1. Запрос на проверку
  • запрашивает информацию о суммах сделок бюджета.
  • в запросах на проверку существует три вида информации, которая может быть получена:

    — информация о суммах.

    — суммы, которые должны быть возвращены.

    — сумму, которые должны быть освобождены.

  1. Запрос на удаление
  • удаляет запись BudgetSource.
  1. Запрос на возврат
  • возвращает для записи неосвобожденные фонды.

Запросы на проверку

Класс BudgetControlCheckRequest поддерживает запросы для проверки бюджета.

Сумма, которая устанавливаются в запрос на проверку, указывается в валюте операции.

Суммы конвертируются в валюту счета главной книги системной бюджетного контроля. Для этого используется тип курса обмена, указанный для бюджета.

Следующая таблица представляет информацию о данных, которые передаются в экземпляр класса BudgerControlCheckRequest. Эти данные применимы для любого типа запроса на проверку.

BudgerControlCheckRequest

Данные

Описание

Обязательные
parmBudgetControlCategory

Категория бюджетного контроля

Да

parmBudgetDate

Дата проверки

Да

parmBudgetSourceId

RecId записи таблицы BudgetSource

Да

parmTransactionNumber

Номер операции (EDT: Num)

Нет

parmUser

Пользователь сформировавший запрос

Да

setBudgetModel

Метод устанавливающий BudgetModelId и BudgetModel.DataAreaId

Нет

parmSimulatedBudgetSourceId

RecId записи таблицы BudgetSource, для которой будет моделироваться проверка

Нет

parmIsCarryforward

Невозможно одновременно освободить бюджетные средства и выполнить перенос бюджетных средств на источник бюджета.

Нет

Класс BudgetCheckDetail поддерживает запросы, для получения деталей о суммах. Данные ниже определяются для каждой суммы.

BudgetCheckDetail

Данные

Описание

Обязательные

LegalEntity.RecId

Код записи юридического лица для проверки

Да

LedgerDimensionBase

Аналитика главной книги

Нет

Amount

Сумма в валюте

Нет

CurrencyCode

Валюта

Нет

Класс BudgetReturnDetail поддерживает запросы, для проверки сумм, подлежащих возврату. Данные ниже определяются для каждой суммы.

BudgetReturnDetail

Данные

Описание

Обязательные

LegalEntity.RecId

Код записи юридического лица для проверки

Да

LedgerDimensionBase

Аналитика главной книги

Нет

Amount

Сумма в валюте

Нет

CurrencyCode

Валюта

Нет

Класс BudgetRelievingDetail поддерживает запросы, для проверки сумм, подлежащих освобождению. Данные ниже определяются для каждой суммы.

BudgetRelievingDetail

Данные

Описание

Обязательные
LegalEntity.RecId

Код записи юридического лица для проверки

Да

LedgerDimensionBase

Аналитика главной книги

Нет

Amount

Сумма в валюте

Нет

CurrencyCode

Валюта

Нет

parmLegalEntityIdToRelieve

Код записи юридического лица, из бюджета которого освобождаются суммы

Да

parmLedgerDimensionToRelieve

Аналитика главной книги, по которой выполняется освобождение сумм.

Нет

parmCurrencyAmountToRelieve

Сумма в валюте, которая освобождается

Нет

parmCurrencyToRelieve

Валюта, в которой освобождаются суммы

Нет

Запросы на удаление

Запросы на удаление записи таблицы BudgetSource и ее деталей из контроля бюджета требуют ссылку на BudgetSource.

Запросы на возврат

Запросы на возврат оставшихся неосвобожденных фондов для записи BudgetSource требуют следующие данные.

Данные

Описание

Обязательные

BudgetSource.RecId

Код записи таблицы BudgetSource

Да

TransDate

Дата запроса на возврат

Да

userId

Пользователь сформировавший запрос

Да

Шаблоны кода бюджетных запросов

Следующий код демонстрирует шаблоны как запросы на проверку, запросы на удаления, запросы на возврат могут быть настроены и как доступен и используется класс BudgetControlProcessor.

Запрос на проверку

В коде ниже показан пример формирования запроса на проверку.

Пример:

static void Job1(Args _args)
{
    BudgetControlCheckRequest budgetControlCheckRequest;
    BudgetControlProcessor budgetControlProcessor;
    BudgetSource savedBudgetSource;
    BudgetSource savedBudgetSourceToRelieveBudget;
    LegalEntityRecId primaryLedgerLegalEntityId;
    BudgetModel budgetModel;
    LedgerDimensionAccount ledgerAccount;
    AmountCur amount;
    CurrencyCode currency;

    ttsBegin;

    // Setup necessary variables
    primaryLedgerLegalEntityId = Ledger::find(Ledger::current()).PrimaryForLegalEntity;
    budgetControlCheckRequest = BudgetControlCheckRequest::construct();
    budgetControlCheckRequest.parmTransactionNumber('000001');
    budgetControlCheckRequest.parmBudgetControlCategory(BudgetControlCategory::Original);
    budgetControlCheckRequest.parmBudgetDate(today());
    budgetControlCheckRequest.parmBudgetSourceId(savedBudgetSource.RecId);
    budgetControlCheckRequest.parmUser(curUserId());
    budgetControlCheckRequest.setBudgetModel(budgetModel.ModelId, budgetModel.dataAreaId);
    budgetControlCheckRequest.parmIsCarryforward(false);
    budgetControlCheckRequest.addLedgerDimensionDetail(
    
    BudgetCheckDetail::newBudgetCheckDetail(
                primaryLedgerLegalEntityId,
                ledgerAccount,
                amount,
                currency));

    budgetControlCheckRequest.addRelievingLedgerDimensionDetail(
                BudgetRelievingDetail::newBudgetRelievingDetail(
                primaryLedgerLegalEntityId,
                ledgerAccount,
                amount,
                currency,
                savedBudgetSourceToRelieveBudget.RecId,
                primaryLedgerLegalEntityId,
                ledgerAccount,
                amount,
                currency));

    budgetControlProcessor = appl.budgetControlProcessor();
    budgetControlProcessor.addBudgetCheckRequestToProcessAtCommit(budgetControlCheckRequest);

    ttsCommit;
}

Запрос на удаление

В коде ниже показан пример формирования запроса на удаление.

Пример:

static void Job2(Args _args)
{
    BudgetSourceRecId savedBudgetSourceId;
    BudgetControlProcessor budgetControlProcessor;
    
    ttsBegin;

    budgetControlProcessor = appl.budgetControlProcessor();
    budgetControlProcessor.addBudgetSourceToRemoveAtCommit(savedBudgetSourceId);

    ttsCommit;
}

Запрос на возврат

В коде ниже показан пример формирования запроса на возврат.

Пример:

static void Job3(Args _args)
{
    BudgetSourceRecId savedBudgetSourceId;
    BudgetControlProcessor budgetControlProcessor;

    ttsBegin;

    budgetControlProcessor = appl.budgetControlProcessor();
    budgetControlProcessor.addBudgetSourceToReturnRemainingAtCommit(
                savedBudgetSourceId,
                today(),
                curUserId());

    ttsCommit;
}

Основные шаблоны интеграции

В системе бюджетного контроля главной книги представлены основные интеграции для бюджетных операций, журналов главной книги и исходных документов.

Физическая модель данных бюджетного контроля представлена на рисунке ниже.

Budget control data model

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

Шаблон интеграции бюджетных операций

Интеграция бюджетных операций с системой бюджетного контроля главной книги обеспечивается классом BudgetControlBudgetTransactionProcessor и связанными классами, таким как:

  • класс BudgetSourceBudgetTransactionLine предоставляет методы для сохранения и поиска записей таблицы BudgetSource, которые содержат ссылки на BudgetTransactionLine.
  • класс BudgetControlBudgetTransactionProcessor использует класс BudgetSourceBudgetTransactionLine для создания и поиска записей таблицы BudgetSource, которые имеют ссылки на записи BudgetTransactionLine. Он управляет созданием бюджетных запросов на проверку и запросов на удаление бюджетных операций и вызывает класс BudgetControlProcessor.

Шаблон интеграции журналов главной книги

Интеграция журнала главной книги с системой бюджетного контроля главной книги обеспечивается классом BudgetControlAccountingJournalProcessor, BudgetControlGeneralJournalEntry и связанными классами, таким как:

  • класс BudgetSourceLedgerJournalTrans предоставляет методы записи для сохранения и поиска записей таблицы BudgetSource, которые содержат ссылки на не разнесённый ваучер журнала, который хранится в таблице LedgerJournalTrans.
  • класс BudgetSourceGeneralJournalEntry используется для взаимодействия с записями таблицы BudgetSource, которые содержат ссылки на разнесённый ваучер журнала, который хранится в таблице GeneralJournalEntry.
  • класс BudgetControlAccountingJournalProcessor используется в случае работы с неразнесенными ваучерами журнала главной книги. Этот класс использует класс BudgetSourceLedgerJournalTrans, чтобы создать или найти записи BudgetSource для ваучеров, которые хранятся в таблице LedgerJournalTrans. Он управляет созданием бюджетных запросов на проверку и запросов на удаление для ваучеров и взаимодействует с классом BudgetControlProcessor.
  • класс BudgetControlGeneralJournalEntry используется для операций отмены журнала главной книги и работы бюджетного контроля в процессе разноски журнала главной книги. Этот класс использует класс BudgetSourceGeneralJournalEntry для создания и поиска записей таблицы BudgetSource для ваучеров, которые были разнесены или отменены. Класс BudgetControlGeneralJournalEntry собирает проводки и данные о суммах, и формирует запрос на проверку, который будет передан в класс BudgetControlAccountingJournalProcessor, который будет взаимодействовать с классом BudgetControlProcessor.

Шаблон интеграции для документов-источников

Интеграция документа-источника с системой бюджетного контроля главной книги обеспечивается классом BudgetControlSourceDocumentProcessor и связанными классами, таким как:

  • класс BudgetSourceSourceDocumentLine предоставляет методы для сохранения и поиска записей BudgetSource, которые содержат ссылка на записи в таблице SourceDocumentLine.
  • класс BudgetControlSourceDocumentProcessor использует класс BudgetSourceSourceDocumentLine для управления созданием запросов на проверку (включая проверку, возвраты и данные об освобождении), запросов на возврат и запросов на удаление. Этот класс взаимодействует с классом BudgetControlProcessor.

Добавление шаблонов интеграции

В данном разделе рассмотрим, как можно добавить новую интеграцию в систему бюджетного контроля.

Изменение данных

Чтобы добавить новую интеграцию, требуется сделать изменения в объектах AOT:

  • перечисление BudgetControlSourceIntegrator

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

    Пример:

    BudgetTransaction — интеграция типов бюджетных операций;

    PurchaseOrder и VendorInvoice — интеграция типов исходных документов;

    DailyJournal и FixedAssetJournal — интеграция типов журналов главной книги.

  • перечисление BudgetSourceType

    Необходимо добавить новое значение. Перечисление служит для различения типов ссылок в таблице BudgetSource. На данный момент перечисление содержит следующие типы источников бюджета: BudgetTransactionLine, SourceDocumentLine, LedgerEntry, LedgerJournalEntry.

    Значение перечисления определяет какое поле или поля внешнего ключа будут заполнены для определенной записи BudgetSource. Когда поле внешнего ключа добавляется в новый интегратор, связанное значение должно быть добавлено в перечисление.

  • BudgetSourceTable

    Добавить новое отношение внешнего ключа к таблице, на которую ссылается таблица BudgetSource. Отношение внешнего ключа может быть из одного или нескольких полей, в зависимости от состава уникального ключа ссылочной таблицы.

    Добавить новый метод в таблицу BudgetSource, который проверяет существование записи, для созданного нового отношения внешнего ключа. Имя метода соответствует названию отношения внешнего ключа. Например, для внешнего ключа BudgetTransactionLine, метод будет называться existBudgetTransactionLine.

    Изменить метод existSourceIntegratorReference в таблице BudgetSource, добавить правило для нового значения перечисления BudgetSourceType. Новое правило вызывает новый метод, который был добавлен ранее и служит для проверки существования записи в связанной таблицы.

Изменения кода

Рекомендуется произвести следующие доработки:

  1. Создать класс-обработчик

    Класс-обработчик создается для поддержки новой интеграции. Класс должен соответствовать шаблону, когда существует статический метода, в котором документ интеграции используется в качестве параметра или в качестве параметров принимаются значения, которые позволяют идентифицировать документ интеграции.

    Использовать отдельные методы для каждого типа запроса, поддерживаемого интеграцией: проверка бюджета, удаление из бюджета и возвращение из бюджета.

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

    Когда вызывающий объект отправляет новый интеграционный документ обработчику, то обработчик должен выполнить следующие шаги:

  • Подготовить соответствующие запросы бюджетного контроля.
  • Начать операцию.
  • Вызвать методы BudgetControlProcessor, чтобы добавить запрос.
  • Завершить операцию.
  1. Расширение класса BudgetSourceIntegrator

    Для поддержки новой интеграции требуется расширение класса BudgetSourceIntegrator. Расширение должно использоваться для сохранения и поиска записей BudgetSource основанных на связи с интеграционным документом.

    Дополнительно, требуется изменить метод newBudgetSourceIntegrator в классе BudgetSourceIntegrator,
    чтобы добавить инициализацию созданного расширения для нового интеграционного документа. Это делается для поддержки нового типа.

  2. Расширение класса BudgetSourceCollectionIntegrator

    Для поддержки новой интеграции требуется расширение класса с. Расширение класса используется на форме BudgetCheckResults, чтобы получить подробную информации об ошибках или предупреждениях для списка записей таблицы BudgetSource. В расширении должен быть реализован функционал получения списка записей таблицы BudgetSource для заголовка интеграционного документа, когда интеграционный документ имеет шаблон заголовок-строки.

    Дополнительно, требуется изменить метод newBudgetSourceCollectionIntegrator в классе BudgetSourceCollectionIntegrator,
    чтобы добавить инициализацию созданного расширения для нового интеграционного документа. Это делается для поддержки нового типа.

Изменение формы BudgetControlConfiguration

Необходимо внести изменения в форму BudgetControlConfiguration, если необходимо включить бюджетный контроль для нового типа интеграции. Можно использовать в качестве шаблона, описание ниже.

  1. Добавить два edit-метода для источника данных BudgetControlConfiguration:
  • Первый метод используется для изменения интегратора источника бюджетного контроля, чтобы включить его в бюджетный контроль.

    Этот метод должен вызывать метод setSourceIntegratorEnabled, который находиться в данном источнике данных формы. Чтобы обновить отображение элементов на форме, когда значение изменяется, следует вызвать связный метод setEnabled[PageName]. Эти методы управляют процессом включения элементов управления на форме.

    Пример метода editDailyJournalEnabled приведен ниже.

    public edit NoYes editDailyJournalEnabled(boolean _set, NoYes _isEnabled)
    {
        BudgetControlSourceIntegrator sourceIntegrator = BudgetControlSourceIntegrator::DailyJournal;
        boolean isSet;
    
        if (_set)
        {
            // Включаем бюджетный контроль для ежедневных журналов.
            isSet = this.setSourceIntegratorEnabled(sourceIntegrator, _isEnabled);
    
            if (isSet)
            {
                element.setEnabledJournals();
            }
        }
    
        return enabledSourceIntegrators.in(sourceIntegrator);
    }
  • торой метод используется для редактирования интегратора источника контроля бюджета, чтобы указать, будет ли интегратор выполнять проверку бюджета при вводе отдельной позиции.

    Данный метод должен вызывать метод setSourceIntegratorDoBudgetCheckOnEntry, который находиться в данном источнике данных формы.

    Пример метода editDailyJournalDoCheckOnEntry приведен ниже.

    public edit NoYes editDailyJournalDoCheckOnEntry(boolean _set, NoYes _doBudgetCheckOnEntry)
    {
        BudgetControlSourceIntegrator sourceIntegrator = BudgetControlSourceIntegrator::DailyJournal;
    
        if (_set)
        {
            // Включаем контроль при вводе отдельно позиции.
            this.setSourceIntegratorDoBudgetCheckOnEntry(sourceIntegrator, _doBudgetCheckOnEntry);
        }
    
        return doBudgetCheckOnEntrySourceIntegrators.in(sourceIntegrator);
    }
  1. Добавить элементы управления на форму, которые будут управляться добавленными ранее edit-методами:
  • Если источник интеграции входит в систему документ-источник бюджетного контроля, элементы управления должны добавляться на закладку документы-источники. При добавлении использовать в качестве шаблона существующие элементы управления на данной закладке.
  • Если источник интеграции журнал, элементы управления должны добавляться на закладку журналы учета. При добавлении использовать в качестве шаблона существующие элементы управления на данной закладке.
  • Если источник интеграции не входит в систему документ-источник и не журнал, то необходимо добавить новую закладку. Однако, при добавлении следует воспользоваться в качестве шаблона закладку с документами или журналами.
  1. Добавить методы, которые необходимы для обслуживания элементов управления на форме. В зависимости от источника интеграции бюджетного контроля, методы setEnabledSourceDocuments, setEnabledJournals или новый метод setEnabled[PageName] должны быть изменены по существующему шаблону, чтобы управлять соответствующими новыми элементами управления. Аналогично методы setVisibleSourceDocuments, setVisibleJournals или новый метод setVisible[PageName] должны быть изменены по существующему шаблону, чтобы управлять видимостью новых элементов управления.

Визуальное отображение результатов бюджетных проверок

Система бюджетного контроля предоставляет поддержку изображений для форм, которые показывают результаты запросов на проверку. Есть 4 разны результата, которые могут быть отображены: «Проверка бюджета не выполнена», «Проверка бюджета пройдена успешно», «Проверка бюджета пройдена успешно, но с предупреждениями» и «Проверка бюджета не пройдена».

Класс BudgetControlResult предоставляет следующие вспомогательные методы:

  • createBudgetCheckResultImages

    Создание списка изображений для 4-х разных результатов.

  • getBudgetCheckResultImagePos

    Возвращает позицию изображения в списке изображений, основанную на результате проверки бюджета.

  • getBudgetCheckResultToolTip

    Создает текст всплывающей подсказки, основанный на результате проверки бюджета.

microsoft

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar