/** * 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; }