More updates to the API and code improvements
This commit is contained in:
parent
4be82315c5
commit
2f1b34a806
137
src/API.php
137
src/API.php
@ -2,12 +2,14 @@
|
|||||||
|
|
||||||
namespace Intuit;
|
namespace Intuit;
|
||||||
|
|
||||||
|
use GuzzleHttp\Exception\ConnectException;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
use Intuit\Models\ProviderToken;
|
use Intuit\Exceptions\{ConnectionIssueException,InvalidQueryResultException};
|
||||||
use Intuit\Response\{Customer,ListList};
|
use Intuit\Models\{ProviderToken};
|
||||||
|
use Intuit\Response\{Customer,Invoice,ListList};
|
||||||
|
|
||||||
final class API
|
final class API
|
||||||
{
|
{
|
||||||
@ -121,13 +123,23 @@ final class API
|
|||||||
try {
|
try {
|
||||||
$response = curl_exec($request);
|
$response = curl_exec($request);
|
||||||
|
|
||||||
switch($x=curl_getinfo($request,CURLINFO_HTTP_CODE)) {
|
switch ($x=curl_getinfo($request,CURLINFO_HTTP_CODE)) {
|
||||||
case 0:
|
case 0:
|
||||||
|
switch (curl_errno($request)) {
|
||||||
|
// DNS Resolving issue
|
||||||
|
case 6:
|
||||||
|
throw new ConnectionIssueException(sprintf('%s:%s',self::LOGKEY,curl_error($request)));
|
||||||
|
|
||||||
|
default:
|
||||||
|
dump(['getinfo' => curl_getinfo($request),'curlerror' => curl_error($request),'errno' => curl_errno($request)]);
|
||||||
|
abort(500,'Error 0');
|
||||||
|
}
|
||||||
|
|
||||||
case 400:
|
case 400:
|
||||||
case 401:
|
case 401:
|
||||||
case 403:
|
case 403:
|
||||||
case 404:
|
case 404:
|
||||||
dump([$xx=curl_getinfo($request),'response'=>$response]);
|
dump([$xx=curl_getinfo($request),'response' => $response]);
|
||||||
|
|
||||||
throw new \Exception(sprintf('CURL exec returned %d: %s (%s)',$x,curl_error($request),serialize($xx)));
|
throw new \Exception(sprintf('CURL exec returned %d: %s (%s)',$x,curl_error($request),serialize($xx)));
|
||||||
}
|
}
|
||||||
@ -139,6 +151,9 @@ final class API
|
|||||||
|
|
||||||
return json_decode(self::CURLOPT_HEADER ? substr($response,curl_getinfo($request,CURLINFO_HEADER_SIZE)) : $response);
|
return json_decode(self::CURLOPT_HEADER ? substr($response,curl_getinfo($request,CURLINFO_HEADER_SIZE)) : $response);
|
||||||
|
|
||||||
|
} catch (ConnectException|ConnectionIssueException $e) {
|
||||||
|
throw new ConnectionIssueException($e->getMessage());
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
dump(['error'=>$e->getMessage()]);
|
dump(['error'=>$e->getMessage()]);
|
||||||
Log::error(sprintf('%s:Got an error while posting to [%s] (%s)',static::LOGKEY,$url,$e->getMessage()),['m'=>__METHOD__]);
|
Log::error(sprintf('%s:Got an error while posting to [%s] (%s)',static::LOGKEY,$url,$e->getMessage()),['m'=>__METHOD__]);
|
||||||
@ -151,6 +166,44 @@ final class API
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of our classes
|
||||||
|
*
|
||||||
|
* @param array $parameters
|
||||||
|
* @return ListList
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function getClasses(array $parameters=[]): ListList
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('%s:Get a list of classes',static::LOGKEY));
|
||||||
|
$key = 'Class';
|
||||||
|
$parameters['query'] = 'select * from Class';
|
||||||
|
|
||||||
|
return new ListList($this->execute('query',$parameters),$key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a customer by their email address
|
||||||
|
*
|
||||||
|
* @param string $id
|
||||||
|
* @param array $parameters
|
||||||
|
* @return Customer
|
||||||
|
* @throws InvalidQueryResultException
|
||||||
|
*/
|
||||||
|
public function getAccountQuery(string $id,array $parameters=[]): Customer
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('%s:Get a specific account [%s]',static::LOGKEY,$id));
|
||||||
|
|
||||||
|
$parameters['query'] = sprintf("select * from Customer where PrimaryEmailAddr='%s'",$id);
|
||||||
|
|
||||||
|
$x = $this->execute('query',$parameters);
|
||||||
|
|
||||||
|
if ((! $x->QueryResponse) || (! $x->QueryResponse->Customer) || (count($x->QueryResponse->Customer) !== 1))
|
||||||
|
throw new InvalidQueryResultException(sprintf('%s:Query response malformed',self::LOGKEY));
|
||||||
|
|
||||||
|
return new Customer($x->QueryResponse);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a specific customer record
|
* Get a specific customer record
|
||||||
*
|
*
|
||||||
@ -166,22 +219,6 @@ final class API
|
|||||||
return new Customer($this->execute('customer/'.$id,$parameters));
|
return new Customer($this->execute('customer/'.$id,$parameters));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a list of our classes
|
|
||||||
*
|
|
||||||
* @param array $parameters
|
|
||||||
* @return ListList
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
public function getClasses(array $parameters=[]): ListList
|
|
||||||
{
|
|
||||||
Log::debug(sprintf('%s:Get a list of classes',static::LOGKEY));
|
|
||||||
$key = 'classes';
|
|
||||||
$parameters['query'] = 'select * from Class';
|
|
||||||
|
|
||||||
return new ListList($this->execute('query',$parameters),$key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of our clients
|
* Get a list of our clients
|
||||||
*
|
*
|
||||||
@ -192,12 +229,34 @@ final class API
|
|||||||
public function getCustomers(array $parameters=[]): ListList
|
public function getCustomers(array $parameters=[]): ListList
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('%s:Get a list of customers',static::LOGKEY));
|
Log::debug(sprintf('%s:Get a list of customers',static::LOGKEY));
|
||||||
$key = 'customers';
|
$key = 'Customer';
|
||||||
$parameters['query'] = 'select * from Customer';
|
$parameters['query'] = 'select * from Customer';
|
||||||
|
|
||||||
return new ListList($this->execute('query',$parameters),$key);
|
return new ListList($this->execute('query',$parameters),$key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an invoice by its Document Number
|
||||||
|
*
|
||||||
|
* @param string $id
|
||||||
|
* @param array $parameters
|
||||||
|
* @return Invoice
|
||||||
|
* @throws InvalidQueryResultException
|
||||||
|
*/
|
||||||
|
public function getInvoiceQuery(string $id,array $parameters=[]): Invoice
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('%s:Get a specific invoice [%s]',static::LOGKEY,$id));
|
||||||
|
|
||||||
|
$parameters['query'] = sprintf("select * from Invoice where DocNumber='%s'",$id);
|
||||||
|
|
||||||
|
$x = $this->execute('query',$parameters);
|
||||||
|
|
||||||
|
if ((! $x->QueryResponse) || (! $x->QueryResponse->Invoice) || (count($x->QueryResponse->Invoice) !== 1))
|
||||||
|
throw new InvalidQueryResultException(sprintf('%s:Query response malformed',self::LOGKEY));
|
||||||
|
|
||||||
|
return new Invoice($x->QueryResponse);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of our invoices
|
* Get a list of our invoices
|
||||||
*
|
*
|
||||||
@ -208,7 +267,7 @@ final class API
|
|||||||
public function getInvoices(array $parameters=[]): ListList
|
public function getInvoices(array $parameters=[]): ListList
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('%s:Get a list of invoices',static::LOGKEY));
|
Log::debug(sprintf('%s:Get a list of invoices',static::LOGKEY));
|
||||||
$key = 'invoices';
|
$key = 'Invoice';
|
||||||
$parameters['query'] = 'select * from Invoice';
|
$parameters['query'] = 'select * from Invoice';
|
||||||
|
|
||||||
return new ListList($this->execute('query',$parameters),$key);
|
return new ListList($this->execute('query',$parameters),$key);
|
||||||
@ -224,12 +283,28 @@ final class API
|
|||||||
public function getItems(array $parameters=[]): ListList
|
public function getItems(array $parameters=[]): ListList
|
||||||
{
|
{
|
||||||
Log::debug(sprintf('%s:Get a list of items',static::LOGKEY));
|
Log::debug(sprintf('%s:Get a list of items',static::LOGKEY));
|
||||||
$key = 'items';
|
$key = 'Item';
|
||||||
$parameters['query'] = 'select * from Item';
|
$parameters['query'] = 'select * from Item';
|
||||||
|
|
||||||
return new ListList($this->execute('query',$parameters),$key);
|
return new ListList($this->execute('query',$parameters),$key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of our invoices
|
||||||
|
*
|
||||||
|
* @param array $parameters
|
||||||
|
* @return ListList
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function getTaxCodes(array $parameters=[]): ListList
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('%s:Get a list of taxes',static::LOGKEY));
|
||||||
|
$key = 'TaxCode';
|
||||||
|
$parameters['query'] = 'select * from Taxcode';
|
||||||
|
|
||||||
|
return new ListList($this->execute('query',$parameters),$key);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the API call
|
* Setup the API call
|
||||||
*
|
*
|
||||||
@ -269,7 +344,21 @@ final class API
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a customer
|
* Create/Update an invoice
|
||||||
|
*
|
||||||
|
* @param array $parameters
|
||||||
|
* @return Invoice
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function updateInvoice(array $parameters=[]): Invoice
|
||||||
|
{
|
||||||
|
Log::debug(sprintf('%s:Update invoice',static::LOGKEY),['params'=>$parameters]);
|
||||||
|
|
||||||
|
return new Invoice($this->execute('invoice',array_merge($parameters,['method'=>'POST'])));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create/Update a customer
|
||||||
*
|
*
|
||||||
* @param array $parameters
|
* @param array $parameters
|
||||||
* @return Customer
|
* @return Customer
|
||||||
|
9
src/Exceptions/ConnectionIssueException.php
Normal file
9
src/Exceptions/ConnectionIssueException.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Exceptions;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class ConnectionIssueException extends Exception
|
||||||
|
{
|
||||||
|
}
|
9
src/Exceptions/InvalidQueryResultException.php
Normal file
9
src/Exceptions/InvalidQueryResultException.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Exceptions;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class InvalidQueryResultException extends Exception
|
||||||
|
{
|
||||||
|
}
|
@ -9,69 +9,73 @@ use Illuminate\Contracts\Queue\ShouldQueue;
|
|||||||
use Illuminate\Foundation\Bus\Dispatchable;
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Support\Facades\Config;
|
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
use Intuit\Models\{Customer,ProviderToken};
|
use Intuit\Models\{Customer,ProviderToken};
|
||||||
|
use App\Models\Account as AppAccount;
|
||||||
|
|
||||||
class AccountingCustomerUpdate implements ShouldQueue
|
class AccountingCustomerUpdate implements ShouldQueue
|
||||||
{
|
{
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
use Dispatchable,InteractsWithQueue,Queueable,SerializesModels;
|
||||||
|
|
||||||
private const LOGKEY = 'JAS';
|
private const LOGKEY = 'JAS';
|
||||||
|
|
||||||
private Customer $customer;
|
private Customer $o;
|
||||||
private ProviderToken $to;
|
private ProviderToken $to;
|
||||||
private bool $forceprod;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new job instance.
|
* Create a new job instance.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(ProviderToken $to,Customer $customer,bool $forcprod=FALSE)
|
public function __construct(ProviderToken $to,Customer $item)
|
||||||
{
|
{
|
||||||
$this->onQueue('intuit');
|
$this->onQueue('intuit');
|
||||||
|
|
||||||
$this->customer = $customer;
|
$this->o = $item;
|
||||||
$this->to = $to->withoutRelations();
|
$this->to = $to->withoutRelations();
|
||||||
$this->forceprod = $forcprod;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the job.
|
* Execute the job.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
Config::set('site',$this->to->site);
|
$api = $this->to->API();
|
||||||
|
|
||||||
|
// Get the original account, so we can get the provider sync details
|
||||||
|
$o = $this->to->provider->accounts->where('id',$x=(int)substr($this->o->ResaleNum,3));
|
||||||
|
$o = ($o->count() === 1) ? $o->pop() : AppAccount::findOrFail($x);
|
||||||
|
|
||||||
$api = $this->to->provider->API($this->to,$this->forceprod);
|
|
||||||
$updated = $api->updateCustomer(array_merge(
|
$updated = $api->updateCustomer(array_merge(
|
||||||
$this->customer->getDirty(),
|
$this->o->getDirty(),
|
||||||
[
|
$o->providers->count()
|
||||||
'Id'=>$this->customer->id,
|
?
|
||||||
'SyncToken'=>$this->customer->synctoken,
|
[
|
||||||
]));
|
'Id'=>$o->pivot->ref,
|
||||||
|
'SyncToken'=>$o->pivot->synctoken,
|
||||||
|
]
|
||||||
|
:
|
||||||
|
[]
|
||||||
|
));
|
||||||
|
|
||||||
if (($x=$this->to->provider->accounts->where('pivot.ref',$updated->id))->count() === 1) {
|
if ($updated instanceof \Intuit\Response\Customer) {
|
||||||
$ao = $x->pop();
|
$o->providers()->syncWithoutDetaching([
|
||||||
|
|
||||||
$ao->providers()->syncWithoutDetaching([
|
|
||||||
$this->to->provider->id => [
|
$this->to->provider->id => [
|
||||||
'ref' => $updated->id,
|
'ref' => $updated->id,
|
||||||
'synctoken' => $updated->synctoken,
|
'synctoken' => $updated->synctoken,
|
||||||
'created_at'=>Carbon::create($updated->created_at),
|
'created_at'=>Carbon::create($updated->created_at),
|
||||||
'updated_at'=>Carbon::create($updated->updated_at),
|
'updated_at'=>Carbon::create($updated->updated_at),
|
||||||
'site_id'=>$ao->site_id, // @todo See if we can have this handled automatically
|
'site_id'=>$o->site_id, // @todo See if we can have this handled automatically
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Log::info(sprintf('%s:Updated account [%s] (%s:%s), synctoken now [%s]',self::LOGKEY,$ao->sid,$updated->id,$updated->DisplayName,$updated->synctoken));
|
Log::info(sprintf('%s:Updated account [%s:%s] (%s:%s), synctoken now [%s]',self::LOGKEY,$this->to->provider->name,$o->sid,$updated->id,$updated->DisplayName,$updated->synctoken));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Log::error(sprintf('%s:Unable to update account refer for [%s:%s]',self::LOGKEY,$updated->id,$updated->DisplayName));
|
Log::error(sprintf('%s:Unable to update account with provider [%s] for [%s:%s]',self::LOGKEY,$this->to->provider->name,$updated->id,$updated->DisplayName),['updated'=>get_class($updated)]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
81
src/Jobs/AccountingInvoiceUpdate.php
Normal file
81
src/Jobs/AccountingInvoiceUpdate.php
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Jobs;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldBeUnique;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
use Intuit\Models\{Invoice,ProviderToken};
|
||||||
|
use App\Models\Invoice as AppInvoice;
|
||||||
|
|
||||||
|
class AccountingInvoiceUpdate implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable,InteractsWithQueue,Queueable,SerializesModels;
|
||||||
|
|
||||||
|
private const LOGKEY = 'JIU';
|
||||||
|
|
||||||
|
private Invoice $o;
|
||||||
|
private ProviderToken $to;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(ProviderToken $to,Invoice $item)
|
||||||
|
{
|
||||||
|
$this->onQueue('intuit');
|
||||||
|
|
||||||
|
$this->o = $item;
|
||||||
|
$this->to = $to->withoutRelations();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$api = $this->to->API();
|
||||||
|
|
||||||
|
// Get the original invoice, so we can get the provider sync details
|
||||||
|
$o = $this->to->provider->invoices->where('id',$this->o->DocNumber);
|
||||||
|
$o = ($o->count() === 1) ? $o->pop() : AppInvoice::findOrFail($this->o->DocNumber);
|
||||||
|
|
||||||
|
$updated = $api->updateInvoice(array_merge(
|
||||||
|
$this->o->getDirty(),
|
||||||
|
$o->providers->count()
|
||||||
|
?
|
||||||
|
[
|
||||||
|
'Id'=>$o->pivot->ref,
|
||||||
|
'SyncToken'=>$o->pivot->synctoken,
|
||||||
|
]
|
||||||
|
:
|
||||||
|
[]
|
||||||
|
));
|
||||||
|
|
||||||
|
if ($updated instanceof \Intuit\Response\Invoice) {
|
||||||
|
$o->providers()->syncWithoutDetaching([
|
||||||
|
$this->to->provider->id => [
|
||||||
|
'ref' => $updated->id,
|
||||||
|
'synctoken' => $updated->synctoken,
|
||||||
|
'created_at'=>Carbon::create($updated->created_at),
|
||||||
|
'updated_at'=>Carbon::create($updated->updated_at),
|
||||||
|
'site_id'=>$o->site_id, // @todo See if we can have this handled automatically
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
Log::info(sprintf('%s:Updated invoice [%s:%s] (%s:%s), synctoken now [%s]',self::LOGKEY,$this->to->provider->name,$o->sid,$updated->id,$updated->DocNumber,$updated->synctoken));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Log::error(sprintf('%s:Unable to update invoice with provider [%s] for [%s:%s]',self::LOGKEY,$this->to->provider->name,$updated->id,$updated->DisplayName),['updated'=>get_class($updated)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
src/Models/Taxcode.php
Normal file
66
src/Models/Taxcode.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Models;
|
||||||
|
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Jenssegers\Model\Model;
|
||||||
|
|
||||||
|
use Intuit\Traits\CompareAttributes;
|
||||||
|
|
||||||
|
/*
|
||||||
|
{#2052
|
||||||
|
+"Name": "GST"
|
||||||
|
+"Description": "GST"
|
||||||
|
+"Active": true
|
||||||
|
+"Hidden": false
|
||||||
|
+"Taxable": true
|
||||||
|
+"TaxGroup": true
|
||||||
|
+"SalesTaxRateList": {#2053
|
||||||
|
+"TaxRateDetail": array:1 [
|
||||||
|
0 => {#2054
|
||||||
|
+"TaxRateRef": {#2055
|
||||||
|
+"value": "23"
|
||||||
|
+"name": "GST (sales)"
|
||||||
|
}
|
||||||
|
+"TaxTypeApplicable": "TaxOnAmount"
|
||||||
|
+"TaxOrder": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
+"PurchaseTaxRateList": {#2056
|
||||||
|
+"TaxRateDetail": []
|
||||||
|
}
|
||||||
|
+"TaxCodeConfigType": "SYSTEM_GENERATED"
|
||||||
|
+"domain": "QBO"
|
||||||
|
+"sparse": false
|
||||||
|
+"Id": "14"
|
||||||
|
+"SyncToken": "0"
|
||||||
|
+"MetaData": {#2057
|
||||||
|
+"CreateTime": "2023-05-10T01:05:41-07:00"
|
||||||
|
+"LastUpdatedTime": "2023-05-10T01:05:41-07:00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
final class Taxcode extends Model
|
||||||
|
{
|
||||||
|
use CompareAttributes;
|
||||||
|
|
||||||
|
public function __get($key) {
|
||||||
|
$keymap = [
|
||||||
|
'id' => 'Id',
|
||||||
|
'synctoken' => 'SyncToken',
|
||||||
|
'name' => 'Name',
|
||||||
|
];
|
||||||
|
|
||||||
|
switch ($key) {
|
||||||
|
case 'created_at':
|
||||||
|
return object_get($this->getAttribute('MetaData'),'CreateTime');
|
||||||
|
case 'updated_at':
|
||||||
|
return object_get($this->getAttribute('MetaData'),'LastUpdatedTime');
|
||||||
|
|
||||||
|
default:
|
||||||
|
return parent::__get(Arr::get($keymap,$key,$key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -34,6 +34,10 @@ abstract class Base implements \JsonSerializable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function __get($key) {
|
||||||
|
return $this->_model->__get($key);
|
||||||
|
}
|
||||||
|
|
||||||
/* ABSTRACT */
|
/* ABSTRACT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Intuit\Response;
|
namespace Intuit\Response;
|
||||||
|
|
||||||
|
use Intuit\Models\Customer as CustomerModel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a Customer Intuit Response to API calls
|
* This is a Customer Intuit Response to API calls
|
||||||
*/
|
*/
|
||||||
@ -16,10 +18,6 @@ class Customer extends Base
|
|||||||
if (object_get($response,'time'))
|
if (object_get($response,'time'))
|
||||||
unset($response->time);
|
unset($response->time);
|
||||||
|
|
||||||
$this->_model = new \Intuit\Models\Customer((array)$response->Customer);
|
$this->_model = new CustomerModel((array)$response->Customer);
|
||||||
}
|
|
||||||
|
|
||||||
public function __get($key) {
|
|
||||||
return $this->_model->__get($key);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
23
src/Response/Invoice.php
Normal file
23
src/Response/Invoice.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Response;
|
||||||
|
|
||||||
|
use Intuit\Models\Invoice as InvoiceModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an Invoice Intuit Response to API calls
|
||||||
|
*/
|
||||||
|
class Invoice extends Base
|
||||||
|
{
|
||||||
|
protected const LOGKEY = 'RII';
|
||||||
|
|
||||||
|
public function __construct(object $response)
|
||||||
|
{
|
||||||
|
parent::__construct($response);
|
||||||
|
|
||||||
|
if (object_get($response,'time'))
|
||||||
|
unset($response->time);
|
||||||
|
|
||||||
|
$this->_model = new InvoiceModel((array)$response->Invoice);
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@ use Illuminate\Support\Collection;
|
|||||||
use Illuminate\Support\Facades\App;
|
use Illuminate\Support\Facades\App;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
use Intuit\Models\{Category,Customer,Invoice,Item};
|
use Intuit\Models\{Category,Customer,Invoice,Item,Taxcode};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a Generic Intuit Response to API calls that produces a list of objects
|
* This is a Generic Intuit Response to API calls that produces a list of objects
|
||||||
@ -23,10 +23,11 @@ class ListList extends Base implements \Countable, \ArrayAccess, \Iterator
|
|||||||
|
|
||||||
private ?int $counter = NULL;
|
private ?int $counter = NULL;
|
||||||
protected const TYPES = [
|
protected const TYPES = [
|
||||||
'classes' => 'Class',
|
'Class' => Category::class,
|
||||||
'customers' => 'Customer',
|
'Customer' => Customer::class,
|
||||||
'invoices' => 'Invoice',
|
'Invoice' => Invoice::class,
|
||||||
'items' => 'Item',
|
'Item' => Item::class,
|
||||||
|
'TaxCode' => Taxcode::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -49,7 +50,7 @@ class ListList extends Base implements \Countable, \ArrayAccess, \Iterator
|
|||||||
$this->_data = $this->data($response,$type);
|
$this->_data = $this->data($response,$type);
|
||||||
|
|
||||||
// This is only for child classes
|
// This is only for child classes
|
||||||
if (get_class($this) == Base::class) {
|
if (get_class($this) === Base::class) {
|
||||||
Log::debug(sprintf('%s:Intuit RESPONSE Initialised [%s]',static::LOGKEY,get_class($this)),['m'=>__METHOD__]);
|
Log::debug(sprintf('%s:Intuit RESPONSE Initialised [%s]',static::LOGKEY,get_class($this)),['m'=>__METHOD__]);
|
||||||
|
|
||||||
if (App::environment() == 'dev')
|
if (App::environment() == 'dev')
|
||||||
@ -66,7 +67,7 @@ class ListList extends Base implements \Countable, \ArrayAccess, \Iterator
|
|||||||
if (count($args) !== 2)
|
if (count($args) !== 2)
|
||||||
throw new \BadMethodCallException(sprintf('Pluck requires to arguments %s::%s()',get_class($this),$name));
|
throw new \BadMethodCallException(sprintf('Pluck requires to arguments %s::%s()',get_class($this),$name));
|
||||||
|
|
||||||
return $this->_data->map(function($item) use ($args) { return [$item->{$args[1]} => $item->{$args[0]}]; })->flatMap(function($item) { return $item; });
|
return collect(array_replace(...$this->_data->map(function($item) use ($args) { return [$item->{$args[1]} => $item->{$args[0]}]; })));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()',get_class($this),$name));
|
throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()',get_class($this),$name));
|
||||||
@ -142,27 +143,33 @@ class ListList extends Base implements \Countable, \ArrayAccess, \Iterator
|
|||||||
*/
|
*/
|
||||||
private function data(object $response,string $type): Collection
|
private function data(object $response,string $type): Collection
|
||||||
{
|
{
|
||||||
if (! ($x=object_get($response->QueryResponse,Arr::get(self::TYPES,$type))))
|
if (! ($x=object_get($response->QueryResponse,$type)))
|
||||||
return collect();
|
return collect();
|
||||||
|
|
||||||
switch ($type) {
|
switch (Arr::get(self::TYPES,$type)) {
|
||||||
case 'classes':
|
case Category::class:
|
||||||
$data = collect(Category::hydrate($x));
|
$data = collect(Category::hydrate($x));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'customers':
|
case Customer::class:
|
||||||
$data = collect(Customer::hydrate($x));
|
$data = collect(Customer::hydrate($x));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'invoices':
|
case Invoice::class:
|
||||||
$data = collect(Invoice::hydrate($x));
|
$data = collect(Invoice::hydrate($x));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'items':
|
case Item::class:
|
||||||
$data = collect(Item::hydrate($x));
|
$data = collect(Item::hydrate($x));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: throw new \Exception('Unknown object type: '.$this->_type);
|
case Taxcode::class:
|
||||||
|
$data = collect(Taxcode::hydrate($x));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Log::error(sprintf('%s:Unknown object type: %s',self::LOGKEY,$type));
|
||||||
|
throw new \Exception(sprintf('%s:Unknown object type: %s',self::LOGKEY,$type));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->startPosition = $response->QueryResponse->startPosition;
|
$this->startPosition = $response->QueryResponse->startPosition;
|
||||||
|
23
src/Response/Taxcode.php
Normal file
23
src/Response/Taxcode.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Intuit\Response;
|
||||||
|
|
||||||
|
use Intuit\Models\Tax as TaxModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an Invoice Intuit Response to API calls
|
||||||
|
*/
|
||||||
|
class Taxcode extends Base
|
||||||
|
{
|
||||||
|
protected const LOGKEY = 'RTI';
|
||||||
|
|
||||||
|
public function __construct(object $response)
|
||||||
|
{
|
||||||
|
parent::__construct($response);
|
||||||
|
|
||||||
|
if (object_get($response,'time'))
|
||||||
|
unset($response->time);
|
||||||
|
|
||||||
|
$this->_model = new TaxModel((array)$response->Tax);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user