Tax Filing Service

<back to all web services

BatchValidiereAuthentifiziereUndSendeAsync

AsyncBearbeiteVorgangValidiereAuthentifiziereSendeBatch

An asynchronous service to validate, authenticate and send tax data to the fiscal authorities.

Requires Authentication
The following routes are available for this service:
POST/BatchValidiereAuthentifiziereUndSendeAsync
<?php namespace dtos;

use DateTime;
use Exception;
use DateInterval;
use JsonSerializable;
use ServiceStack\{IReturn,IReturnVoid,IGet,IPost,IPut,IDelete,IPatch,IMeta,IHasSessionId,IHasBearerToken,IHasVersion};
use ServiceStack\{ICrud,ICreateDb,IUpdateDb,IPatchDb,IDeleteDb,ISaveDb,AuditBase,QueryDb,QueryDb2,QueryData,QueryData2,QueryResponse};
use ServiceStack\{ResponseStatus,ResponseError,EmptyResponse,IdResponse,ArrayList,KeyValuePair2,StringResponse,StringsResponse,Tuple2,Tuple3,ByteArray};
use ServiceStack\{JsonConverters,Returns,TypeContext};


/** @description Represents a structure that encapsulates a tax declaration. */
// @Api(Description="Represents a structure that encapsulates a tax declaration.")
class TaxData implements JsonSerializable
{
    public function __construct(
        /** @description The unique identifier of the tax data. */
        // @ApiMember(Description="The unique identifier of the tax data.", IsRequired=true)
        /** @var string */
        public string $id='',

        /** @description The XML-based tax declaration. */
        // @ApiMember(Description="The XML-based tax declaration.", IsRequired=true)
        /** @var string */
        public string $content=''
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['id'])) $this->id = $o['id'];
        if (isset($o['content'])) $this->content = $o['content'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->id)) $o['id'] = $this->id;
        if (isset($this->content)) $o['content'] = $this->content;
        return empty($o) ? new class(){} : $o;
    }
}

/** @description A base service to process a batch of tax data. */
// @Api(Description="A base service to process a batch of tax data.")
class BatchBearbeiteVorgangBase implements IPost, JsonSerializable
{
    public function __construct(
        /** @description The batch of tax data to process. */
        // @ApiMember(Description="The batch of tax data to process.", Name="Data")
        /** @var array<TaxData>|null */
        public ?array $data=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['data'])) $this->data = JsonConverters::fromArray('TaxData', $o['data']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->data)) $o['data'] = JsonConverters::toArray('TaxData', $this->data);
        return empty($o) ? new class(){} : $o;
    }
}

/** @description Represents a base class for a file with raw data. */
// @Api(Description="Represents a base class for a file with raw data.")
class FileBase implements JsonSerializable
{
    public function __construct(
        /** @description The raw data content of the file. */
        // @ApiMember(Description="The raw data content of the file.", Name="Content")
        /** @var ByteArray|null */
        public ?ByteArray $content=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['content'])) $this->content = JsonConverters::from('ByteArray', $o['content']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->content)) $o['content'] = JsonConverters::to('ByteArray', $this->content);
        return empty($o) ? new class(){} : $o;
    }
}

/** @description Represents a portal certificate that is protected by a password. */
// @Api(Description="Represents a portal certificate that is protected by a password.")
class PortalCertificate extends FileBase implements ISecuredCertificate, IHasIndex, JsonSerializable
{
    /**
     * @param ByteArray|null $content
     */
    public function __construct(
        ?ByteArray $content=null,
        /** @description The unique identifier of the certificate. */
        // @ApiMember(Description="The unique identifier of the certificate.")
        /** @var string */
        public string $id='',

        /** @description The position of the certificate element in an indexed collection of certificates. */
        // @ApiMember(Description="The position of the certificate element in an indexed collection of certificates.")
        /** @var int */
        public int $index=0,

        /** @description The password to protect the certificate from unauthorized access. */
        // @StringLength(255)
        // @ApiMember(Description="The password to protect the certificate from unauthorized access.")
        /** @var string|null */
        public ?string $pin=null,

        /** @description The description of the certificate. */
        // @StringLength(2147483647)
        // @ApiMember(Description="The description of the certificate.")
        /** @var string|null */
        public ?string $description=null,

        /** @description Tags that can be used to label or identify the certificate. */
        // @ApiMember(Description="Tags that can be used to label or identify the certificate.")
        /** @var array<string>|null */
        public ?array $tags=null,

        /** @description Gets or sets the file name of the certificate. */
        // @ApiMember(Description="Gets or sets the file name of the certificate.")
        /** @var string|null */
        public ?string $name=null
    ) {
        parent::__construct($content);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['id'])) $this->id = $o['id'];
        if (isset($o['index'])) $this->index = $o['index'];
        if (isset($o['pin'])) $this->pin = $o['pin'];
        if (isset($o['description'])) $this->description = $o['description'];
        if (isset($o['tags'])) $this->tags = JsonConverters::fromArray('string', $o['tags']);
        if (isset($o['name'])) $this->name = $o['name'];
        if (isset($o['content'])) $this->content = JsonConverters::from('ByteArray', $o['content']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->id)) $o['id'] = $this->id;
        if (isset($this->index)) $o['index'] = $this->index;
        if (isset($this->pin)) $o['pin'] = $this->pin;
        if (isset($this->description)) $o['description'] = $this->description;
        if (isset($this->tags)) $o['tags'] = JsonConverters::toArray('string', $this->tags);
        if (isset($this->name)) $o['name'] = $this->name;
        if (isset($this->content)) $o['content'] = JsonConverters::to('ByteArray', $this->content);
        return empty($o) ? new class(){} : $o;
    }
}

/** @description A base service to validate, authenticate and send tax data to the fiscal authorities. */
// @Api(Description="A base service to validate, authenticate and send tax data to the fiscal authorities.")
class BatchValidiereAuthentifiziereUndSendeBase extends BatchBearbeiteVorgangBase implements IVeschlueselungsRequest, ISendeRequest, JsonSerializable
{
    /**
     * @param array<TaxData>|null $data
     */
    public function __construct(
        ?array $data=null,
        /** @description The authentification certificate. */
        // @ApiMember(Description="The authentification certificate.", Name="Zertifikat")
        /** @var PortalCertificate|null */
        public ?PortalCertificate $zertifikat=null,

        /** @description Gets or sets the retrieval code. This value MUST be given for the tax operation ElsterDatenabholung and tax data type ElsterVaStDaten, for which a SoftPSE certificate is used to sign.In other cases a null value should be given. It consists of 2 x 5 characters, which are joined by  '-'. Example: 'K6FG5 - RS32P'. */
        // @ApiMember(Description="Gets or sets the retrieval code. This value MUST be given for the tax operation ElsterDatenabholung and tax data type ElsterVaStDaten, for which a SoftPSE certificate is used to sign.In other cases a null value should be given. It consists of 2 x 5 characters, which are joined by  '-'. Example: 'K6FG5 - RS32P'.", Name="AbrufCode")
        /** @var string|null */
        public ?string $abrufCode=null,

        /** @description The details of the provider that submits tax data. */
        // @ApiMember(Description="The details of the provider that submits tax data.", Name="DatenLieferant")
        /** @var string|null */
        public ?string $datenLieferant=null,

        /** @description Should the processing of the tax data be staged? If true, tax data is not sent to the production ELSTER servers. */
        // @ApiMember(Description="Should the processing of the tax data be staged? If true, tax data is not sent to the production ELSTER servers.", Name="StagingEnabled")
        /** @var bool|null */
        public ?bool $stagingEnabled=null
    ) {
        parent::__construct($data);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['zertifikat'])) $this->zertifikat = JsonConverters::from('PortalCertificate', $o['zertifikat']);
        if (isset($o['abrufCode'])) $this->abrufCode = $o['abrufCode'];
        if (isset($o['datenLieferant'])) $this->datenLieferant = $o['datenLieferant'];
        if (isset($o['stagingEnabled'])) $this->stagingEnabled = $o['stagingEnabled'];
        if (isset($o['data'])) $this->data = JsonConverters::fromArray('TaxData', $o['data']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->zertifikat)) $o['zertifikat'] = JsonConverters::to('PortalCertificate', $this->zertifikat);
        if (isset($this->abrufCode)) $o['abrufCode'] = $this->abrufCode;
        if (isset($this->datenLieferant)) $o['datenLieferant'] = $this->datenLieferant;
        if (isset($this->stagingEnabled)) $o['stagingEnabled'] = $this->stagingEnabled;
        if (isset($this->data)) $o['data'] = JsonConverters::toArray('TaxData', $this->data);
        return empty($o) ? new class(){} : $o;
    }
}

/** @description An asynchronous service to validate, authenticate and send tax data to the fiscal authorities. */
// @Api(Description="An asynchronous service to validate, authenticate and send tax data to the fiscal authorities.")
class BatchValidiereAuthentifiziereUndSendeAsync extends BatchValidiereAuthentifiziereUndSendeBase implements JsonSerializable
{
    /**
     * @param array<TaxData>|null $data
     * @param PortalCertificate|null $zertifikat
     * @param string|null $abrufCode
     * @param string|null $datenLieferant
     * @param bool|null $stagingEnabled
     * @param array<TaxData>|null $data
     */
    public function __construct(
        ?array $data=null,
        ?PortalCertificate $zertifikat=null,
        ?string $abrufCode=null,
        ?string $datenLieferant=null,
        ?bool $stagingEnabled=null,
        ?array $data=null
    ) {
        parent::__construct($data,$zertifikat,$abrufCode,$datenLieferant,$stagingEnabled,$data);
    }

    /** @throws Exception */
    public function fromMap($o): void {
        parent::fromMap($o);
        if (isset($o['zertifikat'])) $this->zertifikat = JsonConverters::from('PortalCertificate', $o['zertifikat']);
        if (isset($o['abrufCode'])) $this->abrufCode = $o['abrufCode'];
        if (isset($o['datenLieferant'])) $this->datenLieferant = $o['datenLieferant'];
        if (isset($o['stagingEnabled'])) $this->stagingEnabled = $o['stagingEnabled'];
        if (isset($o['data'])) $this->data = JsonConverters::fromArray('TaxData', $o['data']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = parent::jsonSerialize();
        if (isset($this->zertifikat)) $o['zertifikat'] = JsonConverters::to('PortalCertificate', $this->zertifikat);
        if (isset($this->abrufCode)) $o['abrufCode'] = $this->abrufCode;
        if (isset($this->datenLieferant)) $o['datenLieferant'] = $this->datenLieferant;
        if (isset($this->stagingEnabled)) $o['stagingEnabled'] = $this->stagingEnabled;
        if (isset($this->data)) $o['data'] = JsonConverters::toArray('TaxData', $this->data);
        return empty($o) ? new class(){} : $o;
    }
}

PHP BatchValidiereAuthentifiziereUndSendeAsync DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /BatchValidiereAuthentifiziereUndSendeAsync HTTP/1.1 
Host: taxfiling.pwc.de 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	zertifikat: 
	{
		id: 00000000000000000000000000000000,
		index: 0,
		pin: String,
		description: String,
		tags: 
		[
			String
		],
		name: String,
		content: AA==
	},
	abrufCode: String,
	datenLieferant: String,
	stagingEnabled: False,
	data: 
	[
		{
			id: String,
			content: String
		}
	]
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

[
	{
		rueckgabe: 
		{
			erfolg: 
			{
				telenummer: 
				[
					String
				],
				ordnungsbegriffe: 
				[
					String
				]
			},
			transfers: 
			{
				transferList: 
				[
					{
						transferTicket: String
					}
				]
			},
			fehlerRegelpruefungen: 
			[
				{
					nutzdatenticket: String,
					feldidentifikator: String,
					mehrfachzeilenindex: String,
					lfdNrVordruck: String,
					vordruckZeilennummer: String,
					semantischeIndexes: 
					[
						{
							name: String,
							value: String
						}
					],
					untersachbereich: String,
					privateKennnummer: String,
					regelName: String,
					fachlicheFehlerId: String,
					text: String
				}
			],
			hinweise: 
			[
				{
					nutzdatenticket: String,
					feldidentifikator: String,
					mehrfachzeilenindex: String,
					lfdNrVordruck: String,
					vordruckZeilennummer: String,
					semantischeIndexes: 
					[
						{
							name: String,
							value: String
						}
					],
					untersachbereich: String,
					privateKennnummer: String,
					regelName: String,
					fachlicheHinweisId: String,
					text: String
				}
			]
		},
		serverantwort: 
		{
			transferHeader: 
			{
				version: String,
				verfahren: ElsterAnmeldung,
				datenArt: 34a,
				vorgang: send-Auth,
				transferTicket: String,
				testmerker: 0,
				sigUser: 
				{
					inhalt: {}
				},
				empfaenger: 
				{
					id: String,
					ziel: BW
				},
				herstellerID: String,
				datenLieferant: String,
				eingangsDatum: 0001-01-01,
				datei: 
				{
					verschluesselung: PKCS#7v1.5,
					kompression: GZIP,
					transportSchluessel: String,
					erstellung: 
					{
						eric: 
						{
							inhalt: {}
						}
					}
				},
				rc: 
				{
					rueckgabe: 
					{
						code: String,
						text: String
					},
					stack: 
					{
						code: String,
						text: String
					}
				},
				versionClient: String,
				zusatz: 
				{
					infos: 
					[
						String
					],
					elsterInfos: 
					[
						String
					]
				}
			},
			datenTeil: 
			{
				nutzdatenbloecke: 
				[
					{
						nutzdatenHeader: 
						{
							version: String,
							nutzdatenTicket: String,
							empfaenger: 
							{
								id: L,
								value: String
							},
							hersteller: 
							{
								produktName: String,
								produktVersion: String
							},
							datenLieferant: String,
							rc: 
							{
								rueckgabe: 
								{
									code: String,
									text: String
								},
								stack: 
								{
									code: String,
									text: String
								}
							},
							zusatz: 
							{
								infos: 
								[
									String
								],
								elsterInfos: 
								[
									String
								]
							}
						},
						nutzdaten: 
						{
							inhalt: {}
						}
					}
				]
			}
		},
		transferProtocols: 
		[
			{
				metadata: 
				{
					name: String,
					fullName: String,
					lastAccessTime: 0001-01-01,
					lastAccessTimeUtc: 0001-01-01,
					lastWriteTime: 0001-01-01,
					lastWriteTimeUtc: 0001-01-01,
					length: 0,
					userId: 0,
					groupId: 0,
					othersCanRead: False,
					groupCanExecute: False,
					groupCanWrite: False,
					groupCanRead: False,
					ownerCanExecute: False,
					ownerCanWrite: False,
					ownerCanRead: False,
					othersCanExecute: False,
					othersCanWrite: False,
					extensions: 
					{
						String: String
					}
				},
				name: String,
				content: AA==
			}
		],
		statusCode: ERIC_OK,
		statusText: String,
		id: String,
		index: 0,
		responseStatus: 
		{
			errorCode: String,
			message: String,
			stackTrace: String,
			errors: 
			[
				{
					errorCode: String,
					fieldName: String,
					message: String,
					meta: 
					{
						String: String
					}
				}
			],
			meta: 
			{
				String: String
			}
		}
	}
]