<?php
namespace Whater\Domain\Whater\Model;
use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
use Ramsey\Uuid\Uuid;
use Whater\Domain\Common\Exception\InvalidUUIDException;
use Whater\Domain\User\Model\User;
use Whater\Domain\Whater\Exception\InvalidImportDataFileStatusException;
use Whater\Domain\Whater\Exception\InvalidImportDataFileTypeException;
/**
* Class ImportDataFile
*
* @package Whater\Domain\Whater\Model
*/
class ImportDataFile implements ContainsRecordedEvents
{
use EventRecorderCapabilities;
const STATUS_PENDING = 'STATUS_PENDING';
const STATUS_PROCESING = 'STATUS_PROCESING';
const STATUS_FINISHED = 'STATUS_FINISHED';
const STATUS_CANCELED = 'STATUS_CANCELED';
const STATUS_FAIL = 'STATUS_FAIL';
const FILE_TYPE_WHATERPOINTS_XLS = 'FT_WHATERPOINTS_XLS';
const FILE_TYPE_DISTRIBUTION_NETWORKS_XLSLS = 'FT_DISTRIBUTION_NETWORKS_XLS';
const FILE_TYPE_ESTABLISHMENTS_XLS = 'FT_ESTABLISHMENTS_XLS';
const FILE_TYPE_UBICATIONS_XLS = 'FT_UBICATIONS_XLS';
const FILE_TYPE_TOWN_LOCATIONS_XLS = 'FT_TOWN_LOCATIONS_XLS';
const FILE_TYPE_TOWNS_XLS = 'FT_TOWNS_XLS';
const FILE_TYPE_AGRUPATIONS_XLS = 'FT_AGRUPATIONS_XLS';
const FILE_TYPE_COUNTRY_AREAS_XLS = 'FT_COUNTRY_AREAS_XLS';
const FILE_TYPE_COUNTRIES_XLS = 'FT_COUNTRIES_XLS';
const FILE_TYPE_WHATER_DEVICES_XLS = 'FT_WHATER_DEVICES_XLS';
const FILE_TYPE_USERS_XLS = 'FT_USERS_XLS';
/**
* @var string
*/
private $uuid;
/**
* @var string
*/
private $fileType;
/**
* @var string
*/
private $filePath;
/**
* @var string
*/
private $fileName;
/**
* @var string
*/
private $status;
/**
* @var int
*/
private $numRows;
/**
* @var int
*/
private $numSuccessRows;
/**
* @var int
*/
private $numInvalidRows;
/**
* @var \DateTime
*/
private $createdAt;
/**
* @var \DateTime
*/
private $updatedAt;
/**
* @var User
*/
private $uploadedBy;
/**
* @var array
*/
private $notesLines;
public function __construct(
string $importDataFileId = null,
string $fileType,
string $filePath,
string $fileName,
int $numRows,
User $uploadedBy
) {
try {
$this->uuid = Uuid::fromString($importDataFileId ?: Uuid::uuid4())->toString();
} catch (\InvalidArgumentException $e) {
throw new InvalidUUIDException();
}
switch ($fileType) {
case ImportDataFile::FILE_TYPE_WHATERPOINTS_XLS;
case ImportDataFile::FILE_TYPE_DISTRIBUTION_NETWORKS_XLSLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_UBICATIONS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_ESTABLISHMENTS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_TOWN_LOCATIONS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_TOWNS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_AGRUPATIONS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_COUNTRY_AREAS_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_COUNTRIES_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_WHATER_DEVICES_XLS;
$this->fileType = $fileType;
break;
case ImportDataFile::FILE_TYPE_USERS_XLS;
$this->fileType = $fileType;
break;
default:
throw new InvalidImportDataFileTypeException();
}
$this->uploadedBy = $uploadedBy;
$this->filePath = $filePath;
$this->fileName = $fileName;
$this->status = ImportDataFile::STATUS_PENDING;
$this->numRows = $numRows;
$this->numSuccessRows = 0;
$this->numInvalidRows = 0;
$this->notesLines = [];
$this->createdAt = new \DateTime();
$this->updatedAt = new \DateTime();
}
public function updateStatus(
string $status,
int $numSuccessRows,
int $numInvalidRows,
array $notesLines
) {
switch ($status) {
case ImportDataFile::STATUS_PENDING:
case ImportDataFile::STATUS_CANCELED:
case ImportDataFile::STATUS_PROCESING:
case ImportDataFile::STATUS_FINISHED:
case ImportDataFile::STATUS_FAIL:
$this->status = $status;
break;
default:
throw new InvalidImportDataFileStatusException();
}
$this->numSuccessRows = $numSuccessRows;
$this->numInvalidRows = $numInvalidRows;
$this->notesLines = $notesLines;
$this->updatedAt = new \DateTime();
}
/**
* @return string
*/
public function id(): string
{
return $this->uuid;
}
/**
* @return string
*/
public function fileType(): string
{
return $this->fileType;
}
/**
* @return string
*/
public function fileName(): string
{
return $this->fileName;
}
/**
* @return string
*/
public function filePath(): string
{
return $this->filePath;
}
/**
* @return string
*/
public function status(): string
{
return $this->status;
}
/**
* @return int
*/
public function numRows(): int
{
return $this->numRows;
}
/**
* @return int
*/
public function numSuccessRows(): int
{
return $this->numSuccessRows;
}
/**
* @return int
*/
public function numInvalidRows(): int
{
return $this->numInvalidRows;
}
/**
* @return int
*/
public function numProcessedRows(): int
{
return $this->numInvalidRows + $this->numSuccessRows;
}
/**
* @return int
*/
public function uploadedBy(): User
{
return $this->uploadedBy;
}
/**
* @return array
*/
public function notesLines(): array
{
return $this->notesLines;
}
/**
* @return \DateTime
*/
public function createdAt(): \DateTime
{
return $this->createdAt;
}
/**
* @return \DateTime
*/
public function updatedAt(): \DateTime
{
return $this->updatedAt;
}
/**
* @return bool
*/
public function equals(ImportDataFile $importDataFile)
{
return $this->id() === $importDataFile->id();
}
}