Subversion Repositories VORC

Rev

Rev 222 | Rev 252 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7 - 1
#!/usr/bin/perl
2
 
56 bgadell 3
# Redirect error messages to a log of my choosing. (it's annoying to filter for errors in the shared env)
180 - 4
#my $error_log_path = $ENV{SERVER_NAME} eq "volunteers.rollercon.com" ? "/home3/rollerco/logs/" : "/tmp/";
5
#close STDERR;
6
#open STDERR, '>>', $error_log_path.'vorc_error.log' or warn "Failed to open redirected logfile ($0): $!";
56 bgadell 7
#warn "Redirecting errors to ${error_log_path}vorc_error.log";
8
 
7 - 9
use strict;
8 - 10
use cPanelUserConfig;
7 - 11
use RollerCon;
50 bgadell 12
use CGI qw/param header start_html url/;
7 - 13
use CGI::Cookie;
14
our $h = HTML::Tiny->new( mode => 'html' );
138 - 15
my $dbh = getRCDBH ();
7 - 16
 
50 bgadell 17
my $cookie_string = authenticate (1) || die;
7 - 18
my ($EML, $PWD, $LVL) = split /&/, $cookie_string;
50 bgadell 19
my $user = $ORCUSER;
65 bgadell 20
my $activated = $ORCUSER->{access};
50 bgadell 21
my $DEPTS = getDepartments ();
7 - 22
 
138 - 23
print header (-cookie=>CGI::Cookie->new(-name=>'RCAUTH',-value=>"$cookie_string",-expires=>"+30m"));
7 - 24
 
25
#foreach (sort keys %ENV) {
26
#	print "$_: $ENV{$_}\n<br>";
27
#}
28
 
29
use DateTime;
30
my $dt = DateTime->today;
31
$dt =~ s/T00\:00\:00$//;
32
 
50 bgadell 33
my @announcements;
134 - 34
if ($user->{department}->{EMT} >= RollerCon::USER and !$user->{emt_verified}) {
135 - 35
	push @announcements, $h->li ("NOTE: Anyone in the EMT department can see shifts, but you cannot sign up for them until your credentials have been verified. Start here: ".$h->a ({ href => "https://rollercon.com/help-wanted/emts/", target => "_blank" }, "https://rollercon.com/help-wanted/emts/"));
134 - 36
}
37
 
180 - 38
my $volhours = getSchedule ($user->{RCid}, 'all', 'hours');
39
if ($volhours) {
40
  push @announcements, $h->li ("Volunteer Hours: You currently have credit for $volhours hour(s) of volunteer time.");
41
}
42
 
56 bgadell 43
my ($announcement) = $dbh->selectrow_array ("select value from setting where setting.key = ?", undef, "ANNOUNCEMENT");
44
push @announcements, $h->li ($announcement) if $announcement;
50 bgadell 45
 
194 - 46
#if ($user->{department}->{OFF} > 0) {
47
#  my @days = ("Thursday", "Friday", "Saturday");
48
#  my @dayschecked;
49
#	foreach my $day (@{$dbh->selectall_arrayref ("select dayofweek from v_shift where year(date) = year(now()) and RCid = ? and role = 'Officiating Huddle'", undef, $user->{RCid})}) {
50
#	  push @dayschecked, @{$day};
51
#	}
52
#
53
#  use tableViewer qw/inArray/;
54
#  push @announcements, $h->li ("Did you attend the Officiating Huddle on:"),
55
#    $h->form ({ action => "add_officiating_huddle_time.pl", target => "_blank" }, [
56
#      map ({ inArray($_, \@dayschecked) ? $h->input ({ type => "checkbox", name => $_, checked => [] }).$_.$h->br : $h->input ({ type => "checkbox", name => $_ }).$_.$h->br } @days),
57
#      $h->input ({ type => "submit", value => scalar @dayschecked ? "Update my hours." : "Give me credit!" })
58
#    ]);
59
#}
56 bgadell 60
 
249 - 61
#if ($user->{department}->{OFF} > 1) {
62
#  my @days = ("Thursday", "Friday", "Saturday");
63
#  my @dayschecked;
64
#	foreach my $day (@{$dbh->selectall_arrayref ("select dayofweek from v_shift where year(date) = year(now()) and RCid = ? and role = 'Officiating Leads Huddle'", undef, $user->{RCid})}) {
65
#	  push @dayschecked, @{$day};
66
#	}
67
#
68
#  use tableViewer qw/inArray/;
69
#  push @announcements, $h->li ("Did you attend the Officiating Leads Huddle on:"),
70
#    $h->form ({ action => "add_officiating_leads_huddle_time.pl", target => "_blank" }, [
71
#      map ({ inArray($_, \@dayschecked) ? $h->input ({ type => "checkbox", name => $_, checked => [] }).$_.$h->br : $h->input ({ type => "checkbox", name => $_ }).$_.$h->br } @days),
72
#      $h->input ({ type => "submit", value => scalar @dayschecked ? "Update my hours." : "Give me credit!" })
73
#    ]);
74
#}
112 - 75
 
7 - 76
my $schedule = getSchedule ($user->{RCid});
77
 
78
my @everyone;
79
my @printDEPTS = map { $DEPTS->{$_} } grep { $user->{department}->{$_} > 0 } grep { !/(ANN)|(OFF)/ } sort keys %{$user->{department}};
80
push @printDEPTS, "Officiating Lead" if $user->{department}->{"OFF"} > 1;
81
my $printDEPTS = join ", ", @printDEPTS;
82
push @everyone, $h->li ($h->a ({ href=>"/schedule/shifts.pl" }, "View and Sign Up for $printDEPTS Shifts")) if $printDEPTS;
83
push @everyone, $h->li ($h->a ({ href=>"/schedule/officiating_shifts.pl" }, "View and Sign Up for Officiating Shifts")) if $user->{department}->{OFF} > 0;
183 - 84
 
194 - 85
my @OHD_YEARS;
183 - 86
if ($user->{department}->{OFF} > 0) {
194 - 87
  foreach my $officiating_year (@{$dbh->selectall_arrayref ("select distinct year(date) as year from v_shift_officiating where RCid = ? and gtype in ('challenge', 'full length', 'selected', 'challenge-rs1', 'challenge-rs2') order by year desc", undef, $user->{RCid})}) {
88
    push @OHD_YEARS, $h->li ($h->a ({ href=>"/schedule/ohd.pl?year=".$officiating_year->[0] }, $officiating_year->[0]));
89
  }
183 - 90
}
194 - 91
push @everyone, $h->li (["Export your officiating game assignments in OHD Format (CSV File):", $h->ul ([@OHD_YEARS])]) unless !scalar @OHD_YEARS;
183 - 92
 
29 - 93
push @everyone, $h->li ($h->a ({ href=>"/schedule/announcer_shifts.pl" }, "View and Sign Up to Announce Games")) if $user->{department}->{ANN} > 0;
56 bgadell 94
push @everyone, $h->li ($h->a ({ href=>"/schedule/games.pl" }, "View Games"));
95
push @everyone, $h->li ($h->a ({ href=>"/schedule/personal_time.pl" }, "Block Personal Time"));
193 - 96
push @everyone, $h->li ($h->a ({ href=>"/schedule/missing_hours.pl" }, "Request Missing Volunteer Time"));
56 bgadell 97
push @everyone, $h->li ($h->a ({ href=>"/schedule/view_user.pl?submit=Edit&RCid=$user->{RCid}" }, "Edit your profile"));
7 - 98
 
35 - 99
my @mvppass;
105 bgadell 100
my $reviews;
101
if ($user->{MVPid} or $user->{department}->{MVP} >= RollerCon::USER or $user->{department}->{COA} >= RollerCon::USER or $LVL >= RollerCon::SYSADMIN) {
249 - 102
 
103
  if (getSetting ("MAX_CLASS_SIGNUP") < 1) {
104
#    push @mvppass, $h->div ({class=>"error"}, "MVP Classes are not open for pre-registration yet. Pre-registration will start sometime this week, but the exact date and time won't be announced. Check back later.").$h->br;
105
    push @mvppass, $h->div ({class=>"error"}, "MVP Classes are not open for pre-registration yet.").$h->br;
106
  }
107
 
105 bgadell 108
	push @mvppass, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "View and Sign Up for MVP Classes"));
222 - 109
	push @mvppass, $h->li ($h->a ({ href=>"/schedule/current_coaches.pl" }, "View the list of current MVP Coaches"));
105 bgadell 110
 
111
	# Get a list of classes attended to ask for reviews...
112 - 112
  my (@reviews_done, @reviews_tbd);
208 - 113
#	foreach my $class (@{$dbh->selectall_arrayref ("select id, date, time, name, coach, count(*) as answers from v_class_signup_new left join v_survey_answer on id = classid and v_class_signup_new.RCid = v_survey_answer.RCid where v_class_signup_new.RCid = ? and year(date) = year(now()) and concat_ws(' ', date, end_time) < date_sub(now(), interval 2 hour) group by id order by date, start_time", undef, $user->{RCid})}) {
114
	foreach my $class (@{$dbh->selectall_arrayref ("select id, date, time, name, null, count(*) as answers from v_class_signup_new left join v_survey_answer on id = classid and v_class_signup_new.RCid = v_survey_answer.RCid where v_class_signup_new.RCid = ? and year(date) = year(now()) and concat_ws(' ', date, end_time) < date_sub(now(), interval 2 hour) group by id order by date, start_time", undef, $user->{RCid})}) {
105 bgadell 115
	  my ($id, $date, $time, $name, $coach, $answers) = @{$class};
116
	  next unless $id;
117
	  $time = convertTime $time;
118
 
119
	  if ($answers > 1) {
120
	    push @reviews_done, $h->li ("$date $time: ".$h->a ({ href=>"/schedule/survey.pl?classid=$id" }, "$name [".getUserDerbyName ($coach)."]"));
121
	  } else {
122
	    push @reviews_tbd, $h->li ("$date $time: ".$h->a ({ href=>"/schedule/survey.pl?classid=$id" }, "$name [".getUserDerbyName ($coach)."]"));
112 - 123
	  }
105 bgadell 124
	}
112 - 125
  $reviews = $h->li (["Please submit feedback:", $h->ul ([@reviews_tbd])]) unless !scalar @reviews_tbd;
126
  $reviews .= $h->li (["View the feedback you've submitted:", $h->ul ([@reviews_done])]) unless !scalar @reviews_done;
35 - 127
}
7 - 128
 
129
my @leads = ();
130
if ($LVL > 1) {
56 bgadell 131
	push @leads, $h->li ($h->a ({ href=>"/schedule/users.pl" }, "View Users in your Department(s)."));
7 - 132
	push @leads, $h->li ($h->a ({ href=>"/schedule/password_reset.pl" }, "Reset a Password."));
133
 
134
	# Officiating Leads:
135
	if ($user->{department}->{OFF} > 1) {
136
		unshift @leads, $h->li ($h->a ({ href=>"/schedule/scores.pl" }, "View / Update Game Scores"));
137
		push @leads, $h->li (["What's happening right now on...", $h->ul ([
138
			$h->li ($h->a ({ href=>"right_now.pl?t=C1" }, "Track C1")),
139
			$h->li ($h->a ({ href=>"right_now.pl?t=C2" }, "Track C2")),
140
			$h->li ($h->a ({ href=>"right_now.pl?t=C3" }, "Track C3")),
141 - 141
			$h->li ($h->a ({ href=>"right_now.pl?t=C5" }, "Track C5")),
142
			$h->li ($h->a ({ href=>"right_now.pl?t=BT"  }, "Banked Track")),
7 - 143
		])]);
144
	}
249 - 145
  push @announcements, $h->li ([$h->img ({src=>"/images/star-icon.png"}), $h->a ({href => "https://docs.google.com/forms/d/e/1FAIpQLSdcHjUzd7wwpGTK6LPW15XFuWZbpCNHkbdlYxIszwe03WuStQ/viewform"}, "Gold Star Form")]);
7 - 146
}
147
 
148
my @managers;
149
if ($LVL >= 3) {
150
	my $manager_departments = join " or ", map { "department like '%$_-0%'" } grep { $user->{department}->{$_} > 2 } keys %{$user->{department}};
8 - 151
	if ($manager_departments) {
152
  	my ($count) = $dbh->selectrow_array ("select count(*) from official where $manager_departments");
153
  	my $counttxt = $count == 1 ? "is 1 user" : "are $count users";
56 bgadell 154
  	push @managers, $h->li ($h->a ({ href=>"users.pl?autoload=1&RCid=true&derby_name=true&email=true&real_name=true&access=true&department=true&added=true&filter-RCid=&filter-derby_name=&filter-email=&filter-real_name=&filter-access=0&filter-department=&filter-added=&sortby=derby_name&limit=25&page=1" }, "There $counttxt waiting to be activated")) if $count;
8 - 155
	}
156
 	push @managers, $h->li ($h->a ({ href=>"/schedule/log.pl" }, "Activity Log"));
29 - 157
  push @managers, $h->li ($h->a ({ href=>"/schedule/volhours.pl" }, "View Volunteer Hours by Department"));
39 - 158
 
159
  foreach (grep { $user->{department}->{$_} > 2 } keys %{$user->{department}}) {
160
    push @managers, $h->li ($h->a ({ href=>"/schedule/shifts.pl?autoload=1&dept=true&role=true&dayofweek=true&location=true&time=true&note=true&derby_name=true&filter-dept=$_&sortby=dayofweek&limit=All&page=1" }, "$DEPTS->{$_} Staff Schedule"));
161
  }
162
 
46 - 163
  if ($user->{department}->{VCI} > 2 or $user->{department}->{MVP} > 2 or $LVL > 4) {
56 bgadell 164
    push @managers, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "View MVP Classes"));
46 - 165
    push @managers, $h->li ($h->a ({ href=>"/schedule/mvp_class_report.pl", target=>"_new" }, "Daily MVP Class Report (for print)"));
112 - 166
    push @managers, $h->li ($h->a ({ href=>"/schedule/mvp_class_report_without_skaters.pl", target=>"_new" }, "Daily MVP Class Report without Skaters (for print)"));
46 - 167
    push @managers, $h->li ($h->a ({ href=>"/schedule/daily_print.pl", target=>"_new" }, "Daily Officiating Report (for print)"));
168
    push @managers, $h->li ($h->a ({ href=>"/schedule/daily_print_announcers.pl", target=>"_new" }, "Daily Announcers Report (for print)"));
169
    push @managers, $h->li ($h->a ({ href=>"/schedule/print_dept_by_day.pl", target=>"_new" }, "BETA: Daily Shift Report (for print)"));
249 - 170
    push @managers, $h->li ($h->a ({ href=>"https://tinyurl.com/RCreportingtool", target=>"_new" }, "COC Reporting Form"));
46 - 171
  }
172
 
220 - 173
  push @managers, $h->li ($h->a ({ href=>"/schedule/leadership.pl" }, "View Leadership Team"));
174
 
7 - 175
	# Shift Report: select dayofweek, count(RCid) as filled_shifts, count(*) - count(RCid) as open_shifts, count(*) as total_shifts from v_shift group by date order by date
176
}
177
 
90 bgadell 178
my (@sysadmins, @mvpcounts);
16 - 179
if ($LVL >= 5) {
180
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/bulk_upload.pl" }, "Upload a CSV of Department Shifts"));
60 bgadell 181
 	push @sysadmins, $h->li ($h->a ({ href=>"/schedule/shifts.pl" }, "Update department shift schedule"));
58 bgadell 182
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/tickets.pl" }, "Manage MVP Ticket Matches"));
56 bgadell 183
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "Manage MVP Classes"));
184
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/games.pl" }, "Manage Games"));
185
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/departments.pl" }, "Manage Department Settings"));
186
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/settings.pl" }, "System Settings"));
50 bgadell 187
 	push @sysadmins, $h->li ($h->a ({ href=>"/schedule/volhours_report.pl?limit=All" }, "YEAR END VOLUNTEER HOURS REPORT"));
249 - 188
  push @sysadmins, $h->li ($h->a ({ href=>"/schedule/shift_report.pl?limit=All" }, "Open / Closed Volunteer Shift Report"));
214 - 189
# 	push @sysadmins, $h->li ($h->a ({ href=>"/schedule/shifts.pl?excel=0&autoload=1&dept=true&date=true&dayofweek=true&time=true&doubletime=true&volhours=true&role=true&location=true&note=true&RCid=true&derby_name=true&filter-dept=COA&filter-date=&filter-dayofweek=&filter-time=&filter-doubletime=&filter-volhours=&filter-role=&filter-location=&filter-note=&filter-RCid=&filter-derby_name=&year=2024&sortby=dayofweek&limit=25&page=1" }, "COACH HOURS REPORT"));
190
 	push @sysadmins, $h->li ($h->a ({ href=>"/schedule/coach_hours.pl" }, "Coach Hours"));
191
 	push @sysadmins, $h->li ($h->a ({ href=>"/schedule/coach_pay.pl" }, "Coach Pay Report"));
90 bgadell 192
 
193
 
35 - 194
 
90 bgadell 195
 	my ($unclaimed_tix) = $dbh->selectrow_array ("select count(*) from v_ticket where isnull(RCid) = 1");
196
 	my ($mvpcount)      = $dbh->selectrow_array ("select count(*) from v_ticket where isnull(RCid) = 0");
62 bgadell 197
 	$mvpcount = 1 unless $mvpcount;
90 bgadell 198
 	my $class_limit = getSetting ("MAX_CLASS_SIGNUP");
35 - 199
 
90 bgadell 200
  push @mvpcounts, $h->li ($mvpcount." MVP Tickets have been matched in VORC. ($unclaimed_tix remain unmatched.)");
201
  push @mvpcounts, $h->li ("They could (in theory) sign up for ".$mvpcount*$class_limit." class spots.");
35 - 202
 
208 - 203
 	my ($signupcount, $total_class_count, $available_count) = $dbh->selectrow_array ("select sum(count), sum(capacity), sum(available) from v_class_new where year(date) = year(now())");
90 bgadell 204
 
116 - 205
 	$total_class_count //= 0;
90 bgadell 206
 	push @mvpcounts, $h->li ($total_class_count." Total Class Spots");
116 - 207
 	push @mvpcounts, $h->li ($signupcount." Filled Class Spots (".sprintf("%.2f", ($signupcount / $total_class_count) * 100)."\%)") unless !$total_class_count;
208
 	push @mvpcounts, $h->li ($available_count." Available Class Spots (".sprintf("%.2f", ($available_count / $total_class_count) * 100)."\%)") unless !$total_class_count;
90 bgadell 209
 
138 - 210
 	my ($active) = $dbh->selectrow_array ("select count(*) from official where last_active > (now() - interval 30 minute)");
35 - 211
 	push @sysadmins, $h->li ("There seem to be about $active user session(s) right now.");
16 - 212
}
213
 
7 - 214
my @activity_log;
215
my $alog = $dbh->prepare("select timestamp, event from v_log where RCid = ? limit 10");
216
$alog->execute($user->{RCid});
217
while (my @logs = $alog->fetchrow_array) {
218
	my ($d, $t) = split /\s+/, $logs[0];
219
	push @activity_log, $h->li ({ class=>"shaded" }, join " ", @logs);
220
}
221
 
222
my @reference;
8 - 223
push @reference, $h->li ($h->a ({ href=>"/info.html" }, "Information about using this tool"));
7 - 224
push @reference, $h->li ($h->a ({ href=>"http://rollercon.com/help-wanted/officiating/" }, "RollerCon Officiating Details"));
225
 
226
printRCHeader("Home");
227
print $h->close ("table");
228
 
50 bgadell 229
print $h->form ({ name => "Req", action => url });
7 - 230
 
50 bgadell 231
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Announcement:"), $h->ul ([ @announcements ]) ]) if (scalar @announcements);
232
 
35 - 233
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Note:"), "<b>Your account is being reviewed.</b>", $h->br, "You won't have access to view or sign-up for things until you've been approved / added to a department.", $h->br, "Please watch your email for notifications." ]) unless $activated;
234
 
7 - 235
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Your up-coming schedule (as of $dt):"), $schedule, $h->h5 ("[".$h->a ({ href=>"export_ics.pl?RCid=$user->{RCid}" }, "use this link for iCal")."]") ]) if $schedule;
236
 
105 bgadell 237
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "MVP Classes:"), $h->ul ([ @mvppass, $reviews ]) ]) if (scalar @mvppass);
35 - 238
 
7 - 239
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do:"), $h->ul ([ @everyone ]) ]);
240
 
241
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a Lead:"), $h->ul ([ @leads ]) ]) if ($LVL > 1);
242
 
16 - 243
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a Manager:"), $h->ul ([ @managers ]) ]) if ($LVL > 2);
7 - 244
 
16 - 245
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a SysAdmin:"), $h->ul ([ @sysadmins ]) ]) if ($LVL >= 5);
246
 
90 bgadell 247
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "MVP Class and Ticket Status:"), $h->ul ([ @mvpcounts ]) ]) if (scalar @mvpcounts);
248
 
8 - 249
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Your Latest Activity:"), $h->ul ([ @activity_log ]), $h->h5 ($h->a ({ href=>"log.pl?excel=0&autoload=1&eventid=true&timestamp=true&event=true&RCid=true&derby_name=true&filter-timestamp=&filter-event=&filter-RCid=".$user->{RCid}."&filter-derby_name=&sortby=eventid&limit=25&page=1" }, "[Your entire log history]")) ]);
7 - 250
 
251
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Reference:"), $h->ul ([ @reference ]) ]);
252
 
253
print $h->close ("body"), $h->close ("html");
254
 
50 bgadell 255