function cw_check_condition_A($offer_id, $and_logic = true)
{
    global $cart, $tables;
    global $affected_product_ids, $_affected_product_ids;
    # Check all A conditions
    $conditions = cw_query("SELECT object_id, quantity, param1 as value, param2 as operation FROM {$tables['ps_cond_details']} WHERE offer_id='{$offer_id}' AND object_type='" . PS_OBJ_TYPE_ATTR . "'");
    if (!empty($conditions) && is_array($conditions)) {
        $condition_attributes = array();
        foreach ($conditions as $k => $c) {
            $a = cw_func_call('cw_attributes_get_attribute', array('attribute_id' => $c['object_id']));
            $condition_attributes[$a['attribute_id']] = $a;
        }
        unset($a);
        $semicart = array();
        // Join products in cart by productid and calculate total available amount taking into account affected ids
        if (is_array($cart['products'])) {
            foreach ($cart['products'] as $prod) {
                if (!isset($semicart[$prod['product_id']])) {
                    $attributes = cw_func_call('cw_attributes_get', array('item_id' => $prod['product_id'], 'item_type' => 'P', 'attribute_fields' => array_column($condition_attributes, 'field')));
                    $semicart[$prod['product_id']] = array('product_id' => $prod['product_id'], 'amount' => -1 * $_affected_product_ids['ids'][$prod['product_id']], 'attributes' => $attributes);
                }
                $semicart[$prod['product_id']]['amount'] += $prod['amount'];
            }
        }
        // Clear unavailable products
        foreach ($semicart as $pid => $prod) {
            if ($prod['amount'] <= 0) {
                unset($semicart[$pid]);
            }
        }
        // Now semicart contains only available products and we consider it as cart
        # Check for all products in cart
        foreach ($conditions as $c) {
            if (in_array($condition_attributes[$c['object_id']]['type'], array('selectbox', 'multi-selectbox'))) {
                $condition_attribute_value = cw_attributes_get_value_by_attribute_value_id($c['value']);
            } else {
                $condition_attribute_value = $c['value'];
            }
            foreach ($semicart as $kk => $prod) {
                if (in_array($condition_attributes[$c['object_id']]['type'], array('selectbox', 'multi-selectbox'))) {
                    $product_attribute_value = $prod['attributes'][$condition_attributes[$c['object_id']]['field']]['values_str'][0];
                } else {
                    $product_attribute_value = $prod['attributes'][$condition_attributes[$c['object_id']]['field']]['value'];
                }
                if (cw_call('cw_ps_compare_attributes', array($product_attribute_value, $condition_attribute_value, $c['operation']))) {
                    $_affected_product_ids['ids'][$prod['product_id']] += min($prod['amount'], $c['quantity']);
                    $c['quantity'] -= $prod['amount'];
                    if ($c['quantity'] <= 0) {
                        break;
                    }
                    // Ok, we reached condition quantity, no need to check other products
                }
            }
            if ($c['quantity'] > 0 && $and_logic) {
                return false;
                // one of the products is not in cart or has insufficient amount (AND logic)
            } elseif ($c['quantity'] <= 0 && !$and_logic) {
                return true;
                // at least one manufacturer found in cart with enough amount (OR logic)
            }
        }
        if (!$and_logic) {
            return false;
        }
        // Nothing found with (OR logic)
    }
    if (empty($conditions) && !$and_logic) {
        return false;
    }
    // this result should not affect whole formula if OR is used
    return true;
    # there are no A conditions at all OR all conditions are met
}
function cw_attribute_get_value($attribute_id, $item_id, $language = null)
{
    global $tables, $current_language, $cw_attributes;
    $language = $language ? $language : $current_language;
    $attribute = $cw_attributes['all'][$attribute_id];
    $value = cw_query_first_cell("SELECT value FROM {$tables['attributes_values']} WHERE item_id='{$item_id}' AND attribute_id='{$attribute_id}' AND code IN ('{$language}','')");
    if (in_array($attribute['type'], array('selectbox', 'multi-selectbox'))) {
        // replace reference to value ID by real value
        return cw_attributes_get_value_by_attribute_value_id($value);
    }
    return $value;
}