Completed
Push — master ( c011fc...384d9c )
by Milan
01:49
created

src/Response/Read/JsonTransactionFactory.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace h4kuna\Fio\Response\Read;
4
5
use h4kuna\Fio,
6
	h4kuna\Fio\Utils;
7
8
/**
9
 * @author Milan Matějček
10
 */
11
class JsonTransactionFactory implements ITransactionListFactory
12
{
13
14
	/** @var string[] */
15
	private static $property;
16
17
	/** @var string */
18
	private $transactionClass;
19
20
	/** @var bool */
21
	protected $transactionClassCheck = false;
22
23
	/**
24
	 * @param string $transactionClass
25
	 */
26
	public function __construct($transactionClass = null)
27
	{
28
		if ($transactionClass === null) {
29
			$transactionClass = __NAMESPACE__ . '\Transaction';
30
		}
31
		$this->transactionClass = $transactionClass;
32
	}
33
34
	public function createInfo($data, $dateFormat)
35
	{
36
		$data->dateStart = Utils\Strings::createFromFormat($data->dateStart, $dateFormat);
37
		$data->dateEnd = Utils\Strings::createFromFormat($data->dateEnd, $dateFormat);
38
		return $data;
39
	}
40
41
	public function createTransaction($data, $dateFormat)
42
	{
43
		$transaction = $this->createTransactionObject($dateFormat);
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createTransactionObject($dateFormat); of type h4kuna\Fio\Response\Read...nsactionAbstract|string adds the type string to the return on line 48 which is incompatible with the return type declared by the interface h4kuna\Fio\Response\Read...tory::createTransaction of type h4kuna\Fio\Response\Read\TransactionAbstract.
Loading history...
44
		foreach (self::metaProperty($transaction) as $id => $meta) {
45
			$value = isset($data->{'column' . $id}) ? $data->{'column' . $id}->value : null;
46
			$transaction->bindProperty($meta['name'], $meta['type'], $value);
47
		}
48
		return $transaction;
49
	}
50
51
	/** @return TransactionList */
52
	public function createTransactionList($info)
53
	{
54
		return new TransactionList($info);
55
	}
56
57
	protected function createTransactionObject($dateFormat)
58
	{
59
		if ($this->transactionClassCheck === false) {
60
			if (is_string($this->transactionClass)) {
61
				$class = $this->transactionClass;
62
				$this->transactionClass = new $class($dateFormat);
0 ignored issues
show
Documentation Bug introduced by
It seems like new $class($dateFormat) of type object is incompatible with the declared type string of property $transactionClass.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
63
			} else {
64
				throw new Fio\InvalidArgumentException('Add you class as string.');
65
			}
66
67
			if (!$this->transactionClass instanceof TransactionAbstract) {
68
				throw new Fio\TransactionExtendException('Transaction class must extends TransationAbstract.');
69
			}
70
			$this->transactionClassCheck = true;
71
		}
72
73
		return clone $this->transactionClass;
74
	}
75
76
	private static function metaProperty($class)
77
	{
78
		if (self::$property !== null) {
79
			return self::$property;
80
		}
81
		$reflection = new \ReflectionClass($class);
82
		if (!preg_match_all('/@property-read (?P<type>[\w|]+) \$(?P<name>\w+).*\[(?P<id>\d+)\]/', $reflection->getDocComment(), $find)) {
83
			throw new Fio\TransactionPropertyException('Property not found you have bad syntax.');
84
		}
85
86
		self::$property = [];
87
		foreach ($find['name'] as $key => $property) {
88
			self::$property[$find['id'][$key]] = ['type' => strtolower($find['type'][$key]), 'name' => $property];
89
		}
90
		return self::$property;
91
	}
92
93
}
94