*/ class Opportunity extends Database { public function beforeSave(Entity $entity, array $options = []) { $this->processProbability($entity); $this->processLastStage($entity); parent::beforeSave($entity, $options); } public function afterSave(Entity $entity, array $options = []) { parent::afterSave($entity, $options); if ($entity->isAttributeChanged('amount') || $entity->isAttributeChanged('probability')) { $amountConverted = $entity->get('amountConverted'); $probability = $entity->get('probability'); $amountWeightedConverted = round($amountConverted * $probability / 100, 2); $entity->set('amountWeightedConverted', $amountWeightedConverted); } $this->handleAfterSaveContacts($entity); } protected function handleAfterSaveContacts(OpportunityEntity $entity): void { if (!$entity->isAttributeChanged('contactId')) { return; } $contactId = $entity->get('contactId'); $contactIdList = $entity->get('contactsIds') ?? []; $fetchedContactId = $entity->getFetched('contactId'); if (!$contactId) { if ($fetchedContactId) { $this->unrelate($entity, 'contacts', $fetchedContactId); } return; } if (!in_array($contactId, $contactIdList) && !$this->isRelated($entity, 'contacts', $contactId)) { $this->relate($entity, 'contacts', $contactId); } } private function processProbability(OpportunityEntity $entity): void { if (!$entity->isNew()) { return; } if ($entity->has('probability')) { return; } if (!$entity->getStage()) { return; } $probability = $this->metadata ->get('entityDefs.Opportunity.fields.stage.probabilityMap.' . $entity->getStage()) ?? 0; if ($probability === null) { return; } $entity->setProbability($probability); } private function processLastStage(OpportunityEntity $entity): void { if ( $entity->isAttributeChanged('lastStage') || !$entity->isAttributeChanged('stage') ) { return; } $probability = $this->metadata ->get(['entityDefs', 'Opportunity', 'fields', 'stage', 'probabilityMap', $entity->getStage() ?? '']) ?? 0; if ($probability) { $entity->set('lastStage', $entity->getStage()); return; } $probabilityMap = $this->metadata ->get(['entityDefs', 'Opportunity', 'fields', 'stage', 'probabilityMap']) ?? []; $stageList = $this->metadata->get(['entityDefs', 'Opportunity', 'fields', 'stage', 'options']) ?? []; if (!count($stageList)) { return; } if ($entity->isNew()) { // Created as Lost. $min = 100; $minStage = null; foreach ($stageList as $stage) { $itemProbability = $probabilityMap[$stage] ?? null; if ( $itemProbability === null || $itemProbability === 100 || $itemProbability === 0 || $itemProbability >= $min ) { continue; } $min = $itemProbability; $minStage = $stage; } if (!$minStage) { return; } $entity->set('lastStage', $minStage); return; } // Won changed to Lost. if (!$entity->getLastStage()) { return; } $lastStageProbability = $this->metadata ->get(['entityDefs', 'Opportunity', 'fields', 'stage', 'probabilityMap', $entity->getLastStage()]) ?? 0; if ($lastStageProbability !== 100) { return; } $max = 0; $maxStage = null; foreach ($stageList as $stage) { $itemProbability = $probabilityMap[$stage] ?? null; if ( $itemProbability === null || $itemProbability === 100 || $itemProbability === 0 || $itemProbability <= $max ) { continue; } $max = $itemProbability; $maxStage = $stage; } if (!$maxStage) { return; } $entity->set('lastStage', $maxStage); } }