# OC Prime - New Temp Permit Functionality

<p class="callout info">The Temporary Permit Rate Templates feature allows administrators to control pricing, eligibility, and special conditions for temporary parking permits on a per-lot basis. Its primary purpose is to define how temporary permit pricing is calculated using assignable templates with customizable hourly rates and priority layers. This article is intended for OPS-COM administrators.</p>

## Setup and Configuration

Before issuing temporary permits using the rate template engine, you must enable the feature on the target lot and assign your pricing templates.

### Enable Temp Permit Templates on a Lot

1. 1. Navigate to the **Parking Management** module, hover over **Lot Administration**, and click **Pricing &amp; Lot Admin**.
    2. Select the lot you wish to configure.
    3. <span data-path-to-node="6,2,0,0">Click the **Rate Template** tab and toggle on **Use New Booking Flow** (*Enable new temp permits for this lot*)</span><span class="" data-path-to-node="6,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,2,0,2">.</span>

<p class="callout info">This is where you build the "shape" of your pricing — painting different scenarios (peak hours, overnight, weekends) directly onto a calendar instead of configuring rules in the abstract.  
</p>

### Create and Configure Rate Templates

1. <span data-path-to-node="10,0,0,0">Navigate to the **Parking Management** module, hover over **Lot Administration**, and click **Rate Templates**</span><span class="" data-path-to-node="10,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,0,0,2">.</span>
2. <span data-path-to-node="10,1,0,0">Click the **+ Create New** button to open a blank template</span><span class="" data-path-to-node="10,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,1,0,2">.</span>
3. <span data-path-to-node="10,2,0,0">Enter a **Template Name** and optional **Description**</span><span class="" data-path-to-node="10,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,2,0,2">.</span>
4. <span data-path-to-node="10,3,0,0">In the **Brushes** section, click **+ Add Brush** to create brushes by setting a **Name**, **Price**, and **Colour**</span><span class="" data-path-to-node="10,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,3,0,2">.</span>
5. <span data-path-to-node="10,4,0,0">Select the **Brush** tool (or click **Select** next to a created brush) to paint pricing onto hourly sections of the day</span><span class="" data-path-to-node="10,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,4,0,2">.</span>
6. <span data-path-to-node="10,5,0,0">Click **Select** next to the **Eraser** brush to mark specific hourly slots as unbookable or to correct an error</span><span class="" data-path-to-node="10,5,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,5,0,2">.</span>
7. <span data-path-to-node="10,6,0,0">Hold shift and click multiple consecutive time slots in the grid, then click **Merge Selected Hours into Block** to open the **Merge into Block** window</span><span class="" data-path-to-node="10,6,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,6,0,2">:</span>
    
    
    - <span data-path-to-node="10,6,1,0,0,0">Enter the **Block Name**, **Flat Price for Entire Block ($)**, and choose a **Block Color**</span><span class="" data-path-to-node="10,6,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,6,1,0,0,2">.</span>
    - <span data-path-to-node="10,6,1,1,0,0">Modify the **Sale End (modify for Early Bird)** field if you want to set a cutoff time where the special rate stops being bookable</span><span class="" data-path-to-node="10,6,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,6,1,1,0,2">.</span>
    - <span data-path-to-node="10,6,1,2,0,0">Click **Merge** to save the block</span><span class="" data-path-to-node="10,6,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,6,1,2,0,2">.</span>
8. <span data-path-to-node="10,7,0,0">Edit existing brushes anytime by clicking the **Edit** button next to them</span><span class="" data-path-to-node="10,7,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,7,0,2">.</span>
9. <span data-path-to-node="10,8,0,0">Click **Update Template** to save your changes</span><span class="" data-path-to-node="10,8,0,1"><sup class="superscript"></sup></span><span data-path-to-node="10,8,0,2">.</span>

<p class="callout info">**Unpainted Time Slots:** Any hourly section left unpainted is treated as not bookable. Users cannot book a permit or park in the lot during that time.</p>

<p class="callout info"><span data-path-to-node="6,1,0">**Fixed Rate Blocks and Early Bird Pricing:** Merge time slots into a single block when you want to charge one flat price for a stretch of time, or when you want to reward early purchases with a discounted rate that disappears after a cutoff time (Early Bird pricing)</span><span data-path-to-node="6,1,1"><sup class="superscript"></sup></span><span data-path-to-node="6,1,2">. Once a cutoff time passes, the rate automatically reverts to whatever regular layer pricing applies to that time block</span><span data-path-to-node="6,1,3"><sup class="superscript"></sup></span><span data-path-to-node="6,1,4">. </span></p>

### Layers and Priority Calculation

<p class="callout info">Layers let you handle exceptions without rebuilding your whole pricing — e.g., a holiday rate that should always win, layered on top of your everyday template.</p>

<span data-path-to-node="17,0">Each template can contain multiple layers, and each layer is assigned a priority and schedule type</span><span class="" data-path-to-node="17,1"><sup class="superscript"></sup></span><span data-path-to-node="17,2">.</span>

- **Highest Priority Layer Wins (Full Day):** For any given day, the system identifies the highest-priority layer containing *any* painted blocks and uses **only** that layer for the entire day. Lower-priority layers are excluded completely—even if the higher-priority layer has unpainted hours (gaps are not filled by lower-priority layers).
- <span data-path-to-node="18,1,0,0">**Date Overrides Precedence:** A layer set to **Date Override** (e.g., a holiday or special event) is treated as the highest priority for that specific date and completely replaces the regular **Weekly Schedule** layers for that entire day</span><span class="" data-path-to-node="18,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="18,1,0,2">.</span>
- <span data-path-to-node="18,2,0,0">**Cross-Template Calculation:** If a user qualifies for multiple templates on the same lot, the system calculates the rate for each template independently and automatically applies the cheapest total price</span><span class="" data-path-to-node="18,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="18,2,0,2">. Layers from different templates are never combined</span><span class="" data-path-to-node="18,2,0,3"><sup class="superscript"></sup></span><span data-path-to-node="18,2,0,4">.</span>
- <span data-path-to-node="18,3,0,0">**Price Calculator:** Administrators can use the admin-only **Price Calculator** tool on the template page to simulate a stay and view the full rate breakdown</span><span class="" data-path-to-node="18,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="18,3,0,2">.</span>

### Adding Rate Layers &amp; Specific Date Pricing (Holidays/Events)

1. <span data-path-to-node="21,0,0,0">While editing a template, navigate to the **Rate Layers** section and click **+ Add Layer**</span><span class="" data-path-to-node="21,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,0,0,2">.</span>
2. <span data-path-to-node="21,1,0,0">Configure the layer settings in the **New Layer** window</span><span class="" data-path-to-node="21,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,1,0,2">:</span>
    
    
    - <span data-path-to-node="21,1,1,0,0,0">**Layer Name:** Enter a descriptive name (e.g., *Holiday Pricing*, *Special Event*)</span><span class="" data-path-to-node="21,1,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,1,1,0,0,2">.</span>
    - <span data-path-to-node="21,1,1,1,0,0">**Priority:** Select the layer priority. Higher-priority layers override lower-priority layers for the entire day</span><span class="" data-path-to-node="21,1,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,1,1,1,0,2">.</span>
    - <span data-path-to-node="21,1,1,2,0,0">**Layer Type:** Choose **Weekly Schedule** for regular recurring weekly pricing, or **Date Override** for specific calendar date overrides</span><span class="" data-path-to-node="21,1,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,1,1,2,0,2">.</span>
    - <span data-path-to-node="21,1,1,3,0,0">**Repeat annually:** *(Appears when Date Override is selected)* Check this box for recurring annual holidays and select the **Month &amp; Day**, or uncheck it for a one-time event date</span><span class="" data-path-to-node="21,1,1,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,1,1,3,0,2">.</span>
3. <span data-path-to-node="21,2,0,0">Click **Create Layer** to add it to the template</span><span class="" data-path-to-node="21,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,2,0,2">.</span>
4. <span data-path-to-node="21,3,0,0">Ensure the newly added layer is selected in the **Rate Layers** list, then use your brushes to paint the 24-hour grid for that layer</span><span class="" data-path-to-node="21,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,3,0,2">.</span>
5. <span data-path-to-node="21,4,0,0">Click **Update Template** to save all layer changes</span><span class="" data-path-to-node="21,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="21,4,0,2">.</span>

### Assigning Templates to a Lot

<p class="callout info">This is where you decide who can use a given template, and how many permits it can cover — useful for scenarios like staff-only rates or capacity-limited event pricing.</p>

1. <span data-path-to-node="24,0,0,0">Navigate to the **Parking Management** module, hover over **Lot Administration**, and click **Pricing &amp; Lot Admin**</span><span class="" data-path-to-node="24,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="24,0,0,2">.</span>
2. Select the lot you wish to configure and click the **Rate Template** tab.
3. Click **Add Assignment**.
4. Select the **Template** you wish to assign.
5. Select the eligible **User Types** who can access this template. Only user types already enabled for the lot will be available.
6. *(Optional)* Enter a **Password** if you wish to restrict access to this template.
7. *(Optional)* Enter a **Max Permits** value to set a permit issuance cap for this specific template assignment.
8. Click **Save** to apply the configuration.

### Promo Codes

<p class="callout info">Built for scenarios like volunteer parking, private group rates, or limited-time discounts — visible only to people who have the code.</p>

1. <span data-path-to-node="5,0,0,0">Navigate to the **Parking Management** module, hover over **Lot Administration**, and click **Promo Codes**</span><span class="" data-path-to-node="5,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,0,0,2">.</span>
2. <span data-path-to-node="5,1,0,0">Click the **+ Create New** button to open the **Create Promo Code** window</span><span class="" data-path-to-node="5,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,1,0,2">.</span>
3. <span data-path-to-node="5,2,0,0">Configure the promo code details</span><span class="" data-path-to-node="5,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,0,2">:</span>
    
    
    - <span data-path-to-node="5,2,1,0,0,0">**Code:** Enter the code string (automatically converted to uppercase; must be unique per lot)</span><span class="" data-path-to-node="5,2,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,0,0,2">.</span>
    - <span data-path-to-node="5,2,1,1,0,0">**Lot:** Select the target lot from the dropdown</span><span class="" data-path-to-node="5,2,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,1,0,2">.</span>
    - <span data-path-to-node="5,2,1,2,0,0">**Restrict to Assignment (optional):** Select a specific template assignment, or leave as *— Any assignment —* to apply to all bookings at this lot</span><span class="" data-path-to-node="5,2,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,2,0,2">.</span>
    - <span data-path-to-node="5,2,1,3,0,0">**Discount:** Enter the discount percentage.</span>
    - <span data-path-to-node="5,2,1,4,0,0">**Active From** &amp; **Expires:** Select the start and expiration dates for the code</span><span class="" data-path-to-node="5,2,1,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,4,0,2">.</span>
    - <span data-path-to-node="5,2,1,5,0,0">**Max Uses (optional):** Enter a maximum redemption cap, or leave blank for unlimited uses</span><span class="" data-path-to-node="5,2,1,5,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,5,0,2">.</span>
4. <span data-path-to-node="5,3,0,0">Click **Save** to create the promo code</span><span class="" data-path-to-node="5,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,3,0,2">.</span>

### User Booking Flow

<p class="callout info">The goal on the parker side is getting from "I need to park" to "I'm parked" in as few taps as possible, while still surfacing special offers to those who qualify.</p>

**1. Time &amp; Vehicle Selection:**

- <span data-path-to-node="6,0,1,0,0,0">Select a start time using **Now** or **Later**</span><span class="" data-path-to-node="6,0,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,0,1,0,0,2">.</span>
- <span data-path-to-node="6,0,1,1,0,0">Select an end time using **Duration** (adjust slider from 30 minutes to 12 hours), **Until Closing**, **Overnight**, or **Other**</span><span class="" data-path-to-node="6,0,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,0,1,1,0,2">.</span>
- <span data-path-to-node="6,0,1,2,0,0">Tap a registered vehicle from the list to assign it to the permit</span><span class="" data-path-to-node="6,0,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,0,1,2,0,2">.</span>
- <span data-path-to-node="6,0,1,3,0,0">In the *"Have a promo or access code?"* section, enter a **Promo code** to receive a discount, or enter a **Template password** to unlock restricted rate templates</span><span class="" data-path-to-node="6,0,1,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,0,1,3,0,2">.</span>
- <span data-path-to-node="6,0,1,4,0,0">Click **Check Price** to calculate rates</span><span class="" data-path-to-node="6,0,1,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,0,1,4,0,2">.</span>

**2. Pricing Review &amp; Payment:**

- <span data-path-to-node="6,1,1,0,0,0">Review the rate breakdown (the system automatically applies the cheapest qualified rate template)</span><span class="" data-path-to-node="6,1,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,1,1,0,0,2">.</span>
- <span data-path-to-node="6,1,1,1,0,0">Review the **Subtotal**, **Tax**, and **Total** amounts</span><span class="" data-path-to-node="6,1,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,1,1,1,0,2">.</span>
- <span data-path-to-node="6,1,1,2,0,0">*(Optional)* Click **&lt; Change time** to return to Step 1 and edit selections</span><span class="" data-path-to-node="6,1,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,1,1,2,0,2">.</span>
- <span data-path-to-node="6,1,1,3,0,0">Click **Get Permit — $\[Amount\]** to proceed to payment and finalize the booking</span><span class="" data-path-to-node="6,1,1,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="6,1,1,3,0,2">.  
    </span>

### Admin-Side Permit Issuance

Administrators can issue temporary permits directly from a user's profile using the configured lot rate engine:

1. <span data-path-to-node="38,0,0,0">Navigate to the desired user's profile and click the **Parking** tab</span><span class="" data-path-to-node="38,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,0,0,2">.</span>
2. <span data-path-to-node="38,1,0,0">Locate the target lot under **Manage Lots** and click the **Temporary Permit** button</span><span class="" data-path-to-node="38,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,1,0,2">.</span>
3. <span data-path-to-node="38,2,0,0">In the **Temporary Parking Permit Registration** window, select or confirm the **Requested Lot**</span><span class="" data-path-to-node="38,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,2,0,2">.</span>
4. <span data-path-to-node="38,3,0,0">Set the **Start** and **End** dates and times</span><span class="" data-path-to-node="38,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,3,0,2">.</span>
5. <span data-path-to-node="38,4,0,0">Select the **Vehicle** from the user's registered vehicles list</span><span class="" data-path-to-node="38,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,4,0,2">.</span>
6. <span data-path-to-node="38,5,0,0">*(Optional)* Check **Apply to all Vehicles** if issuing a multi-vehicle temporary permit</span><span class="" data-path-to-node="38,5,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,5,0,2">.</span>
7. <span data-path-to-node="38,6,0,0">Enter or verify the auto-generated **Permit #**</span><span class="" data-path-to-node="38,6,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,6,0,2">.</span>
8. <span data-path-to-node="38,7,0,0">Click **Confirm Booking** to proceed to payment and finalize the issuance</span><span class="" data-path-to-node="38,7,0,1"><sup class="superscript"></sup></span><span data-path-to-node="38,7,0,2">.</span>

### Concept Overview

<table data-path-to-node="22" id="bkmrk-concept-behavior-unp"><thead><tr><td>**Concept**</td><td>**Behavior**</td></tr></thead><tbody><tr><td><span data-path-to-node="5,1,0,0">**Unpainted time slot**</span></td><td><span data-path-to-node="5,1,1,0,0">Not bookable</span><span data-path-to-node="5,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,1,1,0,2">.</span>

</td></tr><tr><td><span data-path-to-node="5,2,0,0">**Highest priority layer**</span></td><td><span data-path-to-node="5,2,1,0,0">Always wins for the entire day</span><span data-path-to-node="5,2,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,0,2">. Lower-priority layers are excluded completely (no gap-filling)</span><span data-path-to-node="5,2,1,0,3"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,0,4">.</span>

</td></tr><tr><td><span data-path-to-node="5,3,0,0">**Date override layer**</span></td><td><span data-path-to-node="5,3,1,0,0">Evaluated as highest priority for that specific date and completely replaces weekly schedules</span><span data-path-to-node="5,3,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,3,1,0,2">.</span>

</td></tr><tr><td><span data-path-to-node="5,4,0,0">**Fixed rate block**</span></td><td><span data-path-to-node="5,4,1,0,0">No proration; full price charged for any partial use within the block</span><span data-path-to-node="5,4,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,4,1,0,2">.</span>

</td></tr><tr><td><span data-path-to-node="5,5,0,0">**Single hourly block**</span></td><td><span data-path-to-node="5,5,1,0,0">Prorated to actual time used</span><span data-path-to-node="5,5,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,5,1,0,2">.</span>

</td></tr><tr><td><span data-path-to-node="5,6,0,0">**Multiple eligible templates**</span></td><td><span data-path-to-node="5,6,1,0,0">Evaluated independently; cheapest template rate is auto-selected (no cross-template layer mixing)</span><span data-path-to-node="5,6,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,6,1,0,2">.</span>

</td></tr><tr><td><span data-path-to-node="5,7,0,0">**Promo code**</span></td><td><span data-path-to-node="5,7,1,0,0">Percentage discount applied pre-tax</span><span data-path-to-node="5,7,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,7,1,0,2">. One use per user per code; freed up if permit is removed from cart before purchase</span><span data-path-to-node="5,7,1,0,3"><sup class="superscript"></sup></span><span data-path-to-node="5,7,1,0,4">.</span>

</td></tr><tr><td><span data-path-to-node="5,8,0,0">**Max permits limit**</span></td><td><span data-path-to-node="5,8,1,0,0">Template assignment limit acts as a sub-limit within the lot's overall maximum permits</span><span data-path-to-node="5,8,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,8,1,0,2">.</span>

</td></tr></tbody></table>

---

## <span style="color: rgb(22, 145, 121);">Best Practices and Considerations</span>

- - **Day-Level Priority Rule:** Within a single template, the highest-priority layer with painted blocks on a given date will win for the *entire day*. Lower-priority layers are ignored completely and will not fill unpainted hour gaps. Always ensure high-priority and specific-date layers are fully painted for all 24 hours of the day.
    - **Unpainted Time Slots:** Any hour block left unpainted on an active layer is non-bookable. Users cannot purchase a permit for unpainted hours.
    - **Specific Date Overrides:** Date-specific layers always take precedence over regular weekly schedules for that calendar date.
    - **Cross-Template Pricing:** If a parker qualifies for multiple templates on a lot, the system calculates the price across all eligible templates independently and applies the cheapest option. Layers from different templates are never combined.
    - <span data-path-to-node="41,4,0,0">**Proration Rules:** Single hourly blocks are prorated—if a user arrives or leaves mid-hour, they are only charged for the portion of the hour actually used</span><span class="" data-path-to-node="41,4,0,1"><sup class="superscript"></sup></span><span data-path-to-node="41,4,0,2">. Fixed-rate merged blocks are **never prorated**—booking anywhere within the block requires paying the full block price, which grants validity for the full block duration</span><span class="" data-path-to-node="41,4,0,3"><sup class="superscript"></sup></span><span data-path-to-node="41,4,0,4">.</span>
    - **Promo Code Limits:** Promo codes apply a percentage discount to the subtotal prior to tax calculation. Each user is restricted to one redemption per promo code.
    - **Permit Cap Warnings:** Setting a **Max Permits** cap on a template assignment creates a sub-limit within the lot's total capacity. If assignment limits sum to more than the lot's overall limit, the system permits the configuration but displays a warning message.
    - **Admin Limit Warnings:** When issuing permits on the admin side, exceeding a template's Max Permits cap triggers a warning message on screen but will not block the administrator from processing the permit.

<p class="callout warning">**Developer Note on Time Blocks:** The `sale_start`, `sale_end`, and `valid_until` fields on time blocks are time-only reference values stored against a placeholder date. **They must never be given a timezone cast.** Doing so causes the weekly rate grid to silently stop rendering saved blocks. A code comment flags this at the cast site and must not be removed.</p>