Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel stellt die Features und Funktionen vor, die Sie zur Integration einer neuen Transaktion implementieren müssen.
Die folgenden Features und Funktionen werden bei der Steuerintegration unterstützt:
- Mehrwertsteuerüberschreibung
- Mehrere Umsatzsteuer-Identifikationsnummern
- Listencode
- Skonto
Mehrwertsteuerüberschreibung
Bei der Steuerintegration können Sie die Steuergruppe und die Artikelsteuergruppe in einer Zeile nicht bearbeiten, da die Steuern vom Steuerberechnungsdienst bestimmt werden. Mit der Funktion Umsatzsteuergruppe überschreiben können Sie die Steuergruppe oder Artikelsteuergruppe ändern, die in einer Zeile zum Berechnen der Umsatzsteuer angegeben ist. Diese Berechnung überschreibt die Steuergruppen, die vom Steuerberechnungsdienst ermittelt werden.
Wenn die Option Umsatzsteuer überschreiben auf Ja gesetzt ist, können Sie für die Steuerberechnung eine bestimmte Steuergruppe und Artikelsteuergruppe auswählen.
Befolgen Sie diese Schritte, um die Funktionalität zu aktivieren.
Fügen Sie das Feld Umsatzsteuer überschreiben zum Schema der Transaktionszeilentabelle und zum Abschnitt Umsatzsteuer hinzu, falls dieser vorhanden ist.
Setzen Sie die Standardsichtbarkeit in zugehörigen Transaktionsformularen auf false .
Ordnen Sie das Feld Umsatzsteuer überschreiben der
SalesPurchJournalLine
Karte zu. Diese Karte wird häufig bei der Steuerintegration verwendet. Wenn es nicht zugeordnet ist, ist möglicherweise zusätzlicher Code erforderlich, um die erwartete Funktion zu realisieren.Legen Sie die Sichtbarkeit und Editierbarkeit des Transaktionsformulars fest:
Setzen Sie die Standardsichtbarkeit für die Datenquelle des Transaktionsformulars auf false .
Setzen Sie die Standardsichtbarkeit nur dann auf true , wenn die Steuerintegration für diese Transaktion aktiviert ist.
if (isTaxIntegrationEnabledForPurchase) // Condition should be modified according to the business process { PurchTable_ds.object(fieldNum(PurchTable, OverrideSalesTax)).visible(true); PurchLine_ds.object(fieldNum(PurchLine, OverrideSalesTax)).visible(true); }
Fügen Sie dem Transaktionsformular ein
allowEdit
Steuerelement hinzu, um die Editierbarkeit der Steuergruppe und der Artikelsteuergruppe zu steuern. Normalerweise gibt es drei Stellen, an denen dieses Steuerelement hinzugefügt werden kann:- Die
init()
Methode der Form - Die
active
Methode der Linie - Die
modified()
Methode des Felds Umsatzsteuer überschreiben
if (isTaxIntegrationEnabledForPurchase) // Condition should be modified according to the business process { PurchLine_ds.object(fieldNum(PurchLine, TaxGroup)).allowEdit(purchLine.OverrideSalesTax == NoYes::Yes); PurchLine_ds.object(fieldNum(PurchLine, TaxItemGroup)).allowEdit(purchLine.OverrideSalesTax == NoYes::Yes); }
- Die
Legen Sie den Wert der Override-Umsatzsteuer in der Datenabrufaktivität fest.
line.setOverrideSalesTax(this.vendInvoiceInfoLine.OverrideSalesTax);
Um die Einheitlichkeit des Designs zu wahren, wird in die neue Gebühr die standardmäßige Umsatzsteuer von ihrem Ursprungsort eingetragen. Ändern
MarkupTrans::getOverrideSalesTaxFromParentRecord(MarkupTransRefTableId _tableId, MarkupTransRefRecId _refRecId)
für neue Transaktionsunterstützung.Optional: Ändern Sie zugehörige Entitäten, um den Import und Export der Override-Umsatzsteuer zu unterstützen.
Mehrere Umsatzsteuer-Identifikationsnummern
Mit der Funktion Mehrere Umsatzsteuer-Identifikationsnummern kann die Umsatzsteuer-Identifikationsnummer aus dem Steuerberechnungsdienst ermittelt werden. Diese Funktion wird durch die Funktion Mehrere Umsatzsteuer-Identifikationsnummern unterstützen gesteuert. Weitere Informationen finden Sie unter Mehrere MwSt.-Registrierungsnummern.
Dabei müssen zwei Registrierungsnummern ermittelt und in dieser Funktion gespeichert werden: die Registrierungsnummer für die Steuerbehörde der aktuellen juristischen Person und die Registrierungsnummer der Gegenpartei. Wenn bei einer Transaktion kein Kunde oder Lieferant als Gegenpartei vorhanden ist, ist die Gegenpartei-Registrierungsnummer dafür nicht gültig.
Notiz
Es gibt nur eine Registrierungsnummer der juristischen Person und eine Registrierungsnummer der Gegenpartei für alle Zeilen in einer Transaktion. Der Großteil des Codes für diese Funktion wird in TaxIntegrationTaxIdActivityOnDocument.xpp
erstellt.
Datenbankschema
Die Datenfelder TaxId und PartyTaxId werden für die Datensatz-IDs der Registrierungsnummern verwendet. Diese beiden Felder werden den folgenden zugehörigen Tabellen hinzugefügt, um die Registrierungsnummern einer Transaktion zu speichern:
- TmpTaxWorkTrans
- SteuerUngebunden
- TaxTrans
- KundenlieferscheinJour
- CustInvoiceJour
- VerkaufenLieferscheinJour
- VerkaufRechnungJour
Die ersten drei Tabellen in der vorhergehenden Liste (steuerbezogene Tabellen) sind Tabellen auf Zeilenebene, während die letzten vier Tabellen auf Kopfebene sind, da eine Transaktion dieselbe Registrierungsnummer haben sollte.
Registrierungsnummer der juristischen Person
Die Registrierungsnummer der juristischen Person wird durch die Funktion Mehrere Umsatzsteuer-Identifikationsnummern unterstützen aktiviert. Für eine Neutransaktion ist hier nichts erforderlich. Wenn der Steuercode ermittelt ist, wird die Registrierungsnummer der juristischen Person durch die Registrierungsnummer ersetzt, die dem Abrechnungszeitraum dieses Steuercodes zugewiesen ist. Sie wird TaxIntegrationTaxIdActivityOnDocument::populateTaxLineTaxId()
ermittelt und zusammen mit dem Steuerergebnis in der Datenbank gespeichert.
Es gibt auch eine Validierungslogik für die Registrierungsnummer der juristischen Person, falls für unterschiedliche Zeilen in einer Transaktion unterschiedliche Registrierungsnummern ermittelt werden. Diese Validierung wird unter TaxIntegrationTaxIdActivityOnDocument::checkTaxIdConsistency()
durchgeführt.
Registriernummer der Gegenpartei
Die Kontrahenten-Registrierungsnummer wird vom Steuerberechnungsdienst ermittelt. Nach Eingang der Antwort wird die Nummer validiert und zusammen mit der Registrierungsnummer der juristischen Person in der Datenbank gespeichert. Wenn die vom Steuerberechnungsdienst ermittelte Nummer jedoch nicht in den Stammdaten des Benutzers enthalten ist, wird anstelle des zurückgegebenen Werts der Standardwert im Transaktionskopf in die Datenbank geschrieben. Die Kontrahenten-Registrierungsnummer wird nicht bei allen Transaktionen angewendet. Für diesen Ansatz ist jedoch eine zusätzliche Logik erforderlich.
Standardlogik
Es gibt eine Standardlogik von den Kunden- und Lieferantenstammdaten bis zum Transaktionskopf. Sie können die Steuerbefreiungsnummer Wert auf Kunden- und Lieferantenstammdatenebene. Beim Anlegen einer neuen Transaktion wird die standardmäßige Umsatzsteuer-Identifikationsnummer eingetragen. Sie können jedoch eine neue Nummer auswählen, um die Standardnummer zu überschreiben. Wenn die vom Steuerdienst zurückgegebene Nummer ungültig ist, wird die Nummer in der Kopfzeile vor der Steuerberechnung als Standardnummer verwendet.
Die Steuerbefreiungsnummer ist ein Zeichenfolgenfeld ( Umsatzsteuer-Identifikationsnummer) anstelle einer Datensatz-ID und verfügt über zwei Datenquellen. Eine Datenquelle ist die Steuerregistrierungsnummer, die andere die Steuerbefreiungsnummer. Die Steuerintegration unterstützt nur die Steuerregistrierungsnummer als Quelle. Zwei neue Felder, VATNumRecId Und VATNumTableType, sollten den entsprechenden Tabellen hinzugefügt werden, um den Datensatz zu unterscheiden.
Entscheiden Sie beim Hinzufügen einer neuen Transaktion, ob die Felder VATNum, VATNumRecId und VATNumTableType zur Transaktionskopftabelle hinzugefügt werden sollen. Wenn sie hinzugefügt werden sollen, fügen Sie auch die Tabelle hinzu TaxExemptVATNumMap
. Die Datensatz-ID und der Tabellentyp werden dann automatisch in der Kopftabelle gespeichert, wenn Benutzer in der Benutzeroberfläche (UI) eine Nummer auswählen.
Ein Entwickler muss die Standardlogik identifizieren und aufrufen copyPrimaryRegistrationNumberToVATMap
, um die beiden Felder in die neu erstellte Transaktionskopftabelle zu kopieren. Verwenden Sie als Beispiel in CustTable
den folgenden Standardcode von SalesTable
bis SalesTable.xpp
.
private void initRegistrationNumbers(CustTable _custTable)
{
this.vatNum = _custTable.getPrimaryRegistrationNumber(TaxRegistrationTypesList::TAXID);
_custTable.copyPrimaryRegistrationNumberToVATMap(this); // This line is to copy the new fields.
this.EnterpriseNumber = _custTable.getPrimaryRegistrationNumber(TaxRegistrationTypesList::UID);
}
Schaltfunktion
Ändern Sie die Switch-Funktion, um die neue Transaktion während der Journalisierung zu unterstützen:
TaxIntegrationUtils::isMultipleTaxIdEnabledForJournalV3(RefTableId _journalHeaderTableId, RefRecId _journalHeaderRecId, Tax _tax = null)
Wenn es keine Gegenpartei gibt oder die Registrierungsnummer der Gegenpartei auf die neue Transaktion nicht zutrifft, überspringen Sie die Gegenparteilogik bei
TaxIntegrationTaxIdActivityOnDocument::shouldSetPartyTaxId()
.protected static boolean shouldSetPartyTaxId(TaxIntegrationDocumentObject _document) { // Sales quotation for a prospect customer doesn't apply to the counterparty VAT ID if (_document.getHeadingTableId() == tableNum(SalesQuotationTable) && _document.getCustVendAccount() == '') return false; // Currently for purchase order and sales order, the party tax ID is set only if returned by the tax service. // For Transfer Order, its party tax ID isn't determined by the tax service and must be set for the first calculation round. return _document.isPartyTaxIdReturned() || ((_document.getBusinessProcess() == TaxIntegrationBusinessProcess::Inventory) && !(TaxInventTransferCalcTaxContext::current() && TaxInventTransferCalcTaxContext::current().parmShouldSkipSetPartyTaxId())) // If a default exists, always go through the tax ID process. || _document.getPartyTaxIdRecIdDefault(); }
Nummernkreisgruppe
Die Nummernkreisgruppe ist Bestandteil der Funktion Mehrere Umsatzsteuer-Identifikationsnummern . Wenn die Umsatzsteuer-Identifikationsnummer im Transaktionskopf aktualisiert wird, sollte auch die entsprechende Nummernkreisgruppe aktualisiert werden. Allerdings gilt das Update nicht für alle Transaktionen. Wenn die Nummernkreisgruppe in die neue Transaktion integriert werden soll, verwenden Sie das folgende Beispiel in der Datenpersistenzaktivität.
private void saveNumberSequenceGroupToTable()
{
NumberSequenceGroupId numberSequenceGroupId = document.getNumberSequenceGroupId();
if (numberSequenceGroupId && custInvoiceTable.numberSequenceGroup != numberSequenceGroupId)
{
ttsbegin;
custInvoiceTable.numberSequenceGroup = document.getNumberSequenceGroupId();
custInvoiceTable.doUpdate();
ttscommit;
}
}
Die Ermittlung erfolgt in der Steuer-ID-Aktivität für alle Transaktionen. Fügen Sie die Logik in der Datenpersistenzaktivität hinzu und rufen Sie sie auf, um die Nummernkreisgruppe beizubehalten.
Listencode
Der Listencode ähnelt der Umsatzsteuer-Identifikationsnummer der Gegenpartei, da beide vom Dienst ermittelt und in der Datenbank gespeichert werden. Die Listencodefunktion ist immer aktiviert, wenn die Listencode-Anwendbarkeitsmatrix im Regulatory Configuration Service (RCS) konfiguriert ist.
Datenabruf
Rufen Sie den Standardlistencode für TaxIntegrationDocument
ab. Fügen Sie in der copyToDocumentFromHeaderTable
Methode der neu erstellten Datenabrufklasse eine Zeile hinzu.
protected void copyToDocumentFromHeaderTable()
{
super();
...
document.setListCode(this.purchTable.ListCode);
...
}
Listencode der Karte zuordnen
In der Datenpersistenzklasse wird eine SalesPurchJournalTable
Map verwendet, um doppelten Code zu reduzieren. Ordnen Sie den Listencode aus der Kopftabelle der Karte zu.
<AxTableMapping>
<MappingTable>SalesPurchJournalTable</MappingTable>
<Connections>
...
<AxTableMappingConnection>
<MapField>ListCode</MapField>
<MapFieldTo>ListCode</MapFieldTo>
</AxTableMappingConnection>
</Connections>
</AxTableMapping>
Wenn Ihre Transaktionstabelle nicht dieser SalesPurchJournalTable
Zuordnung zugeordnet ist, schreiben Sie Ihre eigene Logik in die Datenpersistenzaktivität, um den Listencode zu aktualisieren.
Datenpersistenz
Rufen Sie die TaxIntegrationListCodeUtility::saveListCodeFromDocumentToTable()
Methode in der saveDocument
Methode der neu erstellten Datenpersistenzklasse auf.
/// <summary>
/// Saves the document.
/// </summary>
/// <returns>Always true.</returns>
protected boolean saveDocument()
{
TaxIntegrationTaxIdUtility::saveTaxIDFromDocumentToTable(document, salesTable);
TaxIntegrationListCodeUtility::saveListCodeFromDocumentToTable(document, salesTable);
return true;
}
Währungsumtausch, Rundung und Centdifferenzausgleich
Diese Funktion ist standardmäßig aktiviert. Legen Sie im Belegobjekt die Transaktionswährung, den festen Wechselkurs für die Berichtswährung und den festen Wechselkurs für die Buchhaltungswährung fest. Diese Aktion wird von der TaxIntegrationCurrencyExchangeActivityOnDocument
Aktivität ausgeführt, die ohne Bedingung in TaxIntegrationFacade
aufgerufen wird. Sie müssen nichts unternehmen, um diese Funktion zu nutzen.
Skonto
Wenn die Skontofunktion für die neue Transaktion in Ihren Finanz- und Betriebs-Apps bereits unterstützt wird, ermöglicht die Steuerintegration auch die Ermittlung der Skontoparameter durch den Steuerberechnungsdienst. Hier ist ein kurzer Überblick über den Vorgang zum Aktivieren dieser Funktionalität.
Suchen Sie in der Codebasis nach allen Referenzen zu Skontoparametern.
Ersetzen Sie die Referenzen der Skontoparameter durch Parameter aus dem Steuerberechnungsdienst. Die Parameter können auf zwei Arten abgerufen werden:
TaxIntegrationFacade:: getTaxJurisdictionParameters(RefTableId _sourceHeadingTableId, RefRecId _sourceHeadingRecId)
TaxIntegrationFacade::getTaxJurisdictionParametersByTable(Common _sourceHeadingTable)
Erweitern Sie die Switch-Funktionen, um die neue Transaktion zu ermöglichen:
TaxIntegrationUtils::shouldRetrieveCashDiscParametersFromTaxService(RefTableId _refTableId, RefRecId _refRecId)
TaxIntegrationUtils::getBusinessProcessBySourceHeadingTable(RefTableId _sourceHeadingTableId, RefRecId _sourceHeadingRecId)