phone/email is invalid fields

This commit is contained in:
Yuri Kuznetsov
2022-11-25 18:05:40 +02:00
parent e6dc5dd12b
commit ae643c5a28
9 changed files with 272 additions and 28 deletions
@@ -145,14 +145,31 @@ class Saver implements SaverInterface
$entity->hasFetched('emailAddressIsOptedOut') &&
$entity->get('emailAddressIsOptedOut') !== $entity->getFetched('emailAddressIsOptedOut')
)
)
) &&
$emailAddressValue
) {
if ($emailAddressValue) {
$key = strtolower($emailAddressValue);
$key = strtolower($emailAddressValue);
if ($key && isset($hash->$key)) {
$hash->{$key}['optOut'] = $entity->get('emailAddressIsOptedOut');
}
if ($key && isset($hash->$key)) {
$hash->{$key}['optOut'] = $entity->get('emailAddressIsOptedOut');
}
}
if (
$entity->has('emailAddressIsInvalid') &&
(
$entity->isNew() ||
(
$entity->hasFetched('emailAddressIsInvalid') &&
$entity->get('emailAddressIsInvalid') !== $entity->getFetched('emailAddressIsInvalid')
)
) &&
$emailAddressValue
) {
$key = strtolower($emailAddressValue);
if ($key && isset($hash->$key)) {
$hash->{$key}['invalid'] = $entity->get('emailAddressIsInvalid');
}
}
@@ -421,6 +438,19 @@ class Saver implements SaverInterface
$this->markAddressOptedOut($emailAddressValue, (bool) $entity->get('emailAddressIsOptedOut'));
}
if (
$entity->has('emailAddressIsInvalid') &&
(
$entity->isNew() ||
(
$entity->hasFetched('emailAddressIsInvalid') &&
$entity->get('emailAddressIsInvalid') !== $entity->getFetched('emailAddressIsInvalid')
)
)
) {
$this->markAddressInvalid($emailAddressValue, (bool) $entity->get('emailAddressIsInvalid'));
}
return;
}
@@ -444,6 +474,10 @@ class Saver implements SaverInterface
$emailAddressNew->set('optOut', (bool) $entity->get('emailAddressIsOptedOut'));
}
if ($entity->has('emailAddressIsInvalid')) {
$emailAddressNew->set('invalid', (bool) $entity->get('emailAddressIsInvalid'));
}
$this->entityManager->saveEntity($emailAddressNew);
$isNewEmailAddress = true;
@@ -469,6 +503,10 @@ class Saver implements SaverInterface
$this->markAddressOptedOut($emailAddressValue, (bool) $entity->get('emailAddressIsOptedOut'));
}
if ($entity->has('emailAddressIsInvalid')) {
$this->markAddressInvalid($emailAddressValue, (bool) $entity->get('emailAddressIsInvalid'));
}
$updateQuery = $this->entityManager
->getQueryBuilder()
->update()
@@ -500,6 +538,14 @@ class Saver implements SaverInterface
$repository->markAddressOptedOut($address, $isOptedOut);
}
private function markAddressInvalid(string $address, bool $isInvalid = true): void
{
/** @var EmailAddressRepository $repository */
$repository = $this->entityManager->getRepository(EmailAddress::ENTITY_TYPE);
$repository->markAddressInvalid($address, $isInvalid);
}
private function checkChangeIsForbidden(EmailAddress $emailAddress, Entity $entity): bool
{
if (!$this->applicationState->hasUser()) {
@@ -150,24 +150,36 @@ class Saver implements SaverInterface
}
if (
$entity->has('phoneNumberIsOptedOut')
&&
(
$entity->isNew()
||
$entity->has('phoneNumberIsOptedOut') && (
$entity->isNew() ||
(
$entity->hasFetched('phoneNumberIsOptedOut')
&&
$entity->hasFetched('phoneNumberIsOptedOut') &&
$entity->get('phoneNumberIsOptedOut') !== $entity->getFetched('phoneNumberIsOptedOut')
)
)
) &&
$phoneNumberValue
) {
if ($phoneNumberValue) {
$key = $phoneNumberValue;
$key = $phoneNumberValue;
if (isset($hash->$key)) {
$hash->{$key}['optOut'] = $entity->get('phoneNumberIsOptedOut');
}
if (isset($hash->$key)) {
$hash->{$key}['optOut'] = $entity->get('phoneNumberIsOptedOut');
}
}
if (
$entity->has('phoneNumberIsInvalid') && (
$entity->isNew() ||
(
$entity->hasFetched('phoneNumberIsInvalid') &&
$entity->get('phoneNumberIsInvalid') !== $entity->getFetched('phoneNumberIsInvalid')
)
) &&
$phoneNumberValue
) {
$key = $phoneNumberValue;
if (isset($hash->$key)) {
$hash->{$key}['invalid'] = $entity->get('phoneNumberIsInvalid');
}
}
@@ -423,6 +435,10 @@ class Saver implements SaverInterface
$phoneNumberNew->set('optOut', (bool) $entity->get('phoneNumberIsOptedOut'));
}
if ($entity->has('phoneNumberIsInvalid')) {
$phoneNumberNew->set('invalid', (bool) $entity->get('phoneNumberIsInvalid'));
}
$defaultType = $this->metadata
->get('entityDefs.' . $entity->getEntityType() . '.fields.phoneNumber.defaultType');
@@ -453,6 +469,10 @@ class Saver implements SaverInterface
$this->markNumberOptedOut($phoneNumberValue, (bool) $entity->get('phoneNumberIsOptedOut'));
}
if ($entity->has('phoneNumberIsInvalid')) {
$this->markNumberInvalid($phoneNumberValue, (bool) $entity->get('phoneNumberIsInvalid'));
}
$update = $this->entityManager
->getQueryBuilder()
->update()
@@ -472,21 +492,29 @@ class Saver implements SaverInterface
}
if (
$entity->has('phoneNumberIsOptedOut')
&&
$entity->has('phoneNumberIsOptedOut') &&
(
$entity->isNew()
||
$entity->isNew() ||
(
$entity->hasFetched('phoneNumberIsOptedOut')
&&
$entity->hasFetched('phoneNumberIsOptedOut') &&
$entity->get('phoneNumberIsOptedOut') !== $entity->getFetched('phoneNumberIsOptedOut')
)
)
) {
$this->markNumberOptedOut($phoneNumberValue, (bool) $entity->get('phoneNumberIsOptedOut'));
}
return;
if (
$entity->has('phoneNumberIsInvalid') &&
(
$entity->isNew() ||
(
$entity->hasFetched('phoneNumberIsInvalid') &&
$entity->get('phoneNumberIsInvalid') !== $entity->getFetched('phoneNumberIsInvalid')
)
)
) {
$this->markNumberInvalid($phoneNumberValue, (bool) $entity->get('phoneNumberIsInvalid'));
}
return;
@@ -521,6 +549,14 @@ class Saver implements SaverInterface
$repository->markNumberOptedOut($number, $isOptedOut);
}
private function markNumberInvalid(string $number, bool $isInvalid = true): void
{
/** @var PhoneNumberRepository $repository */
$repository = $this->entityManager->getRepository(PhoneNumber::ENTITY_TYPE);
$repository->markNumberInvalid($number, $isInvalid);
}
private function checkChangeIsForbidden(PhoneNumber $phoneNumber, Entity $entity): bool
{
if (!$this->applicationState->hasUser()) {
@@ -233,6 +233,61 @@ class Email extends Base
'additionalSelect' => ['emailAddresses.optOut'],
],
],
$fieldName .'IsInvalid' => [
'type' => 'bool',
'notStorable' => true,
'select' => [
'select' => "emailAddresses.invalid",
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
],
'selectForeign' => [
'select' => "{$foreignJoinAlias}.invalid",
'leftJoins' => [
[
'EntityEmailAddress',
$foreignJoinMiddleAlias,
[
"{$foreignJoinMiddleAlias}.entityId:" => "{alias}.id",
"{$foreignJoinMiddleAlias}.primary" => 1,
"{$foreignJoinMiddleAlias}.deleted" => 0,
]
],
[
'EmailAddress',
$foreignJoinAlias,
[
"{$foreignJoinAlias}.id:" => "{$foreignJoinMiddleAlias}.emailAddressId",
"{$foreignJoinAlias}.deleted" => 0,
]
]
],
],
'where' => [
'= TRUE' => [
'whereClause' => [
['emailAddresses.invalid=' => true],
['emailAddresses.invalid!=' => null],
],
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
],
'= FALSE' => [
'whereClause' => [
'OR' => [
['emailAddresses.invalid=' => false],
['emailAddresses.invalid=' => null],
]
],
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
]
],
'order' => [
'order' => [
['emailAddresses.invalid', '{direction}'],
],
'leftJoins' => [['emailAddresses', 'emailAddresses', ['primary' => 1]]],
'additionalSelect' => ['emailAddresses.invalid'],
],
],
],
'relations' => [
'emailAddresses' => [
@@ -329,6 +329,61 @@ class Phone extends Base
'additionalSelect' => ['phoneNumbers.optOut'],
],
],
$fieldName .'IsInvalid' => [
'type' => 'bool',
'notStorable' => true,
'select' => [
'select' => 'phoneNumbers.invalid',
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
],
'selectForeign' => [
'select' => "{$foreignJoinAlias}.invalid",
'leftJoins' => [
[
'EntityPhoneNumber',
$foreignJoinMiddleAlias,
[
"{$foreignJoinMiddleAlias}.entityId:" => "{alias}.id",
"{$foreignJoinMiddleAlias}.primary" => 1,
"{$foreignJoinMiddleAlias}.deleted" => 0,
]
],
[
'PhoneNumber',
$foreignJoinAlias,
[
"{$foreignJoinAlias}.id:" => "{$foreignJoinMiddleAlias}.phoneNumberId",
"{$foreignJoinAlias}.deleted" => 0,
]
]
],
],
'where' => [
'= TRUE' => [
'whereClause' => [
['phoneNumbers.invalid=' => true],
['phoneNumbers.invalid!=' => null],
],
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
],
'= FALSE' => [
'whereClause' => [
'OR' => [
['phoneNumbers.invalid=' => false],
['phoneNumbers.invalid=' => null],
]
],
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
]
],
'order' => [
'order' => [
['phoneNumbers.invalid', '{direction}'],
],
'leftJoins' => [['phoneNumbers', 'phoneNumbers', ['primary' => 1]]],
'additionalSelect' => ['phoneNumbers.invalid'],
],
],
$fieldName . 'Numeric' => $numbericFieldDefs,
],
'relations' => [
@@ -376,4 +376,17 @@ class EmailAddress extends \Espo\Core\Repositories\Database implements
$this->save($emailAddress);
}
public function markAddressInvalid(string $address, bool $isInvalid = true): void
{
$emailAddress = $this->getByAddress($address);
if (!$emailAddress) {
return;
}
$emailAddress->set('invalid', $isInvalid);
$this->save($emailAddress);
}
}
@@ -280,4 +280,17 @@ class PhoneNumber extends Database implements
$this->save($phoneNumber);
}
public function markNumberInvalid(string $number, bool $isInvalid = true): void
{
$phoneNumber = $this->getByNumber($number);
if (!$phoneNumber) {
return;
}
$phoneNumber->set('invalid', $isInvalid);
$this->save($phoneNumber);
}
}
@@ -403,6 +403,7 @@
"emailAddress": "Email",
"emailAddressData": "Email Address Data",
"emailAddressIsOptedOut": "Email Address is Opted-Out",
"emailAddressIsInvalid": "Email Address is Invalid",
"assignedUserName": "Assigned User Name",
"teams": "Teams",
"createdAt": "Created At",
@@ -419,6 +420,7 @@
"phoneNumberOther": "Phone (Other)",
"phoneNumberData": "Phone Number Data",
"phoneNumberIsOptedOut": "Phone Number is Opted-Out",
"phoneNumberIsInvalid": "Phone Number is Invalid",
"order": "Order",
"parent": "Parent",
"children": "Children",
@@ -12,6 +12,7 @@
],
"actualFields": [
"isOptedOut",
"isInvalid",
"",
"data"
],
@@ -24,7 +25,18 @@
"layoutDefaultSidePanelDisabled": true,
"mergeDisabled": true,
"customizationDefaultDisabled": true,
"customizationReadOnlyDisabled": true
"customizationReadOnlyDisabled": true,
"customizationInlineEditDisabledDisabled": true
},
"isInvalid": {
"type": "bool",
"notStorable": true,
"layoutDetailDisabled": true,
"layoutDefaultSidePanelDisabled": true,
"mergeDisabled": true,
"customizationDefaultDisabled": true,
"customizationReadOnlyDisabled": true,
"customizationInlineEditDisabledDisabled": true
}
},
"validationList": [
@@ -30,6 +30,7 @@
],
"actualFields": [
"isOptedOut",
"isInvalid",
"",
"data"
],
@@ -42,7 +43,18 @@
"layoutDefaultSidePanelDisabled": true,
"mergeDisabled": true,
"customizationDefaultDisabled": true,
"customizationReadOnlyDisabled": true
"customizationReadOnlyDisabled": true,
"customizationInlineEditDisabledDisabled": true
},
"isInvalid": {
"type": "bool",
"notStorable": true,
"layoutDetailDisabled": true,
"layoutDefaultSidePanelDisabled": true,
"mergeDisabled": true,
"customizationDefaultDisabled": true,
"customizationReadOnlyDisabled": true,
"customizationInlineEditDisabledDisabled": true
}
},
"validationList": [