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,