diff --git a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm index e34992da3..439704736 100644 --- a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm +++ b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm @@ -302,7 +302,7 @@ sub checkConflicts { # my $eventsInCart = $self->getEventsInCart; my $eventsInCart = $self->getEventsInScratchCart; use Data::Dumper; - $self->session->errorHandler->warn(Dumper($eventsInCart)); + # $self->session->errorHandler->warn(Dumper($eventsInCart)); my @schedule; # Get schedule info for events in cart and sort asc by start date @@ -953,7 +953,7 @@ sub getSubEvents { # my $eventsInCart = $self->getEventsInCart; my $eventsInCart = $self->getEventsInScratchCart; use Data::Dumper; - $self->session->errorHandler->warn("getsubevents:
".Dumper($eventIds)."
"); + # $self->session->errorHandler->warn("getsubevents:
".Dumper($eventIds)."
"); foreach my $eventId (@$eventIds) { $subEvents = $self->findSubEvents($eventId); @@ -1099,93 +1099,130 @@ sub verifyAllPrerequisites { my $self = shift; use Data::Dumper; #start with the events in the scratch cart. See if all prerequisites are met - my $lastResults = $self->verifyEventPrerequisites($self->getEventsInScratchCart); - my @allResults; - while (1) { #loop forever until we break out - if (scalar(@$lastResults) > 0) { #we have missing prerequisites - foreach (@$lastResults) { - push(@allResults, $_); - } - $self->session->errorHandler->warn("lastResults 1:
".Dumper($lastResults)."
");
-	
-			#Run the check again this time on the events that were reported before as required
-			#This recursive checking allows us to list every required event to attend the events
-			#the user has selected up to this point all the way up the tree.
-			$lastResults = $self->verifyEventPrerequisites($lastResults->{'missingEventIds'});
-		}
-		else { #To a point where no prerequisites were reported
-			last;
-		}
+	my $startingEvents = {};
+	my $scratchEvents = $self->getEventsInScratchCart;
+	foreach (@$scratchEvents) {
+		$startingEvents->{$_} = $self->getEventDetails($_);
+	}
+	my ($lastResults, $msgLoop) = $self->verifyEventPrerequisites($startingEvents,1);
+	my $lastResultsSize = scalar(keys %$lastResults);
+	my $currentResultsSize = -4;
+	return [] unless $lastResultsSize;
+	until ($currentResultsSize == $lastResultsSize) {
+		$currentResultsSize = $lastResultsSize;
+		$lastResults = {%$lastResults,%{$self->verifyEventPrerequisites($lastResults)}};
+		$lastResultsSize = scalar(keys %$lastResults);
 	}
 	
-	$self->session->errorHandler->warn("verifyAllPrerequisites: 
".Dumper(@allResults)."
");
-	return \@allResults;
+	my $rowsLoop = [];
+	foreach (keys %$lastResults) {
+		my $details = $lastResults->{$_};
+		push(@$rowsLoop, {
+			'form.checkBox' => WebGUI::Form::checkbox($self->session, {
+				value => $_,
+				name  => "subEventPID"}
+			),
+			'title'		=> $details->{title},
+			'description'	=> $details->{description},
+			'price'		=> $details->{price}
+		});
+	}
+	$self->session->errorHandler->warn("verifyAllPrerequisites: 
".Dumper($msgLoop).Dumper($rowsLoop).Dumper($lastResults)."
"); + return $msgLoop, $rowsLoop; } - #------------------------------------------------------------------ sub verifyEventPrerequisites { my $self = shift; - my $eventsToCheck = shift; #array reference of eventIds - my @results; - - foreach my $eventId (@$eventsToCheck) { - - # Get all prerequisite definitions defined for this event - my $prerequisiteDefinitions = $self->session->db->buildHashRef("select prerequisiteId, operator from EventManagementSystem_prerequisites - where productId=?",[$eventId]); - foreach my $prerequisiteId (keys %{$prerequisiteDefinitions}) { - - my $operator = $prerequisiteDefinitions->{$prerequisiteId}; - - # Get the events required for each prerequisite definition (the events required for attending $eventId) - my $requiredEvents = $self->session->db->buildArrayRef("select requiredProductId from EventManagementSystem_prerequisiteEvents - where prerequisiteId=?",[$prerequisiteId]); - - unless ($self->prerequisiteIsMet($operator, $requiredEvents)) { - - #compare all the required events to the events in the scratch cart and build a list of the ones - #that are required but not currently in the scratch cart. - my $scratchCart = $self->getEventsInScratchCart; - my @missingEventIds; - - foreach my $requiredEvent (@$requiredEvents) { - push (@missingEventIds, $requiredEvent) unless isIn($requiredEvent, $scratchCart); - } - - my $missingEventNames = $self->getRequiredEventNames($prerequisiteId); - my $message = $self->getEventName($eventId)." requires: "; - - foreach my $missingEventName (@$missingEventNames) { - $message .= "$missingEventName $operator "; - } - - $message =~ s/(and\s|or\s)$//; #remove trailing 'and' or 'or' from the message - - push(@results, {'missingEventIds' => \@missingEventIds, - 'message' => $message - }); - } + my $lastResults = shift; + my $returnMsgLoop = shift; + my $msgLoop = []; + my $newResults = {}; + foreach (keys %$lastResults) { + my ($required,$messageLoop) = $self->getAllPossibleEventPrerequisites($_); + # add in any new ones. + foreach my $req (@$required) { + $newResults->{$req} = $self->getEventDetails($req); + } + if ($returnMsgLoop) { + my $details = $self->getEventDetails($_); + push (@$msgLoop,{%$details,messageLoop=>$messageLoop}); } } - return \@results; + return $newResults,$msgLoop if $returnMsgLoop; + return $newResults; } +#------------------------------------------------------------------ +sub getAllPossibleEventPrerequisites { + my $self = shift; + my $eventId = shift; + my $required = []; + my $messageLoop = []; + + # Get all prerequisite definitions defined for this event + my $prerequisiteDefinitions = $self->session->db->buildHashRef("select prerequisiteId, operator from EventManagementSystem_prerequisites + where productId=?",[$eventId]); + foreach my $prerequisiteId (keys %{$prerequisiteDefinitions}) { + my $message; + my $operator = $prerequisiteDefinitions->{$prerequisiteId}; + + # Get the events required for each prerequisite definition (the events required for attending $eventId) + my $requiredEvents = $self->session->db->buildArrayRef("select requiredProductId from EventManagementSystem_prerequisiteEvents + where prerequisiteId=?",[$prerequisiteId]); + + unless ($self->prerequisiteIsMet($operator, $requiredEvents)) { + + #compare all the required events to the events in the scratch cart and build a list of the ones + #that are required but not currently in the scratch cart. + my $scratchCart = $self->getEventsInScratchCart; + my @missingEventIds; + + foreach my $requiredEvent (@$requiredEvents) { + push (@missingEventIds, $requiredEvent) unless isIn($requiredEvent, @$scratchCart); + } + + my $missingEventNames = $self->getRequiredEventNames($prerequisiteId); + + foreach my $missingEventName (@$missingEventNames) { + $message .= "$missingEventName $operator "; + } + + $message =~ s/(\sand\s|\sor\s)$//; #remove trailing 'and' or 'or' from the message + + foreach (@missingEventIds) { + push(@$required,$_) unless isIn($_,@$required); + } + } + push(@$messageLoop,$message); + } + return $required,$messageLoop; +} + + +#------------------------------------------------------------------ +sub getEventDetails { + my $self = shift; + my $eventId = shift; + return $self->{_eventDetails}{$eventId} if $self->{_eventDetails}{$eventId}; + $self->{_eventDetails}{$eventId} = $self->session->db->quickHashRef( + "select productId, title, price, description from products where productId = ?" + ,[$eventId] + ); + return $self->{_eventDetails}{$eventId}; +} + + #------------------------------------------------------------------ sub verifyPrerequisitesForm { my $self = shift; - my $missingEventData = $self->verifyAllPrerequisites; - my @message_loop; - my @selectedEvents_loop; - my @missingEvents_loop; + my ($missingEventMessageLoop, $allPrereqsLoop) = $self->verifyAllPrerequisites; my @usedEventIds; - my @missingEventData_loop; - my @eventData_loop; my $scratchCart = $self->getEventsInScratchCart; my %var; #If there is no missing event data, return nothing - return if (scalar(@$missingEventData) == 0); + return unless scalar(@$missingEventMessageLoop); my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); @@ -1200,44 +1237,9 @@ sub verifyPrerequisitesForm { #Set the template vars needed to inform the user of the missing prereqs. $var{'prereqsAreMissing'} = 1; - - foreach my $data (@$missingEventData) { - push (@message_loop, { 'prereq_message' => $data->{'message'} }); - - # Get the details for each event that could be used to fix this prereq problem - foreach my $eventId (@{$data->{'missingEventIds'}}) { - my $missingEventData = $self->session->db->read(" - select productId, title, price, description - from products - where - productId = ".$self->session->db->quote($eventId)." - and productId not in (".$self->session->db->quoteAndJoin($scratchCart).")" - ); - push(@missingEventData_loop, $missingEventData); - } - - foreach my $eventData (@missingEventData_loop) { - while (my $eventData = $eventData->hashRef) { - - # Track used event ids so we can prevent listing a subevent more than once. - next if (isIn($eventData->{productId}, @usedEventIds)); - push (@usedEventIds, $eventData->{productId}); - - push(@eventData_loop, { - 'form.checkBox' => WebGUI::Form::checkbox($self->session, { - value => $eventData->{productId}, - name => "subEventPID"}), - 'title' => $eventData->{title}, - 'description' => $eventData->{description}, - 'price' => $eventData->{price} - }); - } - } - } - $var{'message_loop'} = \@message_loop; - $var{'missingEvents_loop'} = \@eventData_loop; - - return \%var; + $var{'message_loop'} = $missingEventMessageLoop; + $var{'missingEvents_loop'} = $allPrereqsLoop; + return \%var; } #------------------------------------------------------------------ @@ -1905,6 +1907,7 @@ sub www_viewPurchase { my %var = $self->get(); my $isAdmin = $self->canAddEvents; my $tid = $self->session->form->process('tid'); + my ($userId) = $self->session->db->quickArray("select userId from transaction where transactionId=?",[$tid]); my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); my $sql = "select distinct(r.purchaseId), b.* from EventManagementSystem_registrations as r, EventManagementSystem_badges as b, EventManagementSystem_purchases as t where r.badgeId=b.badgeId and r.purchaseId=t.purchaseId and t.transactionId=? order by b.lastName"; my $sth = $self->session->db->read($sql,[$tid]); @@ -1912,18 +1915,23 @@ sub www_viewPurchase { while (my $purchase = $sth->hashRef) { my $badgeId = $purchase->{badgeId}; my $pid = $purchase->{purchaseId}; - my $sql2 = "select distinct r.registrationId, p.title, p.description, p.price, p.templateId, r.returned, e.approved, e.maximumAttendees, e.startDate, e.endDate from EventManagementSystem_registrations as r, EventManagementSystem_badges as b, EventManagementSystem_products as e, products as p where r.badgeId=? and r.purchaseId=? order by b.lastName"; + my $sql2 = "select r.registrationId, p.title, p.description, p.price, p.templateId, r.returned, e.approved, e.maximumAttendees, e.startDate, e.endDate from EventManagementSystem_registrations as r, EventManagementSystem_badges as b, EventManagementSystem_products as e, products as p where r.badgeId=? and r.purchaseId=? group by r.registrationId order by b.lastName"; my $sth2 = $self->session->db->read($sql2,[$badgeId,$pid]); $purchase->{regLoop} = []; while (my $reg = $sth2->hashRef) { + $reg->{startDateHuman} = $self->session->datetime->epochToHuman($reg->{'startDate'}); + $reg->{endDateHuman} = $self->session->datetime->epochToHuman($reg->{'endDate'}); push(@{$purchase->{regLoop}},$reg); } push(@purchasesLoop,$purchase); } $var{viewPurchaseTitle} = $i18n->get('view purchase'); $var{canReturn} = $isAdmin; + $var{transactionId} = $tid; + $var{canAddEvents} = $isAdmin || $userId eq $self->session->var->get('userId'); + $var{appUrl} = $self->getUrl; $sth->finish; - $var{'purchasesLoop'} = \@purchasesLoop; + $var{purchasesLoop} = \@purchasesLoop; return $self->session->style->process($self->processTemplate(\%var,$self->getValue("viewPurchaseTemplateId")),$self->getValue("styleTemplateId")); } @@ -1971,7 +1979,7 @@ sub www_editEventMetaDataField { $f->text( -name => "name", -label => $i18n->get(475), - -hoverHelp => $i18n->get('475 description'),, + -hoverHelp => $i18n->get('475 description'), -extras=>(($data->{name} eq $i18n2->get('type name here'))?' style="color:#bbbbbb" ':'').' onblur="if(!this.value){this.value=\''.$i18n2->get('type name here').'\';this.style.color=\'#bbbbbb\';}" onfocus="if(this.value == \''.$i18n2->get('type name here').'\'){this.value=\'\';this.style.color=\'\';}"', -value => $data->{name}, );