Fixed pagination of orders.
[readifood.git] / lib / order.php
1 <?php
2
3   if (isset($_POST['show_add_order'])) {
4     set_last_selected("area_id", $_POST['area_id']);
5     $area_id = $_POST['area_id'];
6     show_new_order_form($area_id);
7   }
8   else if (isset($_POST['add_order'])) {
9     set_last_selected("area_id", $_POST['area_id']);
10     $id = add_order();
11     if ($id !== false) {
12       echo "<p>Order placed.</p>\n";
13       $parameters = array("id", $id);
14     }
15   }
16   else if (isset($_POST['update_order'])) {
17     list($ignored, $id, $args) = parse_parameters($parameters);
18     $q = new OrderQuery;
19     $order = $q->findOneById($id);
20     if ($order) {
21       if (update_order($order) !== false) {
22         echo "<p>Updated order.</p>\n";
23         $parameters = array("id", $order->getId());
24       }
25     }
26     else {
27       echo "<p>No such contact!</p>\n";
28     }
29   }
30   else if ($_POST['show_in_area']) {
31     set_last_selected("area_id", $_POST['area_id']);
32     $q = new AreaQuery;
33     $area = $q->findOneById($_POST['area_id']);
34     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_query_uri(get_order_state_mask())));
35     exit;
36   }
37   else if ($_POST['show_in_city']) {
38     set_last_selected("city_id", $_POST['city_id']);
39     $q = new CityQuery;
40     $city = $q->findOneById($_POST['city_id']);
41     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_query_uri(get_order_state_mask())));
42     exit;
43   }
44
45   function show_orders($offset, $per_page, $requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
46     list($offset, $per_page) = pagination();
47     /* XXX: Use Propel methods. */
48     if (isset($state_mask)) $order_ids = get_order_ids_by_state($state_mask);
49     $q = new OrderQuery;
50     if (isset($requester_ids)) $q->filterByRequesterId($requester_ids);
51     if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
52     # XXX: Doesn't work.
53     #if (isset($state_mask)) $q->useOrderStateQuery()->addSelectQuery($latest_state, 'latestState')->where("order_id=latestState.order_id")->where("state & $state_mask")->endUse();
54     if (isset($state_mask)) $q->filterById($order_ids);
55     $orders = $q->orderByDate('desc')->orderById('desc')->paginate($offset, $per_page);
56     if (count($orders)) {
57       foreach ($orders as $order) {
58         echo "<br>\n" . get_order_summary($order) . "<br>\n";
59       }
60       show_pagination($orders);
61     }
62     else echo " none";
63   }
64
65   function show_city_orders($offset, $per_page, $city_name, $city_id = null, $state_mask = null) {
66     if (isset($city_id)) $city = get_city_by_id($city_id);
67     else if ($city_name) $city = get_city_by_name($city_name);
68     if ($city) {
69       $contacts = get_city_contacts($city->getId(), $GLOBALS['ROLE_BENEFICIARY']);
70       $beneficiary_ids = array();
71       foreach ($contacts as $contact) $beneficiary_ids[] = $contact->getId();
72
73       echo "<p>Orders in city " . $city->getLink(get_city_displayname($city)) . ":";
74       return show_orders($offset, $per_page, null, $beneficiary_ids, $state_mask);
75     }
76     else echo "<p>No such city!</p>\n";
77   }
78
79   function show_requester_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
80     if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
81     else if ($contact_name) $contact = get_contact_by_name($contact_name);
82     if ($contact) {
83       echo "<p>Orders from referrer " . $contact->getLink() . ":";
84       return show_orders($offset, $per_page, $contact->getId(), null, $state_mask);
85     }
86     else echo "<p>No such contact!</p>\n";
87   }
88
89   function show_beneficiary_orders($offset, $per_page, $contact_name, $contact_id = null, $state_mask = null) {
90     if (isset($contact_id)) $contact = get_contact_by_id($contact_id);
91     else if ($contact_name) $contact = get_contact_by_name($contact_name);
92     if ($contact) {
93       echo "<p>Orders to beneficiary " . $contact->getLink() . ":";
94       return show_orders($offset, $per_page, null, $contact->getId(), $state_mask);
95     }
96     else echo "<p>No such contact!</p>\n";
97   }
98
99   function show_area_orders($offset, $per_page, $area_name, $area_id = null, $state_mask = null) {
100     if (isset($area_id)) $area = get_area_by_id($area_id);
101     else if ($area_name) $area = get_area_by_name($area_name);
102     if ($area) {
103       $contacts = get_area_contacts($area->getId(), $GLOBALS['ROLE_BENEFICIARY']);
104       $contact_ids = array();
105       foreach ($contacts as $contact) $contact_ids[] = $contact->getId();
106
107       echo "<p>Orders in area " . $area->getLink() . ":";
108       return show_orders($offset, $per_page, null, $contact_ids, $state_mask);
109     }
110     else echo "<p>No such area!</p>\n";
111   }
112
113   function show_order_state_form($state_mask = null) {
114     global $states, $all_states;
115
116     if (is_null($state_mask)) $state_mask = $all_states;
117
118     echo "<p>Restrict to order states:\n";
119     for ($i = 0; $i < count($states); $i++) {
120       echo " <input type=\"checkbox\" id=\"state_$i\" name=\"state_$i\"";
121       if ($state_mask & (1 << $i)) echo " checked";
122       echo "><label for=\"state_$i\">$states[$i]</label>\n";
123     }
124     echo "</p>\n";
125   }
126
127   function get_order_state_mask($string = null) {
128     global $states, $all_states;
129
130     $mask = 0;
131
132     if (isset($string)) {
133       $selected = explode("+", $string);
134       for ($i = 0; $i < count($states); $i++) {
135         if (in_array($states[$i], $selected)) $mask |= (1 << $i);
136       }
137     }
138     else {
139       for ($i = 0; $i < count($states); $i++) {
140         if ($_POST['state_' . $i] == "on") $mask |= (1 << $i);
141       }
142     }
143
144     if (! $mask) $mask = $all_states;
145     return $mask;
146   }
147
148   function get_order_state_query_string($mask) {
149     global $states;
150
151     $selected = array();
152
153     for ($i = 0; $i < count($states); $i++) {
154       if ($mask & (1 << $i)) $selected[] = $states[$i];
155     }
156
157     return implode("+", $selected);
158   }
159
160   function get_order_state_query_uri($mask) {
161     global $all_states;
162
163     if (is_null($mask)) return "";
164     if ($mask == $all_states) return "";
165
166     return "/state/" . get_order_state_query_string($mask);
167   }
168
169   function show_order_areas_form($city_id = null) {
170     $areas = get_city_areas($city_id);
171     if (! count($areas)) {
172       echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
173       return;
174     }
175
176     $candidates = array();
177     foreach ($areas as $area) {
178       if (! count(get_area_contacts($area->getId()))) continue;
179       $candidates[] = $area;
180     }
181     if (! count($candidates)) return;
182
183     echo "<p>Show orders in area\n";
184     echo "<select name=\"area_id\">\n";
185     foreach ($candidates as $area) {
186       option("area_id", $area->getId(), get_area_displayname($area));
187     }
188     echo "</select>\n";
189     echo "<input type=\"submit\" name=\"show_in_area\" value=\"Show\">\n";
190   }
191
192   function show_order_cities_form($city_id = null) {
193     $q = new CityQuery;
194     $cities = $q->orderByName()->find();
195
196     if (! count($cities)) {
197       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
198       return;
199     }
200
201     $candidates = array();
202     foreach ($cities as $city) {
203       if (! count(get_city_contacts($city->getId()))) continue;
204       $candidates[] = $city;
205     }
206     if (! count($candidates)) return;
207
208     echo "<p>Show orders in city\n";
209     echo "<select name=\"city_id\">\n";
210     foreach ($candidates as $city) {
211       option("city_id", $city->getId(), get_city_displayname($city), $city_id);
212     }
213     echo "</select>\n";
214     echo "<input type=\"submit\" name=\"show_in_city\" value=\"Show\">\n";
215   }
216
217   function show_order_forms($city_id, $state_mask) {
218     form("noprint standout");
219     show_order_state_form($state_mask);
220     show_order_areas_form($city_id);
221     show_order_cities_form($city_id);
222     end_form();
223   }
224
225   function show_order_form($order = null, $area_id = null) {
226     global $states, $parcel_sizes, $parcel_contents;
227
228     if ($order) {
229       $order_state = get_order_state($order);
230       if ($order_state) {
231         $state = $order_state->getState();
232         $driver_id = $order_state->getDriverId();
233       }
234     }
235     else $order = new Order;
236
237     /* Date. */
238     echo "<tr>\n";
239     echo "  <td>Delivery</td>\n";
240     /* XXX: Find suitable dates from area. */
241     echo "  <td>";
242     show_date_form("date", $order->getDate());
243     if (! $order->getDate()) {
244       echo " and recur for <select name=\"recurrence\">\n";
245       for ($i = 0; $i < 4; $i++) option("recurrence", $i, $i);
246       echo "</select> weeks";
247     }
248     echo "</td>\n";
249     echo "</tr>\n";
250
251     /* Referrer. */
252     echo "<tr>\n";
253     echo "  <td>Referrer</td>\n";
254     echo "  <td><select name=\"requester_id\">\n";
255     option("requester_id", null, "");
256     $contacts = get_area_requesters();
257     foreach ($contacts as $contact) {
258       option("requester_id", $contact->getId(), $contact->getDisplayname(), $order->getRequesterId());
259     }
260     echo "</select>";
261     $contact = get_contact_by_id($order->getRequesterId(), false);
262     if ($contact) echo " " . get_small_link($contact->getDisplayname(), $contact->getURL());
263     echo "</td>\n";
264     echo "</tr>\n";
265
266     /* Beneficiary. */
267     echo "<tr>\n";
268     echo "  <td>Beneficiary</td>\n";
269     echo "  <td><select name=\"beneficiary_id\">\n";
270     option("beneficiary_id", null, "");
271     if (! $order->getId() && $order->getBeneficiaryId()) {
272       $contact = get_contact_by_id($order->getBeneficiaryId());
273       if ($contact) option("beneficiary_id", $order->getBeneficiaryId(), $contact->getDisplayname(), $order->getBeneficiaryId());
274     }
275     else {
276       $contacts = get_area_beneficiaries($area_id);
277       foreach ($contacts as $contact) {
278         option("beneficiary_id", $contact->getId(), $contact->getDisplayname(), $order->getBeneficiaryId());
279       }
280     }
281     echo "</select>";
282     $contact = get_contact_by_id($order->getBeneficiaryId(), false);
283     if ($contact) echo " " . get_small_link($contact->getDisplayname(), $contact->getURL());
284     echo "</td>\n";
285     echo "</tr>\n";
286
287     /* Hub. */
288     echo "<tr>\n";
289     echo "  <td>Hub</td>\n";
290     echo "  <td><select name=\"hub_id\">\n";
291     option("hub_id", null, "");
292     $hubs = get_area_hubs();
293     foreach ($hubs as $hub) {
294       option("hub_id", $hub->getId(), $hub->getDisplayname(), $order->getHubId());
295     }
296     echo "</select>";
297     $hub = get_hub_by_id($order->getHubId(), false);
298     if ($hub) echo " " . get_small_link($hub->getDisplayname(), $hub->getURL());
299     echo "</td>\n";
300     echo "</tr>\n";
301
302     /* Parcel type. */
303     echo "<tr>\n";
304     echo "  <td>Parcel size</td>\n";
305     echo "  <td><select name=\"parcel_size\">\n";
306     $mask = 1 << count($parcel_sizes);
307     for ($i = 0; $i < count($parcel_sizes); $i++) {
308       option("parcel_size", 1 << $i, $parcel_sizes[$i], $order->getParcel() % $mask);
309     }
310     echo "</select></td>\n";
311     echo "</tr>\n";
312
313     /* Parcel contents. */
314     echo "<tr>\n";
315     echo "  <td>Parcel contents</td>\n";
316     echo "  <td>";
317     for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
318       echo "  <input type=\"checkbox\" id=\"parcel_$i\" name=\"parcel_$i\"";
319       if ($order->getParcel() & (1 << $i)) echo " checked";
320       echo "><label for=\"parcel_$i\">$parcel_contents[$i]</label>\n";
321     }
322     echo "</td>\n";
323     echo "</tr>\n";
324
325     /* Notes. */
326     echo "<tr>\n";
327     echo "  <td>Notes</td>\n";
328     echo "  <td>"; textarea("notes", $order->getNotes()); echo "</td>\n";
329     echo "</tr>\n";
330
331     /* Driver. */
332     echo "<tr>\n";
333     echo "  <td>Driver</td>\n";
334     $contacts = get_city_drivers();
335     if (count($contacts)) {
336       echo "  <td><select name=\"driver_id\">\n";
337       option("driver_id", null, "");
338       foreach ($contacts as $contact) {
339         option("driver_id", $contact->getId(), $contact->getDisplayname(), $driver_id);
340       }
341       echo "</select>";
342       $contact = get_contact_by_id($driver_id, false);
343       if ($contact) echo " " . get_small_link($contact->getDisplayname(), $contact->getURL());
344       echo "</td>\n";
345     }
346     else echo "  <td>No drivers!</td>\n";
347     echo "</tr>\n";
348
349     /* State. */
350     if ($order->getId()) {
351       echo "<tr>\n";
352       echo "  <td>State</td>\n";
353       echo "  <td><select name=\"state\">\n";
354       for ($i = 0; $i < count($states); $i++) {
355         option("state", 1 << $i, ucfirst($states[$i]), $state);
356       }
357       echo "</select></td>\n";
358       echo "</tr>\n";
359     }
360   }
361
362   function show_new_order_form($area_id = null) {
363     if (! check_admin(1)) return;
364
365     $area = get_area_by_id($area_id);
366     if (! count($area)) {
367       echo "<p>No such <a href=\"/area\">area</a>!</p>\n";
368       return;
369     }
370
371     form("noprint");
372     echo "<p>Place an order:</p>\n";
373
374     echo "<table>\n";
375     show_order_form(null, $area_id);
376
377     echo "<tr>\n";
378     echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
379     echo "</tr>\n";
380     echo "</table>\n";
381     end_form();
382   }
383
384   function show_contact_order_form($contact) {
385     if (! check_admin(1)) return;
386
387     $area = get_contact_area($contact);
388     if (! $area) {
389       echo "<p>No valid <a href=\"/area\">area</a> for contact!</p>\n";
390       return;
391     }
392
393     $order = new Order;
394     $order->setBeneficiaryId($contact->getId());
395
396     form("standout");
397     echo "<p>Placing order for " . $contact->getStrongLink() . ".";
398     $parcel = $contact->getParcel();
399     if ($parcel) {
400       echo "  Suggested parcel type is <span class=\"strong\">" .  get_contact_parcel_string($contact) . "</span>";
401       $order->setParcel($parcel);
402     }
403     echo "</p>\n";
404
405     echo "<table>\n";
406     show_order_form($order, $area_id);
407
408     echo "<tr>\n";
409     echo "  <td colspan=2>"; submit("add_order", "Order"); echo "</td></tr>\n";
410     echo "</tr>\n";
411     echo "</table>\n";
412     end_form();
413   }
414
415   function show_add_new_order_form() {
416     if (! check_admin(1)) return;
417
418     /* We intentionally hide areas with no contacts. */
419     $areas = get_city_areas_with_contacts(null, $GLOBALS['ROLE_BENEFICIARY']);
420     if (! count($areas)) {
421       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";
422       return;
423     }
424
425     form("noprint standout");
426     echo "<p>Place an order in <select name=\"area_id\">\n";
427     foreach ($areas as $area) {
428       option("area_id", $area->getId(), get_area_displayname($area));
429     }
430     echo "</select>";
431     submit("show_add_order", "Proceed");
432     echo "</p>\n";
433     end_form();
434   }
435
436   function update_order(&$order, $new = false) {
437     global $user_id, $parcel_sizes, $parcel_contents;
438
439     #$date = ymd_to_iso8601("date");
440     $date = $_POST['date'];
441     $requester_id = $_POST['requester_id'];
442     $beneficiary_id = $_POST['beneficiary_id'];
443     $hub_id = $_POST['hub_id'];
444     $driver_id = $_POST['driver_id'];
445     if (! $driver_id) $driver_id = null;
446     $state = $_POST['state'];
447     if (! $state) $state = $GLOBALS['STATE_PLACED'];
448     $parcel = $_POST['parcel_size'];
449     for ($i = count($parcel_sizes); $i < count($parcel_contents); $i++) {
450       if ($_POST['parcel_' . $i] == "on") $parcel |= (1 << $i);
451     }
452     $notes = $_POST['notes'];
453
454     if ($date) {
455       list($y, $m, $d) = explode('-', $date);
456       $then = mktime(0, 0, 0, $m, $d, $y);
457     }
458     else $then = time();
459     /* XXX: check date */
460
461     $requester = get_contact_by_id($requester_id);
462     if (! $requester) {
463       echo "<p>Invalid referrer!</p>\n";
464       return false;
465     }
466
467     $beneficiary = get_contact_by_id($beneficiary_id);
468     if (! $beneficiary) {
469       echo "<p>Invalid beneficiary!</p>\n";
470       return false;
471     }
472
473     if ($hub_id) {
474       $hub = get_hub_by_id($hub_id);
475       if (! $hub) {
476         echo "<p>Invalid hub!</p>\n";
477         return false;
478       }
479     }
480     else $hub_id = null;
481
482     if ($new && isset($_POST['recurrence'])) $recurrence = $_POST['recurrence'];
483     if (! $recurrence) $recurrence = 0;
484
485     $now = time();
486     for ($i = 0; $i <= $recurrence; $i++) {
487       if ($i) {
488         echo "<p>Creating recurrence $i.</p>\n";
489         $order = new Order;
490       }
491
492       $order->setDate($then + 7 * 86400 * $i);
493       $order->setRequesterId($requester_id);
494       $order->setBeneficiaryId($beneficiary_id);
495       $order->setHubId($hub_id);
496       $order->setParcel($parcel);
497       $order->setNotes($notes);
498
499       /* XXX: begin/commit */
500       try {
501         $order->save();
502
503         $order_state = new OrderState;
504         $order_state->setUpdated($now);
505         $order_state->setOrderId($order->getId());
506         $order_state->setUserId($user_id);
507         $order_state->setDriverId($driver_id);
508         $order_state->setState($state);
509
510         $order_state->save();
511       }
512       catch (Exception $e) {
513         if ($new) echo "<p>Error placing order.</p>\n";
514         else echo "<p>Error updating order.</p>\n";
515         echo "<p>" . $e->getMessage() . "</p>\n";
516         return false;
517       }
518     }
519
520     return true;
521   }
522
523   function add_order() {
524     if (! check_admin(1, "place an order")) return;
525
526     $order = new Order;
527     if (! update_order($order, true)) return false;
528     return $order->getId();
529   }
530
531   function confirm_delete_order($id = null) {
532     if (! check_admin(1, "delete an order")) return;
533
534     if (isset($id)) $order = get_order_by_id($id);
535     if (! $order) return false;
536
537     echo "<h3>Confirm deletion</h3>\n";
538     echo "<p>You must confirm deletion of order $id: " . $order->getDeleteLink(true) . "</p>\n";
539   }
540
541   function delete_order($id = null) {
542     if (! check_admin(1, "delete an order")) return;
543
544     if (isset($id)) $order = get_order_by_id($id);
545     if (! $order) return false;
546
547     try {
548       $q = new OrderStateQuery;
549       $order_states = $q->filterByOrderId($id)->find();
550       foreach ($order_states as $order_state) $order_state->delete();
551       $order->delete();
552       echo "<p>Deleted order.</p>\n";
553     }
554     catch (Exception $e) {
555       echo "<p>Error deleting order $id!</p>\n";
556       return false;
557     }
558
559     return true;
560   }
561
562   function show_order_history($id) {
563     global $states;
564
565     $q = new OrderStateQuery();
566     $order_states = $q->filterByOrderId($id)->orderById()->find();
567
568     if (! count($order_states)) return;
569
570     echo "<h3>Order history</h3>\n";
571     echo "<p class=\"history\">\n";
572     foreach ($order_states as $order_state) {
573       $date = $order_state->getUpdated();
574
575       $user = get_contact_by_id($order_state->getUserId());
576       if ($user) $username = $user->getDisplayname();
577       else $username = "unknown user";
578
579       $driver_id = $order_state->getDriverId();
580       if ($driver_id) $driver = get_contact_by_id($driver_id);
581       else $driver = null;
582
583       echo "<strong>$username</strong> changed order to state <strong>" . get_order_state_string($order_state) . "</strong>";
584       if ($driver) echo " for driver " . $driver->getDisplayname();
585       echo " on $date.<br>\n";
586     }
587     echo "</p>\n";
588   }
589
590   function show_order(&$id = null) {
591     if (isset($id)) $order = get_order_by_id($id);
592     if (! $order) return;
593
594     form();
595     echo "<p>Order: <span class=\"strong\">" . $order->getId() . "</span>";
596     if (check_admin(1)) {
597       echo " " . $order->getDeleteLink();
598     }
599     echo ": ";
600     echo "\n</p>";
601
602     echo "<table>\n";
603     show_order_form($order);
604
605     if (check_admin(1)) {
606       echo "<tr>\n";
607       echo "  <td colspan=2>";
608       submit("update_order", "Update");
609       echo "</td>\n";
610       echo "</tr>\n";
611     }
612
613     echo "</table>\n";
614     end_form();
615
616     show_order_history($order->getId());
617   }
618
619   $state_mask = null;
620   if (count($parameters)) {
621     for ($i = 1; $i < count($parameters); $i++) {
622       if ($parameters[$i] == "state") {
623         /* /order/state/placed+picked */
624         $state_mask = get_order_state_mask($parameters[$i + 1]);
625       }
626     }
627
628     if ($parameters[0] == "in") {
629       /* /order/in/area/Romsey+Town/1 */
630       switch ($parameters[1]) {
631       case "area":
632         case "area":
633           $area_id = $parameters[3];
634           $_POST['area_id'] = $area_id;
635           $q = new AreaQuery;
636           $area = $q->findOneById($area_id);
637           $city = get_area_city($area);
638           if ($city) $city_id = $city->getId();
639           show_area_orders(0, 10, $parameters[2], $area_id, $state_mask);
640         break;
641
642         case "city":
643           $city_id = $parameters[3];
644           $_POST['city_id'] = $city_id;
645           $q = new CityQuery;
646           $city = $q->findOneById($city_id);
647           show_city_orders(0, 10, $parameters[2], $city_id, $state_mask);
648         break;
649       }
650     }
651     else if ($parameters[0] == "from") {
652       /* /order/from/referrer/Iain+Patterson/4 */
653       switch ($parameters[1]) {
654         case "referrer":
655           $contact_id = $parameters[3];
656           $q = new ContactQuery;
657           $contact = $q->findOneById($contact_id);
658           show_requester_orders(0, 10, $parameters[2], $contact_id, $state_mask);
659         break;
660       }
661     }
662     else if ($parameters[0] == "to") {
663       /* /order/to/beneficiary/Cambridge+Community+Church/1 */
664       switch ($parameters[1]) {
665         case "beneficiary":
666           $contact_id = $parameters[3];
667           $q = new ContactQuery;
668           $hub = $q->findOneById($contact_id);
669           show_beneficiary_orders(0, 10, $parameters[2], $contact_id, $state_mask);
670         break;
671       }
672     }
673     else if ($parameters[0] == "place") {
674       if ($parameters[1] == "for") {
675         if ($parameters[2] == "beneficiary") {
676           if ($parameters[4]) $contact = get_contact_by_id($parameters[4]);
677           if (! $contact) $contact = get_contact_by_name(urldecode($parameters[3]));
678           if ($contact) show_contact_order_form($contact);
679         }
680       }
681     }
682   }
683   list($ignored, $id, $args) = parse_parameters($parameters);
684   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
685   if (count($args)) {
686     switch ($args[0]) {
687       case "delete":
688         confirm_delete_order($id);
689       break;
690
691       case "confirmdelete":
692         delete_order($id);
693       break;
694     }
695   }
696   else if (isset($id)) show_order($id);
697   else if ($state_mask) show_orders(0, 10, null, null, $state_mask);
698
699   show_order_forms($city_id, $state_mask);
700   show_add_new_order_form($city_id);
701
702
703 ?>