/** 
  * Generate a set of suggestions for the given bank transaction
  * 
  * @return array(match structures)
  */
 public function match(CRM_Banking_BAO_BankTransaction $btx, CRM_Banking_Matcher_Context $context)
 {
     // this section will be refactored to use different conditions, but for now, this is hardcoded
     $suggestion = new CRM_Banking_Matcher_Suggestion($this, $btx);
     $config = $this->_plugin_config;
     $threshold = $this->getThreshold();
     $penalty = $this->getPenalty($btx);
     if (isset($config->ignore)) {
         // iterate through the ignore list
         foreach ($config->ignore as $ignore_record) {
             if ($this->matches_pattern($ignore_record, $btx, $context)) {
                 $ignore_this = TRUE;
                 // this $btx is to be ignored, but check if it happens to be on the "don't ignore" list
                 foreach ($config->dont_ignore as $dont_ignore_record) {
                     if ($this->matches_pattern($dont_ignore_record, $btx, $context)) {
                         // ok, this should not be ignored after all...
                         $ignore_this = FALSE;
                         break;
                         // doesn't matter why it should not be ignored
                     }
                 }
                 if ($ignore_this) {
                     if (isset($ignore_record->precision)) {
                         $probability = $ignore_record->precision;
                     } else {
                         $probability = 1.0;
                     }
                     $probability -= $penalty;
                     $suggestion->addEvidence($probability, $ignore_record->message);
                 }
             }
         }
     }
     if ($suggestion->getProbability() >= $threshold) {
         $btx->addSuggestion($suggestion);
     }
     // that's it...
     return empty($this->_suggestions) ? null : $this->_suggestions;
 }
 public function match(CRM_Banking_BAO_BankTransaction $btx, CRM_Banking_Matcher_Context $context)
 {
     // this section will be refactored to use different conditions, but for now, this is hardcoded
     $suggestion = new CRM_Banking_Matcher_Suggestion($this, $btx);
     $config = $this->_plugin_config;
     // amount range
     if (isset($config->amount)) {
         $camount = $config->amount;
         $low = $camount->low;
         $high = $camount->high;
         $factor = $camount->prob or 1;
         $amount = $btx->amount;
         if ($low == null || $amount >= $low) {
             if ($high == null || $amount <= $high) {
                 $message = ts('the transaction amount is in the range [ ');
                 if ($low) {
                     $message .= number_format($low, 2);
                 }
                 $message .= ' - ';
                 if ($high) {
                     $message .= number_format($high, 2);
                 }
                 $message .= ' ]';
                 $suggestion->addEvidence($factor, $message);
             }
         }
     }
     // date range
     if (isset($config->value_date)) {
         $cvdate = $config->value_date;
         $early = $cvdate->early;
         $late = $cvdate->late;
         $factor = $cvdate->prob or 1;
         $value_date = strtotime($btx->value_date);
         if ($early != '' && $value_date >= strtotime($early)) {
             if ($late != '' && $value_date <= strtotime($late)) {
                 $message = ts('the transaction value date is in the range [ ');
                 if ($early) {
                     $message .= $early;
                 }
                 $message .= ' - ';
                 if ($late) {
                     $message .= $late;
                 }
                 $message .= ' ]';
                 $suggestion->addEvidence($factor, $message);
             }
         }
     }
     // regex
     if (isset($config->purpose)) {
         $cpurp = $config->purpose;
         $regex = $cpurp->regex;
         $factor = $cpurp->prob or 1;
         $parsed = json_decode($btx->data_parsed, true);
         $purpose = $parsed['purpose'];
         if ($regex != '' && preg_match("/{$regex}/", $purpose)) {
             $message = sprintf(ts('the transaction purpose matches the expression "%s"'), htmlentities($regex));
             $suggestion->addEvidence($factor, $message);
         }
     }
     if ($suggestion->getProbability() > 0) {
         $btx->addSuggestion($suggestion);
     }
     // close up
     return empty($this->_suggestions) ? null : $this->_suggestions;
 }