/**
  * 	_ticket_row
  *
  * @param EE_Line_Item $line_item
  * @return mixed
  */
 private function _ticket_row(EE_Line_Item $line_item)
 {
     $ticket = EEM_Ticket::instance()->get_one_by_ID($line_item->OBJ_ID());
     if ($ticket instanceof EE_Ticket) {
         // start of row
         $html = '';
         $html .= EEH_HTML::tr('', 'event-cart-item-row-' . $line_item->code());
         $this->_show_taxes = $line_item->is_taxable() ? true : $this->_show_taxes;
         $line_item_name = $line_item->is_taxable() ? $line_item->name() . ' * ' : $line_item->name();
         // name td
         $html .= EEH_HTML::td($line_item_name, '', 'ticket info');
         // price td
         $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght');
         // quantity td
         $html .= EEH_HTML::td($line_item->quantity(), '', 'mini-cart-tbl-qty-td jst-cntr');
         // total td
         $html .= EEH_HTML::td($line_item->total_no_code(), '', 'jst-rght');
         // end of row
         $html .= EEH_HTML::trx();
         return $html;
     }
     return null;
 }
 /**
  *    _adjust_line_item_quantity
  *
  * @access    protected
  * @param EE_Line_Item $line_item
  * @param int $quantity
  * @param string $action
  * @return EE_Line_Item|null
  */
 protected function adjust_line_item_quantity($line_item, $quantity = 1, $action = 'add')
 {
     if ($line_item instanceof EE_Line_Item) {
         //EEH_Debug_Tools::printr( $line_item->code(), '$line_item->code()', __FILE__, __LINE__ );
         //EEH_Debug_Tools::printr( $line_item->type(), '$line_item->type()', __FILE__, __LINE__ );
         //EEH_Debug_Tools::printr( $line_item->OBJ_type(), '$line_item->OBJ_type()', __FILE__, __LINE__ );
         //EEH_Debug_Tools::printr( $line_item->OBJ_ID(), '$line_item->OBJ_ID()', __FILE__, __LINE__ );
         //EEH_Debug_Tools::printr( $quantity, '$quantity', __FILE__, __LINE__ );
         //EEH_Debug_Tools::printr( $action, '$action', __FILE__, __LINE__ );
         $quantity = (int) $quantity;
         if ($quantity === 0 && $action == 'update') {
             $_REQUEST['ticket'] = $line_item->OBJ_ID();
             $_REQUEST['line_item'] = $line_item->code();
             $this->delete_ticket(false);
             return $line_item;
         } else {
             if ($quantity > 0) {
                 $additional = 'An additional';
                 $added_or_removed = 'added';
             } else {
                 $additional = 'A ';
                 $added_or_removed = 'removed';
             }
         }
         $quantity = $action == 'update' ? $quantity : $line_item->quantity() + $quantity;
         // update quantity
         $line_item->set_quantity($quantity);
         //it's "proper" to update the sub-line items quantities too, but core can actually fix it if we don't anyways
         if (method_exists('EEH_Line_Item', 'update_quantity')) {
             EEH_Line_Item::update_quantity($line_item, $quantity);
         } else {
             $line_item->set_quantity($quantity);
         }
         //EEH_Debug_Tools::printr( $line_item, '$line_item', __FILE__, __LINE__ );
         $saved = $line_item->ID() ? $line_item->save() : $line_item->quantity() == $quantity;
         if ($saved) {
             if ($action != 'update') {
                 $msg = sprintf(__('%1$s item was successfully %2$s for this event.', 'event_espresso'), $additional, $added_or_removed);
             } else {
                 $msg = __('The quantities were successfully updated for this event.', 'event_espresso');
             }
             // something got added
             if (apply_filters('FHEE__EED_Multi_Event_Registration__display_success_messages', false)) {
                 EE_Error::add_success($msg, __FILE__, __FUNCTION__, __LINE__);
             }
         } else {
             if ($line_item->quantity() != $quantity) {
                 // nothing added
                 EE_Error::add_error(sprintf(__('%1$s item was not %2$s for this event. Please refresh the page and try it again.', 'event_espresso'), $additional, $added_or_removed), __FILE__, __FUNCTION__, __LINE__);
                 return null;
             }
         }
     }
     return $line_item;
 }
 /**
  * 	_ticket_row
  *
  * @param EE_Line_Item $line_item
  * @param array        $options
  * @return mixed
  */
 private function _ticket_row(EE_Line_Item $line_item, $options = array())
 {
     $ticket = EEM_Ticket::instance()->get_one_by_ID($line_item->OBJ_ID());
     if ($ticket instanceof EE_Ticket) {
         // start of row
         $html = EEH_HTML::tr('', 'event-cart-ticket-row-' . $line_item->ID(), 'event-cart-ticket-row item');
         // name && desc
         $name_and_desc = $line_item->name();
         $name_and_desc .= $options['show_desc'] ? '<span class="line-item-desc-spn smaller-text"> : ' . $line_item->desc() . '</span>' : '';
         $name_and_desc = $line_item->is_taxable() ? $name_and_desc . ' * ' : $name_and_desc;
         // name td
         $html .= EEH_HTML::td($name_and_desc, '', 'ticket info');
         // price td
         $html .= EEH_HTML::td($line_item->unit_price_no_code(), '', 'jst-rght');
         // quantity td
         $html .= EEH_HTML::td($this->_ticket_qty_input($line_item, $ticket), '', 'jst-rght');
         // total td
         $html .= EEH_HTML::td($line_item->total_no_code(), '', 'jst-rght');
         // end of row
         $html .= EEH_HTML::trx();
         return $html;
     }
     return null;
 }
 /**
  * Creates a new, unsaved line item from $line_item that factors in the
  * number of billable registrations on $registrations.
  * @param EE_Line_Item      $line_item
  * @return EE_Line_Item
  * @param EE_Registration[] $registrations
  */
 public static function billable_line_item(EE_Line_Item $line_item, $registrations)
 {
     $new_li_fields = $line_item->model_field_array();
     if ($line_item->type() === EEM_Line_Item::type_line_item && $line_item->OBJ_type() === 'Ticket') {
         $count = 0;
         foreach ($registrations as $registration) {
             if ($line_item->OBJ_ID() === $registration->ticket_ID() && in_array($registration->status_ID(), EEM_Registration::reg_statuses_that_allow_payment())) {
                 $count++;
             }
         }
         $new_li_fields['LIN_quantity'] = $count;
     }
     //don't set the total. We'll leave that up to the code that calculates it
     unset($new_li_fields['LIN_ID']);
     unset($new_li_fields['LIN_parent']);
     unset($new_li_fields['LIN_total']);
     return EE_Line_Item::new_instance($new_li_fields);
 }
 /**
  *    _process_billable_total
  *
  * @param EE_Line_Item $line_item
  * @return mixed
  */
 private function _is_billable(EE_Line_Item $line_item)
 {
     $billable = 0;
     // is this a ticket ?
     if ($line_item->OBJ_type() == 'Ticket') {
         //echo '<br/><h5 style="color:#2EA2CC;">$line_item->name() : <span style="color:#E76700">' . $line_item->name() . '</span><br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h5>';
         //echo '<h5 style="color:#2EA2CC;">$line_item->OBJ_ID() : <span style="color:#E76700">' . $line_item->OBJ_ID() . '</span><br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h5>';
         // is it in the "do not bill" list?
         foreach ($this->_billable as $REG_ID => $TKT_ID) {
             if ($line_item->OBJ_ID() === $TKT_ID) {
                 //echo '<h5 style="color:#2EA2CC;">billable : <span style="color:#E76700">' . $line_item->unit_price() . '</span><br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h5>';
                 $this->_billable_total += $line_item->unit_price();
                 //$this->_total_items += $line_item->quantity();
                 if ($line_item->is_taxable()) {
                     $this->_billable_tax_total += $line_item->unit_price();
                 }
                 $this->_total_items++;
                 $billable++;
                 unset($this->_do_not_bill[$REG_ID]);
             }
         }
         foreach ($this->_do_not_bill as $REG_ID => $TKT_ID) {
             if ($line_item->OBJ_ID() === $TKT_ID) {
                 //echo '<h5 style="color:#2EA2CC;">non_billable : <span style="color:#E76700">' . $line_item->unit_price() . '</span><br/><span style="font-size:9px;font-weight:normal;color:#666">' . __FILE__ . '</span>    <b style="font-size:10px;color:#333">  ' . __LINE__ . ' </b></h5>';
                 $this->_non_billable_total += $line_item->unit_price();
                 if ($line_item->is_taxable()) {
                     $this->_non_billable_tax_total += $line_item->unit_price();
                 }
                 unset($this->_do_not_bill[$REG_ID]);
             }
         }
     }
     return $billable;
 }
 /**
  * 	_ticket_row
  *
  * @param EE_Line_Item $line_item
  * @return mixed
  */
 private function _ticket_row(EE_Line_Item $line_item)
 {
     $ticket = EEM_Ticket::instance()->get_one_by_ID($line_item->OBJ_ID());
     if ($ticket instanceof EE_Ticket) {
         // start of row
         $content = $line_item->name();
         $content .= '<div style="margin:0 0 0 2em; text-align: right;">';
         $content .= ' ' . $line_item->quantity();
         $content .= _x(' x ', 'short form for times, for example: 2 x 4 = 8.', 'event_espresso');
         $content .= $line_item->unit_price_no_code() . ' = ';
         $content .= $line_item->is_taxable() ? $line_item->total_no_code() . '*' : $line_item->total_no_code();
         $content .= '</div>';
         // track taxes
         $this->_show_taxes = $line_item->is_taxable() ? true : $this->_show_taxes;
         return EEH_HTML::li($content, 'event-cart-ticket-list-' . $line_item->code());
     }
     return null;
 }
 /**
  *    add_promotion_line_item
  *
  * @access 	public
  * @param EE_Line_Item $parent_line_item the line item that the new promotion was added to as a child line item
  * @param EE_Line_Item $promotion_line_item the line item representing the new promotion
  * @param EE_Promotion $promotion the promotion object that the line item was created for
  * @return 	boolean
  */
 public function add_promotion_line_item(EE_Line_Item $parent_line_item, EE_Line_Item $promotion_line_item, EE_Promotion $promotion)
 {
     EE_Registry::instance()->load_helper('Line_Item');
     // add it to the cart
     if ($parent_line_item->add_child_line_item($promotion_line_item, false)) {
         if ($promotion->scope_obj()->increment_promotion_scope_uses($promotion, $parent_line_item->OBJ_ID())) {
             return TRUE;
         } else {
             // todo: throw error and revert adding promotion line_item
         }
     }
     return FALSE;
 }