'.print_r($menu,true).''; add_object_page('Tickets', 'Tickets', 'activate_plugins', 'eventticketing', array("eventTicketingSystem", "ticketReporting"), WP_PLUGIN_URL . '/' . plugin_basename(dirname(__FILE__)) . '/images/calendar_full.png'); add_submenu_page('eventticketing', 'Reporting', 'Reporting', 'activate_plugins', 'eventticketing', array('eventTicketingSystem', 'ticketReporting')); add_submenu_page('eventticketing', 'Ticket Options', 'Ticket Options', 'activate_plugins', 'ticketoptions', array('eventTicketingSystem', 'ticketOptionsControl')); add_submenu_page('eventticketing', 'Tickets', 'Tickets', 'activate_plugins', 'tickettickets', array('eventTicketingSystem', 'ticketTicketsControl')); add_submenu_page('eventticketing', 'Packages', 'Packages', 'activate_plugins', 'ticketpackages', array('eventTicketingSystem', 'ticketPackagesControl')); add_submenu_page('eventticketing', 'Coupons', 'Coupons', 'activate_plugins', 'ticketcoupons', array('eventTicketingSystem', 'ticketCouponsControl')); add_submenu_page('eventticketing', 'Notify Attendees', 'Notify Attendees', 'activate_plugins', 'ticketnotify', array('eventTicketingSystem', 'ticketNotify')); add_submenu_page('eventticketing', 'Attendees', 'Attendees', 'activate_plugins', 'ticketattendeeedit', array('eventTicketingSystem', 'ticketAttendeeEdit')); add_submenu_page('eventticketing', 'Instructions', 'Instructions', 'activate_plugins', 'ticketinstructions', array('eventTicketingSystem', 'ticketInstructions')); add_submenu_page('eventticketing', 'Settings', 'Settings', 'activate_plugins', 'ticketsettings', array('eventTicketingSystem', 'ticketSettings')); } function ticketInstructions() { echo '
'; echo '

'.__('Instructions').'

'; echo '

'.__('Step 1').'

'; echo '

'.__('Before you can use the ticketing system for the first time, you need to follow these instructions at Paypal to get your API signature. You\'ll need that information in step 2.').'

'; echo '

'.__('Step 2').'

'; echo '

'.__('Update the Settings page with your default event settings.').'

'; echo '

'.__('Step 3').'

'; echo '

'.__('The Ticket Options page is where you can set up what types of data you want to collect from your event attendees. Note, not all options have to be used for each ticket type. More on that shortly.').'

'; echo '

'.__('Step 4').'

'; echo '

'.__('The Tickets page is where you\'ll set up the types of tickets you want to offer. For example, you can set up ticket type "A" to include a shirt and lunch and type "B" which includes just the basics. As you are creating your ticket, you select the ticket options you want included for each ticket type.').'

'; echo '

'.__('Step 5').'

'; echo '

'.__('The Packages page is used to create the items that will be listed for sale on your site. For example, if you created ticket types "A" and "B" in the previous step, you could now create a package called "General Admission" and select ticket type "A" to be included. Then create a second package called "Cheapy Ticket" and attach ticket type "B". Another good use of a ticket package would be for offering event sponsorships. For example, create a package called "Gold Sponsor" with a price tag of $1,000 and includes multiple general admission tickets.').'

'; echo '

'.__('Step 6').'

'; echo '

'.__('Create a new Page and add the following shortcode: [wpeventticketing]. This will display the ticket packages available for your event.').'

'; echo '

'.__('Step 7').'

'; echo '

'.__('On the Settings page, click the Start Registration" button to open ticket sales.').'

'; echo '


'; echo '

'.__('Extras').'

'; echo '

'.__('Reporting').'

'; echo '

'.__('The Reporting page gives you a snap shot of the packages and ticket types sold, coupons used and a graph displaying the number of tickets used and still available. The Summary Report makes it easy to get a count of your attendees based on the data provided. Very handy for getting a count of how many t-shirts you need to order in each size.').'

'; echo '

'.__('Create Coupons').'

'; echo '

'.__('On the Coupons page you can create an easy way to give discounts on tickets. Create a ticket code, set a flat-rate or percentage discount and select the number of times it can be used. This is handy for giving your speakers free entry to the event, but having them register so they are included in the attendee list and receive email notifications you might send.').'

'; echo '

'.__('Send Emails to Attendees').'

'; echo '

'.__('The Notify Attendees page will let you send an email to everybody on the Attendee list. A copy of the email gets sent to the admin automatically. A history of the messages sent is stored and displayed at the bottom of the page.').'

'; echo '

'.__('Create Tickets Manually').'

'; echo '

'.__('You may find it necessary to create a ticket for somebody manually. Use the form on the Attendees page to create a ticket, as an example, for somebody who may have paid cash.').'

'; echo '

'.__('Export Attendee List').'

'; echo '

'.__('Also on the Attendee page you have the option to export a list of all the attendees. This creates a CSV of all attendees and the data they\'ve provided.').'

'; echo '


'; echo '

'.__('Looking for more features?').'

'; echo '

'.__('We are currently hard at work on Event Ticketing Pro. Sign up for our newsletter to be notified when the pro version is released.').'

'; echo '

'.__('We hope you like the plugin. If you have any questions, feel free to contact us.').'

'; echo '
'; } function currencyFormat($num,$type) { if(!strlen($type)) $type = 'USD'; switch($type) { case 'USD': return '$'.number_format($num,2); break; case 'AUD': return 'A $'.number_format($num,2); break; case 'CAD': return 'C $'.number_format($num,2); break; case 'EUR': return '€'.number_format($num,2); break; case 'GBP': return '£'.number_format($num,2); break; case 'JYP': return '¥'.number_format($num,2); break; default: return $type.' '.number_format($num,2); } } function ticketSettings() { $o = get_option("eventTicketingSystem"); //echo '
'.print_r($_REQUEST,true).'
'; echo '
'; if(isset($_REQUEST["submitbutton"]) && $_REQUEST["submitbutton"] == 'Save Settings') { echo '

Settings have been saved.

'; } if($_REQUEST['eventStatusSwitch'] == 1) { echo '

Ticketing has been turned '.($o['eventTicketingStatus'] == 1 ? 'OFF' : 'ON').'

'; } if($_REQUEST["eventReset"] == 1) { echo '

Ticketing has been reset

'; } echo '
'; /* * PAYPAL SETTINGS */ if (wp_verify_nonce($_POST['ticketPaypalNonce'], plugin_basename(__FILE__))) { $o["paypalInfo"] = array( "paypalAPIUser" => trim($_REQUEST["paypalAPIUser"]), "paypalAPIPwd" => trim($_REQUEST["paypalAPIPwd"]), "paypalAPISig" => trim($_REQUEST["paypalAPISig"]), "paypalEnv" => trim($_REQUEST["paypalEnv"]), "paypalCurrency" => $_REQUEST["paypalCurrency"] ); update_option("eventTicketingSystem", $o); //echo '

Paypal settings have been saved.

'; } echo '

Paypal Settings

'; echo '
'; //
'; //echo '
Set your paypal info. None of this is going to work if you cannot get paid. Follow these instructions at Paypal to get your API signature
'; echo '
'; /* *End Paypal */ /* * Messages */ if (wp_verify_nonce($_POST['ticketMessagesNonce'], plugin_basename(__FILE__))) { $o["messages"] = array( "messageEventName" => trim(stripslashes($_REQUEST["messageEventName"])), "messageThankYou" => trim(stripslashes($_REQUEST["messageThankYou"])), "messageRegistrationComingSoon" => trim(stripslashes($_REQUEST["messageRegistrationComingSoon"])), "messageEmailFromName" => trim(stripslashes($_REQUEST["messageEmailFromName"])), "messageEmailFromEmail" => trim(stripslashes($_REQUEST["messageEmailFromEmail"])), "messageEmailBody" => trim(stripslashes($_REQUEST["messageEmailBody"])), "messageEmailSubj" => trim(stripslashes($_REQUEST["messageEmailSubj"])), "messageEmailBcc" => trim(stripslashes($_REQUEST["messageEmailBcc"])), ); update_option("eventTicketingSystem", $o); } echo '
'; echo '

Static Pages

'; //echo '
echo '


Note: You must put the shortcode [ticketlinks] in this thank you page to have the links to the purchased tickets show up
'; echo '
'; echo '
'; echo '

Email Messages

'; echo '


Note: You must put the shortcode [ticketlinks] in this email body to have the links to the purchased tickets show up
'; //'; //echo '
This section controls the messages that your customers will see in email and on the screen as they purchase tickets to the event
'; echo '
'; /* * end messages */ /* * Attendance display */ echo '
'; echo '

Event Attendance Maximum

'; //echo '
echo ''; //'; if (wp_verify_nonce($_POST['eventAttendanceNonce'], plugin_basename(__FILE__))) { if (is_numeric($_REQUEST["eventAttendanceMax"])) { $o["eventAttendance"] = $_REQUEST["eventAttendanceMax"]; $o["displayPackageQuantity"] = $_REQUEST["displayPackageQuantity"]; update_option("eventTicketingSystem", $o); } } echo '
'; echo ''; echo ''; echo '
'; echo '
'; //echo '
'; echo "
"; //echo '
Set your maximum event attendance and whether or not you want to display remaining tickets on the ticket form. This number supercedes all the package quantites if they are set. At no point will you sell more than this many tickets to the event.
'; echo ''; /* * end attendance */ /* * Event Control */ //Start/Stop/Reset Event Screen echo '
'; if (wp_verify_nonce($_POST['eventManipulationNonce'], plugin_basename(__FILE__))) { if($_REQUEST['eventStatusSwitch'] == 1) { $o['eventTicketingStatus'] == 1 ? $o['eventTicketingStatus'] = 0 : $o['eventTicketingStatus'] = 1; update_option('eventTicketingSystem',$o); } if($_REQUEST["eventReset"] == 1) { global $wpdb; $wpdb->query("delete from {$wpdb->options} where option_name like 'package_%' OR option_name like 'ticket_%' OR option_name like 'coupon_%' OR option_name like 'paypal_%'"); //echo '
'.print_r($o,true).'
'; unset($o["packageQuantities"]); unset($o["messages"]["sentMessages"]); if(is_numeric($_REQUEST["eventResetOptions"])) { if($_REQUEST["eventResetOptions"] == 1) { unset($o["packageProtos"]); } if($_REQUEST["eventResetOptions"] == 2) { unset($o["packageProtos"]); unset($o["ticketProtos"]); } if($_REQUEST["eventResetOptions"] == 3) { unset($o["packageProtos"]); unset($o["ticketProtos"]); unset($o["ticketOptions"]); } } if(isset($_REQUEST["eventResetCoupons"]) && $_REQUEST["eventResetCoupons"] == 1) { unset($o["coupons"]); } update_option("eventTicketingSystem",$o); } } echo '

Event Control

'; echo '
'; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo '
'; echo ''; echo ''; echo '
Turn registration on and off with this button. Registration is currently '.($o['eventTicketingStatus'] ? 'On' : 'Off').'

Reset event. Warning: Clicking the reset button will wipe all your sold tickets, coupons, attendee list and reporting! This resets the plugin so you can create a new event. Uncheck the boxes to save ticket, package and ticket option definitions

Also Delete
Package definitions
Ticket & package definitions
Ticket, ticket options and package definitions
Coupon Definitions
'; echo '
'; echo '
'; echo '
'; /* * end event control */ echo '
'; echo ''; } function ticketAttendeeEdit() { $o = get_option("eventTicketingSystem"); echo '
'; //manualy create a ticket if (wp_verify_nonce($_POST['manualCreatePackageNonce'], plugin_basename(__FILE__)) && is_numeric($_REQUEST["manualCreatePackageId"]) && isset($o["packageProtos"][$_REQUEST["manualCreatePackageId"]])) { $withRevenue = false; if(isset($_REQUEST["manualCreateWithRevenue"])) $withRevenue = true; $hashes = eventTicketingSystem::ticketSellPackage($_REQUEST["manualCreatePackageId"], $withRevenue, $_REQUEST["manualCreateEmail"]); $_REQUEST["tickethash"] = $hashes["ticketHash"][0]; echo '

Create Attendee

'; eventTicketingSystem::ticketEditScreen(); } //save edited ticket info if (isset($_REQUEST["tickethash"]) && strlen($_REQUEST["tickethash"]) == 32 && wp_verify_nonce($_POST['ticketInformationNonce'], plugin_basename(__FILE__))) { eventTicketingSystem::ticketEditScreen(); } //edit or delete an existing ticket if (isset($_REQUEST["tickethash"]) && strlen($_REQUEST["tickethash"]) == 32 && wp_verify_nonce($_POST['attendeeEditNonce'], plugin_basename(__FILE__))) { if(isset($_REQUEST["edit"]) && is_numeric($_REQUEST["edit"]) && $_REQUEST["edit"] == 1) { echo '

Edit Attendee

'; eventTicketingSystem::ticketEditScreen(); } elseif(isset($_REQUEST["del"]) && is_numeric($_REQUEST["del"]) && $_REQUEST["del"] == 1) { //echo '
'.print_r($_REQUEST,true).'
'; $ticketHash = $_REQUEST["tickethash"]; $packageHash = get_option('ticket_'.$ticketHash); $package = get_option('package_'.$packageHash); unset($package->tickets[$ticketHash]); //remove ticket delete_option("ticket_".$ticketHash); $o["packageQuantities"]["totalTicketsSold"]--; //if this was the last ticket in the package, get rid of the whole package too if(count($package->tickets) == 0) { delete_option("package_".$packageHash); $o["packageQuantities"][$package->orderDetails["items"][0]["packageId"]]--; } update_option("eventTicketingSystem", $o); } } if(!(is_numeric($_REQUEST["edit"]) || is_numeric($_REQUEST["manualCreatePackageId"]))) { if(is_array($o["packageProtos"])) { echo '

Create Manual Ticket

'; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '
Package Type:
Add ticket value to revenue report
Email Address of receipient
'; echo '
'; } echo '

Attendee List

'; eventTicketingSystem::generateAttendeeTable(urldecode($_REQUEST["attendeesort"])); } echo '
'; echo ''; } function ticketSellPackage($packageId, $withRevenue = false, $emailTo = '') { //this doesn't replace the regular paypal method of selling a ticket //(without modification) //notably the $item array and $order array are different $o = get_option("eventTicketingSystem"); $price = $withRevenue ? $o["packageProtos"][$packageId]->price : 0; $total = $withRevenue ? $o["packageProtos"][$packageId]->price : 0; $item[] = array("quantity" => 1, "name" => $o["packageProtos"][$packageId]->displayName(), "desc" => $o["packageProtos"][$packageId]->packageDescription, "price" => $price, "packageid" => $packageId ); $order = array("items" => $item, "email" => $emailTo, "name" => "Admin Generated", "total"=>$total); $packageHash = md5(microtime() . $packageId); $package = clone $o["packageProtos"][$packageId]; $package->setPackageId($packageHash); $package->setOrderDetails($order); $package->setPackagePrice($price); //get ticket proto from package and wipe proto from package $t = array_shift($package->tickets); for ($y = 1; $y <= $package->ticketQuantity; $y++) { //create tickets and attach them to real package $ticketHash = md5(microtime() . $t->ticketId); $ticket = clone $o["ticketProtos"][$t->ticketId]; $ticket->setTicketid($ticketHash); $ticket->setSoldTime(time()); //echo '
'.print_r($ticket,true).'
'; foreach($ticket->ticketOptions as $tk => $tv) { if($tv->displayName == 'Email') { $ticket->ticketOptions[$tk]->value = $emailTo; } if($tv->displayName == 'First Name') { $ticket->ticketOptions[$tk]->value = ''; } if($tv->displayName == 'Last Name') { $ticket->ticketOptions[$tk]->value = ''; } } $package->addTicket($ticket); add_option("ticket_" . $ticketHash, $packageHash); $o["packageQuantities"]["totalTicketsSold"]++; $tickethashes[] = $ticketHash; } $o["packageQuantities"][$packageId]++; add_option("package_" . $packageHash, $package); //store packagequenitites and tickets sold //should probably be in a different option update_option("eventTicketingSystem", $o); if(check_email_address($emailTo)) { $c = 0; $emaillinks = "\r\n"; foreach ($tickethashes as $hash) { $c++; $url = $o["registrationPermalink"].(strstr($o["registrationPermalink"], '?') ? '&' : '?').'tickethash='.$hash; $emaillinks .= 'Ticket ' . $c . ': ' . $url . "\r\n"; } //$tohead = 'To: ' . $order["name"] . ' <' . $order["email"] . '>' . "\r\n"; $headers = 'From: ' . $o["messages"]["messageEmailFromName"] . ' <' . $o["messages"]["messageEmailFromEmail"] . '>' . "\r\n"; $headers .= 'Bcc: ' . $o["messages"]["messageEmailBcc"] . "\r\n"; wp_mail($order["email"], $o["messages"]["messageEmailSubj"], str_replace('[ticketlinks]', $emaillinks, $o["messages"]["messageEmailBody"]), $tohead.$headers); wp_mail($o["messages"]["messageEmailBcc"], "Event Order Placed", "Order Placed\r\n".$order["name"] . ' <' . $order["email"] . '> ordered '.$c.' tickets for '.eventTicketingSystem::currencyFormat($order["total"],$o["paypalInfo"]["paypalCurrency"])."\r\n\r\n", $headers); } return(array("packageHash"=>$packageHash,"ticketHash"=>$tickethashes)); } function ticketNotify() { $o = get_option("eventTicketingSystem"); if (wp_verify_nonce($_POST['attendeeNotificationNonce'], plugin_basename(__FILE__))) { global $wpdb; $packages = $wpdb->get_results("select option_value from {$wpdb->options} where option_name like 'package_%'"); $bccList = array(); if (is_array($packages)) { foreach ($packages as $k => $v) { $v = unserialize($v->option_value); if(strlen($v->orderDetails["email"])) $bccList[$v->orderDetails["email"]] = $v->orderDetails["email"]; foreach ($v->tickets as $t) { foreach($t->ticketOptions as $option) { if($option->displayName == 'Email' && strlen($option->value)) { $bccList[$option->value] = $option->value; } } } } } $headers = 'To: ' . $o["messages"]["messageEmailFromName"] . ' <' . $o["messages"]["messageEmailFromEmail"] . '>' . "\r\n"; $headers = 'From: ' . $o["messages"]["messageEmailFromName"] . ' <' . $o["messages"]["messageEmailFromEmail"] . '>' . "\r\n"; $headers .= 'Bcc: ' . implode(',',$bccList). "\r\n"; //WP -always- quotes so we have to -always- stripslashes $note = stripslashes($_POST["attendeeNotificationBody"]); $subj = stripslashes($_POST["attendeeNotificationSubj"]); wp_mail($o["messages"]["messageEmailFromEmail"], $subj , $note , $headers); $msg = array("date"=>date("m/d/Y H:i:s"),"subj"=>$subj,"body"=>$note); $o["messages"]["sentMessages"][] = $msg; update_option("eventTicketingSystem",$o); echo '
'; echo '

Notification Sent

'; echo '
'; } echo '
'; echo '
'; echo '

Send Notification to All Attendees

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '
'; if(is_numeric($_REQUEST["messageId"])) { echo '
'; echo 'Date: '.$o["messages"]["sentMessages"][$_REQUEST["messageId"]]["date"].'
'; echo 'Subject: '.$o["messages"]["sentMessages"][$_REQUEST["messageId"]]["subj"].'
'; echo 'Body: '.$o["messages"]["sentMessages"][$_REQUEST["messageId"]]["body"].'
'; echo '
'; } if(is_array($o["messages"]["sentMessages"])) { echo '

Notification History

'; echo ''; echo ''; echo ''; foreach($o["messages"]["sentMessages"] as $id => $m) { echo ''; } echo''; echo '
Date SentSubjectBody
'.$m["date"].''.substr($m["subj"],0,40).''.substr($m["body"],0,80).'
'; } echo '
'; } function getAttendees() { global $wpdb; $packages = $wpdb->get_results("select option_value from {$wpdb->options} where option_name like 'package_%'"); if (is_array($packages)) { foreach ($packages as $k => $v) { $v = unserialize($v->option_value); foreach ($v->tickets as $t) { $t->orderDetails = $v->orderDetails; $attendee[$t->displayName()][] = $t; } } return $attendee; } return array(); } function generateAttendeeTable($sort = 'Sold Time') { $o = get_option("eventTicketingSystem"); if(!strlen($sort)) { $sort = 'Sold Time'; } $attendee = eventTicketingSystem::getAttendees(); if (is_array($attendee)) { foreach ($attendee as $ticketType => $v) { foreach ($v as $ticket) { $trtmp = array(); //populate the soldtime stuff in the display array $th[$ticketType]['Sold Time'] = 'Sold Time'; $trtmp['Sold Time'] = date("m/d/Y H:i:s",$ticket->soldTime); foreach ($ticket->ticketOptions as $op) { $th[$ticketType][$op->displayName] = $op->displayName; $trtmp[$op->displayName] = $op->value; } $trtmp["final"] = $ticket->final; $trtmp["orderdetails"] = $ticket->orderDetails; $trtmp["hash"] = $ticket->ticketId; $tr[$ticketType][] = $trtmp; } } $cmp = new arbitrarySort($sort); foreach($tr as $k => $v) { usort($tr[$k], array($cmp, 'cmp')); } foreach ($th as $k => $v) { $headerkey = array(); echo '
'; echo ""; echo ""; echo ''; echo ""; echo ''; foreach ($v as $header) { $headerkey[] = $header; echo ''; } echo ""; echo ""; echo ''; $c = 0; $csv = implode(',',$headerkey)."\n"; foreach ($tr[$k] as $data) { $c++; if(!$data["final"]) { echo ''; echo ''; echo ''; echo ''; //echo '
'.print_r($data,true).'
';exit; if(!strlen($data["Email"])) { $tcsv = array($data["Sold Time"],$data["orderdetails"]["name"],$data["orderdetails"]["email"]); $csv .= implode(',',$tcsv)."\n"; } else { $tcsv = ''; foreach ($headerkey as $key) { if(is_array($data[$key])) { $tcsv .= '"'.implode($data[$key],',').'",'; } else { $tcsv .= '"'.$data[$key].'",'; } } $csv .= substr($tcsv,0,-1)."\n"; } } else { echo ''; echo ''; echo ''; $tcsv = ''; foreach ($headerkey as $key) { if(is_array($data[$key])) { echo ''; $tcsv .= '"'.implode($data[$key],',').'",'; } else { echo ''; $tcsv .= '"'.$data[$key].'",'; } } $csv .= substr($tcsv,0,-1)."\n"; } echo ''; } echo ''; echo ''; echo '
'.$k.'
 '.$header.'
Link | Edit | Delete'.$data["Sold Time"].''.(is_array($data["orderdetails"]) ? $data["orderdetails"]["name"].': '.$data["orderdetails"]["email"] : "").'
Link | Edit | Delete'.implode($data[$key],',').'' . (strlen($data[$key]) ? $data[$key] : " ") . '
'; echo '
'; echo '


'; } } } function ticketReporting() { global $wpdb; $o = get_option("eventTicketingSystem"); $packages = $wpdb->get_results("select option_value from {$wpdb->options} where option_name like 'package_%'"); if (is_array($packages)) { foreach ($packages as $k => $v) { $v = unserialize($v->option_value); $package[$v->displayName()]['count']++; $package[$v->displayName()]['money'] += $v->price; foreach ($v->tickets as $t) { $t->orderDetails = $v->orderDetails; $ticket[$t->displayName()]['count']++; $attendee[$t->displayName()][] = $t; //echo '
'.print_r($t,true).'
';exit; } } } $coupons = $wpdb->get_results("select option_value from {$wpdb->options} where option_name like 'coupon_%'"); if (is_array($coupons)) { foreach ($coupons as $k => $v) { $v = unserialize($v->option_value); foreach ($v["items"] as $c) { $coupon[$c["name"]]['count'] += $c["quantity"]; $coupon[$c["name"]]['money'] += $o["packageProtos"][$c["packageid"]]->price; } } } $pTotal = $cTotal = 0; echo '
'; echo '
'; echo '

Event Ticketing

'; //counts table echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; if (is_array($package)) { $total = 0; foreach ($package as $k => $v) { $total += $v["money"]; echo ""; echo ''; echo ''; echo ''; echo ""; } $pTotal = $total; echo ''; } echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; if (is_array($coupon)) { $total = 0; foreach ($coupon as $k => $v) { $total += $v["money"]; echo ""; echo ''; echo ''; echo ''; echo ""; } $cTotal = $total; } echo ''; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; if (is_array($ticket)) { $total = 0; foreach ($ticket as $k => $v) { $total += $v["count"]; echo ""; echo ''; echo ''; echo ''; echo ""; } echo ""; echo ''; echo ''; echo ''; echo ""; } echo ""; echo "
PackageSoldRevenue
' . $k . '' . $v["count"] . '' . eventTicketingSystem::currencyFormat($v["money"],$o["paypalInfo"]["paypalCurrency"]). '
Total Package Revenue ' . eventTicketingSystem::currencyFormat($pTotal,$o["paypalInfo"]["paypalCurrency"]). '
CouponUsedDiscounted
' . $k . '' . $v["count"] . '($' . $v["money"] . ')
Total Revenue ' . eventTicketingSystem::currencyFormat(($pTotal-$cTotal),$o["paypalInfo"]["paypalCurrency"]) . '
TicketSoldRemaining
' . $k . '' . $v["count"] . ' 
Total' . $total . '' . ($o["eventAttendance"] - $total) . '
"; //end counts table echo '
'; echo '
'; echo ''; echo '
'; if (is_array($attendee)) { foreach ($attendee as $ticketType => $v) { //filthy hack to display ticket info quickly //should be moved into ticket and ticketOption objects usort($v, array("eventTicketingSystem","ticketCmp")); foreach ($v as $ticket) { $trtmp = array(); //populate the soldtime stuff in the display array $th[$ticketType]['Sold Time'] = 'Sold Time'; $trtmp['Sold Time'] = date("m/d/Y H:i:s",$ticket->soldTime); foreach ($ticket->ticketOptions as $to) { $th[$ticketType][$to->displayName] = $to->displayName; $trtmp[$to->displayName] = $to->value; } $trtmp["final"] = $ticket->final; $trtmp["orderdetails"] = $ticket->orderDetails; $trtmp["hash"] = $ticket->ticketId; $tr[] = $trtmp; } } echo '
'; echo '

Summary Reports

'; foreach($th as $hk=> $hv) { foreach($hv as $kk => $vv) { if($kk == 'Sold Time') continue; $summaryType[$kk] = 1; } } if(strlen($_GET["summary"])) { $s = urldecode($_GET["summary"]); echo ''; echo ''; echo ''; echo ''; echo ''; foreach($tr as $to) { $summary[$to[$s]]++; } ksort($summary); foreach($summary as $op => $count) { echo ''; } echo ''; echo '
'.$s.'Count
'.(strlen($op) ? $op : "No reponse").''.$count.'
'; } echo ''; echo ''; echo ''; echo ''; echo ''; foreach($summaryType as $kk => $vv) { echo ''; } echo ''; echo '
Summarize by...
'.$kk.'
'; echo '
'; } echo '
'; } function ticketOptionsControl() { //echo "
";print_r($_REQUEST); echo "
"; $o = get_option("eventTicketingSystem"); if (wp_verify_nonce($_POST['ticketOptionAddNonce'], plugin_basename(__FILE__))) { $_REQUEST = array_map('stripslashes_deep', $_REQUEST); if (is_numeric($_REQUEST["edit"])) { $ticketOption = $o["ticketOptions"][$_REQUEST["edit"]]; } elseif (is_numeric($_REQUEST["del"])) { unset($o["ticketOptions"][$_REQUEST["del"]]); update_option("eventTicketingSystem", $o); $ticketOption = new ticketOption(); echo '

Option deleted

'; } else { if (is_numeric($_REQUEST["update"])) { unset($o["ticketOptions"][$_REQUEST["update"]]); $nextId = $_REQUEST["update"]; } else { $nextId = ((int) max(array_keys($o["ticketOptions"]))) + 1; } if ($_REQUEST["ticketOptionDisplayType"] != "dropdown" && $_REQUEST["ticketOptionDisplayType"] != "multidropdown") { $_REQUEST["ticketOptionDrop"] = NULL; } $o["ticketOptions"][$nextId] = new ticketOption($_REQUEST["ticketOptionDisplay"], $_REQUEST["ticketOptionDisplayType"], $_REQUEST["ticketOptionDrop"]); $o["ticketOptions"][$nextId]->setOptionId($nextId); update_option("eventTicketingSystem", $o); echo '

Option saved

'; $ticketOption = new ticketOption(); } } else { $ticketOption = new ticketOption(); } echo "
"; echo "
"; echo "
"; echo "

Options

"; if (is_array($o["ticketOptions"])) { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["ticketOptions"] as $k => $v) { echo ""; echo ''; echo ''; } echo ""; echo ""; echo "
Ticket OptionsActions
' . $v->displayName . 'Edit | Delete
"; echo '
Create all the options you want for each ticket. This is the information you would ask of each person attending your event such as personal info (name/address/phone) or shirt size or meal preference.
'; } echo "
"; echo '

Create New Option

Display Name:
Option Type:
'; echo '
'; if (is_array($ticketOption->options) && !empty($ticketOption->options)) { $c = 0; foreach ($ticketOption->options as $option) { $c++; echo '
'; echo 'Value: '; echo '
'; } } else { echo '
'; echo 'Value: '; echo '
'; } echo '

'; if (is_numeric($_REQUEST["edit"]) && is_numeric($ticketOption->optionId)) { echo '

'; } else { echo '
'; } echo '
'; echo '
'; echo '
'; } function ticketTicketsControl() { //echo "
";print_r($_REQUEST); echo "
"; $o = get_option("eventTicketingSystem"); if (wp_verify_nonce($_POST['ticketOptionAddToTicketNonce'], plugin_basename(__FILE__))) { if (is_numeric($_REQUEST["ticketId"])) { if (is_numeric($_REQUEST["add"])) { $o["ticketProtos"][$_REQUEST["ticketId"]]->addOption($o["ticketOptions"][$_REQUEST["add"]]); update_option("eventTicketingSystem", $o); } elseif (is_numeric($_REQUEST["del"])) { $o["ticketProtos"][$_REQUEST["ticketId"]]->delOption($_REQUEST["del"]); update_option("eventTicketingSystem", $o); } $ticketProto = $o["ticketProtos"][$_REQUEST["ticketId"]]; } } if (wp_verify_nonce($_POST['ticketEditNonce'], plugin_basename(__FILE__))) { if ($_REQUEST["add"] == 1) { if(!strlen($_REQUEST["ticketDisplayName"])) { echo '

Ticket name cannot be blank

'; } else { if (is_array($o["ticketProtos"]) && !empty($o["ticketProtos"])) { $nextId = ((int) max(array_keys($o["ticketProtos"]))) + 1; } else { $nextId = 0; } $o["ticketProtos"][$nextId] = new ticket(); $o["ticketProtos"][$nextId]->setTicketId($nextId); $o["ticketProtos"][$nextId]->setDisplayName($_REQUEST["ticketDisplayName"]); update_option("eventTicketingSystem", $o); $ticketProto = $o["ticketProtos"][$nextId]; echo '

Ticket added

'; } } elseif (is_numeric($_REQUEST["del"])) { unset($o["ticketProtos"][$_REQUEST["del"]]); update_option("eventTicketingSystem", $o); echo '

Ticket deleted

'; } elseif (is_numeric($_REQUEST["edit"])) { $ticketProto = $o["ticketProtos"][$_REQUEST["edit"]]; } elseif (is_numeric($_REQUEST["update"])) { $o["ticketProtos"][$_REQUEST["update"]]->setDisplayName($_REQUEST["ticketDisplayName"]); update_option("eventTicketingSystem", $o); echo '

Ticket updated

'; } } echo "
"; echo "
"; echo "
"; echo "

Tickets

"; if (is_array($o["ticketProtos"])) { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["ticketProtos"] as $k => $v) { echo ""; echo ''; echo '"; echo ""; echo "
Existing TicketsActions
' . $v->displayName() . 'Edit | Delete'; } echo "
"; } echo "
"; echo "
"; echo '
'; echo '
'; if (is_array($o["ticketOptions"]) && is_numeric($ticketProto->ticketId)) { echo "
"; echo "

Ticket Options

"; echo "
"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["ticketOptions"] as $k => $v) { echo ""; echo ''; echo ''; } echo ""; echo ""; echo "
Ticket OptionsActions
' . $v->displayName . 'Add To New Ticket Below
"; $ticketProto->displayForm(); echo '
'; } else { echo '

Create New Ticket

'; echo 'Ticket Name: '; echo '

Add New Ticket'; } echo "
"; echo ''; echo '
Create a ticket and attach the options you want for that ticket. Add the options in the order you want them displayed on the form when someone purchases a ticket

Example: Create two types of tickets which are the same where one doesn\'t ask for shirt size since a shirt isn\'t included

'; } function ticketPackagesControl() { //echo "
";print_r($_REQUEST); echo "
"; $o = get_option("eventTicketingSystem"); if (wp_verify_nonce($_POST['ticketAddToPackageNonce'], plugin_basename(__FILE__))) { if (is_numeric($_REQUEST["packageId"])) { if (is_numeric($_REQUEST["add"])) { $o["packageProtos"][$_REQUEST["packageId"]]->addTicket($o["ticketProtos"][$_REQUEST["add"]]); update_option("eventTicketingSystem", $o); } elseif (is_numeric($_REQUEST["del"])) { $o["packageProtos"][$_REQUEST["packageId"]]->delTicket($_REQUEST["del"]); update_option("eventTicketingSystem", $o); echo '

Package updated

'; } $packageProto = $o["packageProtos"][$_REQUEST["packageId"]]; } } if (wp_verify_nonce($_POST['packageEditNonce'], plugin_basename(__FILE__))) { if ($_REQUEST["add"] == 1) { if (is_array($o["packageProtos"]) && !empty($o["packageProtos"])) { $nextId = ((int) max(array_keys($o["packageProtos"]))) + 1; } else { $nextId = 0; } $o["packageProtos"][$nextId] = new package(); $o["packageProtos"][$nextId]->setPackageId($nextId); update_option("eventTicketingSystem", $o); echo '

New package has been added

'; $packageProto = $o["packageProtos"][$nextId]; } elseif(is_numeric($_REQUEST["activate"])) { if($o["packageProtos"][$_REQUEST["activate"]]->active === false) { $o["packageProtos"][$_REQUEST["activate"]]->setActive(true); } else { $o["packageProtos"][$_REQUEST["activate"]]->setActive(false); } update_option("eventTicketingSystem", $o); } elseif (is_numeric($_REQUEST["del"])) { unset($o["packageProtos"][$_REQUEST["del"]]); update_option("eventTicketingSystem", $o); echo '

Package deleted

'; } elseif (is_numeric($_REQUEST["edit"])) { $packageProto = $o["packageProtos"][$_REQUEST["edit"]]; } elseif (is_numeric($_REQUEST["update"])) { $_REQUEST = array_map('stripslashes_deep', $_REQUEST); $o["packageProtos"][$_REQUEST["update"]]->setDisplayName($_REQUEST["packageDisplayName"]); $o["packageProtos"][$_REQUEST["update"]]->setExpire(array("start" => $_REQUEST["packageExpireStart"], "end" => $_REQUEST["packageExpireEnd"])); $o["packageProtos"][$_REQUEST["update"]]->setPackagePrice($_REQUEST["packagePrice"]); $o["packageProtos"][$_REQUEST["update"]]->setTicketQuantity($_REQUEST["packageTicketQuantity"] < 1 ? 1 : $_REQUEST["packageTicketQuantity"]); $o["packageProtos"][$_REQUEST["update"]]->setPackageQuantity($_REQUEST["packageQuantity"]); $o["packageProtos"][$_REQUEST["update"]]->setPackageDescription($_REQUEST["packageDescription"]); update_option("eventTicketingSystem", $o); echo '

Package updated

'; } } echo "
"; echo "
"; echo "
"; echo "

Packages

"; if (is_array($o["packageProtos"])) { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["packageProtos"] as $k => $v) { echo 'active === false ? "style=\"background-color:LightPink;\"" : "").'>'; echo ''; echo ''; } echo ""; echo ""; echo "
Existing PackagesActions
' . $v->displayName() . 'Edit | Delete'; echo ' | '.($v->active === false ? 'Activate' : 'Deactivate').''; echo '
"; } echo "
"; echo "
"; echo '
'; echo '
'; if (is_array($o["ticketProtos"]) && is_numeric($packageProto->packageId)) { if (empty($packageProto->tickets)) { echo '

Pick the type of ticket for this package

'; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["ticketProtos"] as $k => $v) { echo ""; echo ''; echo ''; } echo ""; echo ""; echo "
Existing TicketsActions
' . $v->displayName() . 'Add Ticket To Package and set options
"; } else { $packageProto->displayForm(); echo ''; } } else { echo '

Create New Package


Add New Package'; } echo '
'; echo '
Create a package and attach a ticket to it. This is where you determine the price for the event.

Example: You have defined a single standard ticket called Regular. Attach Regular to the package with a quantity of 1, give it a price which is $10 less than full admission and give it an active date which will end a month before the event and a quantity of 50. With this you have created an early bird ticket which will expire either a month before the event occurs or when 50 of them are sold, whichever comes first

Example: Create a package and attach Regular to the package with a quantity of 4 and give this package a price of $500. This would be like a sponsorship package where you are bundling some free tickets to go along with a sponsorship

'; echo '
'; } function ticketEventsControl() { //echo "
";print_r($_REQUEST); echo "
"; $o = get_option("eventTicketingSystem"); echo '
'; echo "
"; } function ticketCouponsControl() { $o = get_option("eventTicketingSystem"); if (wp_verify_nonce($_POST['couponEditNonce'], plugin_basename(__FILE__))) { //echo '
'.print_r($_REQUEST,true).'
'; if(is_array($_REQUEST["coupon"])) { $saved = 0; foreach($_REQUEST["coupon"] as $k => $v) { if (is_numeric($v["packageId"]) && strlen($v["couponCode"]) && is_numeric($v["couponAmount"])) { //this happens when a coupon is edited and the coupon code is changed //this way we don't have a new coupon added when a code is changed if(isset($_REQUEST["update"]) && isset($o["coupons"][$_REQUEST["update"]]) && $_REQUEST["update"] != $v["couponCode"]) { unset($o["coupons"][$_REQUEST["update"]]); } $o["coupons"][$v["couponCode"]] = array("couponCode" => $v["couponCode"], "packageId" => $v["packageId"], "uses" => $v["couponUses"], "type"=>$v["couponType"], "amt"=>$v["couponAmount"], "used"=>$v["couponUsed"]); $saved++; } } if($saved) { update_option("eventTicketingSystem", $o); echo '

'.$saved.' coupons saved.

'; } } if ($_REQUEST["add"] == 1) { for($i = 1; $i < 11; $i++) { $coupon[] = array("couponCode" => '', "packageId" => '', "used" => ''); } } if (strlen($_REQUEST["edit"])) { $coupon[] = $o["coupons"][$_REQUEST["edit"]]; } if (strlen($_REQUEST["del"])) { unset($o["coupons"][$_REQUEST["del"]]); update_option("eventTicketingSystem", $o); } } echo "
"; echo "
"; echo "
"; echo "

Coupons

"; if (is_array($o["coupons"])) { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($o["coupons"] as $couponid => $v) { echo ""; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ""; } echo ""; echo "
Existing CouponsFor PackageTypeUses LeftUsedActions
' . $v["couponCode"] . '' . $o["packageProtos"][$v["packageId"]]->displayName() . ''.($v["type"] == "flat" ? "$".$v["amt"] : $v["amt"]."%").'' . $v["uses"] . '' . $v["used"] . 'Edit | Delete
"; } echo "
"; echo "
"; echo "
"; echo '
'; if(isset($_REQUEST["edit"]) && strlen($_REQUEST["edit"])) { echo ''; } if (isset($coupon)) { if (strlen($coupon[0]["couponCode"])) { echo '

Update Coupon

'; } else { echo '

Add Coupons

'; } echo ''; echo ''; echo ''; echo ''; echo ''; foreach($coupon as $ck => $cv) { echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo ''; echo ''; echo '
CodePackageTypeAmountUses
'; } else { echo '

Create New Coupon


Add New Coupon'; } echo '
'; echo '
Coupons are codes you will create to give a discounted or free ticket to the event. Owe someone a favor or have them pay you by check? Just generate a coupon and welcome them to the event!
'; echo '
'; } function shortcode() { //echo '
'.print_r($_REQUEST,true).'
'; $o = get_option("eventTicketingSystem"); if(!isset($o["registrationPermalink"]) || (isset($o["registrationPermalink"]) && $o["registrationPermalink"] != get_permalink())) { $o["registrationPermalink"] = get_permalink(); update_option("eventTicketingSystem",$o); } ob_start(); if($o['eventTicketingStatus'] != 1) { echo $o["messages"]["messageRegistrationComingSoon"]; return(ob_get_clean()); } echo '
'; // wrap all output in this div for styling //return redirect from paypal //token=EC-4DR89227KU882313S&PayerID=5SYRSDFCC4Z56 if ((isset($_REQUEST["token"]) && isset($_REQUEST["PayerID"]) && strlen($_REQUEST["token"]) == 20 && strlen($_REQUEST["PayerID"]) == 13 && !$_REQUEST["paypalRedirect"]) || (isset($_REQUEST["couponSubmitNonce"]) && wp_verify_nonce($_REQUEST['couponSubmitNonce'], plugin_basename(__FILE__)))) { if(!isset($_REQUEST['couponSubmitNonce'])) { //get order details to send to paypal...again $order = get_option("paypal_" . $_REQUEST["token"]); $total = $order["total"]; $item = $order["items"]; include(WP_PLUGIN_DIR . '/' . plugin_basename(dirname(__FILE__)) . '/lib/nvp.php'); include(WP_PLUGIN_DIR . '/' . plugin_basename(dirname(__FILE__)) . '/lib/paypal.php'); $p = $o["paypalInfo"]; $method = "DoExpressCheckoutPayment"; $cred = array("apiuser" => $p["paypalAPIUser"], "apipwd" => $p["paypalAPIPwd"], "apisig" => $p["paypalAPISig"]); $env = $p["paypalEnv"]; $nvp = array('PAYMENTREQUEST_0_AMT' => $total, 'TOKEN' => $_REQUEST["token"], "PAYERID" => $_REQUEST["PayerID"], "PAYMENTREQUEST_0_PAYMENTACTION" => 'Sale', "PAYMENTREQUEST_0_CURRENCYCODE" => $p["paypalCurrency"], ); foreach ($item as $k => $i) { //$nvp['L_PAYMENTREQUEST_0_NAME' . $k] = $i["name"]; $nvp['L_PAYMENTREQUEST_0_NAME' . $k] = $o["messages"]["messageEventName"] . ": Registration"; $nvp['L_PAYMENTREQUEST_0_DESC' . $k] = substr($i["desc"],0,127); $nvp['L_PAYMENTREQUEST_0_AMT' . $k] = $i["price"]; $nvp['L_PAYMENTREQUEST_0_QTY' . $k] = $i["quantity"]; } $nvp['PAYMENTREQUEST_0_ITEMAMT'] = $total; $nvpStr = nvp($nvp); $resp = PPHttpPost($method, $nvpStr, $cred, $env); } else { $order = get_option("coupon_" . $_REQUEST["couponSubmitNonce"]); if(!$order) { echo '
That coupon has already been used
'; return(false); } //remove option so it can't be used again delete_option("coupon_" . $_REQUEST["couponSubmitNonce"]); $resp["ACK"] = 'Success'; } if (isset($resp["ACK"]) && $resp["ACK"] == 'Success') { //Set _REQUEST var so that if this gets hook called again in a single //http request it won't get run twice //TODO: figure out what can cause this hook to run twice $_REQUEST["paypalRedirect"] = 1; if (!isset($o["packageQuantities"]["totalTicketsSold"])) { $o["packageQuantities"]["totalTicketsSold"] = 0; } if (!isset($o["packageQuantities"][$_REQUEST["packageId"]])) { $o["packageQuantities"][$_REQUEST["packageId"]] = 0; } //check for special packages in the session...err...transient thing $transient = get_transient($_COOKIE["event-ticketing-cookie"]); if($transient) { $o["packageProtos"][$transient->packageId] = $transient; delete_transient($_COOKIE["event-ticketing-cookie"]); } foreach ($order["items"] as $i) { for ($x = 1; $x <= $i["quantity"]; $x++) { $packageHash = md5(microtime() . $i["packageid"]); $package = clone $o["packageProtos"][$i["packageid"]]; $package->setPackageId($packageHash); $package->setOrderDetails($order); //register coupon use if there was a coupon used if(isset($package->coupon) && isset($o["coupons"][$package->coupon["couponCode"]])) { if(!isset($o["coupons"][$package->coupon["couponCode"]]["used"])) { $o["coupons"][$package->coupon["couponCode"]]["used"] = 0; } $o["coupons"][$package->coupon["couponCode"]]["used"]++; $o["coupons"][$package->coupon["couponCode"]]["uses"]--; //filthy hack to check for couponed packages and getting them accounted for properly $i["packageid"] = $package->coupon["packageId"]; } //get ticket proto from package and wipe proto from package $t = array_shift($package->tickets); for ($y = 1; $y <= $package->ticketQuantity; $y++) { //create tickets and attach them to real package $ticketHash = md5(microtime() . $t->ticketId); $ticket = clone $o["ticketProtos"][$t->ticketId]; $ticket->setTicketid($ticketHash); $ticket->setSoldTime(time()); $n = explode(' ',$order["name"],2); foreach($ticket->ticketOptions as $tk => $tv) { if($tv->displayName == 'Email') { $ticket->ticketOptions[$tk]->value = $order["email"]; } if($tv->displayName == 'First Name') { $ticket->ticketOptions[$tk]->value = $n[0]; } if($tv->displayName == 'Last Name') { $ticket->ticketOptions[$tk]->value = $n[1]; } } $package->addTicket($ticket); add_option("ticket_" . $ticketHash, $packageHash); $o["packageQuantities"]["totalTicketsSold"]++; $tickethashes[] = $ticketHash; } $o["packageQuantities"][$i["packageid"]]++; add_option("package_" . $packageHash, $package); } //if there's a temporary package lying around don't store it permanently if($transient) { unset($o["packageProtos"][$transient->packageId]); } //store packagequenitites and tickets sold //should probably be in a different option update_option("eventTicketingSystem", $o); } $replaceThankYou = ''; echo '
' . str_replace('[ticketlinks]', $replaceThankYou, $o["messages"]["messageThankYou"]) . '
'; //$tohead = 'To: ' . $order["name"] . ' <' . $order["email"] . '>' . "\r\n"; $headers = 'From: ' . $o["messages"]["messageEmailFromName"] . ' <' . $o["messages"]["messageEmailFromEmail"] . '>' . "\r\n"; $headers .= 'Bcc: ' . $o["messages"]["messageEmailBcc"] . "\r\n"; wp_mail($order["email"], $o["messages"]["messageEmailSubj"], str_replace('[ticketlinks]', $emaillinks, $o["messages"]["messageEmailBody"]), $tohead.$headers); wp_mail($o["messages"]["messageEmailBcc"], "Event Order Placed", "Order Placed\r\n".$order["name"] . ' <' . $order["email"] . '> ordered '.$c.' tickets for '.($o["paypalInfo"]["paypalCurrency"] == 'USD' ? "$" : $o["paypalInfo"]["paypalCurrency"]."$").''.number_format($order["total"],2)."\r\n\r\n", $headers); } else { echo '
There was an error from PayPal
Error: ' . urldecode($resp["L_LONGMESSAGE0"]) . '
'; } } elseif (isset($_REQUEST["tickethash"]) && strlen($_REQUEST["tickethash"]) == 32) { eventTicketingSystem::ticketEditScreen(); } else { //This will catch any errors thrown in the paypal() method. //Have to use session because paypal() has to happen quite early to allow for the paypal redirect if (strlen($_SESSION["ticketingError"])) { echo '
' . $_SESSION["ticketingError"] . '
'; unset($_SESSION["ticketingError"]); } //check for special packages in the session...err...transient thing //echo '
'.print_r($_SESSION,true).'
'; $transient = get_transient($_COOKIE["event-ticketing-cookie"]); if($transient instanceof package) { $o["packageProtos"][$transient->packageId] = $transient; } echo '
'; echo ''; echo '
Please enter a name and email address for your confirmation and tickets
'; echo '
'; echo '
'; echo ''; echo ''; echo ''; echo ''; if ($o["displayPackageQuantity"]) { echo ''; } echo ''; echo ''; foreach ($o["packageProtos"] as $k => $v) { //determine remaining tickets so we don't display selectors that allow too many tickets to be sold //overall attendance max takes precendece over individual package quantity limitation $totalRemaining = $o["eventAttendance"] - $o["packageQuantities"]["totalTicketsSold"]; if ($v->packageQuantity) { $packageRemaining = $v->packageQuantity - $o["packageQuantities"][$v->packageId]; $packageCounter = ($packageRemaining * $v->ticketQuantity) < $totalRemaining ? $packageRemaining : floor($totalRemaining / $v->ticketQuantity); $packageCounter = $packageCounter > 10 ? 10 : $packageCounter; } else { if(!$v->ticketQuantity) $v->ticketQuantity = 1; $packageRemaining = floor($totalRemaining / $v->ticketQuantity); $packageCounter = $packageRemaining > 10 ? 10 : $packageRemaining; } //echo $v->packageId."::".$packageCounter."
"; if ($packageCounter > 0 && $v->validDates() && $v->active !== false) { echo ''; echo ''; echo ''; if ($o["displayPackageQuantity"]) { echo ''; } echo ''; echo ''; } } echo ''; echo ''; echo '
DescriptionPriceRemainingQuantity
' . $v->packageName . '
' . $v->packageDescription . '
'. (is_numeric($v->price) ? eventTicketingSystem::currencyFormat($v->price,$o["paypalInfo"]["paypalCurrency"]) : eventTicketingSystem::currencyFormat(0,$o["paypalInfo"]["paypalCurrency"])) . '' . $packageRemaining . ' left
Choose your tickets and pay for them at PayPal. You will fill in your ticket information after your purchase is completed.
'; echo '
'; // id="packages" echo '
'; } echo '
'; // class="eventTicketing" return (ob_get_clean()); } function ticketEditScreen() { //ticket form recieved if (wp_verify_nonce($_POST['ticketInformationNonce'], plugin_basename(__FILE__))) { $_REQUEST = array_map('stripslashes_deep', $_REQUEST); //echo '
'.print_r($_REQUEST,true).'
'; $ticketHash = $_REQUEST["tickethash"]; $packageHash = $_REQUEST["packagehash"]; $package = get_option('package_' . $packageHash); if ($package instanceof package) { foreach ($_REQUEST["ticketOption"] as $oid => $oval) { $package->tickets[$ticketHash]->ticketOptions[$oid]->value = $oval; } //echo '
'.print_r($package->tickets,true).'
'; $package->tickets[$ticketHash]->final = true; update_option('package_' . $packageHash, $package); echo '
Your ticket has been saved
'; } } else { //pull ticketinfo //display ticket form (filling in if this is already been finished) $ticketHash = $_REQUEST["tickethash"]; $packageHash = get_option('ticket_' . $ticketHash); $package = get_option('package_' . $packageHash); if ($package instanceof package) { $ticket = $package->tickets[$ticketHash]; //echo '
'.print_r($ticket,true).'
'; echo '
'; echo ''; echo ''; echo ''; echo ''; foreach ($ticket->ticketOptions as $option) { echo ''; } echo ''; echo '
' . $option->displayName . ':' . $option->displayForm() . '
'; echo '
'; } else { echo '
Your tickethash appears to be incorrect. Please check your link and try again
'; } } } function paypal() { $o = get_option("eventTicketingSystem"); //check order and build for later retrieval if (wp_verify_nonce($_POST['packagePurchaseNonce'], plugin_basename(__FILE__))) { if (!check_email_address($_REQUEST["packagePurchaseEmail"])) { $_SESSION["ticketingError"] = 'Please enter a name and email address'; return (false); } if (strlen($_REQUEST["couponSubmitButton"])) { if (is_array($o["coupons"][$_REQUEST["couponCode"]]) && is_numeric($o["coupons"][$_REQUEST["couponCode"]]["packageId"])) { $coupon = $o["coupons"][$_REQUEST["couponCode"]]; if($coupon["uses"] <= 0) { $_SESSION["ticketingError"] = 'That coupon has already been used the maximum number of times'; return(false); } if($o["packageProtos"][$coupon["packageId"]]->active === false) { $_SESSION["ticketingError"] = 'That coupon is for a package which is inactive'; return(false); } //echo "
";print_r($coupon);exit;
					$package = clone $o["packageProtos"][$coupon["packageId"]];
					if($coupon["type"] == 'flat')
					{
						$package->price = $package->price - $coupon["amt"];
					}
					elseif($coupon["type"] == 'percent')
					{
						$package->price = $package->price*(1-($coupon["amt"]/100));
					}
					$package->packageDescription = '**discounted** '.$package->packageDescription;
					$package->setExpire(array("start"=>date("m/d/Y",strtotime("-1 days")),"end"=>date("m/d/Y",strtotime("+1 days"))));
					//set package id to something unlikely to happen in normal operation
					$package->setPackageId(424242);
					$package->setPackageQuantity(1);
					$package->setCoupon($coupon);
			
					$cookieVal = md5(microtime().rand(0,100));					
					setcookie("event-ticketing-cookie", $cookieVal, time()+3600);
					$_COOKIE["event-ticketing-cookie"] = $cookieVal;
					set_transient($cookieVal,$package,3600);
					return(true);
				}
				else
				{
					$_SESSION["ticketingError"] = 'Invalid Coupon Entered';
					return (false);
				}
			}
			
			//check for coupon package in the session...err...transient thing
			$transient = get_transient($_COOKIE["event-ticketing-cookie"]);
			if($transient instanceof package)
            {
				$o["packageProtos"][$transient->packageId] = $transient;
            }
				
			$somethingpurchased = $total = 0;
			foreach ($_REQUEST["packagePurchase"] as $packageId => $quantity)
			{
				if ($quantity > 0)
				{
					$somethingpurchased = 1;
					$total += $o["packageProtos"][$packageId]->price * $quantity;
					$item[] = array("quantity" => $quantity,
					                "name" => $o["packageProtos"][$packageId]->displayName(),
					                "desc" => $o["packageProtos"][$packageId]->packageDescription,
					                "price" => $o["packageProtos"][$packageId]->price,
					                "packageid" => $packageId
					);
				}
			}
            

			//was something purchased?
			if ($somethingpurchased == 0)
			{
				$_SESSION["ticketingError"] = 'You did not choose a quantity on any of the tickets. Please choose how many tickets you want';
			}
			else
			{
				//check to see if value is $0 due to a discount code or something
				//do something here
				if($total <= 0)
				{
					$couponSubmitNonce = wp_create_nonce(plugin_basename(__FILE__));
					
					add_option('coupon_' . $couponSubmitNonce, array("items" => $item, "email" => $_REQUEST["packagePurchaseEmail"], "name" => $_REQUEST["packagePurchaseName"]));
					header('Location: ' . get_permalink() .(strstr(get_permalink(), '?') ? '&' : '?'). 'couponSubmitNonce=' . $couponSubmitNonce);
					exit;
				}
				
				//looks like we got a submit with some values, let's redirect to paypal
				include(WP_PLUGIN_DIR . '/' . plugin_basename(dirname(__FILE__)) . '/lib/nvp.php');
				include(WP_PLUGIN_DIR . '/' . plugin_basename(dirname(__FILE__)) . '/lib/paypal.php');
				$returnsite = get_permalink();
				
				$p = $o["paypalInfo"];

				if (is_array($item))
				{
					$method = "SetExpressCheckout";
					$cred = array("apiuser" => $p["paypalAPIUser"], "apipwd" => $p["paypalAPIPwd"], "apisig" => $p["paypalAPISig"]);
					$env = $p["paypalEnv"];
					$nvp = array('PAYMENTREQUEST_0_AMT' => $total,
					             "RETURNURL" => $returnsite,
					             "CANCELURL" => $returnsite,
					             "PAYMENTREQUEST_0_PAYMENTACTION" => 'Sale',
			 			         "PAYMENTREQUEST_0_CURRENCYCODE" => $p["paypalCurrency"],
					);
					foreach ($item as $k => $i)
					{
						//$nvp['L_PAYMENTREQUEST_0_NAME' . $k] = $i["name"];
						$nvp['L_PAYMENTREQUEST_0_NAME' . $k] = $o["messages"]["messageEventName"] . ": Registration";
						$nvp['L_PAYMENTREQUEST_0_DESC' . $k] = substr($i["desc"],0,127);
						$nvp['L_PAYMENTREQUEST_0_AMT' . $k] = $i["price"];
						$nvp['L_PAYMENTREQUEST_0_QTY' . $k] = $i["quantity"];
					}
					$nvp['PAYMENTREQUEST_0_ITEMAMT'] = $total;

					
					$nvpStr = nvp($nvp);

					//echo '
'.print_r($nvp,true).'
'; $resp = PPHttpPost($method, $nvpStr, $cred, $env); //echo '
'.print_r($httpParsedResponseAr,true).'
'; if (isset($resp["ACK"]) && $resp["ACK"] == 'Success') { //store some vals and redirect //echo '
'.print_r($resp,true).'
'; $token = urldecode($resp["TOKEN"]); add_option('paypal_' . $token, array("total" => $total, "items" => $item, "paid" => false, "email" => $_REQUEST["packagePurchaseEmail"], "name" => $_REQUEST["packagePurchaseName"])); if ("sandbox" === $env || "beta-sandbox" === $env) { $payPalURL = "https://www.$env.paypal.com/webscr&cmd=_express-checkout&token=$token"; } else { $payPalURL = "https://www.paypal.com/webscr&cmd=_express-checkout&token=$token"; } header("Location: $payPalURL"); exit; } else { $_SESSION["ticketingError"] = 'There was an error from PayPal
Error: ' . urldecode($resp["L_LONGMESSAGE0"]) . ''; } } else { $_SESSION["ticketingError"] = 'No items were found. Please go back and choose how many tickets you want'; } } } } function ticketCmp($a, $b) { if ($a->soldTime == $b->soldTime) { return 0; } return ($a->soldTime < $b->soldTime) ? -1 : 1; } } class arbitrarySort { public $sort; public function __construct($sort) { $this->sort = $sort; } public function cmp($a, $b) { if (is_numeric($a[$this->sort]) && is_numeric($b[$this->sort])) { if ($a[$this->sort] == $b[$this->sort]) { return 0; } return ($a[$this->sort] < $b[$this->sort]) ? -1 : 1; } else { return strcasecmp($a[$this->sort], $b[$this->sort]); } } } class ticketOption { public $displayName; public $displayType; public $options; public $required; public $value; public $optionId; function __construct($display = NULL, $displayType = NULL, $options = NULL, $required = true) { $this->displayName = $display; $this->displayType = $displayType; $this->options = $options; $this->required = $required; } public function displayForm() { ob_start(); switch ($this->displayType) { case "text": echo ''; break; case "checkbox": echo 'value ? "CHECKED" : "") . '>'; break; case "dropdown": echo ''; break; case "multidropdown": echo ''; break; } return ob_get_clean(); } public function displayValue() { echo $this->value; } public function display() { echo $this->displayName; } public function setOptionId($id) { $this->optionId = $id; } } class ticket { public $ticketName; public $ticketOptions; public $ticketId; public $final; public $soldTime; function __construct($ticketOptions = array()) { $this->ticketOptions = $ticketOptions; $this->final = false; } function __clone() { foreach ($this->ticketOptions as $k => $v) { $this->ticketOptions[$k] = clone $v; } } public function displayName() { return ($this->ticketName == '' ? 'Unnamed' : $this->ticketName); } public function displayFull() { echo '
'; echo '
' . ($this->ticketName == '' ? 'Unnamed' : $this->ticketName) . '
'; /* echo '
'; if(is_array($this->ticketOptions)) { foreach ($this->ticketOptions as $o) { echo '
'.$o->displayName.'
'; } } echo '
'; */ echo '
'; } public function displayForm() { echo '
'; echo '
Ticket Display Name 
'; echo '
'; //echo '

Ticket Options

'; if (is_array($this->ticketOptions)) { echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; foreach ($this->ticketOptions as $o) { echo ""; echo ''; echo ''; } echo ""; echo ""; echo ""; echo ""; echo "
New Ticket OptionsActions
' . $o->displayName . 'Delete
"; echo "
"; } echo '
'; } public function addOption($option) { $this->ticketOptions[$option->optionId] = $option; } public function delOption($optionId) { unset($this->ticketOptions[$optionId]); } public function setDisplayName($display) { $this->ticketName = $display; } public function setTicketId($id) { $this->ticketId = $id; } public function setSoldTime($timeStamp) { $this->soldTime = $timeStamp; } } class package { public $packageId; public $packageName; public $tickets; public $ticketQuantity; public $expireStart; public $expireEnd; public $price; public $packageQuantity; public $packageDescription; public $orderDetails; public $coupon; public $active; function __construct($tickets = array()) { $this->tickets = $tickets; $this->active = false; } public function displayForm() { echo '
'; echo '

'.$this->displayName().'

'; echo '
Package Display Name
'; echo '
Package Description
'; echo '
'; echo '

Included Tickets

'; if (is_array($this->tickets)) { echo '
    '; foreach ($this->tickets as $o) { echo '
  • '; echo $o->displayName() . ' X   '; echo 'Reset'; echo '
  • '; } echo '
'; } echo '

Package Expiration Dates

'; echo '
Start: End:
'; echo '
'; echo '

Package Cost

'; echo '
$
'; //echo '
'; echo '

Package Quantity

'; echo '
Quantity:

How many of this package to sell? Leave blank for no limit

'; echo '
'; } public function setActive($active) { if($active && $this->validatePackage()) { $this->active = true; } else { $this->active = false; } } public function validatePackage() { if(count($this->tickets) == 0) return false; return true; } public function setPackageId($id) { $this->packageId = $id; } public function setExpire($dates) { $this->expireStart = $dates["start"]; $this->expireEnd = $dates["end"]; } public function displayName() { return ($this->packageName == '' ? 'Unnamed' : $this->packageName); } public function setDisplayName($display) { $this->packageName = $display; } public function setPackageDescription($desc) { $this->packageDescription = $desc; } public function addTicket($ticket) { $this->tickets[$ticket->ticketId] = $ticket; } public function setTicketQuantity($num) { $this->ticketQuantity = $num; } public function setPackagePrice($price) { $this->price = $price; } public function setPackageQuantity($q) { $this->packageQuantity = $q; } public function delTicket($ticketId) { unset($this->tickets[$ticketId]); if(count($this->tickets) == 0) { $this->setActive(false); } } public function validDates() { if (current_time('timestamp') > strtotime($this->expireStart) && current_time('timestamp') < strtotime($this->expireEnd." +1 day")) { return true; } else { return false; } } public function setOrderDetails($p) { $this->orderDetails = $p; } public function setCoupon($coupon) { $this->coupon = $coupon; } } function check_email_address($email) { // First, we check that there's one @ symbol, and that the lengths are right if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) { // Email invalid because wrong number of characters in one section, or wrong number of @ symbols. return false; } // Split it into sections to make life easier $email_array = explode("@", $email); $local_array = explode(".", $email_array[0]); for ($i = 0; $i < sizeof($local_array); $i++) { if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) { return false; } } if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name $domain_array = explode(".", $email_array[1]); if (sizeof($domain_array) < 2) { return false; // Not enough parts to domain } for ($i = 0; $i < sizeof($domain_array); $i++) { if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) { return false; } } } return true; } ?>