Skip to content

Commit 4167558

Browse files
authored
Merge pull request #195 from optiwise/feature/external-sales-invoice
Add support for external sales invoices and adding an attachment to a receipt
2 parents 365afa0 + addc1cc commit 4167558

File tree

9 files changed

+219
-32
lines changed

9 files changed

+219
-32
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Picqer\Financials\Moneybird\Actions;
4+
5+
use Picqer\Financials\Moneybird\Exceptions\ApiException;
6+
7+
/**
8+
* @property string $id
9+
*/
10+
trait Attachment
11+
{
12+
use BaseTrait;
13+
14+
protected $attachmentPath = 'attachments';
15+
16+
/**
17+
* Add an attachment to this invoice.
18+
*
19+
* You can use fopen('/path/to/file', 'r') in $resource.
20+
*
21+
* @param string $filename The filename of the attachment
22+
* @param resource $contents A StreamInterface/resource/string, @see http://docs.guzzlephp.org/en/stable/request-options.html?highlight=multipart#multipart
23+
*
24+
* @return void
25+
*
26+
* @throws \Picqer\Financials\Moneybird\Exceptions\ApiException
27+
*/
28+
public function addAttachment($filename, $contents)
29+
{
30+
if (!isset($this->id)) {
31+
throw new ApiException("This method can only be used on existing records.");
32+
}
33+
34+
$this->connection()->upload($this->getEndpoint() . '/' . urlencode($this->id) . '/' . $this->attachmentPath, [
35+
'multipart' => [
36+
[
37+
'name' => 'file',
38+
'contents' => $contents,
39+
'filename' => $filename,
40+
],
41+
],
42+
]);
43+
}
44+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?php
2+
3+
namespace Picqer\Financials\Moneybird\Entities;
4+
5+
use Picqer\Financials\Moneybird\Actions\Attachment;
6+
use Picqer\Financials\Moneybird\Actions\Downloadable;
7+
use Picqer\Financials\Moneybird\Actions\Filterable;
8+
use Picqer\Financials\Moneybird\Actions\FindAll;
9+
use Picqer\Financials\Moneybird\Actions\FindOne;
10+
use Picqer\Financials\Moneybird\Actions\Removable;
11+
use Picqer\Financials\Moneybird\Actions\Storable;
12+
use Picqer\Financials\Moneybird\Actions\Synchronizable;
13+
use Picqer\Financials\Moneybird\Connection;
14+
use Picqer\Financials\Moneybird\Model;
15+
16+
/**
17+
* Class ExternalSalesInvoice.
18+
*
19+
* @property string $id
20+
* @property Contact $contact
21+
*/
22+
class ExternalSalesInvoice extends Model
23+
{
24+
use FindAll, FindOne, Storable, Removable, Filterable, Downloadable, Synchronizable, Attachment;
25+
26+
/**
27+
* @var array
28+
*/
29+
protected $fillable = [
30+
'id',
31+
'contact_id',
32+
'reference',
33+
'date',
34+
'due_date',
35+
'entry_number',
36+
'state',
37+
'currency',
38+
'prices_are_incl_tax',
39+
'source',
40+
'source_url',
41+
'origin',
42+
'paid_at',
43+
'total_paid',
44+
'total_unpaid',
45+
'total_price_excl_tax',
46+
'total_price_excl_tax_base',
47+
'total_price_incl_tax',
48+
'total_price_incl_tax_base',
49+
'created_at',
50+
'updated_at',
51+
'details',
52+
'payments',
53+
'notes',
54+
'attachments',
55+
'version',
56+
];
57+
58+
/**
59+
* @var string
60+
*/
61+
protected $endpoint = 'external_sales_invoices';
62+
63+
/**
64+
* @var string
65+
*/
66+
protected $namespace = 'external_sales_invoice';
67+
68+
/**
69+
* @var array
70+
*/
71+
protected $singleNestedEntities = [
72+
'contact' => Contact::class,
73+
];
74+
75+
/**
76+
* @var array
77+
*/
78+
protected $multipleNestedEntities = [
79+
'details' => [
80+
'entity' => ExternalSalesInvoiceDetail::class,
81+
'type' => self::NESTING_TYPE_ARRAY_OF_OBJECTS,
82+
],
83+
'payments' => [
84+
'entity' => ExternalSalesInvoicePayment::class,
85+
'type' => self::NESTING_TYPE_ARRAY_OF_OBJECTS,
86+
],
87+
];
88+
89+
public function __construct(Connection $connection, array $attributes = [])
90+
{
91+
parent::__construct($connection, $attributes);
92+
93+
$this->attachmentPath = 'attachment';
94+
}
95+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Picqer\Financials\Moneybird\Entities;
4+
5+
use Picqer\Financials\Moneybird\Entities\Generic\InvoiceDetail;
6+
7+
/**
8+
* Class ExternalSalesInvoiceDetail.
9+
*/
10+
class ExternalSalesInvoiceDetail extends InvoiceDetail
11+
{
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Picqer\Financials\Moneybird\Entities;
4+
5+
use Picqer\Financials\Moneybird\Entities\Generic\InvoicePayment;
6+
7+
/**
8+
* Class ExternalSalesInvoicePayment.
9+
*/
10+
class ExternalSalesInvoicePayment extends InvoicePayment
11+
{
12+
}

src/Picqer/Financials/Moneybird/Entities/PurchaseInvoice.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,22 @@
22

33
namespace Picqer\Financials\Moneybird\Entities;
44

5-
use Picqer\Financials\Moneybird\Model;
5+
use Picqer\Financials\Moneybird\Actions\Attachment;
66
use Picqer\Financials\Moneybird\Actions\FindAll;
77
use Picqer\Financials\Moneybird\Actions\FindOne;
88
use Picqer\Financials\Moneybird\Actions\Storable;
99
use Picqer\Financials\Moneybird\Actions\Removable;
1010
use Picqer\Financials\Moneybird\Actions\Filterable;
1111
use Picqer\Financials\Moneybird\Actions\Synchronizable;
1212
use Picqer\Financials\Moneybird\Exceptions\ApiException;
13+
use Picqer\Financials\Moneybird\Model;
1314

1415
/**
1516
* Class PurchaseInvoice.
1617
*/
1718
class PurchaseInvoice extends Model
1819
{
19-
use FindAll, FindOne, Storable, Removable, Filterable, Synchronizable;
20+
use FindAll, FindOne, Storable, Removable, Filterable, Synchronizable, Attachment;
2021

2122
/**
2223
* @var array

src/Picqer/Financials/Moneybird/Entities/Receipt.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
namespace Picqer\Financials\Moneybird\Entities;
44

5-
use Picqer\Financials\Moneybird\Model;
5+
use Picqer\Financials\Moneybird\Actions\Attachment;
66
use Picqer\Financials\Moneybird\Actions\FindAll;
77
use Picqer\Financials\Moneybird\Actions\FindOne;
88
use Picqer\Financials\Moneybird\Actions\Storable;
99
use Picqer\Financials\Moneybird\Actions\Removable;
1010
use Picqer\Financials\Moneybird\Exceptions\ApiException;
11+
use Picqer\Financials\Moneybird\Model;
1112

1213
/**
1314
* Class Receipt.
1415
*/
1516
class Receipt extends Model
1617
{
17-
use FindAll, FindOne, Storable, Removable;
18+
use FindAll, FindOne, Storable, Removable, Attachment;
1819

1920
/**
2021
* @var array

src/Picqer/Financials/Moneybird/Entities/SalesInvoice.php

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Picqer\Financials\Moneybird\Entities;
44

55
use InvalidArgumentException;
6+
use Picqer\Financials\Moneybird\Actions\Attachment;
67
use Picqer\Financials\Moneybird\Actions\Downloadable;
78
use Picqer\Financials\Moneybird\Actions\Filterable;
89
use Picqer\Financials\Moneybird\Actions\FindAll;
@@ -22,7 +23,7 @@
2223
*/
2324
class SalesInvoice extends Model
2425
{
25-
use FindAll, FindOne, Storable, Removable, Filterable, Downloadable, Synchronizable;
26+
use FindAll, FindOne, Storable, Removable, Filterable, Downloadable, Synchronizable, Attachment;
2627

2728
/**
2829
* @var array
@@ -262,33 +263,6 @@ public function registerPaymentForCreditInvoice()
262263
return $this->makeFromResponse($response);
263264
}
264265

265-
/**
266-
* Add Attachment to this invoice.
267-
*
268-
* You can use fopen('/path/to/file', 'r') in $resource.
269-
*
270-
* @param string $filename The filename of the attachment
271-
* @param resource $contents A StreamInterface/resource/string, @see http://docs.guzzlephp.org/en/stable/request-options.html?highlight=multipart#multipart
272-
*
273-
* @return \Picqer\Financials\Moneybird\Entities\SalesInvoice
274-
*
275-
* @throws \Picqer\Financials\Moneybird\Exceptions\ApiException
276-
*/
277-
public function addAttachment($filename, $contents)
278-
{
279-
$this->connection()->upload($this->endpoint . '/' . $this->id . '/attachments', [
280-
'multipart' => [
281-
[
282-
'name' => 'file',
283-
'contents' => $contents,
284-
'filename' => $filename,
285-
],
286-
],
287-
]);
288-
289-
return $this;
290-
}
291-
292266
/**
293267
* Pauses the sales invoice. The automatic workflow steps will not be executed while the sales invoice is paused.
294268
*

src/Picqer/Financials/Moneybird/Moneybird.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
namespace Picqer\Financials\Moneybird;
44

5+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoice;
6+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoiceDetail;
7+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoicePayment;
58
use Picqer\Financials\Moneybird\Entities\Note;
69
use Picqer\Financials\Moneybird\Entities\Contact;
710
use Picqer\Financials\Moneybird\Entities\Product;
@@ -124,6 +127,33 @@ public function estimate($attributes = [])
124127
return new Estimate($this->connection, $attributes);
125128
}
126129

130+
/**
131+
* @param array $attributes
132+
* @return \Picqer\Financials\Moneybird\Entities\ExternalSalesInvoice
133+
*/
134+
public function externalSalesInvoice($attributes = [])
135+
{
136+
return new ExternalSalesInvoice($this->connection, $attributes);
137+
}
138+
139+
/**
140+
* @param array $attributes
141+
* @return \Picqer\Financials\Moneybird\Entities\ExternalSalesInvoiceDetail
142+
*/
143+
public function externalSalesInvoiceDetail($attributes = [])
144+
{
145+
return new ExternalSalesInvoiceDetail($this->connection, $attributes);
146+
}
147+
148+
/**
149+
* @param array $attributes
150+
* @return \Picqer\Financials\Moneybird\Entities\ExternalSalesInvoicePayment
151+
*/
152+
public function externalSalesInvoicePayment($attributes = [])
153+
{
154+
return new ExternalSalesInvoicePayment($this->connection, $attributes);
155+
}
156+
127157
/**
128158
* @param array $attributes
129159
* @return \Picqer\Financials\Moneybird\Entities\FinancialAccount

tests/EntityTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
use Picqer\Financials\Moneybird\Entities\TaxRate;
99
use Picqer\Financials\Moneybird\Entities\Webhook;
1010
use Picqer\Financials\Moneybird\Entities\Estimate;
11+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoice;
12+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoiceDetail;
13+
use Picqer\Financials\Moneybird\Entities\ExternalSalesInvoicePayment;
1114
use Picqer\Financials\Moneybird\Entities\Identity;
1215
use Picqer\Financials\Moneybird\Entities\Workflow;
1316
use Picqer\Financials\Moneybird\Entities\CustomField;
@@ -73,6 +76,21 @@ public function testEstimateEntity()
7376
$this->performEntityTest(Estimate::class);
7477
}
7578

79+
public function testExternalSalesInvoice()
80+
{
81+
$this->performEntityTest(ExternalSalesInvoice::class);
82+
}
83+
84+
public function testExternalSalesInvoiceDetail()
85+
{
86+
$this->performEntityTest(ExternalSalesInvoiceDetail::class);
87+
}
88+
89+
public function testExternalSalesInvoicePayment()
90+
{
91+
$this->performEntityTest(ExternalSalesInvoicePayment::class);
92+
}
93+
7694
public function testFinancialAccountEntity()
7795
{
7896
$this->performEntityTest(FinancialAccount::class);

0 commit comments

Comments
 (0)