Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .phpunit.cache/test-results

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/Dto/Invoices/InvoiceDTO.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public function __construct(
public ?string $template_slug,
public Collection $taxs,
public ?string $network_link,
public ?Collection $positions,
) {}

public static function fromResponse(Response $response): self
Expand Down Expand Up @@ -107,6 +108,7 @@ public static function fromArray(array $data): self
template_slug: Arr::get($data, 'template_slug'),
taxs: collect(Arr::get($data, 'taxs', []))->map(fn (array $tax) => InvoiceTaxDTO::fromArray($tax)),
network_link: Arr::get($data, 'network_link'),
positions: collect(Arr::get($data, 'positions', []))->map(fn (array $tax) => InvoicePositionDTO::fromArray($tax)),
);
}
}
77 changes: 77 additions & 0 deletions src/Dto/Invoices/InvoicePositionDTO.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

namespace CodebarAg\Bexio\Dto\Invoices;

use Exception;
use Illuminate\Support\Arr;
use Saloon\Http\Response;
use Spatie\LaravelData\Data;

class InvoicePositionDTO extends Data
{
public function __construct(
public ?string $type,
public ?int $id,
public ?string $amount,
public ?int $unit_id,
public ?string $unit_name,
public ?int $account_id,
public ?int $tax_id,
public ?string $tax_value,
public ?string $text,
public ?string $unit_price,
public ?string $discount_in_percent,
public ?string $position_total,
public ?int $parent_id,
public ?int $article_id,
public ?bool $show_pos_nr,
public ?bool $pagebreak,
public ?bool $is_percentual,
public ?string $value,
public ?string $pos,
public ?string $internal_pos,
public ?bool $is_optional,
) {}

public static function fromResponse(Response $response): self
{
if ($response->failed()) {
throw new \Exception('Failed to create DTO from Response');
}

$data = $response->json();

return self::fromArray($data);
}

public static function fromArray(array $data): self
{
if (! $data) {
throw new Exception('Unable to create DTO. Data missing from response.');
}

return new self(
type: Arr::get($data, 'type'),
id: Arr::get($data, 'id'),
amount: Arr::get($data, 'amount'),
unit_id: Arr::get($data, 'unit_id'),
unit_name: Arr::get($data, 'unit_name'),
account_id: Arr::get($data, 'account_id'),
tax_id: Arr::get($data, 'tax_id'),
tax_value: Arr::get($data, 'tax_value'),
text: Arr::get($data, 'text'),
unit_price: Arr::get($data, 'unit_price'),
discount_in_percent: Arr::get($data, 'discount_in_percent'),
position_total: Arr::get($data, 'position_total'),
parent_id: Arr::get($data, 'parent_id'),
article_id: Arr::get($data, 'article_id'),
show_pos_nr: Arr::get($data, 'show_pos_nr'),
pagebreak: Arr::get($data, 'pagebreak'),
is_percentual: Arr::get($data, 'is_percentual'),
value: Arr::get($data, 'value'),
pos: Arr::get($data, 'pos'),
internal_pos: Arr::get($data, 'internal_pos'),
is_optional: Arr::get($data, 'is_optional'),
);
}
}
34 changes: 34 additions & 0 deletions src/Requests/Invoices/CancelAnInvoiceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices;

use Exception;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;

class CancelAnInvoiceRequest extends Request
{
protected Method $method = Method::POST;

public function __construct(
readonly int $invoiceId,
) {}

public function resolveEndpoint(): string
{
return '/2.0/kb_invoice/'.$this->invoiceId.'/cancel';
}

/**
* @throws \JsonException
*/
public function createDtoFromResponse(Response $response): mixed
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

return $response->json();
}
}
37 changes: 37 additions & 0 deletions src/Requests/Invoices/CreateAnInvoiceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices;

use CodebarAg\Bexio\Dto\Invoices\InvoiceDTO;
use Exception;
use Illuminate\Support\Collection;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;

class CreateAnInvoiceRequest extends Request implements HasBody
{
use HasJsonBody;

protected Method $method = Method::POST;

public function __construct() {}

public function resolveEndpoint(): string
{
return '/2.0/kb_invoice';
}

public function createDtoFromResponse(Response $response): InvoiceDTO
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

$res = $response->json();

return InvoiceDTO::fromArray($res);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices\DefaultPositions;

use CodebarAg\Bexio\Dto\Invoices\InvoicePositionDTO;
use Exception;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;

class CreateADefaultPositionRequest extends Request implements HasBody
{
use HasJsonBody;

protected Method $method = Method::POST;

public function __construct(
protected string $kb_document_type,
protected int $invoice_id,
) {}

public function resolveEndpoint(): string
{
return sprintf('/2.0/%s/%s/kb_position_custom', $this->kb_document_type, $this->invoice_id);
}

public function createDtoFromResponse(Response $response): InvoicePositionDTO
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

$res = $response->json();

return InvoicePositionDTO::fromArray($res);
}
}
34 changes: 34 additions & 0 deletions src/Requests/Invoices/DeleteAnInvoiceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices;

use Exception;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;

class DeleteAnInvoiceRequest extends Request
{
protected Method $method = Method::DELETE;

public function __construct(
readonly int $invoiceId,
) {}

public function resolveEndpoint(): string
{
return '/2.0/kb_invoice/'.$this->invoiceId;
}

/**
* @throws \JsonException
*/
public function createDtoFromResponse(Response $response): mixed
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

return $response->json();
}
}
31 changes: 31 additions & 0 deletions src/Requests/Invoices/IssueAnInvoiceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices;

use Exception;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;

class IssueAnInvoiceRequest extends Request
{
protected Method $method = Method::POST;

public function __construct(
readonly int $invoiceId,
) {}

public function resolveEndpoint(): string
{
return '/2.0/kb_invoice/'.$this->invoiceId.'/issue';
}

public function createDtoFromResponse(Response $response): mixed
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

return $response->json();
}
}
31 changes: 31 additions & 0 deletions src/Requests/Invoices/SetIssuedInvoiceToDraftRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices;

use Exception;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;

class SetIssuedInvoiceToDraftRequest extends Request
{
protected Method $method = Method::POST;

public function __construct(
readonly int $invoiceId,
) {}

public function resolveEndpoint(): string
{
return '/2.0/kb_invoice/'.$this->invoiceId.'/issue';
}

public function createDtoFromResponse(Response $response): mixed
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

return $response->json();
}
}
39 changes: 39 additions & 0 deletions src/Requests/Invoices/SubPositions/CreateASubPositionRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace CodebarAg\Bexio\Requests\Invoices\SubPositions;

use CodebarAg\Bexio\Dto\Invoices\InvoicePositionDTO;
use Exception;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;

class CreateASubPositionRequest extends Request implements HasBody
{
use HasJsonBody;

protected Method $method = Method::POST;

public function __construct(
protected string $kb_document_type,
protected int $invoice_id,
) {}

public function resolveEndpoint(): string
{
return sprintf('/2.0/%s/%s/kb_position_subposition', $this->kb_document_type, $this->invoice_id);
}

public function createDtoFromResponse(Response $response): InvoicePositionDTO
{
if (! $response->successful()) {
throw new Exception('Request was not successful. Unable to create DTO.');
}

$res = $response->json();

return InvoicePositionDTO::fromArray($res);
}
}
23 changes: 23 additions & 0 deletions tests/Fixtures/Saloon/Invoices/cancel-an-invoice.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"statusCode": 200,
"headers": {
"Date": "Tue, 01 Oct 2024 18:24:11 GMT",
"Content-Type": "application\/json",
"Content-Length": "16",
"Connection": "keep-alive",
"x-ratelimit-remaining-minute": "999",
"x-ratelimit-limit-minute": "1000",
"ratelimit-remaining": "999",
"ratelimit-reset": "50",
"ratelimit-limit": "1000",
"Cache-Control": "no-store",
"pragma": "no-cache",
"vary": "Origin",
"access-control-allow-origin": "https:\/\/office.bexio.com",
"via": "1.1 google",
"CF-Cache-Status": "DYNAMIC",
"Server": "cloudflare",
"CF-RAY": "8cbe7cf34df271de-LHR"
},
"data": "{\"success\":true}"
}
23 changes: 23 additions & 0 deletions tests/Fixtures/Saloon/Invoices/delete-an-invoice.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"statusCode": 403,
"headers": {
"Date": "Tue, 01 Oct 2024 18:22:06 GMT",
"Content-Type": "application\/json",
"Transfer-Encoding": "chunked",
"Connection": "keep-alive",
"x-ratelimit-remaining-minute": "999",
"x-ratelimit-limit-minute": "1000",
"ratelimit-remaining": "999",
"ratelimit-limit": "1000",
"ratelimit-reset": "54",
"Cache-Control": "no-store",
"pragma": "no-cache",
"vary": "Origin",
"access-control-allow-origin": "https:\/\/office.bexio.com",
"via": "1.1 google",
"CF-Cache-Status": "DYNAMIC",
"Server": "cloudflare",
"CF-RAY": "8cbe79e9f85f3dca-LHR"
},
"data": "{\"error_code\":403,\"message\":\"You are not allowed to access this resource.\"}"
}
Loading
Loading