Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся сведения о том, как выполнить необходимые действия для новой проводки.
Действия - это классы, которые выполняют задание в налоговой интеграции. Объект документа TaxIntegrationDocumentObject передается от действия к деятельности. Действие выполняется над метаданными в TaxIntegrationDocumentObject. Все действия по интеграции налогов расширяют TaxIntegrationAbstractActivity класс, могут быть добавлены к последовательности и запущены TaxIntegrationFacade::calculate() в добавленном порядке.
Для интеграции новой проводки не обязательно все мероприятия должны быть реализованы или изменены. В большинстве случаев достаточно двух конкретных действий: TaxIntegrationDataRetrievalActivityOnDocument и TaxIntegrationDataPersistenceActivityOnDocument. Если для новой проводки включено больше функций, см. раздел "Сведения о функциях налоговой интеграции".
Мероприятие по извлечению данных
Мероприятие по извлечению данных копируетTaxIntegrationDataPersistenceActivityOnDocument все метаданные, необходимые для расчета налогов, из базы данных в TaxIntegrationDocumentObject объект.
Это действие конструирует, а затем вызывает подкласс класса, зависящий от TaxIntegrationAbstractDataRetrievalTemplate проводки, в соответствии со HeadingTableId значением текущей обработанной проводки в шаблоне завода. Затем подкласс запросит все строки проводки, расходы и другую полезную информацию из базы данных и сохраняет ее в объекте документа.
Чтобы начать деятельность по поиску данных, создайте и выполните новый подкласс TaxIntegrationAbstractDataRetrievalTemplate. Дайте подклассу такое имя, как TaxIntegration***DataRetrieval. В следующем списке показаны некоторые классы извлечения данных для интегрированных проводок:
- AxClass/TaxIntegrationPurchTableDataRetrieval
- AxClass/TaxIntegrationPurchParmTableDataRetrieval
- AxClass/TaxIntegrationPurchREQTableDataRetrieval
- AxClass/taxIntegrationPurchRFQTableDataRetrieval
- AxClass/TaxIntegrationVendInvoiceInfoTableDataRetrieval
- AxClass/TaxIntegrationSalesTableDataRetrieval
- AxClass/TaxIntegrationSalesParmDataRetrieval
Эти имена состоят из префикса TaxIntegration, имени таблицы заголовка для проводки, а затем DataRetrieval. Если должна быть интегрирована проводка накладной с произвольным текстом TaxIntegrationCustInvoiceTableRetrieval , то класс должен быть реализован.
Внедрение класса извлечения данных
В этом разделе представлена реализация класса извлечения данных. Он используется TaxIntegrationPurchTableDataRetrieval в качестве примера для описания этого класса.
[TaxIntegrationDataRetrieval(tableStr(PurchTable))] // Attribute for TaxIntegrationDataRetrievalActivityOnDocument to call this class
public class TaxIntegrationPurchTableDataRetrieval extends TaxIntegrationAbstractDataRetrievalTemplate
{
protected PurchTable purchTable; // Header table buffer
protected PurchLine purchLine; // Line table buffer
// Query builder methods, for the SQL query for framework to execute
[Replaceable]
protected SysDaQueryObject getDocumentQueryObject()
[Replaceable]
protected SysDaQueryObject getLineQueryObject()
[Replaceable]
protected SysDaQueryObject getDocumentChargeQueryObject()
[Replaceable]
protected SysDaQueryObject getLineChargeQueryObject()
// Construct a TaxIntegrationLineObject
protected TaxIntegrationLineObject constructLine()
// Data retrieval methods, copy the metadata from table buffer to Document object.
protected void copyToDocument()
protected void copyToDocumentFromHeaderTable()
protected void copyToLine(TaxIntegrationLineObject _line)
protected void copyToLineFromLineTable(TaxIntegrationLineObject _line)
...
}
Декларация
Следующий пример из TaxIntegrationPurchTableDataRetrieval.xpp.
/// <summary>
/// The <c>TaxIntegrationPurchTableDataRetrieval</c> class retrieves data from <c>PurchTable</c>, etc.
/// </summary>
[TaxIntegrationDataRetrieval(tableStr(PurchTable))]
public class TaxIntegrationPurchTableDataRetrieval
extends TaxIntegrationAbstractDataRetrievalTemplate
{
// ...
Класс объявляется с помощью атрибута [TaxIntegrationDataRetrieval(tableStr(PurchTable))] , который TaxIntegrationDataRetrievalActivityOnDocument используется для создания и вызова этого класса по шаблону завода. Имя таблицы должно быть таблицей заголовков проводок, а код таблицы должен совпадать со значением HeadingTableId , инициализируемым в объекте TaxIntegrationDocumentObject .
Обратитесь к методу actStatic TaxIntegrationDataRetrievalActivityOnDocument.xpp, который показан здесь.
protected static void actStatic(TaxIntegrationDocumentObject _document)
{
// ...
TaxIntegrationAbstractDataRetrievalTemplate dataRetrievalInstance = SysExtensionAppClassFactory::getClassFromSysAttributeWithInstantiationStrategy(
classStr(TaxIntegrationAbstractDataRetrievalTemplate),
new TaxIntegrationDataRetrievalAttribute(tableId2Name(_document.getLocalTableId())),
new SysExtensionGenericInstantiation(_document));
/// ...
dataRetrievalInstance.execute();
}
Объявите по крайней мере две таблицы для каждой проводки. Для этой проводки объявляется таблица заголовков и таблица строк. (Например, для заказов на покупку такими таблицами будут PurchTable и PurchLine.) Если в качестве входных данных для расчета используются поля из других таблиц, объявите их здесь.
[TaxIntegrationDataRetrieval(tableStr(PurchTable))]
public class TaxIntegrationPurchTableDataRetrieval
extends TaxIntegrationAbstractDataRetrievalTemplate
{
protected PurchTable purchTable;
protected PurchLine purchLine;
protected TransportationDocument transportationDocument; // Other tables through join relationship
protected VendTable vendTable;
private LedgerDimensionDefaultAccount ledgerAccount;
Создание объекта запроса
Запросы при налоговой интеграции используют этот SysDaQuery метод. После реализации нескольких get***QueryObject() методов структура налоговой интеграции вызовет эти методы, извлекает данные из базы данных и назначает их табличному буферу, объявленному ранее.
Четыре объекта запроса должны быть отформатированы таким образом, чтобы можно было выполнять следующие запросы:
- Запрос таблиц уровня заголовков по и
HeadingTableIdHeadingRecIdзначению вTaxIntegrationDocumentObject. Таблицы на уровне заголовков относятся к таблицам, связанным с таблицей заголовков проводок (например,PurchTableдля заказов на покупку). Если объект документа создан с помощью записиTaxIntegrationDocumentObject::constructWithRecord(Common _record), назначьте таблицу заголовков буферу, используяthis.document.getLocalRecord()напрямую. Повторно запрашивать таблицу заголовка не обязательно. - Запрос таблицы строк по отношению между таблицей заголовков и таблицей строк после предоставления буфера таблицы заголовка.
- Запрос расхода для заголовка (
MarkupTrans). - Запрос расхода по строке (
MarkupTrans).
Следующий пример из TaxIntegrationPurchTableDataRetrieval.xpp.
/// <summary>
/// Gets the query for the document.
/// </summary>
/// <returns>The query for the document.</returns>
[Replaceable]
protected SysDaQueryObject getDocumentQueryObject()
{
this.purchTable = this.document.getLocalRecord();
SysDaQueryObjectBuilder queryObjectBuilder = SysDaQueryObjectBuilder::from(this.vendTable)
.where(this.vendTable, fieldStr(VendTable, AccountNum))
.isEqualTo(this.purchTable, fieldStr(PurchTable, OrderAccount))
.outerJoin(this.transportationDocument) // primary key
.where(this.transportationDocument, fieldStr(TransportationDocument, RecId))
.isEqualTo(this.purchTable, fieldStr(PurchTable, TransportationDocument));
.outerJoin(this.vendTableInvoice) // alternate key
.where(this.vendTableInvoice, fieldStr(VendTable, AccountNum))
.isEqualTo(this.purchTable, fieldStr(PurchTable, InvoiceAccount));
return queryObjectBuilder.toSysDaQueryObject();
}
/// <summary>
/// Gets the query for the lines of the document.
/// </summary>
/// <returns>The query for the lines of the document</returns>
[Replaceable]
protected SysDaQueryObject getLineQueryObject()
{
return SysDaQueryObjectBuilder::from(this.purchLine)
.where(this.purchLine, fieldStr(PurchLine, PurchId))
.isEqualToLiteral(this.purchTable.PurchId)
.toSysDaQueryObject();
}
/// <summary>
/// Gets the query for the charges of the document.
/// </summary>
/// <returns>The query for the charges of the document</returns>
[Replaceable]
protected SysDaQueryObject getDocumentChargeQueryObject()
{
return SysDaQueryObjectBuilder::from(this.markupTransOfDocument)
.where(this.markupTransOfDocument, fieldStr(MarkupTrans, TransTableId))
.isEqualToLiteral(this.purchTable.TableId)
.where(this.markupTransOfDocument, fieldStr(MarkupTrans, TransRecId))
.isEqualToLiteral(this.purchTable.RecId)
.toSysDaQueryObject();
}
/// <summary>
/// Gets the query for the charges of each line.
/// </summary>
/// <returns>The query for the charges of each line.</returns>
[Replaceable]
protected SysDaQueryObject getLineChargeQueryObject()
{
return SysDaQueryObjectBuilder::from(this.markupTransOfLine)
.where(this.markupTransOfLine, fieldStr(MarkupTrans, TransTableId))
.isEqualToLiteral(this.purchLine.TableId)
.where(this.markupTransOfLine, fieldStr(MarkupTrans, TransRecId))
.isEqualToLiteral(this.purchLine.RecId)
.toSysDaQueryObject();
}
Примечание
Если требуются поля из других таблиц, присоединитесь к ним в объекте запроса. В предыдущем примере в transportationDocument методе getDocumentQueryObject() используется такой подход.
Конструировать объект строки
/// <summary>
/// Constructs a line of the document.
/// </summary>
/// <returns>The constructed line of the document.</returns>
protected TaxIntegrationLineObject constructLine()
{
return TaxIntegrationLineObject::constructOnDocument(
this.purchLine.TableId,
this.purchLine.RecId,
this.document);
}
Создайте TaxIntegrationLineObject объект с помощью кода таблицы строки и кода записи. Этот метод называется структурой. Замените буфер таблицы для новой проводки.
Методы копирования
Несколько методов, начиная с копирования , должны быть реализованы для копирования метаданных из буфера таблицы в объект документа. Дополнительные сведения см. в разделе Извлечение данных из базы данных. Поскольку необходимо создать новые классы, информацию о расширениях можно игнорировать.
При реализации методов определите, какие поля требуются для службы расчета налогов, и скопируйте только требуемые поля. Сведения о добавлении новых полей см. в разделе Добавление переменной данных в классе объектов. Дополнительные сведения о добавлении данных в запрос см. в разделе Добавление данных к запросу.
Мероприятие по сохранению данных
Когда выполняется мероприятиеTaxIntegrationDataPersistenceActivityOnDocument по сохранению данных, вызывается служба расчета налогов. Ответ обрабатывается и сохраняется в TaxIntegrationDocumentObject. Заданием действия по сохранению данных является обновление требуемых метаданных в ответ на базу данных. Метаданные включают результаты расчета налога, налоговую группу, налоговую номенклатурную группу, код НДС и код списка.
Подобно извлекаемой информации класс TaxIntegrationDataPersistenceActivityOnDocument конструирует и вызывает персистентный класс данных в соответствии со значением HeadingTableId текущей обработанной проводки. Работа здесь заключается в реализации TaxIntegration***DataPersistence класса. Например, TaxIntegrationCustInvoiceTableDataPersistence этот класс применяется для накладных с произвольным текстом.
Однако, в отличие от деятельности по сбору данных, TaxIntegrationDataPersistenceActivityOnDocument большую часть персистентной работы или результатов расчета налогов выполняет сама по себе. Эта часть управляется стандартным кодом. При интегрировании новой проводки дополнительная работа не требуется.
Новый класс персистентного сохранения связанных с проводкой полей (таких, как налоговая группа, налоговая номенклатурная группа, код НДС, группа номерных серий и код списка) будут сохранены в базе данных.
В следующем примере показана базовая структура. TaxIntegrationPurchTableDataPersistence
/// <summary>
/// The <c>TaxIntegrationPurchTableDataPersistence</c> class persists data to <c>PurchTable</c>, etc.
/// </summary>
[TaxIntegrationDataPersistence(tableStr(PurchTable))] // Attribute for TaxIntegrationDataPersistenceActivityOnDocument to call
public class TaxIntegrationPurchTableDataPersistence
extends TaxIntegrationAbstractDataPersistenceTemplate
{
// Table buffer to be updated
protected PurchTable purchTable;
protected PurchLine purchLine;
// Query builder methods
[Replaceable]
protected SysDaQueryObject getDocumentQueryObject()
[Replaceable]
protected SysDaQueryObject getLineQueryObject()
[Replaceable]
protected SysDaQueryObject getDocumentChargeQueryObject()
[Replaceable]
protected SysDaQueryObject getLineChargeQueryObject()
// Get line object
protected TaxIntegrationLineObject getLine()
// Save to database
protected boolean saveDocument()
protected boolean saveLine(TaxIntegrationLineObject _line)
...
}
Как показано в предыдущем примере, структура класса персистентности данных напоминает структуру класса извлечения данных. Единственное отличие заключается в том, что класс извлекаемых данных копирует данные из базы данных в объект документа, в то время как класс данных персистентности копирует данные из объекта документа в базу данных. Краткое введение к реализации. Не все примеры кодов будут присоединены.
[TaxIntegrationDataPersistence(tableStr(PurchTable))]— это атрибут, который необходимоTaxIntegrationDataPersistenceActivityOnDocumentпостроить в шаблоне фабрики.QueryObjectзначение для извлечения данных почти такое же, как и для извлечения данных, за исключением двух моментов:-
.forUpdate()используется для класса персистентного обновления данных в базе данных. - Таблица
Lessиспользуется, поскольку ее необходимо обновить.
-
Этот
getLine()метод напоминает метод вconstructLine()классе извлечения данных. Однако достаточно заменить имя таблицы новой таблицей проводок.Методы, начинающиеся с сохранения , являются основными заданиями данного класса. Дополнительные сведения см. в следующем разделе.
Методы сохранения
Следующий пример из TaxIntegrationPurchTableDataPersistence.
/// <summary>
/// Saves the document.
/// </summary>
/// <returns>Always true.</returns>
protected boolean saveDocument()
{
TaxIntegrationTaxIdUtility::saveTaxIDFromDocumentToTable(document, purchTable);
TaxIntegrationListCodeUtility::saveListCodeFromDocumentToTable(document, purchTable);
this.saveNumberSequenceGroupToTable();
return true;
}
/// <summary>
/// Saves the current line of the document.
/// </summary>
/// <param name = "_line">The current line of the document.</param>
/// <returns>true if the operation is successful; otherwise, false.</returns>
protected boolean saveLine(TaxIntegrationLineObject _line)
{
if (!_line.isTaxable())
{
return true;
}
TaxGroup taxGroup = _line.getTaxGroup();
TaxItemGroup taxItemGroup = _line.getTaxItemGroup();
this.checkGroup(taxGroup, taxItemGroup);
purchLine.TaxGroup = taxGroup;
purchLine.TaxItemGroup = taxItemGroup;
purchLine.doUpdate();
return true;
}
Метод saveDocument() обновляет поля в таблице заголовка, в то время как saveLine() метод обновляет поля в таблице строк проводок.
В настоящее время в таблице заголовка обновляются код НДС, группа номерных серий и код списка. В методе saveLine() налоговая группа и налоговая группа номенклатур, возвращаемые службой расчета налогов, должны быть обновлены. Это требование применяется для большинства проводок.
Примечание
Чтобы избежать дополнительной логики doUpdate() , используйте update()вместо.