/**
  * @param Response $response
  *
  * @return Transaction{}
  */
 public static function map(Response $response)
 {
     // Get the raw DOMDocument response
     $responseDOM = $response->getResponseDocument();
     // All tags for the transaction
     $transactionTags = array('code' => 'setCode', 'currency' => 'setCurrency', 'date' => 'setDate', 'period' => 'setPeriod', 'invoicenumber' => 'setInvoiceNumber', 'office' => 'setOffice', 'duedate' => 'setDueDate', 'origin' => 'setOrigin', 'number' => 'setNumber', 'freetext1' => 'setFreetext1', 'freetext2' => 'setFreetext2', 'freetext3' => 'setFreetext3');
     // Make new Transaction Object
     $transactions = array();
     // Get the top level transaction element
     $transactionElements = $responseDOM->getElementsByTagName('transaction');
     foreach ($transactionElements as $transactionElement) {
         // create new transaction
         $transaction = new Transaction();
         // set the result
         $result = $transactionElement->getAttribute('result');
         $transaction->setResult($result);
         // Set the destiny/location
         $location = $transactionElement->getAttribute('location');
         $transaction->setDestiny($location);
         // Set the raise warning
         $raiseWarning = $transactionElement->getAttribute('raisewarning');
         $transaction->setRaiseWarning($raiseWarning);
         // Go through each tag and call the method if a value is set
         foreach ($transactionTags as $tag => $method) {
             $_tag = $transactionElement->getElementsByTagName($tag)->item(0);
             if (isset($_tag) && isset($_tag->textContent)) {
                 $transaction->{$method}($_tag->textContent);
             }
             // msg
             if (isset($_tag) && $_tag->hasAttribute('msg')) {
                 $message = new Message();
                 $message->setType($_tag->getAttribute('msgtype'));
                 $message->setMessage($_tag->getAttribute('msg'));
                 $message->setField($tag);
                 $transaction->addMessage($message);
             }
         }
         $lineTags = array('dim1' => 'setDim1', 'dim2' => 'setDim2', 'value' => 'setValue', 'debitcredit' => 'setDebitCredit', 'description' => 'setDescription', 'rate' => 'setRate', 'basevalue' => 'setBaseValue', 'reprate' => 'setRepRate', 'vatcode' => 'setVatCode', 'vattotal' => 'setVatTotal', 'vatvalue' => 'setVatValue', 'vatbasetotal' => 'setVatBaseTotal', 'customersupplier' => 'setCustomerSupplier', 'basevalueopen' => 'setBaseValueOpen', 'valueopen' => 'setValueOpen', 'repvalue' => 'setRepValue', 'matchlevel' => 'setMatchLevel', 'matchstatus' => 'setMatchStatus');
         foreach ($transactionElement->getElementsByTagName('line') as $lineDOM) {
             $temp_line = new TransactionLine();
             $lineType = $lineDOM->getAttribute('type');
             $temp_line->setType($lineType);
             $lineID = $lineDOM->getAttribute('id');
             $temp_line->setID($lineID);
             foreach ($lineTags as $tag => $method) {
                 $_tag = $lineDOM->getElementsByTagName($tag)->item(0);
                 if (isset($_tag) && isset($_tag->textContent)) {
                     $temp_line->{$method}($_tag->textContent);
                 }
             }
             $transaction->addLine($temp_line);
             unset($lineType);
             unset($temp_line);
         }
         // add
         $transactions[] = $transaction;
     }
     // for backwards compatibility, return only the first instance if there is only one
     return count($transactions) == 1 ? $transactions[0] : $transactions;
 }
 /**
  * Turns a passed Transaction class into the required markup for interacting
  * with Twinfield.
  *
  * This method doesn't return anything, instead just adds the transaction
  * to this DOMDocument instance for submission usage.
  *
  * @param \Pronamic\Twinfield\Transaction\Transaction $transaction
  */
 public function addTransaction(Transaction $transaction)
 {
     // Transaction
     $transactionElement = $this->createElement('transaction');
     $transactionElement->setAttribute('destiny', $transaction->getDestiny());
     $this->transactionsElement->appendChild($transactionElement);
     // Header
     $headerElement = $this->createElement('header');
     $transactionElement->appendChild($headerElement);
     $officeElement = $this->createElement('office', $transaction->getOffice());
     $headerElement->appendChild($officeElement);
     $codeElement = $this->createElement('code', $transaction->getCode());
     $headerElement->appendChild($codeElement);
     $dateElement = $this->createElement('date', $transaction->getDate());
     $headerElement->appendChild($dateElement);
     if ($transaction->getPeriod() !== null) {
         $periodElement = $this->createElement('period', $transaction->getPeriod());
         $headerElement->appendChild($periodElement);
     }
     if ($transaction->getInvoiceNumber() !== null) {
         $invoiceNumberElement = $this->createElement('invoicenumber', $transaction->getInvoiceNumber());
         $headerElement->appendChild($invoiceNumberElement);
     }
     if ($transaction->getDueDate() !== null) {
         $dueDateElement = $this->createElement('duedate', $transaction->getDueDate());
         $headerElement->appendChild($dueDateElement);
     }
     if ($transaction->getFreetext1() !== null) {
         $freetext1Element = $this->createElement('freetext1', $transaction->getFreetext1());
         $headerElement->appendChild($freetext1Element);
     }
     if ($transaction->getFreetext2() !== null) {
         $freetext2Element = $this->createElement('freetext2', $transaction->getFreetext2());
         $headerElement->appendChild($freetext2Element);
     }
     if ($transaction->getFreetext3() !== null) {
         $freetext3Element = $this->createElement('freetext3', $transaction->getFreetext3());
         $headerElement->appendChild($freetext3Element);
     }
     $linesElement = $this->createElement('lines');
     $transactionElement->appendChild($linesElement);
     // Lines
     foreach ($transaction->getLines() as $transactionLine) {
         /* @var $transactionLine \Pronamic\Twinfield\Transaction\TransactionLine */
         $lineElement = $this->createElement('line');
         $lineElement->setAttribute('type', $transactionLine->getType());
         $lineElement->setAttribute('id', $transactionLine->getID());
         $linesElement->appendChild($lineElement);
         $dim1Element = $this->createElement('dim1', $transactionLine->getDim1());
         $dim2Element = $this->createElement('dim2', $transactionLine->getDim2());
         $value = $transactionLine->getValue();
         $value = number_format($value, 2, '.', '');
         $valueElement = $this->createElement('value', $value);
         $debitCreditElement = $this->createElement('debitcredit', $transactionLine->getDebitCredit());
         if ($transactionLine->getType() != 'total' && $transactionLine->getVatCode() !== null) {
             $vatCodeElement = $this->createElement('vatcode', $transactionLine->getVatCode());
             $lineElement->appendChild($vatCodeElement);
         }
         $descriptionNode = $this->createTextNode(substr($transactionLine->getDescription(), 0, 40));
         $descriptionElement = $this->createElement('description');
         $descriptionElement->appendChild($descriptionNode);
         $lineElement->appendChild($dim1Element);
         $lineElement->appendChild($dim2Element);
         $lineElement->appendChild($valueElement);
         $lineElement->appendChild($debitCreditElement);
         $invoicenumber = $transactionLine->getInvoicenumber();
         if (!empty($invoicenumber)) {
             $invoicenumberElement = $this->createElement('invoicenumber', $invoicenumber);
             $lineElement->appendChild($invoicenumberElement);
         }
         $performanceType = $transactionLine->getPerformanceType();
         if (!empty($performanceType)) {
             $perfElement = $this->createElement('performancetype', $performanceType);
             $lineElement->appendChild($perfElement);
         }
         $currencyDate = $transactionLine->getCurrencyDate();
         if (!empty($currencyDate)) {
             $currencyDateElement = $this->createElement('currencydate', $currencyDate);
             $lineElement->appendChild($currencyDateElement);
         }
         $vatValue = $transactionLine->getVatValue();
         if (!empty($vatValue)) {
             $vatElement = $this->createElement('vatvalue', $vatValue);
             $lineElement->appendChild($vatElement);
         }
         $lineElement->appendChild($descriptionElement);
     }
 }