mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-27 07:00:29 +01:00
217 lines
6.7 KiB
PHP
217 lines
6.7 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace Xentral\Modules\Pipedrive\Service;
|
||
|
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveClientException;
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveConfigurationException;
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveDealServiceException;
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveHttpClientException;
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveMetaException;
|
||
|
use Xentral\Modules\Pipedrive\Exception\PipedriveValidatorException;
|
||
|
use Xentral\Modules\Pipedrive\Validator\PipedriveDealValidator;
|
||
|
|
||
|
final class PipedriveDealService
|
||
|
{
|
||
|
/** @var array $allowedSyncDealsOptions */
|
||
|
private $allowedSyncDealsOptions = [
|
||
|
'pipedrive_recently_updated_deals' => 'getRecentlyUpdatedDeals',
|
||
|
'pipedrive_all_deals' => 'getDeals',
|
||
|
];
|
||
|
|
||
|
/** @var array $itemOption */
|
||
|
private $itemOption = [
|
||
|
'limit' => 100,
|
||
|
'items' => 'deal',
|
||
|
'start' => 0,
|
||
|
'since_timestamp' => '1970-01-01 23:59:59',
|
||
|
];
|
||
|
|
||
|
/** @var PipedriveClientService $client */
|
||
|
private $client;
|
||
|
|
||
|
/** @var PipedriveDealValidator $validator */
|
||
|
private $validator;
|
||
|
|
||
|
/** @var PipedriveMetaReaderService $metaReaderService */
|
||
|
private $metaReaderService;
|
||
|
|
||
|
/**
|
||
|
* @param PipedriveClientService $client
|
||
|
* @param PipedriveDealValidator $validator
|
||
|
* @param PipedriveMetaReaderService $metaReaderService
|
||
|
*/
|
||
|
public function __construct(
|
||
|
PipedriveClientService $client,
|
||
|
PipedriveDealValidator $validator,
|
||
|
PipedriveMetaReaderService $metaReaderService
|
||
|
) {
|
||
|
$this->client = $client;
|
||
|
$this->validator = $validator;
|
||
|
$this->metaReaderService = $metaReaderService;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $data
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveDealServiceException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
* @throws PipedriveValidatorException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function createDeal(array $data = []): PipedriveServerResponseInterface
|
||
|
{
|
||
|
$default = ['status' => 'open', 'stage_id' => 1];
|
||
|
$data += $default;
|
||
|
|
||
|
if (!$this->validator->isValid($data)) {
|
||
|
throw new PipedriveDealServiceException(sprintf('%s::createDeal Invalid Deal data', get_class($this)));
|
||
|
}
|
||
|
|
||
|
$deal = $this->validator->getData();
|
||
|
|
||
|
return $this->client->post('createDeal', $deal);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $dealId
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function getDealById(int $dealId): PipedriveServerResponseInterface
|
||
|
{
|
||
|
return $this->client->read('getDealById', [], [$dealId]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $options
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function getDeals(array $options = []): PipedriveServerResponseInterface
|
||
|
{
|
||
|
$options += $this->itemOption;
|
||
|
|
||
|
return $this->client->read('allDeals', $options);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $options
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function getRecentlyUpdatedDeals(array $options = []): PipedriveServerResponseInterface
|
||
|
{
|
||
|
$options += $this->itemOption;
|
||
|
|
||
|
return $this->client->read('recentlyUpdatedDeals', $options);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $dealId
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function deleteDeal(int $dealId): PipedriveServerResponseInterface
|
||
|
{
|
||
|
return $this->client->delete('deleteDeal', [$dealId]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $dealId
|
||
|
* @param array $data
|
||
|
*
|
||
|
* @throws PipedriveClientException
|
||
|
* @throws PipedriveConfigurationException
|
||
|
* @throws PipedriveDealServiceException
|
||
|
* @throws PipedriveHttpClientException
|
||
|
* @throws PipedriveMetaException
|
||
|
* @throws PipedriveValidatorException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function updateDealById(int $dealId, array $data = []): PipedriveServerResponseInterface
|
||
|
{
|
||
|
if (!$this->validator->isValid($data)) {
|
||
|
throw new PipedriveDealServiceException(sprintf('%s::updateDealById Invalid Deal data', get_class($this)));
|
||
|
}
|
||
|
|
||
|
$deal = $this->validator->getData();
|
||
|
|
||
|
return $this->client->put('updateDeal', $deal, [$dealId]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $type
|
||
|
* @param array $options
|
||
|
*
|
||
|
* @throws PipedriveDealServiceException
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return PipedriveServerResponseInterface
|
||
|
*/
|
||
|
public function pullDeals(
|
||
|
string $type = 'pipedrive_recently_updated_deals',
|
||
|
array $options = []
|
||
|
): PipedriveServerResponseInterface {
|
||
|
if ('pipedrive_all_deals' !== $type && !array_key_exists($type, $this->allowedSyncDealsOptions)) {
|
||
|
throw new PipedriveDealServiceException(sprintf('Sync Type %s not allowed', $type));
|
||
|
}
|
||
|
$metaFile = sprintf('%s.json', $type);
|
||
|
if ($type !== 'pipedrive_all_deals') {
|
||
|
$options = $this->addMetaOption($metaFile, $options);
|
||
|
}
|
||
|
|
||
|
/** @var PipedriveServerResponseInterface $response */
|
||
|
return $this->{$this->allowedSyncDealsOptions[$type]}($options);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $metaFile
|
||
|
* @param array $options
|
||
|
*
|
||
|
* @throws PipedriveMetaException
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function addMetaOption(string $metaFile, array $options) : array
|
||
|
{
|
||
|
$metaInfo = $this->metaReaderService->readFromFile($metaFile);
|
||
|
|
||
|
if (!empty($metaInfo)) {
|
||
|
$timeOffset = $metaInfo['timeOffset'];
|
||
|
$offset = strtotime($metaInfo['timeOffset']);
|
||
|
if ($offset !== false) {
|
||
|
$timeOffset = gmdate('Y-m-d H:i:s', $offset - 3600);
|
||
|
}
|
||
|
$options = array_merge($options, ['since_timestamp' => $timeOffset]);
|
||
|
}
|
||
|
return $options;
|
||
|
}
|
||
|
}
|