public static function build_file($settings, $make_mode, $output_mode, $offset = false, $limit = false, $filename = '')
 {
     global $wpdb;
     if ($output_mode == 'browser') {
         $filename = 'php://output';
         while (@ob_end_clean()) {
         }
         // remove ob_xx
     } else {
         $filename = !empty($filename) ? $filename : tempnam("/tmp", $settings['format']);
     }
     //add_filter("woe_csv_output_filter",array($this,'testfilter'),10,2);
     $formater = self::init_formater($make_mode, $settings, $filename, $labels, $static_vals);
     $format = strtolower($settings['format']);
     if ($make_mode == 'finish') {
         if ($format != 'xls') {
             $formater->finish();
         }
         return $filename;
     }
     //get IDs
     $sql = WC_Order_Export_Data_Extractor::sql_get_order_ids($settings);
     if ($make_mode == 'preview') {
         $sql .= " ORDER BY order_id DESC LIMIT 1";
     } elseif ($make_mode != 'estimate') {
         $sql .= " ORDER BY order_id ASC";
     }
     //UNUSED ajax get partial orders
     if ($make_mode == 'partial') {
         $offset = intval($offset);
         $limit = intval($limit);
         $sql .= " LIMIT {$offset},{$limit}";
     }
     $order_ids = $wpdb->get_col($sql);
     //$order_ids	= array(387);
     // prepare for XLS/CSV
     $csv_max['coupons'] = $csv_max['products'] = 1;
     if ($format == 'xls' or $format == 'csv') {
         if (@$settings['order_fields']['products']['repeat'] == 'columns') {
             $csv_max['products'] = WC_Order_Export_Data_Extractor::get_max_order_items("line_item", $order_ids);
         }
         if (@$settings['order_fields']['coupons']['repeat'] == 'columns') {
             $csv_max['coupons'] = WC_Order_Export_Data_Extractor::get_max_order_items("coupon", $order_ids);
         }
     }
     // try to optimize calls
     $filters_active = array('order' => self::check_filters($settings['order_fields'], $format, 'order'), 'products' => self::check_filters($settings['order_product_fields'], $format, 'order_product'), 'coupons' => self::check_filters($settings['order_coupon_fields'], $format, 'order_coupon'));
     // check it once
     $export['products'] = $settings['order_fields']['products']['checked'];
     $export['coupons'] = $settings['order_fields']['coupons']['checked'];
     $get_coupon_meta = ($export['coupons'] and array_diff(array_keys($labels['coupons']), array('code', 'discount_amount', 'discount_amount_tax')));
     // 0
     $header = ($format == 'xls' or $format == 'csv') ? self::make_header_csv($labels, $csv_max) : '';
     $options = array();
     if ($format == 'xls' and @$settings['format_xls_populate_other_columns_product_rows'] or $format == 'csv' and @$settings['format_csv_populate_other_columns_product_rows']) {
         $options['populate_other_columns_product_rows'] = 1;
     }
     if ($make_mode != 'partial') {
         $formater->start($header);
     } elseif ($format == 'json' and $offset > 0) {
         $formater->prev_added = true;
     }
     if ($make_mode == 'estimate') {
         //if estimate return total count
         return $wpdb->get_var(str_replace('ID as order_id', 'COUNT(ID) as order_count', $sql));
     }
     WC_Order_Export_Data_Extractor::prepare_for_export();
     foreach ($order_ids as $order_id) {
         $rows = WC_Order_Export_Data_Extractor::fetch_order_data($order_id, $labels, $format, $filters_active, $csv_max, $export, $get_coupon_meta, $static_vals, $options);
         foreach ($rows as $row) {
             $formater->output($row);
         }
     }
     if ($make_mode != 'partial' or $format == 'xls') {
         $formater->finish();
     }
     return $filename;
 }