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