<?php
namespace Drupal\cfp_payment_request\Entity;
use Drupal\cfp_payment_request\Event\PRTransitionEvent;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
use Drupal\Core\Entity\EntityPublishedTrait;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Drupal\halo_closable_entity\Entity\ClosableEntityTrait;
use Drupal\halo_entity_cfp\Entity\Cfp;
use Drupal\halo_entity_validator\Entity\HaloEntityValidationTrait;
use Drupal\halo_parent_entity\Entity\ChildEntityTrait;
use Drupal\halo_printer\Entity\HaloPrintableEntityTrait;
use Drupal\halo_printer\Entity\PrintTokenEntityInterface;
use Drupal\halo_transition_history_field\Plugin\Field\TransitionDateSearchItemList;
use Drupal\user\UserInterface;
use Drupal\halo_entity_cfp\Entity\CfpPaymentInterface;
/**
* Defines the Payment request entity.
*
* @ingroup cfp_payment_request
*
* @ContentEntityType(
* id = "cfp_payment_request",
* label = @Translation("Payment request"),
* bundle_label = @Translation("Payment request type"),
* handlers = {
* "view_builder" = "Drupal\cfp_payment_request\PaymentRequestEntityViewBuilder",
* "list_builder" = "Drupal\cfp_payment_request\PaymentRequestListBuilder",
* "views_data" = "Drupal\cfp_payment_request\Entity\PaymentRequestViewsData",
*
* "form" = {
* "default" = "Drupal\cfp_payment_request\Form\PaymentRequestForm",
* "add" = "Drupal\cfp_payment_request\Form\PaymentRequestForm",
* "edit" = "Drupal\cfp_payment_request\Form\PaymentRequestForm",
* "delete" = "Drupal\cfp_payment_request\Form\PaymentRequestDeleteForm",
* "suspended_documents" = "\Drupal\cfp_payment_request\Form\PaymentRequestSuspendedDocumentsForm",
* },
* "route_provider" = {
* "html" = "Drupal\cfp_payment_request\PaymentRequestHtmlRouteProvider",
* },
* "access" = "Drupal\cfp_payment_request\PaymentRequestAccessControlHandler",
* },
* base_table = "cfp_payment_request",
* translatable = FALSE,
* admin_permission = "administer payment request entities",
* entity_keys = {
* "id" = "id",
* "bundle" = "type",
* "label" = "name",
* "uuid" = "uuid",
* "uid" = "user_id",
* "langcode" = "langcode",
* "published" = "status",
* },
* links = {
* "canonical" = "/admin/structure/cfp_payment_request/{cfp_payment_request}",
* "add-page" = "/admin/structure/cfp_payment_request/add",
* "add-form" = "/admin/structure/cfp_payment_request/add/{cfp_payment_request_type}",
* "edit-form" = "/admin/structure/cfp_payment_request/{cfp_payment_request}/edit",
* "current-correction-form" = "/admin/structure/cfp_payment_request/{cfp_payment_request}/correction",
* "correction-submit-form" = "/admin/structure/cfp_payment_request/{cfp_payment_request}/correction_submit",
* "delete-form" = "/admin/structure/cfp_payment_request/{cfp_payment_request}/delete",
* "collection" = "/admin/structure/cfp_payment_request",
* "admin-view" = "/admin/structure/cfp_payment_request/{cfp_payment_request}/admin_view",
* "suspended-documents" = "/cfp_payment_request/{cfp_payment_request}/suspended_documents",
* "suspended-documents-submit" = "/cfp_payment_request/{cfp_payment_request}/suspended_documents_submit"
* },
* bundle_entity_type = "cfp_payment_request_type",
* field_ui_base_route = "entity.cfp_payment_request_type.edit_form"
* )
*/
class PaymentRequest extends ContentEntityBase implements PaymentRequestInterface, CfpPaymentInterface, PrintTokenEntityInterface {
use EntityChangedTrait;
use EntityPublishedTrait;
use HaloEntityValidationTrait;
use ClosableEntityTrait;
use HaloPrintableEntityTrait;
use ChildEntityTrait;
const ADD_UP_FIELDS = [
'item_pay_off',
'item_support',
'item_pay_off_computed',
'item_support_computed',
'item_net_amount',
'item_vat',
'item_bruto',
'item_own_source',
];
/**
* {@inheritdoc}
*/
public static function preCreate(EntityStorageInterface $storage_controller, array &$values) {
parent::preCreate($storage_controller, $values);
$values += [
'user_id' => \Drupal::currentUser()->id(),
];
}
/**
* {@inheritdoc}
*/
public function getName() {
return $this->get('label')->value;
}
/**
* {@inheritdoc}
* @todo Refactor this in more functions.
*/
public function preSave(EntityStorageInterface $storage) {
parent::preSave($storage);
/** @var \Drupal\cfp_payment_request\Entity\PaymentRequestType $payment_request_type */
$payment_request_type = $this->get('type')->entity;
$clear_reopen_instructions = FALSE;
if (!$this->isNew()) {
// On opening payment request.
if ($this->getState() === 'open_state' && $this->getState() !== $this->original->getState()) {
$this->set('validation_passed', FALSE);
$this->set('closed', FALSE);
$this->set('print', NULL);
$this->set('print_confirmed', FALSE);
}
// On reopening payment request.
if ($this->getState() === 'reopened' && $this->getState() !== $this->original->getState()) {
/** @var \Drupal\file\Entity\File $old_print_file */
$old_print_file = $this->get('print')->entity;
if ($old_print_file) {
$this->get('old_prints')->appendItem([
'target_id' => $old_print_file->id(),
'description' => DrupalDateTime::createFromTimestamp($old_print_file->getCreatedTime())->format('Y.m.d.') . ' - print',
]);
}
$reopen_instructions = $this->get('reopen_instructions')->value ?? '-';
$this->get('previous_reopen_instructions')->appendItem(['value' => $reopen_instructions]);
$clear_reopen_instructions = TRUE;
$this->invalidate()->open()->clearPrintFile()->unconfirmPrint();
}
if ($this->isPrintConfirmed() === TRUE && $this->original->isPrintConfirmed() === FALSE) {
$this->appendChecklist($this->getState() === 'reopened');
$this->setState('sent');
if ($this->get('first_submission_date')->isEmpty()) {
$this->set('first_submission_date', \Drupal::time()->getCurrentTime());
}
}
if (!$this->original->isClosed() && $this->isClosed()) {
$datetime = new DrupalDateTime();
$datetime->setTimezone(new \DateTimeZone('UTC'));
$this->set('closed_date', $datetime->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT));
}
if ($this->getState() === 'correction_submitted' &&
$this->original->getState() === 'correction'
) {
$current_correction = (int) $this->get('current_correction')->value;
$this->appendChecklist(TRUE);
$this->set('current_correction', ($current_correction + 1));
}
if ($this->getState() === 'deadline_expired' &&
$this->original->getState() === 'reopened') {
// This function needs to accept one more optional argument (after_deadline).
$this->appendChecklist(FALSE, TRUE);
}
if (($this->getState() === 'approved' || $this->getState() === 'accepted_with_reduction') && $this->stateHasChangedFromOriginal()) {
$this->set('date_of_completion', \Drupal::time()->getCurrentTime());
}
// Flag that cfp has closing payment request.
if ($this->stateHasChangedFromOriginal() && $this->hasField('pr_type') && $this->get('pr_type')->value === 'closing') {
if (in_array($this->getState(), Cfp::getPaidStates())) {
if ($this->hasParent() && !$this->getParent()->isFlagged('has_closing_payment_request')) {
$this->getParent()->flag('has_closing_payment_request')->save();
}
}
if (in_array($this->getState(), Cfp::getCompletionStates())) {
if ($this->hasParent() && !$this->getParent()->isFlagged('has_approved_closing_pr')) {
$this->getParent()->flag('has_approved_closing_pr')->save();
}
}
}
if ($this->getState() !== $this->original->getState()) {
$event = new PRTransitionEvent(
$this,
$this->original->getState(),
$this->getState()
);
\Drupal::service('event_dispatcher')->dispatch(PRTransitionEvent::TRANSITION_EVENT, $event);
$this->appendTransition($this->getState());
$this->set('correction_deadline', NULL);
}
if ($this->stateHasChangedFromOriginal() && in_array($this->getState(), Cfp::getCompletionInvalidationStates())) {
$this->setAmountDedicatedToAp(NULL);
$this->set('date_of_completion', NULL);
}
}
if ($this->get('label')->isEmpty() && $this->hasParent()) {
$parent = $this->getParent();
$order = $parent->get('payment_request')->count() + 1;
$this->set('label', $parent->label() . '/' . $payment_request_type->get('order_prefix') . $order);
}
if ($this->hasParent()) {
$this->setOwnerId($this->getParent()->getOwnerId());
}
if ($clear_reopen_instructions) {
$this->set('reopen_instructions', NULL);
}
$items = $this->getItems(TRUE);
$this->calculateTotals($items);
$this->constructItemLabels($items);
$this->setInvoiceOrdering();
}
/**
* Calculates totals.
*/
public function calculateTotals($items = NULL) {
if (!isset($items)) {
$items = $this->getItems(TRUE);
}
foreach (self::ADD_UP_FIELDS as $add_up_field) {
$total = 0;
foreach ($items as $item) {
$total += $item->get($add_up_field)->value ?? 0;
}
$this->set("{$add_up_field}_total", $total);
}
if (($this->getState() === 'approved' || $this->getState() === 'accepted_with_reduction') && isset($this->original) && $this->original->getState() !== $this->getState()) {
/** @var \Drupal\halo_entity_cfp\Entity\Cfp $cfp */
$cfp = $this->getParent();
$not_covered_ap = $cfp->getNotCoveredApAmount();
if ($not_covered_ap > $this->getTotalSupport()) {
$this->setAmountDedicatedToAp($this->getTotalSupport());
}
else {
$this->setAmountDedicatedToAp($not_covered_ap);
}
}
}
/**
* Has state changed since original.
*
* @return bool
* Has state changed.
*/
protected function stateHasChangedFromOriginal() {
if (!isset($this->original)) {
return FALSE;
}
return $this->original->getState() !== $this->getState();
}
/**
* Constructs labels based on order from parent payment request(this entity).
*
* @param \Drupal\cfp_payment_request\Entity\PaymentRequestItem[] $items
* Payment request items.
*/
public function constructItemLabels($items) {
foreach ($items as $delta => $item) {
$label = $this->label() . '-' . str_pad(($delta + 1), 3, '0', STR_PAD_LEFT);
if ($item->getName() != $label) {
$item->setName($label);
$item->save();
}
}
}
public function setInvoiceOrdering() {
foreach ($this->getInvoices() as $order => $invoice) {
if (((int) ($order + 1)) !== ((int) $invoice->get('invoice_order')->value)) {
$invoice->set('invoice_order', $order + 1);
$invoice->save();
}
}
}
/**
* {@inheritdoc}
*/
public function setName($name) {
$this->set('label', $name);
return $this;
}
/**
* {@inheritdoc}
*/
public function getCreatedTime() {
return $this->get('created')->value;
}
/**
* {@inheritdoc}
*/
public function setCreatedTime($timestamp) {
$this->set('created', $timestamp);
return $this;
}
/**
* {@inheritdoc}
*/
public function getOwner() {
return $this->get('user_id')->entity;
}
/**
* {@inheritdoc}
*/
public function getOwnerId() {
return $this->get('user_id')->target_id;
}
/**
* {@inheritdoc}
*/
public function setOwnerId($uid) {
$this->set('user_id', $uid);
return $this;
}
/**
* {@inheritdoc}
*/
public function setOwner(UserInterface $account) {
$this->set('user_id', $account->id());
return $this;
}
/**
* Item type for this payment request.
*
* @return string
* Item type for this payment request.
*/
public function getPaymentRequestItemType() {
return \Drupal::entityTypeManager()
->getStorage('cfp_payment_request_type')
->load($this->bundle())
->get('payment_request_item_type');
}
/**
* @return \Drupal\cfp_payment_request\Entity\PaymentRequestItem[]
*/
public function getItems($with_invoice = FALSE) {
$items = [];
foreach ($this->get('items') as $field_item) {
if ($item = $field_item->entity) {
$items[] = $item;
}
}
if ($with_invoice) {
foreach ($this->getInvoices() as $invoice) {
foreach ($invoice->getItems() as $item) {
$items[] = $item;
}
}
}
return $items;
}
/**
* @return \Drupal\cfp_payment_request\Entity\PrInvoice[]
*/
public function getInvoices() {
$invoices = [];
foreach ($this->get('invoices') as $field_item) {
if ($invoice = $field_item->entity) {
$invoices[] = $invoice;
}
}
return $invoices;
}
/**
* Returns active state.
*
* @return string
* Active state.
*/
public function getState() {
return $this->get('state')->value ?: 'open_state';
}
/**
* Returns active state.
*
* @return string
* Active state.
*/
public function getStateId(): string {
return $this->getState();
}
/**
* {@inheritDoc}
*/
public function getCompletionTimestamp(): int|string|null {
return $this->get('date_of_completion')->value;
}
/**
* Payment request state.
*
* @param string $state
* Payment request state.
*
* @return static
* Returns
*/
public function setState($state) {
$this->set('state', $state);
return $this;
}
/**
* Returns user friendly state value.
*
* @return string
* User friendly value.
*/
public function getStateLabel() {
return $this->get('state')->first()->getLabel();
}
/**
* {@inheritdoc}
*/
public function inheritsParentAccess() {
return FALSE;
}
/**
* {@inheritdoc}
*/
public function label() {
return $this->get('label')->value;
}
/**
* Is item approvement closed.
*
* @return bool
*
*/
public function isItemApprovementClosed() {
return (bool) $this->get('items_approvement_closed')->value;
}
/**
* {@inheritDoc}
*/
public function appendChecklist($during_correction = FALSE, $after_deadline = FALSE) {
/** @var \Drupal\cfp_payment_request\Entity\PaymentRequestType $payment_request_type */
$payment_request_type = $this->get('type')->entity;
if (!$during_correction) {
if ($after_deadline) {
$payment_request_checklist = $this->generateDuplicateChecklist($during_correction, $after_deadline);
}
else {
$payment_request_checklist = \Drupal::entityTypeManager()
->getStorage('cfp_payment_request_checklist')
->create([
'bundle' => $payment_request_type->get('payment_request_checklist_type'),
'created_during_correction' => $during_correction,
'created_after_deadline' => $after_deadline,
]);
}
} else {
$payment_request_checklist = $this->generateDuplicateChecklist($during_correction, $after_deadline);
}
$payment_request_checklist->save();
$this->get('checklist')->appendItem($payment_request_checklist->id());
}
/**
* Generates new checklist.
*
* @param $correction
* @param $deadline
*
* @return \Drupal\cfp_payment_request\Entity\CfpPaymentRequestChecklist
*/
private function generateDuplicateChecklist($correction, $deadline): CfpPaymentRequestChecklist {
$last_checklist = $this->getLastChecklist();
$payment_request_checklist = $last_checklist->createDuplicate();
$payment_request_checklist->set('closed', FALSE);
$payment_request_checklist->set('validation_passed', FALSE);
$payment_request_checklist->set('created_during_correction', $correction);
$payment_request_checklist->set('created_after_deadline', $deadline);
return $payment_request_checklist;
}
/**
* Returns last checklist.
*
* @return \Drupal\cfp_payment_request\Entity\CfpPaymentRequestChecklist
*/
public function getLastChecklist() {
if ($this->get('checklist')->isEmpty()) {
return FALSE;
}
/** @var \Drupal\cfp_payment_request\Entity\CfpPaymentRequestChecklist $checklist */
$checklist = $this->get('checklist')->get(($this->get('checklist')->count() - 1))->entity;
return $checklist;
}
/**
* @return \Drupal\cfp_payment_request\Entity\PrCorrectionData
*/
public function getCurrentCorrectionData() {
$current_correction = $this->get('current_correction')->value;
if ($item = $this->get('correction_data')->get($current_correction)) {
if ($correction_data = $item->entity) {
return $correction_data;
}
}
return FALSE;
}
/**
* @param $to_state
*/
public function appendTransition($to_state) {
$this->get('transition_history')->appendItem([
'to' => $to_state,
'timestamp' => \Drupal::time()->getCurrentTime(),
'user_id' => \Drupal::currentUser()->id(),
'user_email' => \Drupal::currentUser()->getEmail(),
'user_display_name' => \Drupal::currentUser()->getDisplayName(),
'deadline' => $this->get('correction_deadline')->value,
]);
}
/**
* Total support.
*
* @return int
* Total support.
*/
public function getTotalSupport() {
// TODO: Check every call.
return (int) $this->get('item_support_computed_total')->value;
}
/**
* Amount to pay.
*
* @return int
* Amount to pay.
*/
public function getAmountToPay() {
return (int) $this->get('amount_to_pay')->value;
}
/**
* Amount dedicated to advance payment.
*
* @return int
* Amount dedicated to advance payment.
*/
public function getAmountDedicatedToAp() {
return (int) $this->get('computed_amount_dedicated_to_ap')->value;
}
/**
* Returns pr type.
*
* @return string
* Returns value of config field pr type.
*/
public function getPaymentRequestType() {
return $this->hasField('pr_type') ? $this->get('pr_type')->value : NULL;
}
/**
* @return string
*/
public function getPaymentRequestTypeLabel() {
if ($type = $this->getPaymentRequestType()) {
$allowed_values = $this->get('pr_type')->getFieldDefinition()->getSetting('allowed_values');
return $allowed_values[$type];
}
}
/**
* Set amount dedicated to advance payment coverage.
*
* @param $amount
* Amount dedicated to advance payment.
*/
public function setAmountDedicatedToAp($amount) {
$this->set('amount_dedicated_to_ap', $amount);
return $this;
}
/**
* @return string
* Last reopening instructions.
*/
public function getLastReopeningInstructions() {
if (!$this->get('previous_reopen_instructions')->isEmpty()) {
return $this->get('previous_reopen_instructions')->get($this->get('previous_reopen_instructions')->count() - 1)->value;
}
}
public function getSignatureToken() {
/** @var \Drupal\halo_entity_cfp\Entity\Cfp $cfp */
$cfp = $this->getParent();
return $cfp->getApplicantEntity()->label();
}
public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
$fields = [];
$pr_type = \Drupal::entityTypeManager()->getStorage('cfp_payment_request_type')->load($bundle);
if ($pr_type) {
$settings = $base_field_definitions['items']->getSettings();
$fields['items'] = clone $base_field_definitions['items'];
$settings['handler_settings']['target_bundles'] = [$pr_type->get('payment_request_item_type') => $pr_type->get('payment_request_item_type')];
$fields['items']->setSettings($settings);
$settings = $base_field_definitions['invoices']->getSettings();
$fields['invoices'] = clone $base_field_definitions['invoices'];
$settings['handler_settings']['target_bundles'] = [$pr_type->get('payment_request_invoice_type') => $pr_type->get('payment_request_invoice_type')];
$fields['invoices']->setSettings($settings);
}
return $fields;
}
/**
* Returns checklist that was before given checklist.
*
* @param \Drupal\cfp_payment_request\Entity\CfpPaymentRequestChecklist $payment_request_checklist
*/
public function getPreviousChecklist(CfpPaymentRequestChecklist $payment_request_checklist) {
$current_entity = NULL;
foreach ($this->get('checklist') as $item) {
if ($looping_payment_request_checklist = $item->entity) {
if ($looping_payment_request_checklist->id() == $payment_request_checklist->id()) {
return $current_entity;
}
$current_entity = $looping_payment_request_checklist;
}
}
}
/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields = parent::baseFieldDefinitions($entity_type);
// Add the published field.
$fields += static::publishedBaseFieldDefinitions($entity_type);
$fields['user_id'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Authored by'))
->setDescription(t('The user ID of author of the Payment request entity.'))
->setSetting('target_type', 'user')
->setSetting('handler', 'default')
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['label'] = BaseFieldDefinition::create('string')
->setLabel(t('Kifizetési Igénylés sorszáma'))
->setDescription(t('The name of the Payment request entity.'))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['item_pay_off_total'] = BaseFieldDefinition::create('integer')
->setLabel('Igényelt elszámolási összeg (Ft)')
->setSetting('size', 'big')
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['item_support_total'] = BaseFieldDefinition::create('integer')
->setLabel('Igényelt támogatási összeg (Ft)')
->setSetting('size', 'big')
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields_definitions = isolate_numeric_field_types('cfp_payment_request_item');
foreach (static::ADD_UP_FIELDS as $add_up_field) {
$field_name = $add_up_field . '_total';
if (!isset($fields[$field_name])) {
$fields[$field_name] = self::createAddUpFieldFromFieldDefinition($fields_definitions[$add_up_field]);
}
}
$fields['item_pay_off_computed_total']->setInitialValueFromField('item_pay_off_total');
$fields['item_support_computed_total']->setInitialValueFromField('item_support_total');
$fields['computed_amount_dedicated_to_ap'] = BaseFieldDefinition::create('integer')
->setLabel(t('Amount dedicated to advance payment'))
->setClass('\Drupal\cfp_payment_request\Plugin\Field\AmountDedicatedToAP')
->setComputed(TRUE)
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['amount_dedicated_to_ap'] = BaseFieldDefinition::create('integer')
->setLabel(t('Amount dedicated to advance payment'))
->setSetting('size', 'big')
->setReadOnly(TRUE);
$fields['amount_to_pay'] = BaseFieldDefinition::create('integer')
->setLabel(t('Amount to pay'))
->setComputed(TRUE)
->setClass('\Drupal\cfp_payment_request\Plugin\Field\PrAmountToPayItemList')
->setSetting('size', 'big')
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['items'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Items'))
->setSetting('target_type', 'cfp_payment_request_item')
->setSetting('handler', 'default')
->setSetting('handler_settings', [
'target_bundles' => [],
])
->setClass('\Drupal\cfp_payment_request\Plugin\Field\FieldType\PRFieldItemList')
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['items_approvement_closed'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Items approvement closed'))
->setReadOnly(TRUE);
$fields['invoices'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Invoices'))
->setSetting('target_type', 'pr_invoice')
->setSetting('handler', 'default')
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['checklist'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Checklist'))
->setSetting('target_type', 'cfp_payment_request_checklist')
->setSetting('handler', 'default')
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['state'] = BaseFieldDefinition::create('state')
->setLabel(t('State'))
->setSetting('max_length', 255)
->setDefaultValue('open_state')
->setSetting('workflow', 'payment_request')
->setDisplayConfigurable('view', TRUE);
$fields['comment'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Comment'))
->setDisplayConfigurable('view', TRUE);
$fields['justification'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Justification'))
->setDisplayConfigurable('view', TRUE);
$fields['reopen_instructions'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Reopen instructions'))
->setDisplayConfigurable('view', TRUE);
$fields['previous_reopen_instructions'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Previous reopening instructions'))
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('view', TRUE);
$fields['closed_date'] = BaseFieldDefinition::create('datetime')
->setLabel(t('Closed date'))
->setDisplayConfigurable('view', TRUE);
$fields['submission_date'] = BaseFieldDefinition::create('datetime')
->setLabel(t('Last submission date'))
->setComputed(TRUE)
->setSettings([
'state' => 'sent',
'search_for' => TransitionDateSearchItemList::SEARCH_LAST,
'field_name' => 'transition_history',
])
->setClass('\Drupal\halo_transition_history_field\Plugin\Field\TransitionDateSearchItemList')
->setDisplayConfigurable('view', TRUE);
$fields['first_submission_date'] = BaseFieldDefinition::create('timestamp')
->setLabel(t('First submission date'))
->setReadOnly(TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['current_correction'] = BaseFieldDefinition::create('integer')
->setLabel(t('Current correction'))
->setDefaultValue(0)
->setReadOnly(TRUE);
$fields['correction_data'] = BaseFieldDefinition::create('entity_reference')
->setLabel('Correction data')
->setSetting('target_type', 'correction_data')
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('view', TRUE);
$fields['old_prints'] = BaseFieldDefinition::create('file')
->setLabel(t('Older prints'))
->setSettings([
'file_directory' => 'payment_request/new/print_files',
'max_filesize' => '100 MB',
'file_extensions' => 'pdf',
'description_field' => TRUE,
'uri_scheme' => 'public',
])
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
->setDisplayConfigurable('view', TRUE);
$fields['date_of_completion'] = BaseFieldDefinition::create('timestamp')
->setLabel(t('Date of completion'))
->setDisplayConfigurable('view', TRUE)
->setDisplayConfigurable('form', TRUE);
$fields['statements_accepted'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Statements'))
->setReadOnly(TRUE)
->setDefaultValue(FALSE);
$fields['attached_documents'] = BaseFieldDefinition::create('file')
->setLabel(t('Documents attached by an administrator'))
->setSettings([
'file_directory' => 'pr_attached_files',
'max_filesize' => '100 MB',
'file_extensions' => 'pdf png jpg doc docx xls xlsx',
'description_field' => TRUE,
'uri_scheme' => 'public',
])
->setDisplayConfigurable('view', TRUE);
$fields['suspended_documents'] = BaseFieldDefinition::create('file')
->setLabel(t('Suspended documents'))
->setSettings([
'file_directory' => 'payment_request/suspended_documents',
'max_filesize' => '100 MB',
'file_extensions' => 'doc docx jpeg jpg png pdf',
'description_field' => TRUE,
'uri_scheme' => 'public',
])
->setDescription(t('Documents attached during suspension'))
->setDisplayConfigurable('view', TRUE)
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED);
$fields['transition_history'] = BaseFieldDefinition::create('transition_history')
->setLabel(t('Transition History'))
->setSetting('state_field', 'state')
->setReadOnly(TRUE)
->setDisplayConfigurable('view', TRUE)
->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED);
$fields['status']->setDescription(t('A boolean indicating whether the Payment request is published.'));
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Created'))
->setDescription(t('The time that the entity was created.'));
$fields['changed'] = BaseFieldDefinition::create('changed')
->setLabel(t('Changed'))
->setDescription(t('The time that the entity was last edited.'));
$fields['correction_deadline'] = BaseFieldDefinition::create('timestamp')
->setLabel(t('Correction deadline'))
->setDescription(t('Deadline for submitting PR correction'))
->setDisplayConfigurable('view', TRUE);
return $fields;
}
/**
* Create add up field form definition.
*/
protected static function createAddUpFieldFromFieldDefinition(FieldDefinitionInterface $field_definition) {
return BaseFieldDefinition::create($field_definition->getType())
->setLabel($field_definition->getLabel() . ' ' . t('total'))
->setSettings($field_definition->getSettings())
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter