+ /**
+ * Return list of activity statuses that are considered "completed".
+ *
+ * Note: activity status options use the "grouping" field to distinguish complete from incomplete statuses.
+ *
+ * @return array
+ */
+ public static function getCompletedStatuses() {
+ if (!isset(Civi::$statics[__CLASS__][__FUNCTION__])) {
+ $statuses = civicrm_api3('OptionValue', 'get', array(
+ 'option_group_id' => "activity_status",
+ 'filter' => 1,
+ 'return' => array('value'),
+ 'sequential' => 1,
+ 'options' => array('limit' => 0),
+ ));
+ Civi::$statics[__CLASS__][__FUNCTION__] = CRM_Utils_Array::collect('value', $statuses['values']);
+ }
+ return Civi::$statics[__CLASS__][__FUNCTION__];
+ }
+
+ /**
+ * Check if status_id is completed.
+ *
+ * Note: activity status options use the "grouping" field to distinguish complete from incomplete statuses.
+ *
+ * @param int $statusId
+ *
+ * @return bool
+ */
+ public static function isCompleted($statusId) {
+ return in_array($statusId, self::getCompletedStatuses());
+ }
+
+ /**
+ * Check if activity is overdue.
+ *
+ * @param array $activity
+ *
+ * @return bool
+ */
+ public static function isOverdue($activity) {
+ return !self::isCompleted($activity['status_id']) && CRM_Utils_Date::overdue($activity['activity_date_time']);
+ }
+