<?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;
/**
* Class AnalyticalSample
*
* @package Whater\Domain\Whater\Model
*/
class AnalyticalSample implements ContainsRecordedEvents
{
use EventRecorderCapabilities;
/**
* @var string
*/
private $uuid;
/**
* @var Analytical
*/
private $analytical;
/**
* @var AnalyticalParameter
*/
private $analyticalParameter;
/**
* @var float
*/
private $parameterValue;
/**
* @var string
*/
private $laboratoryName;
/**
* @var string
*/
private $samplePointName;
/**
* @var \DateTime
*/
private $analyzedAt;
/**
* @var \DateTime
*/
private $createdAt;
/**
* @var string
*/
private $sampleHash;
public function __construct(
string $sampleId = null,
Analytical $analytical = null,
AnalyticalParameter $analyticalParameter,
float $parameterValue,
\DateTime $analyzedAt = null,
string $laboratoryName = null,
string $samplePointName = null
) {
try {
$this->uuid = Uuid::fromString($sampleId ?: Uuid::uuid4())->toString();
} catch (\InvalidArgumentException $e) {
throw new InvalidUUIDException();
}
$this->analytical = $analytical;
$this->analyticalParameter = $analyticalParameter;
$this->parameterValue = $parameterValue;
$this->analyzedAt = $analyzedAt;
$this->laboratoryName = $laboratoryName;
$this->samplePointName = $samplePointName;
$this->createdAt = new \DateTime();
$this->updateSampleHash();
}
public function updateSampleData(
float $parameterValue,
\DateTime $analyzedAt = null,
string $laboratoryName = null,
string $samplePointName = null
) {
$this->parameterValue = $parameterValue;
$this->analyzedAt = $analyzedAt;
$this->laboratoryName = $laboratoryName;
$this->samplePointName = $samplePointName;
$this->updateSampleHash();
}
public function updateSampleHash()
{
$sampleHash = md5($this->analytical()->id());
$sampleHash = md5($sampleHash . $this->analyticalParameter()->id());
if ($this->analyzedAt() != null) {
$sampleHash = md5($sampleHash . $this->analyzedAt()->format('dmY'));
}
if ($this->laboratoryName() != null) {
$sampleHash = md5($sampleHash . $this->laboratoryName());
}
if ($this->samplePointName() != null) {
$sampleHash = md5($sampleHash . $this->samplePointName());
}
$this->sampleHash = $sampleHash;
}
/**
* @return string
*/
public function id(): string
{
return $this->uuid;
}
/**
* @return AnalyticalSample
*/
public function analytical(): ?Analytical
{
return $this->analytical;
}
/**
* @return AnalyticalParameter
*/
public function analyticalParameter(): AnalyticalParameter
{
return $this->analyticalParameter;
}
/**
* @return float
*/
public function parameterValue(): float
{
return $this->parameterValue;
}
/**
* @return string
*/
public function laboratoryName(): ?string
{
return $this->laboratoryName;
}
/**
* @return string
*/
public function samplePointName(): ?string
{
return $this->samplePointName;
}
/**
* @return \DateTime
*/
public function analyzedAt(): ?\DateTime
{
return $this->analyzedAt;
}
/**
* @return \DateTime
*/
public function createdAt(): \DateTime
{
return $this->createdAt;
}
/**
* @return bool
*/
public function equals(AnalyticalSample $analyticalSample)
{
return $this->id() === $analyticalSample->id();
}
}