From: Iain Patterson Date: Sat, 1 Apr 2023 10:09:27 +0000 (-0400) Subject: Added contact offers. X-Git-Tag: live-2023-04-01^0 X-Git-Url: http://git.iain.cx/?a=commitdiff_plain;h=fe8f24e12a968b97f20a339f0d3d688eb2e52dad;p=readifood.git Added contact offers. --- diff --git a/lib/constants.php b/lib/constants.php index 83d93e5..3891c1f 100644 --- a/lib/constants.php +++ b/lib/constants.php @@ -44,4 +44,13 @@ $PARCEL_BABY12 = 1 << 7; $PARCEL_TOILETRY = 1 << 8; + /* Offers. */ + $offers = array("eligible", "contacted", "approved", "fulfilled", "closed"); + $all_offers = (1 << count($offers)) - 1; + $OFFER_ELIGIBLE = 1 << 0; + $OFFER_CONTACTED = 1 << 1; + $OFFER_APPROVED = 1 << 2; + $OFFER_DELIVERED = 1 << 3; + $OFFER_COMPLETED = 1 << 4; + $OFFER_ANY = $all_offers; ?> diff --git a/lib/contact.php b/lib/contact.php index e9c7f4b..13456c8 100644 --- a/lib/contact.php +++ b/lib/contact.php @@ -230,7 +230,7 @@ } function show_contact_form($contact = null, $new = false) { - global $contact_roles, $parcel_sizes, $parcel_contents; + global $contact_roles, $parcel_sizes, $parcel_contents, $offers; if (! $contact) $contact = new Contact; else if ($contact->getRole() & ($GLOBALS['ROLE_BENEFICIARY'] | $GLOBALS['ROLE_REQUESTER'])) { @@ -371,6 +371,37 @@ echo " Notes\n"; echo " "; textarea("notes", $contact->getNotes()); echo "\n"; echo "\n"; + + /* Offers. */ + $available_offers = get_available_offers($contact); + if (count($available_offers)) { + echo "\n"; + echo " Offers\n"; + echo "\n"; + + $offer_states = Array(); + foreach ($available_offers as $offer) { + $offer_id = $offer->getId(); + $state = get_offer_state($contact, $offer); + $state_id = is_null($state) ? $GLOBALS['OFFER_ELIGIBLE'] : $state->getState(); + $offer_states[$offer_id] = $state_id; + echo "\n"; + echo " " . $offer->getDescription() . "\n"; + echo " \n"; + echo "\n"; + } + hidden("offer_states", urlencode(json_encode($offer_states))); + } + else { + echo "\n"; + echo " No available offers\n"; + echo "\n"; + hidden("offer_states", "{}"); + } } function show_new_contact_form($city_id = null) { @@ -507,6 +538,39 @@ return false; } + if ($_POST['offer_states']) { + try { + $offer_states = json_decode(urldecode($_POST['offer_states'])); + } + catch (Exception $e) { + echo "

Error getting offer states JSON.

\n"; + return false; + } + + $now = time(); + foreach ($offer_states as $offer_id => $state_id) { + $new_state_id = strval($_POST["offer$offer_id"]); + if ($new_state_id == "") continue; + if ($new_state_id == strval($state_id)) continue; + + $offer_state = new OfferState; + $offer_state->setUpdated($now); + $offer_state->setOfferId($offer_id); + $offer_state->setUserId($GLOBALS['user_id']); + $offer_state->setContactId($contact->getId()); + $offer_state->setState($new_state_id); + + try { + $offer_state->save(); + } + catch (Exception $e) { + echo "

Error updating offer.

\n"; + echo "

" . $e->getMessage() . "

\n"; + return false; + } + } + } + return true; } diff --git a/lib/functions.php b/lib/functions.php index 7f937dd..f69e5e6 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -252,6 +252,27 @@ return $q->orderByDate()->find(); } + function get_available_offers($contact = null) { + $q = new OfferQuery; + $q->where("(valid_from is null or valid_from<=now())"); + $q->where("(valid_to is null or valid_to>now())"); + if (! is_null($contact)) { + $qq = new OfferStateQuery; + $qq->filterByContactId($contact->getId()); + $ids = Array(); + foreach ($qq->find() as $state) $ids[] = $state->getOfferId(); + if (count($ids)) $q->_or()->filterById($ids); + } + return $q->orderById()->find(); + } + + function get_offer_state($contact, $offer) { + $q = new OfferStateQuery; + $q->filterByOfferId($offer->getId()); + $q->filterByContactId($contact->getId()); + return $q->orderByUpdated('desc')->findOne(); + } + function get_user_by_contact_id($id, $verbose = true) { $q = new UserQuery; $user = $q->findOneByContactId($id); diff --git a/propel/schema.xml b/propel/schema.xml index 3ab248b..9f3f55b 100644 --- a/propel/schema.xml +++ b/propel/schema.xml @@ -167,4 +167,39 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +