Search code examples
phpreportquickbooks

How I can get Daily Sale Detail from QuickBooks Desktop using web connector?


I want get all sale data date wise from Quickbooks Desktop. I have following code.

$xml = '<?xml version="1.0" encoding="utf-8"?>
                <?qbxml version="13.0"?>
                <QBXML>
                  <QBXMLMsgsRq onError="stopOnError">
                    <GeneralSummaryReportQueryRq  requestID="' . $requestID . '">
                        <GeneralSummaryReportType>SalesByCustomerSummary</GeneralSummaryReportType>

                          <DisplayReport>false</DisplayReport>
                          <ReportPeriod>
                            <FromReportDate>2011-01-01</FromReportDate>
                            <ToReportDate>2017-09-15</ToReportDate>
                          </ReportPeriod>

                        </GeneralSummaryReportQueryRq>
                      </QBXMLMsgsRq>
                    </QBXML>';

    return $xml;

When i replace SalesByCustomerSummary with DailySalesDetail, then return error, and my second issue how i can stop communication between web connector and quicksbook because it inserts same records for multi time.

Thanks in advance

----------- CODE ------------ I have these two functions:

    public function _quickbooks_import_daily_sale_request($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale){
    $xml = '<?xml version="1.0" encoding="utf-8"?>
                <?qbxml version="13.0"?>
                <QBXML>
                  <QBXMLMsgsRq onError="stopOnError">
                    <GeneralDetailReportQueryRq>
                        <GeneralDetailReportType>SalesByItemDetail</GeneralDetailReportType>

                          <DisplayReport>false</DisplayReport>
                          <ReportPeriod>
                            <FromReportDate>2011-01-01</FromReportDate>
                            <ToReportDate>2017-09-15</ToReportDate>
                          </ReportPeriod>

                        </GeneralDetailReportQueryRq>
                      </QBXMLMsgsRq>
                    </QBXML>';

    return $xml;
}

public function _quickbooks_import_daily_sale_response($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{   




    $array = array(
                            'text' => $requestID.' <br />'.$xml
                        );
        $this->db->insert('save_response', $array);
//  echo "done";
    return false;
}

--------------- FOR QUEUE -----------------------

        //echo (__FILE__); exit;
        $user = $this->config->item('quickbooks_user');
        $pass = $this->config->item('quickbooks_pass');

        // Memory limit
        ini_set('memory_limit', $this->config->item('quickbooks_memorylimit'));

        // We need to make sure the correct timezone is set, or some PHP installations will complain
        if (function_exists('date_default_timezone_set'))
        {
            // * MAKE SURE YOU SET THIS TO THE CORRECT TIMEZONE! *
            // List of valid timezones is here: http://us3.php.net/manual/en/timezones.php
            date_default_timezone_set($this->config->item('quickbooks_tz'));
        }

        // Map QuickBooks actions to handler functions
        $map = array(
            //QUICKBOOKS_IMPORT_CUSTOMER => array( array( $this, '_quickbooks_customer_import_request' ), array( $this, '_quickbooks_customer_import_response' ) ),
            /*QUICKBOOKS_IMPORT_EMPLOYEE => array( array( $this, '_quickbooks_employee_import_request' ), array( $this, '_quickbooks_employee_import_response' ) ),*/
QUICKBOOKS_QUERY_INVOICE => array( array( $this, '_quickbooks_import_daily_sale_request' ), array( $this, '_quickbooks_import_daily_sale_response' ) ),
            //QUICKBOOKS_IMPORT_CUSTOMER => array( '_quickbooks_customer_import_request', '_quickbooks_customer_import_response' ), 
            );

        // Catch all errors that QuickBooks throws with this function 
        $errmap = array(
            '*' => array( $this, '_catchallErrors' ),
            );

        // Call this method whenever the Web Connector connects
        $hooks = array(
            QuickBooks_WebConnector_Handlers::HOOK_LOGINSUCCESS => array( array( $this, '_loginSuccess' ) ),    // Run this function whenever a successful login occurs
            );

        // An array of callback options
        $callback_options = array();

        // Logging level
        $log_level = $this->config->item('quickbooks_loglevel');

        // What SOAP server you're using 
        //$soapserver = QUICKBOOKS_SOAPSERVER_PHP;          // The PHP SOAP extension, see: www.php.net/soap
        $soapserver = QUICKBOOKS_SOAPSERVER_BUILTIN;        // A pure-PHP SOAP server (no PHP ext/soap extension required, also makes debugging easier)

        $soap_options = array(      // See http://www.php.net/soap
            );

        $handler_options = array(
            'deny_concurrent_logins' => false, 
            'deny_reallyfast_logins' => false, 
            );      // See the comments in the QuickBooks/Server/Handlers.php file

        $driver_options = array(        // See the comments in the QuickBooks/Driver/<YOUR DRIVER HERE>.php file ( i.e. 'Mysql.php', etc. )
            'max_log_history' => 32000, // Limit the number of quickbooks_log entries to 1024
            'max_queue_history' => 1024,    // Limit the number of *successfully processed* quickbooks_queue entries to 64
            );

        // Build the database connection string
        $dsn = 'mysqli://' . $this->db->username . ':' . $this->db->password . '@' . $this->db->hostname . '/' . $this->db->database;

        // Check to make sure our database is set up 
        if (!QuickBooks_Utilities::initialized($dsn))
        {
            // Initialize creates the neccessary database schema for queueing up requests and logging
            QuickBooks_Utilities::initialize($dsn);

            // This creates a username and password which is used by the Web Connector to authenticate
            QuickBooks_Utilities::createUser($dsn, $user, $pass);
        }

        // Set up our queue singleton
        QuickBooks_WebConnector_Queue_Singleton::initialize($dsn);

        // Create a new server and tell it to handle the requests
        // __construct($dsn_or_conn, $map, $errmap = array(), $hooks = array(), $log_level = QUICKBOOKS_LOG_NORMAL, $soap = QUICKBOOKS_SOAPSERVER_PHP, $wsdl = QUICKBOOKS_WSDL, $soap_options = array(), $handler_options = array(), $driver_options = array(), $callback_options = array()

        $Server = new QuickBooks_WebConnector_Server($dsn, $map, $errmap, $hooks, $log_level, $soapserver, QUICKBOOKS_WSDL, $soap_options, $handler_options, $driver_options, $callback_options);
        $response = $Server->handle();
        $Queue = new QuickBooks_WebConnector_Queue($dsn);
            $Queue->enqueue(QUICKBOOKS_QUERY_INVOICE);


    //exit;
        //echo "<pre>"; print_r($response);
        //echo "Mujtaba";

Solution

  • This is your problem:

        $Queue = new QuickBooks_WebConnector_Queue($dsn);
        $Queue->enqueue(QUICKBOOKS_QUERY_INVOICE);
    

    The way the Web Connector works, for every single time the Web Connector connects to QuickBooks, it makes at least 2 HTTP requests. So, this script you have is going to run at least TWICE every single time things attempt to sync with QuickBooks.

    That means that every single time you attempt to sync with QuickBooks, you're queuing up at least two requests to do the same thing.

    The Web Connector does this:

    1. HTTP request #1 - authenticate
    2. (if there's stuff to do) HTTP request #2 - ask for the first thing to do
    3. (if we got a response back from previous step) HTTP request #3 - send response from QuickBooks back to you
    4. (if there's still more stuff to do) go back to step 2.
    5. HTTP request #N - close the connection/log off

    So, you need to change your code so that you only queue things up when it first connects vs. queueing things up on every single HTTP request.

    There's an example of doing this here:

    Basically, you need register a callback function to be called whenever the Web Connector authenticates:

    $hooks = array(
        QuickBooks_WebConnector_Handlers::HOOK_LOGINSUCCESS => '_quickbooks_hook_loginsuccess',     // call this whenever a successful login occurs
        );
    

    And do your queuing in that function instead:

    function _quickbooks_hook_loginsuccess($requestID, $user, $hook, &$err, $hook_data, $callback_config)
    {
        // For new users, we need to set up a few things
        // Fetch the queue instance
        $Queue = QuickBooks_WebConnector_Queue_Singleton::getInstance();
    
        $Queue->enqueue(... whatever you want to do here ...)
    }