array( 'title' => t('Administer fulcrm membership'), 'description' => t('Perform main installation/administration tasks for fulcrm membership integration.'), ), ); } function fulcrm_membership_menu() { $items = array(); $items[ 'admin/config/services/fulcrm/membership' ] = array( 'page callback' => 'fulcrm_membership_admin', 'file' => 'fulcrm_membership.admin.inc', 'title' => 'fulcrm Membership', 'description' => 'Configure Membership integration with fulcrm.org.', 'access callback' => 'user_access', 'access arguments' => array('administer fulcrm membership'), ); $items[ 'user/fulcrm/optin/%' ] = array( 'page callback' => 'fulcrm_membership_optin', 'page arguments' => array(3), 'title' => 'Subscription Opt-In', 'description' => 'Opt-In to a Membership.', 'access callback' => 'user_access', 'access arguments' => array('access content'), ); $items[ 'user/fulcrm/membership' ] = array( 'page callback' => 'fulcrm_membership_self_set', 'title' => 'Choose Your Settings', 'description' => 'Opt-In Membership Settings.', 'access callback' => 'user_access', 'access arguments' => array('access content'), ); return $items; } function fulcrm_membership_optin_form_submit( $form, &$form_state ) { foreach ( $form_state[ 'values' ][ 'person2memberships' ] as $p2m_id ) { $p2m_id = fulcrm_crypto_get_object_id_form_value( 'person2membership-optin', $p2m_id ); if ( $p2m_id ) { $api_data = fulcrm_apiv2_PATCH( 'person2membership/' . $p2m_id . '/', $data = array( 'archived' => NULL ), $query = array( 'expand' => implode( ',', array( 'person', 'membership', 'timescale' ) ) ) ); if ( $api_data[ 'success' ] ) { $api1_data = fulcrm_apiv2_POST( 'n/', $data = array( 'note' => 'Subscription added through opt-in via website.', 'person' => $api_data[ 'data' ][ 'person' ][ 'url' ], 'content_object' => $api_data[ 'data' ][ 'url' ], ) ); $now = new DateTime(); $now->setTimestamp( time() ); $now->setTimeZone( new DateTimeZone('GMT') ); $now_str = $now->format('Y-m-d\TH:i:s\Z'); if ( $api_data[ 'data' ][ 'timescale' ] ) { $api3_data = fulcrm_apiv2_PATCH( $api_data[ 'data' ][ 'timescale' ][ 'url' ], $data = array( 'start' => $now_str ) ); if ( $api3_data[ 'success' ] ) { } else { drupal_set_message( t('There was a problem confirming your subscription (update start date).'), 'error', FALSE ); } } else { $api3_data = fulcrm_apiv2_POST( 'timescale/', $data = array( 'start' => $now_str ) ); if ( $api3_data[ 'success' ] ) { $api4_data = fulcrm_apiv2_PATCH( 'person2membership/' . $p2m_id . '/', $data = array( 'timescale' => $api3_data[ 'data' ][ 'url' ] ) ); if ( $api4_data[ 'success' ] ) { } else { drupal_set_message( t('There was a problem confirming your subscription (associate start date).'), 'error', FALSE ); } } else { drupal_set_message( t('There was a problem confirming your subscription (create start date).'), 'error', FALSE ); } } if ( $api_data[ 'data' ][ 'person' ][ 'archived' ] ) { $api2_data = fulcrm_apiv2_PATCH( $api_data[ 'data' ][ 'person' ][ 'url' ], $data = array( 'archived' => NULL ) ); if ( $api2_data[ 'success' ] ) { drupal_set_message( t('Thank you! Your subscription to "%membership" has been confirmed.', array( '%membership' => $api_data[ 'data' ][ 'membership' ][ 'name' ] )), 'status', FALSE ); drupal_goto( '' ); } else { drupal_set_message( t('There was a problem confirming your subscription.'), 'error', FALSE ); } } else { drupal_set_message( t('Thank you! Your subscription to "%membership" has been confirmed.', array( '%membership' => $api_data[ 'data' ][ 'membership' ][ 'name' ] )), 'status', FALSE ); drupal_goto( '' ); } } else { drupal_set_message( t('There was a problem confirming your subscription.'), 'error', FALSE ); } } } } function fulcrm_membership_optin_form( $form, &$form_state, $p2ms ) { drupal_set_title( 'Confirm Your Subscriptions' ); $form[ 'title' ] = array( '#type' => 'markup', '#markup' => '

Confirm Your Subscriptions

', ); $options = array(); foreach ( $p2ms as $p2m ) { $key = fulcrm_crypto_object_id_form_value( 'person2membership-optin', $p2m[ 'id' ] ); $options[ $key ] = $p2m[ 'membership' ][ 'name' ]; } $form[ 'person2memberships' ] = array( '#type' => 'checkboxes', '#title' => 'Please choose which subscriptions you would like to join below:', '#options' => $options, ); $form[ 'actions' ] = array( '#type' => 'actions' ); $form[ 'actions' ][ 'submit' ] = array( '#type' => 'submit', '#value' => t('Confirm Subscriptions'), '#submit' => array( 'fulcrm_membership_optin_form_submit' ), ); return $form; } function fulcrm_membership_optin( $passport ) { $url = $GLOBALS[ 'base_url' ]; $url = parse_url( $url, PHP_URL_HOST ); $api_data = fulcrm_apiv2_GET( 'person2membership/', $query = array( 'passport__system' => $url, 'passport__passport' => $passport, 'expand' => implode( ',', array( 'person', 'membership', ) ) ) ); if ( $api_data[ 'success' ] ) { return drupal_get_form( 'fulcrm_membership_optin_form', $api_data[ 'data' ][ 'results' ] ); } } function fulcrm_membership_person2membership_is_current( $p2m ) { if ( $p2m[ 'timescale' ] ) { $tz = new DateTimeZone('UTC'); $now = new DateTime(); $ts_start = $p2m[ 'timescale' ][ 'start' ]; if ( $ts_start ) { $start = DateTime::createFromFormat( 'Y-m-d\TH:i:s.u\Z', $ts_start, $timezone = $tz ); $start = $start ? $start : DateTime::createFromFormat( 'Y-m-d\TH:i:s\Z', $ts_start, $timezone = $tz ); } else { $start = NULL; } $ts_finish = $p2m[ 'timescale' ][ 'finish' ]; if ( $ts_finish ) { $finish = DateTime::createFromFormat( 'Y-m-d\TH:i:s.u\Z', $ts_finish, $timezone = $tz ); $finish = $finish ? $finish : DateTime::createFromFormat( 'Y-m-d\TH:i:s\Z', $ts_finish, $timezone = $tz ); } else { $finish = NULL; } return ( ( is_null( $start ) || ( $start <= $now ) ) && ( is_null( $finish ) || ( $finish > $now ) ) ); } else { return true; } } function fulcrm_membership_can_self_set_person2membership( $p2m ) { if ( array_key_exists( 'membership', $p2m ) ) { if ( is_array( $p2m[ 'membership' ] ) ) $membership_id = $p2m[ 'membership' ][ 'id' ]; else $membership_id = fulcrm_apiv2_url_to_pk( $p2m[ 'membership' ] ); $self_set_membership_ids = variable_get( 'fulcrm_membership_self_set_membership_ids', array() ); if ( array_key_exists( $membership_id, $self_set_membership_ids ) ) { if ( $self_set_membership_ids[ $membership_id ] ) return true; } } return false; } function fulcrm_membership_cease_person2membership( $p2m, $now = NULL ) { if ( is_null( $now ) ) $now = new DateTime(); $tz = new DateTimeZone('UTC'); $now->setTimeZone( $tz ); $finish = $now->format( 'Y-m-d\TH:i:s.u\Z' ); if ( $p2m[ 'timescale' ] ) { $api_data = fulcrm_apiv2_PATCH( $p2m[ 'timescale' ][ 'url' ], $data = array( 'finish' => $finish ) ); if ( $api_data[ 'success' ] ) { return true; } else { watchdog('fulcrm_membership', 'could not patch person2membership %id cease', array('%id'=>$p2m['id']), WATCHDOG_ERROR); } } else { $timescale_data = fulcrm_apiv2_POST( 'timescale/', $data = array( 'finish' => $finish ) ); if ( $timescale_data[ 'success' ] ) { $api_data = fulcrm_apiv2_PATCH( $p2m[ 'url' ], $data = array( 'timescale' => $timescale_data[ 'data' ][ 'url' ] ) ); if ( $api_data[ 'success' ] ) { return true; } else { watchdog('fulcrm_membership', 'could not patch person2membership %id to add timescale %tid', array('%id'=>$p2m['id'],'%tid'=>$timescale_data['data']['id']), WATCHDOG_ERROR); } } else { watchdog('fulcrm_membership', 'could not create timescale to cease membership %id', array('%id'=>$p2m['id']), WATCHDOG_ERROR); } } return false; } function fulcrm_membership_begin_person2membership( $person_id, $membership_id, $now = NULL, $archived = false ) { if ( is_null( $now ) ) $now = new DateTime(); $tz = new DateTimeZone('UTC'); $now->setTimeZone( $tz ); $start = $now->format( 'Y-m-d\TH:i:s.u\Z' ); $timescale_data = fulcrm_apiv2_POST( 'timescale/', $data = array( 'start' => $start ) ); if ( $timescale_data[ 'success' ] ) { $data = array( 'person' => '/api/v2/person/' . $person_id . '/', 'membership' => '/api/v2/membership/' . $membership_id . '/', 'timescale' => $timescale_data[ 'data' ][ 'url' ], ); if ( $archived ) $data[ 'archived' ] = $start; $api_data = fulcrm_apiv2_POST( 'person2membership/', $data = $data ); if ( $api_data[ 'success' ] ) { return $api_data[ 'headers' ][ 'Location' ]; } else { watchdog('fulcrm_membership', 'could not post person2membership to create membership %mid for %pid', array('%mid'=>$membership_id,'%pid'=>$person_id), WATCHDOG_ERROR); } } else { watchdog('fulcrm_membership', 'could not post timescale to create membership %mid for %pid', array('%mid'=>$membership_id,'%pid'=>$person_id), WATCHDOG_ERROR); } } function fulcrm_membership_self_set_form_submit( $form, &$form_state ) { global $user; $person_id = fulcrm_webhook_get_pk_for_entity_type( 'user', $user->uid, 'person' ); if ( $person_id ) { $person_data = fulcrm_apiv2_GET( 'person/' . $person_id . '/', $query = array( 'expand' => implode( ',', array( 'person2memberships', 'person2memberships.membership', 'person2memberships.timescale' ) ) ) ); if ( $person_data[ 'success' ] ) { $membership_data = fulcrm_apiv2_GET( 'membership/', $query = array( 'page_size' => 1000, ) ); if ( $membership_data[ 'success' ] ) { $membership_name = array(); foreach ( $membership_data[ 'data' ][ 'results' ] as $membership ) $membership_name[ $membership[ 'id' ] ] = $membership[ 'name' ]; $possible_ids = variable_get( 'fulcrm_membership_self_set_membership_ids', array() ); $current_map = array(); $new_map = array(); foreach ( $possible_ids as $membership_id => $is_possible ) { if ( $is_possible ) { $current_map[ $membership_id ] = false; $new_map[ $membership_id ] = array_key_exists( $membership_id, $form_state[ 'values' ][ 'memberships' ] ) ? $form_state[ 'values' ][ 'memberships' ][ $membership_id ] : 0; } } foreach ( $person_data[ 'data' ][ 'person2memberships' ] as $p2m ) { $membership_id = $p2m[ 'membership' ][ 'id' ]; if ( array_key_exists( $membership_id, $possible_ids ) && $possible_ids[ $membership_id ] ) { if ( fulcrm_membership_person2membership_is_current( $p2m ) ) { $current_map[ $membership_id ] = true; } } } // figure out the differences foreach ( $possible_ids as $membership_id => $is_possible ) { if ( $is_possible ) { if ( $current_map[ $membership_id ] && $new_map[ $membership_id ] ) { // do nothing } elseif ( !$current_map[ $membership_id ] && !$new_map[ $membership_id ] ) { // do nothing } elseif ( $current_map[ $membership_id ] && !$new_map[ $membership_id ] ) { // REMOVE MEMBERSHIP $membership_id foreach ( $person_data[ 'data' ][ 'person2memberships' ] as $p2m ) { if ( $p2m[ 'membership' ][ 'id' ] == $membership_id ) { if ( fulcrm_membership_person2membership_is_current( $p2m ) ) { if ( fulcrm_membership_cease_person2membership( $p2m ) ) drupal_set_message( t('Ceased your "' . $p2m[ 'membership' ][ 'name' ] . '" membership.'), 'status', FALSE ); } } } } elseif ( !$current_map[ $membership_id ] && $new_map[ $membership_id ] ) { // ADD MEMBERSHIP $membership_id if ( fulcrm_membership_begin_person2membership( $person_id, $membership_id ) ) { drupal_set_message( t('You have begun your "' . $membership_name[ $membership_id ] . '" membership.'), 'status', FALSE ); } } } } } else { drupal_set_message( t('There was a problem fetching membership information.'), 'error', FALSE ); } } else { drupal_set_message( t('There was a problem fetching your subscription information.'), 'error', FALSE ); } } } function fulcrm_membership_self_set_form( $form, &$form_state ) { global $user; $form[ 'title' ] = array( '#type' => 'item', '#title' => 'Subscription Preferences', '#description' => 'This page lets you choose which subscriptions you will receive. Simply tick or untick the boxes as required.', ); $person_id = fulcrm_webhook_get_pk_for_entity_type( 'user', $user->uid, 'person' ); if ( $person_id ) { $person_data = fulcrm_apiv2_GET( 'person/' . $person_id . '/', $query = array( 'expand' => implode( ',', array( 'person2memberships', 'person2memberships.membership', 'person2memberships.timescale' ) ) ) ); if ( $person_data[ 'success' ] ) { $membership_data = fulcrm_apiv2_GET( 'membership/', $query = array( 'page_size' => 1000, ) ); if ( $membership_data[ 'success' ] ) { $membership_name = array(); foreach ( $membership_data[ 'data' ][ 'results' ] as $membership ) $membership_name[ $membership[ 'id' ] ] = $membership[ 'name' ]; $possible_ids = variable_get( 'fulcrm_membership_self_set_membership_ids', array() ); $membership_map = array(); $options = array(); foreach ( $possible_ids as $membership_id => $is_possible ) { if ( $is_possible ) { $membership_map[ $membership_id ] = 0; if ( array_key_exists( $membership_id, $membership_name ) ) $options[ $membership_id ] = $membership_name[ $membership_id ]; } } foreach ( $person_data[ 'data' ][ 'person2memberships' ] as $p2m ) { $membership_id = $p2m[ 'membership' ][ 'id' ]; if ( array_key_exists( $membership_id, $possible_ids ) && $possible_ids[ $membership_id ] ) { if ( fulcrm_membership_person2membership_is_current( $p2m ) ) { $membership_map[ $membership_id ] = $membership_id; } } } $form[ 'memberships' ] = array( '#type' => 'checkboxes', '#title' => 'Your Current Subscriptions', '#options' => $options, '#default_value' => $membership_map, ); } else { drupal_set_message( t('There was a problem fetching membership information.'), 'error', FALSE ); } } else { drupal_set_message( t('There was a problem fetching your subscription information.'), 'error', FALSE ); } } $form[ 'actions' ] = array( '#type' => 'actions' ); $form[ 'actions' ][ 'cancel' ] = array( '#markup' => l(t('Cancel'), 'user' ) ); $form[ 'actions' ][ 'save' ] = array( '#type' => 'submit', '#value' => t('Save'), '#submit' => array( 'fulcrm_membership_self_set_form_submit' ), ); return $form; } function fulcrm_membership_self_set() { //if ( user_is_logged_in() ) { return drupal_get_form( 'fulcrm_membership_self_set_form' ); //} else { //drupal_goto( 'user?destination=user/fulcrm/membership' ); //} }