def quickbooks_query(query_type, query_params):
    """
    args are query type string and any query_params which should be a dict
    query types include 
    purchase_order, item, check
    """
    try:
        qb = QuickBooks(**QB_LOOKUP)
        qb.begin_session()
        results = qb.quickbooks_query(query_type, query_params)
        celery_app.send_task(
            'quickbooks.tasks.process_quickbooks_entities',
            queue='quickbooks', args=[query_type, list(results)], expires=1800
        )
    finally:
        del(qb)
def qb_requests(request_list=None, app='quickbooks'):
    """
    Always send a list of requests so we aren't opening and closing file more than necessary
    ex: 
    qb_requests.delay([
        (item_key, model_name, ('ItemReceiptAddRq', receipt_instance.quickbooks_request_tuple)),
        (item_key, model_name, ('ItemReceiptAddRq', receipt_instance.quickbooks_request_tuple))
    ])
    """
    try:
        qb = QuickBooks(**QB_LOOKUP)
        qb.begin_session()

        # process request list if it exists or just get open purchase orders
        if request_list:
            for entry in request_list:
                try:
                    surrogate_key, model_name, request_body = entry
                    request_type, request_dict = request_body
                    response = qb.call(request_type, request_dictionary=request_dict)
                    if surrogate_key and request_dict:
                        celery_app.send_task(
                            'quickbooks.tasks.process_response',
                            queue='quickbooks',
                            args=[surrogate_key, model_name, response, app], expires=1800
                        )
                except Exception as e:
                    logger.error(e)

        celery_app.send_task(
            'quickbooks.tasks.process_preferences',
            queue='quickbooks',
            args=[qb.get_preferences()], expires=1800
        )
    finally:
        # making sure to end session and close file
        del(qb)