function run()
 {
     if (CRM_Utils_System::authenticateKey()) {
         $request_type = CRM_Utils_Request::retrieve('type', 'String');
         $request_data = CRM_Utils_Request::retrieve('data', 'String');
         $config = CRM_Core_Config::singleton();
         if ($config->debug) {
             $request_data_log = print_r($request_data, TRUE);
             CRM_Core_Error::debug_log_message("Mailchimp Webhook Request [{$request_type}]: \n{$request_data_log}");
         }
         $function_name = 'self::mailchimpWebhook' . ucwords($request_type);
         if (is_callable($function_name)) {
             // Set a canary to prevent CiviMailchimp hooks from firing, which
             // would trigger updates back to Mailchimp, resulting in an endless
             // loop.
             civimailchimp_static('mailchimp_do_not_run_hooks', TRUE);
             try {
                 call_user_func($function_name, $request_data);
             } catch (Exception $e) {
                 $error = array('code' => get_class($e), 'message' => $e->getMessage(), 'exception' => $e);
                 $message = "Mailchimp Webhook Request [{$request_type}]: {$error['code']}: {$error['message']}";
                 CRM_CiviMailchimp_BAO_SyncLog::saveMessage('error', 'mailchimp_to_civicrm', $message, $request_data);
                 CRM_Core_Error::debug_var('Fatal Error Details', $error);
                 CRM_Core_Error::backtrace('backTrace', TRUE);
                 throw $e;
             }
         }
     }
     parent::run();
 }
 function run()
 {
     CRM_CiviMailchimp_BAO_SyncLog::clearAllMessages();
     $session = CRM_Core_Session::singleton();
     $session->setStatus(ts("All unread CiviMailchimp log messages cleared."), '', 'success');
     $url = CRM_Utils_System::url('civicrm/admin/mailchimp/log', 'reset=1');
     CRM_Utils_System::redirect($url);
     parent::run();
 }
 static function renderMessages()
 {
     $civi_to_mailchimp_log_message = CRM_CiviMailchimp_BAO_SyncLog::getLatestUnclearedCiviToMailchimpErrorMessage();
     $session = CRM_Core_Session::singleton();
     if ($civi_to_mailchimp_log_message) {
         $session->setStatus($civi_to_mailchimp_log_message, ts("Error Syncing CiviCRM to Mailchimp"), 'alert', array('expires' => 0));
     }
     $mailchimp_to_civi_log_messages = CRM_CiviMailchimp_BAO_SyncLog::getUnclearedMailchimpToCiviErrorMessages();
     foreach ($mailchimp_to_civi_log_messages as $message) {
         $session->setStatus($message, ts("Error Syncing Mailchimp to CiviCRM"), 'alert', array('expires' => 0));
     }
     CRM_Core_Resources::singleton()->addScriptFile('com.giantrabbit.civimailchimp', 'js/sync_log.js');
 }
 static function clear()
 {
     $message_id = CRM_Utils_Request::retrieve('id', 'Integer');
     $civicrm_queue_item_id = CRM_Utils_Request::retrieve('qid', 'Integer');
     try {
         CRM_CiviMailchimp_BAO_SyncLog::clearQueueItem($civicrm_queue_item_id);
         CRM_CiviMailchimp_BAO_SyncLog::clearMessage($message_id);
     } catch (Exception $e) {
         $error = array('status' => 'error', 'code' => get_class($e), 'message' => $e->getMessage(), 'exception' => $e);
         // CRM-11831 @see http://www.malsup.com/jquery/form/#file-upload
         if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
             header('Content-Type: application/json');
         }
         echo json_encode($error);
         CRM_Core_Error::debug_var('Fatal Error Details', $error);
         CRM_Core_Error::backtrace('backTrace', TRUE);
         CRM_Utils_System::civiExit();
     }
 }
function civicrm_api3_civi_mailchimp_sync($params)
{
    CRM_CiviMailchimp_BAO_SyncLog::deleteOldMessages();
    $records_to_process = $params['records_to_process_per_run'];
    $queue = CRM_Queue_Service::singleton()->create(array('type' => 'Sql', 'name' => 'mailchimp-sync', 'reset' => FALSE));
    if ($queue->numberOfItems() > 0) {
        $runner = new CRM_Queue_Runner(array('title' => ts('Sync Contacts to Mailchimp'), 'queue' => $queue));
        $continue_to_next_item = TRUE;
        $records_processed = 0;
        while ($continue_to_next_item && $records_processed < $records_to_process) {
            $record = $runner->runNext();
            if ($record['is_error']) {
                // Get the current Queue Item being worked on to allow for better error
                // reporting and logging.
                $query = "\n          SELECT\n            id,\n            data\n          FROM\n            civicrm_queue_item\n          WHERE\n            queue_name = 'mailchimp-sync'\n          ORDER BY\n            weight ASC,\n            id ASC\n          LIMIT 1\n        ";
                $item = CRM_Core_DAO::executeQuery($query);
                while ($item->fetch()) {
                    $item_data = unserialize($item->data);
                    $message = "[{$item_data->arguments[0]}] There was an error syncing contacts to Mailchimp.";
                    $exception_name = '';
                    if (!empty($record['exception'])) {
                        $exception_name = get_class($record['exception']);
                        $message = "[{$item_data->arguments[0]}] {$exception_name}: {$record['exception']->getMessage()}.";
                    }
                    $message .= " Mailchimp List ID: {$item_data->arguments[1]}. {$records_processed} records were successfully synced before this error.";
                    $error = array('code' => $exception_name, 'message' => $message, 'exception' => $record['exception']);
                    CRM_Core_Error::debug_var('Fatal Error Details', $error);
                    CRM_Core_Error::backtrace('backTrace', TRUE);
                    CRM_CiviMailchimp_BAO_SyncLog::saveMessage('error', 'civicrm_to_mailchimp', $message, $item_data, $item->id);
                    return civicrm_api3_create_error($message);
                }
            }
            $continue_to_next_item = $record['is_continue'];
            $records_processed++;
        }
        $message = ts('%1 records were successfully synced to Mailchimp.', array(1 => $records_processed));
        CRM_CiviMailchimp_BAO_SyncLog::saveMessage('success', 'civicrm_to_mailchimp', $message);
        return civicrm_api3_create_success($records_processed);
    }
}
 static function forceCiviToMailchimpSync($mailchimp_sync_setting)
 {
     $contacts = CRM_CiviMailchimp_Utils::getActiveGroupMembers($mailchimp_sync_setting->civicrm_group_id);
     $skipped_contacts = 0;
     foreach ($contacts as $key => $contact_id) {
         $contact = CRM_CiviMailchimp_Utils::getContactById($contact_id);
         if ($contact->is_deleted != 1) {
             $email = CRM_CiviMailchimp_Utils::determineMailchimpEmailForContact($contact);
             if ($email === NULL) {
                 ++$skipped_contacts;
                 unset($contacts[$key]);
             } else {
                 $merge_fields = CRM_CiviMailchimp_Utils::getMailchimpMergeFields($mailchimp_sync_setting->mailchimp_list_id);
                 $merge_vars = CRM_CiviMailchimp_Utils::formatMailchimpMergeVars($merge_fields, $contact);
                 CRM_CiviMailchimp_Utils::subscribeContactToMailchimpList($mailchimp_sync_setting->mailchimp_list_id, $email, $merge_vars);
             }
         }
     }
     if ($skipped_contacts > 0) {
         $message = ts('%1 records were not synced to Mailchimp because they did not have a valid email address.', array(1 => $skipped_contacts));
         CRM_CiviMailchimp_BAO_SyncLog::saveMessage('error', 'civicrm_to_mailchimp', $message);
     }
     return $contacts;
 }
/**
 * Implementation of hook_civicrm_buildForm
 */
function civimailchimp_civicrm_buildForm($formName, &$form)
{
    // Render any Sync Log Messages.
    if (CRM_Core_Permission::check('administer CiviCRM')) {
        CRM_CiviMailchimp_BAO_SyncLog::renderMessages();
    }
    // Don't display the Mailchimp fields if this is a Smart Group.
    if ($formName === "CRM_Group_Form_Edit" && empty($form->_defaultValues['saved_search_id'])) {
        $interest_groups_lookup = array();
        try {
            $mailchimp_lists = CRM_CiviMailchimp_Utils::getLists();
        } catch (Exception $e) {
            $mailchimp_lists = NULL;
            civimailchimp_catch_mailchimp_api_error($e);
        }
        if ($mailchimp_lists) {
            $group_id = $form->getVar('_id');
            $list_options = CRM_CiviMailchimp_Utils::formatListsAsSelectOptions($mailchimp_lists);
            $interest_groups_lookup = CRM_CiviMailchimp_Utils::formatInterestGroupsLookup($mailchimp_lists);
            $interest_groups_options = '';
            if ($group_id) {
                $mailchimp_sync_settings = CRM_CiviMailchimp_BAO_SyncSettings::findByGroupId($group_id);
                if ($mailchimp_sync_settings) {
                    if (isset($interest_groups_lookup[$mailchimp_sync_settings->mailchimp_list_id])) {
                        $interest_groups_options = $interest_groups_lookup[$mailchimp_sync_settings->mailchimp_list_id];
                    }
                    civimailchimp_civicrm_setDefaults($form, $mailchimp_sync_settings);
                }
            }
            $form->add('select', 'mailchimp_list', ts('Mailchimp List'), $list_options, FALSE, array('class' => 'crm-select2'));
            $form->add('select', 'mailchimp_interest_groups', ts('Mailchimp Interest Groups'), $interest_groups_options, FALSE, array('multiple' => 'multiple', 'class' => 'crm-select2'));
            $form->assign('mailchimp_lists', TRUE);
        }
        CRM_Core_Resources::singleton()->addScriptFile('com.giantrabbit.civimailchimp', 'js/group_add_edit_form.js')->addSetting(array('civiMailchimp' => array('interest_groups_lookup' => $interest_groups_lookup)));
    }
}
 static function createTestLogMessage($message, $details = NULL, $direction = 'civicrm_to_mailchimp', $type = 'error', $civicrm_queue_item_id = NULL)
 {
     $mailchimp_sync_log = CRM_CiviMailchimp_BAO_SyncLog::saveMessage($type, $direction, $message, $details, $civicrm_queue_item_id);
     return $mailchimp_sync_log;
 }
 function test_civicrm_api3_civi_mailchimp_sync_exception()
 {
     $mailchimp_list_id = 'MailchimpListsTestListA';
     $mailchimp_interest_groups = array('MailchimpTestInterestGroupingA_MailchimpTestInterestGroupA', 'MailchimpTestInterestGroupingA_MailchimpTestInterestGroupC');
     $mailchimp_sync_setting = CRM_CiviMailchimp_BAO_SyncSettingsTest::createTestGroupAndSyncSettings('Test Group test_civicrm_api3_civi_mailchimp_sync_exception', $mailchimp_list_id, $mailchimp_interest_groups);
     $merge_fields = CRM_CiviMailchimp_Utils::getMailchimpMergeFields();
     $params = CRM_CiviMailchimp_UtilsTest::sampleContactParams();
     $contact = CRM_Contact_BAO_Contact::create($params);
     $merge_vars = CRM_CiviMailchimp_Utils::formatMailchimpMergeVars($merge_fields, $contact);
     CRM_CiviMailchimp_Utils::addMailchimpSyncQueueItem('subscribeContactToMailchimpList', 'MailchimpListsTestListB', $params['email'][0]['email'], $merge_vars);
     $action = 'unsubscribeContactFromMailchimpList';
     CRM_CiviMailchimp_Utils::addMailchimpSyncQueueItem('unsubscribeContactFromMailchimpList', 'MailchimpListsTestListB', $params['email'][0]['email']);
     $job_params['records_to_process_per_run'] = 100;
     civicrm_api3_civi_mailchimp_sync($job_params);
     $queue = CRM_Queue_Service::singleton()->create(array('type' => 'Sql', 'name' => 'mailchimp-sync', 'reset' => FALSE));
     $message = CRM_CiviMailchimp_BAO_SyncLog::getLatestUnclearedCiviToMailchimpErrorMessage();
     $this->assertEquals(2, $queue->numberOfItems());
     $this->assertNotNull($message);
 }