Skip to content

Commit

Permalink
🚧 Start Invoice work
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonJnsson committed Dec 7, 2023
1 parent fca1f80 commit 257588f
Show file tree
Hide file tree
Showing 11 changed files with 302 additions and 37 deletions.
26 changes: 24 additions & 2 deletions src/Abstracts/Resource.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,15 @@ protected function resolvePropertyValue(string $property, mixed $value): mixed

$propertyReflection = $reflection->getProperty($property);

$reflectionTypeName = $propertyReflection->getType()->getName();

// If is already the expected type
if ($value instanceof $reflectionTypeName) {
return $value;
}

// If is EconomicCollection
if (is_a($propertyReflection->getType()->getName(), EconomicCollection::class, true)) {
if (is_a($reflectionTypeName, EconomicCollection::class, true)) {
$attribute = $propertyReflection->getAttributes(ResourceType::class);

if (! empty($attribute[0])) {
Expand All @@ -55,7 +62,7 @@ protected function resolvePropertyValue(string $property, mixed $value): mixed
}

// If is a class
if (class_exists($propertyReflection->getType()->getName())) {
if (class_exists($reflectionTypeName)) {
return new ($propertyReflection->getType()->getName())($value);
}

Expand Down Expand Up @@ -151,4 +158,19 @@ public function __toString(): string
{
return json_encode($this->toArray());
}

protected static function filterEmpty(array $values): array
{
foreach ($values as $key => $value) {
if (is_array($value)) {
$values[$key] = static::filterEmpty($value);
}

if (empty($values[$key])) {
unset($values[$key]);
}
}

return $values;
}
}
11 changes: 11 additions & 0 deletions src/DTOs/Attention.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace MorningTrain\Economic\DTOs;

class Attention
{
public function __construct(
public ?int $customerContactNumber = null,
) {
}
}
21 changes: 21 additions & 0 deletions src/DTOs/Recipient.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace MorningTrain\Economic\DTOs;

use MorningTrain\Economic\Resources\VatZone;

class Recipient
{
public function __construct(
public readonly string $name,
public readonly VatZone $vatZone,
public ?string $address = null,
public ?string $zip = null,
public ?string $city = null,
public ?string $country = null,
public ?string $ean = null,
public ?string $publicEntryNumber = null,
//public ?Attention $attention = null,
) {
}
}
27 changes: 0 additions & 27 deletions src/Resources/Invoice.php

This file was deleted.

22 changes: 22 additions & 0 deletions src/Resources/Invoice/BookedInvoice.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace MorningTrain\Economic\Resources\Invoice;

use MorningTrain\Economic\Attributes\Resources\Create;
use MorningTrain\Economic\Attributes\Resources\GetCollection;
use MorningTrain\Economic\Attributes\Resources\GetSingle;

#[GetCollection('invoices/booked')]
#[GetSingle('invoices/booked/:bookedInvoiceNumber', ':bookedInvoiceNumber')]
#[Create('invoices/booked')]
class BookedInvoice extends DraftInvoice
{
public static function createFromDraft(int|DraftInvoice $draft)
{
return static::createRequest([
'draftInvoice' => [
'draftInvoiceNumber' => is_int($draft) ? $draft : $draft->draftInvoiceNumber,
],
]);
}
}
74 changes: 74 additions & 0 deletions src/Resources/Invoice/DraftInvoice.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

namespace MorningTrain\Economic\Resources\Invoice;

use DateTime;
use MorningTrain\Economic\Abstracts\Resource;
use MorningTrain\Economic\Attributes\Resources\Create;
use MorningTrain\Economic\Attributes\Resources\GetCollection;
use MorningTrain\Economic\Attributes\Resources\GetSingle;
use MorningTrain\Economic\DTOs\Recipient;
use MorningTrain\Economic\Resources\Currency;
use MorningTrain\Economic\Resources\Customer;
use MorningTrain\Economic\Resources\Layout;
use MorningTrain\Economic\Resources\PaymentTerm;
use MorningTrain\Economic\Traits\Resources\Creatable;
use MorningTrain\Economic\Traits\Resources\GetCollectionable;
use MorningTrain\Economic\Traits\Resources\GetSingleable;

#[GetCollection('invoices/drafts')]
#[GetSingle('invoices/drafts/:draftInvoiceNumber', ':draftInvoiceNumber')]
#[Create('invoices/drafts')]
class DraftInvoice extends Resource
{
use Creatable, GetCollectionable, GetSingleable;

public Customer $customer;

public Layout $layout;

public Currency $currency;

public PaymentTerm $paymentTerms;

public DateTime $date;

public Recipient $recipient;

public ?int $draftInvoiceNumber = null;

public static function new(
Customer|int $customer,
Layout|int $layout,
Currency|string $currency,
PaymentTerm|int $paymentTerms,
DateTime $date,
Recipient $recipient,
): static {
return new static([
'customer' => $customer,
'layout' => $layout,
'currency' => $currency,
'paymentTerms' => $paymentTerms,
'date' => $date,
'recipient' => $recipient,
]);
}

public function create()
{
return static::createRequest([
'customer' => $this->customer,
'layout' => $this->layout,
'currency' => $this->currency,
'paymentTerms' => $this->paymentTerms,
'date' => $this->date->format('Y-m-d'),
'recipient' => $this->recipient,
]);
}

public function book(): ?BookedInvoice
{
return BookedInvoice::createFromDraft($this);
}
}
41 changes: 41 additions & 0 deletions src/Resources/Invoice/Invoice.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace MorningTrain\Economic\Resources\Invoice;

use MorningTrain\Economic\Abstracts\Resource;
use MorningTrain\Economic\Attributes\Resources\Create;
use MorningTrain\Economic\Attributes\Resources\GetCollection;
use MorningTrain\Economic\Attributes\Resources\GetSingle;
use MorningTrain\Economic\Resources\Currency;
use MorningTrain\Economic\Resources\Customer;
use MorningTrain\Economic\Resources\Layout;
use MorningTrain\Economic\Resources\PaymentTerm;
use MorningTrain\Economic\Traits\Resources\Creatable;
use MorningTrain\Economic\Traits\Resources\GetCollectionable;
use MorningTrain\Economic\Traits\Resources\GetSingleable;

#[GetCollection('products')]
#[GetSingle('invoices/:product', ':product')]
#[Create('invoices/drafts')]
class Invoice extends Resource
{
use Creatable, GetCollectionable, GetSingleable;

public static function new(
Customer|int $customer,
Layout|int $layout,
Currency|string $currency,
PaymentTerm|int $paymentTerms
) {
return new static([
'customer' => $customer,
'layout' => $layout,
'currency' => $currency,
'paymentTerms' => $paymentTerms,
]);
}

public function addLine(ProductLine $line)
{
}
}
7 changes: 7 additions & 0 deletions src/Resources/Layout.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,20 @@
use MorningTrain\Economic\Abstracts\Resource;
use MorningTrain\Economic\Attributes\Resources\GetCollection;
use MorningTrain\Economic\Attributes\Resources\GetSingle;
use MorningTrain\Economic\Attributes\Resources\Properties\PrimaryKey;
use MorningTrain\Economic\Traits\Resources\GetCollectionable;
use MorningTrain\Economic\Traits\Resources\GetSingleable;

#[GetCollection('layouts')]
#[GetSingle('/layouts/:layoutNumber', ':layoutNumber')]
class Layout extends Resource
{
use GetCollectionable;
use GetSingleable;

public bool $deleted;

#[PrimaryKey]
public int $layoutNumber;

public string $name;
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/PaymentTerm.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class PaymentTerm extends Resource
public string $name;

#[PrimaryKey]
public int $paymentTermNumber;
public int $paymentTermsNumber;

public string $paymentTermsType;

Expand Down
21 changes: 14 additions & 7 deletions src/Traits/Resources/Creatable.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,23 @@ public static function createRequest($args, array $endpointReferences = []): ?st
{
// TODO: add validation method to check if required properties are set and primary key is not set - throw exception if not

$args = json_decode(json_encode($args), true);

if (method_exists(static::class, 'filterEmpty')) {
$args = static::filterEmpty($args);
}

$response = EconomicApiService::post(static::getEndpoint(Create::class, ...$endpointReferences), $args);

if ($response->getStatusCode() !== 201) {
EconomicLoggerService::error('Economic API Service returned a non 201 status code when creating a resource', [
'status_code' => $response->getStatusCode(),
'response_body' => $response->getBody(),
'resource' => static::class,
'args' => $args,
'endpoint_references' => $endpointReferences,
]);
EconomicLoggerService::error('Economic API Service returned a non 201 status code when creating a resource',
[
'status_code' => $response->getStatusCode(),
'response_body' => $response->getBody(),
'resource' => static::class,
'args' => $args,
'endpoint_references' => $endpointReferences,
]);

throw new Exception('Economic API Service returned a non 201 status code when creating a resource');
}
Expand Down
87 changes: 87 additions & 0 deletions tests/Unit/InvoiceTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

use MorningTrain\Economic\Classes\EconomicResponse;
use MorningTrain\Economic\DTOs\Recipient;
use MorningTrain\Economic\Resources\Invoice\DraftInvoice;
use MorningTrain\Economic\Resources\VatZone;

it('creates draft invoice', function () {
$this->driver->expects()->post()
->withArgs(function (string $url, array $body) {
return $url === 'https://restapi.e-conomic.com/invoices/drafts'
&& $body === [
'customer' => [
'customerNumber' => 1,
],
'layout' => [
'layoutNumber' => 1,
],
'currency' => [
'isoNumber' => 'DKK',
],
'paymentTerms' => [
'paymentTermsNumber' => 1,
],
'date' => '2021-01-01',
'recipient' => [
'name' => 'John Doe',
'vatZone' => [
'vatZoneNumber' => 1,
],
],
];
})
->once()
->andReturn(new EconomicResponse(201, []));

DraftInvoice::new(
1,
1,
'DKK',
1,
DateTime::createFromFormat('Y-m-d', '2021-01-01'),
new Recipient(
'John Doe',
new VatZone(1),
)
)
->create();
//->book();
});

it('books draft invoice', function () {
$this->driver->expects()->post()
->withArgs(function (string $url, array $body) {
return $url === 'https://restapi.e-conomic.com/invoices/drafts';
})
->once()
->andReturn(new EconomicResponse(201, [
'draftInvoiceNumber' => 1,
]));

$this->driver->expects()->post()
->withArgs(function (string $url, array $body) {
return $url === 'https://restapi.e-conomic.com/invoices/booked'
&& $body === [
'draftInvoice' => [
'draftInvoiceNumber' => 1,
],
];
})
->once()
->andReturn(new EconomicResponse(201, []));

DraftInvoice::new(
1,
1,
'DKK',
1,
DateTime::createFromFormat('Y-m-d', '2021-01-01'),
new Recipient(
'John Doe',
new VatZone(1),
)
)
->create()
->book();
});

0 comments on commit 257588f

Please sign in to comment.