/**
  * Collect CiviCRM data into temporary working table.
  */
 static function syncPullCollectCiviCRM(CRM_Queue_TaskContext $ctx, $listID)
 {
     // Shared process.
     $stats[$listID]['c_count'] = CRM_Mailchimp_Form_Sync::syncCollectCiviCRM($listID);
     // Remove identicals
     $stats[$listID]['in_sync'] = CRM_Mailchimp_Form_Sync::syncIdentical();
     static::updatePullStats($stats);
     return CRM_Queue_Task::TASK_SUCCESS;
 }
/**
 * CiviCRM to Mailchimp Sync
 *
 * @param array $params
 * @return array API result descriptor
 * @see civicrm_api3_create_success
 * @see civicrm_api3_create_error
 * @throws API_Exception
 */
function civicrm_api3_mailchimp_sync($params)
{
    $groups = CRM_Mailchimp_Utils::getGroupsToSync(array(), null, $membership_only = TRUE);
    foreach ($groups as $group_id => $details) {
        $list = new Mailchimp_Lists(CRM_Mailchimp_Utils::mailchimp());
        $webhookoutput = $list->webhooks($details['list_id']);
        if ($webhookoutput[0]['sources']['api'] == 1) {
            return civicrm_api3_create_error('civicrm_api3_mailchimp_sync -  API is set in Webhook setting for listID ' . $details['list_id'] . ' Please uncheck API');
        }
    }
    $result = $pullResult = array();
    // Do pull first from mailchimp to CiviCRM
    $pullRunner = CRM_Mailchimp_Form_Pull::getRunner($skipEndUrl = TRUE);
    if ($pullRunner) {
        $pullResult = $pullRunner->runAll();
    }
    // Do push from CiviCRM to mailchimp
    $runner = CRM_Mailchimp_Form_Sync::getRunner($skipEndUrl = TRUE);
    if ($runner) {
        $result = $runner->runAll();
    }
    if ($pullResult['is_error'] == 0 && $result['is_error'] == 0) {
        return civicrm_api3_create_success();
    } else {
        return civicrm_api3_create_error();
    }
}
/**
 * CiviCRM to Mailchimp Sync
 *
 * @param array $params
 * @return array API result descriptor
 * @see civicrm_api3_create_success
 * @see civicrm_api3_create_error
 * @throws API_Exception
 */
function civicrm_api3_mailchimp_sync($params)
{
    $result = $pullResult = array();
    // Do pull first from mailchimp to CiviCRM
    $pullRunner = CRM_Mailchimp_Form_Pull::getRunner($skipEndUrl = TRUE);
    if ($pullRunner) {
        $pullResult = $pullRunner->runAll();
    }
    // Do push from CiviCRM to mailchimp
    $runner = CRM_Mailchimp_Form_Sync::getRunner($skipEndUrl = TRUE);
    if ($runner) {
        $result = $runner->runAll();
    }
    if ($pullResult['is_error'] == 0 && $result['is_error'] == 0) {
        return civicrm_api3_create_success();
    } else {
        return civicrm_api3_create_error();
    }
}
/**
 * CiviCRM to Mailchimp Push Sync.
 *
 * This is a schedulable job.
 *
 * Note this was previously named 'sync' and did a pull, then a push request.
 * However this is problematic because each of these syncs brings the membership
 * exactly in-line, so there's nothing for the 'push' to do anyway. The pull
 * will remove any contacts from the synced membership group that are not in the
 * Mailchimp list. This means any contacts added to the membership group that
 * have not been sent up to Mailchimp (there are several scenarios when this
 * happens: bulk additions, smart groups, ...) will be removed from the group
 * before they've ever been subscribed.
 *
 * @param array $params
 * @return array API result descriptor
 * @see civicrm_api3_create_success
 * @see civicrm_api3_create_error
 * @throws API_Exception
 */
function civicrm_api3_mailchimp_pushsync($params)
{
    // Do push from CiviCRM to mailchimp
    $runner = CRM_Mailchimp_Form_Sync::getRunner($skipEndUrl = TRUE);
    if ($runner) {
        $result = $runner->runAll();
    }
    if ($result['is_error'] == 0) {
        return civicrm_api3_create_success();
    } else {
        if (isset($result['exception']) && $result['exception'] instanceof Exception) {
            return civicrm_api3_create_error($result['exception']->getMessage());
        }
        return civicrm_api3_create_error('Unknown error');
    }
}