chartmogul/chartmogul-php

View on GitHub
src/Customer.php

Summary

Maintainability
B
4 hrs
Test Coverage
F
24%
File `Customer.php` has 253 lines of code (exceeds 250 allowed). Consider refactoring.
<?php
 
namespace ChartMogul;
 
use ChartMogul\Resource\AbstractResource;
use ChartMogul\Resource\Collection;
use ChartMogul\Resource\CollectionWithCursor;
use ChartMogul\Http\ClientInterface;
use ChartMogul\Service\UpdateTrait;
use ChartMogul\Service\CreateTrait;
use ChartMogul\Service\AllTrait;
use ChartMogul\Service\DestroyTrait;
use ChartMogul\Service\GetTrait;
 
/**
* @property-read string $id
* @property-read string $uuid
* @property-read string $external_id
* @property-read string $name
* @property-read string $email
* @property-read string $status
* @property-read string $customer_since
* @property-read array $attributes
* @property-read string $address
* @property-read string $mrr
* @property-read string $arr
* @property-read string $billing_system_url
* @property-read string $chartmogul_url
* @property-read string $billing_system_type
* @property-read string $currency
* @property-read string $currency_sign
*/
`Customer` has 21 functions (exceeds 20 allowed). Consider refactoring.
class Customer extends AbstractResource
{
use CreateTrait;
use AllTrait;
use GetTrait;
use DestroyTrait;
use UpdateTrait;
 
/**
* @ignore
*/
public const RESOURCE_NAME = 'Customer';
/**
* @ignore
*/
public const RESOURCE_PATH = '/v1/customers';
public const RESOURCE_ID = 'customer_uuid';
public const ROOT_KEY = 'entries';
 
protected $id;
protected $uuid;
 
protected $address;
protected $arr;
protected $attributes;
protected $billing_system_type;
protected $billing_system_url;
protected $chartmogul_url;
protected $company;
protected $currency;
protected $currency_sign;
protected $customer_since;
protected $email;
protected $external_id;
protected $mrr;
protected $name;
protected $owner;
protected $status;
 
// PATCH = Update a customer
protected $data_source_uuid;
protected $data_source_uuids;
protected $external_ids;
protected $free_trial_started_at;
protected $lead_created_at;
protected $website_url;
 
protected $city;
protected $country;
protected $state;
protected $zip;
 
private $invoices;
private $subscriptions;
 
/**
* Get Customer Tags
*
* @return array
*/
public function tags()
{
return $this->attributes['tags'];
}
 
/**
* Get Customer Custom Attributes
*
* @return array
*/
public function customAttributes()
{
return $this->attributes['custom'];
}
 
/**
* Find a Customer by External ID. Returns only first result!
*
* @param string|array $externalId
* @param ClientInterface|null $client
* @return Customer|null
*/
public static function findByExternalId($externalId, ?ClientInterface $client = null)
{
if (gettype($externalId) == 'string') {
$externalId = ['external_id' => $externalId];
}
 
$response = self::all($externalId, $client);
 
if ($response instanceof Collection
&& !$response->isEmpty()
) {
return $response->first();
}
 
return null;
}
 
/**
* Search for Customers
*
* @param string $email
* @param ClientInterface|null $client
* @return Collection|static
*/
public static function search($email, ?ClientInterface $client = null)
{
$response = (new static([], $client))
->getClient()
->setResourceKey(static::RESOURCE_NAME)
->send('/v1/customers/search', 'GET', ['email' => $email]);
 
return static::fromArray($response, $client);
}
 
/**
* Merge Customers
*
* @param array $from
* @param array $into
* @param ClientInterface|null $client
* @return bool
*/
public static function merge($from, $into, ?ClientInterface $client = null)
{
(new static([], $client))
->getClient()
->setResourcekey(static::class)
->send(
'/v1/customers/merges',
'POST',
[
'from' => $from,
'into' => $into
]
);
return true;
}
 
/**
* Unmerge Customers
*
* @param string $customer_uuid
* @param string $external_id
* @param string $data_source_uuid
* @param array $move_to_new_customer
* @param ClientInterface|null $client
* @return bool
*/
Method `unmerge` has 5 arguments (exceeds 4 allowed). Consider refactoring.
public static function unmerge($customer_uuid, $external_id, $data_source_uuid, array $move_to_new_customer = [], ?ClientInterface $client = null)
{
(new static([], $client))
->getClient()
->setResourcekey(static::class)
->send(
'/v1/customers/unmerges',
'POST',
[
'customer_uuid' => $customer_uuid,
'external_id' => $external_id,
'data_source_uuid' => $data_source_uuid,
'move_to_new_customer' => $move_to_new_customer
]
);
return true;
}
 
/**
* Connect Subscriptions
*
* @param string $customerUUID
* @param array $data
* @param ClientInterface|null $client
* @return bool
*/
public static function connectSubscriptions($customerUUID, array $data = [], ?ClientInterface $client = null)
{
(new static([], $client))
->getClient()
->setResourcekey(static::class)
->send('/v1/customers/'.$customerUUID.'/connect_subscriptions', 'POST', $data);
return true;
}
 
/**
* Disconnect Subscriptions
*
* @param string $customerUUID
* @param array $data
* @param ClientInterface|null $client
* @return bool
*/
public static function disconnectSubscriptions($customerUUID, array $data = [], ?ClientInterface $client = null)
{
(new static([], $client))
->getClient()
->setResourcekey(static::class)
->send('/v1/customers/'.$customerUUID.'/disconnect_subscriptions', 'POST', $data);
return true;
}
 
 
/**
* Add tags to a customer
*
* @param mixed $tags,...
* @return array
*/
public function addTags($tags)
{
$result = $this->getClient()
->send(
'/v1/customers/'.$this->uuid.'/attributes/tags',
'POST',
[
'tags' => func_get_args()
]
);
 
$this->attributes['tags'] = $result['tags'];
return $result['tags'];
}
 
 
/**
* Remove Tags from a Customer
*
* @param mixed $tags,...
* @return array
*/
public function removeTags($tags)
{
$result = $this->getClient()
->send(
'/v1/customers/'.$this->uuid.'/attributes/tags',
'DELETE',
[
'tags' => func_get_args()
]
);
 
$this->attributes['tags'] = $result['tags'];
return $result['tags'];
}
 
/**
* Add Custom Attributes to a Customer
*
* @param mixed $custom,...
* @return array
*/
public function addCustomAttributes($custom)
{
$result = $this->getClient()
->send(
'/v1/customers/'.$this->uuid.'/attributes/custom',
'POST',
[
'custom' => func_get_args()
]
);
 
$this->attributes['custom'] = $result['custom'];
return $result['custom'];
}
 
 
/**
* Remove Custom Attributes from a Customer
*
* @param mixed $custom,...
* @return array
*/
public function removeCustomAttributes($custom)
{
$result = $this->getClient()
->send(
'/v1/customers/'.$this->uuid.'/attributes/custom',
'DELETE',
[
'custom' => func_get_args()
]
);
 
$this->attributes['custom'] = $result['custom'];
return $result['custom'];
}
 
/**
* Update Custom Attributes of a Customer
*
* @param mixed $custom,...
* @return array
*/
public function updateCustomAttributes($custom)
{
$data = [];
foreach (func_get_args() as $value) {
$data = array_merge($data, $value);
}
$result = $this->getClient()
->send(
'/v1/customers/'.$this->uuid.'/attributes/custom',
'PUT',
[
'custom' => $data
]
);
 
$this->attributes['custom'] = $result['custom'];
return $result['custom'];
}
 
/**
* Find a Customer Subscriptions
*
* @param array $options
* @return Collection | Customer
* @deprecated Use Import\Subscription.
*/
public function subscriptions(array $options = [])
{
if (!isset($this->subscriptions)) {
$options['customer_uuid'] = $this->uuid;
$this->subscriptions = Subscription::all($options);
}
return $this->subscriptions;
}
 
/**
* Find customer's invoices
*
* @param array $options
* @return Collection | Customer
* @deprecated Use Import\CustomerInvoices.
*/
public function invoices(array $options = [])
{
if (!isset($this->invoices)) {
$options['customer_uuid'] = $this->uuid;
$this->invoices = CustomerInvoices::all($options)->invoices;
}
return $this->invoices;
}
 
/**
* Find all contacts in a customer
*
* @param array $options
* @return CollectionWithCursor
*/
public function contacts(array $options = [])
{
$client = $this->getClient();
$result = $client->send("/v1/customers/".$this->uuid."/contacts", "GET", $options);
 
return Contact::fromArray($result, $client);
}
 
/**
* Creates a contact from the customer.
*
* @param array $data
* @return Contact
*/
public function createContact(array $data = [])
{
$client = $this->getClient();
$result = $client->send("/v1/customers/".$this->uuid."/contacts", "POST", $data);
 
return new Contact($result, $client);
}
 
/**
* Find all customer notes in a customer
*
* @param array $options
* @return CollectionWithCursor
*/
public function notes(array $options = [])
{
$client = $this->getClient();
$result = $client->send("/v1/customer_notes", "GET", [$options, "customer_uuid" => $this->uuid]);
 
return CustomerNote::fromArray($result, $client);
}
 
/**
* Creates a customer note from the customer.
*
* @param array $data
* @return CustomerNote
*/
public function createNote(array $data = [])
{
$client = $this->getClient();
$data["customer_uuid"] = $this->uuid;
$result = $client->send("/v1/customer_notes", "POST", $data);
 
return new CustomerNote($result, $client);
}
 
/**
* Find all opportunities for a customer
*
* @param array $options
* @return CollectionWithCursor
*/
public function opportunities(array $options = [])
{
$client = $this->getClient();
$result = $client->send("/v1/opportunities", "GET", [$options, "customer_uuid" => $this->uuid]);
 
return Opportunity::fromArray($result, $client);
}
 
/**
* Creates an opportunity from the customer.
*
* @param array $data
* @return Opportunity
*/
public function createOpportunity(array $data = [])
{
$client = $this->getClient();
$data["customer_uuid"] = $this->uuid;
$result = $client->send("/v1/opportunities", "POST", $data);
 
return new Opportunity($result, $client);
}
}