/** * * * @param string $method * @param string $action * @param string $type * @param string $qbxml * @param array $callbacks * @param mixed $uniqueid * @param integer $priority * @param string $err * @param integer $recur * @return boolean */ public function handleQBXML($method, $action, $type, $qbxml, $callbacks, $uniqueid, $priority, &$err, $recur = null) { $this->_setError(QUICKBOOKS_API_ERROR_OK); // Make sure we have a session ticket if (!$this->_isSignedOn()) { $this->_signOn(); if ($this->errorNumber()) { return false; } } // @TODO Determine $action if it's not set // If a unique ID wasn't provided, we'll make one up if (strlen($uniqueid) == 0) { $uniqueid = md5(time() . $this->_user . mt_rand()); } // The qbXML requests that get passed to this function are without the // typical qbXML wrapper info, so we need to modify them to make them // into complete, valid requests. $qbxml = $this->_makeValidQBXML($qbxml, $this->_config['qbxml_version'], $this->_config['qbxml_onerror']); //$requestID = null; $extra = array('callbacks' => $callbacks); $last_action_time = null; $last_actionident_time = null; $qb_identifiers = array(); // Send the request to QuickBooks Online Edition $response = $this->_request($qbxml); // Try to map the response to QuickBooks objects $map = array(QUICKBOOKS_ADD_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerAddResponse'), QUICKBOOKS_MOD_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerModResponse'), QUICKBOOKS_QUERY_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerQueryResponse'), '*' => array('', 'QuickBooks_Callbacks_API_Callbacks::RawQBXMLResponse')); //print($qbxml); //print('CALL THIS: QuickBooks_Server_API_Callbacks::' . $action . 'Response'); //print($response); return QuickBooks_Callbacks::callResponseHandler($this->_driver, $map, $action, $this->_user, $action, $uniqueid, $extra, $err, $last_action_time, $last_actionident_time, $response, $qb_identifiers); //exit; /* if ($recur) { return false; } else { return $this->_driver->queueEnqueue($this->_user, $action, $uniqueid, true, $priority, $extra, $qbxml); } */ }
/** * * * @param string $hook * @param string $requestID * @param string $user * @param string $ticket * @param string $err * @param array $hook_data * @return boolean */ protected function _callHooks($hook, $requestID, $user, $ticket, &$err, $hook_data) { $err = ''; return QuickBooks_Callbacks::callHook($this->_driver, $this->_hooks, $hook, $requestID, $user, $ticket, $err, $hook_data, $this->_callback_config); }
/** * Call an error-handler function and update the status of a request to ERROR * * @param string $ticket * @param integer $errnum The error number from QuickBooks (see the QuickBooks SDK/IDN for a list of error codes) * @param string $errmsg The error message from QuickBooks * @param string $requestID * @param string $action * @param mixed $ident * @param array $extra * @param string $err * @param string $xml * @param array $qb_identifiers */ protected function _handleError($ticket, $errnum, $errmsg, $requestID, $action, $ident, $extra, &$err, $xml = '', $qb_identifiers = array()) { // , $requestID, $user, $action, $ident, $extra, &$err, $xml, $qb_identifier // Call the error handler (if one is set) // First, set the status of the item to error if ($action and $ident) { $this->_driver->queueStatus($ticket, $action, $ident, QUICKBOOKS_STATUS_ERROR, $errnum . ': ' . $errmsg); } // Log the last error (for the ticket) $this->_driver->errorLog($ticket, $errnum, $errmsg); $this->_driver->log('Attempting to handle error: ' . $errnum . ', ' . $errmsg); // By default, we don't want to continue if the error is not handled $continue = false; // Get username of user which experienced the error $user = $this->_driver->authResolve($ticket); // CALL THE ERROR HANDLER $err = ''; $continue = QuickBooks_Callbacks::callErrorHandler($this->_driver, $this->_onerror, $errnum, $errmsg, $user, $action, $ident, $extra, $err, $xml, $this->_callback_config); // $Driver, $errmap, $errnum, $errmsg, $user, $action, $ident, $extra, &$errerr, $xml, $callback_config if ($err) { // Log error messages returned by the error handler $this->_driver->log('An error occured while handling error: ' . $errnum . ': ' . $errmsg . ': ' . $err, $ticket, QUICKBOOKS_LOG_NORMAL); $this->_driver->errorLog($ticket, QUICKBOOKS_ERROR_HANDLER, $err); } // Log the last error (for the log) $this->_driver->log('Handled error: ' . $errnum . ': ' . $errmsg . ' (handler returned: ' . $continue . ')', $ticket, QUICKBOOKS_LOG_NORMAL); // Update the queue status if ($action and $ident) { if ($continue) { $this->_driver->queueStatus($ticket, $action, $ident, QUICKBOOKS_STATUS_HANDLED, $errnum . ': ' . $errmsg); } } return $continue; }
/** * * * @todo Support for object instance error handlers * */ public static function callErrorHandler($Driver, $errmap, $errnum, $errmsg, $user, $requestID, $action, $ident, $extra, &$errerr, $xml, $callback_config) { // $Driver, &$map, $action, $which, $user, $action, $ident, $extra, &$err, $last_action_time, $last_actionident_time, $xml_or_version = '', $qb_identifier_or_locale = array(), $callback_config = array(), $qbxml = null // Build the requestID //$requestID = QuickBooks_Utilities::constructRequestID($action, $ident); $callback = ''; /*if (is_object($this->_instance_onerror) and method_exists($this->_instance_onerror, 'e' . $errnum)) { $func = get_class($this->_instance_onerror) . '->e' . $errnum; }*/ //else if (isset($errmap[$errnum])) { $callback = $errmap[$errnum]; } else { if (isset($errmap[$action])) { $callback = $errmap[$action]; } else { if (isset($errmap['!'])) { $callback = $errmap['!']; } else { if (isset($errmap['*'])) { $callback = $errmap['*']; } } } } // Determine the type of hook $type = QuickBooks_Callbacks::_type($callback, $Driver, null); $vars = array($requestID, $user, $action, $ident, $extra, &$errerr, $xml, $errnum, $errmsg, $callback_config); $errerr = ''; if ($type == QUICKBOOKS_CALLBACKS_TYPE_OBJECT_METHOD) { $Driver->log('Object method error handler: ' . get_class($callback[0]) . '->' . $callback[1], null, QUICKBOOKS_LOG_VERBOSE); $errerr = ''; $continue = QuickBooks_Callbacks::_callObjectMethod($callback, $vars, $errerr, 5); if ($errerr) { $Driver->log('Error handler returned an error: ' . $errerr, null, QUICKBOOKS_LOG_NORMAL); return false; } } else { if ($type == QUICKBOOKS_CALLBACKS_TYPE_FUNCTION) { // It's a callback FUNCTION $Driver->log('Function error handler: ' . $callback, null, QUICKBOOKS_LOG_VERBOSE); $errerr = ''; // This is an error message *returned by* the error handler function $continue = QuickBooks_Callbacks::_callFunction($callback, $vars, $errerr, 5); //$continue = $func($requestID, $user, $action, $ident, $extra, $errerr, $xml, $errnum, $errmsg, $callback_config); if ($errerr) { $Driver->log('Error handler returned an error: ' . $errerr, null, QUICKBOOKS_LOG_NORMAL); return false; } } else { if ($type == QUICKBOOKS_CALLBACKS_TYPE_STATIC_METHOD) { // It's a callback STATIC METHOD //$tmp = explode('::', $func); //$class = trim(current($tmp)); //$method = trim(end($tmp)); $Driver->log('Static method error handler: ' . $callback, null, QUICKBOOKS_LOG_VERBOSE); $errerr = ''; $continue = QuickBooks_Callbacks::_callStaticMethod($callback, $vars, $errerr, 5); if ($errerr) { $Driver->log('Error handler returned an error: ' . $errerr, null, QUICKBOOKS_LOG_NORMAL); return false; } } else { return false; } } } return $continue; }
/** * * * @todo Implement error handling routines * * @param array $hooks * @param string $hook * @param string $requestID * @param string $user * @param string $err * @param array $hook_data * @param array $callback_config * @return boolean */ protected static function _callHooks(&$hooks, $hook, $requestID, $user, &$err, $hook_data, $callback_config = array()) { $Driver = QuickBooks_Driver_Singleton::getInstance(); return QuickBooks_Callbacks::callHook($Driver, $hooks, $hook, $requestID, $user, null, $err, $hook_data, $callback_config, __FILE__, __LINE__); }
/** * * * @param string $method * @param string $action * @param string $type * @param string $qbxml * @param array $callbacks * @param mixed $uniqueid * @param integer $priority * @param string $err * @param integer $recur * @return boolean */ public function handleQBXML($method, $action, $type, $qbxml, $callbacks, $uniqueid, $priority, &$err, $recur = null) { $this->_setError(QUICKBOOKS_API_ERROR_OK); // Make sure we have a session ticket if (!$this->_isSignedOn()) { $this->_signOn(); if ($this->errorNumber()) { return false; } } // @TODO Determine $action if it's not set // If a unique ID wasn't provided, we'll make one up if (strlen($uniqueid) == 0) { $uniqueid = md5(time() . $this->_user . mt_rand()); } // The qbXML requests that get passed to this function are without the // typical qbXML wrapper info, so we need to modify them to make them // into complete, valid requests. $qbxml = $this->_makeValidQBXML($qbxml, $this->_config['qbxml_version'], $this->_config['qbxml_onerror']); //$requestID = null; $extra = array('callbacks' => $callbacks); $last_action_time = null; $last_actionident_time = null; $qb_identifiers = array(); // Send the request to QuickBooks Online Edition $response = $this->_request($qbxml); // Try to map the response to QuickBooks objects $map = array(QUICKBOOKS_ADD_CLASS => array('', 'QuickBooks_Callbacks_API_Callbacks::ClassAddResponse'), QUICKBOOKS_QUERY_CLASS => array('', 'QuickBooks_Callbacks_API_Callbacks::ClassQueryResponse'), QUICKBOOKS_ADD_ACCOUNT => array('', 'QuickBooks_Callbacks_API_Callbacks::AccountAddResponse'), QUICKBOOKS_MOD_ACCOUNT => array('', 'QuickBooks_Callbacks_API_Callbacks::AccountModResponse'), QUICKBOOKS_QUERY_ACCOUNT => array('', 'QuickBooks_Callbacks_API_Callbacks::AccountQueryResponse'), QUICKBOOKS_ADD_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerAddResponse'), QUICKBOOKS_MOD_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerModResponse'), QUICKBOOKS_QUERY_CUSTOMER => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerQueryResponse'), QUICKBOOKS_ADD_CUSTOMERTYPE => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerTypeAddResponse'), QUICKBOOKS_QUERY_CUSTOMERTYPE => array('', 'QuickBooks_Callbacks_API_Callbacks::CustomerTypeQueryResponse'), QUICKBOOKS_ADD_DEPOSIT => array('', 'QuickBooks_Callbacks_API_Callbacks::DepositAddResponse'), QUICKBOOKS_MOD_DEPOSIT => array('', 'QuickBooks_Callbacks_API_Callbacks::DepositModResponse'), QUICKBOOKS_QUERY_DEPOSIT => array('', 'QuickBooks_Callbacks_API_Callbacks::DepositQueryResponse'), QUICKBOOKS_ADD_DATAEXT => array('', 'QuickBooks_Callbacks_API_Callbacks::DataExtAddResponse'), QUICKBOOKS_MOD_DATAEXT => array('', 'QuickBooks_Callbacks_API_Callbacks::DataExtModResponse'), QUICKBOOKS_DEL_DATAEXT => array('', 'QuickBooks_Callbacks_API_Callbacks::DataExtQueryResponse'), QUICKBOOKS_ADD_INVOICE => array('', 'QuickBooks_Callbacks_API_Callbacks::InvoiceAddResponse'), QUICKBOOKS_MOD_INVOICE => array('', 'QuickBooks_Callbacks_API_Callbacks::InvoiceModResponse'), QUICKBOOKS_QUERY_INVOICE => array('', 'QuickBooks_Callbacks_API_Callbacks::InvoiceQueryResponse'), QUICKBOOKS_ADD_EMPLOYEE => array('', 'QuickBooks_Callbacks_API_Callbacks::EmployeeAddResponse'), QUICKBOOKS_MOD_EMPLOYEE => array('', 'QuickBooks_Callbacks_API_Callbacks::EmployeeModResponse'), QUICKBOOKS_QUERY_EMPLOYEE => array('', 'QuickBooks_Callbacks_API_Callbacks::EmployeeQueryResponse'), QUICKBOOKS_ADD_ESTIMATE => array('', 'QuickBooks_Callbacks_API_Callbacks::EstimateAddResponse'), QUICKBOOKS_MOD_ESTIMATE => array('', 'QuickBooks_Callbacks_API_Callbacks::EstimateModResponse'), QUICKBOOKS_QUERY_ESTIMATE => array('', 'QuickBooks_Callbacks_API_Callbacks::EstimateQueryResponse'), QUICKBOOKS_ADD_PAYMENTMETHOD => array('', 'QuickBooks_Callbacks_API_Callbacks::PaymentAddResponse'), QUICKBOOKS_QUERY_PAYMENTMETHOD => array('', 'QuickBooks_Callbacks_API_Callbacks::PaymentQueryResponse'), QUICKBOOKS_ADD_RECEIVEPAYMENT => array('', 'QuickBooks_Callbacks_API_Callbacks::ReceivePaymentAddResponse'), QUICKBOOKS_MOD_RECEIVEPAYMENT => array('', 'QuickBooks_Callbacks_API_Callbacks::ReceivePaymentModResponse'), QUICKBOOKS_QUERY_RECEIVEPAYMENT => array('', 'QuickBooks_Callbacks_API_Callbacks::ReceivePaymentQueryResponse'), QUICKBOOKS_QUERY_ITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::Ite,QueryResponse'), QUICKBOOKS_ADD_DISCOUNTITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::DiscountItemAddResponse'), QUICKBOOKS_MOD_DISCOUNTITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::DiscountItemModResponse'), QUICKBOOKS_QUERY_DISCOUNTITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::DiscountItemQueryResponse'), QUICKBOOKS_ADD_FIXEDASSETITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::FixedAssetItemAddResponse'), QUICKBOOKS_MOD_FIXEDASSETITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::FixedAssetItemModResponse'), QUICKBOOKS_QUERY_FIXEDASSETITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::FixedAssetItemQueryResponse'), QUICKBOOKS_ADD_SERVICEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::ServiceItemAddResponse'), QUICKBOOKS_MOD_SERVICEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::ServiceItemModResponse'), QUICKBOOKS_QUERY_SERVICEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::ServiceItemQueryResponse'), QUICKBOOKS_ADD_INVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::InventoryItemAddResponse'), QUICKBOOKS_MOD_INVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::InventoryItemModResponse'), QUICKBOOKS_QUERY_INVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::InventoryItemQueryResponse'), QUICKBOOKS_ADD_NONINVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::NonInventoryItemAddResponse'), QUICKBOOKS_MOD_NONINVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::NonInventoryItemModResponse'), QUICKBOOKS_QUERY_NONINVENTORYITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::NonInventoryItemQueryResponse'), QUICKBOOKS_ADD_OTHERCHARGEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::OtherChargeItemAddResponse'), QUICKBOOKS_MOD_OTHERCHARGEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::OtherChargeItemModResponse'), QUICKBOOKS_QUERY_OTHERCHARGEITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::OtherChargeItemQueryResponse'), QUICKBOOKS_ADD_SALESTAXITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::SalesTaxItemAddResponse'), QUICKBOOKS_MOD_SALESTAXITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::SalesTaxItemModResponse'), QUICKBOOKS_QUERY_SALESTAXITEM => array('', 'QuickBooks_Callbacks_API_Callbacks::SaltesTaxItemQueryResponse'), QUICKBOOKS_ADD_SALESRECEIPT => array('', 'QuickBooks_Callbacks_API_Callbacks::SalesReceiptAddResponse'), QUICKBOOKS_MOD_SALESRECEIPT => array('', 'QuickBooks_Callbacks_API_Callbacks::SalesReceiptModResponse'), QUICKBOOKS_QUERY_SALESRECEIPT => array('', 'QuickBooks_Callbacks_API_Callbacks::SaltesReceiptQueryResponse'), QUICKBOOKS_ADD_SHIPMETHOD => array('', 'QuickBooks_Callbacks_API_Callbacks::ShipMethodAddResponse'), QUICKBOOKS_QUERY_SHIPMETHOD => array('', 'QuickBooks_Callbacks_API_Callbacks::ShipMethodQueryResponse'), QUICKBOOKS_ADD_VENDOR => array('', 'QuickBooks_Callbacks_API_Callbacks::VendorAddResponse'), QUICKBOOKS_MOD_VENDOR => array('', 'QuickBooks_Callbacks_API_Callbacks::VendorModResponse'), QUICKBOOKS_QUERY_VENDOR => array('', 'QuickBooks_Callbacks_API_Callbacks::VendorQueryResponse'), '*' => array('', 'QuickBooks_Callbacks_API_Callbacks::RawQBXMLResponse')); //print($qbxml); //print('CALL THIS: QuickBooks_Server_API_Callbacks::' . $action . 'Response'); //print($response); return QuickBooks_Callbacks::callResponseHandler($this->_driver, $map, $action, $this->_user, $action, $uniqueid, $extra, $err, $last_action_time, $last_actionident_time, $response, $qb_identifiers); //exit; /* if ($recur) { return false; } else { return $this->_driver->queueEnqueue($this->_user, $action, $uniqueid, true, $priority, $extra, $qbxml); } */ }
/** * Call any user-defined hooks hooked into a particular type of event * * Hooks will be executed in the order they were added in. If any hook * returns FALSE, then execution for that type of hook will be stopped and * no other hooks will run. Errors reported via the $err parameter will be * logged using the driver logging mechanism. * * @param string $hook The type of hook we're to execute * @param string $ticket The Web Connector ticket * @param string $err Any error messages that should be reported * @param array $hook_data An array of hook data * @return boolean */ protected final function _callHook($hook, $ticket, &$err, $hook_data) { $user = ''; if ($ticket) { $user = (string) $this->_authResolve($ticket); } QuickBooks_Callbacks::callHook($this, $this->_hooks, $hook, null, $user, $ticket, $err, $hook_data, null, __FILE__, __LINE__); /* if (isset($this->_hooks[$hook])) { foreach ($this->_hooks[$hook] as $func) // Call each hook (if a hook return false, stop calling hooks) { $ret = $func($ticket, $user, $err, $hook_data); if ($ret == false) { return false; } } } */ if ($err) { // Log errors reporting by hooks $this->errorLog($ticket, QUICKBOOKS_ERROR_HOOK, $err); } return true; }
/** * Call any user-defined hooks hooked into a particular type of event * * Hooks will be executed in the order they were added in. If any hook * returns FALSE, then execution for that type of hook will be stopped and * no other hooks will run. Errors reported via the $err parameter will be * logged using the driver logging mechanism. * * @param string $hook The type of hook we're to execute * @param string $ticket The Web Connector ticket * @param string $err Any error messages that should be reported * @param array $hook_data An array of hook data * @return boolean */ protected final function _callHook($hook, $ticket, &$err, $hook_data) { $user = ''; if ($ticket) { $user = (string) $this->_authResolve($ticket); } // Call the hook QuickBooks_Callbacks::callHook($this, $this->_hooks, $hook, null, $user, $ticket, $err, $hook_data, null, __FILE__, __LINE__); if ($err) { // Log errors reporting by hooks $this->errorLog($ticket, QUICKBOOKS_ERROR_HOOK, $err); } return true; }
protected function _callHooks(&$hooks, $hook, $requestID, $user, &$err, $hook_data, $callback_config = array()) { // @TODO Will this work with non-SQL drivers? $Driver = $this->_driver; return QuickBooks_Callbacks::callHook($Driver, $hooks, $hook, $requestID, $user, null, $err, $hook_data, $callback_config, __FILE__, __LINE__); }
/** * * @TODO This callback code should be ported to QuickBooks_Callbacks style calls * * @param string $func_or_method * @param string $method * @param string $action * @param mixed $ID * @param string $err * @param string $qbxml * @param object $qbobject * @param resource $qbres * @return boolean */ protected static function _callCallbacks($funcs_or_methods, $method, $action, $ID, &$err, $qbxml, $qbobject, $qbres) { foreach ($funcs_or_methods as $callback) { if (!$callback) { continue; } $return = QuickBooks_Callbacks::callAPICallback(null, null, $callback, $method, $action, $ID, $err, $qbxml, $qbobject, $qbres); /* else if (false !== strpos($func, '::') and true) // method_exists()) // is this safe to do? { // Callback *static method* $tmp = explode('::', $func); $return = call_user_func(array( $tmp[0], $tmp[1] ), $method, $action, $ID, $err, $qbxml, $qbobject, $qbres); } else if (function_exists($func)) { // Callback *function* $return = call_user_func($func, $method, $action, $ID, $err, $qbxml, $qbobject, $qbres); } else { $err = 'Could not call function or method: ' . $func; return false; } */ if (!$return) { break; } } if ($err) { return false; } return true; }
protected function _doCallback($auth_id, $ticket, $target_url, $realm_id_pseudonym) { if ($this->_callback) { $err = ''; $redirect = QuickBooks_Callbacks::callSAMLCallback($this->_driver, $this->_callback, $auth_id, $ticket, $target_url, $realm_id_pseudonym, $this->_config, $err); if ($err) { $this->_setError(QuickBooks_IPP_Federator::ERROR_CALLBACK, 'Callback said: ' . $err); return false; } } else { // Just set the cookie $cookie_expire = (int) $this->_config['cookie_expire']; $cookie_path = $this->_config['cookie_path']; $cookie_domain = $this->_config['cookie_domain']; $cookie_secure = (bool) $this->_config['cookie_secure']; $cookie_httponly = (bool) $this->_config['cookie_httponly']; //print('setting cookie: ' . print_r($this->_config, true)); if (QuickBooks_IPP_Federator::setCookie($ticket, $cookie_expire, $cookie_path, $cookie_domain, $cookie_secure, $cookie_httponly)) { $redirect = true; } else { // Cookie failed to set for some reason $this->_setError(QuickBooks_IPP_Federator::ERROR_COOKIE, 'Could not set the IPP context cookie (did you make sure *not* to send any output yet?)'); return false; } } if ($redirect) { $this->_doRedirect($target_url); } return true; }