2018-04-29 11:58:46 +00:00
< ? php
2021-02-18 12:02:25 +00:00
namespace Drupal\opencase_cases\Entity ;
2018-04-29 11:58:46 +00:00
2022-06-07 12:07:18 +00:00
use Drupal\Core\Entity\ContentEntityBase ;
2018-04-29 11:58:46 +00:00
use Drupal\Core\Entity\EntityStorageInterface ;
use Drupal\Core\Field\BaseFieldDefinition ;
use Drupal\Core\Entity\RevisionableContentEntityBase ;
use Drupal\Core\Entity\RevisionableInterface ;
use Drupal\Core\Entity\EntityChangedTrait ;
use Drupal\Core\Entity\EntityTypeInterface ;
2022-06-07 13:22:33 +00:00
use Drupal\Core\Entity\EntityTypeManager ;
2018-04-29 11:58:46 +00:00
use Drupal\user\UserInterface ;
/**
* Defines the Case entity .
*
2021-02-18 12:02:25 +00:00
* @ ingroup opencase_cases
2018-04-29 11:58:46 +00:00
*
* @ ContentEntityType (
* id = " oc_case " ,
* label = @ Translation ( " Case " ),
* bundle_label = @ Translation ( " Case type " ),
* handlers = {
2021-02-18 12:02:25 +00:00
* " storage " = " Drupal \ opencase_cases \ OCCaseStorage " ,
2018-04-29 11:58:46 +00:00
* " view_builder " = " Drupal \ Core \ Entity \ EntityViewBuilder " ,
2021-02-18 12:02:25 +00:00
* " list_builder " = " Drupal \ opencase_cases \ OCCaseListBuilder " ,
* " views_data " = " Drupal \ opencase_cases \ Entity \ OCCaseViewsData " ,
* " translation " = " Drupal \ opencase_cases \ OCCaseTranslationHandler " ,
2018-04-29 11:58:46 +00:00
*
* " form " = {
2021-02-18 12:02:25 +00:00
* " default " = " Drupal \ opencase_cases \ Form \ OCCaseForm " ,
* " add " = " Drupal \ opencase_cases \ Form \ OCCaseForm " ,
* " edit " = " Drupal \ opencase_cases \ Form \ OCCaseForm " ,
* " delete " = " Drupal \ opencase_cases \ Form \ OCCaseDeleteForm " ,
2018-04-29 11:58:46 +00:00
* },
2021-02-18 12:02:25 +00:00
* " access " = " Drupal \ opencase_cases \ OCCaseAccessControlHandler " ,
2018-04-29 11:58:46 +00:00
* " route_provider " = {
2021-02-18 12:02:25 +00:00
* " html " = " Drupal \ opencase_cases \ OCCaseHtmlRouteProvider " ,
2018-04-29 11:58:46 +00:00
* },
* },
* base_table = " oc_case " ,
* data_table = " oc_case_field_data " ,
* revision_table = " oc_case_revision " ,
* revision_data_table = " oc_case_field_revision " ,
2021-10-23 17:18:41 +00:00
* revision_metadata_keys = {
* " revision_user " = " revision_user " ,
* " revision_created " = " revision_created " ,
* " revision_log_message " = " revision_log "
* },
2018-04-29 11:58:46 +00:00
* translatable = TRUE ,
* admin_permission = " administer case entities " ,
* entity_keys = {
* " id " = " id " ,
* " revision " = " vid " ,
* " bundle " = " type " ,
* " label " = " name " ,
* " uuid " = " uuid " ,
* " uid " = " user_id " ,
* " langcode " = " langcode " ,
* " status " = " status " ,
* },
* links = {
2018-04-29 13:23:15 +00:00
* " canonical " = " /opencase/oc_case/ { oc_case} " ,
* " add-page " = " /opencase/oc_case/add " ,
* " add-form " = " /opencase/oc_case/add/ { oc_case_type} " ,
* " edit-form " = " /opencase/oc_case/ { oc_case}/edit " ,
* " delete-form " = " /opencase/oc_case/ { oc_case}/delete " ,
* " version-history " = " /opencase/oc_case/ { oc_case}/revisions " ,
* " revision " = " /opencase/oc_case/ { oc_case}/revisions/ { oc_case_revision}/view " ,
* " revision_revert " = " /opencase/oc_case/ { oc_case}/revisions/ { oc_case_revision}/revert " ,
* " revision_delete " = " /opencase/oc_case/ { oc_case}/revisions/ { oc_case_revision}/delete " ,
* " translation_revert " = " /opencase/oc_case/ { oc_case}/revisions/ { oc_case_revision}/revert/ { langcode} " ,
* " collection " = " /opencase/oc_case " ,
2018-04-29 11:58:46 +00:00
* },
* bundle_entity_type = " oc_case_type " ,
* field_ui_base_route = " entity.oc_case_type.edit_form "
* )
*/
2022-04-17 09:52:26 +00:00
class OCCase extends RevisionableContentEntityBase implements OCCaseInterface
{
2018-04-29 11:58:46 +00:00
2018-04-30 15:14:51 +00:00
use EntityChangedTrait ;
2018-04-30 13:45:34 +00:00
2018-04-29 11:58:46 +00:00
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public static function preCreate ( EntityStorageInterface $storage_controller , array & $values )
{
2018-04-29 11:58:46 +00:00
parent :: preCreate ( $storage_controller , $values );
$values += [
'user_id' => \Drupal :: currentUser () -> id (),
];
}
2022-06-07 13:22:33 +00:00
public function getCaseProvisionIds ( EntityTypeManager $etm ) : array {
$query = \Drupal :: entityTypeManager () -> getStorage ( 'oc_case_provision' ) -> getQuery ();
$query -> condition ( 'oc_case.target_id' , $this -> id ());
return $query -> execute ();
2022-06-07 12:54:19 +00:00
}
2022-05-18 12:40:03 +00:00
public function deleteCaseProvisions () : void {
2022-05-18 12:54:06 +00:00
$this -> deleteChildren ( 'oc_case_provision' );
}
public function deleteActivities () : void {
$this -> deleteChildren ( 'oc_activity' );
}
2022-06-07 12:54:19 +00:00
private function deleteChildren ( $child_entity_type ) : void {
2022-05-18 12:54:06 +00:00
$query = \Drupal :: entityQuery ( $child_entity_type )
2022-05-18 12:40:03 +00:00
-> condition ( 'oc_case.target_id' , $this -> id ());
$ids = $query -> execute ();
foreach ( $ids as $id ) {
2022-05-18 12:54:06 +00:00
\Drupal :: entityTypeManager ()
-> getStorage ( $child_entity_type )
-> load ( $id ) -> delete ();
2022-05-18 12:40:03 +00:00
}
}
2022-04-17 09:52:26 +00:00
public static function defaultTarget ()
{
2022-04-03 16:31:00 +00:00
if ( opencase_entities_get ( 'target_id' )) return [ opencase_entities_get ( 'target_id' )];
else return [];
}
2022-06-07 12:07:18 +00:00
public function getTargetEntity () : ContentEntityBase {
if ( ! $this -> oc_target -> isEmpty ()) {
return $this -> oc_target -> entity ;
} elseif ( $this -> hasField ( 'client' ) && ! $this -> client -> isEmpty ()) {
return $this -> client -> entity ;
} else {
throw new \Exception ( 'No target found on case' );
}
}
2018-04-29 11:58:46 +00:00
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
protected function urlRouteParameters ( $rel )
{
2018-04-29 11:58:46 +00:00
$uri_route_parameters = parent :: urlRouteParameters ( $rel );
if ( $rel === 'revision_revert' && $this instanceof RevisionableInterface ) {
$uri_route_parameters [ $this -> getEntityTypeId () . '_revision' ] = $this -> getRevisionId ();
2022-04-17 09:52:26 +00:00
} elseif ( $rel === 'revision_delete' && $this instanceof RevisionableInterface ) {
2018-04-29 11:58:46 +00:00
$uri_route_parameters [ $this -> getEntityTypeId () . '_revision' ] = $this -> getRevisionId ();
}
return $uri_route_parameters ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function preSave ( EntityStorageInterface $storage )
{
2018-04-29 11:58:46 +00:00
parent :: preSave ( $storage );
foreach ( array_keys ( $this -> getTranslationLanguages ()) as $langcode ) {
$translation = $this -> getTranslation ( $langcode );
// If no owner has been set explicitly, make the anonymous user the owner.
if ( ! $translation -> getOwner ()) {
$translation -> setOwnerId ( 0 );
}
}
// If no revision author has been set explicitly, make the oc_case owner the
// revision author.
if ( ! $this -> getRevisionUser ()) {
$this -> setRevisionUserId ( $this -> getOwnerId ());
}
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function getName ()
{
2018-04-29 11:58:46 +00:00
return $this -> get ( 'name' ) -> value ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function setName ( $name )
{
2018-04-29 11:58:46 +00:00
$this -> set ( 'name' , $name );
return $this ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function getCreatedTime ()
{
2018-04-29 11:58:46 +00:00
return $this -> get ( 'created' ) -> value ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function setCreatedTime ( $timestamp )
{
2018-04-29 11:58:46 +00:00
$this -> set ( 'created' , $timestamp );
return $this ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function getOwner ()
{
2018-04-29 11:58:46 +00:00
return $this -> get ( 'user_id' ) -> entity ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function getOwnerId ()
{
2018-04-29 11:58:46 +00:00
return $this -> get ( 'user_id' ) -> target_id ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function setOwnerId ( $uid )
{
2018-04-29 11:58:46 +00:00
$this -> set ( 'user_id' , $uid );
return $this ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function setOwner ( UserInterface $account )
{
2018-04-29 11:58:46 +00:00
$this -> set ( 'user_id' , $account -> id ());
return $this ;
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function isPublished ()
{
return ( bool ) $this -> getEntityKey ( 'status' );
2018-04-29 11:58:46 +00:00
}
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public function setPublished ( $published )
{
2018-04-29 11:58:46 +00:00
$this -> set ( 'status' , $published ? TRUE : FALSE );
return $this ;
}
2022-04-21 11:11:56 +00:00
public function addToTotalFee ( float $amountToAdd ) : void {
$this -> set ( 'total_fee' , $this -> total_fee -> value + $amountToAdd );
$this -> save ();
}
2022-04-03 16:31:00 +00:00
2018-04-29 11:58:46 +00:00
/**
* { @ inheritdoc }
*/
2022-04-17 09:52:26 +00:00
public static function baseFieldDefinitions ( EntityTypeInterface $entity_type )
{
2018-04-29 11:58:46 +00:00
$fields = parent :: baseFieldDefinitions ( $entity_type );
2018-05-07 12:49:31 +00:00
// not currently used. Will add form and view settings when ready
$fields [ 'status' ] = BaseFieldDefinition :: create ( 'boolean' )
2021-12-10 09:45:22 +00:00
-> setLabel ( t ( 'Visible' ))
2021-09-13 13:31:12 +00:00
-> setDescription ( 'If this box is not ticked this record will be hidden from view for most users. Users with access to unpublished entities will be able to restore it if needed.' )
2018-05-07 12:49:31 +00:00
-> setRevisionable ( TRUE )
2022-04-17 09:52:26 +00:00
-> setDisplayConfigurable ( 'form' , true )
-> setDisplayConfigurable ( 'view' , true )
2018-05-07 12:49:31 +00:00
-> setDefaultValue ( TRUE );
2018-04-29 11:58:46 +00:00
$fields [ 'user_id' ] = BaseFieldDefinition :: create ( 'entity_reference' )
2020-05-13 14:41:59 +00:00
-> setLabel ( t ( 'Created by' ))
2018-04-29 11:58:46 +00:00
-> setDescription ( t ( 'The user ID of author of the Case entity.' ))
-> setRevisionable ( TRUE )
-> setSetting ( 'target_type' , 'user' )
-> setSetting ( 'handler' , 'default' )
-> setTranslatable ( TRUE )
2021-08-26 20:41:36 +00:00
-> setDisplayConfigurable ( 'form' , true )
2022-04-17 09:52:26 +00:00
-> setDisplayConfigurable ( 'view' , true );
2022-04-03 16:31:00 +00:00
$fields [ 'oc_target' ] = BaseFieldDefinition :: create ( 'entity_reference' )
2022-04-17 09:52:26 +00:00
-> setLabel ( t ( 'Target' ))
-> setRevisionable ( TRUE )
-> setSetting ( 'target_type' , 'oc_actor' )
-> setSetting ( 'handler' , 'default' )
-> setDefaultValueCallback ( '\Drupal\opencase_cases\Entity\OCCase::defaultTarget' )
-> setDisplayConfigurable ( 'form' , true )
-> setDisplayConfigurable ( 'view' , true );
2022-04-03 16:31:00 +00:00
2018-04-29 11:58:46 +00:00
$fields [ 'name' ] = BaseFieldDefinition :: create ( 'string' )
2020-11-17 10:47:24 +00:00
-> setLabel ( t ( 'Title' ))
2018-04-29 11:58:46 +00:00
-> setRevisionable ( TRUE )
-> setSettings ([
2021-11-27 11:25:41 +00:00
'max_length' => 120 ,
2018-04-29 11:58:46 +00:00
'text_processing' => 0 ,
])
-> setDefaultValue ( '' )
2022-04-17 09:52:26 +00:00
-> setDisplayConfigurable ( 'form' , true )
-> setDisplayConfigurable ( 'view' , true )
2018-04-29 11:58:46 +00:00
-> setRequired ( TRUE );
2018-04-30 10:59:07 +00:00
2018-05-07 13:04:01 +00:00
$fields [ 'files' ] = BaseFieldDefinition :: create ( 'file' )
-> setLabel ( t ( 'Files' ))
-> setDescription ( t ( 'Files attached to this case' ))
-> setSetting ( 'file_directory' , '[date:custom:Y]-[date:custom:m]' )
-> setSetting ( 'handler' , 'default:file' )
-> setSetting ( 'file_extensions' , 'txt jpg jpeg gif rtf xls xlsx doc swf png pdf docx csv' )
-> setSetting ( 'description_field' , 'true' )
2018-05-28 13:11:06 +00:00
-> setSetting ( 'uri_scheme' , 'private' )
2018-05-07 13:04:01 +00:00
-> setCardinality ( - 1 )
2021-08-26 20:41:36 +00:00
-> setDisplayConfigurable ( 'form' , true )
2022-04-17 09:52:26 +00:00
-> setDisplayConfigurable ( 'view' , true );
2018-04-29 11:58:46 +00:00
$fields [ 'created' ] = BaseFieldDefinition :: create ( 'created' )
2020-05-13 14:41:59 +00:00
-> setLabel ( t ( 'Created on' ))
-> setDescription ( t ( 'When the case was created.' ))
2021-12-05 19:16:39 +00:00
-> setDisplayConfigurable ( 'view' , true );
2018-04-29 11:58:46 +00:00
$fields [ 'changed' ] = BaseFieldDefinition :: create ( 'changed' )
2020-05-13 14:41:59 +00:00
-> setLabel ( t ( 'Last updated' ))
-> setDescription ( t ( 'When the case was last edited.' ))
2021-12-05 19:16:39 +00:00
-> setDisplayConfigurable ( 'view' , true );
2018-04-29 11:58:46 +00:00
$fields [ 'revision_translation_affected' ] = BaseFieldDefinition :: create ( 'boolean' )
-> setLabel ( t ( 'Revision translation affected' ))
-> setDescription ( t ( 'Indicates if the last edit of a translation belongs to current revision.' ))
-> setReadOnly ( TRUE )
-> setRevisionable ( TRUE )
-> setTranslatable ( TRUE );
2021-11-11 15:27:25 +00:00
$fields [ 'notes' ] = BaseFieldDefinition :: create ( 'string_long' )
-> setRevisionable ( TRUE )
-> setLabel ( t ( 'Notes' ))
-> setSettings ( array (
'default_value' => '' ,
'max_length' => 255 ,
'text_processing' => 0 ,
))
-> setDisplayConfigurable ( 'form' , true )
-> setDisplayConfigurable ( 'view' , true );
2021-11-12 09:11:00 +00:00
$fields [ 'total_fee' ] = BaseFieldDefinition :: create ( 'decimal' )
2022-04-17 09:52:26 +00:00
-> setLabel ( t ( 'Total Fee' ))
-> setRevisionable ( TRUE )
-> setSettings ([
'prefix' => '£' ,
])
-> setDisplayConfigurable ( 'view' , true );
2021-11-12 09:11:00 +00:00
2018-04-29 11:58:46 +00:00
return $fields ;
}
}