function MembershipAutoRenewal()
{
    global $debug;
    $config =& CRM_Core_Config::singleton();
    require_once 'CRM/Utils/System.php';
    require_once 'CRM/Utils/Hook.php';
    require_once 'api/v2/Contribution.php';
    require_once 'api/v2/MembershipContributionLink.php';
    // Select all membership types which are 'auto-renew' required (table field `auto_renew` = 2)
    $membershipTypeArray = array();
    $membershipTypeFeeArray = array();
    $query = "SELECT * FROM civicrm_membership_type WHERE auto_renew = '2'";
    $dao = CRM_Core_DAO::executeQuery($query);
    while ($dao->fetch()) {
        $membershipTypeArray[] = $dao->id;
        $membershipTypeFeeArray[$dao->id] = $dao->minimum_fee;
    }
    $membershipTypes = @implode(',', $membershipTypeArray);
    //echo $membershipTypes;
    //$current_date = date("Y-m-d");
    //$temp_date = strtotime($current_date);
    $count = 0;
    $contactArray = array();
    if ($membershipTypes) {
        // Select all memberships which are auto-renew membership types
        // And status is grace (table field `status_id` = 3)
        //$dtFirstDay = date("YmdHis", mktime(0, 0, 0, date("m") , 1, date("Y")));
        //$dtLastDay = date('YmdHis',strtotime('-1 second',strtotime('+1 month',strtotime(date('m').'/01/'.date('Y').' 00:00:00'))));
        $dtFirstDay = '20111001000000';
        $dtLastDay = '20111031235959';
        $member_sql = "SELECT cm.id as membership_id , cm.contact_id as contact_id , cm.membership_type_id as membership_type_id ,cm.end_date as end_date ,\n                      cmt.duration_interval as duration_interval , cmt.duration_unit as duration_unit     \n                      FROM civicrm_membership cm \n                      JOIN civicrm_membership_type cmt ON cm.membership_type_id = cmt.id\n                      LEFT JOIN civicrm_value_payment_method cpm ON cm.id = cpm.entity_id\n                      WHERE cm.membership_type_id IN ({$membershipTypes}) AND cm.end_date >= '{$dtFirstDay}' AND cm.end_date <= '{$dtLastDay}'\n                      AND cm.status_id IN (2,3,8) AND cpm.direct_debit = 1";
        //AND cm.status_id = 3
        //echo $member_sql;exit;
        $member_dao = CRM_Core_DAO::executeQuery($member_sql);
        $count = 0;
        while ($member_dao->fetch()) {
            //print_r ($member_dao);exit;
            $membership_id = $member_dao->membership_id;
            $contact_id = $member_dao->contact_id;
            $mem_end_date = $member_dao->end_date;
            $temp_date = strtotime($mem_end_date);
            //print_r ($member_dao);echo "<hr />";
            //$temp_sql = "SELECT cmp.contribution_id as contribution_id FROM civicrm_membership_payment cmp WHERE cmp.membership_id = '$membership_id' ORDER BY cmp.contribution_id DESC";
            //$temp_dao = CRM_Core_DAO::executeQuery( $temp_sql );
            //$temp_dao->fetch();
            //$source_contribution_id = $temp_dao->contribution_id;
            //require_once 'CRM/Contribute/DAO/Contribution.php';
            //$cdao = new CRM_Contribute_DAO_Contribution();
            //$cdao->id = $source_contribution_id;
            //$cdao->find(true);
            //receive_date
            $params = array();
            $total_amount = $membershipTypeFeeArray[$member_dao->membership_type_id];
            $params = array('contact_id' => $member_dao->contact_id, 'receive_date' => date('YmdHis'), 'total_amount' => $total_amount, 'fee_amount' => $total_amount, 'source' => 'Auto-Renewal for Membership Id :' . $membership_id, 'contribution_status_id' => 2, 'note' => 'Auto-Renewal for Membership Id :' . $membership_id, 'contribution_type_id' => 2);
            $contribution =& civicrm_contribution_add($params);
            //print_r( $contribution );
            $contribution_id = $contribution['id'];
            $duration_interval = $member_dao->duration_interval;
            $duration_unit = $member_dao->duration_unit;
            $next_collectionDate = strtotime("+{$duration_interval} {$duration_unit}", $temp_date);
            $next_collectionDate = date('YmdHis', $next_collectionDate);
            $update_sql = "UPDATE civicrm_membership SET end_date = '{$next_collectionDate}' , status_id = '2' WHERE id = '{$membership_id}'";
            CRM_Core_DAO::executeQuery($update_sql);
            //Create membership Payment
            $params = array('contribution_id' => $contribution_id, 'membership_id' => $membership_id);
            $membershipPayment = civicrm_membershipcontributionlink_create($params);
            //$contribution_sql = "SELECT * FROM civicrm_value_direct_debit_details WHERE entity_id = '$source_contribution_id'";
            //$contribution_dao = CRM_Core_DAO::executeQuery( $contribution_sql );
            //$contribution_dao->fetch();
            //$mandate_id = $contribution_dao->mandate_id;
            //$contributionTypeName = CRM_Contribute_PseudoConstant::contributionType($cdao->contribution_type_id);
            //$mandate_sql = "SELECT * FROM civicrm_value_bank_details WHERE entity_id = '$contact_id' AND is_default = '1'";
            $mandate_sql = "SELECT * FROM civicrm_value_bank_details WHERE entity_id = '{$contact_id}'";
            $mandate_dao = CRM_Core_DAO::executeQuery($mandate_sql);
            $mandate_dao->fetch();
            $mandate_id = $mandate_dao->id;
            //$mandate_sql = "SELECT * FROM civicrm_value_bank_details WHERE id = '$mandate_id'";
            //$mandate_dao = CRM_Core_DAO::executeQuery( $mandate_sql );
            //$mandate_dao->fetch();
            if ($mandate_dao->collection_day) {
                $collection_day = $mandate_dao->collection_day;
            } else {
                $collection_day = 20;
            }
            //$next_collectionDate = get_valid_next_collection_date($collection_day , date("m") , 'YmdHis' );
            $next_collectionDate = '20111020000000';
            require_once 'api/v2/Activity.php';
            $params = array('activity_type_id' => CIVICRM_DIRECT_DEBIT_STANDARD_PAYMENT_ACTIVITY_ID, 'source_contact_id' => $contact_id, 'target_contact_id' => $contact_id, 'subject' => "Member Dues, Mandate Id - " . $mandate_id, 'status_id' => 1, 'activity_date_time' => $next_collectionDate);
            $act = civicrm_activity_create($params);
            $activity_id = $act['id'];
            if ($mandate_id != null) {
                $sql = "INSERT INTO civicrm_value_activity_bank_relationship SET entity_id = '{$activity_id}', bank_id = '{$mandate_id}'";
                $dao = CRM_Core_DAO::executeQuery($sql);
                $sql = "INSERT INTO civicrm_value_direct_debit_details SET activity_id = '{$activity_id}' , entity_id = '{$contribution_id}' , mandate_id = '{$mandate_id}'";
                $dao = CRM_Core_DAO::executeQuery($sql);
            }
            //CRM_Core_DAO::executeQuery( "UPDATE civicrm_value_bank_details SET bacs_code = '17' WHERE id = '$mandate_id'" );
            //$log_note = "Auto Renewal: Contact Id - $contact_id, Membership Id - $membership_id , Created Contribtion Id - $contribution_id";
            //$log_date = date("jS F Y - h:i:s A");
            //$log_query = "INSERT INTO civicrm_auto_renewal_log SET log_date = '$log_date' , log_summary = '$log_note'";
            //CRM_Core_DAO::executeQuery( $log_query );
            $url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$contact_id}");
            $contactArray[] = " Contact ID: " . $contact_id . "  - <a href =\"{$url}\"> " . $contact_id . " </a> ";
            $count++;
        }
        //exit;
    }
    echo "Membership renewed: " . $count . "<br />";
    if (count($contactArray) > 0) {
        echo $status = implode('<br/>', $contactArray);
    }
}
 /**
  * Test civicrm_membershipcontributionlink_get - success expected.
  */
 public function testGet()
 {
     $contactId = Contact::createIndividual();
     $params = array('contact_id' => $contactId, 'currency' => 'USD', 'contribution_type_id' => $this->_contributionTypeID, 'contribution_status_id' => 1, 'contribution_page_id' => null, 'payment_instrument_id' => 1, 'id' => null, 'total_amount' => 200.0);
     require_once 'CRM/Contribute/BAO/Contribution.php';
     $contribution = CRM_Contribute_BAO_Contribution::create($params, $ids);
     $params = array('contact_id' => $contactId, 'membership_type_id' => $this->_membershipTypeID, 'source' => 'Payment', 'is_override' => 1, 'status_id' => $this->_membershipStatusID);
     $ids = array();
     $membership = CRM_Member_BAO_Membership::create($params, $ids);
     $params = array('contribution_id' => $contribution->id, 'membership_id' => $membership->id);
     $Create = civicrm_membershipcontributionlink_create($params);
     $GetParams = civicrm_membershipcontributionlink_get(&$params);
     $this->assertEquals($GetParams[$Create['id']]['membership_id'], $membership->id, 'Check Membership Id');
     $this->assertEquals($GetParams[$Create['id']]['contribution_id'], $contribution->id, 'Check Contribution Id');
 }