Correctly filter city or area.
[readifood.git] / lib / donation.php
1 <?php
2
3   if (isset($_POST['show_add_donation'])) {
4     $area_id = $_POST['area_id'];
5     show_new_donation_form($area_id);
6   }
7   else if (isset($_POST['add_donation'])) {
8     $id = add_donation();
9     if ($id !== false) {
10       echo "<p>Donation recorded.</p>\n";
11       $parameters = array("id", $id);
12     }
13   }
14   else if (isset($_POST['update_donation'])) {
15     list($ignored, $id, $args) = parse_parameters($parameters);
16     $q = new DonationQuery;
17     $donation = $q->findOneById($id);
18     if ($donation) {
19       if (update_donation($donation) !== false) {
20         echo "<p>Updated donation.</p>\n";
21         $parameters = array("id", $donation->getId());
22       }
23     }
24     else {
25       echo "<p>No such contact!</p>\n";
26     }
27   }
28   else if ($_POST['show_in_area']) {
29     $q = new AreaQuery;
30     $area = $q->findOneById($_POST['area_id']);
31     /* XXX: Function to build URL because we need to set a class in links. */
32     header(sprintf("Location: http%s://%s/%s/in/area/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($area->getName()), $_POST['area_id']));
33     exit;
34   }
35   else if ($_POST['show_in_city']) {
36     $q = new CityQuery;
37     $city = $q->findOneById($_POST['city_id']);
38     header(sprintf("Location: http%s://%s/%s/in/city/%s/%d", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, urlencode($city->getName()), $_POST['city_id']));
39     exit;
40   }
41
42   function show_donations($offset, $per_page, $contact_ids = null, $hub_ids = null) {
43     $q = new DonationQuery;
44     if (isset($contact_ids)) $q->filterByContactId($contact_ids);
45     if (isset($hub_ids)) $q->filterByHubId($hub_ids);
46     $donations = $q->find();
47     if (count($donations)) {
48       foreach ($donations as $donation) {
49         echo "<br>\nDonation " . $donation->getStrongLink($donation->getId()) . ": " . get_donation_displayname($donation);
50
51         /* XXX: Should pull from query. */
52         $q = new ContactQuery;
53         $contact = $q->findOneById($donation->getContactId());
54         if ($contact) echo " from " . $contact->getLink();
55
56         $q = new HubQuery;
57         $hub = $q->findOneById($donation->getHubId());
58         if ($hub) {
59           echo " to " . $hub->getLink();
60           $area = get_hub_area($hub);
61           if ($area) {
62             echo " in " . $area->getLink();
63             $city = get_area_city($area);
64             if ($city) echo ", " . $city->getLink(get_city_displayname($city));
65           }
66         }
67         if (check_admin(1)) {
68           echo " " . $donation->getDeleteLink();
69         }
70       }
71     }
72     else echo " none";
73   }
74
75   function show_city_donations($offset, $per_page, $city_name, $city_id = null) {
76     if (isset($city_id)) $city = get_city_by_id($city_id);
77     else if ($city_name) $city = get_city_by_name($city_name);
78     if ($city) {
79       $hubs = get_city_hubs($city->getId());
80       $hub_ids = array();
81       foreach ($hubs as $hub) $hub_ids[] = $hub->getId();
82
83       echo "<p>Donations in city " . $city->getLink(get_city_displayname($city)) . ":";
84       return show_donations($offset, $per_page, null, $hub_ids);
85     }
86     else echo "<p>No such city!</p>\n";
87   }
88
89   function show_contact_donations($offset, $per_page, $contact_name, $contact_id = 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>Donations from contact " . $contact->getLink() . ":";
94       return show_donations($offset, $per_page, $contact->getId());
95     }
96     else echo "<p>No such contact!</p>\n";
97   }
98
99   function show_hub_donations($offset, $per_page, $hub_name, $hub_id = null) {
100     if (isset($hub_id)) $hub = get_hub_by_id($hub_id);
101     else if ($hub_name) $hub = get_hub_by_name($hub_name);
102     if ($hub) {
103       echo "<p>Donations to hub " . $hub->getLink() . ":";
104       return show_donations($offset, $per_page, null, $hub->getId());
105     }
106     else echo "<p>No such hub!</p>\n";
107   }
108
109   function show_area_donations($offset, $per_page, $area_name, $area_id = null) {
110     if (isset($area_id)) $area = get_area_by_id($area_id);
111     else if ($area_name) $area = get_area_by_name($area_name);
112     if ($area) {
113       $hubs = get_area_hubs($area->getId());
114       $hub_ids = array();
115       foreach ($hubs as $hub) $hub_ids[] = $hub->getId();
116
117       echo "<p>Donations in area " . $area->getLink() . ":";
118       return show_donations($offset, $per_page, null, $hub_ids);
119     }
120     else echo "<p>No such area!</p>\n";
121   }
122
123   function show_donation_areas_form($city_id = null) {
124     $areas = get_city_areas($city_id);
125     if (! count($areas)) {
126       echo "<p>No <a href=\"/area\">areas</a>!</p>\n";
127       return;
128     }
129
130     form("noprint standout");
131     $candidates = array();
132     foreach ($areas as $area) {
133       if (! count(get_area_hubs($area->getId()))) continue;
134       $candidates[] = $area;
135     }
136     if (! count($candidates)) return;
137
138     echo "<p>Show donations in area\n";
139     echo "<select name=\"area_id\">\n";
140     foreach ($candidates as $area) {
141       option("area_id", $area->getId(), get_area_displayname($area));
142     }
143     echo "</select>\n";
144     submit("show_in_area", "Show");
145   }
146
147   function show_donation_cities_form($city_id = null) {
148     $q = new CityQuery;
149     $cities = $q->orderByName()->find();
150
151     if (! count($cities)) {
152       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
153       return;
154     }
155
156     $candidates = array();
157     foreach ($cities as $city) {
158       if (! count(get_city_hubs($city->getId()))) continue;
159       $candidates[] = $city;
160     }
161     if (! count($candidates)) return;
162
163     echo "<p>Show donations in city\n";
164     echo "<select name=\"city_id\">\n";
165     foreach ($candidates as $city) {
166       option("city_id", $city->getId(), get_city_displayname($city), $city_id);
167     }
168     echo "</select>\n";
169     submit("show_in_city", "Show");
170   }
171
172   function show_donation_forms($city_id) {
173     form("noprint standout");
174     show_donation_areas_form($city_id);
175     show_donation_cities_form($city_id);
176     end_form();
177   }
178
179   function show_donation_form($donation = null, $area_id = null) {
180     if (! $donation) $donation = new Donation;
181
182     /* Date. */
183     echo "<tr>\n";
184     echo "  <td>Date</td>\n";
185     echo "  <td>"; show_date_form("date", $donation->getDate()); echo "</td>\n";
186     echo "</tr>\n";
187
188     /* Contact. */
189     echo "<tr>\n";
190     echo "  <td>Donor</td>\n";
191     echo "  <td><select name=\"contact_id\">\n";
192     $contacts = get_area_donors();
193     foreach ($contacts as $contact) {
194       option("contact_id", $contact->getId(), $contact->getDisplayname(), $donation->getContactId());
195     }
196     echo "</select></td>\n";
197     echo "</tr>\n";
198
199     /* Hub. */
200     echo "<tr>\n";
201     echo "  <td>Hub</td>\n";
202     echo "  <td><select name=\"hub_id\">\n";
203     $hubs = get_area_hubs();
204     foreach ($hubs as $hub) {
205       option("hub_id", $hub->getId(), $hub->getDisplayname(), $donation->getHubId());
206     }
207     echo "</select></td>\n";
208     echo "</tr>\n";
209
210     /* Quantity. */
211     echo "<tr>\n";
212     echo "  <td>Quantity (kg)</td>\n";
213     echo "  <td>"; input("quantity", sprintf("%0.2f", $donation->getQuantity() / 1000)); echo "</td>\n";
214     echo "</tr>\n";
215   }
216
217   function show_new_donation_form($area_id = null) {
218     if (! check_admin(1)) return;
219
220     $area = get_area_by_id($area_id);
221     if (! count($area)) {
222       echo "<p>No such <a href=\"/area\">area</a>!</p>\n";
223       return;
224     }
225
226     form();
227     echo "<p>Record a donation:</p>\n";
228
229     echo "<table>\n";
230     show_donation_form(null, $area_id);
231
232     echo "<tr>\n";
233     echo "  <td colspan=2>"; submit("add_donation", "Record"); echo "</td></tr>\n";
234     echo "</tr>\n";
235     echo "</table>\n";
236     end_form();
237   }
238
239   function show_add_new_donation_form() {
240     if (! check_admin(1)) return;
241
242     /* We intentionally hide areas with no hubs. */
243     $areas = get_city_areas_with_hubs();
244     if (! count($areas)) {
245       echo "<p>Can't record any donations until at least one <a href=\"/area\">area</a> has a <a href=\"/hub\">hub</a>!</p>\n";
246       return;
247     }
248
249     form("noprint standout");
250     echo "<p>Record a donation in <select name=\"area_id\">\n";
251     foreach ($areas as $area) {
252       option("area_id", $area->getId(), get_area_displayname($area));
253     }
254     echo "</select>";
255     submit("show_add_donation", "Proceed");
256     echo "</p>\n";
257     end_form();
258   }
259
260   function update_donation(&$donation, $new = false) {
261     #$date = ymd_to_iso8601("date");
262     $date = $_POST['date'];
263     $contact_id = $_POST['contact_id'];
264     $hub_id = $_POST['hub_id'];
265     $quantity = $_POST['quantity'];
266
267     if (! $date) $date = time();
268     /* XXX: check date */
269
270     $contact = get_contact_by_id($contact_id);
271     if (! $contact) {
272       echo "<p>Invalid contact!</p>\n";
273       return false;
274     }
275
276     $hub = get_hub_by_id($hub_id);
277     if (! $hub) {
278       echo "<p>Invalid hub!</p>\n";
279       return false;
280     }
281
282     if (! is_numeric($quantity)) {
283       echo "<p>Invalid quantity!</p>\n";
284       return false;
285     }
286
287     $donation->setDate($date);
288     $donation->setContactId($contact_id);
289     $donation->setHubId($hub_id);
290     $donation->setQuantity($quantity * 1000);
291
292     try {
293       $donation->save();
294     }
295     catch (Exception $e) {
296       if ($new) echo "<p>Error recording donation.</p>\n";
297       else echo "<p>Error updating donation.</p>\n";
298       return false;
299     }
300
301     return true;
302   }
303
304   function add_donation() {
305     if (! check_admin(1, "record a donation")) return;
306
307     $donation = new Donation;
308     if (! update_donation($donation, true)) return false;
309     return $donation->getId();
310   }
311
312   function confirm_delete_donation($id = null) {
313     if (! check_admin(1, "delete a donation")) return;
314
315     if (isset($id)) $donation = get_donation_by_id($id);
316     if (! $donation) return false;
317
318     echo "<h3>Confirm deletion</h3>\n";
319     echo "<p>You must confirm deletion of donation $id: " . $donation->getDeleteLink(true) . "</p>\n";
320   }
321
322   function delete_donation($id = null) {
323     if (! check_admin(1, "delete a donation")) return;
324
325     if (isset($id)) $donation = get_donation_by_id($id);
326     if (! $donation) return false;
327
328     try {
329       $donation->delete();
330       echo "<p>Deleted donation.</p>\n";
331     }
332     catch (Exception $e) {
333       echo "<p>Error deleting donation $id!</p>\n";
334       return false;
335     }
336
337     return true;
338   }
339
340   function show_donation(&$id = null) {
341     if (isset($id)) $donation = get_donation_by_id($id);
342     if (! $donation) return;
343
344     form();
345     echo "<p>Donation <span class=\"strong\">" . $donation->getId() . "</span>";
346     if (check_admin(1)) {
347       echo " " . $donation->getDeleteLink();
348     }
349     echo ": ";
350     echo "\n</p>";
351
352     echo "<table>\n";
353     show_donation_form($donation);
354
355     if (check_admin(1)) {
356       echo "<tr>\n";
357       echo "  <td colspan=2>";
358       submit("update_donation", "Update");
359       echo "</td>\n";
360       echo "</tr>\n";
361     }
362
363     echo "</table>\n";
364     end_form();
365   }
366
367   if (count($parameters)) {
368     if ($parameters[0] == "in") {
369       /* /donation/in/area/Romsey+Town/1 */
370       switch ($parameters[1]) {
371         case "area":
372           $area_id = $parameters[3];
373           $_POST['area_id'] = $area_id;
374           $q = new AreaQuery;
375           $area = $q->findOneById($area_id);
376           $city = get_area_city($area);
377           if ($city) $city_id = $city->getId();
378           show_area_donations(0, 10, $parameters[2], $area_id);
379         break;
380
381         case "city":
382           $city_id = $parameters[3];
383           $_POST['city_id'] = $city_id;
384           $q = new CityQuery;
385           $city = $q->findOneById($city_id);
386           show_city_donations(0, 10, $parameters[2], $city_id);
387         break;
388       }
389     }
390     else if ($parameters[0] == "from") {
391       /* /donation/from/contact/Iain+Patterson/4 */
392       switch ($parameters[1]) {
393         case "contact":
394           $contact_id = $parameters[3];
395           $q = new ContactQuery;
396           $contact = $q->findOneById($contact_id);
397           show_contact_donations(0, 10, $parameters[2], $contact_id);
398         break;
399       }
400     }
401     else if ($parameters[0] == "to") {
402       /* /donation/to/hub/Cambridge+Community+Church/1 */
403       switch ($parameters[1]) {
404         case "hub":
405           $hub_id = $parameters[3];
406           $q = new HubQuery;
407           $hub = $q->findOneById($hub_id);
408           show_hub_donations(0, 10, $parameters[2], $hub_id);
409         break;
410       }
411     }
412   }
413   list($ignored, $id, $args) = parse_parameters($parameters);
414   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
415   if (count($args)) {
416     switch ($args[0]) {
417       case "delete":
418         confirm_delete_donation($id);
419       break;
420
421       case "confirmdelete":
422         delete_donation($id);
423       break;
424     }
425   }
426   else if (isset($id)) show_donation($id);
427
428   show_donation_forms($city_id);
429   show_add_new_donation_form($city_id);
430
431 ?>