package WebGUI::Asset::Wobject::EventManagementSystem; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2006 Plain Black Corporation. ------------------------------------------------------------------- Please read the legal notices (docs/legal.txt) and the license (docs/license.txt) that came with this distribution before using this software. ------------------------------------------------------------------- http://www.plainblack.com info@plainblack.com ------------------------------------------------------------------- =cut use strict; use base 'WebGUI::Asset::Wobject'; use Tie::IxHash; use WebGUI::HTMLForm; use JSON; use WebGUI::Workflow::Instance; use WebGUI::Cache; use WebGUI::International; use WebGUI::Commerce::ShoppingCart; use WebGUI::Commerce::Item; use WebGUI::Utility; use Data::Dumper; #------------------------------------------------------------------- sub _getFieldHash { my $self = shift; return $self->{_fieldHash} if ($self->{_fieldHash}); my %hash; tie %hash, "Tie::IxHash"; my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); %hash = ( "eventName"=>{ name=>$i18n->get('add/edit event title'), type=>"text", compare=>"text", method=>"text", columnName=>"title", tableName=>"p", initial=>1 }, "eventDescription"=>{ name=>$i18n->get("add/edit event description"), type=>"text", compare=>"text", method=>"text", columnName=>"description", tableName=>"p", initial=>1 }, "maxAttendees"=>{ name=>$i18n->get("add/edit event maximum attendees"), type=>"text", compare=>"numeric", method=>"integer", columnName=>"maximumAttendees", tableName=>"e", initial=>1 }, "seatsAvailable"=>{ name=>$i18n->get("seats available"), type=>"text", method=>"integer", compare=>"numeric", calculated=>1, initial=>1 }, "price"=>{ name=>$i18n->get("add/edit event price"), type=>"text", compare=>"numeric", method=>"float", columnName=>"price", tableName=>"p", initial=>1 }, "startDate"=>{ name=>$i18n->get("add/edit event start date"), type=>"dateTime", compare=>"numeric", method=>"dateTime", columnName=>"startDate", tableName=>"e", initial=>1 }, "endDate"=>{ name=>$i18n->get("add/edit event end date"), type=>"dateTime", compare=>"numeric", method=>"dateTime", columnName=>"endDate", tableName=>"e", initial=>1 }, "requirement"=>{ name=>$i18n->get('add/edit event required events'), type=>"select", list=>{''=>$i18n->get('select one'),$self->_getAllEvents()}, compare=>"boolean", method=>"selectBox", calculated=>1, initial=>0 } ); # Add custom metadata fields to the list, matching the types up # automatically. my $fieldList = $self->getEventMetaDataArrayRef; foreach my $field (@{$fieldList}) { next unless $field->{visible}; my $dataType = $field->{dataType}; my $compare = $self->_matchTypes($dataType); my $type; if ($dataType =~ /^date/i) { $type = lcfirst($dataType); } elsif ($compare eq 'text' || $compare eq 'numeric') { $type = 'text'; } else { $type = 'select'; } $hash{$field->{fieldId}} = { name=>$field->{label}, type=>$type, method=>$dataType, initial=>$field->{autoSearch}, compare=>$compare, calculated=>1, metadata=>1 }; if ($hash{$field->{fieldId}}->{type} eq 'select') { $hash{$field->{fieldId}}->{list} = $self->_matchPairs($field->{possibleValues}); } } $self->{_fieldHash} = \%hash; return $self->{_fieldHash}; } #------------------------------------------------------------------- sub _matchPairs { my $self = shift; my $options = shift; my %hash; tie %hash, 'Tie::IxHash'; my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); $hash{''} = $i18n->get('select one'); foreach (split("\n",$options)) { my $val = $_; #$val =~ s/\s//g; $val =~ s/\r//g; $val =~ s/\n//g; $hash{$val} = $val; } return \%hash; } #------------------------------------------------------------------- sub _matchTypes { my $self = shift; my $dataType = lc(shift); return 'text' if ( WebGUI::Utility::isIn($dataType, qw( codearea email htmlarea phone text textarea url zipcode )) ); return 'numeric' if ( WebGUI::Utility::isIn($dataType, qw( date datetime float integer interval )) ); return 'boolean' if ( WebGUI::Utility::isIn($dataType, qw( checkbox combo selectlist checklist contenttype databaselink fieldtype group ldaplink radio radiolist selectbox template timezone yesno )) ); return 'text'; } #------------------------------------------------------------------- sub _getAllEvents { my $self = shift; my $conditionalWhere; if ($self->get("globalPrerequisites") == 0) { $conditionalWhere = "and e.assetId=".$self->session->db->quote($self->get('assetId')); } my $sql = "select p.productId, p.title from products as p, EventManagementSystem_products as e where p.productId = e.productId $conditionalWhere"; return $self->session->db->buildHash($sql); } #------------------------------------------------------------------- # # Temporary Shopping Cart to store subevent selections for prerequisite and conflict checking # Contents are moved to real shopping cart after attendee information is entered and the scratchCart gets emptied. # sub addToScratchCart { my $self = shift; my $event = shift; my @eventsInCart = split("\n",$self->session->scratch->get('EMS_scratch_cart')); push(@eventsInCart, $event) unless isIn($event,@eventsInCart); $self->session->scratch->delete('EMS_scratch_cart'); $self->session->scratch->set('EMS_scratch_cart', join("\n", @eventsInCart)); } #------------------------------------------------------------------- sub canApproveEvents { my $self = shift; return $self->session->user->isInGroup($self->get("groupToApproveEvents")); } #------------------------------------------------------------------- sub canAddEvents { my $self = shift; return $self->session->user->isInGroup($self->get("groupToAddEvents")); } #------------------------------------------------------------------- sub buildMenu { my $self = shift; my $var = shift; my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); my $fields = $self->_getFieldHash(); my $counter = 0; my $js = "var filterList = {\n"; foreach my $fieldId (keys %{$fields}) { my $field = $fields->{$fieldId}; next if $fieldId eq 'requirement'; $js .= ",\n" if($counter++ > 0); my $fieldName = $field->{name}; my $fieldType = $field->{type}; my $compareType = $field->{compare}; my $autoSearch = $field->{initial}; $js .= qq|"$fieldId": {|; $js .= qq| "name":"$fieldName"|; $js .= qq| ,"type":"$fieldType"|; $js .= qq| ,"compare":"$compareType"|; $js .= qq| ,"autoSearch":"$autoSearch"|; if($fieldType eq "select") { my $list = $field->{list}; my $fieldList = ""; foreach my $key (keys %{$list}) { $fieldList .= "," if($fieldList ne ""); my $value = $list->{$key}; $value =~ s/"/\"/g; $fieldList .= qq|"$key":"$value"| } $js .= qq| ,"list":{ $fieldList }|; } $js .= q| }|; } $js .= "\n};\n"; $var->{'search.filters.options'} = $js; $var->{'search.data.url'} = $self->getUrl; } #------------------------------------------------------------------- =head2 checkConflicts ( ) Check for scheduling conflicts in events in the user's cart. A conflict is defined as whenever two events have overlapping times. =cut sub checkConflicts { my $self = shift; # my $eventsInCart = $self->getEventsInCart; my $checkSingleEvent = shift; my $eventsInCart = $self->getEventsInScratchCart; # $self->session->errorHandler->warn(Dumper($eventsInCart)); my @schedule; # Get schedule info for events in cart and sort asc by start date my $sth = $self->session->db->read(" select productId, startDate, endDate from EventManagementSystem_products where productId in (".$self->session->db->quoteAndJoin($eventsInCart).") order by startDate" ); # Build our schedule while (my $scheduleData = $sth->hashRef) { # make sure it's a subevent... my ($isSubEvent) = $self->session->db->quickArray(" select count(*) from EventManagementSystem_products where (prerequisiteId is not null or prerequisiteId != '') and productId=?", [$scheduleData->{productId}] ); next unless ($isSubEvent); push(@schedule, $scheduleData); } my $singleData = {}; $singleData = $self->session->db->quickHashRef("select productId, startDate, endDate from EventManagementSystem_products where productId=?", [$checkSingleEvent]) if $checkSingleEvent; # Check the schedule for conflicts for (my $i=0; $i < scalar(@schedule); $i++) { next if ($i == 0 && !$checkSingleEvent); if ($checkSingleEvent) { return 1 if ($singleData->{startDate} < $schedule[$i]->{endDate} && $singleData->{endDate} > $schedule[$i]->{startDate}); } else { unless ($schedule[$i]->{startDate} > $schedule[$i-1]->{endDate}) { #conflict return [{ 'event1' => $schedule[$i]->{productId}, 'event2' => $schedule[$i-1]->{productId}, 'type' => 'conflict' }]; } } } return 0 if $checkSingleEvent; return []; } #------------------------------------------------------------------- =head2 checkRequiredFields ( requiredFields ) Check for null form fields. Returns an array reference containing error messages =head3 requiredFields A hash reference whose keys correspond to field names and values correspond to the field name as it should be shown to the user in an error. =cut sub checkRequiredFields { my $self = shift; my $requiredFields = shift; my @errors; foreach my $requiredField (keys %{$requiredFields}) { if ($self->session->form->get($requiredField) eq "") { push(@errors, { type => "nullField", fieldName => $requiredFields->{"$requiredField"} } ); } } return \@errors; } #------------------------------------------------------------------- sub definition { my $class = shift; my $session = shift; my $definition = shift; my %properties; tie %properties, 'Tie::IxHash'; my $i18n = WebGUI::International->new($session,'Asset_EventManagementSystem'); %properties = ( displayTemplateId =>{ fieldType=>"template", defaultValue=>'EventManagerTmpl000001', tab=>"display", namespace=>"EventManagementSystem", hoverHelp=>$i18n->get('display template description'), label=>$i18n->get('display template') }, checkoutTemplateId =>{ fieldType=>"template", defaultValue=>'EventManagerTmpl000003', tab=>"display", namespace=>"EventManagementSystem_checkout", hoverHelp=>$i18n->get('checkout template description'), label=>$i18n->get('checkout template') }, managePurchasesTemplateId =>{ fieldType=>"template", defaultValue=>'EventManagerTmpl000004', tab=>"display", namespace=>"EventManagementSystem_managePurchas", hoverHelp=>$i18n->get('manage purchases template description'), label=>$i18n->get('manage purchases template') }, viewPurchaseTemplateId =>{ fieldType=>"template", defaultValue=>'EventManagerTmpl000005', tab=>"display", namespace=>"EventManagementSystem_viewPurchase", hoverHelp=>$i18n->get('view purchase template description'), label=>$i18n->get('view purchase template') }, searchTemplateId =>{ fieldType=>"template", defaultValue=>'EventManagerTmpl000006', tab=>"display", namespace=>"EventManagementSystem_search", hoverHelp=>$i18n->get('search template description'), label=>$i18n->get('search template') }, paginateAfter =>{ fieldType=>"integer", defaultValue=>10, tab=>"display", hoverHelp=>$i18n->get('paginate after description'), label=>$i18n->get('paginate after') }, groupToAddEvents =>{ fieldType=>"group", defaultValue=>3, tab=>"security", hoverHelp=>$i18n->get('group to add events description'), label=>$i18n->get('group to add events') }, groupToApproveEvents =>{ fieldType=>"group", defaultValue=>3, tab=>"security", hoverHelp=>$i18n->get('group to approve events description'), label=>$i18n->get('group to approve events') }, globalPrerequisites =>{ fieldType=>"yesNo", defaultValue=>1, tab=>"properties", label=>$i18n->get('global prerequisite'), hoverHelp=>$i18n->get('global prerequisite description') }, globalMetadata =>{ fieldType=>"yesNo", defaultValue=>1, tab=>"properties", label=>$i18n->get('global metadata'), hoverHelp=>$i18n->get('global metadata description') }, ); push(@{$definition}, { assetName=>$i18n->get('assetName'), icon=>'ems.gif', autoGenerateForms=>1, tableName=>'EventManagementSystem', className=>'WebGUI::Asset::Wobject::EventManagementSystem', properties=>\%properties }); return $class->SUPER::definition($session,$definition); } #------------------------------------------------------------------ =head2 deleteOrphans ( ) Utility method that checks for prerequisite groupings that no longer have any events assigned to them and deletes it =cut sub deleteOrphans { my $self = shift; # MSW Note - as this is on 4/27/2006, I don't think query will ever return any results. #Check for orphaned prerequisite definitions my @orphans = $self->session->db->quickArray("select p.prerequisiteId from EventManagementSystem_prerequisites as p left join EventManagementSystem_prerequisiteEvents as pe on p.prerequisiteId = pe.prerequisiteId where pe.prerequisiteId is null"); foreach my $orphan (@orphans) { $self->session->db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=". $self->session->db->quote($orphan)); } } #------------------------------------------------------------------- sub emptyScratchCart { my $self = shift; $self->session->scratch->delete('EMS_scratch_cart'); } #------------------------------------------------------------------- =head2 error ( errors, callback ) Generates error messages and calls specified method to display them. =head3 errors An array reference containing an error stack =cut =head3 callback The method to call and pass the generated error messages to for display to the user =cut sub error { my $self = shift; my $errors = shift; my $callback = shift; my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); my @errorMessages; foreach my $error (@$errors) { #Null Field Error if ($error->{type} eq "nullField") { push(@errorMessages, sprintf($i18n->get('null field error'),$error->{fieldName})); } #General Error Message elsif ($error->{type} eq "general") { push(@errorMessages, $error->{message}); } #Scheduling Conflict elsif ($error->{type} eq "conflict") { push(@errorMessages, $self->resolveConflictForm($error->{event1}, $error->{event2})); } elsif ($error->{type} eq "special") { push(@errorMessages, unpack("u",$error->{message})); } } return $self->$callback(\@errorMessages); } #------------------------------------------------------------------ =head2 eventIsApproved ( eventId ) Returns approval status of a specified event =head3 eventId Id of event whose approval status you are trying to determine =cut sub eventIsApproved { my $self = shift; my $eventId = shift; my ($result) = $self->session->db->quickArray("select approved from EventManagementSystem_products where productId=?",[$eventId]); return $result; } #------------------------------------------------------------------ =head2 getAssignedPrerequisites ( eventId ) Returns prerequisiteId of every prerequisite grouping assigned to eventId passed in. =head3 eventId Id of the event whose prerequisites you want returned =cut sub getAssignedPrerequisites { my $self = shift; my $eventId = shift; my $returnProductIdFlag = shift; my $sql; unless ($returnProductIdFlag) { $sql = "select prereqs.prerequisiteId, prereqs.operator from EventManagementSystem_prerequisites as prereqs, EventManagementSystem_products as p where prereqs.prerequisiteId = p.prerequisiteId and p.productId=?"; } else { $sql = "select prereqs.prerequisiteId, prereqs.operator from EventManagementSystem_prerequisites as prereqs, EventManagementSystem_products as p where where prereqs.prerequisiteId = p.prerequisiteId and p.productId=?"; } return $self->session->db->buildHashRef($sql,[$eventId]); } #------------------------------------------------------------------ =head2 getEventsInCart ( ) Returns an array ref of all items in the cart, by id. =cut sub getEventsInCart { my $self = shift; my $cart = WebGUI::Commerce::ShoppingCart->new($self->session); my ($cartItems) = $cart->getItems; my @eventsInCart = map { $_->{item}->id } @{ $cartItems }; return \@eventsInCart; } #------------------------------------------------------------------ sub getEventsInScratchCart { my $self = shift; my @eventsInCart = split("\n",$self->session->scratch->get('EMS_scratch_cart')); return \@eventsInCart; } #------------------------------------------------------------------ sub getEventName { my $self = shift; my $eventId = shift; my ($eventName) = $self->session->db->quickArray("select title from products where productId=?",[$eventId]); return $eventName; } #------------------------------------------------------------------ =head2 getPrerequisiteEventList ( eventId ) Returns hash reference of EventId, Name pairs of events that qualify to be a specified Event Id's prerequisite This method returns all events except for a) the event matching the eventId parameter passed in AND b) any events currently assigned as a prerequisite to the eventId parameter passed in as a hash reference with the productId, and title Checks property globalPrerequisites to determine if events from all defined Event Managers should be displayed or only the events defined in this particular Event Manager =head3 eventId Id of the event that you want to return eligible prerequisites for =cut sub getPrerequisiteEventList { my $self = shift; my $eventId = shift; my $conditionalWhere; if ($self->get("globalPrerequisites") == 0) { $conditionalWhere = "and e.assetId=".$self->session->db->quote($self->get('assetId')); } my $sql = "select p.productId, p.title from products as p, EventManagementSystem_products as e where p.productId = e.productId and p.productId !=".$self->session->db->quote($eventId)." $conditionalWhere and p.productId not in (select requiredProductId from EventManagementSystem_prerequisites as p, EventManagementSystem_prerequisiteEvents as pe where p.prerequisiteId = pe.prerequisiteId and p.productId=".$self->session->db->quote($eventId).")"; return $self->session->db->buildHashRef($sql); } #------------------------------------------------------------------ =head2 getEventMetaDataArrayRef ( ) Returns an arrayref of hash references of the metadata fields. Checks $self->get("globalMetadata") by default; otherwise uses the first parameter. =head3 useGlobalMetadata Whether or not to use the asset's global setting, and the override. =cut sub getEventMetaDataArrayRef { my $self = shift; my $useGlobalMetadata = shift; my $productId = shift; $useGlobalMetadata = ($useGlobalMetadata)?$useGlobalMetadata:$self->get("globalMetadata"); my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where assetId='".$self->getId."'":''; return $self->getEventMetaDataFields($productId) if $productId; return $self->session->db->buildArrayRefOfHashRefs("select * from EventManagementSystem_metaField $globalWhere order by sequenceNumber, assetId"); } #------------------------------------------------------------------- =head2 getEventMetaDataFields ( productId ) Returns a hash reference containing all metadata field properties. =head3 productId Which product to get metadata for. =cut sub getEventMetaDataFields { my $self = shift; my $productId = shift; my $useGlobalMetadata = shift; my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where f.assetId='".$self->getId."'":''; my $sql = "select f.*, d.fieldData from EventManagementSystem_metaField f left join EventManagementSystem_metaData d on f.fieldId=d.fieldId and d.productId=".$self->session->db->quote($productId)." $globalWhere order by f.sequenceNumber"; tie my %hash, 'Tie::IxHash'; my $sth = $self->session->db->read($sql); while( my $h = $sth->hashRef) { foreach(keys %$h) { $hash{$h->{fieldId}}{$_} = $h->{$_}; } } $sth->finish; return \%hash; } #------------------------------------------------------------------ sub getBadgeSelector { my $self = shift; my $output; my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); my $selfName = ($self->session->var->get('userId') ne '1') ? $self->session->user->profileField('firstName').' '.$self->session->user->profileField('lastName').' ('.$i18n->get('you').')' : $i18n->get('create a badge for myself'); $selfName = $i18n->get('create a badge for myself') if $selfName eq ' ('.$i18n->get('you').')'; my %options; tie %options, 'Tie::IxHash'; %options = ( 'thisIsI' => $selfName, 'new' => $i18n->get('create a badge for someone else') ); my $isAdmin = $self->canAddEvents; my $badges = {}; my $me = $self->session->var->get('userId'); my $addBadgeId = $self->session->scratch->get('EMS_add_purchase_badgeId'); if ($isAdmin) { # all badges in the system. $badges = $self->session->db->buildHashRef("select badgeId, CONCAT(lastName,', ',firstName) from EventManagementSystem_badges order by lastName"); } elsif ($me eq '1') { #none $badges = {}; %options = (); } else { #badges we have purchased. $badges = $self->session->db->buildHashRef("select b.badgeId, CONCAT(b.lastName,', ',b.firstName) from EventManagementSystem_badges as b where b.userId='".$me."' or b.createdByUserId='".$me."' order by b.lastName"); } if ($addBadgeId) { $badges = $self->session->db->buildHashRef("select badgeId, CONCAT(lastName,', ',firstName) from EventManagementSystem_badges where badgeId=?",[$addBadgeId]); %options = (); } my $js; my %badgeJS; my $defaultBadge; foreach (keys %$badges) { $badgeJS{$_} = $self->session->db->quickHashRef("select * from EventManagementSystem_badges where badgeId=?",[$_]); $defaultBadge ||= $badgeJS{$_}->{badgeId}; if ($badgeJS{$_}->{userId} eq $me) { # we have a match! delete $options{'thisIsI'}; $defaultBadge = $badgeJS{$_}->{badgeId}; } } $js = ''; %options = (%options,%{$badges}); $output .= WebGUI::Form::selectBox($self->session,{ name => 'badgeId', options => \%options, value => ($addBadgeId ? $addBadgeId : $defaultBadge), extras => 'onchange="swapBadgeInfo(this.value)" onkeyup="swapBadgeInfo(this.value)"' }).($addBadgeId ? WebGUI::Form::hidden($self->session,{ name => 'badgeId',value=>$addBadgeId }) : ''); return $js.$output if scalar(keys(%options)); return ''; } #------------------------------------------------------------------ =head2 getRequiredEventName ( prerequisiteId ) Returns names of every event assigned to the prerequisite grouping of the prerequisite group id passed in =head3 prerequisiteId Id of the prerequisite group whose assigned event names you want returned =cut sub getRequiredEventNames { my $self = shift; my $prerequisiteId = shift; #use Data::Dumper; #$self->session->errorHandler->warn("
".Dumper($prerequisiteId).""); my $sql = "select title from products as p, EventManagementSystem_prerequisites as pr, EventManagementSystem_prerequisiteEvents as pe where pe.requiredProductId = p.productId and pr.prerequisiteId = pe.prerequisiteId and pr.prerequisiteId=?"; return $self->session->db->buildArrayRef($sql,[$prerequisiteId]); } #------------------------------------------------------------------ #sub findSubEvents { # my $self = shift; # my $eventId = shift; # my $returnEverythingFlag = shift; # # my $eventsInCart = $self->getEventsInScratchCart; # # # Get the prerequisites for the sub events passed in # my $subEventPrerequisites = $self->getSubEventPrerequisites($eventId); # # # Now we need to see if the prerequisites are satisfied # my @failedSubEvents; # my @subEvents; # foreach my $subEventPrerequisite (keys %{$subEventPrerequisites}) { # # my ($prerequisiteId, $productId) = split(':',$subEventPrerequisite); # # # Is this an 'And' or an 'Or' prerequisite # my $operator = $subEventPrerequisites->{$subEventPrerequisite}; # # # All of the required events per this prerequisite definition # my @requiredEventList = $self->session->db->buildArray(" # select requiredProductId from EventManagementSystem_prerequisiteEvents # where prerequisiteId=".$self->session->db->quote($prerequisiteId) # ); # # # Check to see that every required prerequisite is met # # # # If a sub-event fails one of it's prerequisites we'll push the productId onto a failure list # # At the end, we'll only return events whos productId is not in the failure list. # # # if ($operator eq 'and') { # make sure every required event is in the users cart # foreach my $requiredEvent (@requiredEventList) { # unless ( WebGUI::Utility::isIn($requiredEvent, @{$eventsInCart}) ) { # push (@failedSubEvents, $productId); # last; # } # } # } elsif ($operator eq 'or') { # make sure one of the required events is in the users cart # # my $atLeastOneFlag = 0; # foreach my $requiredEvent (@requiredEventList) { # if ( WebGUI::Utility::isIn($requiredEvent, @{$eventsInCart}) ) { # $atLeastOneFlag = 1; # last; # } # } # push(@failedSubEvents, $productId) unless ($atLeastOneFlag); # } # } # # # Return list of # # # Check our list against the failed events, return productIds of valid subevents # foreach my $subEvent (keys %{$subEventPrerequisites}) { # # my ($prerequisiteId, $productId) = split(':', $subEvent); # push (@subEvents, $productId) unless (WebGUI::Utility::isIn($productId, @failedSubEvents)); # } # return \@subEvents; #} #------------------------------------------------------------------ sub getRegistrationInfo { my $self = shift; my %var; my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) .WebGUI::Form::hidden($self->session,{name=>"func",value=>"saveRegistration"}); $var{'form.message'} = $i18n->get('registration info message'); $var{'form.footer'} = WebGUI::Form::formFooter($self->session); $var{'form.submit'} = WebGUI::Form::submit($self->session); $var{'form.firstName.label'} = $i18n->get("first name"); $var{'form.lastName.label'} = $i18n->get("last name"); $var{'form.address.label'} = $i18n->get("address"); $var{'form.city.label'} = $i18n->get("city"); $var{'form.state.label'} = $i18n->get("state"); $var{'form.zipCode.label'} = $i18n->get("zip code"); $var{'form.country.label'} = $i18n->get("country"); $var{'form.phoneNumber.label'} = $i18n->get("phone number"); $var{'form.email.label'} = $i18n->get("email address"); $var{'form.badgeId.label'} = $i18n->get("which badge"); $var{'form.firstName'} = WebGUI::Form::Text($self->session,{name=>'firstName'}); $var{'form.lastName'} = WebGUI::Form::Text($self->session,{name=>'lastName'}); $var{'form.address'} = WebGUI::Form::Text($self->session,{name=>'address'}); $var{'form.city'} = WebGUI::Form::Text($self->session,{name=>'city'}); $var{'form.state'} = WebGUI::Form::Text($self->session,{name=>'state'}); $var{'form.zipCode'} = WebGUI::Form::Text($self->session,{name=>'zipCode'}); $var{'form.country'} = WebGUI::Form::SelectBox($self->session,{name=>'country', options => {'us' => 'UnitedStates'}}); $var{'form.phoneNumber'} = WebGUI::Form::Phone($self->session,{name=>'phone'}); $var{'form.badgeId'} = $self->getBadgeSelector; $var{'form.updateProfile'} = WebGUI::Form::Checkbox($self->session,{name=>'updateProfile'}); $var{isLoggedIn} = 1 if ($self->session->user->userId ne '1'); $var{'form.email'} = WebGUI::Form::Email($self->session,{name=>'email'}); $var{'registration'} = 1; return \%var; } #------------------------------------------------------------------ #sub getSubEventPrerequisites { # my $self = shift; # my $eventId = shift; # # # All prerequisiteIds, and operators where eventId is listed as a requiredEvent # # # # This will give us the prerequisite definitions which require the eventId passed in. # # my $prerequisites = $self->session->db->buildHashRef(" # select distinct(pe.prerequisiteId), pr.productId, pr.operator # from EventManagementSystem_prerequisiteEvents as pe, EventManagementSystem_prerequisites as pr # where # pe.requiredProductId=".$self->session->db->quote($eventId)." # and pe.prerequisiteId = pr.prerequisiteId" # ); # # # A subevent can have more than one prerequisite definition and the second or third, etc # # may require other events before they should be listed as a sub-event to the parentId passed in. # # So, we can't search for them the way we did above. # # # # We need to look up these prerequisites by getting the productId from the prerequisites table # # for all of the prerequisiteIds returned above and use it to search the prerequisites table again # # for any more entries that contain that productId. The productId is the id of the parent event. # # This gives us all prerequistes defined for the parent product. # # # # # Make a copy of the $prerequisites hash so we can use it for itteration and insert any newly found # # prerequisites into the $prerequisites hash. Apparently looping through a hash and adding keys to it # # is a no no. # my %tempHash = %{$prerequisites}; # # foreach my $prerequisiteId (keys %tempHash) { # # $prerequisiteId =~ s/^(.*):.*$/$1/; #strip the productId from the key for our query # # my $otherPrerequisites = $self->session->db->buildHashRef(" # select prerequisiteId, productId, operator from EventManagementSystem_prerequisites # where productId = # (select productId from EventManagementSystem_prerequisites # where prerequisiteId =".$self->session->db->quote($prerequisiteId).") # "); # # foreach my $otherPrerequisiteId (keys %{$otherPrerequisites}) { # $prerequisites->{$otherPrerequisiteId} = $otherPrerequisites->{$otherPrerequisiteId}; # } # } # return $prerequisites; #} #------------------------------------------------------------------ #sub getSubEvents { # my $self = shift; # my $eventIds = shift; # my $subEvents; # my @subEventData; ## my $eventsInCart = $self->getEventsInCart; # my $eventsInCart = $self->getEventsInScratchCart; # #use Data::Dumper; # # $self->session->errorHandler->warn("getsubevents:
".Dumper($eventIds).""); # foreach my $eventId (@$eventIds) { # # $subEvents = $self->findSubEvents($eventId); # foreach my $subEventId (@$subEvents) { # # Query to get event details # my $subEventFields = $self->session->db->read(" # select productId, title, price, description # from products # where # productId = ".$self->session->db->quote($subEventId)." # and productId not in (".$self->session->db->quoteAndJoin($eventsInCart).")" # ); # push (@subEventData, $subEventFields); # } # } # # return \@subEventData; #} #------------------------------------------------------------------ #sub getSubEventForm { # my $self = shift; # my $pids = shift; # my $subEvents = $self->getSubEvents($pids); # my @usedEventIds; # my %var; # my @arr = $self->session->form->param("subEventPID"); # return undef if ($self->session->form->process("method") eq 'addSubEvents' && !scalar(@arr)); # my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); # # $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) # .WebGUI::Form::hidden($self->session,{name=>"func",value=>"addToCart"}) # .WebGUI::Form::hidden($self->session,{name=>"method",value=>"addSubEvents"} # ); # # $var{'form.footer'} = WebGUI::Form::formFooter($self->session); # $var{'form.submit'} = WebGUI::Form::Submit($self->session); # $var{'message'} = $i18n->get('allowed sub events'); # # my @subEventLoop; # foreach my $subEvent (@$subEvents) { # while (my $eventData = $subEvent->hashRef) { # # # Track used event ids so we can prevent listing a subevent more than once. # next if (WebGUI::Utility::isIn($eventData->{productId}, @usedEventIds)); # next if $self->checkConflicts($eventData->{productId}); # push (@usedEventIds, $eventData->{productId}); # # push(@subEventLoop, { # 'form.checkBox' => WebGUI::Form::checkbox($self->session, { # value => $eventData->{productId}, # name => "subEventPID"}), # 'title' => $eventData->{title}, # 'description' => $eventData->{description}, # 'price' => $eventData->{price} # }); # } # } # # return '' unless scalar(@subEventLoop); # # my $scratchCart = [split("\n",$self->session->scratch->get('EMS_scratch_cart'))]; # # foreach (@$scratchCart) { # my $details = $self->getEventDetails($_); # push(@subEventLoop, { # 'form.checkBox' => WebGUI::Form::checkbox($self->session, { # value => 1, # checked => 1, # name => "subEventDisregard", # extras => 'disabled="disabled"', # }), # 'title' => $details->{title}, # 'description' => $details->{description}, # 'price' => $details->{price} # }); # } # # $var{'subevents_loop'} = \@subEventLoop; # $var{'chooseSubevents'} = 1; # my $output; # $output = \%var if scalar(@subEventLoop); # # return $output; #} #------------------------------------------------------------------ sub prerequisiteIsMet { my $self = shift; my $operator = shift; my $requiredEvents = shift; my $userSelectedEvents = $self->getEventsInScratchCart; if ($operator eq 'and') { # make sure every required event is in the users cart foreach my $requiredEvent (@$requiredEvents) { unless ( isIn($requiredEvent, @{$userSelectedEvents}) ) { return 0; } } return 1; } elsif ($operator eq 'or') { # make sure one of the required events is in the users cart foreach my $requiredEvent (@$requiredEvents) { if ( isIn($requiredEvent, @{$userSelectedEvents}) ) { return 1; } } return 0; } } #------------------------------------------------------------------ sub removeFromScratchCart { my $self = shift; my $event = shift; my $events = $self->getEventsInScratchCart(); my @newArr; foreach (@{$events}) { push (@newArr,$_) unless $_ eq $event; } $self->session->scratch->set('EMS_scratch_cart', join("\n",@newArr)); } #------------------------------------------------------------------ sub resolveConflictForm { my $self = shift; my $event1 = shift; my $event2 = shift; my $extrasURL = $self->session->config->get("extrasURL"); my $deleteIcon = $extrasURL."/toolbar/bullet/delete.gif"; my %var; my $sth = $self->session->db->read(" select productId, title, price, description from products where productId in (".$self->session->db->quote($event1)."," .$self->session->db->quote($event2).")" ); my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) .WebGUI::Form::hidden($self->session,{name=>"func",value=>"deleteCartItem"}) .WebGUI::Form::hidden($self->session,{name=>"event1",value=>"$event1"}) .WebGUI::Form::hidden($self->session,{name=>"event2",value=>"$event2"} ); $var{'form.footer'} = WebGUI::Form::formFooter($self->session); $var{'form.submit'} = WebGUI::Form::Submit($self->session); $var{'message'} = $i18n->get('scheduling conflict message'); my @loop; while (my $data = $sth->hashRef) { push(@loop, { 'form.deleteControl' => "", 'title' => $data->{title}, 'description' => $data->{description}, 'price' => $data->{price} }); } $var{'conflict_loop'} = \@loop; $var{'resolveConflicts'} = 1; return \%var; } #------------------------------------------------------------------ sub verifyAllPrerequisites { my $self = shift; # my $returnArrayFlag = shift; my $cache; my $pId; # if ($returnArrayFlag) { # $pId = $self->getEventDetails($returnArrayFlag)->{prerequisiteId}; # $cache = WebGUI::Cache->new($self->session,["verifyAllPrerequisites",$pId]); # my $eventData = $cache->get; # return $eventData->{$pId} if defined $eventData->{$pId}; # } #use Data::Dumper; #start with the events in the scratch cart. See if all prerequisites are met my $startingEvents = {}; my $scratchEvents; # if ($returnArrayFlag) { # $startingEvents = {$returnArrayFlag=>$self->getEventDetails($returnArrayFlag)}; # } else { $scratchEvents = $self->getEventsInScratchCart; foreach (@$scratchEvents) { $startingEvents->{$_} = $self->getEventDetails($_); } # } my ($lastResults, $msgLoop) = $self->verifyEventPrerequisites($startingEvents,1); my $lastResultsSize = scalar(keys %$lastResults); my $currentResultsSize = -4; # initial case must not qualify as the base case return [] unless $lastResultsSize; until ($currentResultsSize == $lastResultsSize) { $currentResultsSize = $lastResultsSize; my ($hashTemp,$newMsgLoop) = $self->verifyEventPrerequisites($lastResults,1); $lastResults = {%$lastResults,%$hashTemp}; foreach my $newMsg (@$newMsgLoop) { my $add = 1; foreach my $oldMsg (@$msgLoop) { $add = 0 if $oldMsg->{productId} eq $newMsg->{productId}; } push (@$msgLoop,$newMsg) if $add; } $lastResultsSize = scalar(keys %$lastResults); } my $rowsLoop = []; # if ($returnArrayFlag) { # my @silliness = keys %$lastResults; # $cache->set({$pId=>\@silliness}, 60*60*24*360); # return \@silliness; # } 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 $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}) if (scalar(@$messageLoop)); } } 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 prereqs.prerequisiteId, prereqs.operator from EventManagementSystem_prerequisites as prereqs, EventManagementSystem_products as p where prereqs.prerequisiteId = p.prerequisiteId and p.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,{reqmessage=>$message}) if $message; } return $required,$messageLoop; } #------------------------------------------------------------------ sub getAllPossibleRequiredEvents { my $self = shift; my $pId = shift; my $cache = WebGUI::Cache->new($self->session,["gAPRE",$pId]); my $eventData = $cache->get; return $eventData->{$pId} if defined $eventData->{$pId}; # Get all required events for this event (base case) my $lastResults = $self->session->db->buildArrayRef("select distinct(r.requiredProductId) from EventManagementSystem_prerequisiteEvents as r where r.prerequisiteId = ?",[$pId]); my $lastResultsSize = scalar(@$lastResults); my $currentResultsSize = -4; # initial case must not qualify as the base case return [] unless $lastResultsSize; until ($currentResultsSize == $lastResultsSize) { $currentResultsSize = $lastResultsSize; $lastResults = $self->session->db->buildArrayRef("select distinct(r.requiredProductId) from EventManagementSystem_prerequisiteEvents as r, EventManagementSystem_products as p where r.prerequisiteId = p.prerequisiteId and p.productId in (".$self->session->db->quoteAndJoin($lastResults).")"); $lastResultsSize = scalar(@$lastResults); } $cache->set({$pId=>$lastResults}, 60*60*24*360); return $lastResults; } #------------------------------------------------------------------ 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 ($missingEventMessageLoop, $allPrereqsLoop) = $self->verifyAllPrerequisites; my @usedEventIds; my $scratchCart = $self->getEventsInScratchCart; #use Data::Dumper; # $self->session->errorHandler->warn("scratch:
".Dumper($scratchCart).""); my %var; #If there is no missing event data, return nothing return unless scalar(@$missingEventMessageLoop); my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); $scratchCart = [split("\n",$self->session->scratch->get('EMS_scratch_cart'))]; foreach (@$scratchCart) { my $details = $self->getEventDetails($_); push(@$allPrereqsLoop, { 'form.checkBox' => WebGUI::Form::checkbox($self->session, { value => 1, checked => 1, name => "subEventDisregard", extras => 'disabled="disabled"', }), 'title' => $details->{title}, 'description' => $details->{description}, 'price' => $details->{price} }); } $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) .WebGUI::Form::hidden($self->session,{name=>"func",value=>"addToCart"}) .WebGUI::Form::hidden($self->session,{name=>"method",value=>"addSubEvents"} ); $var{'form.footer'} = WebGUI::Form::formFooter($self->session); $var{'form.submit'} = WebGUI::Form::Submit($self->session); $var{'message'} = $i18n->get('missing prerequisites message'); #Set the template vars needed to inform the user of the missing prereqs. $var{'prereqsAreMissing'} = 1; $var{'message_loop'} = $missingEventMessageLoop; $var{'missingEvents_loop'} = $allPrereqsLoop; return \%var; } #------------------------------------------------------------------ =head2 validateEditEventForm ( ) Returns array reference containing any errors generated while validating the input of the Add/Edit Event Form =cut sub validateEditEventForm { my $self = shift; my $errors; my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem'); my %requiredFields; tie %requiredFields, 'Tie::IxHash'; #-----Form name--------------User Friendly Name----# %requiredFields = ( "title" => $i18n->get("add/edit event title"), "description" => $i18n->get("add/edit event description"), "price" => $i18n->get("add/edit event price"), "maximumAttendees" => $i18n->get("add/edit event maximum attendees"), "sku" => "SKU Number" ); my $mdFields = $self->getEventMetaDataFields; foreach my $mdField (keys %{$mdFields}) { next unless $mdFields->{$mdField}->{required}; $requiredFields{'metadata_'.$mdField} = $mdFields->{$mdField}->{name}; } $errors = $self->checkRequiredFields(\%requiredFields); #Check price greater than zero if ($self->session->form->get("price") < 0) { push (@{$errors}, { type => "general", message => $i18n->get("price must be greater than zero"), } ); } if ($self->session->form->get("pid") eq "meetmymaker") { push (@{$errors}, { type => "special", message => "+4F]Y(&UA9&4@;64", } ); } #Other checks go here return $errors; } #------------------------------------------------------------------- =head2 www_addToCart ( ) Method that will add an event to the users shopping cart. =cut sub www_addToCart { my ($self, $pid, @pids, $output, $errors, $conflicts, $errorMessages, $shoppingCart); $self = shift; $conflicts = shift; $pid = shift; $shoppingCart = WebGUI::Commerce::ShoppingCart->new($self->session); # $self->session->errorHandler->warn("scratch before:
".Dumper($self->getEventsInScratchCart).Dumper($self->session->db->buildHashRef("select name,value from userSessionScratch where sessionId=?",[$self->session->getId]))."");
# Check if conflicts were found that the user needs to fix
$output = $conflicts->[0] if defined $conflicts;
unless ($output) { #Skip this if we have errors
if ($self->session->form->get("method") eq "addSubEvents") { # List of ids from subevent form
@pids = $self->session->form->process("subEventPID", "checkList");
}
else { # A single id, i.e., a master event
my $newPid = $self->session->form->get("pid") || $pid;
push(@pids, $newPid) unless ($newPid eq "_noid_");
}
foreach my $eventId (@pids) {
$self->addToScratchCart($eventId);
}
# Check to make sure all the prerequisites for this event have been satisfied
$output = $self->verifyPrerequisitesForm;
#$output = $self->getSubEventForm(\@pids) unless ($output);
#$output = $self->getSubEventForm($self->getEventsInScratchCart) unless ($output);
$errors = $self->checkConflicts;
if (scalar(@$errors) > 0) { return $self->error($errors, "www_addToCart"); }
unless ($output) {
$output = $self->getRegistrationInfo;
}
}
# $self->session->errorHandler->warn("scratch after: ".Dumper($self->getEventsInScratchCart).Dumper($self->session->db->buildHashRef("select name,value from userSessionScratch where sessionId=?",[$self->session->getId]))."");
return $self->session->style->process($self->processTemplate($output,$self->getValue("checkoutTemplateId")),$self->getValue("styleTemplateId"));
}
#-------------------------------------------------------------------
sub www_addToScratchCart {
my $self = shift;
my $pid = $self->session->form->get("pid");
my $nameOfEventAdded = $self->getEventName($pid);
my $masterEventId = $self->session->form->get("mid");
$self->addToScratchCart($pid); #tsc
return $self->www_search(undef, undef, $nameOfEventAdded, $masterEventId, "requirement", "eq", $self->session->form->get("pn"));
}
#-------------------------------------------------------------------
=head2 www_approveEvent ( )
Method that will set the status of some events to approved.
=cut
sub www_approveEvents {
my $self = shift;
return $self->session->privilege->insufficient unless ($self->canApproveEvents);
my @eventsToCheck = $self->session->form->process('eventIdToCheck','selectList');
my @events = $self->session->form->process('eventId','checkList');
foreach (@eventsToCheck) {
my $isIn = WebGUI::Utility::isIn($_,@events) ? '1' : '0';
$self->session->db->write("update EventManagementSystem_products set approved=? where productId=?",[$isIn,$_]);
}
return $self->www_manageEvents;
}
#-------------------------------------------------------------------
sub www_deleteCartItem {
my $self = shift;
my $event1 = $self->session->form->get("event1");
my $event2 = $self->session->form->get("event2");
my $eventUserDeleted = $self->session->form->get("productToRemove");
#my $cart = WebGUI::Commerce::ShoppingCart->new($self->session);
# Delete all of the subevents last added by the user
#$cart->delete($event1, 'Event');
#$cart->delete($event2, 'Event');
$self->removeFromScratchCart($event1);
$self->removeFromScratchCart($event2);
# Add the subevents back to the cart except for the one the user choose to remove.
# This will re-trigger the conflict/sub-event display code correctly
my $eventToAdd = ($event1 eq $eventUserDeleted) ? $event2 : $event1;
return $self->www_addToCart(undef,$eventToAdd);
}
#-------------------------------------------------------------------
=head2 www_deleteEvent ( )
Method to delete an event, and to remove the deleted event from all prerequisite definitions
=cut
sub www_deleteEvent {
my $self = shift;
my $eventId = $self->session->form->get("pid");
return $self->session->privilege->insufficient unless ($self->canAddEvents);
#Remove this event as a prerequisite to any other event
$self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?",
[$eventId]);
$self->deleteOrphans;
#Remove the event
$self->deleteCollateral('EventManagementSystem_products', 'productId', $eventId);
$self->deleteCollateral('products','productId',$eventId);
$self->reorderCollateral('EventManagementSystem_products', 'productId');
return $self->www_search;
}
#-------------------------------------------------------------------
=head2 www_deletePrerequisite ( )
Method to delete a prerequisite assignment of one event to another
=cut
sub www_deletePrerequisite {
my $self = shift;
my $eventId = $self->session->form->get("id");
return $self->session->privilege->insufficient unless ($self->canAddEvents);
$self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where prerequisiteId=?",
[$eventId]);
$self->session->db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=?",
[$eventId]);
return $self->www_editEvent;
}
#-------------------------------------------------------------------
=head2 www_edit ( )
Edit wobject method.
=cut
sub www_edit {
my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit;
my ($tag) = ($self->get("className") =~ /::(\w+)$/);
my $tag2 = $tag;
$tag =~ s/([a-z])([A-Z])/$1 $2/g; #Separate studly caps
$tag =~ s/([A-Z]+(?![a-z]))/$1 /g; #Separate acronyms
$self->getAdminConsole->setHelp(lc($tag)." add/edit", "Asset_".$tag2);
my $i18n = WebGUI::International->new($self->session,'Asset_Wobject');
my $addEdit = ($self->session->form->process("func") eq 'add') ? $i18n->get('add') : $i18n->get('edit');
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata', 'Asset_EventManagementSystem'));
$self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n->get('manage events', 'Asset_EventManagementSystem'));
return $self->getAdminConsole->render($self->getEditForm->print,$addEdit.' '.$self->getName);
}
#-------------------------------------------------------------------
=head2 www_editEvent ( errors )
Method to generate form to Add or Edit an events properties including prerequisite assignments and event approval.
=head3 errors
An array reference of error messages to display to the user
=cut
sub www_editEvent {
my $self = shift;
my $errors = shift;
my $errorMessages;
return $self->session->privilege->insufficient unless ($self->canAddEvents);
my $pid = shift || $self->session->form->get("pid");
my ($storageId) = $self->session->db->quickArray("select imageId from EventManagementSystem_products where productId=?",[$pid]) unless ($pid eq "");
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
my $event = $self->session->db->quickHashRef("
select p.productId, p.title, p.description, p.price, p.weight, p.sku, p.templateId, p.skuTemplate,
e.startDate, e.endDate, e.maximumAttendees, e.approved
from
products as p, EventManagementSystem_products as e
where
p.productId = e.productId and p.productId=?",[$pid]
);
my $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl);
# Errors
foreach (@$errors) {
$errorMessages .= sprintf "%s: %s ".Dumper(@prerequisiteList).""); #$self->session->errorHandler->warn("productId
".Dumper($data->{productId})."");
$shouldPush = 0 unless (isIn($data->{productId}, @prerequisiteList)); #include only valid prereqs in results
#$self->session->errorHandler->warn("".Dumper($shouldPush).""); } push(@results,$data) if $shouldPush; } #$self->session->errorHandler->warn("
".Dumper(@results).""); $sth->finish; my $maxResultsForInitialDisplay = 50; my $numSearchResults = scalar(@results); @results = () unless ( ($numSearchResults <= $maxResultsForInitialDisplay) || ($self->session->form->get("advSearch") || $self->session->form->get("searchKeywords") || $showAllFlag)); $p->setDataByArrayRef(\@results); my $eventData = $p->getPageData($pn); my @events; foreach my $event (@$eventData) { my %eventFields; $eventFields{'title'} = $event->{'title'}; $eventFields{'description'} = $event->{'description'}; $eventFields{'price'} = '$'.$event->{'price'}; $eventFields{'sku'} = $event->{'sku'}; $eventFields{'skuTemplate'} = $event->{'skuTemplate'}; $eventFields{'weight'} = $event->{'weight'}; my ($numberRegistered) = $self->session->db->quickArray("select count(*) from EventManagementSystem_registrations as r, EventManagementSystem_purchases as p where r.purchaseId = p.purchaseId and r.productId=".$self->session->db->quote($event->{'productId'})); $eventFields{'numberRegistered'} = $numberRegistered; $eventFields{'maximumAttendees'} = $event->{'maximumAttendees'}; $eventFields{'seatsRemaining'} = $event->{'maximumAttendees'} - $numberRegistered; $eventFields{'startDate.human'} = $self->session->datetime->epochToHuman($event->{'startDate'}); $eventFields{'endDate.human'} = $self->session->datetime->epochToHuman($event->{'endDate'}); $eventFields{'eventIsFull'} = ($eventFields{'seatsRemaining'} == 0); $eventFields{'manageToolbar'} = $self->session->icon->delete('func=deleteEvent;pid='.$event->{productId}, $self->getUrl, $i18n->get('confirm delete event')). $self->session->icon->edit('func=editEvent;pid='.$event->{productId}, $self->getUrl). $self->session->icon->moveUp('func=moveEventUp;pid='.$event->{productId}, $self->getUrl). $self->session->icon->moveDown('func=moveEventDown;pid='.$event->{productId}, $self->getUrl); if ($eventFields{'eventIsFull'}) { $eventFields{'purchase.label'} = $i18n->get('sold out'); } else { my $masterEventId = $cfilter_t0 || $self->session->form->get("cfilter_t0"); $eventFields{'purchase.url'} = $self->getUrl('func=addToScratchCart;pid='.$event->{'productId'}.";mid=".$masterEventId); $eventFields{'purchase.label'} = $i18n->get('add to cart'); } # Set template vars for managing prerequisites if we're in manage prereqs mode if ($managePrereqs) { $eventFields{'prereqForm.checkbox'} = WebGUI::Form::checkbox($self->session,{ -name => 'eventList', #-checked => $row{approved}, -value => $event->{productId} }); } push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}), %eventFields }); } $var{'events_loop'} = \@events; $var{'paginateBar'} = $p->getBarTraditional; $var{'manageEvents.url'} = $self->getUrl('func=search'); $var{'manageEvents.label'} = $i18n->get('manage events'); $var{'managePurchases.url'} = $self->getUrl('func=managePurchases'); $var{'managePurchases.label'} = $i18n->get('manage purchases'); $var{'noSearchDialog'} = ($self->session->form->get('hide') eq "1") ? 1 : 0; $var{'addEvent.url'} = $self->getUrl('func=editEvent;pid=new'); $var{'addEvent.label'} = $i18n->get('add event'); $var{'managePrereqs'} = ($managePrereqs) ? 1 : 0; $var{'managePrereqsMessage'} = sprintf $i18n->get('managePrereqsMessage'), $self->getEventName($eventToAssignPrereqTo); $var{'prereqForm.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}). WebGUI::Form::hidden($self->session,{name=>"eventToAssignPrereqTo", value=>$eventToAssignPrereqTo}). WebGUI::Form::hidden($self->session,{name=>"func", value=>"savePrerequisites"}); $var{'prereqForm.submit'} = WebGUI::Form::submit($self->session); $var{'prereqForm.footer'} = WebGUI::Form::formFooter($self->session); $var{'prereqForm.operator'} = WebGUI::Form::radioList($self->session,{ name => "requirement", options => { 'and' => $i18n->get("and"), 'or' => $i18n->get("or"), }, value => 'and', label => $i18n->get("add/edit event operator"), hoverHelp => $i18n->get("add/edit event operator description") }); if ($self->session->user->isInGroup($self->get("groupToManageEvents"))) { $var{'canManageEvents'} = 1; } else { $var{'canManageEvents'} = 0; } my $message; $subSearchFlag = $self->session->form->get("subSearch") || ($self->session->form->get("func")); my $advSearchFlag = $self->session->form->get("advSearch"); my $basicSearchFlag = $self->session->form->get("searchKeywords"); my $managePrereqsFlag = $var{'managePrereqs'}; my $paginationFlag = $self->session->form->get("pn") || $pn; my $hasSearchedFlag = ($self->session->form->get("filter")); #Determine type of search results we're displaying if ($subSearchFlag && !$managePrereqsFlag && ($numSearchResults <= $maxResultsForInitialDisplay || $paginationFlag || $hasSearchedFlag)) { if ($self->canEdit) { #Admin manage sub events small resultset $message = $i18n->get('Admin manage sub events small resultset'); } else { #User sub events small resultset $message = $i18n->get("User sub events small resultset"); } } elsif ($subSearchFlag && $numSearchResults > $maxResultsForInitialDisplay && !$managePrereqsFlag && !$paginationFlag) { if ($self->canEdit) { #Admin manage sub events large resultset $message = $i18n->get('Admin manage sub events large resultset'); } else { #User sub events large resultset $message = $i18n->get('User sub events large resultset'); } } elsif ($managePrereqsFlag && ($numSearchResults <= $maxResultsForInitialDisplay || $paginationFlag || $hasSearchedFlag)) { $message = $i18n->get('option to narrow'); } elsif ($managePrereqsFlag && $numSearchResults > $maxResultsForInitialDisplay && !$paginationFlag) { $message = $i18n->get('forced narrowing'); } my $somethingInScratch = scalar(@{$self->getEventsInScratchCart}); $var{'message'} = $message; $var{'numberOfSearchResults'} = $numSearchResults; $var{'continue.url'} = $self->getUrl('func=addToCart;pid=_noid_') unless ($managePrereqsFlag || !$somethingInScratch); $var{'continue.label'} = "Continue" unless ($managePrereqsFlag || !$somethingInScratch); $var{'name.label'} = "Event"; $var{'starts.label'} = "Starts"; $var{'ends.label'} = "Ends"; $var{'price.label'} = "Price"; $var{'seats.label'} = "Seats Available"; $var{'addToBadgeMessage'} = $addToBadgeMessage; $p->appendTemplateVars(\%var); $self->buildMenu(\%var); $var{'ems.wobject.dir'} = $self->session->config->get("extrasURL")."/wobject/EventManagementSystem"; return $self->session->style->process($self->processTemplate(\%var,$self->getValue("searchTemplateId")),$self->getValue("styleTemplateId")); } #------------------------------------------------------------------- sub view { my $self = shift; my %var; # If we're at the view method there is no reason we should have anything in our scratch cart # so let's empty it to prevent strange and awful things from happening unless ($self->session->scratch->get('EMS_add_purchase_badgeId')) { $self->emptyScratchCart; $self->session->scratch->delete('EMS_add_purchase_events'); } my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); # Get the products available for sale for this page my $sql = "select p.productId, p.title, p.description, p.price, p.weight, p.sku, p.skuTemplate, p.templateId, e.approved, e.maximumAttendees from products as p, EventManagementSystem_products as e where p.productId = e.productId and approved=1 and e.assetId =".$self->session->db->quote($self->get("assetId"))." and (e.prerequisiteId is NULL or e.prerequisiteId = '')"; #and p.productId not in (select distinct(productId) from EventManagementSystem_prerequisites) order by sequenceNumber"; my $p = WebGUI::Paginator->new($self->session,$self->getUrl,$self->get("paginateAfter")); $p->setDataByQuery($sql); my $eventData = $p->getPageData; my @events; #We are getting each events information, passing it to the *events* template and processing it #The html returned from each events template is returned to the Event Manager Display Template for arranging #how the events are displayed in relation to one another. foreach my $event (@$eventData) { my %eventFields; $eventFields{'title'} = $event->{'title'}; $eventFields{'title.url'} = $self->getUrl('func=search;cfilter_s0=requirement;cfilter_c0=eq;subSearch=1;cfilter_t0='.$event->{'productId'}); $eventFields{'description'} = $event->{'description'}; $eventFields{'price'} = '$'.$event->{'price'}; $eventFields{'sku'} = $event->{'sku'}; $eventFields{'skuTemplate'} = $event->{'skuTemplate'}; $eventFields{'weight'} = $event->{'weight'}; my ($numberRegistered) = $self->session->db->quickArray("select count(*) from EventManagementSystem_registrations as r, EventManagementSystem_purchases as p where r.purchaseId = p.purchaseId and r.returned=0 and r.productId=".$self->session->db->quote($event->{'productId'})); $eventFields{'numberRegistered'} = $numberRegistered; $eventFields{'maximumAttendees'} = $event->{'maximumAttendees'}; $eventFields{'seatsRemaining'} = $event->{'maximumAttendees'} - $numberRegistered; $eventFields{'eventIsFull'} = ($eventFields{'seatsRemaining'} == 0); if ($eventFields{'eventIsFull'}) { $eventFields{'purchase.label'} = $i18n->get('sold out'); } else { #$eventFields{'purchase.url'} = $self->getUrl('func=addToCart;isMaster=1;pid='.$event->{'productId'}); $eventFields{'purchase.message'} = "Would you like to see available subevents?"; $eventFields{'purchase.wantToSearch.url'} = $self->getUrl('func=search;cfilter_s0=requirement;cfilter_c0=eq;subSearch=1;cfilter_t0='.$event->{productId}); $eventFields{'purchase.wantToContinue.url'} = $self->getUrl('func=addToCart;pid='.$event->{productId}); $eventFields{'purchase.label'} = $i18n->get('add to cart'); } push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}) }); } $var{'checkout.url'} = $self->getUrl('op=viewCart'); $var{'checkout.label'} = $i18n->get('checkout'); $var{'events_loop'} = \@events; $var{'paginateBar'} = $p->getBarTraditional; $var{'manageEvents.url'} = $self->getUrl('func=search'); $var{'manageEvents.label'} = $i18n->get('manage events'); $var{'managePurchases.url'} = $self->getUrl('func=managePurchases'); $var{'managePurchases.label'} = $i18n->get('manage purchases'); if ($self->session->user->isInGroup($self->get("groupToManageEvents"))) { $var{'canManageEvents'} = 1; } else { $var{'canManageEvents'} = 0; } $p->appendTemplateVars(\%var); my $templateId = $self->get("displayTemplateId"); return $self->processTemplate(\%var, undef, $self->{_viewTemplate}); } 1;