src/Domain/Whater/Model/Analytical.php line 18

Open in your IDE?
  1. <?php
  2. namespace Whater\Domain\Whater\Model;
  3. use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
  4. use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Doctrine\Common\Collections\Collection;
  7. use Ramsey\Uuid\Uuid;
  8. use Whater\Domain\Common\Exception\InvalidUUIDException;
  9. use Whater\Domain\Common\Exception\InvalidAnalyticException;
  10. /**
  11. * Class Analytical
  12. *
  13. * @package Whater\Domain\Whater\Model
  14. */
  15. class Analytical implements ContainsRecordedEvents
  16. {
  17. const ANALYTICAL_SUITABLE = 'SUITABLE';
  18. const ANALYTICAL_NOT_SUITABLE = 'NOT_SUITABLE';
  19. const ANALYTICAL_UNKNOWN = 'UNKNOWN';
  20. const CREATED_FROM_WHATER = 'whater';
  21. const CREATED_FROM_SINAC = 'sinac';
  22. const CREATED_FROM_OROBNAT = 'orobnat';
  23. const TYPE_CONTROL = 'TYPE_CONTROL';
  24. const TYPE_COMPLETE = 'TYPE_COMPLETE';
  25. const TYPE_RADIOACTIVITY = 'TYPE_RADIOACTIVITY';
  26. const TYPE_HEALTH_SURVEILLANCE = 'TYPE_HEALTH_SURVEILLANCE';
  27. use EventRecorderCapabilities;
  28. /**
  29. * @var string
  30. */
  31. private $uuid;
  32. /**
  33. * @var string
  34. */
  35. private $analyticalType;
  36. /**
  37. * @var Collection
  38. */
  39. private $samples;
  40. /**
  41. * @var WhaterPoint
  42. */
  43. private $whaterPoint;
  44. /**
  45. * @var WhaterOrganization
  46. */
  47. private $responsable;
  48. /**
  49. * @var string
  50. */
  51. private $source;
  52. /**
  53. * @var string
  54. */
  55. private $createdFrom;
  56. /**
  57. * @var string
  58. */
  59. private $result;
  60. /**
  61. * @var string
  62. */
  63. private $sinacBulletinNumber;
  64. /**
  65. * @var string
  66. */
  67. private $comments;
  68. /**
  69. * @var \DateTime
  70. */
  71. private $analyzedAt;
  72. /**
  73. * @var \DateTime
  74. */
  75. private $createdAt;
  76. /**
  77. * @var DistributionNetwork
  78. */
  79. private $distributionNetwork;
  80. /**
  81. * @var Collection
  82. */
  83. private $analyticalMedias;
  84. public function __construct(
  85. string $analyticalId = null,
  86. DistributionNetwork $distributionNetwork = null,
  87. WhaterPoint $whaterPoint = null,
  88. string $source,
  89. string $result = Analytical::ANALYTICAL_SUITABLE,
  90. string $createdFrom = Analytical::CREATED_FROM_WHATER,
  91. string $comments = null,
  92. \DateTime $analyzedAt = null,
  93. string $sinacBulletinNumber = null
  94. ) {
  95. try {
  96. $this->uuid = Uuid::fromString($analyticalId ?: Uuid::uuid4())->toString();
  97. } catch (\InvalidArgumentException $e) {
  98. throw new InvalidUUIDException();
  99. }
  100. if ($distributionNetwork == null && $whaterPoint == null) {
  101. throw new InvalidAnalyticException();
  102. }
  103. if ($distributionNetwork != null) {
  104. $this->distributionNetwork = $distributionNetwork;
  105. }
  106. if ($whaterPoint != null) {
  107. $this->whaterPoint = $whaterPoint;
  108. }
  109. $this->source = $source;
  110. switch ($result) {
  111. case Analytical::ANALYTICAL_NOT_SUITABLE:
  112. case Analytical::ANALYTICAL_SUITABLE:
  113. case Analytical::ANALYTICAL_UNKNOWN:
  114. $this->result = $result;
  115. break;
  116. default:
  117. $this->result = Analytical::ANALYTICAL_UNKNOWN;
  118. }
  119. $this->comments = $comments;
  120. switch ($createdFrom) {
  121. case Analytical::CREATED_FROM_SINAC:
  122. case Analytical::CREATED_FROM_WHATER:
  123. case Analytical::CREATED_FROM_OROBNAT:
  124. $this->createdFrom = $createdFrom;
  125. break;
  126. default:
  127. $this->createdFrom = Analytical::CREATED_FROM_WHATER;
  128. break;
  129. }
  130. $this->sinacBulletinNumber = $sinacBulletinNumber;
  131. $this->analyzedAt = $analyzedAt;
  132. $this->samples = new ArrayCollection();
  133. $this->createdAt = new \DateTime();
  134. $this->analyticalMedias = new ArrayCollection();
  135. if (is_null($this->analyzedAt)) {
  136. $this->analyzedAt = $this->createdAt;
  137. }
  138. }
  139. public function updateAnalyticalType(string $analyticalType)
  140. {
  141. switch ($analyticalType) {
  142. case Analytical::TYPE_COMPLETE:
  143. case Analytical::TYPE_CONTROL:
  144. case Analytical::TYPE_HEALTH_SURVEILLANCE:
  145. case Analytical::TYPE_RADIOACTIVITY:
  146. $this->analyticalType = $analyticalType;
  147. break;
  148. default:
  149. throw new \Exception('Invalid analytical type');
  150. }
  151. }
  152. public function updateData(
  153. string $source,
  154. string $result,
  155. \DateTime $analyzedAt = null,
  156. string $comments = null
  157. ) {
  158. $this->source = $source;
  159. switch ($result) {
  160. case Analytical::ANALYTICAL_NOT_SUITABLE:
  161. case Analytical::ANALYTICAL_SUITABLE:
  162. case Analytical::ANALYTICAL_UNKNOWN:
  163. $this->result = $result;
  164. break;
  165. default:
  166. $this->result = Analytical::ANALYTICAL_UNKNOWN;
  167. }
  168. if ($analyzedAt != null) {
  169. $this->analyzedAt = $analyzedAt;
  170. }
  171. if ($comments != null) {
  172. $this->comments = $comments;
  173. }
  174. }
  175. public function updateSinacBulletinNumber(
  176. string $sinacBulletinNumber
  177. ) {
  178. $this->sinacBulletinNumber = $sinacBulletinNumber;
  179. }
  180. public function updateResponsable(
  181. WhaterOrganization $responsable,
  182. ) {
  183. $this->responsable = $responsable;
  184. }
  185. /**
  186. * @return string
  187. */
  188. public function id(): string
  189. {
  190. return $this->uuid;
  191. }
  192. /**
  193. * @return string
  194. */
  195. public function result(): string
  196. {
  197. return $this->result;
  198. }
  199. /**
  200. * @return string
  201. */
  202. public function source(): string
  203. {
  204. return $this->source;
  205. }
  206. /**
  207. * @return string
  208. */
  209. public function analyticalType(): ?string
  210. {
  211. return $this->analyticalType;
  212. }
  213. /**
  214. * @return string
  215. */
  216. public function createdFrom(): string
  217. {
  218. return $this->createdFrom;
  219. }
  220. /**
  221. * @return string
  222. */
  223. public function sinacBulletinNumber(): ?string
  224. {
  225. return $this->sinacBulletinNumber;
  226. }
  227. /**
  228. * @return string|null
  229. */
  230. public function comments(): ?string
  231. {
  232. return $this->comments;
  233. }
  234. /**
  235. * @return WhaterPoint|null
  236. */
  237. public function whaterPoint(): ?WhaterPoint
  238. {
  239. return $this->whaterPoint;
  240. }
  241. /**
  242. * @return Collection
  243. */
  244. public function samples(): Collection
  245. {
  246. return $this->samples;
  247. }
  248. /**
  249. * @return \DateTime
  250. */
  251. public function analyzedAt(): \DateTime
  252. {
  253. return $this->analyzedAt;
  254. }
  255. /**
  256. * @return \DateTime
  257. */
  258. public function createdAt(): \DateTime
  259. {
  260. return $this->createdAt;
  261. }
  262. public function analyticalMedias(): Collection
  263. {
  264. return $this->analyticalMedias;
  265. }
  266. /**
  267. * @return bool
  268. */
  269. public function equals(Analytical $Analytical)
  270. {
  271. return $this->id() === $Analytical->id();
  272. }
  273. /**
  274. * @return string
  275. */
  276. public function analyticalDataHash()
  277. {
  278. $analyticalDataHash = md5($this->source());
  279. if ($this->analyzedAt() != null) {
  280. $analyticalDataHash = md5($analyticalDataHash . $this->analyzedAt()->format('c'));
  281. $analyticalDataHash = md5($analyticalDataHash . $this->createdFrom());
  282. }
  283. return $analyticalDataHash;
  284. }
  285. /**
  286. * @return DistributionNetwork
  287. */
  288. public function distributionNetwork(): ?DistributionNetwork
  289. {
  290. return $this->distributionNetwork;
  291. }
  292. /**
  293. * @return WhaterOrganization
  294. */
  295. public function responsable(): ?WhaterOrganization
  296. {
  297. return $this->responsable;
  298. }
  299. }