Skip to content

Commit c6fc4dc

Browse files
author
Willem Stuursma-Ruwen
authored
Merge pull request #199 from rojtjo/fix/transaction-optional-dim1
Handle TypeError when dim1 is omitted on VAT lines
2 parents 1f8c16b + 09567f7 commit c6fc4dc

File tree

2 files changed

+236
-2
lines changed

2 files changed

+236
-2
lines changed

src/DomDocuments/TransactionsDocument.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,11 @@ public function addTransaction(BaseTransaction $transaction)
124124
$lineElement->setAttribute('id', $transactionLine->getId());
125125
$linesElement->appendChild($lineElement);
126126

127-
$dim1Element = $this->createNodeWithTextContent('dim1', $transactionLine->getDim1());
128-
$lineElement->appendChild($dim1Element);
127+
$dim1 = $transactionLine->getDim1();
128+
if (!empty($dim1)) {
129+
$dim1Element = $this->createNodeWithTextContent('dim1', $dim1);
130+
$lineElement->appendChild($dim1Element);
131+
}
129132

130133
$dim2 = $transactionLine->getDim2();
131134
if (!empty($dim2)) {
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpTwinfield\UnitTests;
6+
7+
use DateTimeImmutable;
8+
use Money\Currency;
9+
use Money\Money;
10+
use PhpTwinfield\BaseTransaction;
11+
use PhpTwinfield\CashTransaction;
12+
use PhpTwinfield\CashTransactionLine;
13+
use PhpTwinfield\DomDocuments\TransactionsDocument;
14+
use PhpTwinfield\Enums\Destiny;
15+
use PhpTwinfield\Enums\LineType;
16+
use PhpTwinfield\JournalTransaction;
17+
use PhpTwinfield\JournalTransactionLine;
18+
use PhpTwinfield\Office;
19+
use PhpTwinfield\PurchaseTransaction;
20+
use PhpTwinfield\PurchaseTransactionLine;
21+
use PhpTwinfield\SalesTransaction;
22+
use PhpTwinfield\SalesTransactionLine;
23+
use PHPUnit\Framework\TestCase;
24+
use TypeError;
25+
26+
final class TransactionsDocumentUnitTest extends TestCase
27+
{
28+
/**
29+
* @test
30+
* @dataProvider transactionsProvider
31+
*/
32+
public function vat_transaction_line_dim1_can_be_empty(BaseTransaction $transaction): void
33+
{
34+
$caughtException = null;
35+
$document = new TransactionsDocument();
36+
37+
try {
38+
$document->addTransaction($transaction);
39+
} catch (TypeError $e) {
40+
$caughtException = $e;
41+
}
42+
43+
$this->assertNull($caughtException);
44+
}
45+
46+
public function transactionsProvider(): array
47+
{
48+
return [
49+
'cash transaction' => [$this->fakeCashTransactionWithoutDim1OnVatLine()],
50+
'journal transaction' => [$this->fakeJournalTransactionWithoutDim1OnVatLine()],
51+
'purchase transaction' => [$this->fakeSalesTransactionWithoutDim1OnVatLine()],
52+
'sales transaction' => [$this->fakeSalesTransactionWithoutDim1OnVatLine()],
53+
];
54+
}
55+
56+
private function fakeCashTransactionWithoutDim1OnVatLine(): CashTransaction
57+
{
58+
$cashTransaction = new CashTransaction();
59+
$cashTransaction
60+
->setOffice(Office::fromCode('001'))
61+
->setDestiny(Destiny::TEMPORARY())
62+
->setRaiseWarning(false)
63+
->setCode('CASH')
64+
->setCurrency(new Currency('EUR'))
65+
->setDate(new DateTimeImmutable('2013-11-04'))
66+
->setStatementnumber(4)
67+
->setStartvalue(Money::EUR(97401));
68+
69+
$totalLine = new CashTransactionLine();
70+
$totalLine
71+
->setLineType(LineType::TOTAL())
72+
->setId(1)
73+
->setDim1('1002')
74+
->setValue(Money::EUR(12100));
75+
76+
$detailLine = new CashTransactionLine();
77+
$detailLine
78+
->setLineType(LineType::DETAIL())
79+
->setId(2)
80+
->setDim1('1300')
81+
->setDim2('1000')
82+
->setValue(Money::EUR(10000))
83+
->setVatCode('VH')
84+
->setInvoiceNumber('11001770')
85+
->setDescription('Invoice paid');
86+
87+
$vatLine = new CashTransactionLine();
88+
$vatLine
89+
->setLineType(LineType::VAT())
90+
->setId(3)
91+
->setValue(Money::EUR(2100))
92+
->setVatCode('VH');
93+
94+
$cashTransaction
95+
->addLine($totalLine)
96+
->addLine($detailLine)
97+
->addLine($vatLine);
98+
99+
return $cashTransaction;
100+
}
101+
102+
private function fakeJournalTransactionWithoutDim1OnVatLine(): JournalTransaction
103+
{
104+
$journalTransaction = new JournalTransaction();
105+
$journalTransaction
106+
->setDestiny(Destiny::TEMPORARY())
107+
->setCode('MEMO')
108+
->setCurrency(new Currency('EUR'))
109+
->setDate(new \DateTimeImmutable('2013-11-04'))
110+
->setOffice(Office::fromCode('001'));
111+
112+
$detailLine = new JournalTransactionLine();
113+
$detailLine
114+
->setLineType(LineType::DETAIL())
115+
->setId(2)
116+
->setDim1('1300')
117+
->setDim2('1000')
118+
->setValue(Money::EUR(10000))
119+
->setVatCode('VH')
120+
->setInvoiceNumber('11001770')
121+
->setDescription('Invoice paid');
122+
123+
$vatLine = new JournalTransactionLine();
124+
$vatLine
125+
->setLineType(LineType::VAT())
126+
->setId(3)
127+
->setValue(Money::EUR(2100))
128+
->setVatCode('VH');
129+
130+
$journalTransaction
131+
->addLine($detailLine)
132+
->addLine($vatLine);
133+
134+
return $journalTransaction;
135+
}
136+
137+
private function fakePurchaseTransactionWithoutDim1OnVatLine(): PurchaseTransaction
138+
{
139+
$purchaseTransaction = new PurchaseTransaction();
140+
$purchaseTransaction
141+
->setDestiny(Destiny::TEMPORARY())
142+
->setRaiseWarning(false)
143+
->setCode('INK')
144+
->setCurrency(new Currency('EUR'))
145+
->setDate(new DateTimeImmutable('2013-05-02'))
146+
->setPeriod('2013/05')
147+
->setInvoiceNumber('20130-5481')
148+
->setPaymentReference('+++100/0160/01495+++')
149+
->setOffice(Office::fromCode('001'))
150+
->setDueDate(new DateTimeImmutable('2013-05-06'));
151+
152+
$totalLine = new PurchaseTransactionLine();
153+
$totalLine
154+
->setLineType(LineType::TOTAL())
155+
->setId(1)
156+
->setDim1('1600')
157+
->setDim2('2000')
158+
->setValue(Money::EUR(12100))
159+
->setDescription('');
160+
161+
$detailLine = new PurchaseTransactionLine();
162+
$detailLine
163+
->setLineType(LineType::DETAIL())
164+
->setId(2)
165+
->setDim1('8020')
166+
->setValue(Money::EUR(10000))
167+
->setDescription('Outfit')
168+
->setVatCode('IH');
169+
170+
$vatLine = new PurchaseTransactionLine();
171+
$vatLine
172+
->setLineType(LineType::VAT())
173+
->setId(3)
174+
->setValue(Money::EUR(2100))
175+
->setVatCode('VH');
176+
177+
$purchaseTransaction
178+
->addLine($totalLine)
179+
->addLine($detailLine)
180+
->addLine($vatLine);
181+
182+
return $purchaseTransaction;
183+
}
184+
185+
private function fakeSalesTransactionWithoutDim1OnVatLine(): SalesTransaction
186+
{
187+
$salesTransaction = new SalesTransaction();
188+
$salesTransaction
189+
->setDestiny(Destiny::TEMPORARY())
190+
->setRaiseWarning(false)
191+
->setCode('SLS')
192+
->setCurrency(new Currency('EUR'))
193+
->setDate(new DateTimeImmutable('2013-05-02'))
194+
->setPeriod('2013/05')
195+
->setInvoiceNumber('20130-6000')
196+
->setPaymentReference('+++100/0160/01495+++')
197+
->setOffice(Office::fromCode('001'));
198+
199+
$totalLine = new SalesTransactionLine();
200+
$totalLine
201+
->setLineType(LineType::TOTAL())
202+
->setId(1)
203+
->setDim1('1300')
204+
->setDim2('1000')
205+
->setValue(Money::EUR(12100))
206+
->setDescription('');
207+
208+
$detailLine = new SalesTransactionLine();
209+
$detailLine
210+
->setLineType(LineType::DETAIL())
211+
->setId(2)
212+
->setDim1('8020')
213+
->setValue(Money::EUR(10000))
214+
->setDescription('Outfit')
215+
->setVatCode('VH');
216+
217+
$vatLine = new SalesTransactionLine();
218+
$vatLine
219+
->setLineType(LineType::VAT())
220+
->setId(3)
221+
->setValue(Money::EUR(2100))
222+
->setVatCode('VH');
223+
224+
$salesTransaction
225+
->addLine($totalLine)
226+
->addLine($detailLine)
227+
->addLine($vatLine);
228+
229+
return $salesTransaction;
230+
}
231+
}

0 commit comments

Comments
 (0)