/** * Execute the console command. * * @return mixed */ public function fire() { $this->info("searching for event candidates..."); // get all relevant events $all_events = Events::where('ticketsystem_enabled', 1)->where('ticketsystem_autoremind', 1)->whereNotNull('ticketsystem_autoremind_user_id')->whereNotNull('ticketsystem_recording_startdate')->get(); error_log('All Events ' . json_encode($all_events)); $curr_year = date("Y", strtotime('now')); $curr_week = date("W", strtotime('now')); // iterate to get at the event ticket types without sales foreach ($all_events as $key => $curr_event) { $this->info("event with ticketsystem enabled found..."); // event ticket types $ticket_types = $curr_event->ticket_types()->get(); $event_has_incomplete_sales = false; foreach ($ticket_types as $key => $tt) { // No point sending multiple notifications for same event and different ticket types if ($event_has_incomplete_sales) { break; } $this->info("searching event ticket types..."); for ($days_added = 0;; $days_added += 7) { $cmp_ts = strtotime($curr_event->ticketsystem_recording_startdate . " +" . $days_added . " days"); if ($cmp_ts > strtotime('now')) { break; } // get the week and year $cmp_year = date("Y", $cmp_ts); $cmp_week = date("W", $cmp_ts); // get the ones without sales entries at some week between ticketsystem startdate and now $tt_weekly_sales = TicketSold::where('event_ticket_types_id', $tt->id)->where('week', $cmp_week)->where('year', $cmp_year)->first(); if (!$tt_weekly_sales) { $this->comment("notifying promoter..."); // get the user to be notified $promoter = User::find($curr_event->ticketsystem_autoremind_user_id); // create autologin entry $confirmation_code = str_random(30); $autologin_entry = TicketSalesAutologin::create(['users_id' => $promoter->id, 'events_id' => $curr_event->id, 'token' => $confirmation_code]); if ($autologin_entry) { // send notification Mail::send('emails.promoters.incomplete_sales', array('promoter' => $promoter, 'curr_event' => $curr_event, 'autologin' => $autologin_entry), function ($message) use($promoter) { $message->to($promoter->email, $promoter->username)->subject("Alda: Incomplete ticket sales"); }); } $event_has_incomplete_sales = true; break; } } } } }
public function getTickets($curr_event) { $curr_year = (int) date('Y', strtotime('now')); $curr_week = (int) date('W', strtotime('now')); $event_ticketsystem_startdate = $curr_event->ticketsystem_recording_startdate; $event_ts_startyear = (int) date('Y', strtotime($event_ticketsystem_startdate)); $event_ts_startweek = (int) date('W', strtotime($event_ticketsystem_startdate)); $ticket_types = TicketType::where('events_id', $curr_event->id)->orderBy('order')->get(); $ticket_aggregate = []; $yearly_tickettype_aggregate = []; $global_aggregate = (object) ['num_sold' => 0, 'amt' => 0, 'points' => null, 'cum_points' => null]; $global_aggregate->points = []; $global_aggregate->cum_points = []; // yearly aggregates foreach ($ticket_types as $key => $tt) { $tmp_yearly_tickettype = (object) ['id' => $tt->id, 'name' => $tt->name, 'num_sold' => 0, 'amt' => 0, 'points' => null, 'sales_points' => null]; $tmp_yearly_tickettype->points = []; $tmp_yearly_tickettype->sales_points = []; $yearly_tickettype_aggregate[] = $tmp_yearly_tickettype; } // years for ($y = $event_ts_startyear; $y <= $curr_year; $y++) { // last week for current year $last_week_dt = new DateTime('December 28th, ' . $y); $last_week = $y === $curr_year ? $curr_week : (int) $last_week_dt->format('W'); $start_week = $y === $event_ts_startyear ? $event_ts_startweek : 1; // weeks for ($w = $start_week; $w <= $last_week; $w++) { // tmp storage for all ticket types for a given week $tmp_ticket_aggregate = (object) ['week_ndx' => $w, 'year' => $y, 'ticket_details' => null, 'weekly_totals' => null]; $tmp_ticket_aggregate->ticket_details = []; // tmp weekly cumulative counter vars for all ticket types $weekly_total_sold = 0; $weekly_total_revenue = 0; // for each ticket type $tmp_global_point = 0; foreach ($ticket_types as $key => $ticket_type) { $curr_tickets_sold = TicketSold::where('event_ticket_types_id', $ticket_type->id)->where('week', $w)->where('year', $y)->first(); // find the yearly ticket_type ndx $yearly_tt_ndx = -1; foreach ($yearly_tickettype_aggregate as $key => $yearly_tickettype_value) { if ($yearly_tickettype_value->id === $ticket_type->id) { $yearly_tt_ndx = $key; break; } } if ($curr_tickets_sold) { eerror_log('Event ' . $curr_event->id . ' has ticketssold for ' . $w . '-' . $y . ' ' . json_encode($curr_tickets_sold)); // update weekly accumulators $curr_ticket_price = (double) $ticket_type->price; $weekly_total_sold += (int) $curr_tickets_sold->num_sold; $weekly_total_revenue += (int) $curr_tickets_sold->num_sold * $curr_ticket_price; // update yearly accumulators if ($yearly_tt_ndx !== -1) { $revenue = (double) $curr_tickets_sold->num_sold * $curr_ticket_price; $yearly_tickettype_aggregate[$yearly_tt_ndx]->num_sold += (int) $curr_tickets_sold->num_sold; $yearly_tickettype_aggregate[$yearly_tt_ndx]->amt += $revenue; $yearly_tickettype_aggregate[$yearly_tt_ndx]->points[] = (int) $curr_tickets_sold->num_sold; $yearly_tickettype_aggregate[$yearly_tt_ndx]->sales_points[] = $revenue; $tmp_global_point += $revenue; } } else { if ($yearly_tt_ndx !== -1) { // set to 0 if no tt sale exists $yearly_tickettype_aggregate[$yearly_tt_ndx]->points[] = 0; $yearly_tickettype_aggregate[$yearly_tt_ndx]->sales_points[] = 0; } } // save resuts for current ticket type $tmp_ticket_aggregate->ticket_details[] = ['ticket_type' => $ticket_type, 'tickets_sold' => $curr_tickets_sold, 'input_visible' => !$curr_tickets_sold ? true : false]; } // save weekly accumulators $tmp_ticket_aggregate->weekly_totals = ['num_sold' => $weekly_total_sold, 'amt' => $weekly_total_revenue]; $ticket_aggregate[] = $tmp_ticket_aggregate; $global_aggregate->points[] = $tmp_global_point; $num_points = count($global_aggregate->points); if ($num_points === 0) { $global_aggregate->cum_points[] = $tmp_global_point; } else { if ($num_points > 0) { $prev_val = end($global_aggregate->cum_points); $global_aggregate->cum_points[] = $prev_val + $tmp_global_point; } } } } return [$ticket_types, $ticket_aggregate, $yearly_tickettype_aggregate, $global_aggregate]; }