GrantProgram.php 12.4 KB
Newer Older
1 2 3
<?php


4
require_once __DIR__ . '/../../../vendor/autoload.php';
5 6 7 8

/**
 * This class contains  grant program related functions.
 */
9 10 11 12 13 14 15
class CRM_Grant_BAO_GrantProgram extends CRM_Grant_DAO_GrantProgram {
  /**
   * class constructor
   */
  function __construct() {
    parent::__construct();
  }
16

Pradeep Nayak's avatar
Pradeep Nayak committed
17 18 19 20 21 22
  /**
   * grant program status
   *
   * @var array
   * @static
   */
Monish Deb's avatar
Monish Deb committed
23
  private static $grantProgramStatus;
Pradeep Nayak's avatar
Pradeep Nayak committed
24 25


26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
  /**
   * Takes a bunch of params that are needed to match certain criteria and
   * retrieves the relevant objects. It also stores all the retrieved
   * values in the default array
   *
   * @param array $params   (reference ) an assoc array of name/value pairs
   * @param array $defaults (reference ) an assoc array to hold the flattened values
   *
   * @return object CRM_Contribute_DAO_GrantProgram object on success, null otherwise
   * @access public
   * @static
   */
  static function retrieve(&$params, &$defaults) {
    $program = new CRM_Grant_DAO_GrantProgram();
    $program->copyValues($params);
    if ($program->find(TRUE)) {
      CRM_Core_DAO::storeValues($program, $defaults);
      return $program;
44
    }
45 46
    return NULL;
  }
47

48 49
  /**
   * Function  to delete Grant Program
Monish Deb's avatar
Monish Deb committed
50
   *
51
   * @param  int  $grantProgramID     ID of the par service fee to be deleted.
Monish Deb's avatar
Monish Deb committed
52
   *
53 54 55 56 57 58
   * @access public
   * @static
   */
  static function del($grantProgramID) {
    if (!$grantProgramID) {
      CRM_Core_Error::fatal(ts('Invalid value passed to delete function'));
59
    }
Monish Deb's avatar
Monish Deb committed
60

61 62 63 64
    $dao = new CRM_Grant_DAO_GrantProgram();
    $dao->id = $grantProgramID;
    if (!$dao->find(TRUE)) {
      return NULL;
65
    }
66 67
    $dao->delete();
  }
68

69
  static function getOptionValueID($optioGroupID, $value) {
Mayur Jadhav's avatar
Mayur Jadhav committed
70
    $query = "SELECT id FROM civicrm_option_value WHERE  option_group_id = {$optioGroupID} AND value = {$value}";
71 72
    return CRM_Core_DAO::singleValueQuery($query);
  }
Monish Deb's avatar
Monish Deb committed
73

74
  static function getOptionValue($id) {
Mayur Jadhav's avatar
Mayur Jadhav committed
75
    $query = "SELECT value FROM civicrm_option_value WHERE id = {$id}";
76 77
    return CRM_Core_DAO::singleValueQuery($query);
  }
78

79
  static function getOptionName ($id) {
Mayur Jadhav's avatar
Mayur Jadhav committed
80
    $query = "SELECT label FROM civicrm_option_value WHERE id = {$id}";
81 82
    return CRM_Core_DAO::singleValueQuery($query);
  }
83

84
  static function grantPrograms($id = NULL) {
85
    $where = 'WHERE is_active = 1';
86
    if (!empty($id)) {
87
      $where .= " AND id = {$id}";
88
    }
89 90 91 92 93
    $query = "SELECT id, label FROM civicrm_grant_program {$where}";
    $dao = CRM_Core_DAO::executeQuery($query);
    while ($dao->fetch()) {
      if (!empty($id)) {
        $grantPrograms = $dao->label;
Monish Deb's avatar
Monish Deb committed
94
      }
95 96
      else {
        $grantPrograms[$dao->id] = $dao->label;
97
      }
98
    }
99
    return empty($grantPrograms) ? array() : $grantPrograms;
Monish Deb's avatar
Monish Deb committed
100
  }
101 102 103 104 105 106 107 108 109

  static function contributionTypes() {
    $typeDao = new CRM_Financial_DAO_FinancialType();
    $typeDao->find();
    while ($typeDao->fetch()) {
      $contributionTypes[$typeDao->id] = $typeDao->name;
    }
    return $contributionTypes;
  }
Monish Deb's avatar
Monish Deb committed
110

111 112 113 114
  static function create(&$params, &$ids) {
    if (empty($params)) {
      return;
    }
Monish Deb's avatar
Monish Deb committed
115
    $moneyFields = array(
116
      'total_amount',
Monish Deb's avatar
Monish Deb committed
117
      'remainder_amount'
118 119 120 121
    );
    foreach ($moneyFields as $field) {
      if (isset($params[$field])) {
        $params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
122
      }
123 124 125
    }
    // convert dates to mysql format
    $dates = array('allocation_date');
Monish Deb's avatar
Monish Deb committed
126

127 128 129
    foreach ($dates as $date) {
      if (isset( $params[$date])) {
        $params[$date] = CRM_Utils_Date::processDate($params[$date], NULL, TRUE);
130
      }
131 132 133
    }
    $grantProgram = new CRM_Grant_DAO_GrantProgram();
    $grantProgram->id = CRM_Utils_Array::value('grant_program', $ids);
Monish Deb's avatar
Monish Deb committed
134

135
    $grantProgram->copyValues($params);
Monish Deb's avatar
Monish Deb committed
136

137 138
    return $result = $grantProgram->save();
  }
139

140 141 142 143
  public function getDisplayName($id) {
    $sql = "SELECT display_name FROM civicrm_contact WHERE civicrm_contact.id = $id ";
    return CRM_Core_DAO::singleValueQuery($sql);
  }
Monish Deb's avatar
Monish Deb committed
144 145


Stan Dragnev's avatar
Stan Dragnev committed
146
  public function getAddress($id, $locationTypeID = NULL, $twoLines = false) {
147
    $sql = "
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
   SELECT civicrm_contact.id as contact_id,
          civicrm_address.street_address as street_address,
          civicrm_address.supplemental_address_1 as supplemental_address_1,
          civicrm_address.supplemental_address_2 as supplemental_address_2,
          civicrm_address.city as city,
          civicrm_address.postal_code as postal_code,
          civicrm_address.postal_code_suffix as postal_code_suffix,
          civicrm_state_province.abbreviation as state,
          civicrm_country.name as country,
          civicrm_location_type.name as location_type
     FROM civicrm_contact
LEFT JOIN civicrm_address ON civicrm_address.contact_id = civicrm_contact.id
LEFT JOIN civicrm_state_province ON civicrm_address.state_province_id = civicrm_state_province.id
LEFT JOIN civicrm_country ON civicrm_address.country_id = civicrm_country.id
LEFT JOIN civicrm_location_type ON civicrm_location_type.id = civicrm_address.location_type_id
WHERE civicrm_contact.id = $id ";

165 166 167
    $params = array();
    if (!$locationTypeID) {
      $sql .= " AND civicrm_address.is_primary = 1";
Monish Deb's avatar
Monish Deb committed
168
    }
169 170 171
    else {
      $sql .= " AND civicrm_address.location_type_id = %1";
      $params[1] = array($locationTypeID, 'Integer');
172
    }
173 174 175 176 177
    $dao = CRM_Core_DAO::executeQuery($sql, $params);
    $location = array();
    $config = CRM_Core_Config::singleton();
    while ($dao->fetch()) {
      $address = '';
Stan Dragnev's avatar
Stan Dragnev committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191
      if ($twoLines) {
      	CRM_Utils_String::append(
      	$address, ' ',
      	array(
	      	$dao->street_address,
	      	$dao->supplemental_address_1,
	      	$dao->supplemental_address_2,
	      	'<br />',
	      	$dao->city,
	      	$dao->state,
	      	$dao->postal_code
	      	)
      	);
      } else {
Monish Deb's avatar
Monish Deb committed
192
	      CRM_Utils_String::append(
Stan Dragnev's avatar
Stan Dragnev committed
193
	        $address, ', ',
Monish Deb's avatar
Monish Deb committed
194
	        array(
Stan Dragnev's avatar
Stan Dragnev committed
195 196 197 198 199 200 201
	          $dao->street_address,
	          $dao->supplemental_address_1,
	          $dao->supplemental_address_2,
	          $dao->city,
	          $dao->state,
	          $dao->postal_code,
	          $dao->country
Monish Deb's avatar
Monish Deb committed
202
	        )
Stan Dragnev's avatar
Stan Dragnev committed
203 204
	      );
      }
205
      $location['address'] = addslashes($address);
Monish Deb's avatar
Monish Deb committed
206
    }
207
    return $location;
Monish Deb's avatar
Monish Deb committed
208
  }
Pradeep Nayak's avatar
Pradeep Nayak committed
209 210 211 212 213 214 215 216 217 218 219 220 221 222
  /**
   * Get all the n grant program statuses
   *
   * @access public
   * @return array - array reference of all grant program statuses if any
   * @static
   */
  public static function &grantProgramStatus($id = NULL) {
    if (!self::$grantProgramStatus) {
      self::$grantProgramStatus = array();
      self::$grantProgramStatus = CRM_Core_OptionGroup::values('grant_program_status');
    }
    if($id) {
      return self::$grantProgramStatus[$id];
Monish Deb's avatar
Monish Deb committed
223
    }
Pradeep Nayak's avatar
Pradeep Nayak committed
224
    return self::$grantProgramStatus;
225
  }
Monish Deb's avatar
Monish Deb committed
226 227


Pradeep Nayak's avatar
Pradeep Nayak committed
228 229 230 231 232 233
  static function getGrantPrograms($id = NULL) {
    $grantPrograms = array();
    $where = ' WHERE is_active = 1';
    if (!empty($id)) {
      $where .= " AND id = {$id}";
    }
234
    $query = "SELECT id, name FROM civicrm_grant_program " . $where;
Pradeep Nayak's avatar
Pradeep Nayak committed
235 236 237 238 239 240
    $dao = CRM_Core_DAO::executeQuery($query);
    while ($dao->fetch()) {
      $grantPrograms[$dao->id] = $dao->name;
    }
    return $grantPrograms;
  }
Monish Deb's avatar
Monish Deb committed
241

Pradeep Nayak's avatar
Pradeep Nayak committed
242
  static function sendMail($contactID, &$values, $grantStatus, $grantId = FALSE, $status = '') {
243
    $value = array();
Pradeep Nayak's avatar
Pradeep Nayak committed
244 245 246
    if (CRM_Utils_Array::value('is_auto_email', $values)) {
      list($displayName, $email) = CRM_Contact_BAO_Contact_Location::getEmailDetails($contactID);
      if (isset($email)) {
247 248 249
        $valueName = strtolower($grantStatus);
        if ($grantStatus == 'Awaiting Information') {
          $explode = explode(' ', $grantStatuse);
Pradeep Nayak's avatar
Pradeep Nayak committed
250
          $valueName = strtolower($explode[0]) . '_info';
Monish Deb's avatar
Monish Deb committed
251
        }
252
        elseif (strstr($grantStatus, 'Approved')) {
Mayur Jadhav's avatar
Mayur Jadhav committed
253
          $valueName = strtolower('Approved');
Pradeep Nayak's avatar
Pradeep Nayak committed
254 255 256 257 258
        }
        $sendTemplateParams = array(
          'groupName' => 'msg_tpl_workflow_grant',
          'valueName' => 'grant_'.$valueName,
          'contactId' => $contactID,
Monish Deb's avatar
Monish Deb committed
259
          'tplParams' => array_merge(['email' => $email], CRM_Utils_Array::value('tplParams', $values, [])),
Pradeep Nayak's avatar
Pradeep Nayak committed
260 261
          'PDFFilename' => '',
        );
262 263 264 265 266 267 268 269 270

        $emailQuery = "SELECT from_email_address FROM civicrm_grant_program WHERE id = %1";
        $defaultAddress = CRM_Core_DAO::singleValueQuery($emailQuery, array(
          1 => array($values['grant_program_id'], 'Integer')
        ));

        if (!isset($defaultAddress) || $defaultAddress == '') {
          $defaultAddress = CRM_Core_OptionGroup::values('from_email_address', NULL, NULL, NULL, ' AND is_default = 1');

271 272 273 274 275
          foreach ($defaultAddress as $id => $value) {
            $sendTemplateParams['from'] = $value;
          }
        } else {
          $sendTemplateParams['from'] = $defaultAddress;
276 277
        }

Pradeep Nayak's avatar
Pradeep Nayak committed
278 279 280
        $sendTemplateParams['toName'] = $displayName;
        $sendTemplateParams['toEmail'] = $email;
        $sendTemplateParams['autoSubmitted'] = TRUE;
281 282 283 284 285 286 287 288 289 290 291
        $query = 'SELECT msg_subject subject, msg_text text, msg_html html, pdf_format_id format
                      FROM civicrm_msg_template mt
                      JOIN civicrm_option_value ov ON workflow_id = ov.id
                      JOIN civicrm_option_group og ON ov.option_group_id = og.id
                      WHERE og.name = %1 AND ov.name = %2 AND mt.is_default = 1';
        $sqlParams = array(1 => array($sendTemplateParams['groupName'], 'String'), 2 => array($sendTemplateParams['valueName'], 'String'));
        $dao = CRM_Core_DAO::executeQuery($query, $sqlParams);
        $dao->fetch();
        if ($dao->N) {
          CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
        }
Pradeep Nayak's avatar
Pradeep Nayak committed
292
        if ($grantId && $status) {
Pradeep Nayak's avatar
Pradeep Nayak committed
293
          self::createStatusChangeActivity($grantId, $grantStatus, $status, $contactID);
294
        }
Pradeep Nayak's avatar
Pradeep Nayak committed
295 296
      }
    }
Mayur Jadhav's avatar
Mayur Jadhav committed
297
  }
Mayur Jadhav's avatar
Mayur Jadhav committed
298 299 300 301 302 303 304 305 306 307

  /**
   * Function to get sum of amount granted for a Contact
   *
   * @param int $params
   *
   * @return int sum of amount granted
   * @access public
   * @static
   */
308
  static function getUserAllocatedAmount($params, $id = NULL) {
Mayur Jadhav's avatar
Mayur Jadhav committed
309
    $where = NULL;
Mayur Jadhav's avatar
Mayur Jadhav committed
310 311
    if (!empty($params)) {
      foreach ($params as $key => $value) {
Mayur Jadhav's avatar
Mayur Jadhav committed
312 313
        $where .= " AND {$key} = {$value}";
      }
314 315 316
      if (!empty($id)) {
        $where .= " AND id != {$id}";
      }
Mayur Jadhav's avatar
Mayur Jadhav committed
317 318 319 320 321
      $query = "SELECT SUM(amount_granted) as amount_granted FROM civicrm_grant WHERE " .ltrim($where, ' AND');
      $amountGranted = CRM_Core_DAO::singleValueQuery($query);
    }
    return empty($amountGranted) ? 0 : $amountGranted;
  }
Monish Deb's avatar
Monish Deb committed
322

Mayur Jadhav's avatar
Mayur Jadhav committed
323 324 325 326 327 328 329 330 331 332 333 334 335 336
  /**
   * Function to get current grant granted amount
   *
   * @return int amount granted
   * @access public
   * @static
   */
  static function getCurrentGrantAmount($id = NULL) {
    if ($id != NULL) {
      $query = "SELECT amount_granted FROM civicrm_grant WHERE id = " . $id;
      $amountGranted = CRM_Core_DAO::singleValueQuery($query);
    }
    return empty($amountGranted) ? 0 : $amountGranted;
  }
337 338

  static function getPriorities($id, $contactId) {
Edselopez's avatar
Edselopez committed
339
    $priority = 10;
340
    $amount = 0;
Monish Deb's avatar
Monish Deb committed
341 342
    $grants = civicrm_api3('Grant', 'get', [
      'grant_program_id' => CRM_Core_DAO::getFieldValue('CRM_Grant_DAO_GrantProgram', $id, 'grant_program_id'),
343
      'contact_id' => $contactId,
Monish Deb's avatar
Monish Deb committed
344
    ])['values'];
345 346 347 348 349 350 351 352 353
    if (!empty($grants)) {
      foreach ($grants as $values) {
        $amount += $values['amount_granted'];
      }
    }
    $grantThresholds = CRM_Core_OptionGroup::values('grant_thresholds', TRUE);
    if (!empty($amount)) {
      if ($amount == $grantThresholds['Maximum Grant']) {
        $priority = -10;
Monish Deb's avatar
Monish Deb committed
354
      }
355 356 357 358 359 360
      elseif ($amount == 0) {
        $priority = 10;
      }
      elseif ((0 <= $amount) && ($amount <= $grantThresholds['Maximum Grant'])) {
        $priority = 0;
      }
Monish Deb's avatar
Monish Deb committed
361
    }
362 363
    return $priority;
  }
Pradeep Nayak's avatar
Pradeep Nayak committed
364 365 366 367 368 369 370 371

  static function createStatusChangeActivity($grantId, $newStatus, $oldStatus, $contactID) {
    if (($oldStatus == 'Draft' && $newStatus == 'Submitted') || $newStatus == $oldStatus || !$oldStatus) {
      return;
    }
    $activityStatus = CRM_Core_PseudoConstant::activityStatus('name');
    $activityType = CRM_Core_PseudoConstant::activityType();
    $session = CRM_Core_Session::singleton();
Monish Deb's avatar
Monish Deb committed
372
    $params = array(
Pradeep Nayak's avatar
Pradeep Nayak committed
373 374 375 376 377 378 379 380 381 382 383 384
      'source_contact_id'=> $session->get('userID'),
      'source_record_id' => $grantId,
      'activity_type_id'=> array_search('Grant Status Change', $activityType),
      'assignee_contact_id'=> array($contactID),
      'subject'=> "Grant status changed from {$oldStatus} to {$newStatus}",
      'activity_date_time'=> date('Ymdhis'),
      'status_id'=> array_search('Completed', $activityStatus),
      'priority_id'=> 2,
      'details'=> CRM_Core_Smarty::singleton()->get_template_vars('messageBody'),
    );
    CRM_Activity_BAO_Activity::create($params);
  }
385

386 387
  public static function convertNumberToWords($num) {
    return ucwords(Numbers_Words::toWords($num));
388 389
  }

390
}