diff --git a/benefits/core/migrations/0002_data.py b/benefits/core/migrations/0002_data.py
index e95b5c781..2b2b6def1 100644
--- a/benefits/core/migrations/0002_data.py
+++ b/benefits/core/migrations/0002_data.py
@@ -28,13 +28,25 @@ def load_data(app, *args, **kwargs):
sbmtd_senior_type = EligibilityType.objects.create(
name="senior", label="Senior Discount (SBMTD)", group_id=os.environ.get("SBMTD_SENIOR_GROUP_ID", "group4")
)
+ sbmtd_mobility_pass_type = EligibilityType.objects.create(
+ name="mobility_pass",
+ label="Mobility Pass Discount (SBMTD)",
+ group_id=os.environ.get("SBMTD_MOBILITY_PASS_GROUP_ID", "group5"),
+ )
PemData = app.get_model("core", "PemData")
- server_public_key = PemData.objects.create(
+ mst_server_public_key = PemData.objects.create(
label="Eligibility server public key",
remote_url=os.environ.get(
- "SERVER_PUBLIC_KEY_URL", "https://raw.githubusercontent.com/cal-itp/eligibility-server/dev/keys/server.pub"
+ "MST_SERVER_PUBLIC_KEY_URL", "https://raw.githubusercontent.com/cal-itp/eligibility-server/dev/keys/server.pub"
+ ),
+ )
+
+ sbmtd_server_public_key = PemData.objects.create(
+ label="Eligibility server public key",
+ remote_url=os.environ.get(
+ "SBMTD_SERVER_PUBLIC_KEY_URL", "https://raw.githubusercontent.com/cal-itp/eligibility-server/dev/keys/server.pub"
),
)
@@ -192,7 +204,7 @@ def load_data(app, *args, **kwargs):
api_auth_header=os.environ.get("COURTESY_CARD_VERIFIER_API_AUTH_HEADER", "X-Server-API-Key"),
api_auth_key=os.environ.get("COURTESY_CARD_VERIFIER_API_AUTH_KEY", "server-auth-token"),
eligibility_type=mst_courtesy_card_type,
- public_key=server_public_key,
+ public_key=mst_server_public_key,
jwe_cek_enc=os.environ.get("COURTESY_CARD_VERIFIER_JWE_CEK_ENC", "A256CBC-HS512"),
jwe_encryption_alg=os.environ.get("COURTESY_CARD_VERIFIER_JWE_ENCRYPTION_ALG", "RSA-OAEP"),
jws_signing_alg=os.environ.get("COURTESY_CARD_VERIFIER_JWS_SIGNING_ALG", "RS256"),
@@ -220,6 +232,23 @@ def load_data(app, *args, **kwargs):
start_template="eligibility/start--senior.html",
)
+ sbmtd_mobility_pass_verifier = EligibilityVerifier.objects.create(
+ name=os.environ.get("MOBILITY_PASS_VERIFIER_NAME", "Eligibility Server Verifier"),
+ active=os.environ.get("MOBILITY_PASS_VERIFIER_ACTIVE", "True").lower() == "true",
+ api_url=os.environ.get("MOBILITY_PASS_VERIFIER_API_URL", "http://server:8000/verify"),
+ api_auth_header=os.environ.get("MOBILITY_PASS_VERIFIER_API_AUTH_HEADER", "X-Server-API-Key"),
+ api_auth_key=os.environ.get("MOBILITY_PASS_VERIFIER_API_AUTH_KEY", "server-auth-token"),
+ eligibility_type=sbmtd_mobility_pass_type,
+ public_key=sbmtd_server_public_key,
+ jwe_cek_enc=os.environ.get("MOBILITY_PASS_VERIFIER_JWE_CEK_ENC", "A256CBC-HS512"),
+ jwe_encryption_alg=os.environ.get("MOBILITY_PASS_VERIFIER_JWE_ENCRYPTION_ALG", "RSA-OAEP"),
+ jws_signing_alg=os.environ.get("MOBILITY_PASS_VERIFIER_JWS_SIGNING_ALG", "RS256"),
+ auth_provider=None,
+ selection_label_template="eligibility/includes/selection-label--sbmtd-mobility-pass.html",
+ start_template="eligibility/start--sbmtd-mobility-pass.html",
+ form_class="benefits.eligibility.forms.SBMTDMobilityPass",
+ )
+
PaymentProcessor = app.get_model("core", "PaymentProcessor")
mst_payment_processor = PaymentProcessor.objects.create(
@@ -337,9 +366,10 @@ def load_data(app, *args, **kwargs):
index_template="core/index--sbmtd.html",
eligibility_index_template="eligibility/index--sbmtd.html",
enrollment_success_template="enrollment/success--sbmtd.html",
+ help_template="core/includes/help--sbmtd.html",
)
- sbmtd_agency.eligibility_types.set([sbmtd_senior_type])
- sbmtd_agency.eligibility_verifiers.set([sbmtd_senior_verifier])
+ sbmtd_agency.eligibility_types.set([sbmtd_senior_type, sbmtd_mobility_pass_type])
+ sbmtd_agency.eligibility_verifiers.set([sbmtd_senior_verifier, sbmtd_mobility_pass_verifier])
class Migration(migrations.Migration):
diff --git a/benefits/core/templates/core/includes/help--sbmtd.html b/benefits/core/templates/core/includes/help--sbmtd.html
new file mode 100644
index 000000000..d4f5c5a73
--- /dev/null
+++ b/benefits/core/templates/core/includes/help--sbmtd.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+
+
{% translate "What is a Mobility Pass?" %}
+
+ {% blocktranslate trimmed %}
+ The Santa Barbara Metropolitan Transit District issues Mobility Pass cards to eligible riders. This transit benefit may need to be renewed in the future based on the expiration date of the Mobility Pass. Learn more at the SBMTD Fares & Passes.
+ {% endblocktranslate %}
+
diff --git a/benefits/eligibility/forms.py b/benefits/eligibility/forms.py
index 02844377c..eb9264fb9 100644
--- a/benefits/eligibility/forms.py
+++ b/benefits/eligibility/forms.py
@@ -156,3 +156,26 @@ def __init__(self, *args, **kwargs):
*args,
**kwargs,
)
+
+
+class SBMTDMobilityPass(EligibilityVerificationForm):
+ """EligibilityVerification form for the SBMTD Mobility Pass."""
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(
+ title=_("Agency card information"),
+ headline=_("Let’s see if we can confirm your eligibility."),
+ blurb=_("Please input your Mobility Pass number and last name below to confirm your eligibility."),
+ name_label=_("Last name (as it appears on Mobility Pass)"),
+ name_placeholder="Garcia",
+ name_help_text=_("We use this to help confirm your Mobility Pass."),
+ sub_label=_("SBMTD Mobility Pass number"),
+ sub_help_text=_("This is a 4-digit number on the front and back of your card."),
+ sub_placeholder="1234",
+ name_max_length=255,
+ sub_input_mode="numeric",
+ sub_max_length=4,
+ sub_pattern=r"\d{4}",
+ *args,
+ **kwargs,
+ )
diff --git a/benefits/eligibility/templates/eligibility/includes/media-item--idcardcheck--start--sbmtd-mobility-pass.html b/benefits/eligibility/templates/eligibility/includes/media-item--idcardcheck--start--sbmtd-mobility-pass.html
new file mode 100644
index 000000000..50aa2ceba
--- /dev/null
+++ b/benefits/eligibility/templates/eligibility/includes/media-item--idcardcheck--start--sbmtd-mobility-pass.html
@@ -0,0 +1,15 @@
+{% extends "eligibility/includes/media-item--idcardcheck.html" %}
+
+{% load i18n %}
+
+{% block heading %}
+ {% translate "Your current Mobility Pass number" %}
+{% endblock heading %}
+
+{% block body %}
+
+
+ {% translate "You do not need to have your physical card, but you will need your four-digit Mobility Pass number on the back of the card." %}
+
+
+{% endblock body %}
diff --git a/benefits/eligibility/templates/eligibility/includes/selection-label--sbmtd-mobility-pass.html b/benefits/eligibility/templates/eligibility/includes/selection-label--sbmtd-mobility-pass.html
new file mode 100644
index 000000000..884348614
--- /dev/null
+++ b/benefits/eligibility/templates/eligibility/includes/selection-label--sbmtd-mobility-pass.html
@@ -0,0 +1,10 @@
+{% extends "eligibility/includes/selection-label.html" %}
+{% load i18n %}
+
+{% block label %}
+ {% translate "SBMTD Mobility Pass" %}
+{% endblock label %}
+
+{% block description %}
+ {% translate "This option is for people who have a current SBMTD Mobility Pass." %}
+{% endblock description %}
diff --git a/benefits/eligibility/templates/eligibility/start--sbmtd-mobility-pass.html b/benefits/eligibility/templates/eligibility/start--sbmtd-mobility-pass.html
new file mode 100644
index 000000000..ace24b397
--- /dev/null
+++ b/benefits/eligibility/templates/eligibility/start--sbmtd-mobility-pass.html
@@ -0,0 +1,25 @@
+{% extends "eligibility/start.html" %}
+{% load i18n %}
+
+{% block page-title %}
+ {% translate "Agency card overview" %}
+{% endblock page-title %}
+
+{% block headline %}
+
+
{% translate "You selected a Mobility Pass transit benefit." %}
+
+{% endblock headline %}
+
+{% block media-item %}
+ {% include "eligibility/includes/media-item--idcardcheck--start--sbmtd-mobility-pass.html" %}
+{% endblock media-item %}
+
+{% block call-to-action %}
+
+{% endblock call-to-action %}
diff --git a/benefits/locale/en/LC_MESSAGES/django.po b/benefits/locale/en/LC_MESSAGES/django.po
index e2bd8568c..31f5ae556 100644
--- a/benefits/locale/en/LC_MESSAGES/django.po
+++ b/benefits/locale/en/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: https://github.com/cal-itp/benefits/issues \n"
-"POT-Creation-Date: 2023-09-11 17:23+0000\n"
+"POT-Creation-Date: 2023-11-01 23:33+0000\n"
"Language: English\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -194,6 +194,17 @@ msgid ""
"target=\"_blank\" rel=\"noopener noreferrer\">MST Riders Guide."
msgstr ""
+msgid "What is a Mobility Pass?"
+msgstr ""
+
+msgid ""
+"The Santa Barbara Metropolitan Transit District issues Mobility Pass cards "
+"to eligible riders. This transit benefit may need to be renewed in the "
+"future based on the expiration date of the Mobility Pass. Learn more at the "
+"SBMTD Fares & Passes."
+msgstr ""
+
msgid "Sign out of Login.gov"
msgstr ""
@@ -291,6 +302,23 @@ msgstr ""
msgid "This is a 5-digit number on the front and back of your card."
msgstr ""
+msgid ""
+"Please input your Mobility Pass number and last name below to confirm your "
+"eligibility."
+msgstr ""
+
+msgid "Last name (as it appears on Mobility Pass)"
+msgstr ""
+
+msgid "We use this to help confirm your Mobility Pass."
+msgstr ""
+
+msgid "SBMTD Mobility Pass number"
+msgstr ""
+
+msgid "This is a 4-digit number on the front and back of your card."
+msgstr ""
+
msgid "Your contactless card details"
msgstr ""
@@ -309,6 +337,14 @@ msgid ""
"number. The number starts with a number sign (#) followed by five digits."
msgstr ""
+msgid "Your current Mobility Pass number"
+msgstr ""
+
+msgid ""
+"You do not need to have your physical card, but you will need your four-"
+"digit Mobility Pass number on the back of the card."
+msgstr ""
+
msgid "A Login.gov account with identity verification"
msgstr ""
@@ -335,21 +371,21 @@ msgstr ""
msgid "Go back"
msgstr ""
-msgid "Verify your identity with "
+msgid "Learn more about"
msgstr ""
msgctxt "image alt text"
msgid "Login.gov"
msgstr ""
+msgid "Verify your identity with "
+msgstr ""
+
msgid ""
"We use Login.gov to verify your identity to make sure you are eligible for "
"the transit benefit you selected."
msgstr ""
-msgid "Learn more about"
-msgstr ""
-
msgid "MST Courtesy Card"
msgstr ""
@@ -358,6 +394,12 @@ msgid ""
"eligibility card."
msgstr ""
+msgid "SBMTD Mobility Pass"
+msgstr ""
+
+msgid "This option is for people who have a current SBMTD Mobility Pass."
+msgstr ""
+
msgid "Older Adult"
msgstr ""
@@ -406,6 +448,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "You selected a Mobility Pass transit benefit."
+msgstr ""
+
msgid "Older Adult benefit overview"
msgstr ""
diff --git a/benefits/locale/es/LC_MESSAGES/django.po b/benefits/locale/es/LC_MESSAGES/django.po
index a36b72922..bc37adcae 100644
--- a/benefits/locale/es/LC_MESSAGES/django.po
+++ b/benefits/locale/es/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: https://github.com/cal-itp/benefits/issues \n"
-"POT-Creation-Date: 2023-09-11 17:23+0000\n"
+"POT-Creation-Date: 2023-11-01 23:37+0000\n"
"Language: Español\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -259,8 +259,24 @@ msgstr ""
"califican para una serie de programas de tarifas reducidas. Este beneficio "
"de tránsito debe renovarse en el futuro en función de la fecha de "
"vencimiento de la tarjeta de cortesía. Obtenga más información en el MST Riders Guide."
+"href='https://mst.org/riders-guide/how-to-ride/courtesy-card/' "
+"target=\"_blank\" rel=\"noopener noreferrer\">MST Riders Guide."
+
+msgid "What is a Mobility Pass?"
+msgstr "¿Qué es un Mobility Pass?"
+
+msgid ""
+"The Santa Barbara Metropolitan Transit District issues Mobility Pass cards "
+"to eligible riders. This transit benefit may need to be renewed in the "
+"future based on the expiration date of the Mobility Pass. Learn more at the "
+"SBMTD Fares & Passes."
+msgstr ""
+"Santa Barbara Metropolitan Transit District emite tarjetas Mobility Pass a "
+"pasajeros que califican. Este beneficio de tránsito debe renovarse en el "
+"futuro en función de la fecha de vencimiento del Mobility Pass. Obtenga más "
+"información en el SBMTD Fares & Passes."
msgid "Sign out of Login.gov"
msgstr "Cierre sesión de Login.gov"
@@ -374,6 +390,25 @@ msgstr "Número de tarjeta de cortesía de MST"
msgid "This is a 5-digit number on the front and back of your card."
msgstr "Este es un número de 5 dígitos en el anverso y reverso de su tarjeta."
+msgid ""
+"Please input your Mobility Pass number and last name below to confirm your "
+"eligibility."
+msgstr ""
+"Ingrese el número de cuatro dígitos de su Mobility Pass y su apellido a "
+"continuación para confirmar su elegibilidad."
+
+msgid "Last name (as it appears on Mobility Pass)"
+msgstr "Apellido (tal como aparece en la tarjeta de Mobility Pass)"
+
+msgid "We use this to help confirm your Mobility Pass."
+msgstr "Usamos esto para ayudar a confirmar su Mobility Pass."
+
+msgid "SBMTD Mobility Pass number"
+msgstr "Número de SBMTD Mobility Pass"
+
+msgid "This is a 4-digit number on the front and back of your card."
+msgstr "Este es un número de 4 dígitos en el reverso de su tarjeta."
+
msgid "Your contactless card details"
msgstr "Los datos de su tarjeta sin contacto"
@@ -396,6 +431,16 @@ msgstr ""
"No necesita tener su tarjeta física, pero necesitará saber el número. El "
"número comienza con un signo de número (#) seguido de cinco dígitos."
+msgid "Your current Mobility Pass number"
+msgstr "Su número actual de Mobility Pass"
+
+msgid ""
+"You do not need to have your physical card, but you will need your four-"
+"digit Mobility Pass number on the back of the card."
+msgstr ""
+"No necesita tener su tarjeta física, pero necesitará su número de cuatro "
+"dígitos de Mobility Pass en el reverso de la tarjeta."
+
msgid "A Login.gov account with identity verification"
msgstr "Una cuenta de Login.gov con verificación de identidad"
@@ -426,13 +471,16 @@ msgstr ""
msgid "Go back"
msgstr "Volver"
-msgid "Verify your identity with "
-msgstr "Verifique su identidad con "
+msgid "Learn more about"
+msgstr "Más información sobre"
msgctxt "image alt text"
msgid "Login.gov"
msgstr "Login.gov"
+msgid "Verify your identity with "
+msgstr "Verifique su identidad con "
+
msgid ""
"We use Login.gov to verify your identity to make sure you are eligible for "
"the transit benefit you selected."
@@ -440,9 +488,6 @@ msgstr ""
"Utilizamos Login.gov para verificar su identidad para asegurarnos de que "
"seas elegible para el beneficio de tránsito que seleccionaste."
-msgid "Learn more about"
-msgstr "Más información sobre"
-
msgid "MST Courtesy Card"
msgstr "Tarjeta de cortesía de MST"
@@ -453,6 +498,14 @@ msgstr ""
"Esta opción es para personas que cuentan actualmente con una tarjeta de "
"cortesía o una tarjeta de elegibilidad MST RIDES."
+msgid "SBMTD Mobility Pass"
+msgstr ""
+
+msgid "This option is for people who have a current SBMTD Mobility Pass."
+msgstr ""
+"Esta opción es para personas que cuentan actualmente con un Mobility Pass de "
+"SBMTD."
+
msgid "Older Adult"
msgstr "Adulto mayor"
@@ -510,6 +563,9 @@ msgstr "Ha seleccionado un beneficio de tránsito de tarjeta de cortesía."
msgid "Continue"
msgstr "Continuar"
+msgid "You selected a Mobility Pass transit benefit."
+msgstr "Ha seleccionado un beneficio de tránsito de Mobility Pass."
+
msgid "Older Adult benefit overview"
msgstr "Descripción de beneficios para adultos mayores"
diff --git a/terraform/app_service.tf b/terraform/app_service.tf
index c1d775640..6b7a4d6d2 100644
--- a/terraform/app_service.tf
+++ b/terraform/app_service.tf
@@ -87,9 +87,11 @@ resource "azurerm_linux_web_app" "main" {
"MST_COURTESY_CARD_GROUP_ID" = "${local.secret_prefix}mst-courtesy-card-group-id)"
"SACRT_SENIOR_GROUP_ID" = "${local.secret_prefix}sacrt-senior-group-id)"
"SBMTD_SENIOR_GROUP_ID" = "${local.secret_prefix}sbmtd-senior-group-id)",
+ "SBMTD_MOBILITY_PASS_GROUP_ID" = "${local.secret_prefix}sbmtd-mobility-pass-group-id)"
"CLIENT_PRIVATE_KEY" = "${local.secret_prefix}client-private-key)"
"CLIENT_PUBLIC_KEY" = "${local.secret_prefix}client-public-key)"
- "SERVER_PUBLIC_KEY_URL" = "${local.secret_prefix}server-public-key-url)"
+ "MST_SERVER_PUBLIC_KEY_URL" = "${local.secret_prefix}mst-server-public-key-url)"
+ "SBMTD_SERVER_PUBLIC_KEY_URL" = "${local.secret_prefix}sbmtd-server-public-key-url)"
"MST_PAYMENT_PROCESSOR_CLIENT_CERT" = "${local.secret_prefix}mst-payment-processor-client-cert)"
"MST_PAYMENT_PROCESSOR_CLIENT_CERT_PRIVATE_KEY" = "${local.secret_prefix}mst-payment-processor-client-cert-private-key)"
"MST_PAYMENT_PROCESSOR_CLIENT_CERT_ROOT_CA" = "${local.secret_prefix}mst-payment-processor-client-cert-root-ca)"