<?php
namespace MedBrief\MSR\Entity;
use DH\Auditor\Provider\Doctrine\Auditing\Annotation as Audit;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use JsonSerializable;
use MedBrief\MSR\Repository\DocumentRepository;
use MedBrief\MSR\Service\File\FileHandler\FileHandledInterface;
use MedBrief\MSR\Service\MimeTypes;
use MedBrief\MSR\Service\ProjectClosure\RemoveRecords\RemovableRecordInterface;
use MedBrief\MSR\Service\VirusScan\Async\VirusScannableInterface;
use MedBrief\MSR\Service\VirusScan\Async\Visitor\VirusScannerPathVisitorInterface;
/**
* Document
*
* @ORM\Table(name="Document", indexes={@ORM\Index(name="created_index", columns={"created"}), @ORM\Index(name="deletedAt_index", columns={"deletedAt"}), @ORM\Index(name="convertedToSwfStatus_index", columns={"convertedToSwfStatus"}), @ORM\Index(name="convertedToOptimizedPdfStatus_index", columns={"convertedToOptimizedPdfStatus"}), @ORM\Index(name="convertedToXodStatus_index", columns={"convertedToXodStatus"}), @ORM\Index(name="convertedToOcrStatus_index", columns={"convertedToOcrStatus"}), @ORM\Index(name="convertedToWebAVStatus_index", columns={"convertedToWebAVStatus"}), @ORM\Index(name="orthanc_store_response_id_index", columns={"orthanc_store_response_id"}), @ORM\Index(name="orthanc_parent_series_id_index", columns={"orthanc_parent_series_id"})})
*
* @ORM\Entity(repositoryClass=DocumentRepository::class)
*
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
*
* @Audit\Auditable
*
* @Audit\Security(view={"ROLE_ALLOWED_TO_AUDIT"})
*/
class Document implements JsonSerializable, RemovableRecordInterface, VirusScannableInterface, FileHandledInterface
{
public const ORTHANC_STORAGE_STATUS_PENDING = 1;
public const ORTHANC_STORAGE_STATUS_STORED = 2;
public const ORTHANC_STORAGE_STATUS_FAILED = 3;
public const ORTHANC_STORAGE_STATUS_DELETED = 4;
public const CONVERSION_TO_SWF_PENDING = 0;
public const CONVERSION_TO_SWF_COMPLETE = 1;
public const CONVERSION_TO_SWF_FAILED = 2;
public const CONVERSION_TO_SWF_CURRENT = 3;
public const CONVERSION_TO_SWF_SKIPPED = 4;
// These statuses control the Archive state of the Document,
// which applies to SWF conversion.
public const CONVERSION_TO_SWF_ARCHIVE_PENDING = 5;
public const CONVERSION_TO_SWF_ARCHIVE_CURRENT = 6;
public const CONVERSION_TO_SWF_ARCHIVED = 7;
public const CONVERSION_TO_SWF_ARCHIVE_FAILED = 8;
public const FILE_TYPE_PDF = 'pdf';
public const FILE_TYPE_AUDIO = 'audio';
public const FILE_TYPE_VIDEO = 'video';
public const FILE_TYPE_DICOM = 'dicom';
public const FILE_TYPE_MSWORD = 'msword';
public const FILE_TYPE_MSEXCEL = 'msexcel';
public const FILE_TYPE_MSPOWERPOINT = 'mspowerpoint';
public const FILE_TYPE_FILE = 'generic';
public const FILE_TYPE_IMAGE = 'image';
public const FILE_TYPE_TEXT_HTML = 'text/html';
public const FILE_TYPE_EML_MSG = 'email';
// Converted to OptimizedPDF statuses.
public const CONVERSION_TO_OPTIMIZED_PDF_PENDING = 1;
public const CONVERSION_TO_OPTIMIZED_PDF_COMPLETE = 2;
public const CONVERSION_TO_OPTIMIZED_PDF_FAILED = 3;
public const CONVERSION_TO_OPTIMIZED_PDF_CURRENT = 4;
public const CONVERSION_TO_OPTIMIZED_PDF_SKIPPED = 5;
// Converted to XOD statuses.
public const CONVERSION_TO_XOD_PENDING = 1;
public const CONVERSION_TO_XOD_COMPLETE = 2;
public const CONVERSION_TO_XOD_FAILED = 3;
public const CONVERSION_TO_XOD_CURRENT = 4;
public const CONVERSION_TO_XOD_SKIPPED = 5;
public const CONVERSION_TO_XOD_ENCRYPTED = 6;
// Converted to WEBAV statuses.
public const CONVERSION_TO_WEBAV_PENDING = 1;
public const CONVERSION_TO_WEBAV_COMPLETE = 2;
public const CONVERSION_TO_WEBAV_FAILED = 3;
public const CONVERSION_TO_WEBAV_CURRENT = 4;
public const CONVERSION_TO_WEBAV_SKIPPED = 5;
// Converted to OCR statuses.
public const CONVERSION_TO_OCR_PENDING = 1;
public const CONVERSION_TO_OCR_COMPLETE = 2;
public const CONVERSION_TO_OCR_FAILED = 3;
public const CONVERSION_TO_OCR_FAILED_AUTH = 31;
public const CONVERSION_TO_OCR_FAILED_HTTP_TRANSPORT = 32;
public const CONVERSION_TO_OCR_FAILED_NO_PDF_PATH = 33;
public const CONVERSION_TO_OCR_CURRENT = 4;
public const CONVERSION_TO_OCR_SKIPPED = 5;
public const CONVERSION_TO_OCR_REQUEUED = 6;
public const FILE_FIELD_LIST = [
'nativeFile',
'optimizedPdfFile',
'xodBlobFile',
'ocrFile',
'ocrXodBlobFile',
'webAVFile',
];
public static $fileIcons = [
'afl' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'aif' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'aifc' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'aiff' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'asf' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'asx' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'au' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'avi' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'avs' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'dif' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'dl' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'dv' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'dvr-ms' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'fli' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'fmf' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'funk' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'gl' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'gsd' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'gsm' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'isu' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'it' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'jam' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'kar' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'la' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'lam' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'lma' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'm1v' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'm2a' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'm2v' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'm3u' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mid' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'midi' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mjf' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mjpg' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mkv' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mod' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'moov' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mov' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'movie' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mp2' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mp3' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mp4' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mpa' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mpe' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mpeg' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'mpg' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mpga' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'mv' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'my' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'pfunk' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'qcp' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'qt' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'qtc' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'ra' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'ram' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rm' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rmi' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rmm' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rmp' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rpm' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'rv' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
's3m' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'scm' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'sid' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'snd' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'tsi' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'tsp' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'vdo' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'viv' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'vivo' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'voc' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'vos' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'vox' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'vqe' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'vqf' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'vql' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'wav' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'xdr' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'xm' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
'xsr' => ['iconClass' => 'mb-icon--video', 'type' => self::FILE_TYPE_VIDEO],
'wma' => ['iconClass' => 'mb-icon--audio', 'type' => self::FILE_TYPE_AUDIO],
// PDF file
'pdf' => ['iconClass' => 'mb-icon--pdf', 'type' => self::FILE_TYPE_PDF],
// generic file
'xps' => ['iconClass' => 'mb-icon--file', 'type' => self::FILE_TYPE_FILE],
'rtf' => ['iconClass' => 'mb-icon--file', 'type' => self::FILE_TYPE_FILE],
'csv' => ['iconClass' => 'mb-icon--file', 'type' => self::FILE_TYPE_FILE],
'vsd' => ['iconClass' => 'mb-icon--file', 'type' => self::FILE_TYPE_FILE],
'pub' => ['iconClass' => 'mb-icon--file', 'type' => self::FILE_TYPE_FILE],
// Word files
'doc' => ['iconClass' => 'mb-icon--ms-word', 'type' => self::FILE_TYPE_MSWORD],
'dot' => ['iconClass' => 'mb-icon--ms-word', 'type' => self::FILE_TYPE_MSWORD],
'docx' => ['iconClass' => 'mb-icon--ms-word', 'type' => self::FILE_TYPE_MSWORD],
'dotx' => ['iconClass' => 'mb-icon--ms-word', 'type' => self::FILE_TYPE_MSWORD],
// Excel files
'xls' => ['iconClass' => 'mb-icon--ms-excel', 'type' => self::FILE_TYPE_MSEXCEL],
'xlt' => ['iconClass' => 'mb-icon--ms-excel', 'type' => self::FILE_TYPE_MSEXCEL],
'xla' => ['iconClass' => 'mb-icon--ms-excel', 'type' => self::FILE_TYPE_MSEXCEL],
'xlsx' => ['iconClass' => 'mb-icon--ms-excel', 'type' => self::FILE_TYPE_MSEXCEL],
'ods' => ['iconClass' => 'mb-icon--ms-excel', 'type' => self::FILE_TYPE_MSEXCEL],
// PowerPoint files
'ppt' => ['iconClass' => 'mb-icon--ms-powerpoint', 'type' => self::FILE_TYPE_MSPOWERPOINT],
'pot' => ['iconClass' => 'mb-icon--ms-powerpoint', 'type' => self::FILE_TYPE_MSPOWERPOINT],
'pps' => ['iconClass' => 'mb-icon--ms-powerpoint', 'type' => self::FILE_TYPE_MSPOWERPOINT],
'ppa' => ['iconClass' => 'mb-icon--ms-powerpoint', 'type' => self::FILE_TYPE_MSPOWERPOINT],
'pptx' => ['iconClass' => 'mb-icon--ms-powerpoint', 'type' => self::FILE_TYPE_MSPOWERPOINT],
// Image files
'jpg' => ['iconClass' => 'mb-icon--image', 'type' => self::FILE_TYPE_IMAGE],
'jpeg' => ['iconClass' => 'mb-icon--image', 'type' => self::FILE_TYPE_IMAGE],
'tiff' => ['iconClass' => 'mb-icon--image', 'type' => self::FILE_TYPE_IMAGE],
'tif' => ['iconClass' => 'mb-icon--image', 'type' => self::FILE_TYPE_IMAGE],
'png' => ['iconClass' => 'mb-icon--image', 'type' => self::FILE_TYPE_IMAGE],
// Html/Text files
'html' => ['iconClass' => 'mb-icon--html', 'type' => self::FILE_TYPE_TEXT_HTML],
'htm' => ['iconClass' => 'mb-icon--html', 'type' => self::FILE_TYPE_TEXT_HTML],
'txt' => ['iconClass' => 'mb-icon--text', 'type' => self::FILE_TYPE_TEXT_HTML],
// eml/msg files
'eml' => ['iconClass' => 'mb-icon--mail', 'type' => self::FILE_TYPE_EML_MSG],
'msg' => ['iconClass' => 'mb-icon--mail', 'type' => self::FILE_TYPE_EML_MSG],
];
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
*
* @ORM\Id
*
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \DateTime|null
*
* @ORM\Column(name="deletedAt", type="datetime", nullable=true)
*/
private $deletedAt;
/**
* @var string
*
* @ORM\Column(name="filename", type="string")
*/
private $filename;
/**
* @var string
*
* @ORM\Column(name="original_filename", type="string")
*/
private $original_filename;
/**
* @var string
*
* @ORM\Column(name="mime_type", type="string")
*/
private $mime_type;
/**
* @var string
*
* @ORM\Column(name="filesize", type="string")
*/
private $filesize;
/**
* @var int|null
*
* @ORM\Column(name="orthanc_storage_status", type="integer", nullable=true)
*/
private $orthanc_storage_status;
/**
* @var string|null
*
* @ORM\Column(name="orthanc_store_response_id", type="string", length=255, nullable=true)
*/
private $orthanc_store_response_id;
/**
* @var string|null
*
* @ORM\Column(name="orthanc_store_response_path", type="string", length=255, nullable=true)
*/
private $orthanc_store_response_path;
/**
* @var string|null
*
* @ORM\Column(name="orthanc_store_response_status", type="string", length=255, nullable=true)
*/
private $orthanc_store_response_status;
/**
* @var string|null
*
* @ORM\Column(name="orthanc_parent_series_id", type="string", length=255, nullable=true)
*/
private $orthanc_parent_series_id;
/**
* Used as the primary determinant in ordering a sequence of dicom files
*
* @var int|null
*
* @ORM\Column(name="orthanc_instance_number", type="integer", nullable=true)
*/
private $orthanc_instance_number;
/**
* @var string
*
* @ORM\Column(name="status", type="string")
*/
private $status;
/**
* @var \DateTime
*
* @ORM\Column(name="created", type="datetime")
*
* @Gedmo\Timestampable(on="create")
*/
private $created;
/**
* @var \DateTime
*
* @ORM\Column(name="updated", type="datetime")
*
* @Gedmo\Timestampable(on="update")
*/
private $updated;
/**
* @var int|null
*
* @ORM\Column(name="convertedToSwfStatus", type="integer", nullable=true)
*/
private $convertedToSwfStatus;
/**
* @var string|null
*
* @ORM\Column(name="nativeFilename", type="string", length=255, nullable=true)
*/
private $nativeFilename;
/**
* @var string|null
*
* @ORM\Column(name="swfFilename", type="string", length=255, nullable=true)
*/
private $swfFilename;
/**
* @var int|null
*
* @ORM\Column(name="convertedToOptimizedPdfStatus", type="integer", nullable=true)
*/
private $convertedToOptimizedPdfStatus;
/**
* @var string|null
*
* @ORM\Column(name="optimizedPdfFilename", type="string", length=255, nullable=true)
*/
private $optimizedPdfFilename;
/**
* @var int|null
*
* @ORM\Column(name="convertedToXodStatus", type="integer", nullable=true)
*/
private $convertedToXodStatus;
/**
* @var string|null
*
* @ORM\Column(name="xodFilename", type="string", length=255, nullable=true)
*/
private $xodFilename;
/**
* @var int|null
*
* @ORM\Column(name="convertedToWebAVStatus", type="integer", nullable=true)
*/
private $convertedToWebAVStatus;
/**
* @var string|null
*
* @ORM\Column(name="webAVFilename", type="string", length=255, nullable=true)
*/
private $webAVFilename;
/**
* @var int|null
*
* @ORM\Column(name="convertedToOcrStatus", type="integer", nullable=true)
*/
private $convertedToOcrStatus;
/**
* @var string|null
*
* @ORM\Column(name="ocrFilename", type="string", length=255, nullable=true)
*/
private $ocrFilename;
/**
* @var string|null
*
* @ORM\Column(name="ocrXodFilename", type="string", length=255, nullable=true)
*/
private $ocrXodFilename;
/**
* @var string
*
* @ORM\Column(name="md5hash", type="string", length=40, nullable=false)
*/
private $md5hash;
/**
* @var string|null
*
* @ORM\Column(name="documentTypeFamily", type="string", length=255, nullable=true)
*/
private $documentTypeFamily;
/**
* @var Upload
*
* @ORM\OneToOne(targetEntity="MedBrief\MSR\Entity\Upload")
*
* @ORM\JoinColumns({
*
* @ORM\JoinColumn(name="upload_id", referencedColumnName="id", unique=true)
* })
*/
private $upload;
/**
* @var Collection
*
* @ORM\OneToMany(targetEntity="MedBrief\MSR\Entity\OrthancTransaction", mappedBy="document", cascade={"all"})
*/
private $orthancTransactions;
/**
* @var Project
*
* @ORM\ManyToOne(targetEntity="MedBrief\MSR\Entity\Project", inversedBy="documents")
*
* @ORM\JoinColumns({
*
* @ORM\JoinColumn(name="project_id", referencedColumnName="id")
* })
*/
private $project;
/**
* @var DocumentType
*
* @ORM\ManyToOne(targetEntity="MedBrief\MSR\Entity\DocumentType")
*
* @ORM\JoinColumns({
*
* @ORM\JoinColumn(name="documentType_id", referencedColumnName="id")
* })
*/
private $documentType;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="MedBrief\MSR\Entity\User", inversedBy="documents")
*
* @ORM\JoinColumns({
*
* @ORM\JoinColumn(name="creator_id", referencedColumnName="id", nullable=false)
* })
*/
private $creator;
/**
* @var Collection
*
* @ORM\ManyToMany(targetEntity="MedBrief\MSR\Entity\Collection", mappedBy="documents")
*/
private $collections;
/**
* @var string
*/
private $orthanc_response_raw_json;
/**
* @var string
*/
private $orthanc_response_id;
/**
* @var string
*/
private $orthanc_response_path;
/**
* @var string
*/
private $orthanc_response_status;
/**
* @var int
*/
private $orthanc_submission_status;
/**
* The below properties are unmapped and used by the VichUploader bundle
* when utilising File injection.
*/
/**
* @var string
*/
private $nativeFile;
/**
* @var string
*/
private $optimizedPdfFile;
/**
* @var string
*/
private $swfFile;
/**
* @var string
*/
private $webAVFile;
/**
* @var string
*/
private $xodFile;
/**
* @var string
*/
private $xodBlobFile;
/**
* @var string
*/
private $ocrXodFile;
/**
* @var string
*/
private $ocrXodBlobFile;
/**
* @var string
*/
private $ocrFile;
/**
* @ORM\OneToOne(targetEntity=VirusScanItem::class, mappedBy="document")
*/
private ?VirusScanItem $virusScanItem = null;
/**
* Constructor
*/
public function __construct()
{
$this->orthancTransactions = new \Doctrine\Common\Collections\ArrayCollection();
$this->collections = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __clone()
{
if ($this->id) {
$this->project = null;
$this->orthancTransactions = new \Doctrine\Common\Collections\ArrayCollection();
$this->collections = new \Doctrine\Common\Collections\ArrayCollection();
}
}
public function __toString()
{
return (string) $this->getFilename();
}
/**
* Get id
*
* @return int
*/
public function getId(): ?int
{
return $this->id;
}
/**
* Set filename
*
* @param string $filename
*
* @return Document
*/
public function setFilename($filename)
{
$this->filename = $filename;
return $this;
}
/**
* Get filename
*
* @return string
*/
public function getFilename()
{
return $this->filename;
}
/**
* Get filename with PDF extension.
*
* @return string
*/
public function getFilenameAsPdf()
{
$filename = pathinfo($this->getFilename(), PATHINFO_FILENAME);
if (isset($filename)) {
return $filename . '.pdf';
}
return $this->filename . '.pdf';
}
/**
* Set mime_type
*
* @param string $mimeType
*
* @return Document
*/
public function setMimeType($mimeType)
{
$this->mime_type = $mimeType;
return $this;
}
/**
* Get mime_type
*
* @return string
*/
public function getMimeType()
{
return $this->mime_type;
}
/**
* Set filesize
*
* @param string $filesize
*
* @return Document
*/
public function setFilesize($filesize)
{
$this->filesize = $filesize;
return $this;
}
/**
* Get filesize
*
* @return string
*/
public function getFilesize()
{
return $this->filesize;
}
/**
* Set status
*
* @param string $status
*
* @return Document
*/
public function setStatus($status)
{
$this->status = $status;
return $this;
}
/**
* Get status
*
* @return string
*/
public function getStatus()
{
return $this->status;
}
/**
* Set created
*
* @param \DateTime $created
*
* @return Document
*/
public function setCreated($created)
{
$this->created = $created;
return $this;
}
/**
* Get created
*
* @return \DateTime
*/
public function getCreated()
{
return $this->created;
}
/**
* Set updated
*
* @param \DateTime $updated
*
* @return Document
*/
public function setUpdated($updated)
{
$this->updated = $updated;
return $this;
}
/**
* Get updated
*
* @return \DateTime
*/
public function getUpdated()
{
return $this->updated;
}
/**
* Set upload
*
* @param Upload $upload
*
* @return Document
*/
public function setUpload(?Upload $upload = null)
{
$this->upload = $upload;
return $this;
}
/**
* Get upload
*
* @return Upload
*/
public function getUpload()
{
return $this->upload;
}
/**
* Set project
*
* @param Project $project
*
* @return Document
*/
public function setProject(?Project $project = null)
{
$this->project = $project;
return $this;
}
/**
* Get project
*
* @return Project
*/
public function getProject()
{
return $this->project;
}
/**
* Set documentType
*
* @param DocumentType $documentType
*
* @return Document
*/
public function setDocumentType(?DocumentType $documentType = null)
{
$this->documentType = $documentType;
return $this;
}
/**
* Get documentType
*
* @return DocumentType
*/
public function getDocumentType()
{
return $this->documentType;
}
/**
* Add collections
*
* @param \MedBrief\MSR\Entity\Collection $collections
*
* @return Document
*/
public function addCollection(Collection $collections)
{
$this->collections[] = $collections;
return $this;
}
/**
* Remove collections
*
* @param \MedBrief\MSR\Entity\Collection $collections
*/
public function removeCollection(Collection $collections)
{
$this->collections->removeElement($collections);
}
/**
* Get collections
*
* @return Collection|Collection[]
*/
public function getCollections()
{
return $this->collections;
}
/**
* Set creator
*
* @param User $creator
*
* @return Document
*/
public function setCreator(User $creator)
{
$this->creator = $creator;
return $this;
}
/**
* Get creator
*
* @return User
*/
public function getCreator()
{
return $this->creator;
}
/**
* Set nativeFilename
*
* @param string $nativeFilename
*
* @return Document
*/
public function setNativeFilename($nativeFilename)
{
$this->nativeFilename = $nativeFilename;
return $this;
}
/**
* Get nativeFilename
*
* @return string
*/
public function getNativeFilename()
{
return $this->nativeFilename;
}
/**
* Set nativeFile
*
* @param string $nativeFile
*
* @return Document
*/
public function setNativeFile($nativeFile)
{
$this->nativeFile = $nativeFile;
return $this;
}
/**
* Get nativeFile
*
* @return string
*/
public function getNativeFile()
{
return $this->nativeFile;
}
/**
* Returns an array of this documents data
*
* @return array
*
*@todo add more data Of maybe even just use the symfony serializer component
*
*/
public function jsonSerialize(): mixed
{
return [
'created' => $this->getCreated()->format('j F Y, H:ia'),
'filename' => $this->getFilename(),
'filesize' => number_format($this->getFilesize(), 0),
];
}
/**
* Given the orthancTransaction (which is assumed to be of type STORE)
* We update the appropriate values on this Document to indicate the various
* orthanc data returned by the storage transaction
*
* @param OrthancTransaction $orthancTransaction
*/
public function processOrthancStoreTransaction(OrthancTransaction $orthancTransaction)
{
// first - set the submissions status to pending at the outset
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_PENDING);
// if the given transaction wasn't a success, the storage status of this
// document is automatically also a fail
if ($orthancTransaction->getTransactionStatus() != OrthancTransaction::TRANSACTION_STATUS_SUCCESS) {
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_FAILED);
return false;
}
// if we get here, then everything is in order!
$jsonObject = json_decode($orthancTransaction->getTransactionResponse());
// set the individual values on the document
$orthancStoreResponseId = $jsonObject->ID;
$orthancStoreResponsePath = $jsonObject->Path;
$orthancStoreResponseStatus = $jsonObject->Status;
$this->setOrthancStoreResponseId($orthancStoreResponseId);
$this->setOrthancStoreResponsePath($orthancStoreResponsePath);
$this->setOrthancStoreResponseStatus($orthancStoreResponseStatus);
// set the status as successful
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_STORED);
}
/**
* Given the orthancTransaction (which is assumed to be of type INSTANCE_DETAILS) we
* update the parent series id of this document
*
* @param OrthancTransaction $orthancTransaction
*
* @return void
*/
public function processOrthancInstanceDetailsTransaction(OrthancTransaction $orthancTransaction): void
{
if ($orthancTransaction->getTransactionStatus() == OrthancTransaction::TRANSACTION_STATUS_SUCCESS) {
$jsonObject = json_decode($orthancTransaction->getTransactionResponse());
$this->setOrthancParentSeriesId($jsonObject->ParentSeries);
// we anticipate that InstanceNumbers from Othanc will always be
// integers (we hope) we cast them to Ints because our database
// field is an integer. We have to use an integer field for
// ordering purposes (varchar doesnt order correctly)
if (isset($jsonObject->MainDicomTags) && isset($jsonObject->MainDicomTags->InstanceNumber)) {
$this->setOrthancInstanceNumber(intval($jsonObject->MainDicomTags->InstanceNumber));
}
}
}
/**
* Given the orthancTransaction (which is assumed to be of type DELETE) we
* update the orthancStorage status of this document
*
* @param OrthancTransaction $orthancTransaction
*
* @return bool
*/
public function processOrthancDeleteTransaction(OrthancTransaction $orthancTransaction): bool
{
// first - set the submissions status to pending at the outset
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_PENDING);
// if the transaction status is not SUCCESS then set this status as FAILED
if ($orthancTransaction->getTransactionStatus() != OrthancTransaction::TRANSACTION_STATUS_SUCCESS) {
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_FAILED);
return false;
}
// set the status as successful
$this->setOrthancStorageStatus(self::ORTHANC_STORAGE_STATUS_DELETED);
return true;
}
/**
* Add orthancTransaction. When a orthancTransaction is assigned to this
* Document using this function, then the associated orthanc values on this
* Document will be updated with th assumption that this transaction is the
* latest one to have run on the document
*
* @param OrthancTransaction $orthancTransaction
*
* @return Document
*/
public function addOrthancTransaction(OrthancTransaction $orthancTransaction)
{
$this->orthancTransactions[] = $orthancTransaction;
// based on the type of the transaction, we run the appropriate function
// on this document
switch ($orthancTransaction->getType()) {
case OrthancTransaction::TYPE_STORE_INSTANCE:
$this->processOrthancStoreTransaction($orthancTransaction);
break;
case OrthancTransaction::TYPE_DELETE_INSTANCE:
$this->processOrthancDeleteTransaction($orthancTransaction);
break;
case OrthancTransaction::TYPE_INSTANCE_DETAILS:
$this->processOrthancInstanceDetailsTransaction($orthancTransaction);
break;
default:
throw new \Exception('Invalid OrthancTransaction Type: ' . $orthancTransaction->getType());
}
return $this;
}
/**
* Remove orthancTransaction
*
* @param OrthancTransaction $orthancTransaction
*/
public function removeOrthancTransaction(OrthancTransaction $orthancTransaction)
{
$this->orthancTransactions->removeElement($orthancTransaction);
}
/**
* Get orthancTransactions
*
* @return Collection
*/
public function getOrthancTransactions()
{
return $this->orthancTransactions;
}
/**
* Set orthancStorageStatus
*
* @param int $orthancStorageStatus
*
* @return Document
*/
public function setOrthancStorageStatus($orthancStorageStatus)
{
$this->orthanc_storage_status = $orthancStorageStatus;
return $this;
}
/**
* Get orthancStorageStatus
*
* @return int
*/
public function getOrthancStorageStatus()
{
return $this->orthanc_storage_status;
}
/**
* Set orthancStoreResponseId
*
* @param string $orthancStoreResponseId
*
* @return Document
*/
public function setOrthancStoreResponseId($orthancStoreResponseId)
{
$this->orthanc_store_response_id = $orthancStoreResponseId;
return $this;
}
/**
* Get orthancStoreResponseId
*
* @return string
*/
public function getOrthancStoreResponseId()
{
return $this->orthanc_store_response_id;
}
/**
* Set orthancStoreResponsePath
*
* @param string $orthancStoreResponsePath
*
* @return Document
*/
public function setOrthancStoreResponsePath($orthancStoreResponsePath)
{
$this->orthanc_store_response_path = $orthancStoreResponsePath;
return $this;
}
/**
* Get orthancStoreResponsePath
*
* @return string
*/
public function getOrthancStoreResponsePath()
{
return $this->orthanc_store_response_path;
}
/**
* Set orthancStoreResponseStatus
*
* @param string $orthancStoreResponseStatus
*
* @return Document
*/
public function setOrthancStoreResponseStatus($orthancStoreResponseStatus)
{
$this->orthanc_store_response_status = $orthancStoreResponseStatus;
return $this;
}
/**
* Get orthancStoreResponseStatus
*
* @return string
*/
public function getOrthancStoreResponseStatus()
{
return $this->orthanc_store_response_status;
}
/**
* Set deletedAt
*
* @param \DateTime $deletedAt
*
* @return Document
*/
public function setDeletedAt($deletedAt)
{
$this->deletedAt = $deletedAt;
return $this;
}
/**
* Get deletedAt
*
* @return \DateTime
*/
public function getDeletedAt()
{
return $this->deletedAt;
}
/**
* Set orthancParentSeriesId
*
* @param string $orthancParentSeriesId
*
* @return Document
*/
public function setOrthancParentSeriesId($orthancParentSeriesId)
{
$this->orthanc_parent_series_id = $orthancParentSeriesId;
return $this;
}
/**
* Get orthancParentSeriesId
*
* @return string
*/
public function getOrthancParentSeriesId()
{
return $this->orthanc_parent_series_id;
}
/**
* Set md5hash
*
* @param string $md5hash
*
* @return Document
*/
public function setMd5hash($md5hash)
{
$this->md5hash = $md5hash;
return $this;
}
/**
* Get md5hash
*
* @return string
*/
public function getMd5hash()
{
return $this->md5hash;
}
/**
* Returns this Document as a jsTree formatted node
*
* @param string $replacementNodeText
* @param array $additionalLiAttributes
*
* @return array
*/
public function getJsTreeFormattedNode($replacementNodeText = null, $additionalLiAttributes = [])
{
if ($this->isWebAV()) {
$dataConversionProgress = $this->getConvertedToWebAVStatusLabel(true);
} else {
$dataConversionProgress = $this->getConvertedToXodStatusLabel(true);
}
$node = [
'text' => $replacementNodeText ?: $this->getFilename(),
//'children' => array(),
'type' => 'file', // we give the node a type because we will be distinguishing between node types on the JS side
// @Todo update icon libray to use the google material icons - replace getFaIcon with getIconType.
'icon' => ' mb-icon ' . $this->getIconClassName(), // override the default icon
'valid_children' => null, // Rowan: I assume this specifies that this kind of node may not have children?
'li_attr' => [
'data-document-id' => $this->getId(),
'data-controller' => 'fullrow-foldertree',
'data-creator-id' => $this->getCreator() ? $this->getCreator()->getId() : '',
'data-conversion-progress' => $dataConversionProgress,
'title' => $replacementNodeText ?: $this->getFilename(),
'data-document-type-family' => $this->getDocumentTypeFamily(),
'data-document-mime-type' => $this->getMimeType(),
],
];
// any additional attributes passed through should be assigned to the node
foreach ($additionalLiAttributes as $key => $value) {
$node['li_attr'][$key] = $value;
}
return $node;
}
/**
* Set originalFilename
*
* @param string $originalFilename
*
* @return Document
*/
public function setOriginalFilename($originalFilename)
{
$this->original_filename = $originalFilename;
return $this;
}
/**
* Get originalFilename
*
* @return string
*/
public function getOriginalFilename()
{
return $this->original_filename;
}
/**
* Set swfFilename
*
* @param string $swfFilename
*
* @return Document
*/
public function setSwfFilename($swfFilename)
{
$this->swfFilename = $swfFilename;
return $this;
}
/**
* Get swfFilename
*
* @return string
*/
public function getSwfFilename()
{
return $this->swfFilename;
}
/**
* Set swfFile
*
* @param string $swfFile
*
* @return Document
*/
public function setSwfFile($swfFile)
{
$this->swfFile = $swfFile;
return $this;
}
/**
* Get swfFile
*
* @return string
*/
public function getSwfFile()
{
return $this->swfFile;
}
/**
* Set convertedToSwfStatus
*
* @param string $convertedToSwfStatus
*
* @return Document
*/
public function setConvertedToSwfStatus($convertedToSwfStatus)
{
$this->convertedToSwfStatus = $convertedToSwfStatus;
return $this;
}
/**
* Get convertedToSwfStatus
*
* @return string
*/
public function getConvertedToSwfStatus()
{
return $this->convertedToSwfStatus;
}
/**
* Set orthancInstanceNumber
*
* @param string $orthancInstanceNumber
*
* @return Document
*/
public function setOrthancInstanceNumber($orthancInstanceNumber)
{
$this->orthanc_instance_number = $orthancInstanceNumber;
return $this;
}
/**
* Get orthancInstanceNumber
*
* @return string
*/
public function getOrthancInstanceNumber()
{
return $this->orthanc_instance_number;
}
// @Todo remove getIconClassName function once all aspects of font-awesome has been removed.
/**
* returns fa icon class
*/
public function getIconClassName()
{
// determine file extension
$extension = strtolower(pathinfo($this->getFilename(), PATHINFO_EXTENSION));
// If the file extension on the filename is empty, check the native filename.
if (!$extension) {
$extension = strtolower(pathinfo($this->getNativeFilename(), PATHINFO_EXTENSION));
}
return 'mb-icon ' . (array_key_exists($extension, self::$fileIcons) ? self::$fileIcons[$extension]['iconClass'] : 'mb-icon--file');
}
/**
* determines the file type using a convoluted route of checking the file's
* fa icon class.
*/
public function getFileFamilyType()
{
// determine file extension
$extension = strtolower(pathinfo($this->getFilename(), PATHINFO_EXTENSION));
// If the file extension on the filename is empty, check the native filename.
if (!$extension) {
$extension = strtolower(pathinfo($this->getNativeFilename(), PATHINFO_EXTENSION));
}
return self::guessFileFamilyType($extension);
}
/**
* Guesses the fileFamilyType fiven an extension.
*
* @param string $extension
*
* @return string
*/
public static function guessFileFamilyType($extension)
{
return (array_key_exists($extension, self::$fileIcons) ? self::$fileIcons[$extension]['type'] : 'false');
}
/**
* Helper function to return if the file is a pdf.
*/
public function isPdf()
{
return $this->getFileFamilyType() === self::FILE_TYPE_PDF;
}
/**
* Helper function to return true if the file is a Image.
*/
public function isImage()
{
return $this->getFileFamilyType() === self::FILE_TYPE_IMAGE;
}
/**
* Helper function to return true if the file is Text or Html.
*/
public function isTextOrHtml()
{
return $this->getFileFamilyType() === self::FILE_TYPE_TEXT_HTML;
}
/**
* Helper function to return true if the file is Msg or Eml.
*/
public function isEmlOrMsg()
{
return $this->getFileFamilyType() === self::FILE_TYPE_EML_MSG;
}
/**
* Helper function to return if the file is an ms office document.
*/
public function isMSOffice()
{
return in_array($this->getFileFamilyType(), [
self::FILE_TYPE_MSWORD,
self::FILE_TYPE_MSEXCEL,
self::FILE_TYPE_MSPOWERPOINT,
]);
}
/**
* Helper function to return if the file is a WebAV.
*/
public function isWebAV()
{
return in_array($this->getFileFamilyType(), [self::FILE_TYPE_AUDIO, self::FILE_TYPE_VIDEO]);
}
/**
* Returns true if we support viewing of this document type.
*
* @return bool
*/
public function supportsViewing()
{
$allowedTypes = self::getSupportedViewingTypes();
return in_array($this->getDocumentTypeFamily(), $allowedTypes);
}
/**
* Returns true if we support webAV playback of this document type
*
* @return bool
*/
public function supportsWebAVPlayback()
{
$allowedTypes = self::getSupportedWebAVPlaybackTypes();
$allowedMimeTypes = self::getSupportedWebAVMimeTypes();
return
in_array($this->getDocumentTypeFamily(), $allowedTypes)
&& in_array($this->getMimeType(), $allowedMimeTypes);
}
/**
* Returns the documentFamilyTypes we support for viewing.
*
* @return array
*/
public static function getSupportedViewingTypes()
{
return [
self::FILE_TYPE_MSEXCEL,
self::FILE_TYPE_MSPOWERPOINT,
self::FILE_TYPE_MSWORD,
self::FILE_TYPE_PDF,
self::FILE_TYPE_IMAGE,
self::FILE_TYPE_TEXT_HTML,
self::FILE_TYPE_EML_MSG,
];
}
/**
* Returns the documentFamilyTypes we support for viewing.
*
* @return array
*/
public static function getSupportedWebAVPlaybackTypes()
{
return [
self::FILE_TYPE_AUDIO,
self::FILE_TYPE_VIDEO,
];
}
/**
* Returns the mime types we support for playing webAV.
*
* @return array
*/
public static function getSupportedWebAVMimeTypes()
{
return [
'video/mp4',
//'video/dvr-ms', This is not the actual mime type for DVR, video/x-ms-asf is.
'video/x-ms-asf',
'audio/mpeg',
'audio/x-wav',
];
}
/**
* Set documentTypeFamily
*
* @param string $documentTypeFamily
*
* @return Document
*/
public function setDocumentTypeFamily($documentTypeFamily)
{
$this->documentTypeFamily = $documentTypeFamily;
return $this;
}
/**
* Get documentTypeFamily
*
* @return string
*/
public function getDocumentTypeFamily()
{
return $this->documentTypeFamily;
}
/**
* Set convertedToOptimizedPdfStatus
*
* @param int $convertedToOptimizedPdfStatus
*
* @return Document
*/
public function setConvertedToOptimizedPdfStatus($convertedToOptimizedPdfStatus)
{
$this->convertedToOptimizedPdfStatus = $convertedToOptimizedPdfStatus;
return $this;
}
/**
* Get convertedToOptimizedPdfStatus
*
* @return int
*/
public function getConvertedToOptimizedPdfStatus()
{
return $this->convertedToOptimizedPdfStatus;
}
/**
* Get ConvertedToOptimizedPdfStatus options
*
* @return array
*/
public static function getConvertedToOptimizedPdfStatusOptions()
{
return [
self::CONVERSION_TO_OPTIMIZED_PDF_PENDING => 'Pending',
self::CONVERSION_TO_OPTIMIZED_PDF_COMPLETE => 'Complete',
self::CONVERSION_TO_OPTIMIZED_PDF_FAILED => 'Failed',
self::CONVERSION_TO_OPTIMIZED_PDF_CURRENT => 'Current',
self::CONVERSION_TO_OPTIMIZED_PDF_SKIPPED => 'Skipped',
];
}
/**
* Get ConvertedToOptimizedPdfStatus label
*
* @param bool $markupFriendly - If the label returned should be markup friendly.
* Used for when you want to use the label as a CSS class.
*
* @return string
*/
public function getConvertedToOptimizedPdfStatusLabel($markupFriendly = false)
{
$options = self::getConvertedToOptimizedPdfStatusOptions();
$label = $options[$this->getConvertedToOptimizedPdfStatus()] ?? '';
if ($markupFriendly) {
return strtolower(str_replace(' ', '-', $label));
}
return $label;
}
/**
* Returns true if the Document's ConvertedToOptimizedPdf status is Pending.
*
* @return bool
*/
public function isConvertedToOptimizedPdfPending()
{
return $this->getConvertedToOptimizedPdfStatus() === self::CONVERSION_TO_OPTIMIZED_PDF_PENDING;
}
/**
* Returns true if the Document's ConvertedToOptimizedPdf status is Complete.
*
* @return bool
*/
public function isConvertedToOptimizedPdfComplete()
{
return $this->getConvertedToOptimizedPdfStatus() === self::CONVERSION_TO_OPTIMIZED_PDF_COMPLETE;
}
/**
* Returns true if the Document's ConvertedToOptimizedPdf status is Failed.
*
* @return bool
*/
public function isConvertedToOptimizedPdfFailed()
{
return $this->getConvertedToOptimizedPdfStatus() === self::CONVERSION_TO_OPTIMIZED_PDF_FAILED;
}
/**
* Returns true if the Document's ConvertedToOptimizedPdf status is Current.
*
* @return bool
*/
public function isConvertedToOptimizedPdfCurrent()
{
return $this->getConvertedToOptimizedPdfStatus() === self::CONVERSION_TO_OPTIMIZED_PDF_CURRENT;
}
/**
* Returns true if the Document's ConvertedToOptimizedPdf status is Skipped.
*
* @return bool
*/
public function isConvertedToOptimizedPdfSkipped()
{
return $this->getConvertedToOptimizedPdfStatus() === self::CONVERSION_TO_OPTIMIZED_PDF_SKIPPED;
}
/**
* Set optimizedPdfFilename
*
* @param string $optimizedPdfFilename
*
* @return Document
*/
public function setOptimizedPdfFilename($optimizedPdfFilename)
{
$this->optimizedPdfFilename = $optimizedPdfFilename;
return $this;
}
/**
* Get optimizedPdfFilename
*
* @return string
*/
public function getOptimizedPdfFilename()
{
return $this->optimizedPdfFilename;
}
/**
* Set optimizedPdfFile
*
* @param string $optimizedPdfFile
*
* @return Document
*/
public function setOptimizedPdfFile($optimizedPdfFile)
{
$this->optimizedPdfFile = $optimizedPdfFile;
return $this;
}
/**
* Get optimizedPdfFile
*
* @return string
*/
public function getOptimizedPdfFile()
{
return $this->optimizedPdfFile;
}
/**
* Set convertedToXodStatus
*
* @param int $convertedToXodStatus
*
* @return Document
*/
public function setConvertedToXodStatus($convertedToXodStatus)
{
$this->convertedToXodStatus = $convertedToXodStatus;
return $this;
}
/**
* Get convertedToXodStatus
*
* @return int
*/
public function getConvertedToXodStatus()
{
return $this->convertedToXodStatus;
}
/**
* Get ConvertedToXodStatus options
*
* @return array
*/
public static function getConvertedToXodStatusOptions()
{
return [
self::CONVERSION_TO_XOD_PENDING => 'Pending',
self::CONVERSION_TO_XOD_COMPLETE => 'Complete',
self::CONVERSION_TO_XOD_FAILED => 'Failed',
self::CONVERSION_TO_XOD_CURRENT => 'Current',
self::CONVERSION_TO_XOD_SKIPPED => 'Skipped',
self::CONVERSION_TO_XOD_ENCRYPTED => 'Encrypted',
];
}
/**
* Get ConvertedToXodStatus label
*
* @param bool $markupFriendly - If the label returned should be markup friendly.
* Used for when you want to use the label as a CSS class.
*
* @return string
*/
public function getConvertedToXodStatusLabel($markupFriendly = false)
{
$options = self::getConvertedToXodStatusOptions();
$label = $options[$this->getConvertedToXodStatus()] ?? '';
if ($markupFriendly) {
return strtolower(str_replace(' ', '-', $label));
}
return $label;
}
/**
* Get ConvertedToWebAVStatus options
*
* @return array
*/
public static function getConvertedToWebAVStatusOptions()
{
return [
self::CONVERSION_TO_WEBAV_PENDING => 'Pending',
self::CONVERSION_TO_WEBAV_COMPLETE => 'Complete',
self::CONVERSION_TO_WEBAV_FAILED => 'Failed',
self::CONVERSION_TO_WEBAV_CURRENT => 'Current',
self::CONVERSION_TO_WEBAV_SKIPPED => 'Skipped',
];
}
/**
* Get ConvertedToWebAVStatus label
*
* @param bool $markupFriendly - If the label returned should be markup friendly.
* Used for when you want to use the label as a CSS class.
*
* @return string
*/
public function getConvertedToWebAVStatusLabel($markupFriendly = false)
{
$options = self::getConvertedToWebAVStatusOptions();
$label = $options[$this->getConvertedToWebAVStatus()] ?? '';
if ($markupFriendly) {
return strtolower(str_replace(' ', '-', $label));
}
return $label;
}
/**
* Returns true if the Document's ConvertedToXod status is Pending.
*
* @return bool
*/
public function isConvertedToXodPending()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_PENDING;
}
/**
* Returns true if the Document's ConvertedToXod status is Complete.
*
* @return bool
*/
public function isConvertedToXodComplete()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_COMPLETE;
}
/**
* Returns true if the Document's ConvertedToXod status is Failed.
*
* @return bool
*/
public function isConvertedToXodFailed()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_FAILED;
}
/**
* Returns true if the Document's ConvertedToXod status is Current.
*
* @return bool
*/
public function isConvertedToXodCurrent()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_CURRENT;
}
/**
* Returns true if the Document's ConvertedToXod status is Skipped.
*
* @return bool
*/
public function isConvertedToXodSkipped()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_SKIPPED;
}
/**
* Returns true if the Document's ConvertedToXod status is Encrypted.
*
* @return bool
*/
public function isConvertedToXodEncrypted()
{
return $this->getConvertedToXodStatus() === self::CONVERSION_TO_XOD_ENCRYPTED;
}
/**
* Set xodFilename
*
* @param string $xodFilename
*
* @return Document
*/
public function setXodFilename($xodFilename)
{
$this->xodFilename = $xodFilename;
return $this;
}
/**
* Get xodFilename
*
* @return string
*/
public function getXodFilename()
{
return $this->xodFilename;
}
/**
* Set xodFile
*
* @param string $xodFile
*
* @return Document
*/
public function setXodFile($xodFile)
{
$this->xodFile = $xodFile;
return $this;
}
/**
* Set WebAVFile
*
* @param string $webAVFile
*
* @return Document
*/
public function setWebAVFile($webAVFile)
{
$this->webAVFile = $webAVFile;
return $this;
}
/**
* Get WebAVFile
*
* @return string
*/
public function getWebAVFile()
{
return $this->webAVFile;
}
/**
* Get xodFile
*
* @return string
*/
public function getXodFile()
{
return $this->xodFile;
}
/**
* Set ocrFilename
*
* @param string $ocrFilename
*
* @return Document
*/
public function setOcrFilename($ocrFilename)
{
$this->ocrFilename = $ocrFilename;
return $this;
}
/**
* Get ocrFilename
*
* @return string
*/
public function getOcrFilename()
{
return $this->ocrFilename;
}
/**
* Set ocrFile
*
* @param string $ocrFile
*
* @return Document
*/
public function setOcrFile($ocrFile)
{
$this->ocrFile = $ocrFile;
return $this;
}
/**
* Get ocrFile
*
* @return string
*/
public function getOcrFile()
{
return $this->ocrFile;
}
/**
* Set convertedToOcrStatus
*
* @param int $convertedToOcrStatus
*
* @return Document
*/
public function setConvertedToOcrStatus($convertedToOcrStatus)
{
$this->convertedToOcrStatus = $convertedToOcrStatus;
return $this;
}
/**
* Get convertedToOcrStatus
*
* @return int
*/
public function getConvertedToOcrStatus()
{
return $this->convertedToOcrStatus;
}
/**
* Get ConvertedToOcrStatus options
*
* @return array
*/
public static function getConvertedToOcrStatusOptions()
{
return [
self::CONVERSION_TO_OCR_PENDING => 'Pending',
self::CONVERSION_TO_OCR_COMPLETE => 'Complete',
self::CONVERSION_TO_OCR_FAILED => 'Failed',
self::CONVERSION_TO_OCR_CURRENT => 'In Progress',
self::CONVERSION_TO_OCR_SKIPPED => 'Skipped',
];
}
/**
* Get ConvertedToOcrStatus label
*
* @param bool $markupFriendly - If the label returned should be markup friendly.
* Used for when you want to use the label as a CSS class.
*
* @return string
*/
public function getConvertedToOcrStatusLabel($markupFriendly = false)
{
$options = self::getConvertedToOcrStatusOptions();
$label = $options[$this->getConvertedToOcrStatus()] ?? '';
if ($markupFriendly) {
return strtolower(str_replace(' ', '-', $label));
}
return $label;
}
/**
* Returns true if the Document's ConvertedToOcr status is Pending.
*
* @return bool
*/
public function isConvertedToOcrPending()
{
return $this->getConvertedToOcrStatus() === self::CONVERSION_TO_OCR_PENDING;
}
/**
* Returns true if the Document's ConvertedToOcr status is Complete.
*
* @return bool
*/
public function isConvertedToOcrComplete()
{
return $this->getConvertedToOcrStatus() === self::CONVERSION_TO_OCR_COMPLETE;
}
/**
* Returns true if the Document's ConvertedToOcr status is Failed.
*
* @return bool
*/
public function isConvertedToOcrFailed()
{
return $this->getConvertedToOcrStatus() === self::CONVERSION_TO_OCR_FAILED;
}
/**
* Returns true if the Document's ConvertedToOcr status is Current.
*
* @return bool
*/
public function isConvertedToOcrCurrent()
{
return $this->getConvertedToOcrStatus() === self::CONVERSION_TO_OCR_CURRENT;
}
/**
* Returns true if the Document's ConvertedToOcr status is Skipped.
*
* @return bool
*/
public function isConvertedToOcrSkipped()
{
return $this->getConvertedToOcrStatus() === self::CONVERSION_TO_OCR_SKIPPED;
}
/**
* Returns true if we support OCR on this document type.
*
* @return bool
*/
public function supportsOCR()
{
$allowedTypes = self::getSupportedTypesForOCR();
return in_array($this->getMimeType(), $allowedTypes);
}
/**
* Returns the MIME types we support for OCR.
*
* @return array
*/
public static function getSupportedTypesForOCR()
{
return MimeTypes::PDF_MIME_TYPES;
}
/**
* Returns true if the Document can go ahead with OCR
*
* @return bool
*/
public function ocrCanContinue()
{
return (!$this->isConvertedToOcrSkipped()
&& !$this->isConvertedToOcrFailed()
&& !$this->isConvertedToOcrCurrent()
);
}
/**
* Set ocrXodFilename
*
* @param string $ocrXodFilename
*
* @return Document
*/
public function setOcrXodFilename($ocrXodFilename)
{
$this->ocrXodFilename = $ocrXodFilename;
return $this;
}
/**
* Get ocrXodFilename
*
* @return string|null
*/
public function getOcrXodFilename()
{
return $this->ocrXodFilename;
}
/**
* Set ocrXodFile
*
* @param string $ocrXodFile
*
* @return Document
*/
public function setOcrXodFile($ocrXodFile)
{
$this->ocrXodFile = $ocrXodFile;
return $this;
}
/**
* Get ocrXodFile
*
* @return string|null
*/
public function getOcrXodFile()
{
return $this->ocrXodFile;
}
/**
* Set convertedToWebAVStatus.
*
* @param int|null $convertedToWebAVStatus
*
* @return Document
*/
public function setConvertedToWebAVStatus($convertedToWebAVStatus = null)
{
$this->convertedToWebAVStatus = $convertedToWebAVStatus;
return $this;
}
/**
* Get convertedToWebAVStatus.
*
* @return int|null
*/
public function getConvertedToWebAVStatus()
{
return $this->convertedToWebAVStatus;
}
/**
* Set webAVFilename.
*
* @param string|null $webAVFilename
*
* @return Document
*/
public function setWebAVFilename($webAVFilename = null)
{
$this->webAVFilename = $webAVFilename;
return $this;
}
/**
* Get webAVFilename.
*
* @return string|null
*/
public function getWebAVFilename()
{
return $this->webAVFilename;
}
/**
* Set xodBlobFile
*
* @param string $xodBlobFile
*
* @return Document
*/
public function setXodBlobFile($xodBlobFile): self
{
$this->xodBlobFile = $xodBlobFile;
return $this;
}
/**
*
* @return VirusScanItem|null
*/
public function getVirusScanItem(): ?VirusScanItem
{
return $this->virusScanItem;
}
/**
* @param VirusScanItem|null $virusScanItem
*
* @return self
*/
public function setVirusScanItem(?VirusScanItem $virusScanItem): self
{
// unset the owning side of the relation if necessary
if ($virusScanItem === null && $this->virusScanItem !== null) {
$this->virusScanItem->setDocument(null);
}
// set the owning side of the relation if necessary
if ($virusScanItem !== null && $virusScanItem->getDocument() !== $this) {
$virusScanItem->setDocument($this);
}
$this->virusScanItem = $virusScanItem;
return $this;
}
/**
* @param VirusScannerPathVisitorInterface $virusScannerPathVisitor
*
* @return VirusScannerVisitorInterface
*/
public function acceptVirusScannerPathVisitor(VirusScannerPathVisitorInterface $virusScannerPathVisitor): string
{
return $virusScannerPathVisitor->visitDocument($this);
}
/**
* Get xodBlobFile
*
* @return string
*/
public function getXodBlobFile()
{
return $this->xodBlobFile;
}
/**
* We return the xodFilename, as the file is mapped to the same filename field.
*
* @return string
*/
public function getXodBlobFilename()
{
return $this->xodFilename;
}
/**
* Set ocrXodBlobFile
*
* @param string $ocrXodBlobFile
*
* @return Document
*/
public function setOcrXodBlobFile($ocrXodBlobFile): self
{
$this->ocrXodBlobFile = $ocrXodBlobFile;
return $this;
}
/**
* Get ocrXodBlobFile
*
* @return string
*/
public function getOcrXodBlobFile()
{
return $this->ocrXodBlobFile;
}
/**
* We return the xodFilename, as the file is mapped to the same filename field.
*
* @return string
*/
public function getOcrXodBlobFilename()
{
return $this->ocrXodFilename;
}
}