[WIP] TwingleDonation.Submit API action
This commit is contained in:
parent
f8575ac7ce
commit
061972706c
4 changed files with 978 additions and 0 deletions
237
CRM/Twingle/Submission.php
Normal file
237
CRM/Twingle/Submission.php
Normal file
|
@ -0,0 +1,237 @@
|
|||
<?php
|
||||
/*------------------------------------------------------------+
|
||||
| SYSTOPIA Twingle Integration |
|
||||
| Copyright (C) 2018 SYSTOPIA |
|
||||
| Author: J. Schuppe (schuppe@systopia.de) |
|
||||
+-------------------------------------------------------------+
|
||||
| This program is released as free software under the |
|
||||
| Affero GPL license. You can redistribute it and/or |
|
||||
| modify it under the terms of this license which you |
|
||||
| can read by viewing the included agpl.txt or online |
|
||||
| at www.gnu.org/licenses/agpl.html. Removal of this |
|
||||
| copyright header is strictly prohibited without |
|
||||
| written permission from the original author(s). |
|
||||
+-------------------------------------------------------------*/
|
||||
|
||||
use CRM_Twingle_ExtensionUtil as E;
|
||||
|
||||
class CRM_Twingle_Submission {
|
||||
|
||||
/**
|
||||
* The default ID of the "Work" location type.
|
||||
*/
|
||||
const LOCATION_TYPE_ID_WORK = 2;
|
||||
|
||||
/**
|
||||
* The default ID of the "Employer of" relationship type.
|
||||
*/
|
||||
const EMPLOYER_RELATIONSHIP_TYPE_ID = 5;
|
||||
|
||||
/**
|
||||
* @param array &$params
|
||||
* A reference to the parameters array of the submission.
|
||||
*
|
||||
* @param \CRM_Twingle_Profile $profile
|
||||
* The Twingle profile to use for validation, defaults to the default
|
||||
* profile.
|
||||
*
|
||||
* @throws \CiviCRM_API3_Exception
|
||||
* When invalid parameters have been submitted.
|
||||
*/
|
||||
public static function validateSubmission(&$params, $profile = NULL) {
|
||||
if (!$profile) {
|
||||
$profile = CRM_Twingle_Profile::createDefaultProfile();
|
||||
}
|
||||
|
||||
// Validate donation rhythm.
|
||||
if (!in_array($params['donation_rhythm'], array(
|
||||
'one_time',
|
||||
'halfyearly',
|
||||
'quarterly',
|
||||
'yearly',
|
||||
'monthly',
|
||||
))) {
|
||||
throw new CiviCRM_API3_Exception(
|
||||
E::ts('Invalid donation rhythm.'),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
|
||||
// Get the payment instrument defined within the profile, or return an error
|
||||
// if none matches (i.e. an unknown payment method was submitted).
|
||||
if (!$payment_instrument_id = $profile->getAttribute('pi_' . $params['payment_method'])) {
|
||||
throw new CiviCRM_API3_Exception(
|
||||
E::ts('Payment method could not be matched to existing payment instrument.'),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
$params['payment_instrument_id'] = $payment_instrument_id;
|
||||
|
||||
// Validate date for parameter "confirmed_at".
|
||||
if (!DateTime::createFromFormat('Ymd', $params['confirmed_at'])) {
|
||||
throw new CiviCRM_API3_Exception(
|
||||
E::ts('Invalid date for parameter "confirmed_at".'),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
|
||||
// Validate date for parameter "user_birthdate".
|
||||
if (!empty($params['user_birthdate']) && !DateTime::createFromFormat('Ymd', $params['user_birthdate'])) {
|
||||
throw new CiviCRM_API3_Exception(
|
||||
E::ts('Invalid date for parameter "user_birthdate".'),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
|
||||
// Get the gender ID defined within the profile, or return an error if none
|
||||
// matches (i.e. an unknown gender was submitted).
|
||||
if (!$gender_id = $profile->getAttribute('gender_' . $params['user_gender'])) {
|
||||
throw new CiviCRM_API3_Exception(
|
||||
E::ts('Gender could not be matched to existing gender.'),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
$params['gender_id'] = $gender_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the contact matching the given contact data or creates a new
|
||||
* contact.
|
||||
*
|
||||
* @param string $contact_type
|
||||
* The contact type to look for/to create.
|
||||
* @param array $contact_data
|
||||
* Data to use for contact lookup/to create a contact with.
|
||||
*
|
||||
* @return int | NULL
|
||||
* The ID of the matching/created contact, or NULL if no matching contact
|
||||
* was found and no new contact could be created.
|
||||
* @throws \CiviCRM_API3_Exception
|
||||
* When invalid data was given.
|
||||
*/
|
||||
public static function getContact($contact_type, $contact_data) {
|
||||
// If no parameters are given, do nothing.
|
||||
if (empty($contact_data)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Prepare values: country.
|
||||
if (!empty($contact_data['country'])) {
|
||||
if (is_numeric($contact_data['country'])) {
|
||||
// If a country ID is given, update the parameters.
|
||||
$contact_data['country_id'] = $contact_data['country'];
|
||||
unset($contact_data['country']);
|
||||
}
|
||||
else {
|
||||
// Look up the country depending on the given ISO code.
|
||||
$country = civicrm_api3('Country', 'get', array('iso_code' => $contact_data['country']));
|
||||
if (!empty($country['id'])) {
|
||||
$contact_data['country_id'] = $country['id'];
|
||||
unset($contact_data['country']);
|
||||
}
|
||||
else {
|
||||
throw new \CiviCRM_API3_Exception(
|
||||
E::ts('Unknown country %1.', array(1 => $contact_data['country'])),
|
||||
'invalid_format'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pass to XCM.
|
||||
$contact_data['contact_type'] = $contact_type;
|
||||
$contact = civicrm_api3('Contact', 'getorcreate', $contact_data);
|
||||
if (empty($contact['id'])) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return $contact['id'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Shares an organisation's work address, unless the contact already has one.
|
||||
*
|
||||
* @param $contact_id
|
||||
* The ID of the contact to share the organisation address with.
|
||||
* @param $organisation_id
|
||||
* The ID of the organisation whose address to share with the contact.
|
||||
* @param $location_type_id
|
||||
* The ID of the location type to use for address lookup.
|
||||
*
|
||||
* @return boolean
|
||||
* Whether the organisation address has been shared with the contact.
|
||||
*
|
||||
* @throws \CiviCRM_API3_Exception
|
||||
* When looking up or creating the shared address failed.
|
||||
*/
|
||||
public static function shareWorkAddress($contact_id, $organisation_id, $location_type_id = self::LOCATION_TYPE_ID_WORK) {
|
||||
if (empty($organisation_id)) {
|
||||
// Only if organisation exists.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Check whether organisation has a WORK address.
|
||||
$existing_org_addresses = civicrm_api3('Address', 'get', array(
|
||||
'contact_id' => $organisation_id,
|
||||
'location_type_id' => $location_type_id));
|
||||
if ($existing_org_addresses['count'] <= 0) {
|
||||
// Organisation does not have a WORK address.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Check whether contact already has a WORK address.
|
||||
$existing_contact_addresses = civicrm_api3('Address', 'get', array(
|
||||
'contact_id' => $contact_id,
|
||||
'location_type_id' => $location_type_id));
|
||||
if ($existing_contact_addresses['count'] > 0) {
|
||||
// Contact already has a WORK address.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Create a shared address.
|
||||
$address = reset($existing_org_addresses['values']);
|
||||
$address['contact_id'] = $contact_id;
|
||||
$address['master_id'] = $address['id'];
|
||||
unset($address['id']);
|
||||
civicrm_api3('Address', 'create', $address);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates or creates an employer relationship between contact and
|
||||
* organisation.
|
||||
*
|
||||
* @param int $contact_id
|
||||
* The ID of the employee contact.
|
||||
* @param int $organisation_id
|
||||
* The ID of the employer contact.
|
||||
*
|
||||
* @throws \CiviCRM_API3_Exception
|
||||
*/
|
||||
public static function updateEmployerRelation($contact_id, $organisation_id) {
|
||||
if (empty($contact_id) || empty($organisation_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// see if there is already one
|
||||
$existing_relationship = civicrm_api3('Relationship', 'get', array(
|
||||
'relationship_type_id' => self::EMPLOYER_RELATIONSHIP_TYPE_ID,
|
||||
'contact_id_a' => $contact_id,
|
||||
'contact_id_b' => $organisation_id,
|
||||
'is_active' => 1,
|
||||
));
|
||||
|
||||
if ($existing_relationship['count'] == 0) {
|
||||
// There is currently no (active) relationship between these contacts.
|
||||
$new_relationship_data = array(
|
||||
'relationship_type_id' => self::EMPLOYER_RELATIONSHIP_TYPE_ID,
|
||||
'contact_id_a' => $contact_id,
|
||||
'contact_id_b' => $organisation_id,
|
||||
'is_active' => 1,
|
||||
);
|
||||
|
||||
civicrm_api3('Relationship', 'create', $new_relationship_data);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue