Esempio n. 1
0
 /**
  * Hook which gets called when the Web Connector authenticates to the server
  * 
  * @param string $requestID			Not applicable to this hook
  * @param string $user				The username of the user who connected
  * @param string $hook				The name of the hook which connected
  * @param string $err				If an error occurs, you should return an error message here
  * @param array $hook_data			An array of hook data
  * @param array $callback_config	An array of callback configuration params
  * @return boolean
  */
 public static function onAuthenticate($requestID, $user, $hook, &$err, $hook_data, $callback_config)
 {
     // $requestID, $user, $hook, &$err, $hook_data, $callback_config
     // Driver instance
     $Driver = QuickBooks_Driver_Singleton::getInstance();
     // Mode (read-onlyl, write-only, read/write)
     $mode = $callback_config['mode'];
     // How often recurring events happen
     $run_every = $callback_config['recur'];
     // $map parameter
     $sql_map = $callback_config['map'];
     //print_r($callback_config);
     //exit;
     // Which things do you want to query? (QuickBooks => SQL database)
     $sql_query = array();
     foreach (QuickBooks_Utilities::listActions('*QUERY*') as $action) {
         $sql_query[$action] = QuickBooks_Utilities::priorityForAction($action);
     }
     $sql_query = QuickBooks_Server_SQL_Callbacks::_filterActions($sql_query, $callback_config['_only_query'], $callback_config['_dont_query'], QUICKBOOKS_QUERY);
     // Which things you want to *add* to QuickBooks (SQL => QuickBooks (adds only!))
     //	@todo These should be changed to use QuickBooks_Utilities::listActions('*ADD*')
     foreach (QuickBooks_Utilities::listActions('*ADD*') as $action) {
         $sql_add[$action] = QuickBooks_Utilities::priorityForAction($action);
     }
     $sql_add = QuickBooks_Server_SQL_Callbacks::_filterActions($sql_add, $callback_config['_only_add'], $callback_config['_dont_add'], QUICKBOOKS_ADD);
     // Which things you want to *modify* in QuickBooks (SQL => QuickBooks (modifys only!))
     //	@todo These should be changed to use QuickBooks_Utilities::listActions('*MOD*')
     foreach (QuickBooks_Utilities::listActions('*MOD*') as $action) {
         $sql_mod[$action] = QuickBooks_Utilities::priorityForAction($action);
     }
     $sql_mod = QuickBooks_Server_SQL_Callbacks::_filterActions($sql_mod, $callback_config['_only_modify'], $callback_config['_dont_modify'], QUICKBOOKS_MOD);
     // Queueing class
     //$Queue = new QuickBooks_Queue($dsn_or_conn);
     if ($mode == QUICKBOOKS_SERVER_SQL_MODE_READONLY or $mode == QUICKBOOKS_SERVER_SQL_MODE_READWRITE) {
         //print_r($sql_query);
         //print_r($sql_map);
         // Register recurring events for things you want to query
         foreach ($sql_query as $action => $priority) {
             // Make sure that there are handlers registered for this recurring action
             if (!isset($sql_map[$action])) {
                 //trigger_error('No registered handler for: ' . $action);
                 continue;
             }
             //$Queue->recurring($run_every, $action, md5(__FILE__), $priority, null, $user);
             $Driver->recurEnqueue($user, $run_every, $action, md5(__FILE__), true, $priority);
         }
     }
     // Objects that need to be *ADDED* to QuickBooks
     if ($mode == QUICKBOOKS_SERVER_SQL_MODE_WRITEONLY or $mode == QUICKBOOKS_SERVER_SQL_MODE_READWRITE) {
         // Check if any objects need to be pushed back to QuickBooks
         foreach ($sql_add as $action => $priority) {
             $object = QuickBooks_Utilities::actionToObject($action);
             $table_and_field = array();
             // Convert to table and primary key, select qbsql id
             QuickBooks_SQL_Schema::mapPrimaryKey($object, QUICKBOOKS_SQL_SCHEMA_MAP_TO_SQL, $table_and_field);
             //print_r($table_and_field);
             if (!empty($table_and_field[0]) and !empty($table_and_field[1])) {
                 $sql = "\n\t\t\t\t\t\tSELECT \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_ID . "\n\t\t\t\t\t\tFROM \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_PREFIX_SQL . $table_and_field[0] . " \n\t\t\t\t\t\tWHERE \n\t\t\t\t\t\t\t " . QUICKBOOKS_DRIVER_SQL_FIELD_MODIFY . " IS NOT NULL AND \n\t\t\t\t\t\t\t " . QUICKBOOKS_DRIVER_SQL_FIELD_RESYNC . " IS NULL AND \n\t\t\t\t\t\t\t " . QUICKBOOKS_DRIVER_SQL_FIELD_TO_SKIP . " != 1 ";
                 $errnum = 0;
                 $errmsg = '';
                 $res = $Driver->query($sql, $errnum, $errmsg);
                 while ($arr = $Driver->fetch($res)) {
                     $Driver->queueEnqueue($user, $action, $arr[QUICKBOOKS_DRIVER_SQL_FIELD_ID], true, $priority);
                 }
             }
         }
     }
     // Objects that need to be *MODIFIED* within QuickBooks
     if ($mode == QUICKBOOKS_SERVER_SQL_MODE_WRITEONLY or $mode == QUICKBOOKS_SERVER_SQL_MODE_READWRITE) {
         // Check if any objects need to be pushed back to QuickBooks
         foreach ($sql_mod as $action => $priority) {
             $object = QuickBooks_Utilities::actionToObject($action);
             $table_and_field = array();
             // Convert to table and primary key, select qbsql id
             QuickBooks_SQL_Schema::mapPrimaryKey($object, QUICKBOOKS_SQL_SCHEMA_MAP_TO_SQL, $table_and_field);
             $Driver->log('Searching table: ' . QUICKBOOKS_DRIVER_SQL_PREFIX_SQL . $table_and_field[0] . ' for MODIFIED records.', null, QUICKBOOKS_LOG_DEBUG);
             // If we managed to map a table, we need to search that table for changed records
             if (!empty($table_and_field[0]) and !empty($table_and_field[1])) {
                 $sql = "\n\t\t\t\t\t\tSELECT \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_ID . "\n\t\t\t\t\t\tFROM \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_PREFIX_SQL . $table_and_field[0] . " \n\t\t\t\t\t\tWHERE \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_DISCOVER . " IS NOT NULL AND \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_RESYNC . " IS NOT NULL AND\n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_MODIFY . " > " . QUICKBOOKS_DRIVER_SQL_FIELD_RESYNC . " AND\n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_TO_DELETE . " != 1 AND \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_TO_SKIP . " != 1 ";
                 $errnum = 0;
                 $errmsg = '';
                 $res = $Driver->query($sql, $errnum, $errmsg);
                 while ($arr = $Driver->fetch($res)) {
                     $Driver->queueEnqueue($user, $action, $arr[QUICKBOOKS_DRIVER_SQL_FIELD_ID], true, $priority);
                 }
             }
         }
     }
     if ($mode == QUICKBOOKS_SERVER_SQL_MODE_WRITEONLY or $mode == QUICKBOOKS_SERVER_SQL_MODE_READWRITE) {
         // Check if any *deleted* objects need to be deleted from QuickBooks
         foreach ($sql_add as $action => $priority) {
             $priority = 1000 - $priority;
             $object = QuickBooks_Utilities::actionToObject($action);
             $table_and_field = array();
             // Convert to table and primary key, select qbsql id
             QuickBooks_SQL_Schema::mapPrimaryKey($object, QUICKBOOKS_SQL_SCHEMA_MAP_TO_SQL, $table_and_field);
             if (!empty($table_and_field[0])) {
                 $sql = "\n\t\t\t\t\t\tSELECT \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_FIELD_ID . "\n\t\t\t\t\t\tFROM \n\t\t\t\t\t\t\t" . QUICKBOOKS_DRIVER_SQL_PREFIX_SQL . $table_and_field[0] . " \n\t\t\t\t\t\tWHERE \n\t\t\t\t\t\t\t " . QUICKBOOKS_DRIVER_SQL_FIELD_TO_DELETE . " = 1 ";
                 $errnum = 0;
                 $errmsg = '';
                 $res = $Driver->query($sql, $errnum, $errmsg);
                 $key = QuickBooks_Utilities::keyForAction($action);
                 if ($key == 'ListID') {
                     $useAction = 'ListDel';
                 } else {
                     $useAction = 'TxnDel';
                 }
                 $extra['objectType'] = $object;
                 while ($arr = $Driver->fetch($res)) {
                     $Driver->queueEnqueue($user, $useAction, $extra['objectType'] . $arr[QUICKBOOKS_DRIVER_SQL_FIELD_ID], true, $priority, $extra);
                 }
             }
         }
     }
     return true;
 }