--- /dev/null
+action,student_id,active,first_given_name,family_name,day_phone,address_type,street1,street2,city,county,state,post_code
+C,0000,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0001,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0002,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0003,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0004,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0005,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0006,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0007,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0008,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0009,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0010,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0011,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0012,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0013,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0014,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0015,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0016,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0017,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0018,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0019,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0020,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0021,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0022,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0023,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0024,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0025,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0026,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0027,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0028,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0029,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0030,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0031,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0032,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0033,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0034,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0035,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0036,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0037,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0038,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0039,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0040,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0041,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0042,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0043,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0044,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0045,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0046,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0047,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0048,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
+C,0049,true,Bellevue,High,,,10416 Wolverine Way,,Bellevue,,WA,98004
my $syslog_facility = 'LOCAL6'; # matches Evergreen gateway
my $syslog_ops = 'pid';
my $profile = 901; # "Student Ecard"
+my $c_profile = 902; # "Classroom Databases"
my $net_access = 101; # No Access
my $ident_type = 101; # "Sch-district file" ident type
+my $c_ident_type = 3; # ident type "Other"
+my $c_ident_value = "KCLS generated";
my $syslog_ident = 'ECARD';
my $alert_msg = 'Student Ecard: No physical checkouts. No computer/printing. No laptops.';
+my $c_alert_msg = 'Classroom use only: No physical checkouts. No computer/printing. No laptops.';
my $alert_type = 20; # "Alerting note, no Blocks" standing penalty
my $root_org = 1; # KCLS org unit for penalty application
my $db_handle;
my $default_pass;
my $commit_mode = 'rollback'; # single xact, then rollback (for testing)
my $assume_new = 0;
+my $is_classroom = 0;
my $purge_all = 0;
my $out_dir = '.';
my $log_stdout = 0; # copy logs to stdout
'assume-new' => \$assume_new,
'purge-all' => \$purge_all,
'default-pass=s' => \$default_pass,
+ 'classroom' => \$is_classroom,
'log-stdout' => \$log_stdout,
'out-dir=s' => \$out_dir,
'db-user=s' => \$db_user,
# expire date is set to July 1 after the patron's 18th birthday.
sub set_expire_date {
my $phash = shift;
+ my $now_date = DateTime->now;
+ my $now_year = $now_date->year;
+
+ if ($is_classroom) {
+ # classroom cards expire after 10 years.
+ $now_date->set_year($now_year + 10);
+ $phash->{expire_date} = $now_date;
+ return;
+ }
my ($year, $mon, $day) = ($phash->{dob} =~ /(\d{4})-(\d{2})-(\d{2})/);
- my $now_year = DateTime->now->year;
my $expire_year = $now_year + (18 - ($now_year - $year));
# Invalid DoB's can lead to expire_date's far in the future.
}
# Fills in gaps and massages data in the CSV hash.
-# Returns 1 on successful translation, undef on error.
+# Returns 1 on successful translation, undef on error.qw/student_id first_given_name family_name dob/) {
sub translate_patron_data {
my $phash = shift;
my $barcode = $phash->{barcode};
$phash->{$_} =~ s/(^\s*|\s*$)//g if $phash->{$_};
}
+ my @required = qw/student_id first_given_name family_name/;
+ push (@required, 'dob') unless $is_classroom;
+
# check required fields
- for my $field (qw/student_id first_given_name family_name dob/) {
+ for my $field (@required) {
push(@errors, "No data present for required field $field")
unless $phash->{$field};
}
- if ($phash->{dob} =~ m|\d{1,2}/\d{1,2}/\d{4}|) {
- # dob is encoded in American-style month/day/year
- # Translate it to ISO8601
- my ($mon, $day, $year) =
- $phash->{dob} =~ m|(\d{1,2})/(\d{1,2})/(\d{4})|;
- $phash->{dob} = sprintf("%s-%02d-%02d", $year, $mon, $day);
- }
+ if (!$is_classroom) { # classroom cards have no DoB
- push(@errors, "Invalid dob")
- unless $phash->{dob} =~ m/^\d{4}-\d{2}-\d{2}$/;
+ if ($phash->{dob} =~ m|\d{1,2}/\d{1,2}/\d{4}|) {
+ # dob is encoded in American-style month/day/year
+ # Translate it to ISO8601
+ my ($mon, $day, $year) =
+ $phash->{dob} =~ m|(\d{1,2})/(\d{1,2})/(\d{4})|;
+ $phash->{dob} = sprintf("%s-%02d-%02d", $year, $mon, $day);
+ }
+
+ push(@errors, "Invalid dob")
+ unless $phash->{dob} =~ m/^\d{4}-\d{2}-\d{2}$/;
+ }
if (my $dp = $phash->{day_phone}) {
my $barcode = $phash->{barcode};
my @user_bind = (
- 't', $profile, $ident_type, $barcode,
- $home_ou, $net_access,
+ 't',
+ $is_classroom ? $c_profile : $profile,
+ $is_classroom ? $c_ident_type : $ident_type,
+ $barcode, $home_ou, $net_access,
$phash->{passwd},
- $phash->{student_id},
+ $is_classroom ? $c_ident_value : $phash->{student_id},
$phash->{first_given_name},
$phash->{second_given_name},
$phash->{family_name},
my @alrt_bind = (
$root_org,
$alert_type,
- $alert_msg
+ $is_classroom ? $c_alert_msg : $alert_msg
);
return unless handle_insert($phash, $create_user_sth, \@user_bind);