/**
  *
  * @access  protected
  * @param \EE_Ticket $ticket
  * @param \EE_Datetime[] $saved_datetimes
  * @param \EE_Datetime[] $added_datetimes
  * @param \EE_Datetime[] $removed_datetimes
  * @return \EE_Ticket
  * @throws \EE_Error
  */
 protected function _update_ticket_datetimes(EE_Ticket $ticket, $saved_datetimes = array(), $added_datetimes = array(), $removed_datetimes = array())
 {
     // to start we have to add the ticket to all the datetimes its supposed to be with,
     // and removing the ticket from datetimes it got removed from.
     // first let's add datetimes
     if (!empty($added_datetimes) && is_array($added_datetimes)) {
         foreach ($added_datetimes as $row_id) {
             $row_id = (int) $row_id;
             if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) {
                 $ticket->_add_relation_to($saved_datetimes[$row_id], 'Datetime');
                 // Is this an existing ticket (has an ID) and does it have any sold?
                 // If so, then we need to add that to the DTT sold because this DTT is getting added.
                 if ($ticket->ID() && $ticket->sold() > 0) {
                     $saved_datetimes[$row_id]->increase_sold($ticket->sold());
                     $saved_datetimes[$row_id]->save();
                 }
             }
         }
     }
     // then remove datetimes
     if (!empty($removed_datetimes) && is_array($removed_datetimes)) {
         foreach ($removed_datetimes as $row_id) {
             $row_id = (int) $row_id;
             // its entirely possible that a datetime got deleted (instead of just removed from relationship.
             // So make sure we skip over this if the dtt isn't in the $saved_datetimes array)
             if (isset($saved_datetimes[$row_id]) && $saved_datetimes[$row_id] instanceof EE_Datetime) {
                 $ticket->_remove_relation_to($saved_datetimes[$row_id], 'Datetime');
                 // Is this an existing ticket (has an ID) and does it have any sold?
                 // If so, then we need to remove it's sold from the DTT_sold.
                 if ($ticket->ID() && $ticket->sold() > 0) {
                     $saved_datetimes[$row_id]->decrease_sold($ticket->sold());
                     $saved_datetimes[$row_id]->save();
                 }
             }
         }
     }
     // cap ticket qty by datetime reg limits
     $ticket->set_qty(min($ticket->qty(), $ticket->qty('reg_limit')));
     return $ticket;
 }