package WebGUI::Asset::Wobject::EventManagementSystem; #------------------------------------------------------------------- # 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 #------------------------------------------------------------------- use strict; use base 'WebGUI::Asset::Wobject'; use Tie::IxHash; use WebGUI::HTMLForm; use WebGUI::International; #------------------------------------------------------------------- sub error { my $self = shift; my $errors = shift; my $callback = shift; my @errorMessages; foreach my $error (@$errors) { #Null Field Error if ($error->{type} eq "nullField") { push(@errorMessages, "The ".$error->{fieldName}." field cannot be blank."); } #General Error Message elsif ($error->{type} eq "general") { push(@errorMessages, $error->{message}); } } return $self->$callback(\@errorMessages); } #------------------------------------------------------------------- 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; } #------------------------------------------------------------------ # # Returns prerequisiteId of every prerequisite grouping assigned to eventId passed in. # sub getAssignedPrerequisites { my $self = shift; my $eventId = shift; my $sql = "select prerequisiteId, operator from EventManagementSystem_prerequisites where productId=".$self->session->db->quote($eventId); return $self->session->db->buildHashRef($sql); } #------------------------------------------------------------------ # # Returns names of every event assigned to the prerequisite grouping of the prerequisite group id passed in # sub getRequiredEventNames { my $self = shift; my $prerequisiteId = shift; 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=".$self->session->db->quote($prerequisiteId); return $self->session->db->buildArrayRef($sql); } #------------------------------------------------------------------ # # 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 # 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); } #------------------------------------------------------------------ sub deleteOrphans { my $self = shift; #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 validateEditEventForm { my $self = shift; my $errors; my %requiredFields; tie %requiredFields, 'Tie::IxHash'; #-----Form name--------------User Friendly Name----# %requiredFields = ( "title" => "Title", "description" => "Description", "price" => "Price", "maximumAttendees" => "Maximum Attendees", ); $errors = $self->checkRequiredFields(\%requiredFields); #Check price greater than zero if ($self->session->form->get("price") <= 0) { push (@{$errors}, { type => "general", message => "Price must be greater than zero." } ); } #Other checks go here 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') }, 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", hoverHelp=>"When set to yes, you may assign events belonging to another instance of an Event Management System Asset as a prerequisite event for one of the events defined in this instance os the asset. When set to no, only events defined within this instance of the asset may be used as prerequisites.", label=>"Global Prerequisites" }, ); push(@{$definition}, { assetName=>$i18n->get('assetName'), icon=>'article.gif', autoGenerateForms=>1, tableName=>'EventManagementSystem', className=>'WebGUI::Asset::Wobject::EventManagementSystem', properties=>\%properties }); return $class->SUPER::definition($session,$definition); } #------------------------------------------------------------------- sub www_deleteEvent { my $self = shift; my $eventId = $self->session->form->get("pid"); #Remove this event as a prerequisite to any other event $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=". $self->session->db->quote($eventId)); $self->deleteOrphans; #Remove the event $self->deleteCollateral('EventManagementSystem_products', 'productId', $eventId); $self->session->db->write("delete from products where productId=".$self->session->db->quote($eventId)); $self->reorderCollateral('EventManagementSystem_products', 'productId'); return $self->www_manageEvents; } #------------------------------------------------------------------- sub www_deletePrerequisite { my $self = shift; my $eventId = $self->session->form->get("id"); $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where prerequisiteId=". $self->session->db->quote($eventId)); $self->session->db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=". $self->session->db->quote($eventId)); return $self->www_editEvent; } #------------------------------------------------------------------- sub www_editEvent { my $self = shift; my $errors = shift; my $errorMessages; my $pid = $self->session->form->get("pid"); 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, e.startDate, e.endDate, e.maximumAttendees, e.approved from products as p, EventManagementSystem_products as e where p.productId = e.productId and p.productId=".$self->session->db->quote($pid) ); my $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); # Errors foreach (@$errors) { $errorMessages .= "ERROR: $_
"; } $f->readOnly( -value=>$errorMessages ); $f->hidden( -name=>"assetId", -value=>$self->get("assetId") ); $f->hidden( -name=>"func",-value=>"editEventSave" ); $f->hidden( -name=>"pid", -value=>$pid ); $f->text( -name => "title", -value => $self->session->form->get("title") || $event->{title}, -hoverHelp => $i18n->get('add/edit event title description'), -label => $i18n->get('add/edit event title') ); $f->HTMLArea( -name => "description", -value => $self->session->form->get("description") || $event->{description}, -hoverHelp => $i18n->get('add/edit event description description'), -label => $i18n->get('add/edit event description') ); $f->float( -name => "price", -value => $self->session->form->get("price") || $event->{price}, -hoverHelp => $i18n->get('add/edit event price description'), -label => $i18n->get('add/edit event price') ); $f->template( -name => "templateId", -namespace => "product", -value => $self->session->form->get("templateId") || $event->{templateId}, -hoverHelp => $i18n->get('add/edit event template description'), -label => "Event Template" #$i18n->get('add/edit event template') ); $f->hidden( -name => "weight", -value => "0" ); $f->hidden( -name => "sku", -value => $event->{sku} || $self->session->id->generate() ); $f->dateTime( -name => "startDate", -value => $self->session->form->get("startDate") || $event->{startDate}, -hoverHelp => $i18n->get('add/edit event start date description'), -label => "Start Date" #$i18n->get('add/edit event start date') ); $f->dateTime( -name => "endDate", -value => $self->session->form->get("endDate") || $event->{endDate}, -defaultValue => "32472169200", -hoverHelp => $i18n->get('add/edit event end date description'), -label => "End Date" #$i18n->get('add/edit event end date') ); $f->integer( -name => "maximumAttendees", -value => $self->session->form->get("maximumAttendees") || $event->{maximumAttendees}, -defaultValue => 100, -hoverHelp => $i18n->get('add/edit event maximum attendees description'), -label => "Maximum Attendees" #$i18n->get('add/edit event maximum attendees') ); my $prerequisiteList = $self->getPrerequisiteEventList($pid); if ( scalar(keys %{$prerequisiteList}) > 0) { $f->checkList( -name => "eventList", -options => $prerequisiteList, -vertical => 1, -label => "Required Events", -sortByValue => 1 ); $f->radioList( -name => "requirement", -options => { "and" => "And", "or" => "Or", }, -label => "Operator", -defaultValue => "and" ); $f->selectBox( -name => "whatNext", -label => "What Next", -options => { "addAnotherPrereq" => "Add Another Prerequisite", "return" => "Return to Manage Events" }, -defaultValue => "return" ); } $f->submit; #Display Currently Assigned Prerequisites if any $f->readOnly( -value => "
Assigned Prerequisites

" ); my $list = $self->getAssignedPrerequisites($pid); foreach my $prerequisiteId (keys %{$list}) { my $line = $self->session->icon->delete('func=deletePrerequisite;id='.$prerequisiteId, $self->getUrl, "Are you sure you want to delete this prerequisite?")." "; my $eventNames = $self->getRequiredEventNames($prerequisiteId); my $events; foreach my $event (@$eventNames) { $events .= "$event ".$list->{$prerequisiteId}." "; } $events =~ s/(and\s|or\s)$//; $f->readOnly( -value => $line.$events ); } my $output = $f->print; $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'),"Manage Events"); return $self->getAdminConsole->render($output, "Add/Edit Event"); } #------------------------------------------------------------------- sub www_editEventSave { my $self = shift; my $errors = $self->validateEditEventForm; if (scalar(@$errors) > 0) { return $self->error($errors, "www_editEvent"); } my $pid = $self->session->form->get("pid"); my $eventIsNew = 1 if ($pid eq "" || $pid eq "new"); my $event; #Save the extended product data $pid = $self->setCollateral("EventManagementSystem_products", "productId", { productId => $pid, startDate => $self->session->datetime->humanToEpoch($self->session->form->get("startDate")), endDate => $self->session->datetime->humanToEpoch($self->session->form->get("endDate")), maximumAttendees => $self->session->form->get("maximumAttendees"), approved => "0" },1,1 ); #Save the standard product data $event = { productId => $pid, title => $self->session->form->get("title"), description => $self->session->form->get("description"), price => $self->session->form->get("price"), weight => $self->session->form->get("weight"), sku => $self->session->form->get("sku"), skuTemplate => $self->session->form->get("skuTemplate"), templateId => $self->session->form->get("templateId") }; if ($eventIsNew) { # Event is new we need to use the same productId so we can join them later $self->session->db->setRow("products", "productId",$event,$pid); } else { # Updating the row $self->session->db->setRow("products", "productId", $event); } # Save the prerequisites my $prerequisiteList = $self->session->form->process("eventList", "checkList"); unless ($prerequisiteList eq "") { my $prerequisiteId = $self->setCollateral("EventManagementSystem_prerequisites", "prerequisiteId", { prerequisiteId => "new", productId => $pid, operator => $self->session->form->get("requirement") },0,0 ); my @list = split(/\n/, $prerequisiteList); foreach my $requiredEvent (@list) { $self->setCollateral("EventManagementSystem_prerequisiteEvents", "prerequisiteEventId", { prerequisiteEventId => "new", prerequisiteId => $prerequisiteId, requiredProductId => $requiredEvent },0,0 ); } } return $self->www_editEvent if ($self->session->form->get("whatNext") eq "addAnotherPrereq"); return $self->www_manageEvents; } #------------------------------------------------------------------- sub www_moveEventDown { my $self = shift; my $eventId = $self->session->form->get("pid"); $self->moveCollateralDown('EventManagementSystem_products', 'productId', $eventId); return $self->www_manageEvents; } #------------------------------------------------------------------- sub www_moveEventUp { my $self = shift; my $eventId = $self->session->form->get("pid"); $self->moveCollateralUp('EventManagementSystem_products', 'productId', $eventId); return $self->www_manageEvents; } #------------------------------------------------------------------- sub www_manageEvents { my $self = shift; my $output; my $sth = $self->session->db->read("select p.productId, p.title, pe.approved from products as p, EventManagementSystem_products as pe where p.productId = pe.productId and pe.assetId=".$self->session->db->quote($self->get("assetId"))." order by sequenceNumber"); $output = ""; while (my %row = $sth->hash) { $output .= ""; } $output .= "
EventStatus
"; $output .= $self->session->icon->delete('func=deleteEvent;pid='.$row{productId}, $self->getUrl, 'Are you sure you want to delete this event?'). $self->session->icon->edit('func=editEvent;pid='.$row{productId}, $self->getUrl). $self->session->icon->moveUp('func=moveEventUp;pid='.$row{productId}, $self->getUrl). $self->session->icon->moveDown('func=moveEventDown;pid='.$row{productId}, $self->getUrl). " ".$row{title}; $output .= ""; if ($row{pending} == 0) { $output .= "Pending"; } else { $output .= "Approved"; } $output .= "
"; $self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEvent;pid=new'), "Add Event"); return $self->getAdminConsole->render($output, "Manage Events"); } #------------------------------------------------------------------- sub view { my $self = shift; my %var; my $templateId = $self->get("displayTemplateId"); return $self->processTemplate(\%var, $templateId); } 1;