Расчет налогов в Dynamics AX 2012

Расчет налогов в Dynamics AX 2012

Для расчета налогов в Dynamics Ax 2012 существует так называемый Tax Framework, состоящий из набора классов, интерфейсов к ним и таблиц. Система поддерживает сбор, составление отчетов и оплату налогов. Наибольший интерес для нас представляют налоги, которые требуется рассчитать при продажах.

Tax Framework включает в себя Source Document Framework. Source Document Framework был представлен в Ax 2012. Нововведения позволяют производить множественное распределение налога по одной строке. В Dynamics Ax 2009 такой возможности не было. Измененная модель данных была расширена для обеспечения действительной связи между проведенным налогом с продаж и главной книгой по налогу с продаж, суммой налога и суммой строки проводки.

Таблица хранящая данные разнесенных налогов с продаж относится к Source Document Framework, чтобы возможно было видеть влияние распределения на сумму налога с продаж. Например, если будет продан товар на 120 рублей, где 20 рублей это налог, то сумма налога может быть распределена между подразделениями А и Б. Будет существовать запись разнесенной суммы равной 20 руб., но благодаря использованию Source Document Framework, можно будет увидеть, что 10 руб. налога с продажи было распределено на подразделение А, а другие 10 руб. на подразделение Б.

В Dynamics Ax 2009 налоги, у не разнесенных документов, не хранились. Это значит, что пересчет налогов производился каждый раз, в случае, если необходимо было получить сумму налога. Если настройки налогов были изменены, то в таком случае в документе, после пересчета, можно было увидеть другую сумму налога. В Ax 2012 изменили подход, и налог не обработанных документов теперь хранится. Данных подход улучшил производительность, т.к. расчет налогов, довольно ресурсоемкая задача, и также исключил зависимость от изменения настроек.

Рассмотрим новое API

Попробуем разобраться с общими шаблонами работы с налогами:

  1. Изменения в модели данных разнесенных налогов.
  2. Изменения в API.
  3. Шаблоны, применяемые для работы с не разнесенными налогами.

Разнесенные налоги

В модель данных входит TaxTrans, Source Document Framework, а также TaxTransGeneralJournalAccountEntry. TaxTransGeneralJournalAccountEntry это таблица ссылок на проводки, которые не поддерживаются Source Document Framework.

Схема модели данных разнесенных налогов.

Таблица TaxTrans

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

Source Document Framework

Таблица TaxTrans является внешним ключом к SourceDocumentLine, также таблица AccountingDistribution является внешним ключом к SourceDocumentLine. Это позволяет создавать отчеты, отражающие сумму налога, которая была разделена через распределение и на каких счетах ГК она находится. Если поле SourceDocumentLine в таблице TaxTrans заполнено, то желательно использовать исходную строку для получения сумм и счетов.

Пример запроса, который возвращает счет ГК и сумму проводки или налоговые расходы:

while select LedgerDimension, TransactionCurrency, TransactionCurrencyAmount, SourceDocumentLine, RecId from accountingDistribution
    where accountingDistribution.SourceDocumentLine == _taxTrans.SourceDocumentLine
       && accountingDistribution.Type != AccountRole::Reversing
       && accountingDistribution.MonetaryAmount == MonetaryAmount::Tax
{
}

 

Пример запроса, который возвращает счет ГК и сумму налога без возмещения НДС:

while select LedgerDimension, TransactionCurrencyAmount from accountingDistribution
    where accountingDistribution.SourceDocumentLine == _taxTrans.SourceDocumentLine
       && accountingDistribution.Type != AccountRole::Reversing
       && accountingDistribution.MonetaryAmount == MonetaryAmount::TaxNonRecoverable
{
}

 

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

while select accountingDistribution
    where accountingDistribution.SourceDocumentLine == _taxTrans.SourceDocumentLine && accountingDistribution.Type != AccountRole::Reversing
       && accountingDistribution.MonetaryAmount == MonetaryAmount::Tax
join parentAccountingDistribution
    where parentAccountingDistribution.RecId == accountingDistribution.ParentDistribution
{
}

 

Пример запроса, которые возвращает счет для уплаты налога:

while select TaxCode, TaxDirection, SourceCurrencyCode, SourceDocumentLine from taxTrans
    where taxTrans.TaxDirection == TaxDirection::UseTax
       && taxTrans.Voucher == _voucher
       && taxTrans.TransDate == _transDate
join RecId from accountingDistribution
    where accountingDistribution.SourceDocumentLine == TaxTrans.SourceDocumentLine
       && accountingDistribution.Type != AccountRole::Reversing
       && accountingDistribution.MonetaryAmount == MonetaryAmount::Tax
join AccountingDistribution, SubledgerJournalAccountEntry from subledgerJournalAccountEntryDistribution
    where subledgerJournalAccountEntryDistribution.AccountingDistribution == accountingDistribution.RecId
join PostingType, RecId, LedgerDimension from subledgerJournalAccountEntry
    where subledgerJournalAccountEntry.RecId == subledgerJournalAccountEntryDistribution.SubledgerJournalAccountEntry
       && subledgerJournalAccountEntry.PostingType == LedgerPostingType::Tax
       && subledgerJournalAccountEntry.Side == DebitCredit::Credit
{
}

 

Таблица TaxTransGeneralJournalAccountEntry

Для проводок, которые не поддерживаются Source Document Framework, TaxTransGeneralJournalAccountEntry предоставляет информацию о каждом бухгалтерском счете, используемом этими проводками. Данная таблица была добавлена, потому что в Ax 2012 между записями TaxTrans и GeneralJournalAccountEntry отношение многие-ко-многим. Эта таблица ссылок отслеживает множественные отношения между TaxTrans и GeneralJournalAccountEntry.

TaxTransGeneralJournalAccountEntry.TaxTransRelationship используется для идентификации связи. Поле TaxTransRelationship – является наследником перечисления TaxTransRelationshipType и содержит следующие значения:

— Tax. Указывает, какая запись GeneralJournalAccountEntry содержит разнесенную сумму налога для записи TaxTrans. Заменяет TaxTrans.AccountNum.

— UseTaxPayable. Указывает, какая запись GeneralJournalAccountEntry содержит разнесенную сумму налога на использование для записи TaxTrans. Заменяет TaxTrans.TaxOffsetAccountUseTax.

— TransactionLineAccount. Указывает, какая запись GeneralJournalAccountEntry содержит разнесенную сумму проводки, которая является родительской для строки с суммой налога. Заменяет TaxTrans.OperationAccount и TaxTrans.TaxRefId.

По причине, что Source Document Framework позволяет распределить налог по одной строке на несколько плательщиков, присоединение TaxTransGeneralJournalAccountEntry может сейчас вернуть множество записей. Поэтому, если существуют отчеты, которые основаны на одном счете в TaxTrans необходимо произвести анализ и внести вручную изменения.

Пример, как присоединить GeneralJournalAccountEntry для получения счета ГК и суммы.

TaxTrans taxTrans;
TaxTransGeneralJournalAccountEntry taxTransGeneralJournalAccountEntry;
GeneralJournalAccountEntry generalJournalAccountEntry;
DimensionAttributeValueCombination dimensionAttributeValueCombination;

while select RecId from taxTrans
    where taxTrans.Voucher   == _voucher
       && taxTrans.TransDate == _transDate
join RecId from taxTransGeneralJournalAccountEntry
    where taxTransGeneralJournalAccountEntry.TaxTrans == taxTrans.RecId
       && taxTransGeneralJournalAccountEntry.TaxTransRelationship == TaxTransRelationshipType::Tax
join TransactionCurrencyAmount, RecId from generalJournalAccountEntry
    where taxTransGeneralJournalAccountEntry.GeneralJournalAccountEntry == generalJournalAccountEntry.RecId
join DisplayValue from dimensionAttributeValueCombination
    where dimensionAttributeValueCombination.RecId == generalJournalAccountEntry.LedgerDimension
{
}

Классы Tax и API

Рассмотрим основные классы для расчета налогов, которые могут использоваться разработчиками: TaxCalculation, TaxPost.

Класс TaxCalculation

Это новый класс, который содержит основной API используемые для расчета налогов.

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

Чтобы класс мог поддерживаться TaxCalculation необходимо, чтобы он реализовывал интерфейсы TaxableDocument, TaxableLine и, необязательный интерфейс, TaxableInventoriedLine. TaxCalculation использует интерфейсы, чтобы запрашивать необходимые данные для расчета налога. В АX 2012 только журналы реализуют интерфейсы TaxableDocument, TaxableLine. Все другие использую устаревшие средства связи с Tax.

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

В таблице представлены проводки и классы их обрабатывающие.

Проводка Класс расчета Наследник TaxCalculation Использованы интерфейсы Taxable
Bank TaxBankAccountReconcile Нет Нет
Manufacturing TaxBudget Нет Нет
Budget TaxBudgetTransaction Нет Нет
Free Text Invoice TaxFreeInvoice Да Нет
PO Documents TaxPurch Да Нет
Customer Collection Letters TaxCustCollectionLetter Нет Нет
Customer Interest Notes TaxCustInterestNote Нет Нет
Journals TaxCalculationJournal Да Да
Payment Fees TaxPaymManFee Нет Нет
Project TaxProj Нет Нет
Sales Order Documents TaxSales Нет Нет
Sales Basket TaxSales_Basket Нет Нет
Sales Quotations TaxSalesQuotations Нет Нет
Expense TrvTaxExpense Да Нет

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

ledgerVoucher = custInvoiceTable.custInvoiceJour().LedgerVoucher;
if (!TaxTrans::exist(ledgerVoucher, custInvoiceTable.InvoiceDate, this.transTransId()))
{
    loadTaxUncommitted = TaxUncommitted::existByDocumentId(tablenum(CustInvoiceTable),custInvoiceTable.RecId);
    taxCalculation = TaxCalculation::newForSourceTypeWithTaxUncommitted(TaxSourceType::FreeTextInvoice, this, loadTaxUncommitted, false);
    if (!loadTaxUncommitted)
    {
        amountCur = taxCalculation.calculateTax();
    }
    else
    {
        amountCur = taxCalculation.totalTaxAmount();
    }
}
else
{
    amountCur = Tax::taxTotal(ledgerVoucher, custInvoiceTable.InvoiceDate);
}

Класс TaxPost

Это абстрактный класс, который предоставляет функциональность, которую можно использовать для записей в TaxTrans из записей TaxUncommitted и\или TmpTaxWorkTrans.


Для проведения налоговых сумм в главной книге, по документам, которые не поддерживают Source Document Framework, также используется TaxPost. Чтобы класс мог поддерживаться TaxPost необходимо, чтобы он реализовывал интерфейсы TaxableDocument, TaxableLine и, необязательный интерфейс, TaxableInventoriedLine. TaxPost использует интерфейсы, чтобы запрашивать необходимые данные для расчета налога. В АX 2012 только журналы реализуют интерфейсы TaxableDocument, TaxableLine. Все другие использую устаревшие средства связи с Tax.

Но не все проводки поддерживают (N/A) TaxPost. Ниже в таблице это указано.

Проводка Класс разноски Наследник TaxPost
Bank TaxBankAccountReconcile Нет
Manufacturing* N/A N/A
Budget* N/A N/A
Free Text Invoice TaxFreeInvoice_Invoice Да
Purchasing Documents TaxPurchInvoice Да
Customer Collection Letters TaxCustCollectionLetter Нет
Customer Interest Notes TaxCustInterestNote Нет
Journals TaxPostJournal Да
Payment Fees TaxPaymManFee Нет
Project TaxProjInvoice Нет
Sales Order Documents TaxSalesInvoice Нет
Sales Basket* N/A N/A
Sales Quotations* N/A N/A
Expense* N/A N/A

Разнесение налога, осуществляется для строки, по которой уже он рассчитан. Проведение налога может происходит по 2-м сценариям:

  1. Налоговые проводки создаются из строк таблицы TmpTaxWorkTrans. Некоторые документы, в некой своей функциональности, которая выполняется на каком-либо этапе, например, какие-либо проверки перед разноской накладной, рассчитывает налог и эти рассчитанные данные сохраняются в таблице TmpTaxWorkTrans. В этом случае, использование хранящихся данных, позволяет ускорить процесс создания налоговых проводок.

    Пример, разноска налогов с использование класса TaxCalculation:

    TaxPost taxPost = TaxPost::newForSourceTypeWithTaxCalculation(TaxSourceType::PurchaseOrder, this, _post, taxCalculation);
    
    taxPost.updateAndPost(LedgerPostingController::newForLedgerPostingJournal(_ledgerVoucher));
  2. Налоговые проводки создаются из строк таблицы TaxUncommited. Если данных в таблице TmpTaxWorkTrans нет, то может быть использована TaxUncommited.

    Пример:

    TaxPost taxPost;
    
    LedgerJournalTaxDocument ledgerJournalTaxDocument;
    
    ledgerJournalTaxDocument = LedgerJournalTaxDocument::constructForPosting(ledgerJournalTable.JournalNum);
    
    taxPost = TaxPost::newForSourceType(TaxSourceType::Journals, ledgerJournalTaxDocument, NoYes::Yes);
    
    postedTaxAmount = taxPost.updateAndPost(_ledgerPostingController);

Запрос суммы налога с использованием класса Tax

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

Метод Описание
totalTaxAmount Возвращает фактическую общую сумму налога, за исключением налога на использование из TmpTaxWorkTrans. Записи TmpTaxWorkTrans создаются путем загрузки их из TaxUncommitted или расчета налога с использованием класса TaxCalculation.
totalTaxAmountCalculated Возвращает рассчитанную общую сумму налога, включая налога на использование из TmpTaxWorkTrans.
totalTaxAmountSingleLine Возвращает фактическую общую сумму налога для строки из TmpTaxWorkTrans. Налог на использование может быть дополнительно включен в общую сумму. Можно выбрать, будет ли сумма иметь знак для отображения или знак из базы данных. Требуется, чтобы налоги были рассчитаны или загружены из TaxUncommitted.
taxTotalVoucherDate Статический метод, который возвращает фактическую сумму налога по ваучеру и дате, за исключением налога на использование, из TaxTrans. Используется, если для проводки требуется сумма налога.

Термин «фактическая» сумма налога подразумевает, что налоговые корректировки были включены в сумму налога. Термин «рассчитанная» сумма налога подразумевает, что корректировки налога не были включены в сумму налога.

Запрос суммы налога по проводкам, которые поддерживают TaxUncommitted

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

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

Пример, который получает сумму налога по строке журнала.

return TaxUncommitted::getActualTaxAmountForSourceLine(_ledgerJournalTrans.TableId, _ledgerJournalTrans.RecId, false, true);

Пример, который получает сумму налога по ваучеру:

return TaxUncommitted::getActualTaxAmountForVoucher(_ledgerJournalTable.TableId, _ledgerJournalTable.RecId, _ledgerJournalTrans.Voucher, false);

Методы класса TaxCalculation

Метод Описание
calculateTax Основной метод для расчета налога. Если экземпляр класса был инициализирован с использованием конструктора TaxCalculation::newForSourceTypeWithTaxUncommitted(), то это приведет к удалению всех записей и созданию новых записей в TaxUncommitted. Процесс удаления, обеспечивает удаление только записей, относящихся к SourceDocumentLine,
SourceDocumentDistributions и т.д.
amountExclTax Метод позволяет узнать, какая часть суммы проводок не включает налог, когда налог включен в цену номенклатуры. Метод не во всех случаях возвращает действительно округленную сумму. Метод может быть использован для возврата оценки. Любые существующие вызовы этого метода, которые приводят к округленной сумме строки должны быть удалены. Предпочтительно рассчитывать налоги и использовать источник TmpTaxWorkTrans или TaxUncommitted.
Пример кода, который является правильным способом получения суммы строки без учета налога из TaxUncommitted:
taxOrigin = TaxUncommitted::getOriginForSourceLine(this.TableId, this.RecId, true);
Пример кода, который является правильным способом получения суммы строки, исключая налог с продаж из экземпляра Tax:
taxOrigin = _tax.getOriginForSourceLine(this.TableId, this.RecId, true);
taxCalcWithoutSource Этот метод оценивает налог с продаж на основе переданных параметров. Поскольку этот метод учитывает только одну строку проводки, а не все проводки, он не будет корректным в некоторых сценариях, таких как налог, основанный на итоговой сумме счета. Поэтому этот метод следует использовать только в тех случаях, когда требуется оценка.
useTaxUncommitted Возвращает истину, если класс вызван с использованием TaxUncommitted.
useSubLedgerJournalLines Возвращает истину, если класс вызван с использованием Source Document Framework.
newForSourceType Создает экземпляр класса, который не использует TaxUncommitted. Документы, поддерживающие TaxUncommitted, могут быть рассчитаны без использования TaxUncommitted. Обычно, чтобы показать конкретную сумму налога для некоторых сценариев. Например, в заказе на покупку, можно посмотреть всего по документу, для различных количеств. Это означает, что налоги должны рассчитываться с использованием данных количеств. В этом случае, нежелательно создавать записи TaxUncommitted для таких различных типов количеств.
newForSourceTypeWithTaxUncommitted Создает экземпляр класса, который использует TaxUncommitted. В процессе разноски, все равно производится проверка поддержки TaxUncommitted. Если метод useTaxUncommitted возвращает ложь, то использование этого метода не приведет к созданию записей в TaxUncommitted.
taxExists Создает экземпляр класса, который использует TaxUncommitted. В процессе разноски, все равно производится проверка поддержки TaxUncommitted. Если метод useTaxUncommitted возвращает ложь, то использование этого метода не приведет к созданию записей в TaxUncommitted.

Методы класса TaxPost

Метод Описание
updateAndPost Основной метод для разноски налогов. Данный метод гарантирует, что все проводки будут созданы в TaxTrans и будет выполнены вся специфичная логика для данной проводки.
Например, когда на основании записей в TaxUncommitted создаются записи в TaxTrans, происходит смена владельца. Родителем записи TaxUncommitted может быть PurchaseParmLine, но записи TaxTrans должны принадлежать действительному документу, а не исходному документу. Поэтому этот метод изменит владельца так, что записи TaxTrans будут принадлежать VendInvoiceTrans.
saveAndPost Это совместимый метод, используемый в некоторых разносках. Метод считается устаревшим. Необходимо использовать updateAndPost.
useTaxUncommitted Возвращает истину, если класс вызван с использованием TaxUncommitted.
useSubLedgerJournalLines Возвращает истину, если класс вызван с использованием Source Document Framework.
newForSourceType Создает экземпляр класса, который не использует TaxUncommitted. Во время разноски, класс использует данные таблицы TmpTaxWorkTrans. Создание записей в TaxTrans происходит на основании записей TmpTaxWorkTrans. Использование данного метода не является рекомендованным.
newForSourceTypeWithTaxUncommitted Создает экземпляр класса, который использует TaxUncommitted. Записи TaxTrans будут созданы непосредственно из TaxUncommitted. Если документ поддерживает Source Document Framework, необходимо использовать этот конструктор.

Изменения API

Поскольку некоторые API-интерфейсы в Tax принимают в качестве параметров финансовые аналитики и счета ГК, эти интерфейсы были изменены в Dynamics AX 2012. Отличия можно увидеть в таблице.

Поле AX 2009 AX 2012
Tax account AccountNum LedgerDimension
Use Tax Payable Account TaxOffsetAccountUseTax TaxOffsetUseTaxLedgerDimension
Profit & Loss Account OperationAccount OperationLedgerDimension
Expense Account ChargeAccount OperationLedgerDimension

Когда механизм вычисления рассчитывает налог, Tax получает DefaultDimension и OperationLedgerDimension. OperationLedgerDimension — это LedgerDimension, используемый в строке, которая является родительской для строки налога. DefaultDimension является аналитикой по умолчанию из строки источника. Внутренний механизм расчета налога ищет экземпляры LedgerDimensionDefaultAccount из настройки налога (таблица TaxLedgerAccountGroup) для каждой строки налога. Это счета по умолчанию для налога и, дополнительно, счет для уплаты налогов для использования по умолчанию. Переданный DefaultDimension применяется к экземплярам LedgerDimensionDefaultAccount для создания LedgerDimension и TaxOffsetUseTaxLedgerDimension.

Счет расходов в Dynamics AX 2009 (ChargeAccount) всегда должен содержать тоже значение, что и OperationAccount, поэтому это поле было удалено в Dynamics AX 2012.

Tax имеет два защищенных метода: Tax.insertIntersection() и Tax.insertLineInInternal(). Метод Tax.insertIntersection() ранее принимал финансовую аналитику в качестве параметра. Сейчас этот параметр удален. Метод Tax.insertLineInInternal() был изменен и теперь в качестве параметров принимает DefaultDimension и OperationLedgerDimension. Классы, для работы с налогами, которые вызываются по причине специфики обработки конкретной проводки, должны вызываться внутри метода.

Модель данных TaxUncommited

Схематичное изображение модели представлено ниже.


Таблица TaxUncommited была введена в AX 2012. Она хранить налоги, которые еще не были переведены в налоговые органы. Таблица имеет много одинаковых полей, таких, как в таблицах TmpTaxWorkTrans и TaxTrans.

В процессе проведения налоговых проводок, записи из TaxUncommited удаляются, а в TaxTrans вставляется. Есть исключения для заказа на покупку/подтверждение заказа на покупку.

Использование TaxUncommited не является обязательным. Если для документа не реализована поддержка TaxUncommited, то будет применяться процесс расчет налога, который применяется в AX 2009.

Записи в TaxUncommited детализированы. Это значит, что каждая исходная строка может иметь 0 или несколько записей в TaxUncommited. Для каждого налогового кода создается отдельная запись. TaxUncommitted содержит поля SourceRecId и SourceTableId, которые вместе составляют внешний ключ к таблице строк документа, которой принадлежит этот налог. Это родитель TaxUncommitted. Обычно эти данные используется для определения общей суммы налога для исходной строки.

TaxUncommitted также содержит поля HeadingRecId и HeadingTableId, которые вместе составляют внешний ключ к таблице заголовка документа. Это прародитель TaxUncommitted. Обычно используется для определения общего налога с продаж для всего документа.

Таблица имеет несколько методов для удаления строк.

Метод Описание
deleteForDocumentHeader() Удаляет все записи, которые ссылаются на документ.
deleteForDocumentLine() Не должен использоваться, поддерживает только определенный сценарий. Удаление одной строки, исказит информацию о налогах в документе.
deleteForInvoice() Используется для удаления строк, принадлежащих накладной.

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

Когда производится расчет налога

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

Причина, по которой не начисляются налоги при сохранении строки, заключается в том, что налоги могут рассчитываться на основе суммы накладной. Затем эта сумма налога распределяется по всем строкам, расчет распределения основывается на налоговом коде. Это означает, что добавление пятой строки в документ изменит налог, который был рассчитан и распределен по четырем строкам.

Реализация поддержки TaxUncommited требует выполнения шагов:

  1. Реализация интерфейса Taxable.
  2. Обеспечить наследование от класса TaxPost, своего класса, включающего специфику разнесения налогов.

    Базовый класс Tax содержит метод useTaxUncommitted(). Поэтому класс по расчету и разноске налогов, должны перекрывать этот метод и возвращать «true», чтобы включить поддержку TaxUncommited.

  3. В коде объявляйте экземпляры TaxPost и TaxCalculation, а не унаследованных от них классов.
  4. Имеется возможность контролировать, когда информация о налогах будет сохранена в TaxUncommited. TaxCalculation::newForSourceType() это конструктор, который необходимо использовать, когда данные не должны попадать в TaxUncommited. TaxCalculation::newForSourceTypeWithTaxUncommitted() это конструктор, который следует использовать, когда требуется записать данные в TaxUncommited.
  5. Когда происходят изменения документа, которые влияют на налоги, то необходимо удалить записи в TaxUncommited. Обычно, это реализуется в методах вставки, обновления и удаления таблиц, которые являются источниками налогов.

    Пример удаления записей на основании заголовка документа:

    TaxUncommitted::deleteForDocumentHeader(vendInvoiceInfoTable.TableId,vendInvoiceInfoTable.RecId, true, true);
  6. Использование Source Document Framework для разноски налогов.

Source Document Framework и Tax

Чтобы использовать Source Document Framework, надо понимать, как взаимодействуют Source Document Framework и Tax. Также это поможет понять влияние Tax на функциональность Source Document Framework.

Для начала должна быть реализована поддержка TaxUncommited. TaxUncommited имеет внешний ключ к таблице SourceDocumentLine. Это позволяет получить доступ к AccountDistributions для записи TaxUncommitted.

Интерфейс TaxableDocument имеет метод useSourceDocumentFramework(). Данный метод должен возвращать «true», чтобы включить функционал в Tax, который отвечает за специфику работы с Source Document Framework.

Первое важное отличие в поведении, что каждая запись TaxUncommited создает новую запись в SourceDocumentLine. Внешний ключ для SourceDocumentLine находится в TaxUncommited, TmpTaxWorkTrans и TaxTrans. Когда налог будет разнесен, TaxTrans станет новым владельцем внешнего ключа SourceDocumentLine.

Следующее отличие, что Tax не больше не проводит налоговые суммы в главной книге, этим занимается Source Document Framework, но продолжает создавать записи в TaxTrans.

Распределение

Source Document Framework применяется, чтобы разделить сумму на несколько разных счетов с различными аналитиками.

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

Важно понимать, что Tax не производит расчет по распределениям. Вместо этого, Tax рассчитывает по строке, как это было в Ax 2009. Таким образом, записи в TaxUncommitted и TaxTrans не разделены.


microsoft.com

Comments

So empty here ... leave a comment!

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

Sidebar