<?php
namespace Whater\Domain\Whater\Model;
use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Ramsey\Uuid\Uuid;
use Whater\Domain\Common\Exception\InvalidUUIDException;
use Whater\Domain\Common\Exception\InvalidAnalyticException;
/**
* Class Analytical
*
* @package Whater\Domain\Whater\Model
*/
class Analytical implements ContainsRecordedEvents
{
const ANALYTICAL_SUITABLE = 'SUITABLE';
const ANALYTICAL_NOT_SUITABLE = 'NOT_SUITABLE';
const ANALYTICAL_UNKNOWN = 'UNKNOWN';
const CREATED_FROM_WHATER = 'whater';
const CREATED_FROM_SINAC = 'sinac';
const CREATED_FROM_OROBNAT = 'orobnat';
const TYPE_CONTROL = 'TYPE_CONTROL';
const TYPE_COMPLETE = 'TYPE_COMPLETE';
const TYPE_RADIOACTIVITY = 'TYPE_RADIOACTIVITY';
const TYPE_HEALTH_SURVEILLANCE = 'TYPE_HEALTH_SURVEILLANCE';
use EventRecorderCapabilities;
/**
* @var string
*/
private $uuid;
/**
* @var string
*/
private $analyticalType;
/**
* @var Collection
*/
private $samples;
/**
* @var WhaterPoint
*/
private $whaterPoint;
/**
* @var WhaterOrganization
*/
private $responsable;
/**
* @var string
*/
private $source;
/**
* @var string
*/
private $createdFrom;
/**
* @var string
*/
private $result;
/**
* @var string
*/
private $sinacBulletinNumber;
/**
* @var string
*/
private $comments;
/**
* @var \DateTime
*/
private $analyzedAt;
/**
* @var \DateTime
*/
private $createdAt;
/**
* @var DistributionNetwork
*/
private $distributionNetwork;
/**
* @var Collection
*/
private $analyticalMedias;
public function __construct(
string $analyticalId = null,
DistributionNetwork $distributionNetwork = null,
WhaterPoint $whaterPoint = null,
string $source,
string $result = Analytical::ANALYTICAL_SUITABLE,
string $createdFrom = Analytical::CREATED_FROM_WHATER,
string $comments = null,
\DateTime $analyzedAt = null,
string $sinacBulletinNumber = null
) {
try {
$this->uuid = Uuid::fromString($analyticalId ?: Uuid::uuid4())->toString();
} catch (\InvalidArgumentException $e) {
throw new InvalidUUIDException();
}
if ($distributionNetwork == null && $whaterPoint == null) {
throw new InvalidAnalyticException();
}
if ($distributionNetwork != null) {
$this->distributionNetwork = $distributionNetwork;
}
if ($whaterPoint != null) {
$this->whaterPoint = $whaterPoint;
}
$this->source = $source;
switch ($result) {
case Analytical::ANALYTICAL_NOT_SUITABLE:
case Analytical::ANALYTICAL_SUITABLE:
case Analytical::ANALYTICAL_UNKNOWN:
$this->result = $result;
break;
default:
$this->result = Analytical::ANALYTICAL_UNKNOWN;
}
$this->comments = $comments;
switch ($createdFrom) {
case Analytical::CREATED_FROM_SINAC:
case Analytical::CREATED_FROM_WHATER:
case Analytical::CREATED_FROM_OROBNAT:
$this->createdFrom = $createdFrom;
break;
default:
$this->createdFrom = Analytical::CREATED_FROM_WHATER;
break;
}
$this->sinacBulletinNumber = $sinacBulletinNumber;
$this->analyzedAt = $analyzedAt;
$this->samples = new ArrayCollection();
$this->createdAt = new \DateTime();
$this->analyticalMedias = new ArrayCollection();
if (is_null($this->analyzedAt)) {
$this->analyzedAt = $this->createdAt;
}
}
public function updateAnalyticalType(string $analyticalType)
{
switch ($analyticalType) {
case Analytical::TYPE_COMPLETE:
case Analytical::TYPE_CONTROL:
case Analytical::TYPE_HEALTH_SURVEILLANCE:
case Analytical::TYPE_RADIOACTIVITY:
$this->analyticalType = $analyticalType;
break;
default:
throw new \Exception('Invalid analytical type');
}
}
public function updateData(
string $source,
string $result,
\DateTime $analyzedAt = null,
string $comments = null
) {
$this->source = $source;
switch ($result) {
case Analytical::ANALYTICAL_NOT_SUITABLE:
case Analytical::ANALYTICAL_SUITABLE:
case Analytical::ANALYTICAL_UNKNOWN:
$this->result = $result;
break;
default:
$this->result = Analytical::ANALYTICAL_UNKNOWN;
}
if ($analyzedAt != null) {
$this->analyzedAt = $analyzedAt;
}
if ($comments != null) {
$this->comments = $comments;
}
}
public function updateSinacBulletinNumber(
string $sinacBulletinNumber
) {
$this->sinacBulletinNumber = $sinacBulletinNumber;
}
public function updateResponsable(
WhaterOrganization $responsable,
) {
$this->responsable = $responsable;
}
/**
* @return string
*/
public function id(): string
{
return $this->uuid;
}
/**
* @return string
*/
public function result(): string
{
return $this->result;
}
/**
* @return string
*/
public function source(): string
{
return $this->source;
}
/**
* @return string
*/
public function analyticalType(): ?string
{
return $this->analyticalType;
}
/**
* @return string
*/
public function createdFrom(): string
{
return $this->createdFrom;
}
/**
* @return string
*/
public function sinacBulletinNumber(): ?string
{
return $this->sinacBulletinNumber;
}
/**
* @return string|null
*/
public function comments(): ?string
{
return $this->comments;
}
/**
* @return WhaterPoint|null
*/
public function whaterPoint(): ?WhaterPoint
{
return $this->whaterPoint;
}
/**
* @return Collection
*/
public function samples(): Collection
{
return $this->samples;
}
/**
* @return \DateTime
*/
public function analyzedAt(): \DateTime
{
return $this->analyzedAt;
}
/**
* @return \DateTime
*/
public function createdAt(): \DateTime
{
return $this->createdAt;
}
public function analyticalMedias(): Collection
{
return $this->analyticalMedias;
}
/**
* @return bool
*/
public function equals(Analytical $Analytical)
{
return $this->id() === $Analytical->id();
}
/**
* @return string
*/
public function analyticalDataHash()
{
$analyticalDataHash = md5($this->source());
if ($this->analyzedAt() != null) {
$analyticalDataHash = md5($analyticalDataHash . $this->analyzedAt()->format('c'));
$analyticalDataHash = md5($analyticalDataHash . $this->createdFrom());
}
return $analyticalDataHash;
}
/**
* @return DistributionNetwork
*/
public function distributionNetwork(): ?DistributionNetwork
{
return $this->distributionNetwork;
}
/**
* @return WhaterOrganization
*/
public function responsable(): ?WhaterOrganization
{
return $this->responsable;
}
}