diff --git a/docs/upgrades/upgrade_7.5.2-7.5.3.pl b/docs/upgrades/upgrade_7.5.2-7.5.3.pl
index 196b1ad09..25d5fab14 100644
--- a/docs/upgrades/upgrade_7.5.2-7.5.3.pl
+++ b/docs/upgrades/upgrade_7.5.2-7.5.3.pl
@@ -119,14 +119,14 @@ sub upgradeEMS {
$db->write("create table EMSBadgeGroup (
badgeGroupId varchar(22) binary not null primary key,
emsAssetId varchar(22) binary not null,
- name varchar(100),
- badgeList text
+ name varchar(100)
)");
$db->write("create table EMSBadge (
assetId varchar(22) binary not null,
revisionDate bigint not null,
price float not null default 0.00,
seatsAvailable int not null default 100,
+ relatedBadgeGroups mediumtext,
primary key (assetId, revisionDate)
)");
$db->write("create table EMSTicket (
diff --git a/lib/WebGUI/Asset/Sku/EMSBadge.pm b/lib/WebGUI/Asset/Sku/EMSBadge.pm
index 6f3cdb66c..d59cde07b 100644
--- a/lib/WebGUI/Asset/Sku/EMSBadge.pm
+++ b/lib/WebGUI/Asset/Sku/EMSBadge.pm
@@ -88,6 +88,13 @@ sub definition {
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
+ relatedBadgeGroups => {
+ tab => "properties",
+ fieldType => "checkList",
+ customDrawMethod=> 'drawRelatedBadgeGroupsField',
+ label => $i18n->get("related badge groups"),
+ hoverHelp => $i18n->get("related badge groups badge help"),
+ },
);
push(@{$definition}, {
assetName => $i18n->get('ems badge'),
@@ -100,6 +107,24 @@ sub definition {
return $class->SUPER::definition($session, $definition);
}
+#-------------------------------------------------------------------
+
+=head2 drawRelatedBadgeGroupsField ()
+
+Draws the field for the relatedBadgeGroups property.
+
+=cut
+
+sub drawRelatedBadgeGroupsField {
+ my ($self, $params) = @_;
+ return WebGUI::Form::checkList($self->session, {
+ name => $params->{name},
+ value => $self->get($params->{name}),
+ vertical => 1,
+ options => $self->getParent->getBadgeGroups,
+ });
+}
+
#-------------------------------------------------------------------
diff --git a/lib/WebGUI/Asset/Sku/EMSTicket.pm b/lib/WebGUI/Asset/Sku/EMSTicket.pm
index 3de890144..2c8ad9af8 100644
--- a/lib/WebGUI/Asset/Sku/EMSTicket.pm
+++ b/lib/WebGUI/Asset/Sku/EMSTicket.pm
@@ -117,7 +117,7 @@ sub definition {
fieldType => "checkList",
customDrawMethod=> 'drawRelatedBadgeGroupsField',
label => $i18n->get("related badge groups"),
- hoverHelp => $i18n->get("related badge groups help"),
+ hoverHelp => $i18n->get("related badge groups ticket help"),
},
relatedRibbons => {
tab => "properties",
diff --git a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm
index 6dc944b6d..a019736b0 100644
--- a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm
+++ b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm
@@ -427,8 +427,6 @@ sub www_buildBadge {
my $session = $self->session;
return $session->privilege->noAccess() unless $self->canView;
$badgeId = $session->form->get("badgeId") if ($badgeId eq "");
- my $hasBadge = ($badgeId ne "");
- $whichTab ||= "tickets";
my $i18n = WebGUI::International->new($session, "Asset_EventManagementSystem");
my %var = (
%{$self->get},
@@ -437,9 +435,9 @@ sub www_buildBadge {
exportTicketsUrl => undef,
getTicketsUrl => $self->getUrl('func=getTicketsAsJson;badgeId='.$badgeId),
canEdit => $self->canEdit,
- hasBadge => $hasBadge,
+ hasBadge => ($badgeId ne ""),
badgeId => $badgeId,
- whichTab => $whichTab,
+ whichTab => $whichTab || "tickets",
addRibbonUrl => $self->getUrl('func=add;class=WebGUI::Asset::Sku::EMSRibbon'),
getRibbonsUrl => $self->getUrl('func=getRibbonsAsJson'),
getTokensUrl => $self->getUrl('func=getTokensAsJson'),
@@ -507,17 +505,6 @@ sub www_editBadgeGroup {
label => $i18n->get('badge group name'),
hoverHelp => $i18n->get('badge group name help'),
);
- $f->checkList(
- name => 'badgeList',
- value => $badgeGroup->{badgeList},
- options => $db->buildHashRef("select asset.assetId,assetData.title from asset left join assetData
- using (assetId) where asset.parentId=? and assetData.revisionDate=
- (SELECT max(revisionDate) from assetData where assetData.assetId=asset.assetId)
- and asset.className='WebGUI::Asset::Sku::EMSBadge'", [$self->getId]),
- vertical => 1,
- label => $i18n->get('badge list'),
- hoverHelp => $i18n->get('badge list help'),
- );
$f->submit;
return $self->processStyle('
'.$i18n->get('badge groups').'
'.$f->print);
}
@@ -536,12 +523,10 @@ sub www_editBadgeGroupSave {
return $self->session->privilege->insufficient() unless $self->canEdit;
my $form = $self->session->form;
my $id = $form->get("badgeGroupId") || "new";
- my @badgeList = $form->get("badgeList",'checkList');
$self->session->db->setRow("EMSBadgeGroup","badgeGroupId",{
badgeGroupId => $id,
emsAssetId => $self->getId,
name => $form->get('name'),
- badgeList => JSON::encode_json(\@badgeList),
});
return $self->www_manageBadgeGroups;
}
@@ -785,13 +770,57 @@ sub www_getTicketsAsJson {
@ids = $db->buildArray("select assetId from asset where parentId=? and className='WebGUI::Asset::Sku::EMSTicket'", [$self->getId]);
}
+ # get badge's badge groups
+ my $badgeId = $form->get('badgeId');
+ my @badgeGroups = ();
+ if (defined $badgeId) {
+ my $assetId = $db->quickScalar("select badgeAssetId from EMSRegistrant where badgeId=?",[$badgeId]);
+ my $badge = WebGUI::Asset->new($session, $assetId, 'WebGUI::Asset::Sku::EMSBadge');
+ @badgeGroups = split("\n",$badge->get('relatedBadgeGroups')) if (defined $badge);
+ }
+
# get assets
my $counter = 0;
+ my $totalTickets = scalar(@ids);
my @records = ();
foreach my $id (@ids) {
next unless ($counter >= $startIndex);
my $ticket = WebGUI::Asset->new($session, $id, 'WebGUI::Asset::Sku::EMSTicket');
- next unless defined $ticket;
+
+ # skip borked tickets
+ unless (defined $ticket) {
+ $session->errorHandler->warn("EMSTicket $id couldn't be instanciated by EMS ".$self->getId.".");
+ $totalTickets--;
+ next;
+ }
+
+ # skip tickets we can't view
+ unless ($ticket->canView) {
+ $totalTickets--;
+ next;
+ }
+
+ # skip tickets not in our badge's badge groups
+ if (scalar(@badgeGroups) > 0 && $ticket->get('relatedBadgeGroups') ne '') { # skip check if it has no badge groups
+ my @groups = split("\n",$ticket->get('relatedBadgeGroups'));
+ my $found = 0;
+ BADGE: {
+ foreach my $a (@badgeGroups) {
+ foreach my $b (@groups) {
+ if ($a eq $b) {
+ $found = 1;
+ last BADGE;
+ }
+ }
+ }
+ }
+ unless ($found) {
+ $totalTickets--;
+ next;
+ }
+ }
+
+ # publish the data for this ticket
my $date = WebGUI::DateTime->new($session, $ticket->get('startDate'));
push(@records, {
title => $ticket->getTitle,
@@ -813,7 +842,7 @@ sub www_getTicketsAsJson {
# build json
$results{records} = \@records;
- $results{totalRecords} = scalar(@ids);
+ $results{totalRecords} = $totalTickets;
$results{recordsReturned} = scalar(@records);
$results{'startIndex'} = $startIndex;
$results{'sort'} = undef;
diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm
index 648f60579..90021290f 100644
--- a/lib/WebGUI/Shop/Cart.pm
+++ b/lib/WebGUI/Shop/Cart.pm
@@ -282,6 +282,7 @@ An array reference of assetIds to look for.
sub getItemsByAssetId {
my ($self, $assetIds) = @_;
+ return [] unless (scalar(@{$assetIds}) > 0);
my @itemsObjects = ();
my $items = $self->session->db->read("select itemId from cartItem where cartId=? and assetId in (".$self->session->db->quoteAndJoin($assetIds).")",[$self->getId]);
while (my ($itemId) = $items->array) {
diff --git a/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm b/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm
index f6b574972..800bc31a9 100644
--- a/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm
+++ b/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm
@@ -21,19 +21,7 @@ our $I18N = {
},
'badge group name help' => {
- message => q|Enter a name to group these badges under.|,
- lastUpdated => 0,
- context => q|help for a badge group property label|,
- },
-
- 'badge list' => {
- message => q|Badge List|,
- lastUpdated => 0,
- context => q|a badge group property label|,
- },
-
- 'badge list help' => {
- message => q|Select the badges that belong to this group.|,
+ message => q|Enter a name to be used to link badges with tickets under.|,
lastUpdated => 0,
context => q|help for a badge group property label|,
},
@@ -362,12 +350,18 @@ our $I18N = {
context => q|a ticket property label|,
},
- 'related badge groups help' => {
+ 'related badge groups ticket help' => {
message => q|Check the badge groups that can act as a prerequisite to being able to attend this event. If none are checked, then any badge will do.|,
lastUpdated => 0,
context => q|help for a ticket property label|,
},
+ 'related badge groups badge help' => {
+ message => q|Check the badge groups that related to this badge, so that tickets can be assigned prerequisite badges.|,
+ lastUpdated => 0,
+ context => q|help for a ticket property label|,
+ },
+
'related ribbons' => {
message => q|Related Ribbons|,
lastUpdated => 0,