Skip to content

Commit cc904fe

Browse files
committed
WIP
1 parent 49124cf commit cc904fe

10 files changed

+223
-8
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
namespace CodebarAg\Bexio\Dto\BankAccounts;
4+
5+
use Exception;
6+
use Illuminate\Support\Arr;
7+
use Saloon\Http\Response;
8+
use Spatie\LaravelData\Data;
9+
10+
class BankAccountDTO extends Data
11+
{
12+
public function __construct(
13+
public int $id,
14+
public string $uuid,
15+
public string $name,
16+
17+
public string $owner,
18+
public string $owner_address,
19+
public string $owner_zip,
20+
public string $owner_city,
21+
public string $bc_nr,
22+
public string $bank_name,
23+
public string $bank_account_nr,
24+
public string $iban_nr,
25+
public int $currency_id,
26+
public int $account_id,
27+
public string $is_esr,
28+
public string $esr_besr_id,
29+
public string $esr_bottom_line_include_amount,
30+
public string $esr_post_account_nr,
31+
public string $esr_payment_for_text,
32+
public string $esr_in_favour_of_text,
33+
public string $invoice_mode,
34+
public string $type,
35+
public string $bank_nr,
36+
public ?string $remarks = null,
37+
public ?string $qr_invoice_iban = null,
38+
) {
39+
}
40+
41+
public static function fromResponse(Response $response): self
42+
{
43+
if ($response->failed()) {
44+
throw new \Exception('Failed to create DTO from Response');
45+
}
46+
47+
$data = $response->json();
48+
49+
return self::fromArray($data);
50+
}
51+
52+
public static function fromArray(array $data): self
53+
{
54+
if (! $data) {
55+
throw new Exception('Unable to create DTO. Data missing from response.');
56+
}
57+
58+
return new self(
59+
id: Arr::get($data, 'id'),
60+
uuid: Arr::get($data, 'uuid'),
61+
name: Arr::get($data, 'name'),
62+
owner: Arr::get($data, 'owner'),
63+
owner_address: Arr::get($data, 'owner_address'),
64+
owner_zip: Arr::get($data, 'owner_zip'),
65+
owner_city: Arr::get($data, 'owner_city'),
66+
bc_nr: Arr::get($data, 'bc_nr'),
67+
bank_name: Arr::get($data, 'bank_name'),
68+
bank_account_nr: Arr::get($data, 'bank_account_nr'),
69+
iban_nr: Arr::get($data, 'iban_nr'),
70+
currency_id: Arr::get($data, 'currency_id'),
71+
account_id: Arr::get($data, 'account_id'),
72+
is_esr: Arr::get($data, 'is_esr'),
73+
esr_besr_id: Arr::get($data, 'esr_besr_id'),
74+
esr_bottom_line_include_amount: Arr::get($data, 'esr_bottom_line_include_amount'),
75+
esr_post_account_nr: Arr::get($data, 'esr_post_account_nr'),
76+
esr_payment_for_text: Arr::get($data, 'esr_payment_for_text'),
77+
esr_in_favour_of_text: Arr::get($data, 'esr_in_favour_of_text'),
78+
invoice_mode: Arr::get($data, 'invoice_mode'),
79+
type: Arr::get($data, 'type'),
80+
bank_nr: Arr::get($data, 'bank_nr'),
81+
remarks: Arr::get($data, 'remarks'),
82+
qr_invoice_iban: Arr::get($data, 'qr_invoice_iban'),
83+
);
84+
}
85+
}

src/Dto/ManualEntries/AddFileDTO.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace CodebarAg\Bexio\Dto\ManualEntries;
44

55
use Exception;
6-
use GuzzleHttp\Psr7\Stream;
76
use Illuminate\Support\Arr;
87
use Spatie\LaravelData\Data;
98

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace CodebarAg\Bexio\Requests\BankAccounts;
4+
5+
use CodebarAg\Bexio\Dto\BankAccounts\BankAccountDTO;
6+
use Exception;
7+
use Saloon\Enums\Method;
8+
use Saloon\Http\Request;
9+
use Saloon\Http\Response;
10+
11+
class FetchAListOfBankAccountsRequest extends Request
12+
{
13+
protected Method $method = Method::GET;
14+
15+
public function __construct(
16+
readonly int $limit = 500,
17+
readonly int $offset = 0,
18+
) {
19+
}
20+
21+
public function resolveEndpoint(): string
22+
{
23+
return '/3.0/banking/accounts';
24+
}
25+
26+
public function defaultQuery(): array
27+
{
28+
return [
29+
'limit' => $this->limit,
30+
'offset' => $this->offset,
31+
];
32+
}
33+
34+
public function createDtoFromResponse(Response $response): mixed
35+
{
36+
if (! $response->successful()) {
37+
throw new Exception('Request was not successful. Unable to create DTO.');
38+
}
39+
40+
$res = $response->json();
41+
42+
$bankAccounts = collect();
43+
44+
foreach ($res as $bankAccount) {
45+
$bankAccounts->push(BankAccountDTO::fromArray($bankAccount));
46+
}
47+
48+
return $bankAccounts;
49+
}
50+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace CodebarAg\Bexio\Requests\BankAccounts;
4+
5+
use CodebarAg\Bexio\Dto\BankAccounts\BankAccountDTO;
6+
use Exception;
7+
use Saloon\Enums\Method;
8+
use Saloon\Http\Request;
9+
use Saloon\Http\Response;
10+
11+
class FetchASingleBankAccountRequest extends Request
12+
{
13+
protected Method $method = Method::GET;
14+
15+
public function __construct(
16+
readonly int $id,
17+
readonly bool $show_archived = false,
18+
) {
19+
}
20+
21+
public function resolveEndpoint(): string
22+
{
23+
return '/3.0/banking/accounts/'.$this->id;
24+
}
25+
26+
public function defaultQuery(): array
27+
{
28+
return [
29+
'show_archived' => $this->show_archived,
30+
];
31+
}
32+
33+
public function createDtoFromResponse(Response $response): mixed
34+
{
35+
if (! $response->successful()) {
36+
throw new Exception('Request was not successful. Unable to create DTO.');
37+
}
38+
39+
return BankAccountDTO::fromResponse($response);
40+
}
41+
}

src/Requests/ManualEntries/AddFileToAccountingEntryLineRequest.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use CodebarAg\Bexio\Dto\ManualEntries\AddFileDTO;
66
use CodebarAg\Bexio\Dto\ManualEntries\ManualEntryDTO;
77
use Exception;
8-
use Illuminate\Support\Facades\File;
98
use Saloon\Contracts\Body\HasBody;
109
use Saloon\Data\MultipartValue;
1110
use Saloon\Enums\Method;
@@ -44,8 +43,6 @@ protected function defaultBody(): array
4443
)
4544
);
4645

47-
ray($body->toArray());
48-
4946
return $body->toArray();
5047
}
5148

@@ -58,7 +55,7 @@ protected function defaultBody(): array
5855
new MultipartValue(
5956
name: $value->name,
6057
value: $value->absolute_file_path_or_stream,
61-
filename: $value->filename,
58+
filename: $value->filename . '-' . $key,
6259
)
6360
);
6461
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"statusCode":200,"headers":{"Date":"Wed, 13 Dec 2023 12:52:53 GMT","Content-Type":"application\/json","Content-Length":"587","Connection":"keep-alive","ratelimit-reset":"7","x-ratelimit-remaining-minute":"997","x-ratelimit-limit-minute":"1000","ratelimit-remaining":"997","ratelimit-limit":"1000","x-total-count":"1","x-limit":"500","x-offset":"0","Cache-Control":"no-store","pragma":"no-cache","vary":"Origin","access-control-allow-origin":"https:\/\/office.bexio.com","via":"1.1 google","alt-svc":"h3=\":443\"; ma=86400","CF-Cache-Status":"DYNAMIC","Server":"cloudflare","CF-RAY":"834e58c90a3018cb-FRA"},"data":"[{\"id\":1,\"uuid\":\"8bc53d7d-953d-11ea-8073-42010a7c00c5\",\"name\":\"Example bank\",\"owner\":\"Muster Hans\",\"owner_address\":\"M\\u00fchlematten 12\",\"owner_zip\":\"4455\",\"owner_city\":\"Zunzgen\",\"bc_nr\":\"00769\",\"bank_name\":\"Basellandschaftliche Kantonalbank\",\"bank_account_nr\":\"440037302001\",\"iban_nr\":\"CH4500769440037302001\",\"currency_id\":1,\"account_id\":115,\"remarks\":null,\"is_esr\":false,\"esr_besr_id\":\"\",\"esr_bottom_line_include_amount\":true,\"esr_post_account_nr\":\"\",\"esr_payment_for_text\":\"\",\"esr_in_favour_of_text\":\"\",\"invoice_mode\":\"none\",\"qr_invoice_iban\":null,\"type\":\"bank\",\"bank_nr\":\"BLKBCH22\"}]"}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"statusCode":200,"headers":{"Date":"Wed, 13 Dec 2023 12:52:42 GMT","Content-Type":"application\/json","Content-Length":"585","Connection":"keep-alive","ratelimit-reset":"18","x-ratelimit-remaining-minute":"998","x-ratelimit-limit-minute":"1000","ratelimit-remaining":"998","ratelimit-limit":"1000","etag":"ee7970ffd40bd64c6975c87134039ef2","Cache-Control":"no-store","pragma":"no-cache","vary":"Origin","access-control-allow-origin":"https:\/\/office.bexio.com","via":"1.1 google","alt-svc":"h3=\":443\"; ma=86400","CF-Cache-Status":"DYNAMIC","Server":"cloudflare","CF-RAY":"834e5887d9c65c98-FRA"},"data":"{\"id\":1,\"uuid\":\"8bc53d7d-953d-11ea-8073-42010a7c00c5\",\"name\":\"Example bank\",\"owner\":\"Muster Hans\",\"owner_address\":\"M\\u00fchlematten 12\",\"owner_zip\":\"4455\",\"owner_city\":\"Zunzgen\",\"bc_nr\":\"00769\",\"bank_name\":\"Basellandschaftliche Kantonalbank\",\"bank_account_nr\":\"440037302001\",\"iban_nr\":\"CH4500769440037302001\",\"currency_id\":1,\"account_id\":115,\"remarks\":null,\"is_esr\":false,\"esr_besr_id\":\"\",\"esr_bottom_line_include_amount\":true,\"esr_post_account_nr\":\"\",\"esr_payment_for_text\":\"\",\"esr_in_favour_of_text\":\"\",\"invoice_mode\":\"none\",\"qr_invoice_iban\":null,\"type\":\"bank\",\"bank_nr\":\"BLKBCH22\"}"}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
use CodebarAg\Bexio\BexioConnector;
4+
use CodebarAg\Bexio\Requests\BankAccounts\FetchAListOfBankAccountsRequest;
5+
use Illuminate\Support\Collection;
6+
use Saloon\Http\Faking\MockResponse;
7+
use Saloon\Laravel\Http\Faking\MockClient;
8+
9+
it('can perform the request', closure: function () {
10+
$mockClient = new MockClient([
11+
FetchAListOfBankAccountsRequest::class => MockResponse::fixture('BankAccounts/fetch-a-list-of-bank-accounts'),
12+
]);
13+
14+
$connector = new BexioConnector;
15+
$connector->withMockClient($mockClient);
16+
17+
$response = $connector->send(new FetchAListOfBankAccountsRequest());
18+
19+
$mockClient->assertSent(FetchAListOfBankAccountsRequest::class);
20+
21+
expect($response->dto())->toBeInstanceOf(Collection::class)
22+
->and($response->dto()->count())->toBe(1);
23+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use CodebarAg\Bexio\BexioConnector;
4+
use CodebarAg\Bexio\Requests\BankAccounts\FetchASingleBankAccountRequest;
5+
use Saloon\Http\Faking\MockResponse;
6+
use Saloon\Laravel\Http\Faking\MockClient;
7+
8+
it('can perform the request', closure: function () {
9+
$mockClient = new MockClient([
10+
FetchASingleBankAccountRequest::class => MockResponse::fixture('BankAccounts/fetch-a-single-bank-account'),
11+
]);
12+
13+
$connector = new BexioConnector;
14+
$connector->withMockClient($mockClient);
15+
16+
$response = $connector->send(new FetchASingleBankAccountRequest(id: 1));
17+
18+
$mockClient->assertSent(FetchASingleBankAccountRequest::class);
19+
});

tests/Requests/ManualEntries/AddFileToAccountingEntryLineRequestTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
use Illuminate\Support\Facades\File;
77
use Saloon\Http\Faking\MockResponse;
88
use Saloon\Laravel\Http\Faking\MockClient;
9-
use function GuzzleHttp\Psr7\stream_for;
109

1110
it('can perform the request', closure: function () {
1211
$mockClient = new MockClient([
13-
// AddFileToAccountingEntryLineRequest::class => MockResponse::fixture('ManualEntries/add-file-to-accounting-entry-line'),
12+
// AddFileToAccountingEntryLineRequest::class => MockResponse::fixture('ManualEntries/add-file-to-accounting-entry-line'),
1413
]);
1514

1615
$connector = new BexioConnector;
17-
// $connector->withMockClient($mockClient);
16+
// $connector->withMockClient($mockClient);
1817

1918
$response = $connector->send(new AddFileToAccountingEntryLineRequest(
2019
manual_entry_id: 1,

0 commit comments

Comments
 (0)