diff --git a/src/BondTransactionAccessControlHandler.php b/src/BondTransactionAccessControlHandler.php index 6923c0e1f91285c0421fc6393246b7dd96065ef3..ef8e14f4bd1f4c39b68c294651e0dbc670380564 100644 --- a/src/BondTransactionAccessControlHandler.php +++ b/src/BondTransactionAccessControlHandler.php @@ -31,6 +31,9 @@ class BondTransactionAccessControlHandler extends EntityAccessControlHandler { 'OR'); case 'delete': + if ($entity && $entity->get('state')->value !== 'cancel') { + return AccessResult::forbidden(); + } return AccessResult::allowedIfHasPermissions( $account, [ diff --git a/src/Entity/BondTransaction.php b/src/Entity/BondTransaction.php index fa44f64bc76425f6640f2a24ded4d9474aada23d..496e373e87b9eab04e38db0c435e6adf9bee9667 100644 --- a/src/Entity/BondTransaction.php +++ b/src/Entity/BondTransaction.php @@ -13,6 +13,7 @@ use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\user\UserInterface; use Drupal\shareholder_register\Entity\ShareTransactionGroupType; +use Drupal\shareholder_register_bonds\Exception\BondsIntegrityException; use Drupal\shareholder_register_bonds\BondTransactionInterface; /** @@ -69,6 +70,20 @@ class BondTransaction extends ContentEntityBase implements BondTransactionInterf $values += ['uid' => \Drupal::currentUser()->id()]; } + /** + * {@inheritdoc} + */ + public function delete() { + if ($this->getState() !== 'cancel') { + throw new BondsIntegrityException( + 'You cannot delete a valid bond transaction.', + BondsIntegrityException::DELETE_VALID_TRANSACTION); + } + else { + return parent::delete(); + } + } + /** * {@inheritdoc} */ diff --git a/src/Entity/ShareholderRegisterBond.php b/src/Entity/ShareholderRegisterBond.php index 099b61ace769e493875df1f28a11713d255240b8..e3e18d47cf336964670538b81606ece48146b053 100644 --- a/src/Entity/ShareholderRegisterBond.php +++ b/src/Entity/ShareholderRegisterBond.php @@ -7,6 +7,8 @@ use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\RevisionableContentEntityBase; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Field\FieldStorageDefinitionInterface; + +use Drupal\shareholder_register_bonds\Exception\BondsIntegrityException; use Drupal\shareholder_register_bonds\ShareholderRegisterBondInterface; /** @@ -64,6 +66,20 @@ class ShareholderRegisterBond extends RevisionableContentEntityBase implements S use EntityChangedTrait; + /** + * {@inheritdoc} + */ + public function delete() { + if ($this->getState() !== 'draft') { + throw new BondsIntegrityException( + 'You cannot delete an issued bond.', + BondsIntegrityException::DELETE_VALID_BOND); + } + else { + return parent::delete(); + } + } + /** * {@inheritdoc} */ diff --git a/src/Exception/BondTransactionException.php b/src/Exception/BondTransactionException.php index f6a1f302bb37928d483eeae5f660008ddd5f8a74..176e8fdd8062f541a040e86c85c9425beb92f051 100644 --- a/src/Exception/BondTransactionException.php +++ b/src/Exception/BondTransactionException.php @@ -8,4 +8,5 @@ use Drupal\shareholder_register\Exception\ShareholderRegisterException; * An exception class for Bond Transactions. */ class BondTransactionException extends ShareholderRegisterException { + } diff --git a/src/Exception/BondsIntegrityException.php b/src/Exception/BondsIntegrityException.php new file mode 100644 index 0000000000000000000000000000000000000000..d95f01defac679c63dabed0a1c39094609248aa1 --- /dev/null +++ b/src/Exception/BondsIntegrityException.php @@ -0,0 +1,30 @@ +<?php + +namespace Drupal\shareholder_register_bonds\Exception; + +use Drupal\shareholder_register\Exception\ShareholderRegisterException; + +/** + * An exception class for Bond integrity. + */ +class BondsIntegrityException extends ShareholderRegisterException { + + const DELETE_VALID_TRANSACTION = 1; + const DELETE_VALID_BOND = 2; + + /** + * {@inheritdoc} + */ + public function getUserMessage() { + switch ($this->getCode()) { + case DELETE_VALID_TRANSACTION: + return t('You cannot delete a valid transaction!'); + + case DELETE_VALID_BOND: + return t('You cannot delete an Issued bond!'); + + default: + return t('Shareholder Register Bonds Integrity Exception'); + } + } +} diff --git a/src/ShareholderRegisterBondAccessControlHandler.php b/src/ShareholderRegisterBondAccessControlHandler.php index 193783bd527bcc24333a9c1a2a33c18f33b6c602..086a68fa05ec7d10024ddc513c563f85b4187b68 100644 --- a/src/ShareholderRegisterBondAccessControlHandler.php +++ b/src/ShareholderRegisterBondAccessControlHandler.php @@ -28,6 +28,9 @@ class ShareholderRegisterBondAccessControlHandler extends EntityAccessControlHan ], 'OR'); case 'delete': + if ($entity && $entity->get('state')->value !== 'cancel') { + return AccessResult::forbidden(); + } return AccessResult::allowedIfHasPermissions($account, [ 'delete bond', 'administer bond', diff --git a/tests/src/Kernel/BondEntityCrudTest.php b/tests/src/Kernel/BondEntityCrudTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d31d4229bf477bd6fe735f45208f0ffc791da24c --- /dev/null +++ b/tests/src/Kernel/BondEntityCrudTest.php @@ -0,0 +1,95 @@ +<?php + +namespace Drupal\Tests\shareholder_register\Kernel; + +use Drupal\shareholder_register_bonds\Entity\ShareholderRegisterBond; +use Drupal\shareholder_register_bonds\Entity\ShareholderRegisterBondType; +use Drupal\shareholder_register_bonds\Entity\BondTransaction; + +use Drupal\shareholder_register_bonds\Exception\BondsIntegrityException; + +use Drupal\KernelTests\KernelTestBase; +use Drupal\Tests\shareholder_register\Traits\LoadRegisterTrait; + +/** + * Tests share transaction group. + * + * @group shareholder_register + */ +class BondEntityCrudTest extends KernelTestBase { + + use LoadRegisterTrait; + + /** + * Modules to enable. + * + * @var array + */ + protected static $modules = [ + 'system', + 'user', + 'file', + 'text', + 'datetime', + 'datetime_range', + 'simple_workflows', + 'shareholder_register', + 'shareholder_register_bonds', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + $this->traitSetUp(); + $this->installEntitySchema('shareholder_register_bond'); + $this->installEntitySchema('bond_transaction'); + + $this->type = ShareholderRegisterBondType::create( + [ + 'id' => 'default', + 'label' => 'Default', + ] + ); + $this->type->save(); + } + + /** + * Test bond validation. + */ + public function testDeleteValidBondAndTransaction() { + $register = $this->loadBasicRegister( + [ + 'shareholders' => [ + [ + 'number' => 1, + ], + ], + 'transactions' => [], + ]); + + $transaction = BondTransaction::create( + [ + 'shareholder_id' => $register['shareholder'], + 'par_value' => 100, + 'indenture' => 'yearly', + ] + ); + + $transaction->transitionValidate('2022-01-01'); + $bond_ids = $transaction->getBondIds(); + $bond_id = reset($bond_ids); + $bond = ShareholderRegisterBond::load($bond_id); + + $this->expectException(BondsIntegrityException::class); + $transaction->delete(); + $this->assertNotNull(BondTransaction::load($transaction->id())); + + $this->expectException(BondsIntegrityException::class); + $bond->delete(); + $this->assertNotNull(ShareholderRegisterBond::load($bond->id())); + + } + +}