Added contact offers. master 2023-04-01
authorIain Patterson <me@iain.cx>
Sat, 1 Apr 2023 10:09:27 +0000 (06:09 -0400)
committerIain Patterson <me@iain.cx>
Sat, 1 Apr 2023 10:09:27 +0000 (06:09 -0400)
lib/constants.php
lib/contact.php
lib/functions.php
propel/schema.xml

index 83d93e5..3891c1f 100644 (file)
   $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;
 ?>
index e9c7f4b..13456c8 100644 (file)
   }
 
   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'])) {
     echo "  <td>Notes</td>\n";
     echo "  <td>"; textarea("notes", $contact->getNotes()); echo "</td>\n";
     echo "</tr>\n";
+
+    /* Offers. */
+    $available_offers = get_available_offers($contact);
+    if (count($available_offers)) {
+      echo "<tr>\n";
+      echo "  <td colspan=2><strong>Offers</strong></td>\n";
+      echo "</tr>\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 "<tr>\n";
+        echo "  <td>" . $offer->getDescription() . "</td>\n";
+        echo "  <td><select name=\"offer$offer_id\">\n";
+        for ($i = 0; $i < count($offers); $i++) {
+          option("offer$offer_id", 1 << $i, $offers[$i], $state_id == 1 << $i);
+        }
+        echo "</select></td>\n";
+        echo "</tr>\n";
+      }
+      hidden("offer_states", urlencode(json_encode($offer_states)));
+    }
+    else {
+      echo "<tr>\n";
+      echo "  <td colspan=2><strong>No available offers</strong></td>\n";
+      echo "</tr>\n";
+      hidden("offer_states", "{}");
+    }
   }
 
   function show_new_contact_form($city_id = null) {
       return false;
     }
 
+    if ($_POST['offer_states']) {
+      try {
+        $offer_states = json_decode(urldecode($_POST['offer_states']));
+      }
+      catch (Exception $e) {
+        echo "<p>Error getting offer states JSON.</p>\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 "<p>Error updating offer.</p>\n";
+          echo "<p>" . $e->getMessage() . "</p>\n";
+          return false;
+        }
+      }
+    }
+
     return true;
   }
 
index eda4153..985c02b 100644 (file)
     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);
index e0c3aff..2d6a609 100644 (file)
     <column name="data" type="longvarchar" required="true"/>
     <column name="timestamp" type="integer" required="true"/>
   </table>
+
+  <!-- Offer -->
+  <table name="Offer" phpName="Offer" baseClass="ReadifoodObject">
+    <vendor type="mysql">
+      <parameter name="Engine" value="InnoDB"/>
+      <parameter name="Charset" value="utf8"/>
+    </vendor>
+    <column name="id" type="integer" primaryKey="true" required="true" autoIncrement="true"/>
+    <column name="description" type="varchar" size="256" required="true"/>
+    <column name="valid_from" type="date"/>
+    <column name="valid_to" type="date"/>
+  </table>
+
+  <!-- Offer state -->
+  <table name="OfferState" phpName="OfferState" baseClass="ReadifoodObject">
+    <vendor type="mysql">
+      <parameter name="Engine" value="InnoDB"/>
+      <parameter name="Charset" value="utf8"/>
+    </vendor>
+    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
+    <column name="updated" type="timestamp" required="true"/>
+    <column name="offer_id" type="integer" required="true"/>
+    <column name="user_id" type="integer" required="true"/>
+    <column name="contact_id" type="integer" required="true"/>
+    <column name="state" type="integer" required="true"/>
+    <foreign-key foreignTable="Offer" phpName="Offer" refPhpName="OfferState">
+      <reference local="offer_id" foreign="id"/>
+    </foreign-key>
+    <foreign-key foreignTable="User" phpName="User" refPhpName="OfferState">
+      <reference local="user_id" foreign="contact_id"/>
+    </foreign-key>
+    <foreign-key foreignTable="Contact" phpName="Contact" refPhpName="OfferState">
+      <reference local="contact_id" foreign="id"/>
+    </foreign-key>
+  </table>
 </database>