public function test_add_ticket_to_cart() { //let's make an interesting ticket, with multiple datetimes, multiple prices etc $quantity_purchased = 4; $ticket = $this->new_model_obj_with_dependencies('Ticket', array('TKT_price' => '16.5', 'TKT_taxable' => FALSE)); $base_price_type = EEM_Price_Type::instance()->get_one(array(array('PRT_name' => 'Base Price'))); $dollar_surcharge_price_type = EEM_Price_Type::instance()->get_one(array(array('PRT_name' => 'Dollar Surcharge'))); $percent_surcharge_price_type = EEM_Price_Type::instance()->get_one(array(array('PRT_name' => 'Percent Surcharge'))); $this->assertInstanceOf('EE_Price_Type', $base_price_type); $this->assertInstanceOf('EE_Price_Type', $dollar_surcharge_price_type); $this->assertInstanceOf('EE_Price_Type', $percent_surcharge_price_type); $base_price = $this->new_model_obj_with_dependencies('Price', array('PRC_amount' => 10, 'PRT_ID' => $base_price_type->ID())); $dollar_surcharge = $this->new_model_obj_with_dependencies('Price', array('PRC_amount' => 5, 'PRT_ID' => $dollar_surcharge_price_type->ID())); $percent_surcharge = $this->new_model_obj_with_dependencies('Price', array('PRC_amount' => 10, 'PRT_ID' => $percent_surcharge_price_type->ID())); $ticket->_add_relation_to($base_price, 'Price'); $ticket->_add_relation_to($dollar_surcharge, 'Price'); $ticket->_add_relation_to($percent_surcharge, 'Price'); $this->assertArrayContains($base_price, $ticket->prices()); $this->assertArrayContains($dollar_surcharge, $ticket->prices()); $this->assertArrayContains($percent_surcharge, $ticket->prices()); $event = $this->new_model_obj_with_dependencies('Event'); $ddt1 = $this->new_model_obj_with_dependencies('Datetime', array('EVT_ID' => $event->ID())); $ddt2 = $this->new_model_obj_with_dependencies('Datetime', array('EVT_ID' => $event->ID())); $ticket->_add_relation_to($ddt1, 'Datetime'); $ticket->_add_relation_to($ddt2, 'Datetime'); $this->assertArrayContains($ddt1, $ticket->datetimes()); $this->assertArrayContains($ddt2, $ticket->datetimes()); EE_Cart::reset()->add_ticket_to_cart($ticket, $quantity_purchased); $total_line_item = EE_Cart::instance()->get_grand_total(); $subtotals = $total_line_item->children(); $this->assertNotEmpty($subtotals); $items_purchased = $total_line_item->get_items(); $this->assertEquals(1, count($items_purchased)); $item_purchased = array_shift($items_purchased); $this->assertEquals($ticket->name(), $item_purchased->name()); $this->assertEquals($item_purchased->total(), $total_line_item->total()); $sub_line_items = $item_purchased->children(); $this->assertEquals(count($ticket->prices()), count($sub_line_items)); //the first one should be the base price $base_price_sli = array_shift($sub_line_items); $this->assertEquals($base_price->amount() * 4, $base_price_sli->total()); $dollar_surcharge_sli = array_shift($sub_line_items); $this->assertEquals($dollar_surcharge->amount() * 4, $dollar_surcharge_sli->total()); $percent_surcharge_sli = array_shift($sub_line_items); $this->assertEquals($percent_surcharge->amount(), $percent_surcharge_sli->percent()); $this->assertEquals(($base_price->amount() + $dollar_surcharge->amount()) * $percent_surcharge->amount() / 100 * $quantity_purchased, $percent_surcharge_sli->total()); $this->assertEquals($ticket->price() * $quantity_purchased, EE_Cart::instance()->get_cart_grand_total()); }
protected function _setup_data() { //need to figure out the running total for test purposes so... we're going to create a temp cart and add the tickets to it! EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); $cart = EE_Cart::reset(); //add tickets to cart foreach ($this->tickets as $ticket) { $cart->add_ticket_to_cart($ticket['ticket']); } //setup txn property $this->txn = EE_Transaction::new_instance(array('TXN_timestamp' => time(), 'TXN_total' => 0, 'TXN_paid' => 0, 'STS_ID' => EEM_Transaction::incomplete_status_code, 'TXN_session_data' => NULL, 'TXN_hash_salt' => NULL, 'TXN_ID' => 999999)); //setup reg_objects //note we're setting up a reg object for each attendee in each event but ALSO adding to the reg_object array. $this->reg_objs = array(); $regid = 9999990; foreach ($this->_attendees as $key => $attendee) { //note we need to setup reg_objects for each event this attendee belongs to $regatt = $attendee['att_obj']->ID(); $regtxn = $this->txn->ID(); $regcnt = 1; foreach ($attendee['line_ref'] as $evtid) { foreach ($this->_events[$evtid]['tkt_objs'] as $ticket) { $reg_array = array('EVT_ID' => $evtid, 'ATT_ID' => $regatt, 'TXN_ID' => $regtxn, 'TKT_ID' => $ticket->ID(), 'STS_ID' => EEM_Registration::status_id_pending_payment, 'REG_date' => time(), 'REG_final_price' => $ticket->get('TKT_price'), 'REG_session' => 'dummy_session_id', 'REG_code' => $regid . '-dummy-generated-code', 'REG_url_link' => $regcnt . '-daafpapasdlfakasdfpqasdfasdf', 'REG_count' => $regcnt, 'REG_group_size' => $this->_events[$evtid]['total_attendees'], 'REG_att_is_going' => TRUE, 'REG_ID' => $regid); $REG_OBJ = EE_Registration::new_instance($reg_array); $this->_attendees[$key]['reg_objs'][$regid] = $REG_OBJ; $this->_events[$evtid]['reg_objs'][] = $REG_OBJ; $this->reg_objs[] = $REG_OBJ; $this->tickets[$ticket->ID()]['reg_objs'][$regid] = $REG_OBJ; $regcnt++; $regid++; } } } //setup line items! EE_Registry::instance()->load_helper('Line_Item'); $line_item_total = EEH_Line_Item::create_total_line_item($this->txn); //add tickets foreach ($this->tickets as $tktid => $item) { $qty = $item['count']; $ticket = $item['ticket']; EEH_Line_Item::add_ticket_purchase($line_item_total, $ticket, $qty); } $shipping_line_item = EE_Line_Item::new_instance(array('LIN_name' => __('Shipping Surcharge', 'event_espresso'), 'LIN_desc' => __('Sent via Millenium Falcon', 'event_espresso'), 'LIN_unit_price' => 20, 'LIN_quantity' => 1, 'LIN_is_taxable' => TRUE, 'LIN_total' => 20, 'LIN_type' => EEM_Line_Item::type_line_item)); EEH_Line_Item::add_item($line_item_total, $shipping_line_item); $this->additional_line_items = array($shipping_line_item); //now let's add taxes EEH_Line_Item::apply_taxes($line_item_total); //now we should be able to get the items we need from this object $event_line_items = EEH_Line_Item::get_pre_tax_subtotal($line_item_total)->children(); $line_items = array(); foreach ($event_line_items as $line_id => $line_item) { if (!$line_item instanceof EE_Line_Item || $line_item->OBJ_type() !== 'Event') { continue; } $ticket_line_items = EEH_Line_Item::get_ticket_line_items($line_item); foreach ($ticket_line_items as $ticket_line_id => $ticket_line_item) { if (!$ticket_line_item instanceof EE_Line_Item) { continue; } $this->tickets[$ticket_line_item->OBJ_ID()]['line_item'] = $ticket_line_item; $this->tickets[$ticket_line_item->OBJ_ID()]['sub_line_items'] = $ticket_line_item->children(); $line_items[$ticket_line_item->ID()]['children'] = $ticket_line_item->children(); $line_items[$ticket_line_item->ID()]['EE_Ticket'] = $this->tickets[$ticket_line_item->OBJ_ID()]['ticket']; } } $this->line_items_with_children = $line_items; $this->tax_line_items = $line_item_total->tax_descendants(); //add proper total to transaction object. $grand_total = $line_item_total->recalculate_total_including_taxes(); $this->grand_total_line_item = $line_item_total; $this->txn->set_total($grand_total); //add additional details for each registration foreach ($this->reg_objs as $reg) { $this->_registrations[$reg->ID()]['tkt_obj'] = $this->tickets[$reg->get('TKT_ID')]['ticket']; $this->_registrations[$reg->ID()]['evt_obj'] = $this->_events[$reg->get('EVT_ID')]['event']; $this->_registrations[$reg->ID()]['reg_obj'] = $reg; $this->_registrations[$reg->ID()]['ans_objs'] = $this->_attendees[$reg->get('ATT_ID')]['ans_objs']; $this->_registrations[$reg->ID()]['att_obj'] = $this->_attendees[$reg->get('ATT_ID')]['att_obj']; $this->_registrations[$reg->ID()]['dtt_objs'] = $this->tickets[$reg->get('TKT_ID')]['dtt_objs']; } //events and attendees $this->events = $this->_events; $this->attendees = $this->_attendees; $this->registrations = $this->_registrations; $attendees_to_shift = $this->_attendees; //setup primary attendee property $this->primary_attendee_data = array('fname' => $this->_attendees[999999991]['att_obj']->fname(), 'lname' => $this->_attendees[999999991]['att_obj']->lname(), 'email' => $this->_attendees[999999991]['att_obj']->email(), 'att_obj' => $this->_attendees[999999991]['att_obj'], 'reg_obj' => array_shift($attendees_to_shift[999999991]['reg_objs'])); //reg_info property //note this isn't referenced by any shortcode parsers so we'll ignore for now. $this->reg_info = array(); //let's set a reg_obj for messengers expecting one. $this->reg_obj = array_pop($this->_attendees[999999991]['reg_objs']); //the below are just dummy items. $this->user_id = 1; $this->ip_address = '192.0.2.1'; $this->user_agent = ''; $this->init_access = time(); $this->last_access = time(); }