3 if (isset($_POST['show_add_order'])) {
4 $area_id = $_POST['area_id'];
5 show_new_order_form($area_id);
7 else if (isset($_POST['add_order'])) {
10 echo "<p>Order placed.</p>\n";
11 $parameters = array("id", $id);
14 else if (isset($_POST['update_order'])) {
15 list($ignored, $id, $args) = parse_parameters($parameters);
17 $order = $q->findOneById($id);
19 if (update_order($order) !== false) {
20 echo "<p>Updated order.</p>\n";
21 $parameters = array("id", $order->getId());
25 echo "<p>No such contact!</p>\n";
28 else if ($_POST['show_in_area']) {
30 $area = $q->findOneById($_POST['area_id']);
31 header(sprintf("Location: http%s://%s/%s/in/area/%s/%d%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($area->getName()), $_POST['area_id'], get_order_state_uri(get_order_state_mask())));
34 else if ($_POST['show_in_city']) {
36 $city = $q->findOneById($_POST['city_id']);
37 header(sprintf("Location: http%s://%s/%s/in/city/%s/%d%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($city->getName()), $_POST['city_id'], get_order_state_uri(get_order_state_mask())));
41 function show_orders($offset, $per_page, $requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
42 /* XXX: Use Propel methods. */
43 if (isset($state_mask)) $order_ids = get_order_ids_by_state($state_mask);
45 if (isset($requester_ids)) $q->filterByRequesterId($requester_ids);
46 if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
48 #if (isset($state_mask)) $q->useOrderStateQuery()->addSelectQuery($latest_state, 'latestState')->where("order_id=latestState.order_id")->where("state & $state_mask")->endUse();
49 if (isset($state_mask)) $q->filterById($order_ids);
50 $orders = $q->orderByDate()->find();
52 foreach ($orders as $order) {
53 echo "<br>\nOrder " . $order->getStrongLink($order->getId()) . ": " . get_order_displayname($order);
55 echo " " . $order->getDeleteLink();
58 /* XXX: Should pull from query. */
59 $q = new ContactQuery;
60 $contact = $q->findOneById($order->getBeneficiaryId());
62 echo " for " . $contact->getLink();
63 $area = get_contact_area($contact);
64 if ($area) echo " in " . $area->getLink();
67 if ($order->getHubId()) {
69 $hub = $q->findOneById($order->getHubId());
70 if ($hub) echo " to hub " . $hub->getLink();
71 $area = get_hub_area($hub);
72 if ($area) echo " in " . $area->getLink();
79 function show_city_orders($offset, $per_page, $city_name, $city_id = null, $state_mask = null) {
80 if (isset($city_id)) $city = get_city_by_id($city_id);
81 else if ($city_name) $city = get_city_by_name($city_name);
83 $contacts = get_city_contacts($city->getId(), $GLOBALS['ROLE_BENEFICIARY']);
84 $beneficiary_ids = array();
85 foreach ($contacts as $contact) $beneficiary_ids[] = $contact->getId();
87 echo "<p>Orders in city " . $city->getLink(get_city_displayname($city)) . ":";
88 return show_orders($offset, $per_page, null, $beneficiary_ids, $state_mask);
90 else echo "<p>No such city!</p>\n";
93 function show_requester_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
94 if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
95 else if ($contact_name) $contact = get_contact_by_name($contact_name);
97 echo "<p>Orders from referrer " . $contact->getLink() . ":";
98 return show_orders($offset, $per_page, $contact->getId(), null, $state_mask);
100 else echo "<p>No such contact!</p>\n";
103 function show_beneficiary_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
104 if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
105 else if ($contact_name) $contact = get_contact_by_name($contact_name);
107 echo "<p>Orders to beneficiary " . $contact->getLink() . ":";
108 return show_orders($offset, $per_page, null, $contact->getId(), $state_mask);
110 else echo "<p>No such contact!</p>\n";
113 function show_area_orders($offset, $per_page, $area_name, $area_id = null, $state_mask = null) {
114 if (isset($area_id)) $area = get_area_by_id($area_id);
115 else if ($area_name) $area = get_area_by_name($area_name);
117 $contacts = get_area_contacts($area->getId(), $GLOBALS['ROLE_BENEFICIARY']);
118 $contact_ids = array();
119 foreach ($contacts as $contact) $contact_ids[] = $contact->getId();
121 echo "<p>Orders in area " . $area->getLink() . ":";
122 return show_orders($offset, $per_page, null, $contact_ids, $state_mask);
124 else echo "<p>No such area!</p>\n";
127 function show_order_state_form($state_mask = null) {
128 global $states, $all_states;
130 if (is_null($state_mask)) $state_mask = $all_states;
132 echo "<p>Restrict to order states:\n";
133 for ($i = 0; $i < count($states); $i++) {
134 echo " <input type=\"checkbox\" name=\"state_$i\"";
135 if ($state_mask & (1 << $i)) echo " checked";
136 echo ">$states[$i]\n";
141 function get_order_state_mask($string = null) {
142 global $states, $all_states;
146 if (isset($string)) {
147 $selected = explode("+", $string);
148 for ($i = 0; $i < count($states); $i++) {
149 if (in_array($states[$i], $selected)) $mask |= (1 << $i);
153 for ($i = 0; $i < count($states); $i++) {
154 if ($_POST['state_' . $i] == "on") $mask |= (1 << $i);
158 if (! $mask) $mask = $all_states;
162 function get_order_state_string($mask) {
167 for ($i = 0; $i < count($states); $i++) {
168 if ($mask & (1 << $i)) $selected[] = $states[$i];
171 return implode("+", $selected);
174 function get_order_state_uri($mask) {
177 if (is_null($mask)) return "";
178 if ($mask == $all_states) return "";
180 return "/state/" . get_order_state_string($mask);
183 function show_order_areas_form($city_id = null) {
184 $areas = get_city_areas($city_id);
185 if (! count($areas)) {
186 echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
190 echo "<p>Show orders in area\n";
191 echo "<select name=\"area_id\">\n";
192 foreach ($areas as $area) {
193 option("area_id", $area->getId(), get_area_displayname($area));
196 echo "<input type=\"submit\" name=\"show_in_area\" value=\"Show\">\n";
199 function show_order_cities_form($city_id = null) {
201 $cities = $q->orderByName()->find();
203 if (! count($cities)) {
204 echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
208 echo "<p>Show orders in city\n";
209 echo "<select name=\"city_id\">\n";
210 foreach ($cities as $city) {
211 option("city_id", $city->getId(), get_city_displayname($city), $city_id);
214 echo "<input type=\"submit\" name=\"show_in_city\" value=\"Show\">\n";
217 function show_order_forms($city_id, $state_mask) {
218 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
219 show_order_state_form($state_mask);
220 show_order_areas_form($city_id);
221 show_order_cities_form($city_id);
225 function show_order_form($order = null, $area_id = null) {
226 global $states, $parcel_sizes, $parcel_contents;
229 $q = new OrderStateQuery;
230 $order_state = $q->filterByOrderId($order->getId())->orderByUpdated('desc')->limit(1)->findOne();
232 $state = $order_state->getState();
233 $driver_id = $order_state->getDriverId();
236 else $order = new Order;
241 echo " <td>Delivery</td>\n";
242 /* XXX: Find suitable dates from area. */
244 show_date_form("date", $order->getDate());
245 if (! $order->getDate()) {
246 echo " and recur for <select name=\"recurrence\">\n";
247 for ($i = 0; $i < 4; $i++) option("recurrence", $i, $i);
248 echo "</select> weeks";
255 echo " <td>Referrer</td>\n";
256 echo " <td><select name=\"requester_id\">\n";
257 option("requester_id", null, "");
258 $contacts = get_area_requesters();
259 foreach ($contacts as $contact) {
260 option("requester_id", $contact->getId(), $contact->getDisplayname(), $order->getRequesterId());
262 echo "</select></td>\n";
267 echo " <td>Beneficiary</td>\n";
268 echo " <td><select name=\"beneficiary_id\">\n";
269 option("beneficiary_id", null, "");
270 if (! $order->getId() && $order->getBeneficiaryId()) {
271 $contact = get_contact_by_id($order->getBeneficiaryId());
272 if ($contact) option("beneficiary_id", $order->getBeneficiaryId(), $contact->getDisplayname(), $order->getBeneficiaryId());
275 $contacts = get_area_beneficiaries($area_id);
276 foreach ($contacts as $contact) {
277 option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
280 echo "</select></td>\n";
285 echo " <td>Hub</td>\n";
286 echo " <td><select name=\"hub_id\">\n";
287 option("hub_id", null, "");
288 $hubs = get_area_hubs();
289 foreach ($hubs as $hub) {
290 option("hub_id", $hub->getId(), $hub->getDisplayname(), $order->getHubId());
292 echo "</select></td>\n";
297 echo " <td>Parcel size</td>\n";
298 echo " <td><select name=\"parcel_size\">\n";
299 $mask = 1 << count($parcel_sizes);
300 for ($i = 0; $i < count($parcel_sizes); $i++) {
301 option("parcel_size", 1 << $i, $parcel_sizes[$i], $order->getParcel() % $mask);
303 echo "</select></td>\n";
306 /* Parcel contents. */
308 echo " <td>Parcel contents</td>\n";
310 for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
311 echo " <input type=\"checkbox\" name=\"parcel_$i\"";
312 if ($order->getParcel() & (1 << $i)) echo " checked";
313 echo ">$parcel_contents[$i]\n";
320 echo " <td>Driver</td>\n";
321 $contacts = get_city_drivers();
322 if (count($contacts)) {
323 echo " <td><select name=\"driver_id\">\n";
324 option("driver_id", null, "");
325 foreach ($contacts as $contact) {
326 option("driver_id", $contact->getId(), $contact->getDisplayname(), $driver_id);
328 echo "</select></td>\n";
330 else echo " <td>No drivers!</td>\n";
334 if ($order->getId()) {
336 echo " <td>State</td>\n";
337 echo " <td><select name=\"state\">\n";
338 for ($i = 0; $i < count($states); $i++) {
339 option("state", $i << 1, ucfirst($states[$i]), $state);
341 echo "</select></td>\n";
346 function show_new_order_form($area_id = null) {
347 if (! check_admin(1)) return;
349 $area = get_area_by_id($area_id);
350 if (! count($area)) {
351 echo "<p>No such <a href=\"/area\">area</a>!</p>\n";
355 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
356 echo "<p>Place an order:</p>\n";
359 show_order_form(null, $area_id);
362 echo " <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
368 function show_contact_order_form($contact) {
369 if (! check_admin(1)) return;
371 $area = get_contact_area($contact);
373 echo "<p>No valid <a href=\"/area\">area</a> for contact!</p>\n";
378 $order->setBeneficiaryId($contact->getId());
380 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
381 echo "<p>Placing order for " . $contact->getStrongLink() . ".";
382 $parcel = $contact->getParcel();
384 echo " Suggested parcel type is <span class=\"strong\">" . get_contact_parcel_string($contact) . "</span>";
385 $order->setParcel($parcel);
390 show_order_form($order, $area_id);
393 echo " <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
399 function show_add_new_order_form() {
400 if (! check_admin(1)) return;
402 /* We intentionally hide areas with no contacts. */
403 $areas = get_city_areas_with_contacts(null, $GLOBALS['ROLE_BENEFICIARY']);
404 if (! count($areas)) {
405 echo "<p>Can't place any orders until at least one <a href=\"/area\">area</a> has a <a href=\"/contact\">contact</a>!</p>\n";
409 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
410 echo "<p>Place an order in <select name=\"area_id\">\n";
411 foreach ($areas as $area) {
412 option("area_id", $area->getId(), get_area_displayname($area));
415 submit("show_add_order", "Proceed");
420 function update_order(&$order, $new = false) {
421 global $user_id, $parcel_sizes, $parcel_contents;
423 #$date = ymd_to_iso8601("date");
424 $date = $_POST['date'];
425 $requester_id = $_POST['requester_id'];
426 $beneficiary_id = $_POST['beneficiary_id'];
427 $hub_id = $_POST['hub_id'];
428 $driver_id = $_POST['driver_id'];
429 if (! $driver_id) $driver_id = null;
430 $state = $_POST['state'];
431 if (! $state) $state = $GLOBALS['STATE_PLACED'];
432 $parcel = $_POST['parcel_size'];
433 for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
434 if ($_POST['parcel_' . $i] == "on") $parcel |= (1 << $i);
438 list($y, $m, $d) = explode('-', $date);
439 $then = mktime(0, 0, 0, $m, $d, $y);
442 /* XXX: check date */
444 $requester = get_contact_by_id($requester_id);
446 echo "<p>Invalid referrer!</p>\n";
450 $beneficiary = get_contact_by_id($beneficiary_id);
451 if (! $beneficiary) {
452 echo "<p>Invalid beneficiary!</p>\n";
457 $hub = get_hub_by_id($hub_id);
459 echo "<p>Invalid hub!</p>\n";
465 if ($new && isset($_POST['recurrence'])) $recurrence = $_POST['recurrence'];
466 if (! $recurrence) $recurrence = 0;
469 for ($i = 0; $i <= $recurrence; $i++) {
471 echo "<p>Creating recurrence $i.</p>\n";
475 $order->setDate($then + 7 * 86400 * $i);
476 $order->setRequesterId($requester_id);
477 $order->setBeneficiaryId($beneficiary_id);
478 $order->setHubId($hub_id);
479 $order->setParcel($parcel);
481 /* XXX: begin/commit */
485 $order_state = new OrderState;
486 $order_state->setUpdated($now);
487 $order_state->setOrderId($order->getId());
488 $order_state->setUserId($user_id);
489 $order_state->setDriverId($driver_id);
490 $order_state->setState($state);
492 $order_state->save();
494 catch (Exception $e) {
495 if ($new) echo "<p>Error placing order.</p>\n";
496 else echo "<p>Error updating order.</p>\n";
497 echo "<p>" . $e->getMessage() . "</p>\n";
505 function add_order() {
506 if (! check_admin(1, "place an order")) return;
509 if (! update_order($order, true)) return false;
510 return $order->getId();
513 function delete_order($id = null) {
514 if (! check_admin(1, "delete an order")) return;
516 if (isset($id)) $order = get_order_by_id($id);
517 if (! $order) return false;
520 $q = new OrderStateQuery;
521 $order_states = $q->filterByOrderId($id)->find();
522 foreach ($order_states as $order_state) $order_state->delete();
524 echo "<p>Deleted order.</p>\n";
526 catch (Exception $e) {
527 echo "<p>Error deleting order $id!</p>\n";
534 function show_order_history($id) {
537 $q = new OrderStateQuery();
538 $order_states = $q->filterByOrderId($id)->orderById()->find();
540 if (! count($order_states)) return;
542 echo "<h3>Order history</h3>\n";
543 foreach ($order_states as $order_state) {
544 $date = $order_state->getUpdated();
546 $user = get_contact_by_id($order_state->getUserId());
547 if ($user) $username = $user->getDisplayname();
548 else $username = "unknown user";
550 $driver_id = $order_state->getDriverId();
551 if ($driver_id) $driver = get_contact_by_id($driver_id);
555 $state = $order_state->getState();
556 for ($i = 0; $i < count($states); $i++) {
557 if ((1 << $i) == $state) {
558 $state = $states[$i];
562 #$state = $states[$order_state->getState()];
563 echo "<p><strong>$username</strong> changed order to state <strong>$state</strong>";
564 if ($driver) echo " for driver " . $driver->getDisplayname();
565 echo " on $date.</p>\n";
569 function show_order(&$id = null) {
570 if (isset($id)) $order = get_order_by_id($id);
571 if (! $order) return;
573 echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
574 echo "<p>Order: <span class=\"strong\">" . $order->getId() . "</span>";
575 if (check_admin(1)) {
576 echo " " . $order->getDeleteLink();
582 show_order_form($order);
584 if (check_admin(1)) {
586 echo " <td colspan=2>";
587 submit("update_order", "Update");
595 show_order_history($order->getId());
599 if (count($parameters)) {
600 for ($i = 1; $i < count($parameters); $i++) {
601 if ($parameters[$i] == "state") {
602 /* /order/state/placed+picked */
603 $state_mask = get_order_state_mask($parameters[$i + 1]);
607 if ($parameters[0] == "in") {
608 /* /order/in/area/Romsey+Town/1 */
609 switch ($parameters[1]) {
612 $area_id = $parameters[3];
613 $_POST['area_id'] = $area_id;
615 $area = $q->findOneById($area_id);
616 $city = get_area_city($area);
617 if ($city) $city_id = $city->getId();
618 show_area_orders(0, 10, $parameters[2], $area_id, $state_mask);
622 $city_id = $parameters[3];
623 $_POST['city_id'] = $city_id;
625 $city = $q->findOneById($city_id);
626 show_city_orders(0, 10, $parameters[2], $city_id, $state_mask);
630 else if ($parameters[0] == "from") {
631 /* /order/from/referrer/Iain+Patterson/4 */
632 switch ($parameters[1]) {
634 $contact_id = $parameters[3];
635 $q = new ContactQuery;
636 $contact = $q->findOneById($contact_id);
637 show_requester_orders(0, 10, $parameters[2], $contact_id, $state_mask);
641 else if ($parameters[0] == "to") {
642 /* /order/to/beneficiary/Cambridge+Community+Church/1 */
643 switch ($parameters[1]) {
645 $contact_id = $parameters[3];
646 $q = new ContactQuery;
647 $hub = $q->findOneById($contact_id);
648 show_beneficiary_orders(0, 10, $parameters[2], $contact_id, $state_mask);
652 else if ($parameters[0] == "place") {
653 if ($parameters[1] == "for") {
654 if ($parameters[2] == "beneficiary") {
655 if ($parameters[4]) $contact = get_contact_by_id($parameters[4]);
656 if (! $contact) $contact = get_contact_by_name(urldecode($parameters[3]));
657 if ($contact) show_contact_order_form($contact);
662 list($ignored, $id, $args) = parse_parameters($parameters);
663 //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
671 else if (isset($id)) show_order($id);
672 else if ($state_mask) show_orders(0, 10, null, null, $state_mask);
674 /* XXX: Shown after adding. */
675 show_order_forms($city_id, $state_mask);
676 show_add_new_order_form($city_id);
679 if (count($parameters)) {
680 show_order_forms($city_id, $state_mask);