Verointegroinnin tehtävien toteuttaminen

Tässä artikkelissa on tietoja siitä, miten uuden tapahtuman pakolliset toimenpiteet toteutetaan.

Tehtävät ovat luokkia, jotka viimeistelevat työn verointegraatissa. Tiedosto-objekti TaxIntegrationDocumentObject on välitetty tehtävästä toimintoon. Tehtävä suoritetaan kohteen metatiedoissa TaxIntegrationDocumentObject. Kaikki verointegriteettitoiminnot TaxIntegrationAbstractActivity laajentavat luokan, ja ne voidaan liittää sarjaan ja suorittaa TaxIntegrationFacade::calculate() seuraavassa järjestyksessä.

Kaikkia tehtäviä ei saa ottaa käyttöön tai muokata uuden tapahtuman integroimista varten. Useimmissa tapauksissa riittää kaksi tiettyä tointa: TaxIntegrationDataRetrievalActivityOnDocument TaxIntegrationDataPersistenceActivityOnDocument Jos uudelle tapahtumalle on otettu käyttöön uusia ominaisuuksia , katso lisätietoja verointegraaton käyttöönottamisen ominaisuuksista.

Tietojen noutaminen

Tietojen noutaminen (TaxIntegrationDataPersistenceActivityOnDocument) kopioi kaikki metatiedot, joita tarvitaan veron laskentaan tietokannasta objektiin TaxIntegrationDocumentObject .

Tämä tehtävä muodostaa ja kutsuu sitten TaxIntegrationAbstractDataRetrievalTemplate luokan tapahtumakohtaista alaluokkaa sen mukaan, HeadingTableId mikä on käsiteltävän tapahtuman arvo tehtaassa. Seuraavaksi aliluokka suorittaa kyselyitä kaikista tapahtumariveistä, kuluista ja muista tietokannan käyttökelpoisista tiedoista ja tallentaa tiedot tiedostokohteelle.

Aloita tietojen noutaminen luomalla ja panemalla käyttöön uusi aliluokka TaxIntegrationAbstractDataRetrievalTemplate. Anna aliluonnille nimi, esimerkiksi TaxIntegration***DataRetrieval. Seuraavassa luettelossa on integroitujen tapahtumien tietojen noutaminenluokkia:

  • AxClass/TaxIntegrationPurchTableDataRet myösval
  • AxClass/TaxIntegrationPurchParmTableDataRet myösval
  • AxClass/TaxIntegrationPurchREQTableDataRet myösval
  • AxClass/TaxIntegrationPurchRFQTableDataRet myösval
  • AxClass/TaxIntegrationVendInvoiceInfoTableDataRetraporttival
  • AxClass/TaxIntegrationSalesTableDataRet myösval
  • AxClass/TaxIntegrationSalesParmDataRet myösval

Nimet koostuvat Etuliite TaxIntegration-integratiosta, tapahtuman otsikkotaulun nimestä ja sitten DataRetlokivalista. Jos vapaatekstilaskutapahtuma on integroittava, TaxIntegrationCustInvoiceTableRetrieval luokka tulee ottaa käyttöön.

Tietojen noutaminen -luokan käyttöönotaminen

Tässä osassa esitellään tietojen noutaminenluokan käyttöönotto. Sitä käytetään TaxIntegrationPurchTableDataRetrieval esimerkinä tämän luokan pääpiirteittäin.

[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)
    ...
}

Ilmoitus

Seuraava esimerkki on peräisin TaxIntegrationPurchTableDataRetrieval.xpp.

/// <summary>
/// The <c>TaxIntegrationPurchTableDataRetrieval</c> class retrieves data from <c>PurchTable</c>, etc.
/// </summary>
[TaxIntegrationDataRetrieval(tableStr(PurchTable))]
public class TaxIntegrationPurchTableDataRetrieval
    extends TaxIntegrationAbstractDataRetrievalTemplate
{
    // ...

Luokka ilmoitetaan määritteen avulla [TaxIntegrationDataRetrieval(tableStr(PurchTable))] . Sitä käytetään tämän TaxIntegrationDataRetrievalActivityOnDocument luokan valmistamaan ja kutsumaan sitä tehtaan mallin mukaan. Taulun nimen tulee olla tapahtumaotsikon taulu, HeadingTableId ja taulun tunnuksen tulee olla sama kuin objektissa alustettu TaxIntegrationDocumentObject arvo.

Katso tässä actStatic esitettyä TaxIntegrationDataRetrievalActivityOnDocument.xpp menetelmää.

protected static void actStatic(TaxIntegrationDocumentObject _document)
{
    // ...
    TaxIntegrationAbstractDataRetrievalTemplate dataRetrievalInstance = SysExtensionAppClassFactory::getClassFromSysAttributeWithInstantiationStrategy(
        classStr(TaxIntegrationAbstractDataRetrievalTemplate),
        new TaxIntegrationDataRetrievalAttribute(tableId2Name(_document.getLocalTableId())),
        new SysExtensionGenericInstantiation(_document));
    /// ...
    dataRetrievalInstance.execute();
}

Ilmoita kullekin tapahtumalle vähintään kaksi taulua. Tämän tapahtuman otsikkotaulu ja rivitaulu on ilmoitettu. (Esimerkiksi ostotilauksissa taulut ovat ja PurchTable PurchLine.) Jos muiden taulujen kenttiä käytetään laskentaan syötteenä, ne näytetään tässä.

[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;

Kyselyobjektin luominen

Verointegra tämän menetelmän avulla voit tehdä kyselyitä verointegroinnissa SysDaQuery . Useiden menetelmien käytön jälkeen get***QueryObject() verointegrointikehys kutsui näitä menetelmiä, hakee tiedot tietokannasta ja liittää sen aiemmin ilmoitettuun taulun puskuriin.

Kyselyobjekteja on muotoiltava neljä, jotta voit suorittaa seuraavat kyselyt:

  • Suorittaa kyselyn otsikon tason tauluista ja HeadingTableId niiden HeadingRecId arvoista TaxIntegrationDocumentObject. Otsikkotason taulut viittaavat tauluihin, jotka liittyvät tapahtuman otsikkotauluun (esimerkiksi PurchTable ostotilauksiin). Jos tiedosto-objekti rakennetaan tietueen avulla TaxIntegrationDocumentObject::constructWithRecord(Common _record), määritä otsikkotaulu suoraan puskuriin this.document.getLocalRecord() . Otsikkotaulua ei tarvitse kysellä uudelleen.
  • Kysele rivitaulua otsikkotaulun ja rivitaulun välisen suhteen mukaan, kun otsikkotaulun puskuri on annettu.
  • Kysele otsikkokulua (MarkupTrans).
  • Kysele rivikulua (MarkupTrans).

Seuraava esimerkki on peräisin 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();
}

Muistiinpano

Jos muiden taulujen kenttiä tarvitaan, liitä ne kyselyobjektiin. Edellisessä esimerkissä tätä menetelmää käytetään menetelmässä transportationDocument getDocumentQueryObject() .

Riviobjektin muodostaminen

/// <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);
}

Muodosta objekti TaxIntegrationLineObject rivin taulun tunnuksen ja tietuetunnuksen avulla. Tätä menetelmää kutsutaan kehykseksi. Korvaa uuden tapahtuman taulun puskurin.

Menetelmien kopioiminen

Kopioinnin aloittamista useiden menetelmien on oltava käytössä, jotta metatietoja voidaan kopioida taulun puskurista tiedosto-objektiin. Lisätietoja on kohdassa Tietojen hakeminen tietokannasta. Koska on luotava uusia luokkia, laajennusten tiedot voidaan ohittaa.

Kun käytät menetelmiä, määritä, mitkä kentät veron laskentapalvelu edellyttää, ja kopioi vain pakolliset kentät. Lisätietoja uusien kenttien lisäämiseen on kohdassa Tietomuuttujan lisääminen objektiluokkaan. Lisätietoja niiden lisäämiseen pyyntöön on kohdassa Tietojen lisääminen pyyntöön.

Tietojen säilyvyystehtävä

Kun tietojen säilymistehtävä (TaxIntegrationDataPersistenceActivityOnDocument) suoritetaan, veron laskentapalvelua kutsutaan. Vastaus käsitellään ja tallennetaan TaxIntegrationDocumentObject. Tietojen säilyvyystehtävän tehtävä on päivittää tarvittavat metatiedot vastauksena tietokantaan. Metatietoja ovat veron laskentatulokset, veroryhmä, veronimikeryhmä, ALV-tunnus ja luettelokoodi.

Tietojen noudon luokan TaxIntegrationDataPersistenceActivityOnDocument lisäksi myös rakentaa ja kutsuu HeadingTableId tietojen säilymisluokkaa käsiteltävän tapahtuman arvon mukaisesti. Tässä on otettava käyttöön TaxIntegration***DataPersistence luokka. Luokka on esimerkiksi käytössä TaxIntegrationCustInvoiceTableDataPersistence vapaatekstilaskuissa.

Toisin kuin tietojen noutaminen, TaxIntegrationDataPersistenceActivityOnDocument tekee kuitenkin itse suurimman osan pysyvyydestään eli verolaskennan tuloksesta. Tätä osaa käsitellään vakiokoodilla. Uutta tapahtumaa integroitaessa ei tarvita lisätyötä.

Uusi pysyvuusluokka tallentaa tapahtumakohtaiset kentät (kuten veroryhmän, veronimikeryhmän, ALV-tunnuksen, numerosarjaryhmän ja luettelokoodin) tietokantaan.

Seuraavassa esimerkissä esitetään perusrakenne 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)
    ...
}

Kuten edellinen esimerkki osoittaa, tietojen säilyvyysluokka muistuttaa tietojen noudon luokan rakennetta. Ainoa ero on se , että tietojen noutaminenluokka kopioi tiedot tietokannasta tiedosto-objektiin, kun taas tietojen säilyvyysluokka kopioi tietoja tiedosto-objektista tietokantaan. Seuraavassa on lyhyt esittely käyttöönotosta. Kaikkia koodiesimerkkejä ei liitetä.

  • [TaxIntegrationDataPersistence(tableStr(PurchTable))] on attribuutti, TaxIntegrationDataPersistenceActivityOnDocument joka rakennetaan tehtaassa.

  • QueryObject on lähes sama kuin tietojen noutaminen, lukuun ottamatta kahta pistettä:

    • .forUpdate() -luokkaa kutsutaan pysyväksi päivittämään tiedot tietokantaan.
    • Taulua Less käytetään, koska se on päivitettävä.
  • Menetelmä getLine() muistuttaa tietojen constructLine() noudon luokan menetelmää. Taulun nimi voidaan kuitenkin korvata uudella tapahtumataululla.

  • Menetelmät, jotka alkavat käyttäen tallennusta, ovat tämän luokan päätyö. Lisätietoja on seuraavassa osassa.

Tallenna menetelmät

Seuraava esimerkki on peräisin 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;
}

Menetelmä saveDocument() päivittää otsikkotaulun kentät, kun taas menetelmä saveLine() päivittää tapahtumarivin taulun kentät.

Tällä hetkellä alv-tunnus, numerosarjaryhmä ja luettelokoodi päivitetään otsikkotauluun. Menetelmässä saveLine() on päivitettävä veron laskentapalvelun palauttama veroryhmä ja nimikkeen veroryhmä. Tämä vaatimus koskee useimpia tapahtumia.

Muistiinpano

Jotta vältyt ylimääräisellä logiikalla, käytä doUpdate() sitä. update()