src/Entity/JournalData.php line 31
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM,
Doctrine\DBAL\Types\Types;
use Symfony\Component\Serializer\Annotation\Groups,
Symfony\Component\Validator\Constraints as Assert;
use ApiPlatform\Metadata\ApiProperty,
ApiPlatform\Metadata\ApiResource,
ApiPlatform\Metadata\Get;
use App\Entity\Trait\IdTrait,
App\Entity\Trait\UuidTrait,
App\Entity\CitationType,
App\Enum\Language,
App\Enum\JournalPeriodicity,
App\Enum\JournalState,
App\Enum\JournalType,
App\Enum\JournalLicence,
App\Doctrine\DBAL\Types\LanguagesType,
App\Repository\JournalDataRepository;
#[ApiResource(
security: 'is_granted("' . Journal::class . '")',
operations: [ new Get() ],
extraProperties: ['standard_put' => false],
)]
#[ORM\Entity(repositoryClass: JournalDataRepository::class)]
class JournalData
{
use IdTrait,
UuidTrait;
#[ApiProperty(description: 'Parent')]
#[ORM\OneToOne(targetEntity: Journal::class, inversedBy: 'data')]
#[ORM\JoinColumn(onDelete: 'cascade', nullable: false)]
private Journal $parent;
#[ApiProperty(description: 'Working title')]
#[Groups(['read', 'read:list', 'write'])]
#[Assert\NotBlank]
#[ORM\Column(type: Types::STRING, length: 1023)]
private string $workingTitle;
#[ApiProperty(description: 'Working subtitle')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::STRING, length: 1023, nullable: true)]
private ?string $workingSubtitle = null;
#[ApiProperty(description: 'Publication languages', writableLink: false)]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\Choice(callback: [Language::class, 'cases'], multiple: true)]
#[Assert\Unique]
#[Assert\Count(min: 1)]
#[ORM\Column(type: LanguagesType::NAME)]
private array $publicationLanguages = [Language::EN];
#[ApiProperty(description: 'Is Uj')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $isUj = false;
#[ApiProperty(description: 'Periodicity', writableLink: false)]
#[Groups(['read:' . Journal::class, 'read:list', 'write'])]
#[ORM\Column(
type: Types::STRING,
enumType: JournalPeriodicity::class,
length: 255,
options: ['default' => JournalPeriodicity::MONTHLY]
)]
private JournalPeriodicity $periodicity = JournalPeriodicity::MONTHLY;
#[ApiProperty(description: 'State', writableLink: false)]
#[Groups(['read:'. Journal::class, 'write'])]
#[ORM\Column(
type: Types::STRING,
enumType: JournalState::class,
length: 255,
options: ['default' => JournalState::ACTIVE]
)]
private JournalState $state = JournalState::ACTIVE;
#[ApiProperty(description: 'Type', writableLink: false)]
#[Groups(['read:'. Journal::class, 'write'])]
#[ORM\Column(
type: Types::STRING,
enumType: JournalType::class,
length: 255,
options: ['default' => JournalType::SCIENTIFIC]
)]
private JournalType $type = JournalType::SCIENTIFIC;
#[ApiProperty(description: 'Licence', writableLink: false)]
#[Groups(['read:'. Journal::class, 'write'])]
#[ORM\Column(
type: Types::STRING,
enumType: JournalLicence::class,
length: 255,
options: ['default' => JournalLicence::CC_BY]
)]
private JournalLicence $licence = JournalLicence::CC_BY;
#[ApiProperty(description: 'Is open')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isOpen = true;
#[ApiProperty(description: 'Price per issue')]
#[Groups(['read:' . Journal::class])]
#[Assert\PositiveOrZero]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $issuePrice = null;
#[ApiProperty(description: 'VAT per issue')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\PositiveOrZero]
#[Assert\Range(min: 0, max: 100)]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $issueVat = null;
#[ApiProperty(description: 'Price per article')]
#[Groups(['read:' . Journal::class])]
#[Assert\PositiveOrZero]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $articlePrice = null;
#[ApiProperty(description: 'VAT per article')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\PositiveOrZero]
#[Assert\Range(min: 0, max: 100)]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $articleVat = null;
#[ApiProperty(description: 'Open access granted after period')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\Regex(
pattern: '/^[0-9]+ (days|months|years)$/',
message: 'Wrong format. Required: <int> days|months|years'
)]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $openAccessGrantedAfterPeriod = null;
#[ApiProperty(description: 'Is open access granted after newest issue expired')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $isOpenAccessGrantedAfterNewestIssueExpired = false;
#[ApiProperty(description: 'Is publication free')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isPublicationFree = true;
#[ApiProperty(description: 'Price per article for publication')]
#[Groups(['read:' . Journal::class])]
#[Assert\PositiveOrZero]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $publicationPrice = null;
#[ApiProperty(description: 'VAT per article for publication')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\PositiveOrZero]
#[Assert\Range(min: 0, max: 100)]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $publicationVat = null;
#[ApiProperty(description: 'Is new')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $isNew = false;
#[ApiProperty(description: 'Is featured')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $isFeatured = false;
#[ApiProperty(description: 'ISSN')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\Issn]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $issn = null;
#[ApiProperty(description: 'Is ISSN visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isIssnVisible = true;
#[ApiProperty(description: 'E-ISSN')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\Issn]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $eIssn = null;
#[ApiProperty(description: 'Is E-ISSN visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isEIssnVisible = true;
#[ApiProperty(description: 'MEIN score')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\PositiveOrZero]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $meinScore = null;
#[ApiProperty(description: 'Is MEIN score visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isMeinScoreVisible = true;
#[ApiProperty(description: 'DOI')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $doi = null;
#[ApiProperty(description: 'Is DOI visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isDoiVisible = true;
#[ApiProperty(description: 'UIC ID')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $uicId = null;
#[ApiProperty(description: 'Is UIC ID visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isUicIdVisible = true;
#[ApiProperty(description: 'Websites')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\All([new Assert\Expression(
expression: 'this.isWebsiteFormatValid(value)',
message: 'Wrong format. Required: { url: <string>, isTargetBlank: <bool>, stat: <bool> }'
) ])]
#[ORM\Column(type: Types::JSON)]
private array $websites = [];
#[ApiProperty(description: 'OJS link')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $ojsLink = null;
#[ApiProperty(description: 'Is OJS link visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isOjsLinkVisible = true;
#[ApiProperty(description: 'Is paper version')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $isPaperVersion = false;
#[ApiProperty(description: 'Is paper version visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isPaperVersionVisible = true;
#[ApiProperty(description: 'Foundation year')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\Range(min: 1900)]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $foundationYear = null;
#[ApiProperty(description: 'Is foundation year visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isFoundationYearVisible = true;
#[ApiProperty(description: 'Abbreviations')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\All([new Assert\Length(max: 511)])]
#[ORM\Column(type: Types::JSON)]
private array $abbreviations = [];
#[ApiProperty(description: 'Is abbreviations visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isAbbreviationsVisible = true;
#[ApiProperty(description: 'Suggested citation type', writableLink: false)]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\ManyToOne(targetEntity: CitationType::class)]
#[ORM\JoinColumn(onDelete: 'set null')]
private ?CitationType $suggestedCitationType = null;
#[ApiProperty(description: 'Is suggested citation type visible')]
#[Groups(['read:' . Journal::class, 'write'])]
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => true])]
private bool $isSuggestedCitationTypeVisible = true;
#[ApiProperty(description: 'Published till')]
#[Groups(['read:' . Journal::class, 'write'])]
#[Assert\PositiveOrZero]
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $publishedTill = null;
public function __construct(Journal $parent)
{
$this->setUuid();
$this->parent = $parent;
}
public function getParent(): Journal
{
return $this->parent;
}
public function getWorkingTitle(): string
{
return $this->workingTitle;
}
public function setWorkingTitle(string $workingTitle): self
{
$this->workingTitle = $workingTitle;
return $this;
}
public function getWorkingSubtitle(): ?string
{
return $this->workingSubtitle;
}
public function setWorkingSubtitle(?string $workingSubtitle): self
{
$this->workingSubtitle = $workingSubtitle;
return $this;
}
public function getPublicationLanguages(): array
{
return $this->publicationLanguages;
}
public function setPublicationLanguages(array $publicationLanguages): self
{
$this->publicationLanguages = $publicationLanguages;
return $this;
}
public function getIsUj(): bool
{
return $this->isUj;
}
public function setIsUj(bool $isUj): self
{
$this->isUj = $isUj;
return $this;
}
public function getPeriodicity(): JournalPeriodicity
{
return $this->periodicity;
}
public function setPeriodicity(JournalPeriodicity $periodicity): self
{
$this->periodicity = $periodicity;
return $this;
}
public function getState(): JournalState
{
return $this->state;
}
public function setState(JournalState $state): self
{
$this->state = $state;
return $this;
}
public function getType(): JournalType
{
return $this->type;
}
public function setType(JournalType $type): self
{
$this->type = $type;
return $this;
}
public function getLicence(): JournalLicence
{
return $this->licence;
}
public function setLicence(JournalLicence $licence): self
{
$this->licence = $licence;
return $this;
}
public function getIsOpen(): bool
{
return $this->isOpen;
}
public function setIsOpen(bool $isOpen): self
{
$this->isOpen = $isOpen;
return $this;
}
public function getIssuePrice(): ?int
{
return $this->issuePrice;
}
#[Groups(['read:' . self::class, 'read:' . Journal::class])]
public function getIssuePriceReal(): ?float
{
return $this->issuePrice ? round($this->issuePrice / 1000, 2) : null;
}
public function setIssuePrice(?int $issuePrice): self
{
$this->issuePrice = $issuePrice;
return $this;
}
#[Groups(['write'])]
public function setIssuePriceReal(?float $issuePriceReal): self
{
$this->issuePrice = (int) ($issuePriceReal * 1000);
return $this;
}
public function getIssueVat(): ?int
{
return $this->issueVat;
}
public function setIssueVat(?int $issueVat): self
{
$this->issueVat = $issueVat;
return $this;
}
public function getArticlePrice(): ?int
{
return $this->articlePrice;
}
#[Groups(['read:' . self::class, 'read:' . Journal::class])]
public function getArticlePriceReal(): ?float
{
return $this->articlePrice ? round($this->articlePrice / 1000, 2) : null;
}
public function setArticlePrice(?int $articlePrice): self
{
$this->articlePrice = $articlePrice;
return $this;
}
#[Groups(['write'])]
public function setArticlePriceReal(?float $articlePriceReal): self
{
$this->articlePrice = (int) ($articlePriceReal * 1000);
return $this;
}
public function getArticleVat(): ?int
{
return $this->articleVat;
}
public function setArticleVat(?int $articleVat): self
{
$this->articleVat = $articleVat;
return $this;
}
public function getOpenAccessGrantedAfterPeriod(): ?string
{
return $this->openAccessGrantedAfterPeriod;
}
public function setOpenAccessGrantedAfterPeriod(?string $openAccessGrantedAfterPeriod): self
{
$this->openAccessGrantedAfterPeriod = $openAccessGrantedAfterPeriod;
return $this;
}
public function getIsOpenAccessGrantedAfterNewestIssueExpired(): bool
{
return $this->isOpenAccessGrantedAfterNewestIssueExpired;
}
public function setIsOpenAccessGrantedAfterNewestIssueExpired(bool $isOpenAccessGrantedAfterNewestIssueExpired): self
{
$this->isOpenAccessGrantedAfterNewestIssueExpired = $isOpenAccessGrantedAfterNewestIssueExpired;
return $this;
}
public function getIsPublicationFree(): bool
{
return $this->isPublicationFree;
}
public function setIsPublicationFree(bool $isPublicationFree): self
{
$this->isPublicationFree = $isPublicationFree;
return $this;
}
public function getPublicationPrice(): ?int
{
return $this->publicationPrice;
}
public function setPublicationPrice(?int $publicationPrice): self
{
$this->publicationPrice = $publicationPrice;
return $this;
}
#[Groups(['read:' . self::class, 'read:' . Journal::class])]
public function getPublicationPriceReal(): ?float
{
return $this->publicationPrice ? round($this->publicationPrice / 1000, 2) : null;
}
#[Groups(['write'])]
public function setPublicationPriceReal(?float $publicationPriceReal): self
{
$this->publicationPrice = (int) ($publicationPriceReal * 1000);
return $this;
}
public function getPublicationVat(): ?int
{
return $this->publicationVat;
}
public function setPublicationVat(?int $publicationVat): self
{
$this->publicationVat = $publicationVat;
return $this;
}
public function getIsNew(): bool
{
return $this->isNew;
}
public function setIsNew(bool $isNew): self
{
$this->isNew = $isNew;
return $this;
}
public function getIsFeatured(): bool
{
return $this->isFeatured;
}
public function setIsFeatured(bool $isFeatured): self
{
$this->isFeatured = $isFeatured;
return $this;
}
public function getIssn(): ?string
{
return $this->issn;
}
public function setIssn(?string $issn): self
{
$this->issn = $issn;
return $this;
}
public function getIsIssnVisible(): bool
{
return $this->isIssnVisible;
}
public function setIsIssnVisible(bool $isIssnVisible): self
{
$this->isIssnVisible = $isIssnVisible;
return $this;
}
public function getEIssn(): ?string
{
return $this->eIssn;
}
public function setEIssn(?string $eIssn): self
{
$this->eIssn = $eIssn;
return $this;
}
public function getIsEIssnVisible(): bool
{
return $this->isEIssnVisible;
}
public function setIsEIssnVisible(bool $isEIssnVisible): self
{
$this->isEIssnVisible = $isEIssnVisible;
return $this;
}
public function getMeinScore(): ?int
{
return $this->meinScore;
}
public function setMeinScore(?int $meinScore): self
{
$this->meinScore = $meinScore;
return $this;
}
public function getIsMeinScoreVisible(): bool
{
return $this->isMeinScoreVisible;
}
public function setIsMeinScoreVisible(bool $isMeinScoreVisible): self
{
$this->isMeinScoreVisible = $isMeinScoreVisible;
return $this;
}
public function getDoi(): ?string
{
return $this->doi;
}
public function setDoi(?string $doi): self
{
$this->doi = $doi;
return $this;
}
public function getIsDoiVisible(): bool
{
return $this->isDoiVisible;
}
public function setIsDoiVisible(bool $isDoiVisible): self
{
$this->isDoiVisible = $isDoiVisible;
return $this;
}
public function getUicId(): ?int
{
return $this->uicId;
}
public function setUicId(?int $uicId): self
{
$this->uicId = $uicId;
return $this;
}
public function getIsUicIdVisible(): bool
{
return $this->isUicIdVisible;
}
public function setIsUicIdVisible(bool $isUicIdVisible): self
{
$this->isUicIdVisible = $isUicIdVisible;
return $this;
}
public function getWebsites(): array
{
return $this->websites;
}
public function setWebsites(array $websites): self
{
$this->websites = $websites;
return $this;
}
public function isWebsiteFormatValid(array $website): bool
{
$url = $website['url'] ?? null;
$isTargetBlank = $website['isTargetBlank'] ?? null;
$stat = $website['stat'] ?? null;
if (
! is_string($url)
|| ! is_bool($isTargetBlank)
|| ! is_bool($stat)
) {
return false;
}
return strlen($url) < 511;
}
public function getWebsitesEnabled(): array
{
return array_filter(
$this->websites,
function ($website) {
return $website['stat'] === true;
}
);
}
public function getIsPaperVersion(): bool
{
return $this->isPaperVersion;
}
public function setIsPaperVersion(bool $isPaperVersion): self
{
$this->isPaperVersion = $isPaperVersion;
return $this;
}
public function getOjsLink(): ?string
{
return $this->ojsLink;
}
public function setOjsLink(?string $ojsLink): self
{
$this->ojsLink = $ojsLink;
return $this;
}
public function getIsOjsLinkVisible(): bool
{
return $this->isOjsLinkVisible;
}
public function setIsOjsLinkVisible(bool $isOjsLinkVisible): self
{
$this->isOjsLinkVisible = $isOjsLinkVisible;
return $this;
}
public function getIsPaperVersionVisible(): bool
{
return $this->isPaperVersionVisible;
}
public function setIsPaperVersionVisible(bool $isPaperVersionVisible): self
{
$this->isPaperVersionVisible = $isPaperVersionVisible;
return $this;
}
public function getFoundationYear(): ?int
{
return $this->foundationYear;
}
public function setFoundationYear(?int $foundationYear): self
{
$this->foundationYear = $foundationYear;
return $this;
}
public function getIsFoundationYearVisible(): bool
{
return $this->isFoundationYearVisible;
}
public function setIsFoundationYearVisible(bool $isFoundationYearVisible): self
{
$this->isFoundationYearVisible = $isFoundationYearVisible;
return $this;
}
public function getAbbreviations(): array
{
return $this->abbreviations;
}
public function setAbbreviations(array $abbreviations): self
{
$this->abbreviations = $abbreviations;
return $this;
}
public function getIsAbbreviationsVisible(): bool
{
return $this->isAbbreviationsVisible;
}
public function setIsAbbreviationsVisible(bool $isAbbreviationsVisible): self
{
$this->isAbbreviationsVisible = $isAbbreviationsVisible;
return $this;
}
public function getSuggestedCitationType(): ?CitationType
{
return $this->suggestedCitationType;
}
public function setSuggestedCitationType(?CitationType $suggestedCitationType): self
{
$this->suggestedCitationType = $suggestedCitationType;
return $this;
}
public function getIsSuggestedCitationTypeVisible(): bool
{
return $this->isSuggestedCitationTypeVisible;
}
public function setIsSuggestedCitationTypeVisible(bool $isSuggestedCitationTypeVisible): self
{
$this->isSuggestedCitationTypeVisible = $isSuggestedCitationTypeVisible;
return $this;
}
public function getPublishedTill(): ?int
{
return $this->publishedTill;
}
public function setPublishedTill(?int $publishedTill): self
{
$this->publishedTill = $publishedTill;
return $this;
}
public function clone(Journal $parent): self
{
$clone = clone $this;
$clone->id = null;
$clone->setUuid();
$clone->parent = $parent;
return $clone;
}
}