/**
  * 
  */
 public function getItems($pa_options = null)
 {
     if (isset($pa_options['order_id']) && (int) $pa_options['order_id']) {
         $vn_order_id = (int) $pa_options['order_id'];
     } else {
         $vn_order_id = $this->getPrimaryKey();
     }
     if (!$vn_order_id) {
         return null;
     }
     $o_db = $this->getDb();
     $va_additional_fee_codes = $this->opo_client_services_config->getAssoc($this->get('order_type') == 'L' ? 'additional_loan_fees' : 'additional_order_item_fees');
     $qr_res = $o_db->query("\n\t \t\tSELECT i.*, objl.name, objl.name_sort, objl.locale_id, obj.idno, obj.idno_sort\n\t \t\tFROM ca_commerce_order_items i\n\t \t\tINNER JOIN ca_commerce_orders AS o ON o.order_id = i.order_id\n\t \t\tINNER JOIN ca_objects AS obj ON obj.object_id = i.object_id\n\t \t\tINNER JOIN ca_object_labels AS objl ON objl.object_id = obj.object_id\n\t \t\tWHERE\n\t \t\t\t(o.order_id = ?) AND (objl.is_preferred = 1)\n\t \t\tORDER BY i.rank\n\t \t", (int) $vn_order_id);
     $va_object_ids = $qr_res->getAllFieldValues('object_id');
     $va_item_ids = $qr_res->getAllFieldValues('item_id');
     $va_orders = array();
     // Get representation (page) counts
     $va_rep_counts = $va_total_rep_counts = array();
     $va_item_to_rep_ids = array();
     if (sizeof($va_item_ids)) {
         if ($this->get('order_type') == 'O') {
             $qr_rep_count = $o_db->query("\n\t\t\t\t\tSELECT coixor.item_id, coixor.representation_id, count(*) c\n\t\t\t\t\tFROM ca_commerce_order_items_x_object_representations coixor\n\t\t\t\t\tINNER JOIN ca_object_representations AS o_r ON o_r.representation_id = coixor.representation_id\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tcoixor.item_id IN (?) AND o_r.deleted = 0\n\t\t\t\t\tGROUP BY coixor.item_id\n\t\t\t\t", array($va_item_ids));
             while ($qr_rep_count->nextRow()) {
                 $va_rep_counts[(int) $qr_rep_count->get('item_id')] = (int) $qr_rep_count->get('c');
                 $va_item_to_rep_ids[(int) $qr_rep_count->get('item_id')] = (int) $qr_rep_count->get('representation_id');
             }
         } else {
             $qr_rep_count = $o_db->query("\n\t\t\t\t\tSELECT o.item_id, coixor.representation_id, count(*) c\n\t\t\t\t\tFROM ca_commerce_order_items o\n\t\t\t\t\tINNER JOIN ca_objects_x_object_representations AS coixor ON o.object_id = coixor.object_id\n\t\t\t\t\tINNER JOIN ca_object_representations AS o_r ON o_r.representation_id = coixor.representation_id\n\t\t\t\t\tWHERE\n\t\t\t\t\t\to.item_id IN (?) AND o_r.deleted = 0\n\t\t\t\t\tGROUP BY o.item_id\n\t\t\t\t", array($va_item_ids));
             while ($qr_rep_count->nextRow()) {
                 $va_rep_counts[(int) $qr_rep_count->get('item_id')] = (int) $qr_rep_count->get('c');
                 $va_item_to_rep_ids[(int) $qr_rep_count->get('item_id')] = (int) $qr_rep_count->get('representation_id');
             }
             $qr_rep_count = $o_db->query("\n\t\t\t\t\tSELECT o.item_id, coixor.representation_id\n\t\t\t\t\tFROM ca_commerce_order_items o\n\t\t\t\t\tINNER JOIN ca_objects_x_object_representations AS coixor ON o.object_id = coixor.object_id\n\t\t\t\t\tINNER JOIN ca_object_representations AS o_r ON o_r.representation_id = coixor.representation_id\n\t\t\t\t\tWHERE\n\t\t\t\t\t\to.item_id IN (?) AND o_r.deleted = 0 AND coixor.is_primary = 1\n\t\t\t\t", array($va_item_ids));
             while ($qr_rep_count->nextRow()) {
                 $va_item_to_rep_ids[(int) $qr_rep_count->get('item_id')] = (int) $qr_rep_count->get('representation_id');
             }
         }
         $qr_rep_count = $o_db->query("\n\t\t\t\tSELECT coixor.object_id, count(*) c\n\t\t\t\tFROM ca_objects_x_object_representations coixor\n\t\t\t\tINNER JOIN ca_object_representations AS o_r ON o_r.representation_id = coixor.representation_id\n\t\t\t\tWHERE\n\t\t\t\t\tcoixor.object_id IN (?) AND o_r.deleted = 0\n\t\t\t\tGROUP BY coixor.object_id\n\t\t\t", array($va_object_ids));
         while ($qr_rep_count->nextRow()) {
             $va_total_rep_counts[(int) $qr_rep_count->get('object_id')] = (int) $qr_rep_count->get('c');
         }
     }
     $qr_res->seek(0);
     // Get representations
     $t_rep = new ca_object_representations();
     $va_reps = $t_rep->getRepresentationMediaForIDs(array_values($va_item_to_rep_ids), array('thumbnail'));
     while ($qr_res->nextRow()) {
         $va_row = $qr_res->getRow();
         $vn_item_id = (int) $qr_res->get('item_id');
         $va_row['fee'] = sprintf("%4.2f", $va_row['fee']);
         $va_row['tax'] = sprintf("%4.2f", $va_row['tax']);
         $va_row['shipping_cost'] = sprintf("%4.2f", $va_row['shipping_cost']);
         $va_row['handling_cost'] = sprintf("%4.2f", $va_row['handling_cost']);
         $va_row['thumbnail_tag'] = $va_reps[$va_item_to_rep_ids[$va_row['item_id']]]['tags']['thumbnail'];
         $va_row['selected_representation_count'] = (int) $va_rep_counts[$vn_item_id];
         $va_row['representation_count'] = (int) $va_total_rep_counts[(int) $qr_res->get('object_id')];
         if (!is_array($va_fees = caUnserializeForDatabase($va_row['additional_fees']))) {
             $va_fees = array();
         }
         $vn_fee_total = 0;
         foreach ($va_additional_fee_codes as $vs_code => $va_info) {
             if (isset($va_fees[$vs_code])) {
                 $vn_fee = (double) $va_fees[$vs_code];
                 $vn_fee_total += $vn_fee;
             } else {
                 $vn_fee = (double) $va_info['default_cost'];
             }
             $va_row['ADDITIONAL_FEE_' . $vs_code] = sprintf("%4.2f", $vn_fee);
         }
         $va_row['additional_fees_total'] = sprintf("%4.2f", $vn_fee_total);
         $va_orders[$vn_item_id][(int) $qr_res->get('locale_id')] = $va_row;
     }
     $va_orders = caExtractValuesByUserLocale($va_orders);
     return $va_orders;
 }