Added contact.

\n"; $parameters = array($displayname, $id); } } else if (isset($_POST['update_contact'])) { list($name, $id, $args) = parse_parameters($parameters); $q = new ContactQuery; $contact = $q->findOneById($id); if ($contact) { $area = get_contact_area($contact); if ($area) $area_id = $area->getId(); if (update_contact($contact, $area_id) !== false) { echo "

Updated contact.

\n"; $parameters = array($contact->getDisplayname(), $contact->getId()); } } else { echo "

No such contact!

\n"; } } else if ($_POST['search_contact']) { header(sprintf("Location: http%s://%s/%s/search/%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($_POST['search_contact']))); exit; } else if ($_POST['show_in_area']) { $q = new AreaQuery; $area = $q->findOneById($_POST['area_id']); header(sprintf("Location: http%s://%s/%s/in/area/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($area->getName()), $_POST['area_id'])); exit; } else if ($_POST['show_in_city']) { $q = new CityQuery; $city = $q->findOneById($_POST['city_id']); header(sprintf("Location: http%s://%s/%s/in/city/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($city->getName()), $_POST['city_id'])); exit; } function show_contact_summary(&$contact, $editing = false) { if ($editing) echo "

Contact: " . htmlspecialchars($contact->getDisplayname()) . ""; else echo "
\nContact " . $contact->getStrongLink(); $role = $contact->getRole(); $role_string = get_contact_role_string($contact); if ($role_string) echo " $role_string"; $d = urlencode($contact->getDisplayname()); $i = $contact->getId(); if ($role & $GLOBALS['ROLE_DONOR']) echo " " . get_small_link("Donations", "/donation/from/contact/%s/%d", $d, $i); if ($role & $GLOBALS['ROLE_REQUESTER']) echo " " . get_small_link("Referred", "/order/from/referrer/%s/%d", $d, $i); if ($role & $GLOBALS['ROLE_BENEFICIARY']) { echo " " . get_small_link("Orders", "/order/to/beneficiary/%s/%d", $d, $contact->getId()); if (get_contact_area($contact)) echo " " . get_small_link("Place", "/order/place/for/beneficiary/%s/%d", $d, $i); } if (check_admin(1)) { echo " " . $contact->getDeleteLink(); } $area = get_contact_area($contact); echo " in " . $area->getLink(); $city = get_contact_city($contact); echo ", " . $city->getLink(get_city_displayname($city)); } function show_contacts($offset, $per_page, $address_ids) { $q = new ContactQuery; $contacts = $q->filterByAddressId($address_ids)->orderByForename()->orderBySurname()->find(); if (count($contacts)) { foreach ($contacts as $contact) show_contact_summary($contact); } else echo " none"; } function search_contacts($offset, $per_page, $search) { $q = new ContactQuery; $contacts = $q->filterByDisplayname("%$search%")->find(); echo "

Contacts matching '" . htmlspecialchars($search) . "':"; if (count($contacts)) { foreach ($contacts as $contact) show_contact_summary($contact); } else echo "none"; echo "

\n"; $address_ids = array(); $q = new AddressQuery; $addresses = $q->filterByLine("%$search%")->find(); foreach ($addresses as $address) $address_ids[] = $address->getId(); $q = new AddressQuery; $addresses = $q->filterByPostcode("%$search%")->find(); foreach ($addresses as $address) $address_ids[] = $address->getId(); $q = new ContactQuery; $contacts = $q->filterByAddressId($address_ids)->find(); echo "

Contacts in address '" . htmlspecialchars($search) . "':"; if (count($contacts)) { foreach ($contacts as $contact) show_contact_summary($contact); } else echo "none"; echo "

\n"; } function show_city_contacts($offset, $per_page, $city_name, $city_id = null) { if (isset($city_id)) $city = get_city_by_id($city_id); else if ($city_name) $city = get_city_by_name($city_name); if ($city) { $q = new AreaQuery; $areas = $q->filterByCityId($city->getId())->find(); $area_ids = array(); foreach ($areas as $area) $area_ids[] = $area->getId(); $q = new AddressQuery; $addresses = $q->filterByAreaId($area_ids)->find(); $address_ids = array(); foreach ($addresses as $address) $address_ids[] = $address->getId(); echo "

Contacts in city " . $city->getLink(get_city_displayname($city)) . ":"; return show_contacts($offset, $per_page, $address_ids); } else echo "

No such city!

\n"; } function show_area_contacts($offset, $per_page, $area_name, $area_id = null) { if (isset($area_id)) $area = get_area_by_id($area_id); else if ($area_name) $area = get_area_by_name($area_name); if ($area) { $q = new AddressQuery; $addresses = $q->filterByAreaId($area->getId())->find(); $address_ids = array(); foreach ($addresses as $address) $address_ids[] = $address->getId(); echo "

Contacts in area " . $area->getLink() . ":"; return show_contacts($offset, $per_page, $address_ids); } else echo "

No such area!

\n"; } function show_contact_areas_form($city_id = null) { $areas = get_city_areas($city_id); if (! count($areas)) { echo "

No areas!

\n"; return; } $candidates = array(); foreach ($areas as $area) { if (! count(get_area_contacts($area->getId()))) continue; $candidates[] = $area; } if (! count($candidates)) return; echo "

Show contacts in area\n"; echo "\n"; submit("show_in_area", "Show"); } function show_contact_cities_form($city_id = null) { $q = new CityQuery; $cities = $q->orderByName()->find(); if (! count($cities)) { echo "

No cities!

\n"; return; } $candidates = array(); foreach ($cities as $city) { if (! count(get_city_contacts($city->getId()))) continue; $candidates[] = $city; } if (! count($candidates)) return; echo "

Show contacts in city\n"; echo "\n"; submit("show_in_city", "Show"); } function show_contact_search_form() { echo "

Search for contacts:"; input("search_contact"); echo "\n"; } function show_contact_forms($city_id) { form("noprint standout"); show_contact_areas_form($city_id); show_contact_cities_form($city_id); show_contact_search_form(); end_form(); } function show_contact_role_form($role) { return show_role_form($role, $GLOBALS['contact_roles']); } function show_contact_form($contact = null, $new = false) { global $contact_roles, $parcel_sizes, $parcel_contents; if (! $contact) $contact = new Contact; else if ($contact->getRole() & ($GLOBALS['ROLE_BENEFICIARY'] | $GLOBALS['ROLE_REQUESTER'])) { $state_mask = $GLOBALS['STATE_ANY']; $state_mask &= ~$GLOBALS['STATE_DELIVERED']; $state_mask &= ~$GLOBALS['STATE_CANCELLED']; $orders = get_contact_orders($contact, $state_mask); if (count($orders)) { echo "\n"; echo " Outstanding orders:\n"; echo "\n"; echo "\n"; echo " \n"; foreach ($orders as $order) { echo " " . get_order_summary($order) . "
\n"; } echo " \n"; echo "\n"; } } /* Role. */ echo "\n"; echo " Role\n"; echo " "; show_contact_role_form($contact->getRole()); echo "\n"; echo "\n"; /* Date added. */ if (! $new) { echo "\n"; echo " Registered\n"; echo " " . $contact->getAdded() . "\n"; echo "\n"; } /* Forename. */ echo "\n"; echo " Forename\n"; echo " "; input("forename", $contact->getForename()); echo "\n"; echo "\n"; /* Middle names. */ echo "\n"; echo " Middle name(s)\n"; echo " "; input("middle", $contact->getMiddle()); echo "\n"; echo "\n"; /* Surname. */ echo "\n"; echo " Surname\n"; echo " "; input("surname", $contact->getSurname()); echo "\n"; echo "\n"; /* Display name. */ echo "\n"; echo " Display name (if not concatenation of above)\n"; echo " "; input("displayname", $contact->getDisplayname()); echo "\n"; echo "\n"; /* Address. */ $address = get_contact_address($contact); if (! $address) $address = new Address; echo "\n"; echo " Address\n"; echo " "; textarea("address", $address->getLine()); echo "\n"; echo "\n"; /* Postcode. */ echo "\n"; echo " Postcode\n"; $postcode = $address->getPostcode(); if (validate_postcode($postcode)) { echo " "; input("postcode", $postcode); echo get_address_map_link($address); echo "\n"; } else { echo " "; input("postcode", $address->getPostcode()); echo " (invalid)\n"; } echo "\n"; /* Telephone. */ echo "\n"; echo " Telephone\n"; echo " "; input("telephone1", $contact->getTelephone1()); echo "\n"; echo "\n"; echo "\n"; echo " Alternative telephone\n"; echo " "; input("telephone2", $contact->getTelephone2()); echo "\n"; echo "\n"; /* Email. */ echo "\n"; echo " Email\n"; echo " "; input("email", $contact->getEmail()); echo "\n"; echo "\n"; /* Area. */ $area = get_contact_area($contact); if ($area) $area_id = $area->getId(); echo "\n"; echo " Area\n"; echo " \n"; echo "\n"; /* Parcel type. */ echo "\n"; echo " Family unit\n"; echo " \n"; echo "\n"; /* Parcel contents. */ echo "\n"; echo " Dietary requirements\n"; echo " "; for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) { if (1 << $i == $GLOBALS['PARCEL_TOILETRY']) continue; echo " getParcel() & (1 << $i)) echo " checked"; echo ">\n"; } echo "\n"; echo "\n"; /* Notes. */ echo "\n"; echo " Notes\n"; echo " "; textarea("notes", $contact->getNotes()); echo "\n"; echo "\n"; } function show_new_contact_form($city_id = null) { if (! check_admin(1)) return; $areas = get_city_areas($city_id); if (! count($areas)) { echo "

No areas!

\n"; return; } form("noprint"); echo "

Add a new contact:

\n"; echo "\n"; show_contact_form($contact, true); echo "\n"; echo " \n"; echo "\n"; echo "
"; submit("add_contact", "Add"); echo "
\n"; end_form(); } function show_add_new_contact_form() { if (! check_admin(1)) return; $q = new CityQuery; $cities = $q->find(); if (! count($cities)) { echo "

No cities!

\n"; return; } form("noprint standout"); echo "

Add a new contact in "; submit("show_add_contact", "Proceed"); echo "

\n"; end_form(); } function update_contact(&$contact, $area_id, $new = false) { global $contact_roles, $parcel_sizes, $parcel_contents; $role = 0; for ($i = 0; $i < count($contact_roles); $i++) { if ($_POST['role_' . $i] == "on") $role |= (1 << $i); } /* Staff can place orders. */ if ($role & (1 << 0)) $role |= (1 << 2); $forename = $_POST['forename']; $middle = $_POST['middle']; $surname = $_POST['surname']; $displayname = $_POST['displayname']; if (! $forename && ! $surname) { echo "

Must have either a forename or surname!

\n"; return false; } if ($middle && ! ($forename && $surname)) { echo "

Must have both a forename or surname for middle name(s) to make sense!

\n"; return false; } if (! $displayname) { $displayname = $forename; if ($middle) $displayname .= " $middle"; if ($forename) $displayname .= " "; $displayname .= $surname; echo "

Display name will be $displayname.

\n"; } /* Get address. */ $area_id = $_POST['area_id']; $line = $_POST['address']; $postcode = trim($_POST['postcode']); if ($postcode) { $postcode = format_postcode($_POST['postcode'], true); if (! $postcode) return false; } $q = new AddressQuery; /* XXX: Finding by area properly? */ $address = $q->filterByAreaId($area_id)->filterByLine($line)->filterByPostcode($postcode)->findOneOrCreate(); if ($address->isNew()) { /* Changing address. */ //if (! $new) /* XXX: Check for other contacts at the old address. Make this a new address if there are others, but provide a link to update other contacts. */ try { $address->save(); } catch (Exception $e) { echo "

Error adding $line.

\n"; return false; } } $telephone1 = $_POST['telephone1']; $telephone2 = $_POST['telephone2']; $email = $_POST['email']; $parcel = $_POST['parcel_size']; for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) { if ($_POST['parcel_' . $i] == "on") $parcel |= (1 << $i); } $notes = $_POST['notes']; $contact->setRole($role); $contact->setForename($forename); $contact->setMiddle($middle); $contact->setSurname($surname); $contact->setDisplayname($displayname); $contact->setTelephone1($telephone1); $contact->setTelephone2($telephone2); $contact->setEmail($email); $contact->setParcel($parcel); $contact->setNotes($notes); $contact->setAddressId($address->getId()); try { $contact->save(); } catch (Exception $e) { if ($new) echo "

Error adding $displayname.

\n"; else echo "

Error updating $displayname.

\n"; return false; } return true; } function add_contact(&$name) { if (! check_admin(1, "add a contact")) return; $area_id = $_POST['area_id']; if (! is_numeric($area_id)) { echo "

Invalid area!

\n"; return false; } $area = get_area_by_id($area_id); if (! $area) { echo "

No such area!

\n"; return false; } $contact = new Contact; if (! update_contact($contact, $area_id, true)) return false; $name = $contact->getDisplayname(); return $contact->getId(); } function confirm_delete_contact($name, $id = null, &$city_id = null) { if (! check_admin(1, "delete a contact")) return; if (isset($id)) $contact = get_contact_by_id($id); else $contact = get_contact_by_name($name); if (! $contact) return false; echo "

Confirm deletion

\n"; echo "

You must confirm deletion of contact " . $contact->getDisplayname() . ": " . $contact->getDeleteLink(true) . "

\n"; } function delete_contact($name, $id = null, &$city_id = null) { if (! check_admin(1, "delete a contact")) return; if (isset($id)) $contact = get_contact_by_id($id); else $contact = get_contact_by_name($name); if (! $contact) return false; ///* Remember city ID for dropdown. */ //$city_id = $area->getCityId(); try { $contact->delete(); echo "

Deleted contact.

\n"; } catch (Exception $e) { echo "

Error deleting $name!

\n"; return false; } return true; } function show_contact($name, &$id = null) { if (isset($id)) $contact = get_contact_by_id($id); else $contact = get_contact_by_name($name); if (! $contact) return; form(); show_contact_summary($contact, true); echo ": "; echo "\n

"; echo "\n"; show_contact_form($contact); if (check_admin(1)) { echo "\n"; echo " \n"; echo "\n"; } echo "
"; submit("update_contact", "Update"); echo "
\n"; end_form(); } /* /contact/in/area/Cambridge/1 */ if (count($parameters)) { if ($parameters[0] == "in") { switch ($parameters[1]) { case "area": $area_id = $parameters[3]; $_POST['area_id'] = $area_id; $q = new AreaQuery; $area = $q->findOneById($area_id); $city = get_area_city($area); if ($city) $city_id = $city->getId(); show_area_contacts(0, 10, $parameters[2], $area_id); break; case "city": $city_id = $parameters[3]; $_POST['city_id'] = $city_id; $q = new CityQuery; $city = $q->findOneById($city_id); show_city_contacts(0, 10, $parameters[2], $city_id); break; } } else if ($parameters[0] == "search") { search_contacts(0, 10, urldecode($parameters[1])); } } list($name, $id, $args) = parse_parameters($parameters); //echo "

$name($id) " . print_r($args, true) . "

\n"; if (count($args)) { switch ($args[0]) { case "delete": confirm_delete_contact($name, $id); break; case "confirmdelete": delete_contact($name, $id); break; } } else if (isset($name)) show_contact($name, $id); show_contact_forms($city_id); show_add_new_contact_form($city_id); ?>