Ejemplo n.º 1
0
 /**
  * _Heartbeat method
  *
  * Hourly periodic rotine
  *
  * @param mixed $console
  * @return array
  */
 function _HeartbeatHourly($console)
 {
     App::uses('LilCrmGoogleContactsApi', 'LilCrm.Lib');
     App::uses('LilCrmGoogleGroups', 'LilCrm.Lib');
     App::uses('LilCrmGoogleGroup', 'LilCrm.Lib');
     App::uses('LilCrmGoogleGroups', 'LilCrm.Lib');
     App::uses('LilCrmGoogleGroup', 'LilCrm.Lib');
     if (!($lastUpdated = Cache::read('LilCrm.lastGoogleSync', 'Lil'))) {
         $lastUpdated = strftime('%Y-%m-%d %H:%M:%S', 0);
     }
     $Contact = ClassRegistry::init('LilCrm.Contact');
     $contacts = $Contact->find('all', array('conditions' => array('Contact.kind' => 'T', 'Contact.syncable' => true, 'Contact.modified >=' => $lastUpdated), 'contain' => array('ContactsEmail', 'ContactsPhone', 'ContactsAddress', 'Company')));
     // setup last update
     Cache::write('LilCrm.lastGoogleSync', strftime('%Y-%m-%d %H:%M:%S', time()), 'Lil');
     if (empty($contacts)) {
         return;
     }
     $User = ClassRegistry::init('LilCrm.Contact');
     $User->bindModel(array('hasOne' => array('PrimaryEmail' => array('className' => 'LilCrm.ContactsEmail', 'type' => 'INNER', 'foreignKey' => 'contact_id', 'conditions' => array('PrimaryEmail.primary' => true)))), false);
     $sync_users = $User->find('all', array('conditions' => array('NOT' => array(0 => array('Contact.username' => null), 1 => array('Contact.oauth_token' => null))), 'contain' => array('PrimaryEmail')));
     foreach ($sync_users as $sync_user) {
         $api = new LilCrmGoogleContactsApi($sync_user['PrimaryEmail']['email'], $sync_user['Contact']['oauth_token']);
         if (!$api->ready) {
             CakeLog::write('error', sprintf("Cannot get access token for user %s.", $sync_user['PrimaryEmail']['email']));
             continue 1;
         }
         if ($myContactsGroup = $api->fetchSystemGroup()) {
             // fetch all contacts
             $cs = $api->fetchContacts();
             foreach ($contacts as $c) {
                 if (!($gc = $cs->extractByLilContactId($c['Contact']['id']))) {
                     $gc = new LilCrmGoogleContact();
                 }
                 $gc->name = $c['Contact']['title'];
                 $gc->clearEmails();
                 foreach ($c['ContactsEmail'] as $email) {
                     $gc->addEmail(array('address' => $email['email'], 'primary' => $email['primary'], 'kind' => $email['kind']));
                 }
                 $gc->clearPhones();
                 foreach ($c['ContactsPhone'] as $phone) {
                     if (!empty($phone['no'])) {
                         $gc->addPhone(array('no' => $phone['no'], 'kind' => $phone['kind']));
                     }
                 }
                 $gc->clearAddresses();
                 foreach ($c['ContactsAddress'] as $address) {
                     $gc->addAddress(array('street' => $address['street'], 'zip' => $address['zip'], 'city' => $address['city'], 'primary' => $address['primary'], 'kind' => $address['kind']));
                 }
                 $gc->clearOrganizations();
                 if (!empty($c['Company']['title'])) {
                     $gc->addOrganization(array('title' => $c['Company']['title'], 'job' => $c['Contact']['job']));
                 }
                 $gc->clearGroups();
                 $gc->addGroup($myContactsGroup->id);
                 $gc->addProperty('lil_crm-id', $c['Contact']['id']);
                 if (!$gc->id) {
                     $res = $api->createContact($gc);
                 } else {
                     $res = $api->updateContact($gc);
                 }
                 unset($gc);
             }
             // remaining contacts are not in local database; they can be deleted.
             foreach ($cs as $c) {
                 $api->deleteContact($c);
             }
         }
         unset($api);
     }
 }