# Setup & Configuration for Admins

All articles related to setting up and configuring OPSCOM are stored here.

# Admin Tools & Data Maintenance

Items on the tools menu control rarely accessed but important setup and configuration tools for OPSCOM. Data Maintenance options are also here.

# Data Maintenance Articles

<p class="callout info">Data maintenance is crucial for ensuring the accuracy, reliability, and optimal performance of any system.</p>

Regular data maintenance helps to:

- **Improve Data Accuracy:** By identifying and correcting errors, inconsistencies, and redundancies, data maintenance ensures that the information you rely on is trustworthy and precise.
- **Enhance System Performance:** Clean and well-organized data leads to faster processing, quicker searches, and more efficient operations within the system, preventing slowdowns and crashes.
- **Facilitate Informed Decision-Making:** Accurate and up-to-date data provides a clear and reliable foundation for analysis, reporting, and strategic planning, leading to better business decisions.
- **Ensure Compliance and Security:** Maintaining data integrity helps meet regulatory compliance requirements and reduces the risk of security vulnerabilities associated with outdated or corrupted information.
- **Reduce Operational Costs:** By minimizing errors and improving efficiency, data maintenance helps avoid costly reworks, resource waste, and potential financial losses due to inaccurate information.

The following articles all pertain to Data Maintenance Activities:

- ##### [Preparing to Import your User Data](https://opscom.wiki/books/new-client-onboarding/page/preparing-to-import-your-user-data)
- ##### [Purge Old Data - Explained](https://opscom.wiki/books/setup-configuration-for-admins/page/purge-old-explained)
- ##### [Purging Incidents ](https://opscom.wiki/books/setup-configuration-for-admins/page/purging-incidents)
- ##### [Resolve Duplicate Options](https://opscom.wiki/books/setup-configuration-for-admins/page/resolve-duplicate-options)
- ##### [Merging Vehicles](https://opscom.wiki/books/the-opscom-admin-portal/page/merge-vehicles)
- ##### [Merging Users](https://opscom.wiki/books/the-opscom-admin-portal/page/merge-user)
- [##### Archive or Disabling a User](https://opscom.wiki/books/the-opscom-admin-portal/page/archiving-or-disabling-a-user)
- [##### Archiving and Restoring Permits](https://opscom.wiki/books/the-opscom-admin-portal/page/archiving-and-restoring-permits)

# Using the Database Importer (Beta)

<p class="callout info">The **Database Importer** in OPSCOM provides administrators with a powerful tool to import existing data into the system using CSV files. This functionality is essential for initial data migration, mass updates, or integrating data from external systems, ensuring that your OPSCOM database is populated and maintained efficiently. <span style="text-decoration: underline;">This tool is currently in **BETA**.</span></p>

### Setup &amp; Configuration

1. Hover over **Tools**, then click **Data Importer - BETA** to access the tool.

##### <span style="text-decoration: underline;">Permissions Requirements</span>

If the **Data Importer** page is not visible, the user's account does not have the necessary permissions enabled. To allow a user to import or manage data, the following permissions must be configured:

- **Manage tables**: This permission allows the user to view the **Manage Tables** page and utilize the upload functionality for importing data. It does **NOT** grant the ability to reset tables.
- **Reset tables**: This permission grants the ability to empty (reset) tables. It does **NOT** allow the user to see the **Manage Tables** page unless **Manage tables** is also enabled.

These permissions can be found under the **Systems** tab of the permissions management page. Enable them to grant a user access to the **Database Importer** functionality. For more information on configuring permissions, [please refer to the User Roles and Permissions wiki article.](https://opscom.wiki/books/setup-configuration-for-admins/page/manage-roles-and-permissions)

---

### Using this Feature

The **Database Importer** allows data to be imported into a select number of tables within OPSCOM.

##### <span style="text-decoration: underline;">Currently Supported Tables for Import</span>

- **UserProfile**
- **OffenceLocations**
- **Vehicle**
- **Permits**
- **Violations**

##### <span style="text-decoration: underline;">Importing Data into a Table</span>

<p class="callout warning">Note - There is a limit of <span style="text-decoration: underline;">**10000**</span> records to be imported in one batch. This includes the header row.</p>

To begin a new import:

1. Click the **Upload** button next to the desired destination table that you wish to import information into.
2. A modal window will open, prompting you to select the CSV file. Your imported CSV file can be **comma-differentiated** or **semi-colon-differentiated**.
3. Once a file has been selected, click **Submit** to begin the upload process.
4. After the CSV file has been successfully uploaded, the **Table Import** screen will appear.

---

<p class="callout warning">Converting Fields to Text to Avoid Truncating Leading Zeros - When converting data from Excel to CSV, issues can arise, such as the truncation of leading zeros in numbers (e.g., student IDs, staff numbers). To prevent this, you can force Excel to treat cells as text before converting to CSV as below:</p>

1. <span style="color: rgb(230, 126, 35);">Open a new sheet in your Excel workbook.</span>
2. <span style="color: rgb(230, 126, 35);">In cell A1 of the *new* sheet, type the formula: `="'"&` then click on cell A1 of your *original* spreadsheet. (This formula is: equals sign, double quote, apostrophe, double quote, ampersand, then the cell reference.)</span>
3. <span style="color: rgb(230, 126, 35);">Drag this formula down and across through the same number of rows and columns as your original data. This will replicate your data on the new page, but an apostrophe (`'`) will be placed in front of all values, forcing Excel to treat them as text.</span>
4. <span style="color: rgb(230, 126, 35);">Save the new sheet as a `.CSV` file. Ensure you only save the new page. This method effectively preserves leading zeros during the CSV conversion.</span>

---

##### <span style="text-decoration: underline;">Column Matching</span>

On the **Table Import** screen, you will match the columns from your imported CSV file to the corresponding columns in the destination table within OPSCOM.

- This step informs the program where each piece of data from your CSV file belongs in the destination table.
- If your CSV file contained recognized column names, the system will automatically pre-select the appropriate matches.
- For detailed information on each column's purpose, whether it is required or optional, and specific formatting, please refer to the [Importer Field Descriptions guide](https://opscom.wiki/books/for-administrators-staff/page/importer-field-descriptions).

Once the columns have been properly matched and you click the **Process** button, you will be redirected back to the main page while the import is completed in the background.

##### <span style="text-decoration: underline;">Post-Import Processing and Settings</span>

After the initial import of data into the base table, some tables run additional processing on the information to establish relationships and apply default settings. These processes run separately from the initial import and are not affected by the duplicate settings chosen for the import.

##### <span style="text-decoration: underline;">Status Emails</span>

Over the course of the import process, a total of two emails will be sent to the user who initiated the import:

- The **first email** is sent after the data from the CSV has been inserted into the temporary table. It records the number of rows that were successfully imported and the rows that failed due to being malformed.
- The **second email** is sent after the data has been inserted into the base table and post-processing is complete. It contains the number of records that were updated, the number of records inserted, and any relevant information from the post-import processing that occurred.

##### <span style="text-decoration: underline;">Table-Specific Post-Processing Details</span>

- **Permits**: 
    - If the user association column is matched, the created permit will automatically have a booking created for the associated user via a `PermitJoin` record.
    - If the option was selected during import, newly-created permits booked to users will be automatically marked as paid. Otherwise, they will be located in the users' carts, requiring users to complete payment.
- **UserProfile**: 
    - When users are imported, if a `LoginSource` is not provided, it will be automatically set to **OPSCOM**.
    - Newly created users are automatically set to **enabled**.
- **Vehicle**: 
    - If the user association column is matched, the created vehicle will be automatically associated with the user via a `VehicleJoin` record.
    - If the alert column is matched, an alert will be created and automatically attached to the associated vehicle via an `AlertComments` record. The vehicle will also be flagged. The list of vehicles being marked with alerts may also be called a **hotlist**.
- **Violations**: 
    - Any violations created that do not have an `Issued Date` and `Due Date` will have one automatically generated for them at the time of import.
- **OffenceLocations**: 
    - This table has no specific post-processing.

##### <span style="text-decoration: underline;">Order of Operations for Related Imports</span>

Imports that contain related information should generally be done in a specific order, as some tables contain information that references another table. While imports *can* be done out of order, records may not be associated correctly if their dependencies aren't met. In general, the tables a record requires should be imported *before* that record's table.

<div class="horizontal-scroll-wrapper" id="bkmrk-table-to-import-requ"><div class="table-block-component"><div _ngcontent-ng-c3621026028="" class="table-block has-export-button"><div _ngcontent-ng-c3621026028="" class="table-content not-end-of-paragraph" not-end-of-paragraph=""><table data-sourcepos="93:1-99:291" style="width: 103.333%; height: 375px;"><tbody><tr data-sourcepos="93:1-93:403"><th align="left" data-sourcepos="93:1-93:17" style="width: 16.2098%;">Table to Import</th><th align="left" data-sourcepos="93:19-93:46" style="width: 15.9654%;">Requires (Imported Before)</th><th align="left" data-sourcepos="93:48-93:401" style="width: 67.8248%;">Notes</th></tr><tr data-sourcepos="95:1-95:403"><td align="left" data-sourcepos="95:1-95:17" style="width: 16.2098%;">**UserProfile**</td><td align="left" data-sourcepos="95:19-95:46" style="width: 15.9654%;">(None)</td><td align="left" data-sourcepos="95:48-95:401" style="width: 67.8248%;">This should generally be the **first** table imported.</td></tr><tr data-sourcepos="96:1-96:391"><td align="left" data-sourcepos="96:1-96:14" style="width: 16.2098%;">**Vehicles**</td><td align="left" data-sourcepos="96:16-96:32" style="width: 15.9654%;">**UserProfile**</td><td align="left" data-sourcepos="96:34-96:389" style="width: 67.8248%;">Having the user record created before the vehicle allows the user to be associated with the vehicle by a `VehicleJoin` record created during post-import processing.</td></tr><tr data-sourcepos="97:1-97:410"><td align="left" data-sourcepos="97:1-97:22" style="width: 16.2098%;">**OffenceLocations**</td><td align="left" data-sourcepos="97:24-97:51" style="width: 15.9654%;">(None)</td><td align="left" data-sourcepos="97:53-97:408" style="width: 67.8248%;">Does not require any data beforehand but should be imported before **Violations** to ensure proper location marking.</td></tr><tr data-sourcepos="98:1-98:399"><td align="left" data-sourcepos="98:1-98:13" style="width: 16.2098%;">**Permits**</td><td align="left" data-sourcepos="98:15-98:45" style="width: 15.9654%;">**Vehicles**, **UserProfile**</td><td align="left" data-sourcepos="98:47-98:397" style="width: 67.8248%;">Having a vehicle record created before the permit allows the permit to be associated with the vehicle by a `PermitJoin` record created during post-import processing. If there is also an associated user record, the permit can be marked as paid by joining the user and permit through a payment record (if the option was selected).</td></tr><tr data-sourcepos="99:1-99:291"><td align="left" data-sourcepos="99:1-99:16" style="width: 16.2098%;">**Violations**</td><td align="left" data-sourcepos="99:18-99:70" style="width: 15.9654%;">**Vehicles**, **UserProfile**, **OffenceLocations**</td><td align="left" data-sourcepos="99:72-99:289" style="width: 67.8248%;">A violation requires the existence of a vehicle record beforehand for the violation to be created at all. Offence locations should be imported before violations for the violation to have its location properly marked.</td></tr></tbody></table>

</div></div></div></div>##### <span style="text-decoration: underline;">User-Association Settings</span>

Some tables include additional post-processing to associate newly-created records with existing users. For this to work, the unique identifier for the user (**UserUUID** or **Email**) must be selected consistently for both the user's primary record and any associated records (Vehicles, Permits). Ensure the same value is selected for both sections during the import setup.

The tables that currently have this user-association option are:

- **Vehicles**
- **Permits**

##### <span style="text-decoration: underline;">Unique Identifiers &amp; Duplicate Settings</span>

The **Unique Identifiers** are the columns used to determine if a record's information is unique. If the information in these columns is duplicated in the file or already exists in the system, it will be handled based on your selected **Duplicate Settings**:

- **Ignoring a duplicate**: The system will do nothing with the duplicate record.
- **Overwrite existing**: The information in the new record will replace the existing record with the same unique identifier.

The number of columns that mark a record as unique varies by table:

- **UserProfile**: Uses one identifier, which can be either **UserUUID** or **Email**. If both are supplied, **UserUUID** takes precedence.
- **OffenceLocations**: Uses one identifier, which is **LocationName**.
- **Vehicle**: Uses one identifier, which is **Plate**.
- **Permits**: Uses two primary identifiers: **PermitNo** and **LotNameID**. Both are required to make a unique record, meaning identical `PermitNo` values can exist if they have different `LotNameID` values.
- **Violations**: Uses one identifier, which is **Ticket**.

##### <span style="text-decoration: underline;">Foreign Lookup Columns</span>

Some data in one table originates from another table and is stored as an ID in the destination table (known as a foreign key).

- Data in these columns should be entered as normal text in your CSV. The system will automatically look for a match in the corresponding lookup table.
- If a matching value is found (e.g., a "Colour" name in the `VehicleColour` table), the system will input the correct ID value into the destination table.
- If no matching value is found in the lookup table, the system will enter a `Null` value instead.

Below is a list of common foreign lookup columns and their source tables:

<div class="horizontal-scroll-wrapper" id="bkmrk-inserting-into-table"><div class="table-block-component"><div _ngcontent-ng-c3621026028="" class="table-block has-export-button"><div _ngcontent-ng-c3621026028="" class="table-content not-end-of-paragraph" not-end-of-paragraph=""><table data-sourcepos="135:1-148:71"><tbody><tr data-sourcepos="135:1-135:73"><th align="left" data-sourcepos="135:1-135:22">Inserting Into Table</th><th align="left" data-sourcepos="135:24-135:46">Column Inserting Into</th><th align="left" data-sourcepos="135:48-135:71">Sourced From Table</th></tr><tr data-sourcepos="137:1-137:59"><td align="left" data-sourcepos="137:1-137:17">**UserProfile**</td><td align="left" data-sourcepos="137:19-137:41">`prov`</td><td align="left" data-sourcepos="137:43-137:57">**Provinces**</td></tr><tr data-sourcepos="138:1-138:64"><td align="left" data-sourcepos="138:1-138:22"> </td><td align="left" data-sourcepos="138:24-138:46">`UserTypeID`</td><td align="left" data-sourcepos="138:48-138:62">**UserTypes**</td></tr><tr data-sourcepos="139:1-139:55"><td align="left" data-sourcepos="139:1-139:13">**Vehicle**</td><td align="left" data-sourcepos="139:15-139:37">`ProvID`</td><td align="left" data-sourcepos="139:39-139:53">**Provinces**</td></tr><tr data-sourcepos="140:1-140:69"><td align="left" data-sourcepos="140:1-140:22"> </td><td align="left" data-sourcepos="140:24-140:46">`ColourID`</td><td align="left" data-sourcepos="140:48-140:67">**VehicleColours**</td></tr><tr data-sourcepos="141:1-141:66"><td align="left" data-sourcepos="141:1-141:22"> </td><td align="left" data-sourcepos="141:24-141:46">`MakeID`</td><td align="left" data-sourcepos="141:48-141:64">**VehicleMake**</td></tr><tr data-sourcepos="142:1-142:66"><td align="left" data-sourcepos="142:1-142:22"> </td><td align="left" data-sourcepos="142:24-142:46">`TypeID`</td><td align="left" data-sourcepos="142:48-142:64">**VehicleType**</td></tr><tr data-sourcepos="143:1-143:71"><td align="left" data-sourcepos="143:1-143:22"> </td><td align="left" data-sourcepos="143:24-143:46">`PlateTypeID`</td><td align="left" data-sourcepos="143:48-143:69">**VehiclePlateType**</td></tr><tr data-sourcepos="144:1-144:53"><td align="left" data-sourcepos="144:1-144:13">**Permits**</td><td align="left" data-sourcepos="144:15-144:37">`LotNameID`</td><td align="left" data-sourcepos="144:39-144:51">**LotName**</td></tr><tr data-sourcepos="145:1-145:66"><td align="left" data-sourcepos="145:1-145:22"> </td><td align="left" data-sourcepos="145:24-145:46">`StateID`</td><td align="left" data-sourcepos="145:48-145:64">**PermitState**</td></tr><tr data-sourcepos="146:1-146:56"><td align="left" data-sourcepos="146:1-146:16">**Violations**</td><td align="left" data-sourcepos="146:18-146:40">`VehicleID`</td><td align="left" data-sourcepos="146:42-146:54">**Vehicle**</td></tr><tr data-sourcepos="147:1-147:69"><td align="left" data-sourcepos="147:1-147:22"> </td><td align="left" data-sourcepos="147:24-147:46">`TicketType`</td><td align="left" data-sourcepos="147:48-147:67">**TicketCategory**</td></tr><tr data-sourcepos="148:1-148:71"><td align="left" data-sourcepos="148:1-148:22"> </td><td align="left" data-sourcepos="148:24-148:46">`LocationID`</td><td align="left" data-sourcepos="148:48-148:69">**OffenceLocations**</td></tr></tbody></table>

</div></div></div></div>##### <span style="text-decoration: underline;">Table Reset</span>

In addition to importing data, the **Database Importer** page also allows for the **purging** of an entire table's contents.

1. Click the **Reset** button next to the table you wish to empty.
2. A new modal window will open, prompting you to confirm that you wish to delete the contents of the table.
    
    
    - <p class="callout warning">**Irreversible Action:** This action is permanent. Once the data is deleted, it cannot be recovered. Ensure you are absolutely certain before proceeding.  
        </p>
3. If you are certain the data should be deleted, type **DELETE** (in all caps) into the confirmation text field and press the **Delete** button.
4. The selected table will then be purged of all records.

##### <span style="text-decoration: underline;">Related Table Purges</span>

Some tables are closely connected to the records of a related table. Removing the data they contain will also purge the contents of the related table:

- Purging the **Vehicle** table will also purge the **VehicleJoin** table.
- Purging the **Permits** table will also purge the **PermitJoin** table.

<p class="callout info">**Note:** Only the table contents are deleted; the table structure itself remains intact.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Data Preparation is Key**: Ensure your CSV file is meticulously prepared. Accurate data, correct formatting, and adherence to specified column names (if known) will significantly reduce import errors.</span>
- <span style="color: rgb(22, 145, 121);">**Backup Before Import**: While not explicitly a system feature, it's a best practice to ensure you have recent system backups before performing large-scale imports or table resets.</span>
- <span style="color: rgb(22, 145, 121);">**Understand Dependencies**: Always review the "Order of Operations" before importing, especially when dealing with related tables like UserProfile, Vehicles, and Permits. Importing out of order can lead to unassociated records.</span>
- <span style="color: rgb(22, 145, 121);">**Handle Duplicates Strategically**: Choose your "Duplicate Settings" (Ignore or Overwrite) carefully based on whether you intend to add new unique records or update existing ones.</span>
- <span style="color: rgb(22, 145, 121);">**Monitor Status Emails**: Pay close attention to the status emails sent during the import process. They provide crucial feedback on success rates and potential issues.</span>

# Importer Field Descriptions

<p class="callout info">This article provides a comprehensive guide to the fields used within the [OPSCOM Database Importer](https://opscom.wiki/books/setup-configuration-for-admins/page/using-the-database-importer-beta). For each supported table, you'll find a list of column names, their internal system names, their requirement level (Unique ID, Recommended, Optional), data type, and a detailed description, ensuring you can prepare your CSV files accurately for successful data imports.</p>

### Understanding Field Requirements

When preparing your CSV files for import, it's essential to understand the different levels of field requirements:

- **Unique ID Fields**: These fields are **required** and are crucial for identifying a record as a unique entity in the system *before* it's assigned an internal ID. They represent the bare minimum information needed to import a distinct record.
- **Recommended Fields**: While not technically mandatory for a record to be created, these fields contain information that makes the record a genuinely useful entity within the system. Examples include a user's first and last names or the fine value on a violation. A record can exist without them, but its utility will be limited.
- **Optional Fields**: These fields are not required, and a record without them can still function as a useful entity. They contain supplemental information that can be filled in later or isn't essential for the basic functionality of the record, such as a vehicle's manufacturing year.

---

### Importer Columns

Below is a detailed breakdown of the columns available for each supported import table, including their internal names, requirement levels, types, and descriptions.

##### <span style="text-decoration: underline;">UserProfile Table</span>

<table data-autosize="false" data-layout="default" data-number-column="false" data-table-local-id="34de21e8-eca7-41cf-bd0b-f7c79465c2c8" data-table-width="1432" id="bkmrk-column-name-internal" style="width: 100%;"><tbody><tr><th class="pm-table-header-content-wrap" data-colwidth="213" style="width: 10.6079%;">**Column Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="169" style="width: 14.8987%;">**Internal Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="198" style="width: 16.5673%;">**Requirement**

</th><th class="pm-table-header-content-wrap" data-colwidth="204" style="width: 17.1639%;">**Type**

</th><th class="pm-table-header-content-wrap" data-colwidth="634" style="width: 40.7622%;">**Description**

</th></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">User Unique ID (UUID)

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">UserUUID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="198" style="background-color: rgb(255, 189, 173); width: 16.5673%;">Unique ID

- This or Email is Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The primary identifier. If UUID is not supplied, email will be used as the key identifier instead.

This value identifies the user as a unique record and it or the email is required to import a record.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Email Address

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">email

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="198" style="background-color: rgb(255, 189, 173); width: 16.5673%;">Unique ID

- This or UUID is Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The secondary identifier. If UUID is not supplied, email will be used as the key identifier instead.

This value identifies the user as a unique record and it or the UUID is required to import a record.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Username

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">username

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="198" style="background-color: rgb(255, 250, 230); width: 16.5673%;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The username of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">First Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">firstName

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="198" style="background-color: rgb(255, 250, 230); width: 16.5673%;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The first name of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Middle Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">middleName

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The middle name of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Last Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">lastName

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="198" style="background-color: rgb(255, 250, 230); width: 16.5673%;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The last name of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Password

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">password

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The password of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">User Type

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">UserTypeID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="198" style="background-color: rgb(255, 250, 230); width: 16.5673%;">Recommended

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="204" style="background-color: rgb(230, 252, 255); width: 17.1639%;">Foreign Key

- UserTypes Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The user type of the user. Attaches to the UserTypes table.

The values supplied by the user in the uploaded file are expected to be values from the TypeName column of the UserTypes table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the TypeName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The UserTypeID from the UserTypes table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Street Address

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">street

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The street address of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">City

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">city

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The city of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Province/

State

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">prov

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="204" style="background-color: rgb(230, 252, 255); width: 17.1639%;">Foreign Key

- Provinces Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The province or state of the user. Attaches to the Provinces table.

The values supplied by the user in the uploaded file are expected to be values from the ProvName column of the Provinces table, as these are the values that will be matched against. These are the long names of the province and not the abbreviation; as in, Ontario and not ON.

The values in the uploaded file must be an exact match to the values in the ProvName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The ProvID from the Provinces table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Postal Code

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">postal

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The postal or ZIP code of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Cellphone Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">phonecell

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The cellphone number of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Employee Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">employNo

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The employee number of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Student Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">studentNo

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The student number of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Secondary Phone Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">sPhone

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The secondary phone number of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Date of Birth

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">DOB

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The date of birth of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Preferred Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">preferredname

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The preferred name of the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Public Comment

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">publicComment

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The public comment for the user. Visible to the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Private Comment

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">privateComment

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The private comment for the user. Not visible to the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="213" style="width: 10.6079%;">Login Source

</td><td class="pm-table-cell-content-wrap" data-colwidth="169" style="width: 14.8987%;">loginSource

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="198" style="background-color: rgb(171, 245, 209); width: 16.5673%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 17.1639%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="634" style="width: 40.7622%;">The method by which the user logs into the system.

If a login source is not supplied for a user, it will be set to OPSCOM by default.

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

##### <span style="text-decoration: underline;">OffenseLocations Table</span>

For additional information on this table, [refer to this wiki article.](https://opscom.wiki/books/setup-configuration-for-admins/page/locations)

<table data-autosize="false" data-layout="default" data-number-column="false" data-table-local-id="0ef2ab71-8dd8-4958-be50-675be36f2d20" data-table-width="1444" id="bkmrk-column-name-internal-1" style="width: 100%;"><tbody><tr><th class="pm-table-header-content-wrap" data-colwidth="204" style="width: 11.7976%;">**Column Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="179" style="width: 12.9938%;">**Internal Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="196" style="width: 17.2825%;">**Requirement**

</th><th class="pm-table-header-content-wrap" data-colwidth="216" style="width: 16.329%;">**Type**

</th><th class="pm-table-header-content-wrap" data-colwidth="643" style="width: 41.5971%;">**Description**

</th></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 11.7976%;">Location Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="179" style="width: 12.9938%;">LocationName

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="196" style="background-color: rgb(255, 189, 173); width: 17.2825%;">Unique ID

- Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="216" style="width: 16.329%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 41.5971%;">The name of the location being imported. This value identifies the location as a unique record and is required to import a record.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 11.7976%;">Writer Visible

</td><td class="pm-table-cell-content-wrap" data-colwidth="179" style="width: 12.9938%;">WriterVisible

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="196" style="background-color: rgb(171, 245, 209); width: 17.2825%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="216" style="width: 16.329%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 41.5971%;">Whether the writer of a violation of a ticket made in the location is visible to the user.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="204" style="width: 11.7976%;">GIS Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="179" style="width: 12.9938%;">GisNo

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="196" style="background-color: rgb(171, 245, 209); width: 17.2825%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="216" style="width: 16.329%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 41.5971%;">The GIS number is a geographic location code and is only used by certain clients. Associated with GIS maps ([https://www.gismaps.org/](https://www.gismaps.org/)).

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

##### <span style="text-decoration: underline;">Vehicle Table</span>

<table data-autosize="false" data-layout="default" data-number-column="false" data-table-local-id="14f41f65-23f3-4710-bd69-c44f45ca4823" data-table-width="1456" id="bkmrk-column-name-internal-2" style="width: 100%;"><tbody><tr><th class="pm-table-header-content-wrap" data-colwidth="196" style="width: 12.1573%;">**Column Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="184" style="width: 10.9654%;">**Internal Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="211" style="width: 16.6865%;">**Requirement**

</th><th class="pm-table-header-content-wrap" data-colwidth="215" style="width: 22.4069%;">**Type**

</th><th class="pm-table-header-content-wrap" data-colwidth="643" style="width: 37.903%;">**Description**

</th></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Licence Plate

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">Plate

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="211" style="background-color: rgb(255, 189, 173); width: 16.6865%;">Unique ID

- Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="215" style="width: 22.4069%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The license plate number of the vehicle.

This value identifies the vehicle as a unique record and is required to import a record.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Vehicle Year

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">Year

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="215" style="width: 22.4069%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The year of the vehicle.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Active Vehicle

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">active

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="215" style="width: 22.4069%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">Indicates whether the vehicle is active or not.

If not supplied, vehicles will be set to active by default.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Plate Type Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">PlateTypeID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="215" style="background-color: rgb(230, 252, 255); width: 22.4069%;">Foreign Key

- VehiclePlateType Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The plate type of the vehicle. Attaches to the VehiclePlateType table.

The values supplied by the user in the uploaded file are expected to be values from the TypeName column of the VehiclePlateType table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the TypeName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The TypeID from the VehiclePlateType table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Province/

State

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">ProvID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="215" style="background-color: rgb(230, 252, 255); width: 22.4069%;">Foreign Key

- Provinces Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The province or state of the user. Attaches to the Provinces table.

The values supplied by the user in the uploaded file are expected to be values from the ProvName column of the Provinces table, as these are the values that will be matched against. These are the long names of the province and not the abbreviation; as in, Ontario and not ON.

The values in the uploaded file must be an exact match to the values in the ProvName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The ProvID from the Provinces table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Vehicle Make Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">MakeID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="215" style="background-color: rgb(230, 252, 255); width: 22.4069%;">Foreign Key

- VehicleMake Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The make of the vehicle. Attaches to the VehicleMake table.

The values supplied by the user in the uploaded file are expected to be values from the MakeName column of the VehicleMake table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the MakeName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The MakeID from the VehicleMake table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Vehicle Type Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">TypeID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="215" style="background-color: rgb(230, 252, 255); width: 22.4069%;">Foreign Key

- VehicleType Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The type of the vehicle. Attaches to the VehicleType table.

The values supplied by the user in the uploaded file are expected to be values from the TypeName column of the VehicleType table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the TypeName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The TypeID from the VehicleType table matching the name will inserted into the record in the base table.

The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">Vehicle Colour Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">ColourID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="215" style="background-color: rgb(230, 252, 255); width: 22.4069%;">Foreign Key

- VehicleColours Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The colour of the vehicle. Attaches to the VehicleColours table.

The values supplied by the user in the uploaded file are expected to be values from the ColourName column of the VehicleColours table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the ColourName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The ColourID from the VehicleColours table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="196" style="width: 12.1573%;">VIN Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="184" style="width: 10.9654%;">vin

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="211" style="background-color: rgb(171, 245, 209); width: 16.6865%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="215" style="width: 22.4069%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="643" style="width: 37.903%;">The Vehicle Identification Number (VIN) of the vehicle.

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

##### <span style="text-decoration: underline;">Permits Table</span>

<table data-autosize="false" data-layout="default" data-number-column="false" data-table-local-id="c7e33b53-275e-44bf-93ca-43411a4730df" data-table-width="1458" id="bkmrk-column-name-internal-3" style="width: 100%;"><tbody><tr><th class="pm-table-header-content-wrap" data-colwidth="182" style="width: 10.4887%;">**Column Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="198" style="width: 11.5614%;">**Internal Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="193" style="width: 16.3285%;">**Requirement**

</th><th class="pm-table-header-content-wrap" data-colwidth="234" style="width: 18.9516%;">**Type**

</th><th class="pm-table-header-content-wrap" data-colwidth="646" style="width: 42.6698%;">**Description**

</th></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="182" style="width: 10.4887%;">Permit Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="198" style="width: 11.5614%;">PermitNo

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="193" style="background-color: rgb(255, 189, 173); width: 16.3285%;">Unique ID

- Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="234" style="width: 18.9516%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="646" style="width: 42.6698%;">This field is the first primary identifier. Both it and LotNameID must be provided to create a new permit

This value identifies the permit as a unique record and is required to import a record.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="182" style="width: 10.4887%;">Lot Name (Long)

</td><td class="pm-table-cell-content-wrap" data-colwidth="198" style="width: 11.5614%;">LotNameID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="193" style="background-color: rgb(255, 189, 173); width: 16.3285%;">Unique ID

- Required

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="234" style="background-color: rgb(230, 252, 255); width: 18.9516%;">Foreign Key

- LotNames Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="646" style="width: 42.6698%;">The long name of the lot associated with the permit. Attaches to the LotNames table.

This field is the second primary identifier. Both it and PermitNo must be provided to create a new permit.

This value identifies the permit as a unique record and is required to import a record.

The values supplied by the user in the uploaded file are expected to be values from the LotName column of the LotNames table, as these are the values that will be matched against. These are the long form version of the lot name, and not the lot short name.

The values in the uploaded file must be an exact match to the values in the LotName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The LotNameID from the LotNames table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="182" style="width: 10.4887%;">Visible

</td><td class="pm-table-cell-content-wrap" data-colwidth="198" style="width: 11.5614%;">visible

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="193" style="background-color: rgb(171, 245, 209); width: 16.3285%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="234" style="width: 18.9516%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="646" style="width: 42.6698%;">Indicates whether the permit is visible or not.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="182" style="width: 10.4887%;">Permit Status

</td><td class="pm-table-cell-content-wrap" data-colwidth="198" style="width: 11.5614%;">status

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="193" style="background-color: rgb(171, 245, 209); width: 16.3285%;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="234" style="width: 18.9516%;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="646" style="width: 42.6698%;">The status of the permit.

</td></tr><tr><td class="pm-table-cell-content-wrap" data-colwidth="182" style="width: 10.4887%;">Permit State

</td><td class="pm-table-cell-content-wrap" data-colwidth="198" style="width: 11.5614%;">StateID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="193" style="background-color: rgb(171, 245, 209); width: 16.3285%;">Optional

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="234" style="background-color: rgb(230, 252, 255); width: 18.9516%;">Foreign Key

- PermitState Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="646" style="width: 42.6698%;">The state of the permit.

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

##### <span style="text-decoration: underline;">Violations Table</span>

<table data-autosize="false" data-layout="default" data-number-column="false" data-table-local-id="cce3a9a6-5070-476c-ac34-1d78e73c0615" data-table-width="1452" id="bkmrk-column-name-internal-4" style="width: 100%; height: 1402.77px;"><tbody><tr style="height: 46.5938px;"><th class="pm-table-header-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 46.5938px;">**Column Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 46.5938px;">**Internal Name**

</th><th class="pm-table-header-content-wrap" data-colwidth="197" style="width: 17.0441%; height: 46.5938px;">**Requirement**

</th><th class="pm-table-header-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 46.5938px;">**Type**

</th><th class="pm-table-header-content-wrap" data-colwidth="647" style="width: 36.83%; height: 46.5938px;">**Description**

</th></tr><tr style="height: 80.1875px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 80.1875px;">Ticket Number

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 80.1875px;">Ticket

</td><td class="pm-table-cell-content-wrap" data-cell-background="#ffbdad" data-colwidth="197" style="background-color: rgb(255, 189, 173); width: 17.0441%; height: 80.1875px;">Unique ID

- Required

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 80.1875px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 80.1875px;">The unique identifier for the violation.

This value identifies the violation as a unique record and is required to import a record.

</td></tr><tr style="height: 315.344px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 315.344px;">Licence Plate

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 315.344px;">VehicleID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 315.344px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="230" style="background-color: rgb(230, 252, 255); width: 22.5264%; height: 315.344px;">Foreign Key

- Vehicle Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 315.344px;">The license plate number of the associated vehicle. Attaches to the Vehicle table.

The values supplied by the user in the uploaded file are expected to be values from the Plate column of the Vehicle table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the Plate column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The VehicleID from the Vehicle table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr style="height: 348.938px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 348.938px;">Ticket Type Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 348.938px;">TicketType

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 348.938px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="230" style="background-color: rgb(230, 252, 255); width: 22.5264%; height: 348.938px;">Foreign Key

- TicketCategory Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 348.938px;">The type of the ticket. Attaches to the TicketCategory table.

The values supplied by the user in the uploaded file are expected to be values from the TicketTypeName column of the TicketCategory table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the TicketTypeName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The TicketTypeID from the TicketCategory table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

</td></tr><tr style="height: 46.5938px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 46.5938px;">Fine Amount

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 46.5938px;">Fine

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 46.5938px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 46.5938px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 46.5938px;">The amount of fine associated with the ticket.

</td></tr><tr style="height: 46.5938px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 46.5938px;">Towing Amount

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 46.5938px;">Towing

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="197" style="background-color: rgb(171, 245, 209); width: 17.0441%; height: 46.5938px;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 46.5938px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 46.5938px;">The amount of towing charges associated with the ticket.

</td></tr><tr style="height: 46.5938px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 46.5938px;">Tax Amount

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 46.5938px;">taxAmount

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="197" style="background-color: rgb(171, 245, 209); width: 17.0441%; height: 46.5938px;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 46.5938px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 46.5938px;">The amount of tax associated with the ticket.

</td></tr><tr style="height: 29.7969px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 29.7969px;">Issued Date

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 29.7969px;">Issued

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 29.7969px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 29.7969px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 29.7969px;">The date the ticket was issued.

</td></tr><tr style="height: 29.7969px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 29.7969px;">Due Date

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 29.7969px;">Due

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 29.7969px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 29.7969px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 29.7969px;">The due date for payment of the ticket.

</td></tr><tr style="height: 46.5938px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 46.5938px;">Ticket Writer

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 46.5938px;">Writer

</td><td class="pm-table-cell-content-wrap" data-cell-background="#abf5d1" data-colwidth="197" style="background-color: rgb(171, 245, 209); width: 17.0441%; height: 46.5938px;">Optional

</td><td class="pm-table-cell-content-wrap" data-colwidth="230" style="width: 22.5264%; height: 46.5938px;">Standard

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 46.5938px;">The admin who wrote the ticket.

</td></tr><tr style="height: 365.734px;"><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 10.7271%; height: 365.734px;">Violation Location Name

</td><td class="pm-table-cell-content-wrap" data-colwidth="188" style="width: 12.8725%; height: 365.734px;">LocationID

</td><td class="pm-table-cell-content-wrap" data-cell-background="#fffae6" data-colwidth="197" style="background-color: rgb(255, 250, 230); width: 17.0441%; height: 365.734px;">Recommended

</td><td class="pm-table-cell-content-wrap" data-cell-background="#e6fcff" data-colwidth="230" style="background-color: rgb(230, 252, 255); width: 22.5264%; height: 365.734px;">Foreign Key

- OffenceLocations Table

</td><td class="pm-table-cell-content-wrap" data-colwidth="647" style="width: 36.83%; height: 365.734px;">The name of the location where the violation occurred. Attaches to the OffenceLocations table.

The values supplied by the user in the uploaded file are expected to be values from the LocationName column of the OffenceLocations table, as these are the values that will be matched against.

The values in the uploaded file must be an exact match to the values in the LocationName column, matching the capitalization, spelling, and spacing exactly, or else it won’t be counted as a match.

The LocationID from the OffenceLocations table matching the name will inserted into the record in the base table. The value will be left blank in the imported record if no matches are found.

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

---

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

- <span style="color: rgb(22, 145, 121);">**Exact Matches for Foreign Keys**: For all `Foreign Key` type columns, the values in your CSV file **must** be an exact match (including capitalization, spelling, and spacing) to the corresponding `Name` column in the referenced OPSCOM table (e.g., `TypeName`, `ProvName`, `MakeName`, `LocationName`). Any mismatch will result in a blank or `Null` value in the imported record.</span>
- <span style="color: rgb(22, 145, 121);">**Prioritize Unique ID and Recommended Fields**: While optional fields offer additional detail, ensure all **Unique ID** fields are present and accurate, and **Recommended** fields are populated for maximum utility of the imported records.</span>
- <span style="color: rgb(22, 145, 121);">**Pre-Populate Reference Tables**: Before importing data that relies on foreign keys (e.g., Vehicles relying on Plate Types or Makes), ensure the corresponding reference tables (**VehiclePlateType**, **VehicleMake**, etc.) are already populated in OPSCOM with all the necessary values. This prevents `Null` values in your imported data.</span>
- <span style="color: rgb(22, 145, 121);">**Data Consistency**: Maintain consistent formatting for dates, phone numbers, and other standard fields within your CSV to avoid import errors.</span>
- <span style="color: rgb(22, 145, 121);">**Test with Small Batches**: For large imports, consider testing with a small batch of records first to verify that your column matching and data formatting are correct before importing the entire dataset.</span>

# Create or Refresh a Preview Space

<p class="callout info">Preview Spaces in OPSCOM provide clients and support staff with a secure, isolated testing environment that mirrors your live production system's data. These spaces are invaluable for testing new features, staging changes, or conducting training without impacting your operational system, ensuring a safe sandbox for development and learning.</p>


### Setup &amp; Configuration

Preview spaces are typically created on demand. Your production/live OPSCOM system is used to either create a new preview space or refresh an existing one with current or historical data.

##### <span style="text-decoration: underline;">Creating or Refreshing a Preview Space</span>

1. Click **Tools,** then **Database to Preview**.

From this page, you have two options for refreshing your preview database:

- **For Up-to-Date Information**: 
    1. Select **Backup Production Database**.
    2. Wait for the backup process to complete.
    3. Click the **Refresh Preview Database** button.
- **For an Older Backup**: 
    1. Select the specific date of the backup you wish to restore the preview database to.
    2. Click the **Refresh Preview Database** button.

<p class="callout warning">It may take a few minutes to refresh the database. Generally, a database is refreshed in 1-2 minutes, but it can take up to 15 minutes depending on the size of your database. A message will be displayed along the top of the screen notifying you when the database refresh is complete.</p>

Once the preview database has been refreshed, your preview system will automatically be created or updated. You can access the preview system by adding ".preview" before "OPSCOM.com" in your browser's address bar. For example, if your production space is `https://tomahawku.OPSCOM.com`, your preview space will be `https://tomahawku.preview.OPSCOM.com`.

---

### Using this Feature

##### <span style="text-decoration: underline;">Accessing Your Preview Space</span>

As an OPSCOM client, you can access your preview space directly by simply adding the ".preview." suffix to your subdomain name. For instance, if your production site is located at `https://yourorganization.OPSCOM.com`, your preview space can be found at `https://yourorganization.preview.OPSCOM.com`.

##### <span style="text-decoration: underline;">Preview Space Banner</span>

To clearly distinguish a preview space from a live production system, all preview spaces are denoted with an **amber warning banner** displayed prominently at the top of the page.

##### <span style="text-decoration: underline;">Locking and Unlocking Database Reset Option</span>

You can now lock and unlock preview and development OPSCOM databases to prevent them from being reset or refreshed accidentally.

1. On your preview site, click **Tools**, then **Reset Database**.
2. Toggle the lock/unlock setting as needed. 
    - You will be prompted to provide a **reason** for locking or unlocking the database.
    - A history of the previous 10 lock/unlock actions will be displayed below for your reference.

This feature allows you to ensure that if you are actively working on a preview/development system and do **NOT** wish for your changes to be reset or lost, you can place a lock. This lock notifies others attempting to refresh the database that a reset is not desired.

---

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

- <span style="color: rgb(22, 145, 121);">**Testing and Training Benefits**: Preview spaces are extremely useful for testing and training purposes. They allow you to work with a copy of your live database, providing real data for exercises without any risk of affecting your production system. The database can be manually reset at any time, allowing you to "erase" training data and start testing scenarios from scratch.</span>
- <span style="color: rgb(22, 145, 121);">**Daily Data Backups**: Production/live data is backed up daily at **2 AM EST** and is available to push to the testing environment at any time. This means if you perform a refresh of your preview site, it will pull data captured the night before. This operation is specifically for providing relevant data for testing and preview during training or similar efforts and is separate from normal system backup procedures.</span>
- <span style="color: rgb(22, 145, 121);">**Automatic Deletion of Inactive Spaces**: Preview sites are automatically deleted after **7 days of no login activity**.</span>
    - <span style="color: rgb(22, 145, 121);">If you require a preview site for an extended period, please contact OPSCOM support staff, and an expiry date can be set.</span>
- <span style="color: rgb(22, 145, 121);">**Email Notifications are Suppressed**: No Emails Sent from Preview/Testing - All email notifications that would normally be sent from the server are captured and suppressed in preview/testing environments. Therefore, any email notifications generated within your preview space will **not** reach clients or external recipients. This is a deliberate security measure to prevent accidental communication from a non-production environment.</span>

# Resolve Duplicate Options

<p class="callout info">The **Resolve Duplicates** feature in OPSCOM allows administrators to identify and merge duplicates by email, student number, staff number and vehicle (plate) in the system. This is crucial for maintaining data accuracy, preventing operational errors, and ensuring that enforcement and permit management processes are based on clean, unique vehicle data. This article focuses on resolving duplicates by vehicle, however, the concept is the same for other data types.</p>

1. Click on **Tools**, hover over **Resolve Duplicates**, then click **By Vehicle.**

---

### Using this Feature

On the **Resolve Duplicates By Vehicle** page, you will be presented with options to define the criteria for identifying potential duplicate vehicle records.

##### <span style="text-decoration: underline;">Duplicate Identification Options</span>

There are two choices to generate a list of potential duplicates:

**Strict Duplicate**

<p class="callout info">**Purpose**: This option generates a list of vehicles where all three primary unique identifiers are **identical.** This is for finding exact, unambiguous duplicates. Unique identifiers are:</p>

- **Plate**
- **State/Province**
- **Plate Type**

**Include Different Plate Types**

<p class="callout info">**Purpose**: This option generates a list of vehicles where the **Plate** and **State/Province** are identical, but the **Plate Type** may differ. This is particularly useful for identifying potential input errors where a vehicle might have been entered twice with the correct plate and province, but an incorrect or unspecified plate type was initially used.</p>

**Example**: If a vehicle is a beige BMW sports car with plate **ABC123**, province **Ontario**, and an **unspecified** Plate Type, but there's another record for a beige BMW sports car with plate **ABC123**, province **Ontario**, and Plate Type **Passenger**, it is highly probable that these are the same vehicle entered as a duplicate. Comparing the vehicle description (make, model, color) can help confirm such cases.

##### <span style="text-decoration: underline;">Resolving Duplicates</span>

Once a list of potential duplicates is generated based on your chosen criteria:

1. Review the list carefully, paying close attention to vehicle descriptions and other details to confirm actual duplicates.
2. For each pair of duplicate records you wish to merge, click the **Merge** button provided next to the entries.
3. Clicking **Merge** will take you to the merge function window, where you can select which information to retain from the duplicate records and then finalize the merge.

[![2024-08-13_14-41-29.png](https://opscom.wiki/uploads/images/gallery/2024-08/2024-08-13-14-41-29.png)](https://opscom.wiki/uploads/images/gallery/2024-06/UZrimage.png)

---

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

- <span style="color: rgb(22, 145, 121);">**Core Vehicle Identification**: In OPSCOM, vehicles are uniquely identified by three key pieces of information: **License Plate**, **Province / State**, and **Plate Type**. All three details are essential for a vehicle to be considered unique within the system (e.g., "ABC123" could be a passenger plate and also a commercial plate in the same province, requiring the plate type for distinction).</span>
- <span style="color: rgb(22, 145, 121);">**Careful Review**: Always thoroughly review potential duplicates before merging. Merging incorrect records can lead to data loss or inaccuracies.</span>
- <span style="color: rgb(22, 145, 121);">**Common Reasons for Duplicates**: Be aware of common scenarios that lead to duplicates:</span>
    - <span style="color: rgb(22, 145, 121);">**Mismatched vehicle information** (e.g., slight variations in plate number or state entry).</span>
    - <span style="color: rgb(22, 145, 121);">**Incorrectly entered plate numbers** or manual data entry errors.</span>
    - <span style="color: rgb(22, 145, 121);">**Orphaned vehicles** that are not properly linked to a user profile.</span>
    - <span style="color: rgb(22, 145, 121);">**Orphaned violations** that should be associated with a specific vehicle but are linked to a duplicate record.</span>
- <span style="color: rgb(22, 145, 121);">**Proactive Data Entry (Prevention)**: The more information included when adding a vehicle to the system, the better. Providing additional details helps the system recognize potential duplicates and reduces errors. In addition to the three key identifiers, it is highly recommended to include:</span>
    - <span style="color: rgb(22, 145, 121);">**Vehicle Colour**</span>
    - <span style="color: rgb(22, 145, 121);">**Vehicle Make**</span>
    - <span style="color: rgb(22, 145, 121);">**Vehicle Model**</span>
    - <span style="color: rgb(22, 145, 121);">**Vehicle Year** These details help to clearly identify specific vehicles and ensure they are properly recorded.</span>
- <span style="color: rgb(22, 145, 121);">**Data Retention**: When merging, OPSCOM typically allows you to select which data fields from the duplicate records you wish to preserve. Ensure you retain the most accurate and complete information.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Maintenance**: Periodically run the **Resolve Duplicates** report to maintain a clean and accurate vehicle database, especially after periods of high user registration or manual data entry. **Duplicate vehicles can cause significant confusion, especially when multiple drivers are associated with the same vehicle, impacting permit management and enforcement accuracy.**</span>
- <span style="color: rgb(22, 145, 121);">**User Training**: If duplicate entries are a recurring issue, consider reviewing user training or data entry procedures to minimize future occurrences.</span>

# History Search

<p class="callout info">The **History Search** feature in OPSCOM allows administrators to quickly locate and review historical system activities and events. This tool is invaluable for auditing, troubleshooting, and investigating specific actions related to users, vehicles, or violations, providing a comprehensive log of system interactions.</p>

### Using this Feature

1\. Click **Tools**, then **History Search.** The **History Dump** page will be displayed.

You can search using a single identifier or a combination of them to narrow down your results.

##### <span style="text-decoration: underline;">Available Search Criteria</span>

- **Student/Employee Number**: Enter the identification number associated with a student or employee.
- **Violation Ticket**: Enter the specific number of a violation ticket.
- **History Description**: Enter keywords or phrases from the description of the historical event. This field allows for broad searches based on the recorded action.

##### <span style="text-decoration: underline;">Steps to Perform a History Search</span>

1. On the **History Dump** page, enter your desired search criteria into one or more of the available fields (e.g., enter a specific **Violation Ticket** number, as shown in the example) and click **Submit**.
2. All OPSCOM history records that match your entered search criteria will be displayed.

---

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

- <span style="color: rgb(22, 145, 121);">**Combine Criteria for Precision**: To achieve more accurate and manageable results, especially in systems with extensive history logs, combine search criteria (e.g., a **Student/Employee Number** along with a specific **History Description** keyword).</span>
- <span style="color: rgb(22, 145, 121);">**Broad vs. Specific Searches**: Start with specific criteria if you know exactly what you're looking for. If you're unsure, use broader terms in the **History Description** field and then refine your search if needed.</span>
- <span style="color: rgb(22, 145, 121);">**Auditing and Troubleshooting**: This tool is excellent for auditing user actions, tracking changes, and troubleshooting issues by reviewing the sequence of events.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Use**: Familiarize yourself with this feature for daily operations, as it can quickly answer questions about past system interactions without needing to navigate through multiple individual records.</span>

# Purge Old - Explained

<p class="callout info">The **Purge Old Data** feature in OPSCOM allows administrators to remove inactive historical records from the system. This process is essential for maintaining database efficiency, improving system performance, and ensuring that your data remains relevant and manageable by automatically archiving or deleting old, unused information. The only records that will be purged are ones that have not had any activity associated with them for more than 7 years.</p>

---

### Using this Feature

1\. Click **Tools**, then **Purge Old Data**.

When you click **Purge Old Data**, the system initiates a process to identify records that meet the purging criteria.

1. Upon activation, a **progress bar** will appear, indicating the number of records being identified for potential purging. The system compiles a list of any user activity and associated record updates that have occurred within the **last seven years**.
2. The compiled "activity list" determines which data to **exclude** from the purge. The script then proceeds to purge any data that is *not* on this active list.
3. To complete the process and execute the purge, click **Purge these records**.

<p class="callout warning">An important business rule is that any small update or activity on a record will "restart" its 7-year clock, meaning the record will then be excluded from purging for another seven years from that last activity date.</p>

### What Gets Purged?

The following record types will be purged if they have had **no activity in the last 7 years**:

- **User profiles**
- **Vehicles**
- **Violations**
- **Permits**
- **Appeals**
- **Temp Permits**
- **Payments**
- **Lockers**
- **Access Cards**
- **Gate Events**
- **Refunds**
- **Waitlist Records**
- **User History**

### What Does NOT Get Purged?

The following record types will **NOT** be purged, regardless of their last updated date, ensuring the retention of critical historical and incident-related information:

- **Incident Users**
- **Contact History**

---

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

- <span style="color: rgb(22, 145, 121);">**Understand the 7-Year Rule**: Remember that any interaction or update restarts the 7-year inactivity clock for a record. This ensures that records with recent activity, even minor, are preserved.</span>
- <span style="color: rgb(22, 145, 121);">**Performance Benefits**: Regularly purging old data can significantly improve system performance by reducing database size and speeding up searches and reports.</span>
- <span style="color: rgb(22, 145, 121);">**Data Retention Policies**: Ensure this purge process aligns with your organization's data retention policies and legal compliance requirements.</span>
- <span style="color: rgb(22, 145, 121);">**Historical Context**: Be aware that while purged records are removed, essential incident and contact history data remains for long-term reference.</span>
- <span style="color: rgb(22, 145, 121);">**Schedule Appropriately**: Consider running this purge during off-peak hours to minimize any potential impact on system users, although the process is designed to be efficient.</span>

# Purging Incidents

<p class="callout info">The ability to purge incidents from OPSCOM allows administrators to permanently remove outdated incident records from the system. This process is critical for maintaining data relevance, complying with data retention policies, and optimizing database performance. This article outlines the two methods for incident purging: individual deletion via incident search and bulk deletion using the Purge Incidents tool.</p>

### Setup &amp; Configuration

To enable incident purging capabilities for an administrator, specific permissions must be granted.

- You must add the **Delete Incidents** permission to the specific administrator roles or individual administrators who require the ability to purge incident records. Consult your system administrator or the [User Roles and Permissions wiki article](https://opscom.wiki/books/setup-configuration-for-admins/page/manage-roles-and-permissions) for details on modifying permissions.

---

### Using this Feature

There are two primary methods for purging incidents in OPSCOM: individually through the **Incident Search**, or in bulk using the **Purge Incidents** tool.

##### <span style="text-decoration: underline;">Method 1: Using the Delete Incident Button (Individual Purge)</span>

This method allows for the deletion of a specific incident after searching for it.

1. **Search** for the incident you wish to purge using the standard Incident Search functionality.
2. Once the incident details are displayed, observe the **Delete Incident** button. 
    - The **Delete Incident** button will be **available** (active) only if the incident record is **older than 7 years**.
    - If the incident is **less than 7 years old**, the button will appear as **"Delete Not Available"** and will be greyed out, preventing deletion.
3. If the button is active, click the **Delete Incident** button.
4. Follow any subsequent prompts or confirmation messages to finalize the deletion of the incident.

##### Method 2: Using the Purge Incidents Tool (Bulk Purge)

This tool allows for searching and purging multiple incidents simultaneously based on specified criteria.

1. Click **Tools,** then **Purge Incidents**.
2. The **Search for Incidents to Purge** screen will be displayed.
3. **Enter your search criteria** into the available fields (e.g., date ranges, incident types, specific IDs). 
    - <p class="callout warning">The results displayed will be limited to the **oldest 300 records** that match your criteria.  
          
        **Note:** When entering a value for "Number of Instances," the search field functions as "greater than or equal to." Therefore, supplying "1" might still display incidents with more than one instance.</p>
4. Review the displayed list of incidents.
5. Enable the **Delete** checkbox next to each incident you wish to purge.
6. Click the **Purge Records** button.
7. A confirmation prompt will display. Click the **Delete** button within this prompt to confirm the action.

---

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

- <span style="color: rgb(22, 145, 121);">**Irreversible Action**:</span>
    - <span style="color: rgb(22, 145, 121);">**Warning**: Purging incidents is a **permanent and irreversible action**. Once an incident is purged, its data cannot be recovered. Exercise extreme caution and verify your selections before proceeding.</span>
- <span style="color: rgb(22, 145, 121);">**7-Year Retention Rule**: Be aware of the system's built-in 7-year data retention policy for incidents. Incidents cannot be purged using the individual button method if they are newer than 7 years. The bulk purge tool will also primarily display older records.</span>
- <span style="color: rgb(22, 145, 121);">**Permissions Management**: Carefully manage the **Delete Incidents** permission, granting it only to trusted administrators who understand the irreversible nature of the action.</span>
- <span style="color: rgb(22, 145, 121);">**Audit Trail**: While the incident record itself is purged, ensure your organization has an appropriate audit trail or backup strategy if long-term historical access to all incident data is required for compliance or other purposes.</span>
- <span style="color: rgb(22, 145, 121);">**Pre-Purge Review**: Before using the **Purge Incidents Tool**, it is highly recommended to perform a thorough review of the search results and selected incidents to ensure no critical data is inadvertently removed.</span>

# Handheld Devices and Commons

<p class="callout info">The **Handhelds Devices** section in OPSCOM allows administrators to manage and configure handheld devices used for enforcement and data collection. This includes registering new devices, pushing messages, and updating device settings, ensuring seamless operation for field personnel and accurate data synchronization.</p>

[Refer to this wiki article for more information.](https://opscom.wiki/books/setup-configuration-for-admins/page/handhelds-devices-settings-handheld-commons)

# Managing Recurring and Onetime System Tasks

<p class="callout info">OPSCOM utilizes both recurring and onetime system tasks to automate various back-end processes, such as data synchronization, report generation, or system clean-up. This article guides OPSCOM administrators on how to access, monitor, enable, and disable these critical system tasks, ensuring efficient operation and maintenance of the OPSCOM environment.</p>

### Accessing System Tasks

1. Click **Tools (the Toolbox),** then click **View System Task Logs.**
2. On the **Scheduled Tasks** page, there are two sections, Recurring tasks and Onetime tasks. From this screen we can see stats on when the task has run and how long it took to run. We can also enable or disable tasks from running.

The **Scheduled Tasks** page is divided into two main sections: **Recurring tasks** and **Onetime tasks**. For each task listed, administrators can view its status, statistics, and manage its execution.

##### <span style="text-decoration: underline;">Key Information Displayed</span> 

- **Task Name**: The name of the system task.
- **Last Run**: The timestamp of the last time the task was executed.
- **Next Run**: The scheduled timestamp for the next execution of the task.
- **Average Duration**: The average time it takes for the task to complete its execution.
- **Enabled Status**: Indicates whether the task is currently active and configured to run.

##### <span style="text-decoration: underline;">Available Actions &amp; Buttons</span>

- **Enabled Checkbox**: 
    - Click the **Enabled** checkbox next to any task to **toggle** its status.
    - **Enable** (check the box) a task to allow it to run according to its schedule.
    - **Disable** (uncheck the box) a task to prevent it from running.
- **Logs Button**: 
    - Click the **Logs** button for any task to view a pop-up window.
    - This window provides detailed information and historical logs about the task's past executions, including success/failure status and specific output.

<p class="callout warning">Please be aware, there are other settings that may be important to set correctly before enabling any system task.</p>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/xTEimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/xTEimage.png)

---

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

- <span style="color: rgb(22, 145, 121);">**Monitor Task Logs Regularly**: Periodically review the **Logs** for critical system tasks to ensure they are running successfully and completing without errors. This helps in proactive identification and resolution of potential issues.</span>
- <span style="color: rgb(22, 145, 121);">**Understand Task Impact**: Familiarize yourself with the purpose and function of each system task before enabling or disabling it, as they can affect data integrity, system performance, or automated processes.</span>
- <span style="color: rgb(22, 145, 121);">**Scheduled Maintenance**: Coordinate the scheduling of onetime tasks with periods of low system activity to minimize any potential impact on user experience.</span>

# Admin Management Tools

Accessed from the System Configuration menu, this is where you create/edit roles and permission as well as Admin User Accounts.

# Manage Roles and Permissions

<p class="callout info">**Roles and Permissions** in OPSCOM provide granular control over what administrative users can access and do within the system. This feature allows administrators to define specific responsibilities, enhance security, and ensure that each user has appropriate access levels, streamlining operations and maintaining data integrity.</p>

### Using this Feature

1. Click **System Configuration,** then **Admin Management,** and click **Manage Roles.**

##### <span style="text-decoration: underline;">Creating and Managing Roles</span>

Roles are central to the permissions system, acting as templates for sets of permissions.

1. The **Manage Administrator Roles** page will display. The **System Administrator** (Primary) role is pre-defined and allows you to create new roles and assign them to other admin users.
2. To create a new role, click the **Add New Role** button at the bottom of the page.
3. Enter a descriptive **Role Name** and a **Description** for that role. 
    - The description will appear as a rollover tooltip when you mouse over the **Edit Role** button for that role.
4. Click **Save Role** to save your new role.  
      
    [![FVUimage.png](https://opscom.wiki/uploads/images/gallery/2025-06/scaled-1680-/fvuimage.png)](https://opscom.wiki/uploads/images/gallery/2025-06/fvuimage.png)

##### <span style="text-decoration: underline;">Editing Existing Roles</span>

You can modify the name and description of any role (except the **System Administrator** role).

1. On the **Manage Administrator Roles** screen, click the **Edit Role** button next to the role you wish to update.
2. Make your desired changes to the **Role Name** and/or **Description**.
3. Click **Save Role** to save your edits.

##### <span style="text-decoration: underline;">Assigning Permissions to a Role</span>

Once a role is created, you'll define what actions users assigned to that role can perform by setting its permissions. [Refer to this article for more detailed Permissions information.](https://opscom.wiki/books/adminstrators-setup-configuration/page/permissions-in-OPSCOM)

1. On the **Manage Administrator Roles** screen, click the **Permissions** button next to the role you want to configure. The **Editing Permissions** screen will display.
2. The top bar displays various icons, mirroring the OPSCOM menu structure. The number next to each icon indicates how many permissions within that category have been selected for the current role.
3. Click an icon (e.g., a "Permit" icon, a "Violations" icon) to display the specific permissions available within that category.
4. To grant a permission, enable the checkbox next to that permission's name.
5. Once you have navigated through each icon and selected all the necessary permissions for the role, click **Save Permissions**. The role, with its defined permissions, is now created and ready for assignment.

##### <span style="text-decoration: underline;">Assigning Roles to Admin Users</span>

After roles are defined, you can assign them to your administrative users.

1. Click **System Configuration,** then **Admin Management,** and click **Edit Admin Users**. The **Manage Active Administrators** page will display.
2. Select an existing user you wish to modify, or choose to create a new user.
3. On the left side of the screen, add or confirm the **User Information** (e.g., name, email).
4. On the right side, select the role(s) you wish to apply to that user from the available options.
5. You can also add a **Comment** for any relevant notes about the user's role or status.
6. Click **Update User** when you have finished making your changes.

---

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

- <span style="color: rgb(22, 145, 121);">**Principle of Least Privilege**: Always adhere to the principle of least privilege. Grant users only the permissions absolutely necessary for them to perform their job functions. This minimizes security risks and potential for accidental errors.</span>
- <span style="color: rgb(22, 145, 121);">**Role-Based Access Control**: Utilize roles to manage permissions efficiently. Instead of assigning individual permissions to each user, create roles (e.g., "Enforcement Officer," "Permit Manager," "Finance Admin") and assign users to those roles. This simplifies onboarding, offboarding, and auditing.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Role Descriptions**: Use the role description field to clearly state the purpose of the role and the types of permissions it encompasses. This helps administrators understand what each role is intended for.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Review**: Periodically review your defined roles and user assignments to ensure they remain appropriate as job responsibilities change or staff join/leave your organization.</span>
- <span style="color: rgb(22, 145, 121);">**Test New Roles**: Before deploying a new role to active users, test it with a test administrator account to confirm that the assigned permissions function as expected and do not inadvertently grant too much or too little access.</span>

# Manage Administrator Groups

<p class="callout info">**Administrator Groups** in OPSCOM allow you to organize administrative users into logical teams or departments. This feature simplifies management by enabling you to apply specific settings, distribute communications, or assign tasks to a collective of administrators rather than managing each user individually, enhancing organizational efficiency and control.</p>

### Using this Feature

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-navigate-to-system-c"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-123 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-123"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **System Configuration,** then **Admin Management,** and click **Manage Groups**.

</div></div></div></div></div></div></div></div>You'll be directed to the **Manage Administrator Groups** page, which lists all existing groups. Initially, this page may be empty if no groups have been created yet.

##### <span style="text-decoration: underline;">Creating a New Administrator Group</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-on-the-admin-groups-"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-123 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-123"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add New**.
2. The **Adding New Group** form will appear where you can define your group.
3. Fill out the required information for the group, such as the **Group Name**.
4. Click **Save Group** to finalize the creation.

</div></div></div></div></div></div></div></div>Once saved, your newly created group will appear in the list on the left-hand side of the page.

##### <span style="text-decoration: underline;">Working with Groups</span>

After creating groups, you can perform various management actions. While the provided content focuses on creation, typical group management also involves:

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-editing-group-detail"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-123 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-123"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Editing Group Details**: You can usually click on a group's name or an **Edit** button next to it to modify its name or other associated settings.
- **Assigning Administrators to Groups**: Administrators are assigned to groups through their individual user profiles. 
    1. Navigate to **System Configuration,** then **Admin Management**.
    2. Click **Edit Admin Users**.
    3. Select the desired administrator.
    4. Within their profile settings, you'll find an option to assign them to one or more **Admin Groups**.
- **Deleting Groups**: Most systems allow you to delete groups that are no longer needed, often with a confirmation prompt. Be aware that deleting a group might impact any administrators or settings associated with it.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-logical-organization"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-logical-organization-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-123 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-123"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-123"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-logical-organization-2">- <span style="color: rgb(22, 145, 121);">**Logical Organization**: Create groups that reflect your organizational structure (e.g., "Enforcement Team," "Permit Office Staff," "IT Support"). This makes it easier to manage permissions, communicate, and assign responsibilities.</span>
- <span style="color: rgb(22, 145, 121);">**Streamlined Management**: Using groups simplifies tasks like sending system-wide messages or applying default settings, as you can target a group rather than selecting individual administrators.</span>
- <span style="color: rgb(22, 145, 121);">**Clarity in Naming**: Use clear and concise names for your groups to avoid confusion among administrators.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Review**: Periodically review your Administrator Groups to ensure they remain relevant and accurately reflect your team's structure and needs. Remove any outdated or unused groups to maintain a clean system.</span>

</div></div></div></div></div></div></div></div>

# Manage Admin User Accounts

<p class="callout info">Creating and managing administrator accounts in OPSCOM is essential for granting system access to staff, defining their responsibilities through roles, and maintaining secure and accurate user records. This article guides OPSCOM administrators through the process of creating new admin accounts, editing existing ones, resetting passwords, and disabling accounts as needed.</p>

### Using this Feature  


1. Hover over **System Configuration,** click **Admin Management,** then **Edit Admin Users**. The **Manage Active Administrators** screen displays, providing options for both new user creation and existing user modification.

##### <span style="text-decoration: underline;">Creating a New Admin Account</span>

1. On the **Manage Active Administrators** screen, select **+ Create New Admin**.
2. The screen will display the **Create New Administrator** form divided into two sections: 
    - On the left, you will **enter the user information** for the new administrator (e.g., username, first name, last name, email, and initial password).
    - On the right, in the **Active Roles** form, you will **select the admin role(s)** this person will be granted. For more information about Roles and Permissions [refer to this wiki article](https://opscom.wiki/books/setup-configuration-for-admins/page/manage-roles-and-permissions).
3. Once all information is entered and roles are selected, click **Insert New User** to add the admin account to the system.

<p class="callout warning">Multi-factor Authentication (MFA) is now **required** when creating an Admin account. After the account is created, it must first be accessed through the Admin portal before attempting to sign in on a handheld device. During the initial login, a One-Time Password (OTP) will be sent to the email associated with the new Admin account, and you will be prompted to reset the password. For more details, please refer to our <span style="color: rgb(35, 111, 161);">[MFA wiki article](https://opscom.wiki/books/the-opscom-admin-portal/page/enhanced-admin-security-multi-factor-authentication-mfa-with-operationscommander)</span>.  
</p>

##### <span style="text-decoration: underline;">Editing an Existing Admin Account</span>

1. On the **Manage Active Administrators** page, select the user you wish to modify.
2. You can now change any of the available options for that selected user, including their personal information, roles, and account status.
3. Click **Update User** when you are finished making your changes.

##### <span style="text-decoration: underline;">Viewing Login Activity</span>

- For any selected user, you can click the **Login Activity** button to view a log of when the administrator last logged into the OPSCOM system or a handheld device.
- Additional admin activity has been added on: 
    - Log out
    - New incident creation
    - Incident marked as opened
    - Incident marked as closed

##### <span style="text-decoration: underline;">Resetting an Admin's Password</span>

1. Locate the specific administrator's account.
2. In the **Password** field, enter a temporary password. The password is hidden (displayed as asterisks "\*\*\*\*\*\*\*\*\*\*"), but you can simply type over the existing symbols.
3. **Inform the admin of this temporary password.**
4. When the admin logs in using the temporary password, they will be prompted to update their password to a more secure, personal one.

##### <span style="text-decoration: underline;">Disabling an Admin Account</span>

Admin users cannot be permanently deleted from the system because their accounts are often linked to historical data (e.g., ticket issuance, system changes). If an admin user changes roles or leaves the organization, the best practice is to disable their account.

<p class="callout warning">**Important Reporting Note -** It is very important to leave the admin user's permissions in place even when disabling their account, as these permissions will still affect historical reporting (e.g., showing which permissions were active at the time certain actions were performed). Once the account is disabled, any existing permissions obviously cannot be actioned by that user, but they remain associated for reporting purposes.</p>

1. Hover over the **System Configuration** menu, click **Admin Management,** then **Edit Admin Users**.
2. Select the user's account you wish to disable (e.g., "jim\_daniels").
3. The user's profile will display. Locate the checkbox titled **Activate this account and allow system login**.
4. **Uncheck** this box to disable the account.
5. Click **Update User** to apply the change.

After disabling, the account will now appear on the **Manage Disabled Administrators** page, accessed by clicking on **View Disabled** on the **Manage Active Administrators** page.

<p class="callout info">This action can be reversed at any time by editing the user account and re-checking the **Activate this account and allow system login** checkbox.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Secure Initial Passwords**: When creating new accounts or resetting passwords, use strong, temporary passwords and instruct users to change them immediately upon first login.</span>
- <span style="color: rgb(22, 145, 121);">**Role-Based Access**: Always assign appropriate roles to admin users. Avoid giving **Primary Administrator** access unless absolutely necessary. Granular roles ensure users only have access to the functions they need.</span>
- <span style="color: rgb(22, 145, 121);">**Prompt Disabling**: Disable accounts promptly when an employee's role changes or they leave the organization. This is a critical security measure.</span>
- <span style="color: rgb(22, 145, 121);">**Audit Login Activity**: Regularly review the **Login Activity** for admin accounts to monitor for unusual patterns or unauthorized access attempts.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Documentation**: Maintain internal records of your admin accounts, their assigned roles, and any specific notes, especially for disabled accounts.</span>

---

### Related Video

<iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="4f89c267-ac4f-4257-92c9-2a13a09ad8c8" data-macro-name="widget" frameborder="0" height="395" src="https://www.youtube.com/embed/pKpDFhMcTXA?wmode=opaque" style="width: 790px; height: 395px;" width="790"></iframe>

<iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="3112f0db-7e8e-403e-bb30-e14476901429" data-macro-name="widget" frameborder="0" height="397" src="https://www.youtube.com/embed/VDg5pjzDc28?wmode=opaque" style="width: 794px; height: 397px;" width="794"></iframe>

# IP Filtering for Admin Users

<p class="callout info">IP Filtering in OPSCOM provides administrators with a robust security layer by restricting user access based on their device's IP (Internet Protocol) address. This feature enhances system security by ensuring that only authorized users from specified networks or devices can log in to OPSCOM, allowing for tailored access control according to individual roles and organizational security policies.</p>

### Setup &amp; Configuration

IP filtering configurations are managed within each administrator's user profile in OPSCOM.

##### <span style="text-decoration: underline;">What is an IP Address?</span>

An IP address is a unique numerical label assigned to each device connected to an IP network. It typically consists of four groups of numbers (octets), separated by dots (e.g., `192.168.1.1`).

- The **first two octets** generally identify the network your device is on.
- The **last two octets** further narrow the address down to a specific machine within that network.
- To find your current public IP address, you can visit a website like `whatismyip.net` or simply search "What is My IP" in Google.

To Configure IP Filtering in OPSCOM:

1. Hover over the **System Configuration,** then **Admin Management,** and click **Edit Admin Users**.
2. On the **Manage Active Administrators** page, select the specific user you wish to edit.
3. Locate the **Allowed IPs** field within the user's profile configuration. This is where you will enter the IP filtering rules.

[![2025-06-17_10-10-50.jpg](https://opscom.wiki/uploads/images/gallery/2025-06/2025-06-17-10-10-50.jpg)](https://opscom.wiki/uploads/images/gallery/2024-06/Ogbimage.png)

---

### Using this Feature

The **Allowed IPs** field in an admin user's profile controls their access to the OPSCOM system. The level of access can be precisely tailored:

#### Configuration Options for Allowed IP Addresses

##### <span style="text-decoration: underline;">Allow Access from Any Network (Least Restrictive)</span>

<p class="callout info">This is typically used for high-level managers or directors who require access from diverse locations (e.g., while traveling, from a home office, or an internet cafe).  
  
**Note:** In some cases, networks might be locked down or behind a firewall. Additional configuration on the part of your IT department may be required to allow external access.</p>

- **Configuration**: Enter a single **dot** (`.`) in the **Allowed IP Addresses** field.
- **Result**: The user will be able to log in from literally any network location, whether internal or external to your organization's specific network.

##### <span style="text-decoration: underline;">Restrict Access to a Specific Network</span>

<p class="callout info">This is ideal for regular office workers who primarily require access only from their designated office network.</p>

- **Configuration**: Enter the **first two octets** of the network's IP address (e.g., `10.32`).
- **Result**: The user can log in from any computer connected to that specific network, but will be restricted from accessing OPSCOM from any other network.

##### <span style="text-decoration: underline;">Restrict Access to a Specific Computer (Most Restrictive)</span>

<p class="callout info">This is suitable for part-time employees or student workers who are designated to use only one particular machine for OPSCOM access.</p>

- - **Configuration**: Enter the **full IP address** of the specific computer (e.g., `10.32.1.144`).
    - **Result**: The user can only log in to OPSCOM from that single, specified computer.

##### <span style="text-decoration: underline;">Allow Access from Multiple Specific Computers</span>

<p class="callout info">This is useful in office settings where an employee may use a few designated workstations.</p>

- - **Configuration**: Enter the **full IP address** of each allowed computer, placing each address on a **separate line** within the **Allowed IPs** field (e.g., `10.32.1.144` followed by `10.32.1.154` on the next line).
    - **Result**: The user can log in from any of the explicitly listed computers.

##### <span style="text-decoration: underline;">Allow Access from Multiple Specific Networks</span>

<p class="callout info">This is applicable for employees working out of multiple campus locations or different buildings within a municipal organization, each on a distinct local area network.</p>

- - **Configuration**: Enter the **first two octets** of each allowed network, placing each network segment on a **separate line** within the **Allowed IPs** field (e.g., `10.32` on one line and `10.40` on another).
    - **Result**: The user can log in from any computer on the specified networks.

#### Basic IP Filtering Rules Recap

- **Good Configurations**:
    
    
    - `.` - A single period to match all IP addresses (least restrictive).
    - `10.32` - A partial IP address to match all computers on a specific network.
    - `10.32.1.144` - A full IP address to match a specific computer (most restrictive).
- **Invalid Configurations**:
    
    
    - `10.*` - Wildcards (`*`) like this will **not** work.
    - `OPSCOM.com` - Domain names will **not** work; only numerical IP addresses are supported for filtering.

---

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

- <span style="color: rgb(22, 145, 121);">**Security vs. Flexibility**: Balance the need for security with the practical access requirements of your administrators. More restrictive settings (full IP) offer higher security but less flexibility.</span>
- <span style="color: rgb(22, 145, 121);">**Dynamic IPs**: Be aware that many internet service providers assign dynamic IP addresses that can change over time. If your administrators access OPSCOM from external locations with dynamic IPs, using a full IP filter will frequently require updates, making the "single dot" setting often more practical for such scenarios.</span>
- <span style="color: rgb(22, 145, 121);">**Internal Network Changes**: If your organization's internal network IP scheme changes, remember to update the **Allowed IPs** field for all affected administrators.</span>
- <span style="color: rgb(22, 145, 121);">**IPv6 Consideration**: When using IP filtering, it is generally recommended to enter your IPv6 IP address if your network primarily uses IPv6, as IPv4 addresses are becoming less common for external facing services.</span>
- <span style="color: rgb(22, 145, 121);">**IT Department Collaboration**: For complex network setups, especially involving firewalls or VPNs, collaborate with your IT department to ensure proper network configuration aligns with your OPSCOM IP filtering rules.</span>

# System Configuration

# Guide to System Settings

<p class="callout info">System Settings in OPSCOM provide administrators with comprehensive control over the core functionalities and behaviors of their application, primarily impacting the administrative side. This centralized configuration area allows for fine-tuning various components, from general system parameters and security protocols to specific module functionalities like parking, violations, and payments, ensuring the system operates according to organizational needs.</p>

1. Click **System Configuration**, then **System Settings** to access this area.
2. Explore the menus. Hovering over any menu item will explain with a tooltip what this setting controls.
3. Settings in <span style="color: rgb(53, 152, 219);">**Blue** </span>are read-only to Admins. Only a Tomahawk User can enable/disable this. For help with this contact <support@ops-com.com>.

<p class="callout warning">Only Admins that have the permission to **Manage System Configuration**, will see the System Settings. If they have that permission, they can edit any system setting available. </p>

---

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

- <span style="color: rgb(22, 145, 121);">**Review All Settings**: System settings are granular and cover many aspects of OPSCOM. Regularly review all components to ensure configurations align with your organization's current policies and operational needs.</span>
- <span style="color: rgb(22, 145, 121);">**Security Settings First**: Prioritize the configuration of **Security** component settings (e.g., password expiry, strength requirements, admin lockouts) to maintain a robust security posture for your admin accounts.</span>
- <span style="color: rgb(22, 145, 121);">**Email Configuration**: Ensure that all relevant email addresses (Default Notification Email, From Email, Appeal Notification Email, Automated Notification Email) are correctly set up to ensure timely system communications and alerts.</span>
- <span style="color: rgb(22, 145, 121);">**Time Zone Accuracy**: Correctly setting your **Time zone** and **Time offset** is critical for accurate timestamping of all system events, permits, and violations.</span>
- <span style="color: rgb(22, 145, 121);">**Impact of Toggles**: Be mindful that many settings are simple on/off toggles. Understand the full impact of enabling or disabling a module (e.g., "Enable Violations Module") or a specific feature before making changes.</span>
- <span style="color: rgb(22, 145, 121);">**Team Collaboration**: For settings that require OPSCOM Team access to change, communicate your needs clearly to support staff. For other settings, collaborate with your internal teams (IT, finance, enforcement) to ensure changes meet everyone's requirements.</span>
- <span style="color: rgb(22, 145, 121);">**Testing Changes**: For significant changes, especially those impacting user-side visibility or core workflows, consider testing in a [Preview Space](https://opscom.wiki/books/setup-configuration-for-admins/page/create-or-refresh-a-preview-space), before applying to your live production system.</span>

# New Page



# Configuring SAML SSO with OPSCOM

### What is Single Sign-On (SSO)

**Single Sign-On (SSO)** simplifies user access to OPSCOM by allowing them to authenticate using their existing, managed corporate accounts. This eliminates the need for separate OPSCOM usernames and passwords, enhancing convenience and security. This article details the setup and configuration of SAML-based SSO with OPSCOM, explaining the necessary fields, metadata exchange, and user synchronization. For more general information about SSO and OPSCOM [refer to this wiki article](https://opscom.wiki/books/customization-and-integration/page/single-sign-on-sso-and-operationscommander-what-do-you-need-to-consider).

### Prerequisites and Considerations

Implementing SSO with OPSCOM, specifically using SAML (Security Assertion Markup Language), requires coordination between your organization's Identity Provider (IdP) and OPSCOM as the Service Provider (SP).

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk-paid-feature%3A-sso-is"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Paid Feature**: SSO is a paid feature. You must have the setup fee and recurring fees negotiated before proceeding. Contact your Sales Representative or email <support@ops-com.com> to initiate this.
- <p class="callout warning">**Login Sources**: You must first [follow the instructions to set up Login Sources](https://opscom.wiki/books/setup-configuration-for-admins/page/login-sources-sso) within OPSCOM, as SSO will be configured as a specific login source.</p>
- **User Management Strategy**: Consider the following: 
    - Will you have different Login Sources (e.g., Students/Staff use SSO, but Public Users do not)?
    - Will login sources vary by user type?
    - How do you want to initially get your users into OPSCOM (e.g., pre-import vs. on-the-fly creation)?
    - Do you want users to be created automatically upon their first SSO login?
    - Do you want to keep user information synchronized with your Identity Provider regularly, or will it be a one-time import?
    - What user profile data/fields do you want synchronized between your SSO system and OPSCOM?
    - Can you take advantage of the UserPush APIs for proactive user synchronization?

</div></div></div></div></div></div></div></div></div></div>Your OPSCOM Client Success team will be happy to discuss these options to ensure a smooth and successful setup.

<span class="citation-2 citation-end-2">Once the prerequisites are addressed, the SAML setup involves configuring fields for both OPSCOM (as the Service Provider) and your external SAML system (as the Identity Provider).</span>

---

### Configuring SAML Setup

1. Hover over System Configuration, Users, and click Login Sources.
2. Click the pencil icon to edit your login source you created already as mentioned above. You should already have configured the login source to the point of the Unique ID field.

<p class="callout warning">The settings below must be filled out correctly and saved before you will see the Metadata tab to continue.</p>

##### <span style="text-decoration: underline;">Service Provider Fields (Configured in OPSCOM)</span>

These fields define how OPSCOM will interact with your Identity Provider.

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk-unique-identifier%3A-t"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Unique ID**: **Required** - This is a crucial part of the XML communication between OPSCOM and your SAML system. It is *supplied by your SAML system* and is the value OPSCOM uses to match against its internal `UniqueID` field to identify a user.
- **<span class="citation-1">Entity ID for Service Provider</span>**<span class="citation-1 citation-end-1">: **Required** - This value defines the unique SAML integration path within the URL in the metadata.<sup class="superscript" data-turn-source-index="6"></sup></span> If your OPSCOM system has more than one SAML integration, each `Entity ID` needs to be unique. The value you supply will appear in the integration path like this: `<a href="https://client.OPSCOM.com/auth/saml2/ENTITY_ID_FIELD/acs">https://client.OPSCOM.com/auth/saml2/ENTITY_ID_FIELD/acs</a>`. ***Only add the ENTITY\_ID\_FIELD not the whole URL.***
- **x509 Certificate**: (Optional) This certificate is provided by your Identity Provider (IdP) and can be generated and added to the Service Provider (OPSCOM) for secure communication.
- Private Key: (Optional)

</div></div></div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Identity Provider Fields (Configured in OPSCOM, Values from Your SAML System):</span>

These fields capture information from your external SAML system (Identity Provider). You will find these values within your SAML system's metadata (e.g., often displayed under `Federation → Show Metadata` on your SAML installation page).

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk-you-will-input-value"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- You will input values such as the Identity Provider's `Entity ID`, `Single Sign-On URL (SSO URL)`, and `x509 Certificate` (which is often different from the one provided for the Service Provider).

</div></div></div></div></div></div></div></div></div></div>*Once these settings have been completed and saved in OPSCOM, you will gain access to additional tabs: **MetaData**, **Synchronization**, and **Translations**.*

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk--1"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

</div></div></div></div></div></div></div></div></div></div>### Using this Feature

##### <span style="text-decoration: underline;">[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Om4image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Om4image.png)</span>

##### <span style="text-decoration: underline;">Metadata Tab</span>

The **Metadata** tab in OPSCOM provides the XML code that you will need to provide to your Service Provider (OPSCOM, in the context of SAML communication from your IdP's perspective). This XML contains all the necessary information for your Identity Provider to communicate correctly with OPSCOM.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/BLMimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/BLMimage.png)

##### <span style="text-decoration: underline;">Sample XML File</span>

**Sample XML File Explanation**: When your external system (e.g., a SimpleSAMLPhp service set up as the identity provider) sends a response back to OPSCOM, it includes an `saml:AttributeStatement` tag containing several attributes. These attributes are required for OPSCOM to match to a user within its system. The most important field in this attribute section is the value used as the permanently unique identifier for a user. For example, if the XML response shows `[uid] => Array ( [0] => 6ddf4027-3397-4e45-8628-0189f60fe91e )`, then `uid` should be entered as the **Unique ID Field** in your **Identity Provider Fields** configuration within OPSCOM. If the unique ID is something else, such as `SAMaccountName`, then that should be used instead.

<span class="message css-14uc8v9"><span data-colorid="ihs6me7lvb">... DEV-2K8</span> - DEBUG: Saml2 Incoming User Array ( \[uid\] =&gt; Array ( \[0\] =&gt; 6ddf4027-3397-4e45-8628-0189f60fe91e ) \[full name\] =&gt; Array ( \[0\] =&gt; Sarah Knowles ) \[email\] =&gt; Array ( \[0\] =&gt; sknowles@tomahawk.ca ) ) \[\]</span>

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="8c2f3283-e2df-4f84-8b64-c685cebf809c" data-macro-name="code" id="bkmrk-%3C%3Fxml%C2%A0version%3D%221.0%22%3F"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-confluence nogutter  xml" id="bkmrk-%3C%3Fxml%C2%A0version%3D%221.0%22%3F-1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2" data-bidi-marker="true">`<?``xml` `version``=``"1.0"``?>`</div><div class="line number2 index1 alt1" data-bidi-marker="true">`        ``<``samlp:Response` `xmlns:samlp``=``"urn:oasis:names:tc:SAML:2.0:protocol"` `xmlns:saml``=``"urn:oasis:names:tc:SAML:2.0:assertion"` `ID``=``"_aa1963115aa6490e728c7376f4c8849813bbb..."``>`</div><div class="line number3 index2 alt2" data-bidi-marker="true">`          ``...`</div><div class="line number4 index3 alt1" data-bidi-marker="true">`          ``<``saml:Assertion` `xmlns:xsi``=``"http://www.w3.org/2001/XMLSchema-instance"` `xmlns:xs``=``"http://www.w3.org/2001/XMLSchema"` `ID``=``"_9efd79bf6425983ee9176f3d33a99d1a9176180..."``>`</div><div class="line number5 index4 alt2" data-bidi-marker="true">`            ``...`</div><div class="line number6 index5 alt1" data-bidi-marker="true">`            ``<``saml:Subject``>`</div><div class="line number7 index6 alt2" data-bidi-marker="true">`              ``<``saml:NameID` `SPNameQualifier``=``"MinionOpsComStaff"` `Format``=``"urn:oasis:names:tc:SAML:2.0:nameid-format:transient"``>_7a426e0be71f14c1f349db00d7d543b6f7dcb52baa</``saml:NameID``>`</div><div class="line number8 index7 alt1" data-bidi-marker="true">`              ``<``saml:SubjectConfirmation` `Method``=``"urn:oasis:names:tc:SAML:2.0:cm:bearer"``>`</div><div class="line number9 index8 alt2" data-bidi-marker="true">`                ``<``saml:SubjectConfirmationData` `NotOnOrAfter``=``"2021-08-24T16:00:41Z"` `Recipient``=``"https://minion-3.dev.parkadmin.com/auth/saml2/MinionOpsComStaff/acs"` `InResponseTo``=``"ONELOGIN_bb8a09203c888cf59af4c621a71cfa8f7559c016"``/>`</div><div class="line number10 index9 alt1" data-bidi-marker="true">`              ``</``saml:SubjectConfirmation``>`</div><div class="line number11 index10 alt2" data-bidi-marker="true">`            ``</``saml:Subject``>`</div><div class="line number12 index11 alt1" data-bidi-marker="true">`            ``<``saml:Conditions` `NotBefore``=``"2021-08-24T15:55:11Z"` `NotOnOrAfter``=``"2021-08-24T16:00:41Z"``>`</div><div class="line number13 index12 alt2" data-bidi-marker="true">`              ``<``saml:AudienceRestriction``>`</div><div class="line number14 index13 alt1" data-bidi-marker="true">`                ``<``saml:Audience``>MinionOpsComStaff</``saml:Audience``>`</div><div class="line number15 index14 alt2" data-bidi-marker="true">`              ``</``saml:AudienceRestriction``>`</div><div class="line number16 index15 alt1" data-bidi-marker="true">`            ``</``saml:Conditions``>`</div><div class="line number17 index16 alt2" data-bidi-marker="true">`            ``<``saml:AuthnStatement` `AuthnInstant``=``"2021-08-24T15:34:46Z"` `SessionNotOnOrAfter``=``"2021-08-24T23:34:46Z"` `SessionIndex``=``"_a7a68666092117d24aab8adecf1b0830622855b85..."``>`</div><div class="line number18 index17 alt1" data-bidi-marker="true">`              ``<``saml:AuthnContext``>`</div><div class="line number19 index18 alt2" data-bidi-marker="true">`                ``<``saml:AuthnContextClassRef``>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</``saml:AuthnContextClassRef``>`</div><div class="line number20 index19 alt1" data-bidi-marker="true">`              ``</``saml:AuthnContext``>`</div><div class="line number21 index20 alt2" data-bidi-marker="true">`            ``</``saml:AuthnStatement``>`</div><div class="line number22 index21 alt1" data-bidi-marker="true"> </div><div class="line number23 index22 alt2" data-bidi-marker="true"> </div><div class="line number24 index23 alt1" data-bidi-marker="true">`            ``<``saml:AttributeStatement``>`</div><div class="line number25 index24 alt2" data-bidi-marker="true">`              ``<``saml:Attribute` `Name``=``"uid"` `NameFormat``=``"urn:oasis:names:tc:SAML:2.0:attrname-format:basic"``>`</div><div class="line number26 index25 alt1" data-bidi-marker="true">`                ``<``saml:AttributeValue` `xsi:type``=``"xs:string"``>6ddf4027-3397-4e45-8628-0189f60fe91e</``saml:AttributeValue``>`</div><div class="line number27 index26 alt2" data-bidi-marker="true">`              ``</``saml:Attribute``>`</div><div class="line number28 index27 alt1" data-bidi-marker="true">`              ``<``saml:Attribute` `Name``=``"full name"` `NameFormat``=``"urn:oasis:names:tc:SAML:2.0:attrname-format:basic"``>`</div><div class="line number29 index28 alt2" data-bidi-marker="true">`                ``<``saml:AttributeValue` `xsi:type``=``"xs:string"``>Sarah Knowles</``saml:AttributeValue``>`</div><div class="line number30 index29 alt1" data-bidi-marker="true">`              ``</``saml:Attribute``>`</div><div class="line number31 index30 alt2" data-bidi-marker="true">`              ``<``saml:Attribute` `Name``=``"email"` `NameFormat``=``"urn:oasis:names:tc:SAML:2.0:attrname-format:basic"``>`</div><div class="line number32 index31 alt1" data-bidi-marker="true">`                ``<``saml:AttributeValue` `xsi:type``=``"xs:string"``>sknowles@tomahawk.ca</``saml:AttributeValue``>`</div><div class="line number33 index32 alt2" data-bidi-marker="true">`              ``</``saml:Attribute``>`</div><div class="line number34 index33 alt1" data-bidi-marker="true">`            ``</``saml:AttributeStatement``>`</div><div class="line number35 index34 alt2" data-bidi-marker="true"> </div><div class="line number36 index35 alt1" data-bidi-marker="true"> </div><div class="line number37 index36 alt2" data-bidi-marker="true">`          ``</``saml:Assertion``>`</div><div class="line number38 index37 alt1" data-bidi-marker="true">`        ``</``samlp:Response``>`</div></div></td></tr></tbody></table>

</div></div></div></div>##### <span style="text-decoration: underline;">Synchronization Tab</span>

The **Synchronization** tab allows you to configure how user information is managed between your SSO system and OPSCOM.

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk-auto-create%2Fupdate-u"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Auto Create/Update User**: To begin, ensure you enable the **Auto Create/Update User** checkbox. This feature allows OPSCOM to automatically create new user profiles when they first log in via SAML, if they don't already exist in OPSCOM. It also enables the system to update existing user information.
- **<span class="citation-0">User Attribute Mapping</span>**<span class="citation-0 citation-end-0">: On this tab, you will map the user attributes from your SSO system (your Identity Provider) to the corresponding fields in OPSCOM.<sup class="superscript" data-turn-source-index="7"></sup></span> For example, your SSO system might send "full name" and "email" attributes, which you would map to OPSCOM's `firstName`, `lastName`, and `email` fields.
- Any field that is mapped and has a value from your SSO side should get updated to the value from SAML.

</div></div></div></div></div></div></div></div></div></div>After you have provided the information in each field, click **Save Changes**.

Your users will then begin to be created or updated automatically upon their SSO login attempts. If any of the supplied fields are incorrect or don't match, the corresponding information will be blank in OPSCOM when the user logs in, or it will remain unchanged if the user already existed.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/W2qimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/W2qimage.png)

<p class="callout info">The exact sample values from our test system may differ from your actual SAML system attributes.</p>

##### <span style="text-decoration: underline;">Translations Tab</span>

The **Translations** tab allows you to customize the text displayed on your login button from the user side. You can create as many different translations as are available in your system (e.g., English and French). This ensures that the SSO login experience is localized for your users.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/0Bpimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/0Bpimage.png)

---

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

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="4c44a372-8f2e-4c9a-abcb-af05c071ddac" data-macro-name="info" id="bkmrk-coordinate-with-it%2Fs"><div class="confluence-information-macro-body"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-coordinate-with-it%2Fs-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-215 response-container-with-gpi ng-star-inserted" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-215"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-215"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-coordinate-with-it%2Fs-2">- <span style="color: rgb(22, 145, 121);">**Coordinate with IT/SAML Administrator**: Successful SSO implementation requires close collaboration with your organization's IT department or the administrator of your SAML Identity Provider. They will provide the necessary metadata and attribute names.</span>
- <span style="color: rgb(22, 145, 121);">**Unique User Identifiers**: Ensure the **Unique Identifier** chosen for matching users is truly unique and persistent within your SSO system. Incorrect or changing identifiers will lead to duplicate accounts or login failures.</span>
- <span style="color: rgb(22, 145, 121);">**Attribute Mapping Accuracy**: Carefully map all desired user attributes from your Identity Provider to OPSCOM. Inaccurate mapping will result in missing or incorrect user data.</span>
- <span style="color: rgb(22, 145, 121);">**Test Thoroughly**: After initial configuration, conduct thorough testing with various user types and scenarios to ensure seamless login, proper user creation/updates, and correct data synchronization.</span>
- <span style="color: rgb(22, 145, 121);">**User Experience**: Clearly communicate the new SSO login process to your users. Provide instructions on how to access OPSCOM via SSO and address any potential questions.</span>
- <span style="color: rgb(22, 145, 121);">**Error Handling**: Be prepared to troubleshoot potential issues. Common problems include incorrect Entity IDs, expired certificates, or mismatched attribute names. The SSO system logs can be invaluable for diagnosing such issues.</span>

</div></div></div></div></div></div></div></div></div></div>

# Troubleshooting - Email Server Communication Errors

<p class="callout info">Communication errors in OPSCOM, often manifested as "Communication Error" messages to users, typically occur when essential email "From" or "Reply-to" addresses are not correctly configured in the system settings. This article helps OPSCOM administrators identify and resolve such errors, ensuring that system-generated emails (like password reset confirmations) are sent successfully.</p>

### Identifying a Communication Error

Communication errors are usually a symptom of missing or incorrect email configurations within the system settings.

A common example of a communication error occurs when a user attempts to submit the **Forgot Password** form on the user-side login page. An error message similar to the following may be displayed:

## [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/preimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/preimage.png)

This error indicates that the system is attempting to send an email but lacks a defined "From" or "Reply-to" address from which to send it.

---

### Fixing Communication Errors

1. Click **System Configuration,** then **System Settings.**
2. On the **General System Settings** tab, locate the **Reply-to Admin Email Address** field.
3. Enter a valid and active email address into this field. This address will serve as the system's "From" address for various automated communications.
4. **Save** your changes.

Once you have updated the email address, this communication issue should be resolved. You can test by re-attempting the action that previously triggered the error (e.g., submitting the **Forgot Password** form).

---

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

- <span style="color: rgb(22, 145, 121);">**Crucial Email Fields**: The **Reply-to Admin Email Address** (and other "From Email" settings found in **System Settings**) are critical for all system-generated email communications. Ensure they are always populated with a valid, monitored email address.</span>
- <span style="color: rgb(22, 145, 121);">**Troubleshooting**: If the issue persists after updating the **Reply-to Admin Email Address**, it may indicate a more complex underlying problem.</span>
    - <span style="color: rgb(22, 145, 121);">**Contact Support**: If the issue is still not resolved after completing these fields, please contact [support@ops-com.com](mailto:support@ops-com.comcom) for further assistance. Provide details of the error message and the steps you have already taken.</span>
- <span style="color: rgb(22, 145, 121);">**Monitoring System Notifications**: Regularly check the email address configured as the "Default Notification Email" in **System Settings** to catch any internal system alerts about failed communications.</span>

# Alarms System Settings

## Setting up Alarms in OPSCOM

There are 3 different alarms you can setup in OPSCOM.

- [People ](https://opscom.wiki/books/the-opscom-admin-portal/page/people-alarms)
- [Vehicle/Plate](https://opscom.wiki/books/the-opscom-admin-portal/page/plate-and-vehicle-alarms)
- [Generic](https://opscom.wiki/books/the-opscom-admin-portal/page/generic-alarms/)

# Defining User Profile Settings

<p class="callout info">User Profile Settings in OPSCOM enable administrators to customize the information collected from users on their profile forms. By controlling the visibility and requirement status of various fields, you can tailor the user experience to your organizational needs, ensure necessary data is captured, and streamline the registration process.</p>

User profile item settings are configured within the **System Settings** area of OPSCOM.

1. Click **System Configuration**, then **System Settings**.
2. On the **Manage System Settings** screen, click **User Profile.**

### Using this Feature

On the **User Profile** settings page, items in the list can be set to one of three states, controlling their appearance and requirement on the user-side profile form:

- **Hidden**: The field is **not visible** on the user-side profile form.
- **Visible**: The field is seen on the user-side form, but entering information in it is **optional**.
- **Required**: The field is seen on the user-side form and is **mandatory**. Required fields are indicated by a **red asterisk** (\*).

<p class="callout warning">**Note:** The system will not allow the user to save their profile if any required information is missing.</p>

The state selected for each field is highlighted in black, with a checkmark indicating the active selection.

[![2025-06-17_12-55-28.jpg](https://opscom.wiki/uploads/images/gallery/2025-06/F6L2025-06-17-12-55-28.jpg)](https://opscom.wiki/uploads/images/gallery/2025-06/F6L2025-06-17-12-55-28.jpg)

[View the corresponding profile fields here.](https://opscom.wiki/books/the-opscom-admin-portal/page/user-profile-overview)


##### <span style="text-decoration: underline;">Customizing Profile Sections</span>

- **User Name**: A User Name is essential as it's one of the unique identifiers for system access. While a bare minimum typically includes Username, First Name, and Last Name, any of these items can be toggled on/off based on your needs. 
    - <p class="callout info">**Note:** One scenario where you might hide Username is if an external source (such as LDAP) is supplying the username.</p>
    - **Enabling Username Edits**: By default, the username field is not editable by administrators. To enable this functionality, you must contact <support@ops-com.comcom> to request changes to the **Allow Username Edits** setting located within the **User Profile** settings list. Once activated by the OPSCOM Team, administrators will have the ability to edit usernames directly.
- **Address Information**: This section is critical if you plan to mail permits or other correspondence to end-users.
- **Phone Information**: Allows for the collection of various phone numbers.
- **License Information**: This field specifically refers to Driver's License number (not plate number). You may opt to record this information, especially if you are connected with local law enforcement.
- **Student Information**: Fields relevant to student identification (e.g., Student Number, Max/Min Student Number Digits).
- **Employee Information**: Fields relevant to employee identification (e.g., Employee Number, Max Employee Number Digits).

##### <span style="text-decoration: underline;">Considerations for Text2ParkMe Users</span>

If your organization is using **Text2ParkMe**, a second tab will be available on this page. This tab allows you to configure additional details, including credit card information, that end-users can enter.

<p class="callout warning">**Important:** If any credit card information is entered by the user, it automatically switches all other credit card information fields to "required" for that transaction.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Balance Data Collection and User Experience**: While it's important to collect necessary data, avoid making too many fields "Required" as this can create friction and deter users from completing their profiles. Prioritize truly essential information.</span>
- <span style="color: rgb(22, 145, 121);">**Understand System Overrides**: Even if you hide everything possible, the system might still require certain fundamental pieces of information (e.g., core identifiers like Username or Email) and will override your settings to ensure basic functionality.</span>
- <span style="color: rgb(22, 145, 121);">**Review Hidden Fields Periodically**: Ensure that fields marked "Hidden" truly remain irrelevant to your current processes. Organizational needs can change, making previously hidden data suddenly important.</span>
- <span style="color: rgb(22, 145, 121);">**Tailor to User Types**: Consider which information is truly necessary for different user types (e.g., students versus employees) and configure accordingly.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Mailing/Enforcement**: If you rely on mailing permits or recording specific ID numbers for enforcement, ensure the corresponding profile fields are set to "Required" or at least "Visible."</span>
- <span style="color: rgb(22, 145, 121);">The **Allow Username Edits** setting can only be toggled by the OPSCOM Support team. If you require the ability to edit usernames, please contact OPSCOM support to request this change.</span>

# Account Creation Preferences

<p class="callout info">OPSCOM allows administrators to configure user account creation preferences, choosing between immediate auto-login or requiring email verification upon registration. Understanding and setting this preference is crucial for managing your user base effectively, balancing user convenience with security and data integrity needs.</p>

Please refer to the [Registering as a User](https://opscom.wiki/books/OPSCOM-user-portal/page/registering-as-a-user) article for the user-side documentation.

### Setup &amp; Configuration

Account creation preferences are configured within the **User Profile** settings under **System Settings**.

1. Hover over **System Configuration,** then **System Settings,** and click the **User Profile** tab.
2. Toggle the **Auto Login After Register** setting, which controls the account creation flow.

---

### Using this Feature

The **Auto Login After Register** setting has two states, each with distinct implications for user experience and system security:

##### <span style="text-decoration: underline;">Immediate Login (Auto Login After Register: ON)</span>

- **Configuration**: Toggle the **Auto Login After Register** setting to **ON**.
- **Behavior**: This method allows users to instantly access their account immediately upon completing registration, without requiring them to verify their email address.
- **Reasons to Use**: 
    - **Limited Email Access**: Ideal for scenarios where users might not have immediate access to their email, such as in kiosk setups or for individuals without constant mobile email access.
    - **Reduced Friction**: Provides a smoother, quicker onboarding experience, especially if your target audience is less tech-savvy or if you aim to minimize any barriers to entry.

##### <span style="text-decoration: underline;">Email Verification (Auto Login After Register: OFF)</span>

- **Configuration**: Toggle the **Auto Login After Register** setting to **OFF**.
- **Behavior**: This method requires users to click a unique verification link sent to their registered email address before they can fully access their account.
- **Reasons to Use**: 
    - **Verifying Legitimate Users**: This is generally the **preferred method** as it immediately confirms that the registration originates from a real user with a valid email address, significantly reducing bot registrations or fake accounts.
    - **Account Security and Recovery**: Email verification establishes a reliable communication channel crucial for secure password resets, account recovery procedures, and sending important notifications, thereby enhancing overall account security.
    - **Maintaining Data Integrity**: By ensuring valid email addresses from the outset, you improve the quality and accuracy of your user data in the system.

---

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

- <span style="color: rgb(22, 145, 121);">**Balance Security and Convenience**: Carefully weigh the trade-offs between user convenience (immediate login) and enhanced security/data integrity (email verification) based on your organization's risk tolerance and user base.</span>
- <span style="color: rgb(22, 145, 121);">**Communication**: Clearly inform users about the account creation process, especially if email verification is required. Provide instructions on checking spam folders for verification emails.</span>
- <span style="color: rgb(22, 145, 121);">**Email Deliverability**: If using email verification, ensure your system's email sending configurations are robust to guarantee that verification emails are delivered promptly and reliably.</span>
- <span style="color: rgb(22, 145, 121);">**Target Audience Analysis**: Consider the technical literacy and typical access methods of your target audience when deciding on the preferred setting.</span>
- <span style="color: rgb(22, 145, 121);">**Compliance**: Some data privacy regulations may implicitly favor email verification as it contributes to better data quality and user consent verification.</span>

# Configuring Multi-Factor Authentication on the User Portal

<p class="callout info">**Multi-Factor Authentication (MFA)** adds a crucial second layer of security to user accounts in OPSCOM, significantly enhancing protection against unauthorized access. Currently, the primary method implemented is the use of **one-time passwords (OTPs)** sent via email. This article outlines how administrators can configure MFA at the system level and how users interact with this enhanced security feature on their portal.  
</p>

### Setup &amp; Configuration

Implementing MFA involves administrator-side configuration within System Settings and customizing the associated email template.

##### <span style="text-decoration: underline;">Admin Side Configuration</span>

One-time passwords will not be available on the user portal until enabled within **System Settings**.

1. Hover over **System Configuration** and click **System Settings**.
2. On the **User Profile** tab, click **Enable Multi-Factor Authentication**.

<p class="callout info">If this setting is not available for you to change, please have your primary Admin contact <support@ops-com.com> to have it turned on.</p>

This is a **ternary setting**, meaning it has three different states, allowing for flexible control over MFA implementation:

- **Hidden**: The use of one-time passwords is **disabled** site-wide. Users will not see or be able to enable MFA.
- **Visible**: The use of one-time passwords is **enabled**, but it is left **optional** for individual users to decide if they want to enable it on their account.
- **Required**: The use of one-time passwords is **mandatory** for **all** users of the website. 
    - If MFA is set to **Required**, users who do not have it enabled on their account will be automatically redirected to the setup page upon their next login and will be required to set it up before they can access their account.

##### <span style="text-decoration: underline;">Email Template Configuration</span>

The content of the one-time password email sent to users is defined within a dedicated email template.

1. Hover over **System Configuration**, **Content &amp; Designs** and click **Email Templates**.
2. Locate and edit the **One-Time Password Email Template**.

Here, administrators can define the message and branding of the email. In addition to general user-specific shortcodes, this template includes specific shortcodes for OTP details:

- `[one_time_password]`: Inserts the randomly generated one-time password.
- `[one_time_password value="issued_at"]`: Inserts the time the one-time password was generated.
- `[one_time_password value="expires_at"]`: Inserts the time the one-time password expires.

<p class="callout warning">One-time passwords always expire after **15 minutes**. This cannot be changed.</p>

![jYLimage2.jpg](https://opscom.wiki/uploads/images/gallery/2025-06/jylimage2.jpg)

---

### Using this Feature

##### <span style="text-decoration: underline;">User-Side MFA Management</span>

Users can enable and manage their one-time password settings from their security page (formerly the passwords page). [Refer to this wiki article](https://opscom.wiki/books/OPSCOM-user-portal/page/multi-factor-authentication-user-portal) to see the steps involved.

<p class="callout info">The state of the user's one-time password verification is stored in the local storage of their session data. If the local storage is cleared (e.g., clearing browser cache), they will have to enter another one-time password. The MFA verification does not persist across different web browsers or devices, meaning the user will have to enter a new one-time password if they try to log in using another browser or device.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Security Enhancement**: MFA significantly reduces the risk of unauthorized access, even if primary login credentials are compromised. It is highly recommended for all users.</span>
- <span style="color: rgb(22, 145, 121);">**Gradual Rollout (Visible vs. Required)**: When introducing MFA, consider starting with the **Visible** setting to allow users to opt-in voluntarily. Once accustomed, transition to **Required** for all users if your security policy mandates it.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Communication**: Inform users about the MFA requirement, how to set it up, and how to log in using OTPs. Provide clear instructions and troubleshooting tips.</span>
- <span style="color: rgb(22, 145, 121);">**Email Deliverability**: Ensure that your system's email settings are correctly configured and that OTP emails are not being blocked by spam filters. Users need to receive these emails promptly to log in.</span>
- <span style="color: rgb(22, 145, 121);">**Template Customization**: Customize the OTP email template to include your organization's branding and any specific instructions for your users.</span>
- <span style="color: rgb(22, 145, 121);">**User Training**: Consider providing brief training or a guide for users on how to manage their MFA settings and log in with OTPs.</span>
- <span style="color: rgb(22, 145, 121);">**OTP Expiry**: Remind users that OTPs are time-sensitive (15 minutes) and that generating a new one invalidates previous ones.</span>

# Password and Security Settings

<p class="callout info">The Security Settings in OPSCOM provide administrators with critical tools to enforce robust password policies and manage login security for all administrative accounts. Properly configuring these settings is essential for protecting sensitive system data, preventing unauthorized access, and complying with organizational security standards.</p>

Security settings are managed within the **System Settings** area of OPSCOM.

1. Hover over **System Configuration,** and click **System Settings**.
2. Click **Security**. The **Manage System Settings** window will open, displaying all available security configurations.

### Using this Feature

The **Security** component within **System Settings** allows administrators to configure various aspects of password management and account lockout policies.

##### <span style="text-decoration: underline;">Password Security Settings</span>

- **Salted Password Hashing**:
    
    
    - **Purpose**: This setting adds an essential layer of security to stored passwords. Hashing is a one-way, irreversible process that converts a user's password into a unique, short hash value. "Salting" introduces a random string into this process, ensuring that even if two users have the same password, their stored hash values will be different. This prevents "lookup" (reverse engineering) of the original password, meaning forgotten passwords must be reset, not retrieved. This significantly limits an administrator's ability to view employee passwords and closes a critical security vulnerability.

<p class="callout warning">**Note**: Once **Hash and Salt** is enabled, it **should not be turned off**.</p>

- **Require Password Update**:
    
    
    - **Purpose**: When activated, this setting forces users to change their passwords upon their next login.
    - **Use Case**: Ideal for ensuring compliance with regular password changes or after a password reset by an administrator.
- **Toggle Password Expiry**:
    
    
    - **Purpose**: By default, passwords in OPSCOM do not expire. For enhanced security, it is best practice to mandate regular password changes. This setting enables the use of password expiry.
    - **Configuration**: Toggle this setting **On**.
    - **Password Expiry in days**: Enter the number of days after which an administrator's password will expire, aligning with your organization's security policy (e.g., 90 days).
- **Enable Password History**:
    
    
    - **Purpose**: When toggled **On**, OPSCOM will remember passwords previously used by an administrator. The system will then prevent the reuse of those passwords for a specified period.
    - **Configuration**: Set **How long to remember old passwords** (in days) to define the duration for which old passwords are not allowed to be reused.

##### <span style="text-decoration: underline;">Password Strength Requirements</span>

These settings allow you to enforce complexity rules for administrator passwords.

- **Minimum Password Length**: Sets the minimum number of characters required for a password.
- **Enable password strength requirements**: Toggles on or off the following specific complexity requirements: 
    - **Numerical Characters**: Sets the minimum number of numbers required in the password.
    - **Lower Case Characters**: Sets the minimum number of lowercase characters required in the password.
    - **Upper Case Characters**: Sets the minimum number of uppercase characters required in the password.
    - **Non-Alpha Numeric**: Sets the minimum number of non-alphanumeric (special) characters required in the password (e.g., `!, &, #,` etc.).

##### <span style="text-decoration: underline;">Admin Account Lockout Settings</span>

These settings provide an additional layer of security by locking an administrator out of their account after repeated incorrect password attempts.

- **Enable Admin Lockouts**: Toggles on or off the account lockout feature.
- **Lockout after X Attempts**: Sets the number of failed login attempts with an incorrect password before the system will lock out the administrator.
- **Login attempt timeframe**: Sets the timeframe (in minutes) during which incorrect login attempts are counted. For example, if an administrator fails 3 times within a 5-minute period, their account will be locked out.
- **Lock the admin out for X minutes**: Sets the duration (in minutes) that the administrator's account will remain locked. For example, setting it to `120 minutes` would mean the administrator is locked out for 2 hours before another login attempt is permitted.

---

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

- <span style="color: rgb(22, 145, 121);">**Robust Security Policy**: Always implement a robust security policy that combines strong password requirements (length, complexity), password expiry, and lockout mechanisms.</span>
- <span style="color: rgb(22, 145, 121);">**Enable Hashing**: Ensure **Salted Password Hashing** is always enabled for maximum password security.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Password Expiry**: Enforce regular password expiry (e.g., every 90 days) to mitigate the risk of compromised credentials.</span>
- <span style="color: rgb(22, 145, 121);">**Meaningful Lockout Settings**: Configure lockout settings to balance security with user convenience. Too aggressive settings can lead to frequent lockouts, while too lenient settings can be a security risk.</span>
- <span style="color: rgb(22, 145, 121);">**Communication**: Inform administrators about the security policies in place, including password strength requirements, expiry rules, and lockout procedures. This helps them comply and understand why they might be locked out.</span>
- <span style="color: rgb(22, 145, 121);">**Admins can see, only OPSCOM Team can change**: Several security settings (e.g., **Hash and Salt**, **Require Password Update**, **Toggle Password Expiry**, **Enable Password History**, **Enable password strength requirements**, **Enable Admin Lockouts**) are visible to administrators but can only be changed by the OPSCOM Team. For modifications to these specific settings, contact [OPSCOM Support](mailto:support@ops-com.comcom).</span>

# Uploading and Managing Files

<p class="callout info">The **Manage Files** section in your OPSCOM Admin site provides a centralized repository for all files used across your OPSCOM instance, primarily images for your user and admin dashboards. This feature allows administrators to easily upload, view, organize, and manipulate these files, ensuring consistent branding and visual content throughout your system.</p>

### Using this Feature

The **Manage Files** page offers different ways to view and interact with your uploaded files.

1. To access this, click **System Configuration,** then **Manage Files.**

##### <span style="text-decoration: underline;">Viewing Files</span>

Files can be viewed in two primary modes:

- **Grid Mode**: Displays a visual preview (thumbnail) of each image, which is useful for quickly identifying content.
- **Table Mode**: Provides a detailed list view, showing file names and other relevant information.

##### <span style="text-decoration: underline;">Managing Existing Files</span>

By right-clicking on an image or file, a contextual menu will appear, giving you several options:

- **Download**: Save a copy of the file to your local device.
- **Rename**: Change the name of the file.
- **Delete**: Permanently remove the file from the system.

To crop an image (i.e., resize or adjust its visible dimensions to focus on a specific area), first **View** the image. Then, click the **Cropping icon** to begin selecting the desired area of the image.

##### <span style="text-decoration: underline;">Adding Files to the Repository</span>

To add new files to this repository, click on the **Upload** tool. An **Upload files** interface will appear, prompting you to **Select files,** then **Submit**. The file will then be uploaded to your site's file storage.

<p class="callout warning">**Note:** Once an image is uploaded, it cannot be moved to a different folder. To maintain proper organization, ensure that you upload the image directly into the intended destination folder.</p>

##### <span style="text-decoration: underline;">Adding Images to a Page (Referencing Uploaded Files)</span>

To display an image you've uploaded onto an OPSCOM page (e.g., a page header or a custom content area):

1. Click **Insert** in the text editor toolbar.
2. Select **Image** from the dropdown menu.
3. In the **Insert/edit image** window, click the **search folder icon** next to the source field to open the **Filemanager**.
4. In the Filemanager, locate and **double-click** the image you wish to insert.
5. The image will be added to the page at the location of your cursor.

---

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

- <span style="color: rgb(22, 145, 121);">**Organize Files**: If you have many files, consider creating sub-folders within the file manager to keep your assets organized and easy to find. Be sure to upload files directly into the appropriate folder, as uploaded files cannot be moved once added.</span>
- <span style="color: rgb(22, 145, 121);">**Descriptive File Names**: Use clear and descriptive file names (e.g., `company-logo-header.png` instead of `image1.png`) to simplify identification and referencing.</span>
- <span style="color: rgb(22, 145, 121);">**Optimize Image Sizes**: Before uploading, optimize large images for web use. Smaller file sizes will improve page load times for both admin and user interfaces.</span>
- <span style="color: rgb(22, 145, 121);">**Backup Critical Assets**: While OPSCOM manages these files, consider maintaining local backups of critical branding assets (logos, banners) as a best practice.</span>
- <span style="color: rgb(22, 145, 121);">**Path Accuracy**: When linking images to pages, ensure the URL path is exactly correct, including capitalization, as file paths are often case-sensitive.</span>

# Admin Dashboard Setup (Quick Start)

<p class="callout info">The OPSCOM Dashboard is a fully customizable, widget-based analytics dashboard built into the admin portal. Each user can create multiple personal dashboards, arrange widgets freely on a drag-and-drop grid, and configure each widget individually to show exactly the data they need. Dashboards and widgets automatically refresh on a configurable schedule and are fully responsive down to mobile widths.</p>

## Setup &amp; Configuration

Configuring dashboard layouts requires specific [administrative permissions](https://opscom.wiki/books/setup-configuration-for-admins/page/manage-roles-and-permissions).

Dashboard layouts and widget configuration are now fully documented in our feature guide. For detailed instructions on available widgets, customization, and layout options, see the [**Using the OPSCOM Dashboard &amp; Widgets**](https://opscom.wiki/books/the-opscom-admin-portal/page/using-the-opscom-arc-system-dashboard-widgets) article.

# Content & Design

# Email Headers and Footers

<p class="callout info">**Email Headers and Footers** in OPSCOM allow administrators to define and manage reusable layout components for system-generated emails. By customizing these elements, you can ensure consistent branding, provide essential contact information, and apply uniform styling across all your automated email communications, creating a professional and cohesive user experience.</p>

### Using this Feature

Email Headers &amp; Footers are managed through a dedicated section within **System Configuration**.

1. Hover over **System Configuration,** then **Contents &amp; Design,** and click **Email Headers &amp; Footers**.

The **Email Template Layout List** page displays the various sections of your email layouts (e.g., Header, Footer, Style). From here, you can select and edit the individual components that make up your email layouts.

[![image.png](https://opscom.wiki/uploads/images/gallery/2025-06/scaled-1680-/ARvimage.png)](https://opscom.wiki/uploads/images/gallery/2025-06/ARvimage.png)

##### <span style="text-decoration: underline;">Editing Email Layout Templates</span>

1. Click **Toggle Templates**. Locate the corresponding **Section** you wish to edit (e.g., "Header" "Footer" or "Style").
2. Click the **Edit** button for that section.
3. Within the editor, you can: 
    - Add or modify text.
    - Insert images (e.g., your organization's logo).
    - Include **inline styles** directly within the HTML to control appearance (e.g., colors, fonts, spacing).
4. Click **Save Changes**. You will see a message that your changes have been saved.
5. You can also archive your template by clicking the **Archive Template** button in the Top Right.
6. Click the **Back** button to edit other sections.

---

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

- <span style="color: rgb(22, 145, 121);">**Consistent Branding**: Use email headers and footers to consistently display your organization's logo, branding colors, and contact information across all automated emails.</span>
- <span style="color: rgb(22, 145, 121);">**Essential Information**: Ensure your footer contains crucial information such as your organization's name, website, and a general contact email or phone number.</span>
- <span style="color: rgb(22, 145, 121);">**Mobile Responsiveness**: When adding content and styling, consider how your headers and footers will appear on mobile devices. Use responsive design principles or simple layouts for best compatibility.</span>
- <span style="color: rgb(22, 145, 121);">**Inline Styling**: While the editor allows inline styles, for more complex or sitewide styling changes, coordinating with OPSCOM Support for custom CSS in the "Style" template might be beneficial.</span>
- <span style="color: rgb(22, 145, 121);">**Testing Changes**: After making any modifications to headers, footers, or styles, always test the email templates that use these layouts. Send a test email to yourself to ensure everything renders correctly in various email clients.</span>
- <span style="color: rgb(22, 145, 121);">**Global Impact**: Remember that changes made to these layout templates will affect **all** email templates that are configured to use them.</span>

# Email Templates

<p class="callout info">**Email Templates** in OPSCOM allow administrators to customize the content and appearance of automated emails sent by the system. By leveraging available shortcodes and a smart editor, you can create dynamic, informative, and engaging messages for various notifications, ensuring clear and consistent communication with users.</p>

### Using this Feature  


#### **Default Email Templates**

To access and manage your default email templates:

1. Hover over **System Configuration,** then **Contents &amp; Design,** and click **Email Templates**.
2. All the default email templates available in the system will be displayed.

The **Email Templates** interface allows you to edit existing templates, utilize dynamic shortcodes, and configure various fields to tailor your messages.

##### <span style="text-decoration: underline;">Editing Default Email Templates</span>

1. Locate the template you wish to edit in the list.
2. Click the **Edit** button next to it.
3. You will be taken to a dedicated editor interface where you can make changes to the email template.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/79Nimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/79Nimage.png)

##### <span style="text-decoration: underline;">Creating Templates for Other Languages</span>

If you have other languages installed, you can click the **Create** button to create templates for these languages.

##### <span style="text-decoration: underline;">Email Template Fields - What do they do?</span>

When editing an email template, you will configure the following fields:

- **Label**: This field is how you will identify your email template within the system's list.
- **Type**: This is a non-adjustable value that indicates the specific purpose or trigger for this email template (e.g., "Appeal Submitted," "Password Reset").
- **Language**: This field contains options to select the language for the template, typically supporting options like **French** or **English**.
- **Layout**: This allows you to select a pre-defined layout that surrounds your message. Layouts include your email header, footer, and overall styling. You can create or adjust email template layouts under **System Configuration,** then **Contents &amp; Design,** and click **[Email Headers &amp; Footers](https://opscom.wiki/books/setup-configuration-for-admins/page/email-headers-and-footers)**.
- **Subject**: This is the text that will appear as the subject line of the email message.
- **HTML Content**: Here you will write the main body of the message. This section supports rich text formatting, the insertion of images, and the use of shortcodes to create visually appealing and dynamic emails.
- **Text Content**: This section is a simple text editor for the message itself. It does **not** support shortcodes or any formatting. This plain text version is often used as a fallback for email clients that do not render HTML.

##### <span style="text-decoration: underline;">Using Shortcodes</span>

Each email template has a set of **available shortcodes** that you can use to dynamically insert specific information into your message.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Uo4image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Uo4image.png)

- The shortcode tokens are typically displayed on the **left side** of the template editor.
- For example, the email template for "Appeal Submitted by User" might offer shortcodes to automatically include details like `[ticket_appealed_date]` or `[ticket_number]`, allowing you to craft messages without manually knowing these specifics.
- You can insert these shortcodes into the **smart editor** on the right side. The system will automatically replace the shortcode with the appropriate information when the email is sent to the desired user.
- The smart editor also provides formatting capabilities, allowing you to add images, format text, and arrange your messages much like a word processor.

#### **Custom Email Templates**

Administrators can create and store frequently used emails that are not tied to specific system triggers. These templates can be used to automatically populate the email body when manually drafting a message to a user.

##### <span style="text-decoration: underline;">Creating a Custom Template</span>

1. Click the **Create** button.
2. Enter a descriptive **Label**. Custom templates are assigned an internal type code beginning with `custom`.
3. Compose the message using the **HTML Content** and **Text Content** fields.
4. Click **Save**.

##### <span style="text-decoration: underline;">Using Custom Templates in Compose Email</span>

When drafting a manual email to a user via the **Compose Email** page:

1. Use the **Load Template** section to view all available custom templates.
2. Select a template to automatically populate the email contents.
3. The **Compose Email** interface will highlight any required fields that must be completed before you can click the **Send Email** button.

<p class="callout success">**Tip:** Unlike system-defined templates, custom templates include a **Delete** button, allowing you to remove them when they are no longer needed.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Utilize Shortcodes Fully**: Maximize the use of available shortcodes to make your emails dynamic, personalized, and informative, reducing manual effort and potential errors.</span>
- <span style="color: rgb(22, 145, 121);">**Consistent Branding**: Use email layouts (**Email Headers &amp; Footers**) to maintain consistent branding (logos, colors, contact info) across all your system-generated emails.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Subject Lines**: Craft clear and concise subject lines so users can immediately understand the purpose of the email.</span>
- <span style="color: rgb(22, 145, 121);">**Review Both HTML and Text Content**: Always ensure both the **HTML Content** and **Text Content** sections are populated and convey the message clearly. This provides compatibility for all email clients.</span>
- <span style="color: rgb(22, 145, 121);">**Test Templates**: After making changes to an email template, send a test email to yourself or a test account to verify that all shortcodes are rendering correctly, formatting is as expected, and the message is clear.</span>
- <span style="color: rgb(22, 145, 121);">**Language-Specific Templates**: If your system supports multiple languages, ensure you create and maintain separate templates for each language.</span>
- <span style="color: rgb(22, 145, 121);">**Verify Custom Templates**: When using the **Load Template** feature, remember that custom templates show for all users regardless of the selected language; ensure the correct version is chosen.</span>

<div class="table-wrap" id="bkmrk-label-the-label-fiel"></div>

# Translations

## Where are Translations Supported

Currently, translations are only supported on the user side, however, they are managed and set up on the admin side, by admins that have the correct permissions set up to work with languages.

<div class="columnLayout single" data-layout="single" id="bkmrk-translations-that-ar"><div class="cell normal" data-type="normal"><div class="innerCell">1. Translations that are in <span class="legacy-color-text-red2">red,</span> are translations on the adminside which are not yet supported. Since they are not supported you will see them come up in English only until the adminside is supported.
2. Translation that are in **black,** are translations that are on the userside that can currently be changed.

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/7Zuimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/7Zuimage.png)

## Navigating to Translations

To begin reviewing, editing or creating your translations/languages, you will need to navigate to **System Config → Content &amp; Designs → Translations**.

[<span style="color: rgb(224, 62, 45);">![2024-10-04_14-34-02.png](https://opscom.wiki/uploads/images/gallery/2024-10/scaled-1680-/IhO2024-10-04-14-34-02.png)</span>](https://opscom.wiki/uploads/images/gallery/2024-10/IhO2024-10-04-14-34-02.png)

This will take you to the **Installed Languages** page where you can begin managing your current languages.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/bn8image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/bn8image.png)

## Adding New Languages 

To begin adding your own languages simply click **Add Language** on the **Installed Languages** page which will bring up a new modal to add a label and locale.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/JKKimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/JKKimage.png)

When you are finished click **Save Changes** and your new language will be instantly added to the list. Once the language has been added, your users can begin using it on the user-side assuming you have the language enabled.

The locales are used when we want to create sub-languages, while the label is used to identify our translations throughout the site.

## Adding Sub Languages and How do They Work

Sub-languages are created by using a locale that currently exists with an underscore '\_' followed by the sub-language that you want to set up.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/5EPimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/5EPimage.png)

For example, you can support multiple variations of the English language for your users. In the image below I have created a sub-language for American English using the **locale en\_us**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/siaimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/siaimage.png)

When you create a new sub-language, it will automatically use the translations that have been set up on the main language, which is the locale on the left side of the underscore, such as **en\_us**. You will need to create the main language first before creating any sub-languages, otherwise the sub-language will always default to English instead of the main language you may have intended to use.

## Installing Languages

Installing a language will create a new language template with the translations we have set up for it as well as the **Name** and **Locale** we have created for you. You can then click **Edit Translations** to adjust the preset translations to your liking. If there is not a language already in the system that can be installed you will need to add a new language and setup the translations yourself. Currently, we only support the ability to install French and English.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/DsYimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/DsYimage.png)

## Disabling or Enabling Translations 

We can choose to disable particular languages that we don't want to be selectable from the user side. To do this we can toggle the visibly of our languages under the **Enabled** column on the **Installed Languages Page**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/43mimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/43mimage.png)

Once a language is toggled as **Disabled** it can no longe<span class="inline-comment-marker inline-highlight first-mark-highlight last-mark-highlight" data-ref="653e42b4-9dfc-4510-a18e-cd3aaa7ffc0a">r be</span> selected by the users of your site as seen in the example image below.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/xziimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/xziimage.png)

## Searching Language Translations 

You can search for all translations that relate to a specific component in the system using the search bar at the top right of the **Edit Translations** page. For example, we can search for permits to find all permit related translations.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/ieJimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/ieJimage.png)

We can also go onto the user side and use the **Token** language, which will show all of the **Names** found on the **Edit Translations** page, under the **Name** column, (See the image above) to find where that translation exists so it can be changed. This can't be seen by logging is as the user from the user side but requires an admin to go to the profile of a user and click the **Login as User** button from the admin side. This is to ensure that your regular users don't see the token language option.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/7RXimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/7RXimage.png)

The token language finds the tokens used so you can better search where the translations are being used on the user side.

## Edit Translations

To begin editing language translations you have to make your changes and then click away from the input field. Once you do this you will see that the translation gets highlighted in yellow indicating that a change has been made. The number of affected records will also display at the bottom of the translations page.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/tY5image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/tY5image.png)

When you are finished making your changes click **Save Changes** for the update to take effect.

## Delete Languages

To delete languages, you can click the delete button next to the language you want to remove. Keep in mind that if you remove the base English and French language it can be re-installed. However, if you delete a language that we do not provide you, then this data will be lost and you will need to contact support for assistance with recovering these translations.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/GToimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/GToimage.png)

Keep in mind that deleting a language will not delete any of the sub-languages you may have created. For example, if I were to delete English, the English US language would still remain with all of its translations.

## Creating Templates and Messaging for New Languages

It's important to note that when you create a new language it will not rely on the default templates and system messaging that you have setup for your previous languages. For example, if I use the new French American language I created, and go onto the user side where languages are supported, then I will see a blank template as well as blank messages.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/doCimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/doCimage.png)

### Adding Templates

To add a new template for your languages that you create you will need to go into **Templates &amp; Design** followed by **Toggle Templates** for the templates that are currently being used. From there you will have the option to click the **Create** button to add the new template. If you just want your new language to use the same template, from a language that is already in the system, just go into **Edit** and copy the text over into your new language, after clicking the **Create** button.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Xktimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Xktimage.png)

### Adding System Messages

System messaging will work a bit differently than templates as you will need to go into each individual message and click the **Edit** button next to that message.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/jleimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/jleimage.png)

From there you should be able to select your new language.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Qxaimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Qxaimage.png)

If you want multiple messages to display for all your languages you will need to create a new system message and type out the translations for that language template.

## <span data-colorid="isr8j27mmf">Changing Terminology Using the Translator</span>

There is another use for the translation tool that may not be obvious at first. Since the translator is essentially a list of code terms and a corresponding list of what is actually displayed on any page not only can you edit the various languages but for each language you can also edit the display term to fit a local "version" of the term. A perfect example of this is in some areas one might refer to receiving a "**ticket**" as receiving a "**citation**". It is entirely possible to replace any spot in the interface where the term **ticket** is used with the term **citation**.

To do so go into the language editor and search for the term you wish to localize. In our example simply enter **ticket** in the search bar and hit return. A list of all translatable instances of the word ticket will appear. Click the box where the term is editable and type in your preferred term. In this case we are changing **Manage Ticket Categories** to **Manage Citation Categories**. Once you save the changes you have made the displayed text associated with **Manage Ticket Categories** will display as **Manage Citation Categories** throughout the system. You may edit the remaining instances of the word Ticket that are in the list before saving to change the term in bulk for all entries listed.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Zmpimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Zmpimage.png)

# User Portal Branding and Setup

<p class="callout info">OPSCOM administrators can define global default branding for the User Portal. By configuring the **Default Site Logo** and **Default Site Header**, you can ensure consistent branding and visual presentation across your OPSCOM User environment.</p>

## Setup &amp; Configuration

Default images are configured within the **Global** component of the **System Settings**.

1. Hover over **System Configuration,** and click **System Settings**.
2. Click the Global settings tab. Within the **Global Setting** section, you will find two key areas where you can configure images: 
    - **Default Site Logo**
    - **Default Site Header**

##### <span style="text-decoration: underline;">Setting the Default Logo</span>

1. Next to the **Default Site Logo** setting, click on **Select Image**.
2. You will be taken to the **Manage Files** section (your file repository).
3. Browse your computer or search for the image you wish to use as your default site logo.
4. Select the desired image.

[Follow the **Uploading and Managing Files** guide for best practices regarding file management and organization.](https://opscom.wiki/books/setup-configuration-for-admins/page/uploading-and-managing-files)

##### <span style="text-decoration: underline;">Setting the Default Header Image</span>

1. Similarly, next to the **Default Site Header** setting, click on **Select Image**.
2. Follow steps 3-4 above.

Once the images are selected, their file names or previews will appear in the respective configuration settings fields. Remember to **Save Settings** to apply these selections.

##### <span style="text-decoration: underline;">Observing the Changes</span>

These default images serve as fallbacks and will appear in various places throughout the OPSCOM system if no specific logo or header is set in other areas (such as the **Contents and Designs** section).

Common places where these default images are utilized include:

- The **User Portal** (e.g., your public-facing permit purchasing site).
- The **phone interface** utilized in features like **Real-Time Parking**.
- Mobile apps, Text2ParkMe, and QR code interfaces

---

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

- <span style="color: rgb(22, 145, 121);">**Branding Consistency**: Use high-quality, appropriately sized images that reflect your organization's branding for both the logo and header.</span>
- <span style="color: rgb(22, 145, 121);">**Optimization**: Ensure image files are optimized for web use (e.g., compressed, appropriate resolution) to ensure fast loading times on all interfaces.</span>
- <span style="color: rgb(22, 145, 121);">**Global Impact**: Remember that these are *default* settings. If you have specific headers or logos configured in other sections of the system (like individual email templates or specific public pages), those specific configurations will override these global defaults.</span>
- <span style="color: rgb(22, 145, 121);">**Accessibility**: Consider the visual accessibility of your chosen images, especially for text overlays or contrast, if applicable to your header design.</span>

# Pages and Content Blocks

## <span data-colorid="ge6u58s9q9">Accessing System Messaging</span>

To access and manage your **System Messaging** navigate to the gears icon <span class="confluence-embedded-file-wrapper">![](https://OPSCOM.atlassian.net/wiki/download/attachments/762387/image2019-4-8_9-42-38.png?version=1&modificationDate=1554731403000&cacheVersion=1&api=v2)</span> and click on **Content &amp; Designs** -&gt; **Pages and Content Blocks**.

[![2024-10-04_14-34-02.png](https://opscom.wiki/uploads/images/gallery/2024-10/scaled-1680-/2024-10-04-14-34-02.png)](https://opscom.wiki/uploads/images/gallery/2024-10/2024-10-04-14-34-02.png)

## Creating Pages

We also provide a video to visually demonstrate how to use system messaging [https://drive.google.com/file/d/1DU3qorWnAp\_2N9mcNGFYTttNHMeRpXsQ/view](https://drive.google.com/file/d/1DU3qorWnAp_2N9mcNGFYTttNHMeRpXsQ/view)

**Pages** display the visual content found throughout your application. You can edit the contents of your page or post a **System Message** by using the Disclaimer Shortcode on the **Page** you want it to show up on. **Shortcodes** also make it convenient to add interactive content to your pages. For more information on **Shortcodes** scroll to the bottom of this page.

<div class="columnLayout single" data-layout="single" id="bkmrk-to-create-a%C2%A0page%C2%A0cli"><div class="cell normal" data-type="normal"><div class="innerCell">- To create a **Page** click the **Create Page/Message** button at the top right of the **Manage System Messaging** screen. It doesn't matter what tab you're on when you do this as you will specify the **Page Type** when you go to create the page.

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/VEYimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/VEYimage.png)

<div class="columnLayout single" data-layout="single" id="bkmrk-once-you-click-this-"><div class="cell normal" data-type="normal"><div class="innerCell">- Once you click this button OPSCOM will take you to a different section where you can set the properties and content of the page. Below is a detailed description of the options available to you when creating new **Pages**.

<div class="table-wrap"><table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid" style="width: 100%;"><colgroup><col style="width: 11.0822%;"></col><col style="width: 88.9178%;"></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Page Attributes: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Page Attributes</th><th aria-disabled="false" aria-label="Short Description : No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Short Description </th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd">**Title**</td><td class="confluenceTd">The **Title** of the page you wish to create, which will be the name displayed on the user navigation bar. </td></tr><tr role="row"><td class="confluenceTd">**Path**</td><td class="confluenceTd">The path after the domain. i.e.

**login*****/**  → This is the home page*

Changing this to **lockers/area/1** will display **login/lockers/area/1** as the URL for that page.

</td></tr><tr role="row"><td class="confluenceTd">**Visibility**</td><td class="confluenceTd">You can toggle the visibility of your pages which will make it so your users can't see the page anymore, but you can still edit it.</td></tr><tr role="row"><td class="confluenceTd">**Language**</td><td class="confluenceTd">Use this to select between two language options for a specific page. Tomahawk currently supports **English** and **French**. </td></tr><tr role="row"><td class="confluenceTd" colspan="1">**Layout**</td><td class="confluenceTd" colspan="1">You can select the layout of your page here. Usually, you will have the **Default Layout** selected. </td></tr><tr role="row"><td class="confluenceTd">**Content**</td><td class="confluenceTd">Your content will be the text on the page you are currently editing. You can also use **Shortcodes** here to display a body of material or feature. For example, a user login form could be displayed on your homepage. </td></tr></tbody></table>

</div></div></div></div><p class="callout info">**Important:** Make sure you select **Page** under the drop-down menu next to **Page Type** and not **Message**. Below we will go into detail on how to create a **Page** field by field. The images below give you a good visual example of what field is being explained, if there is a certain field you are unsure about you can easily find the picture and read from there.</p>

<div class="columnLayout single" data-layout="single" id="bkmrk-important%3A%C2%A0make-sure"><div class="cell normal" data-type="normal"><div class="innerCell">- Start by giving your page a **Title** and specify how you would like the **URL** at the top of your page to be displayed.
    
    <div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="d7eaa7b3-bdcf-4334-940a-edecfdf6321a" data-macro-name="expand" resolved=""><div class="expand-control" id="bkmrk-%C2%A0what-is-a-url%3F..."><span class="expand-control-icon icon"> </span><span class="expand-control-text">What is a URL?...</span></div></div><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="d7eaa7b3-bdcf-4334-940a-edecfdf6321a" data-macro-name="expand" id="bkmrk--2" resolved=""><div class="expand-content expand-hidden" id="bkmrk--3"></div></div>

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/C4Limage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/C4Limage.png)

<div class="columnLayout single" data-layout="single" id="bkmrk-adjust-the-visibilit"><div class="cell normal" data-type="normal"><div class="innerCell">- Adjust the visibility of your page by toggling the **Visible** button on/off. The **Page** will still be editable in the **System Messaging** section but it will not be visible to your users who are on your **Page** or **System Message**.

<div class="table-wrap"><table class="wrapped relative-table confluenceTable tablesorter tablesorter-default" role="grid"><colgroup><col></col><col></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Toggle On(Visible Page): No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Toggle On(Visible Page)</th><th aria-disabled="false" aria-label="Toggled Off(Invisible Page): No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Toggled Off(Invisible Page)</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd"><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size">![](https://OPSCOM.atlassian.net/wiki/download/thumbnails/762387/visible.png?version=1&modificationDate=1675158301000&cacheVersion=1&api=v2&width=109&height=54)</span>

</td><td class="confluenceTd"><span class="confluence-embedded-file-wrapper confluence-embedded-manual-size">![](https://OPSCOM.atlassian.net/wiki/download/thumbnails/762387/2022-12-08_9-31-34.png?version=1&modificationDate=1670491946000&cacheVersion=1&api=v2&width=105&height=55)</span>

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

</div></div></div></div><div class="columnLayout single" data-layout="single" id="bkmrk-toggling-the%C2%A0page%C2%A0as"><div class="cell normal" data-type="normal"><div class="innerCell">- Toggling the **Page** as invisible will show it under the **Messages** tab like seen in the image below to signify it cannot be seen by your users.

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/dZ1image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/dZ1image.png)

<div class="columnLayout single" data-layout="single" id="bkmrk-select-the-default%C2%A0l"><div class="cell normal" data-type="normal"><div class="innerCell">- Select the default **Language** and **Layout** of your page. If you are not sure which template to use you can leave it as the **Default Layout.**

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/rzPimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/rzPimage.png)

<div class="columnLayout single" data-layout="single" id="bkmrk-provide-the-content-"><div class="cell normal" data-type="normal"><div class="innerCell">- Provide the content of your page in the editor found under the page settings. This content will be the main content of your **Pages**; you can use **Templates &amp; Design** to edit the other sections of your pages such as the **Header-Content** and **Footer-Content.**

</div></div></div><div class="columnLayout single" data-layout="single" id="bkmrk-OPSCOM-uses%C2%A0shortco"><div class="cell normal" data-type="normal"><div class="innerCell">- OPSCOM uses **Shortcodes** to display a section of interactive or static content like a user login, permits, etc.

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/7JRimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/7JRimage.png)

## Content Placement

Depending on where you place your content it can appear differently. OPSCOM's smart editor reads content top to bottom, left to right. Meaning that placing a user login **Shortcode** before your content will look dramatically different than if you placed the **Shortcode** last. You can see a few visual examples of how this works below.

### For Example: **Shortcodes Before Content**

<div class="columnLayout single" data-layout="single" id="bkmrk-we-are-going-to-use-"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="bf6a7d93-e9c9-4f24-81f5-75c5c86643ba" data-macro-name="expand" resolved=""><div class="expand-control" id="bkmrk--11"></div><div class="expand-content expand-hidden">We are going to use the Lot Information Shortcode to display our available lots <u>**before**</u> our text content.   
</div></div></div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/ZuRimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/ZuRimage.png)

As you can see this displays our lot information <u>**before**</u> our content.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/rp2image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/rp2image.png)

<div class="columnLayout single" data-layout="single" id="bkmrk--15"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="bf6a7d93-e9c9-4f24-81f5-75c5c86643ba" data-macro-name="expand" id="bkmrk--16" resolved=""><div class="expand-content expand-hidden" id="bkmrk--17"></div></div></div></div></div>### For Example: **Shortcodes After Content** 

<div class="columnLayout single" data-layout="single" id="bkmrk-once-again-we-are-go"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="3ae86715-0f47-411d-bacf-f5bc4c3c32fb" data-macro-name="expand" resolved=""><div class="expand-control" id="bkmrk--18"></div><div class="expand-content expand-hidden">Once again we are going to use the Lot Information Shortcode to display our available lots <u>**after**</u> our **Content**.</div></div></div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/BdIimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/BdIimage.png)

As you can see this placed the **Shortcode** <u>**after**</u> the lot information

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/9fKimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/9fKimage.png)

<div class="columnLayout single" data-layout="single" id="bkmrk--21"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="3ae86715-0f47-411d-bacf-f5bc4c3c32fb" data-macro-name="expand" id="bkmrk--22" resolved=""><div class="expand-content expand-hidden" id="bkmrk--23"></div></div></div></div></div>## Editing Pages 

Keep in mind that the **URL / System Location** next to the page is the area in OPSCOM that you are updating. Therefore, if you wished to update the permit screen, you want to edit the page with a **System Location** of /permits.

You can edit your pages attributes such as the **Title, Path, Visibility, Language, Layout,** and **Content** after it has already been created.

<div class="columnLayout single" data-layout="single" id="bkmrk-to%C2%A0edit%C2%A0a-page%2C-simp"><div class="cell normal" data-type="normal"><div class="innerCell">1. To **Edit** a page, simply click on the **Edit** button next to the page **Title** you want to edit. As seen in the image below we are going to select and edit the **Appeals Message** page.   
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/u9Kimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/u9Kimage.png)
2. You can now make any changes to the **Pages** content or attributes that you like.  
    See **Creating Pages** near the top of the page if you are not sure what a specific field does. From here we can edit the format of the text such as the colour, background color, etc..   
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Alnimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Alnimage.png)
3. If you have not made any changes to the page you are **Editing**, you may go back to the **Page List** by clicking **Return to Page List** at the top of the screen. Clicking this button will discard **all** changes recently made.   
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Q6Cimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Q6Cimage.png)
4. Once you have finished editing the page, click **Save Messaging** for your changes to take effect.   
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/xIaimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/xIaimage.png)

</div></div></div>## Creating System Messages

<p class="callout info">**Important:** Users will be brought back to the **Users** page if users do not agree with a **System Message**. Meaning, we use **System Messaging** as a convenient way to offer agreements and disclaimers before users make purchases of permits or lockers. </p>

### System Messages and How they work with Pages 

<div class="columnLayout single" data-layout="single" id="bkmrk-%C2%A0how-do-system-messa"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="350271a8-f774-4656-923d-0b19ebb705ed" data-macro-name="expand" resolved=""><div class="expand-control" id="bkmrk-%C2%A0how-do-system-messa-1"><span class="expand-control-text">How do System Messages work?</span></div><div class="expand-control"></div></div></div></div></div>**System Messages** and **Pages** work together using Disclaimer Shortcode's. When you create a **System Message,** you give that message a unique **Identifier.** System message identifiers may be used in junction with **Disclaimer Shortcodes** to display your **System Messages** onto **Pages**. The idea may be daunting at first, but once you get a better understanding of how these features work together, it will make more sense.

### Visual Example


[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/hM6image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/hM6image.png)

<div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="350271a8-f774-4656-923d-0b19ebb705ed" data-macro-name="expand" id="bkmrk-the%C2%A0system%C2%A0message%C2%A0g" resolved=""><div class="expand-content" id="bkmrk-the%C2%A0system%C2%A0message%C2%A0g-1">1. The **System** **Message** gets created.
2. The **System Message** is given an **Identifier** to be used with a specific **System Message** so we may access it on a **Page**.
3. We add the **Identifier** to the Disclaimer Shortcode on the **Page** that we want to display the message on.   
    
    1. ***<span class="legacy-color-text-blue3">Shortcode Example-</span> \[disclaimer name=lockersDisclaimer dismiss=never\]***
    2. ***<span class="legacy-color-text-blue3">Shortcode Example- </span>\[disclaimer name=vehicleDisclaimer dismiss=session show=".add-vehicle"\]***
4. **Shortcodes** may also be used on **System Messages** to display useful content such as a detailed description of the current vehicles registered to the user. See below for a list of supported **Shortcodes**.

</div></div><div class="columnLayout single" data-layout="single" id="bkmrk--28"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="350271a8-f774-4656-923d-0b19ebb705ed" data-macro-name="expand" id="bkmrk--29" resolved=""><div class="expand-content expand-hidden" id="bkmrk--30"></div></div></div></div></div>**System Messages** provide you with a convenient way to add alert messages to your pages that pop-up when a user clicks the page. You may create **System Messages** to be displayed on specific **Pages** using Disclaimer Shortcode's.

<div class="columnLayout single" data-layout="single" id="bkmrk-message-attributes-d"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="table-wrap"><table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid"><colgroup><col></col><col></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Message Attributes: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Message Attributes</th><th aria-disabled="false" aria-label="Description: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Description</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd">**Title**</td><td class="confluenceTd">The title that will be displayed across the top of the **System Message** when users navigate to that page. </td></tr><tr role="row"><td class="confluenceTd">**Identifier**</td><td class="confluenceTd">The identifier is used to know which page you want to display the message by using **Shortcodes**. </td></tr><tr role="row"><td class="confluenceTd">**Visibility**</td><td class="confluenceTd">This section toggles the visibility of your page which will make it so your users may not see the page, but you can still edit it.</td></tr><tr role="row"><td class="confluenceTd">**Language**</td><td class="confluenceTd">Select between two language options for a specific page. Tomahawk current supports **English** and **French**. </td></tr><tr role="row"><td class="confluenceTd">**Content**</td><td class="confluenceTd">Content is what will display on the actual page. You may use **Shortcodes** here to view predefined static or interactive content. For example, a user login form could be displayed on your homepage. </td></tr></tbody></table>

</div>1. To create a **System Message** merely click the **Create Page / Message** button on the top right of the **Manage System Messaging** screen.  
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/iFKimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/iFKimage.png)
2. Make sure to select the **Page Type** from the drop-down menu and change this to **Message**. It is essential that you do not select **Page** when creating a **System Message**.  
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/2Xtimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/2Xtimage.png)
    
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/3NSimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/3NSimage.png)
3. Create a **Title** for the message.
4. Give the message a unique **Identifier** so it can be accessed on your **Pages** using Disclaimer Shortcodes. **Shortcodes** are codes used to link our **Pages** and **System Messages** together.
5. Once an **Identifier** is created, It is essential to note that you may not use it anymore or you will get an error message.
6. You may modify the visibility of your **System Message** by toggling the **Visible** button on or off.
    
    <div class="table-wrap"><table class="wrapped relative-table confluenceTable tablesorter tablesorter-default" role="grid"><colgroup><col></col><col></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Toggle On(Visible): No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Toggle On(Visible)</th><th aria-disabled="false" aria-label="Toggled Off(Invisible): No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Toggled Off(Invisible)</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd">[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/XY6image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/XY6image.png)
    
    </td><td class="confluenceTd">[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/L2Himage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/L2Himage.png)
    
    </td></tr></tbody></table>
    
    </div>
7. Toggling a **System Message** as invisible ensures your users won't see it. Although, you can still **edit** and **view** the **System Message** on the admin side, but it will be displayed as seen in the image below.   
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/vd5image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/vd5image.png)
8. Select which **Language** you would like your content to be in. OPSCOM currently supports two languages which are **English** and **French**.
9. Edit the contents of your **System Message** in the editor found below the messages fields. This is the content that your users will see and will allow you to edit and format the way the text looks.  
    Once finished, click **Save Messaging.**

</div></div></div><p class="callout warning">**Warning:** Clicking **Return to Template List** before **Save Messaging** will discard all the changes you just made, meaning that the **System Message** will not get created or your changes will not occur. </p>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Kkyimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Kkyimage.png)

<div class="columnLayout single" data-layout="single" id="bkmrk--33"><div class="cell normal" data-type="normal"><div class="innerCell"><div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="e6183a34-78e5-41f8-b06e-b1f266ae4a1e" data-macro-name="info"></div></div></div></div>## Editing System Messages

You can manage your **System Messages** **Title, Identifier, Visibility, Language**, as well as modify the content to include text, images, or **Shortcodes**.

<div class="columnLayout single" data-layout="single" id="bkmrk-to%C2%A0edit%C2%A0your%C2%A0system-"><div class="cell normal" data-type="normal"><div class="innerCell">1. To **Edit** your **System Messages** click the **Messages** tab under the **Manage System Messaging** page.
2. Select the **Edit** button next to the **System Message** you wish to edit. For this example, we will be editing the **Admin Dashboard.**   
      
    [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/elXimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/elXimage.png)
3. You will now be able to adjust the message your users will see using the **System Messaging** editor. Below are the fields in which you can use to edit the **System Message**.
    
    <div class="table-wrap"><table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid"><colgroup><col></col><col></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Message Attributes: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Message Attributes</th><th aria-disabled="false" aria-label="Description: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Description</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd">**Title**</td><td class="confluenceTd">The title that will be displayed across the top of the **System Message** when users navigate to that page. </td></tr><tr role="row"><td class="confluenceTd">**Identifier**</td><td class="confluenceTd">The identifier is used to know which page you want to display the message by using **Shortcodes**. </td></tr><tr role="row"><td class="confluenceTd">**Visibility**</td><td class="confluenceTd">This section toggles the visibility of your page which will make it so your users may not see the page, but you can still edit it.</td></tr><tr role="row"><td class="confluenceTd">**Language**</td><td class="confluenceTd">Select between two language options for a specific page. OPSCOM currently supports **English** and **French**. </td></tr><tr role="row"><td class="confluenceTd">**Content**</td><td class="confluenceTd">Content is what will display on the actual page. You may use **Shortcodes** here to view predefined static or interactive content. For example, a user login form could be displayed on your homepage. </td></tr></tbody></table>
    
    </div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/TZlimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/TZlimage.png)
4. You may use the **Title** field to change the **Title** of the **System Message**.
5. You may use the **Identifier** field to change text used to display a **System Message** to a **Page,** but this will require you to modify all **Disclaimer Shortcodes** using the old unique **Identifier** for the message you are replacing.
6. You may click **Save Messaging** when you are finished making your changes.

</div></div></div>[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/W08image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/W08image.png)

## Add System Messages to Pages using Shortcodes

Now that you know how to create your **Pages** and **System Messages** you can bring them together using a <span class="legacy-color-text-red2">Disclaimer Shortcode</span>. A **Shortcode** is a small body of code surrounded by **\[ \]** used to display complex templates or features. Shortcodes limit the technicality of our system by offering a convenient way to add interactive content without having to know how to script or code.

Please review the Shortcodes for Use on the User Portal for a detailed description of how shortcodes work. You can also find a list of **Shortcodes** currently available to you by going to the OPSCOM Shortcode Documentation.

<iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="e5177982-6967-41f6-a44d-b3d0a55776f1" data-macro-name="widget" frameborder="0" height="324" src="https://www.youtube.com/embed/spoRyVUWflE?wmode=opaque" style="width: 648px; height: 324px;" width="648"></iframe>

# Templates and Design

## Overview

The User Portal system allows your clients to register, add vehicles, purchase permits and pay violations. It is an important extension of your business, and it should reflect your corporate branding.

### Pages and Templates

The OPSCOM user Page will store the functionality and content of your main page, while the Templates will be used to change the functionality of your pages as well as the content around the Page.

## Where to Find Templates and Design

Click **System Configuration**, **Templates &amp; Design** to access these features.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/KgQimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/KgQimage.png)

## All Default Templates 

If at any point you feel that you have adjusted the **Default** &lt;scripts&gt; and &lt;styles&gt; to the point of breaking your site, or you are simply unsure what your changes have done, you can refer to these templates to restore your pages functionality and style.

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="25282dd3-8bd2-43a2-8172-07e830e44191" data-macro-name="code" id="bkmrk-default-script-templ"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Script Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark js expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9-"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div><div class="line number24 index24 alt1">24</div><div class="line number25 index25 alt2">25</div><div class="line number26 index26 alt1">26</div><div class="line number27 index27 alt2">27</div><div class="line number28 index28 alt1">28</div><div class="line number29 index29 alt2">29</div><div class="line number30 index30 alt1">30</div><div class="line number31 index31 alt2">31</div><div class="line number32 index32 alt1">32</div><div class="line number33 index33 alt2">33</div><div class="line number34 index34 alt1">34</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<script>`</div><div class="line number1 index1 alt2">`    ``$(``function``(){`</div><div class="line number2 index2 alt1">`        ``$.fn.shuffle = ``function``() {`</div><div class="line number3 index3 alt2"> </div><div class="line number4 index4 alt1">`            ``var` `allElems = ``this``.get(),`</div><div class="line number5 index5 alt2">`                ``getRandom = ``function``(max) {`</div><div class="line number6 index6 alt1">`                    ``return` `Math.floor(Math.random() * max);`</div><div class="line number7 index7 alt2">`                ``},`</div><div class="line number8 index8 alt1">`                ``shuffled = $.map(allElems, ``function``(){`</div><div class="line number9 index9 alt2">`                    ``var` `random = getRandom(allElems.length),`</div><div class="line number10 index10 alt1">`                        ``randEl = $(allElems[random]).clone(``true``)[0];`</div><div class="line number11 index11 alt2">`                    ``allElems.splice(random, 1);`</div><div class="line number12 index12 alt1">`                    ``return` `randEl;`</div><div class="line number13 index13 alt2">`                ``});`</div><div class="line number14 index14 alt1"> </div><div class="line number15 index15 alt2">`            ``this``.each(``function``(i){`</div><div class="line number16 index16 alt1">`                ``$(``this``).replaceWith($(shuffled[i]));`</div><div class="line number17 index17 alt2">`            ``});`</div><div class="line number18 index18 alt1"> </div><div class="line number19 index19 alt2">`            ``return` `$(shuffled);`</div><div class="line number20 index20 alt1"> </div><div class="line number21 index21 alt2">`        ``};`</div><div class="line number22 index22 alt1">`        ``$(``'#slideshow-header div'``).shuffle();`</div><div class="line number23 index23 alt2">`        ``$(``"#slideshow-header > div:gt(0)"``).hide();`</div><div class="line number24 index24 alt1"> </div><div class="line number25 index25 alt2">`        ``setInterval(``function``() {`</div><div class="line number26 index26 alt1">`            ``$(``'#slideshow-header > div:first'``)`</div><div class="line number27 index27 alt2">`                ``.fadeOut(1000)`</div><div class="line number28 index28 alt1">`                ``.next()`</div><div class="line number29 index29 alt2">`                ``.fadeIn(1000)`</div><div class="line number30 index30 alt1">`                ``.end()`</div><div class="line number31 index31 alt2">`                ``.appendTo(``'#slideshow-header'``);`</div><div class="line number32 index32 alt1">`        ``},  10000);`</div><div class="line number33 index33 alt2">`    ``});`</div><div class="line number34 index34 alt1">`</script>`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="7f85a1ef-2387-40fd-a9b4-a9103778ab02" data-macro-name="code" id="bkmrk-default-style-templa"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Style Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark css expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div><div class="line number24 index24 alt1">24</div><div class="line number25 index25 alt2">25</div><div class="line number26 index26 alt1">26</div><div class="line number27 index27 alt2">27</div><div class="line number28 index28 alt1">28</div><div class="line number29 index29 alt2">29</div><div class="line number30 index30 alt1">30</div><div class="line number31 index31 alt2">31</div><div class="line number32 index32 alt1">32</div><div class="line number33 index33 alt2">33</div><div class="line number34 index34 alt1">34</div><div class="line number35 index35 alt2">35</div><div class="line number36 index36 alt1">36</div><div class="line number37 index37 alt2">37</div><div class="line number38 index38 alt1">38</div><div class="line number39 index39 alt2">39</div><div class="line number40 index40 alt1">40</div><div class="line number41 index41 alt2">41</div><div class="line number42 index42 alt1">42</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<style>`</div><div class="line number1 index1 alt2">`  ``body {`</div><div class="line number2 index2 alt1">`    ``background``: ``black` `url``(/uploads/FILES/OC_TOMA/parking-deck.jpg) ``center` `center``;`</div><div class="line number3 index3 alt2">`    ``background-``size``: cover;`</div><div class="line number4 index4 alt1">`    ``background-attachment``: ``fixed``;`</div><div class="line number5 index5 alt2">`    ``color``: ``#FFF``;`</div><div class="line number6 index6 alt1">`  ``}`</div><div class="line number7 index7 alt2">`  ``.card, .modal, .list-group-item {`</div><div class="line number8 index8 alt1">`    ``color``: ``#333``;`</div><div class="line number9 index9 alt2">`  ``}`</div><div class="line number10 index10 alt1">`  ``.slideshow-header {`</div><div class="line number11 index11 alt2">`    ``position``:``relative``;`</div><div class="line number12 index12 alt1">`  ``}`</div><div class="line number13 index13 alt2">`  ``.slideshow-header .slides {`</div><div class="line number14 index14 alt1">`    ``z-index``: ``0``;`</div><div class="line number15 index15 alt2">`    ``position``:``absolute``;`</div><div class="line number16 index16 alt1">`    ``top``:``0px``;`</div><div class="line number17 index17 alt2">`    ``left``:``0px``;`</div><div class="line number18 index18 alt1">`    ``right``:``0px``;`</div><div class="line number19 index19 alt2">`    ``bottom``:``0px``;`</div><div class="line number20 index20 alt1">`    ``display``:flex;`</div><div class="line number21 index21 alt2">`    ``align-items: ``center``;`</div><div class="line number22 index22 alt1">`    ``justify-``content``: ``center``;`</div><div class="line number23 index23 alt2">`  ``}`</div><div class="line number24 index24 alt1">`  ``.slideshow-header .overlay {`</div><div class="line number25 index25 alt2">`    ``z-index``: ``1``;`</div><div class="line number26 index26 alt1">`    ``position``:``relative``;`</div><div class="line number27 index27 alt2">`  ``}`</div><div class="line number28 index28 alt1">`  ``#slideshow-header {`</div><div class="line number29 index29 alt2">`    ``overflow``: ``hidden``;`</div><div class="line number30 index30 alt1">`    ``opacity:``0.8``;`</div><div class="line number31 index31 alt2">`    ``box-shadow: ``0` `0` `20px` `rgba(``0``, ``0``, ``0``, ``0.4``);`</div><div class="line number32 index32 alt1">`  ``}`</div><div class="line number33 index33 alt2"> </div><div class="line number34 index34 alt1">`  ``#slideshow-header > div {`</div><div class="line number35 index35 alt2">`    ``width``:``100%``;`</div><div class="line number36 index36 alt1">`    ``position``: ``absolute``;`</div><div class="line number37 index37 alt2">`  ``}`</div><div class="line number38 index38 alt1"> </div><div class="line number39 index39 alt2">`  ``#slideshow-header div img {`</div><div class="line number40 index40 alt1">`    ``width``: ``100%``;`</div><div class="line number41 index41 alt2">`  ``}`</div><div class="line number42 index42 alt1">`</style>`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="af804e06-34ed-4274-bf51-205e34a144ce" data-macro-name="code" id="bkmrk-default-header-templ"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Header Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark xml expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--2"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<``div` `class``=``"text-center slideshow-header"``>`</div><div class="line number1 index1 alt2">`  ``<``div` `class``=``"slides"` `id``=``"slideshow-header"``>`</div><div class="line number2 index2 alt1">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-downtown.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-downtown.jpg"</a>` `/></``div``>`</div><div class="line number3 index3 alt2">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-hospital.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-hospital.jpg"</a>` `/></``div``>`</div><div class="line number4 index4 alt1">`    ``<``div``><``img` `src``=``"<a href="https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-postoffice.jpg%22">https://tomahawku.parkadmin.com/uploads/FILES/OC_TOMA/cp-postoffice.jpg"</a>` `/></``div``>`</div><div class="line number5 index5 alt2">`  ``</``div``>`</div><div class="line number6 index6 alt1">`  ``<``div` `class``=``"overlay"``>`</div><div class="line number7 index7 alt2">`    ``<``img` `alt``=``""` `class``=``"img-fluid"` `src``=``"/MEDIA/demo_extras/TomahawkUniversity_logo.png"` `style``=``"display:inline; width: 450px; margin-top: 80px; margin-bottom:80px;"``/>`</div><div class="line number8 index8 alt1">`  ``</``div``>`</div><div class="line number9 index9 alt2">`</``div``>`</div><div class="line number10 index10 alt1">`[user_menu]`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="696fc053-1a67-4886-bce0-fb2fe92e62f4" data-macro-name="code" id="bkmrk-default-footer-templ"><div class="codeHeader panelHeader pdl hide-border-bottom">**Default Footer Template**<span class="collapse-source expand-control"><span class="expand-control-icon icon expanded"> </span></span></div><div class="codeContent panelContent pdl hide-toolbar show-border-top"><div><div class="syntaxhighlighter sh-rdark xml expanded" id="bkmrk-%C2%A0-1-2-3-4-5-6-7-8-9--3"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number0 index0 alt1 break"> </div><div class="line number1 index1 alt2">1</div><div class="line number2 index2 alt1">2</div><div class="line number3 index3 alt2">3</div><div class="line number4 index4 alt1">4</div><div class="line number5 index5 alt2">5</div><div class="line number6 index6 alt1">6</div><div class="line number7 index7 alt2">7</div><div class="line number8 index8 alt1">8</div><div class="line number9 index9 alt2">9</div><div class="line number10 index10 alt1">10</div><div class="line number11 index11 alt2">11</div><div class="line number12 index12 alt1">12</div><div class="line number13 index13 alt2">13</div><div class="line number14 index14 alt1">14</div><div class="line number15 index15 alt2">15</div><div class="line number16 index16 alt1">16</div><div class="line number17 index17 alt2">17</div><div class="line number18 index18 alt1">18</div><div class="line number19 index19 alt2">19</div><div class="line number20 index20 alt1">20</div><div class="line number21 index21 alt2">21</div><div class="line number22 index22 alt1">22</div><div class="line number23 index23 alt2">23</div></td><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number0 index0 alt1 break">`<``div` `class``=``"bg-light text-dark"``>`</div><div class="line number1 index1 alt2">`    ``<``div` `class``=``"container py-3"``>`</div><div class="line number2 index2 alt1">`        ``<``div` `class``=``"row"``>`</div><div class="line number3 index3 alt2">`            ``<``div` `class``=``"col-sm"``>`</div><div class="line number4 index4 alt1">`                ``<``img` `class``=``"img-fluid mb-3 mb-md-0"` `src``=``"//assets.OPSCOM.com/images/opscom-logo-tagline-120.png"` `alt``=``"Operations Commander"` `/>`</div><div class="line number5 index5 alt2">`            ``</``div``>`</div><div class="line number6 index6 alt1">`            ``<``div` `class``=``"col-sm text-right"``>`</div><div class="line number7 index7 alt2">`                ``<``address``>`</div><div class="line number8 index8 alt1">`                    ``<``strong``>Tomahawk DEMO University</``strong``><``br` `/>`</div><div class="line number9 index9 alt2">`                    ``92 Bridge St., Carleton Place, ON<``br` `/>`</div><div class="line number10 index10 alt1">`                    ``K7C 2V3<``br` `/>`</div><div class="line number11 index11 alt2">`                    ``+1.855.410.4141<``br` `/>`</div><div class="line number12 index12 alt1">`                    ``<``a` `href``=``"mailto:info@ops-com.comcom"``>info@ops-com.comcom</``a``>`</div><div class="line number13 index13 alt2">`                ``</``address``>`</div><div class="line number14 index14 alt1">`            ``</``div``>`</div><div class="line number15 index15 alt2">`        ``</``div``>`</div><div class="line number16 index16 alt1">`        ``<``div` `class``=``"row"``>`</div><div class="line number17 index17 alt2">`            ``<``div` `class``=``"col text-center"``>`</div><div class="line number18 index18 alt1">`                ``<``p``>The <``em``>complete</``em``> parking and security management solution that links parking, violation and incident management collectively.</``p``>`</div><div class="line number19 index19 alt2">`                ``<``p``><``span` `style``=``"color:black;"``>Operations</``span``><``span` `style``=``"color:red;"``>Commander</``span``> (<``a` `href``=``"<a href="https://OPSCOM.com%22/">https://OPSCOM.com"</a>``>OPSCOM</``a``>) will <``strong``>AMPLIFY</``strong``>, <``strong``>AUTOMATE </``strong``>and <``strong``>ANALYZE </``strong``>your parking and security needs.</``p``>`</div><div class="line number20 index20 alt1">`            ``</``div``>`</div><div class="line number21 index21 alt2">`        ``</``div``>`</div><div class="line number22 index22 alt1">`    ``</``div``>`</div><div class="line number23 index23 alt2">`</``div``>`</div></div></td></tr></tbody></table>

</div></div></div></div>## Understanding Templates &amp; Design 

**Templates &amp; Designs** are the visual functionality of your web page structured around your **Page** content. OPSCOM provides you with default templates which allow you to get started easily without having to know any code.

- Once you are on the landing page for **Templates &amp; Design,** you can view a list of your current templates, or create a new one. **Templates** contain all of the sections found on your **User Portal** except for the **Page** content found in the middle of the page. To adjust this you will have to leave Templates &amp; Design and navigate to **System Messaging**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/p7wimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/p7wimage.png)

- OPSCOM gives you a total of 12 section templates, 6 in English and 6 in French. (Of course, you will have to create the French content yourself as we do not provide a translator).

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/ZWOimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/ZWOimage.png)

1. Clicking on **Toggle Templates** will display all of the sections attached to that template. Templates can be created in English and French.
2. The contents of our pages are split into four separate sections. Header(1)**,** Content Header(2), Content Footer(4), and Footer(5). See **Template Layout** right below this guide to get a better understanding of the OPSCOM layout.
3. To edit a template **Section,** simply click **Edit** next to the section name.

### Template Layout

Below is a visual example of how your **Pages** are split into **Sections** using **Templates**. All of the Content (3) of our Pages are added through the **System Messages** under **Pages**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/gJrimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/gJrimage.png)

1. **Header** - The header of your page, where you can find your header image and user navigation.
2. **Content\_Header** - Another header section for you to place content into, such as alerts or user information. Everything placed here will appear before the Content and Content Footer.
3. **Content** - The content of your pages. Content may not be added from Templates &amp; Design and will require you to navigate to **System Messaging**.
4. **Content\_Footer** - The footer of your Content. Everything placed here will appear after the Content Header and Content. Again, you can use this to display alerts, messages, or additional content to your Template.
5. **Footer** - The footer of your page is where you can find useful information. You can use this area to advertise important information your users might need while using your system.

## Page Layouts and Templates 

### Creating Layouts

To create a layout simply click the **Create Layout** button found at the top right of the **Layouts** page.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/mvtimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/mvtimage.png)

You will be presented with the **Add Layout** system message.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/ebMimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/ebMimage.png)

1. Provide the name of your layout. In this example, we are going to create our own Summer Layout to be used, instead of the default layout.
2. Click **Save Changes** when you are happy with the name of your layout. Once the **Layout** has been created, you can see it under the Layouts list.
3. If you wish to cancel the creation of your layout simply click **Close**.
4. You can see that our **Summer Layout** was added to the end of our Layouts List with no sections yet.
5. You can choose whether or not your template is the **Default** template at any time by clicking the **Non-Default** drop-down and selecting **Default**.
6. Anytime you add sections to your Templates it will display how many are attached next to **Toggle Templates**. As you can see, we don't have any **Sections** created yet so there are no numbers to be displayed, otherwise, clicking on **Toggle Templates** would show you a list of all the templates currently attached to that **Layout**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/lNwimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/lNwimage.png)

 7. You can edit the layout name by clicking on the **Edit** button next to archive.

 8. If you would like to archive a layout that you are no longer using, you can click the **Archive** button next to edit.

### Creating Templates

Now that you have a better understanding of how **Templates** work with **Layouts** we can start creating our own.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/o02image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/o02image.png)

1. Click on Toggle Templates.
2. Clicking this will display the available Templates attached to the **Summer Layout**.
3. You can now **Create** a variety of templates for your page, including bilingual support.
4. If you are non-technical, it is advised not to change the code for **Scripts, Styles, Header,** and **Footer Templates**. You can use the default Style, Script, Header, and Footer Templates from All Default Templates. These can still be edited according to your company and their style guides. See **Edit the Page Style** and **Edit the Page Behaviour** below for more information.

## Edit the Page Style (CSS) 

Important

This guide is used if you intend to adjust the **Templates** provided to you by OPSCOM. If you choose to rewrite your own Templates you can choose to ignore this.

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="b1a0c6ea-b942-4acc-ab21-1f431483d33f" data-macro-name="code" id="bkmrk-content-%2F%2A-style-pro"><div class="codeHeader panelHeader pdl">**Content**</div><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-rdark nogutter  css" id="bkmrk-%2F%2A-style-properties-"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`/* Style properties of our page body, this affects the entire page. */`</div><div class="line number2 index1 alt1">`body {`</div><div class="line number3 index2 alt2">`    ``background``: ``black` `url``(/uploads/FILES/OC_TOMA/parking-deck.jpg) ``center` `center``;`</div><div class="line number4 index3 alt1">`    ``background-``size``: cover;`</div><div class="line number5 index4 alt2">`    ``background-attachment``: ``fixed``;`</div><div class="line number6 index5 alt1">`    ``color``: ``#FFF``;`</div><div class="line number7 index6 alt2">`}`</div><div class="line number8 index7 alt1"> </div><div class="line number9 index8 alt2">`/* This changes the color property of --Find where these classes are used `</div><div class="line number10 index9 alt1">`.card, .modal, .list-group-item {`</div><div class="line number11 index10 alt2">`    ``color``: ``#333``;`</div><div class="line number12 index11 alt1">`}`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="7e6909e2-7f5a-4b6a-95d5-796440c6c5eb" data-macro-name="code" id="bkmrk-slide-show-%2F%2A-below-"><div class="codeHeader panelHeader pdl">**Slide Show**</div><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-rdark nogutter  css" id="bkmrk-%2F%2A-below-are-all-of-"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`/* Below are all of the styles for our header slideshow at the top of each page. */`</div><div class="line number2 index1 alt1">`/*--------------WORD BANK---------------`</div><div class="line number3 index2 alt2">` ``* ELEMENTS: Elements are the tags with '<>' around them such as <div> and <img> found in the default header and footer template.`</div><div class="line number4 index3 alt1">` ``* We access them here by giving them a Class name or ID.                                          `</div><div class="line number5 index4 alt2">` ``* PROPERTIES: Properties are used to define certain styles to a class or ID.`</div><div class="line number6 index5 alt1">` ``* CLASS: Generally used to assign a style to a group of HTML elements but can be used on single elements as well.`</div><div class="line number7 index6 alt2">` ``* They are assigned within HTML elements like this: <div class="MyClass"></div> where MyClass would be your class name.`</div><div class="line number8 index7 alt1">` ``* ID's: Generally used to assign styles to a single element but can be used on multiple elements as well.`</div><div class="line number9 index8 alt2">` ``*`</div><div class="line number10 index9 alt1">` ``*--------------CLASSES-----------------`</div><div class="line number11 index10 alt2">` ``*`</div><div class="line number12 index11 alt1">` ``* To learn more about the CSS Position Property see: <a href="https://www.w3schools.com/cssref/pr_class_position.asp">https://www.w3schools.com/cssref/pr_class_position.asp</a>`</div><div class="line number13 index12 alt2">` ``* For more information on CSS Syntax and Selectors see: <a href="https://www.w3schools.com/css/css_syntax.asp">https://www.w3schools.com/css/css_syntax.asp</a>`</div><div class="line number14 index13 alt1">` ``* It is not recommended to adjust with the position of elements unless you are sure about the changes being made. This can dramatically change how content is positioned. `</div><div class="line number15 index14 alt2">` ``*/`</div><div class="line number16 index15 alt1"> </div><div class="line number17 index16 alt2">`/* Class Names and Elements`</div><div class="line number18 index17 alt1">` ``* [.slideshow-header]: Container that contains our slides and overlay.`</div><div class="line number19 index18 alt2">` ``*`</div><div class="line number20 index19 alt1">` ``* Properties`</div><div class="line number21 index20 alt2">` ``* @position: Adjust the position of the slideshow-header. For more information see: <a href="https://www.w3schools.com/css/css_positioning.asp">https://www.w3schools.com/css/css_positioning.asp</a>`</div><div class="line number22 index21 alt1">` ``*/` </div><div class="line number23 index22 alt2">`.slideshow-header {`</div><div class="line number24 index23 alt1">`    ``position``:``relative``;`</div><div class="line number25 index24 alt2">`}`</div><div class="line number26 index25 alt1"> </div><div class="line number27 index26 alt2">`/* Class Names and Elements `</div><div class="line number28 index27 alt1">` ``* [.slideshow-header]: Container that contains our slides and overlay.`</div><div class="line number29 index28 alt2">` ``* [.slides]: Controls the style properties of the individual slides.`</div><div class="line number30 index29 alt1">` ``* `</div><div class="line number31 index30 alt2">` ``* Properties  `</div><div class="line number32 index31 alt1">` ``* @z-index: Adjust the stack placement of the [.slideshow-header] and [.slides] along the Z axis.`</div><div class="line number33 index32 alt2">` ``* @position: Define the position of the page. `</div><div class="line number34 index33 alt1">` ``* @top:Change in the position from the top of an element.`</div><div class="line number35 index34 alt2">` ``* @left: Change in the position from the left of an element.`</div><div class="line number36 index35 alt1">` ``* @right: Change in the position from the right of an element.`</div><div class="line number37 index36 alt2">` ``* @bottom: Change in the position from the bottom of an element.`</div><div class="line number38 index37 alt1">` ``* @display: Adjusts how the content is displayed on the page. See: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display">https://developer.mozilla.org/en-US/docs/Web/CSS/display</a> and <a href="https://www.w3schools.com/css/css_display_visibility.asp">https://www.w3schools.com/css/css_display_visibility.asp</a>`</div><div class="line number39 index38 alt2">` ``* @align-items: Aligns the child elements of this PARENT element to be centered. For a visual example see: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/align-items">https://developer.mozilla.org/en-US/docs/Web/CSS/align-items</a>`</div><div class="line number40 index39 alt1">` ``* @justify-content: Defines how the space disturbed around the child elements. For a visual example see: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content">https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content</a>`</div><div class="line number41 index40 alt2">` ``*`</div><div class="line number42 index41 alt1">` ``* These are the style properties and values of the slideshow header and its individual slides.`</div><div class="line number43 index42 alt2">` ``*/`</div><div class="line number44 index43 alt1">`.slideshow-header .slides {`</div><div class="line number45 index44 alt2">`    ``z-index``: ``0``;`</div><div class="line number46 index45 alt1">`    ``position``:``absolute``;`</div><div class="line number47 index46 alt2">`    ``top``:``0px``;`</div><div class="line number48 index47 alt1">`    ``left``:``0px``;`</div><div class="line number49 index48 alt2">`    ``right``:``0px``;`</div><div class="line number50 index49 alt1">`    ``bottom``:``0px``;`</div><div class="line number51 index50 alt2">`    ``display``:flex;`</div><div class="line number52 index51 alt1">`    ``align-items: ``center``;`</div><div class="line number53 index52 alt2">`    ``justify-``content``: ``center``;`</div><div class="line number54 index53 alt1">`}`</div><div class="line number55 index54 alt2"> </div><div class="line number56 index55 alt1">`/* Class Names and Elements`</div><div class="line number57 index56 alt2">` ``* [.slideshow-header]: A container that contains our slides and overlay.`</div><div class="line number58 index57 alt1">` ``* [.overlay]:`</div><div class="line number59 index58 alt2">` ``*`</div><div class="line number60 index59 alt1">` ``* Properties`</div><div class="line number61 index60 alt2">` ``* @z-index: Used to layer elements. Elements with a higher z-index number will appear before elements that are lower.`</div><div class="line number62 index61 alt1">` ``* @position: Set the position property for the element. We recommend you do not adjust this property unless you have knowledge on how the changes will affect your page.`</div><div class="line number63 index62 alt2">` ``*`</div><div class="line number64 index63 alt1">` ``* These are the styles for the overlay, as well as additional properties for the slideshow-header.`</div><div class="line number65 index64 alt2">` ``*/` </div><div class="line number66 index65 alt1">`.slideshow-header .overlay {`</div><div class="line number67 index66 alt2">`    ``z-index``: ``1``;`</div><div class="line number68 index67 alt1">`    ``position``:``relative``;`</div><div class="line number69 index68 alt2">`}`</div><div class="line number70 index69 alt1"> </div><div class="line number71 index70 alt2">`/*--------------ID'S---------------*/`</div><div class="line number72 index71 alt1">`/* ID Names and Elements`</div><div class="line number73 index72 alt2">` ``* [#slideshow-header] is the container used to contain the images you have chosen for your header`</div><div class="line number74 index73 alt1">` ``*`</div><div class="line number75 index74 alt2">` ``* Properties`</div><div class="line number76 index75 alt1">` ``* @overflow:`</div><div class="line number77 index76 alt2">` ``* @opacity:`</div><div class="line number78 index77 alt1">` ``* @box-shadow: Create a box shadow for this element.`</div><div class="line number79 index78 alt2">` ``* EX: box-shadow: a, b, c, d(e, f, g, h); `</div><div class="line number80 index79 alt1">` ``*/`</div><div class="line number81 index80 alt2">`#slideshow-header {`</div><div class="line number82 index81 alt1">`    ``overflow``: <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/overflow">https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/overflow</a>`</div><div class="line number83 index82 alt2">`    ``opacity: <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/opacity">https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/opacity</a>`</div><div class="line number84 index83 alt1">`    ``box-shadow: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow">https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow</a>`</div><div class="line number85 index84 alt2">`}`</div><div class="line number86 index85 alt1">` ` </div><div class="line number87 index86 alt2">`/* ID Names and Elements`</div><div class="line number88 index87 alt1">` ``* [#slideshow-header] is the container used to contain the images you have chosen for your header`</div><div class="line number89 index88 alt2">` ``*`</div><div class="line number90 index89 alt1">` ``* Properties`</div><div class="line number91 index90 alt2">` ``* @width: 100% width will take of 100% of that element.`</div><div class="line number92 index91 alt1">` ``* @position:`</div><div class="line number93 index92 alt2">` ``*/`</div><div class="line number94 index93 alt1">`#slideshow-header > div {`</div><div class="line number95 index94 alt2">`    ``width``:``100%``;`</div><div class="line number96 index95 alt1">`    ``position``: ``absolute``;`</div><div class="line number97 index96 alt2">`}`</div><div class="line number98 index97 alt1">` ` </div><div class="line number99 index98 alt2">`/* ID Names and Elements`</div><div class="line number100 index99 alt1">` ``* [#slideshow-header]: is the container used to contain the images you have chosen for your header.`</div><div class="line number101 index100 alt2">` ``* [div]: Refers to our HTML elements.  `</div><div class="line number102 index101 alt1">` ``* [img]: Refers to our images in the slideshow. `</div><div class="line number103 index102 alt2">` ``* `</div><div class="line number104 index103 alt1">` ``* Properties`</div><div class="line number105 index104 alt2">` ``* @width: Defines the width of the images, divs and slideshow-header. A value of 100% will display the image across the entire page. `</div><div class="line number106 index105 alt1">` ``*/`</div><div class="line number107 index106 alt2">`#slideshow-header div img {`</div><div class="line number108 index107 alt1">`    ``width``: ``100%``;`</div><div class="line number109 index108 alt2">`}`</div></div></td></tr></tbody></table>

</div></div></div></div>## Edit the Page Behavior (Scripts) 

Disclaimer

Please review the list of supported scripting languages below. If a Javascript vendor is unverified it may break the functionality of your site.

<div class="confluence-information-macro confluence-information-macro-information conf-macro output-block" data-hasbody="true" data-macro-id="ec5d792b-4d4e-4332-a7c3-5e60d197634a" data-macro-name="info" id="bkmrk-%C2%A0verified-script-ven"><div class="confluence-information-macro-body"><div class="expand-container conf-macro output-block" data-hasbody="true" data-macro-id="5be4559a-5e3c-48ee-b55a-886957ba70b4" data-macro-name="expand" id="bkmrk-%C2%A0verified-script-ven-1" resolved=""><div class="expand-control" id="bkmrk-%C2%A0verified-script-ven-2"><span class="expand-control-icon icon expanded"> </span><span class="expand-control-text">Verified Script Vendors</span></div><div class="expand-content" id="bkmrk-bootstrap%C2%A0-jquery---">1. Bootstrap
2. jQuery - To fully customize the slideshow script that displays the slideshow found at the top of each page, you will need to know jQuery. You could choose to rewrite the slideshow script in whichever Javascript vendor that is verified.

</div></div></div></div>## API Integration

Additionally, you can use our API to integrate with pay stations and other devices that will allow you to grab useful information from your users.

# Form 11 Shortcodes

## Information

When issuing a Form 11, there are a number of shortcodes that can be placed in the template to auto-fill values relating to the violation.

The base short code is formatted like:

- **\[values show=violation.\_\_\_\_\_\]**

The blank value must be filled with a value to pull from the violation info.

For each nested value in the data packet, the packet name must be added as part of the variable name, each part separated by a period, with the variable to be output by the shortcode as the final part of the variable.

The packet itself is called by 'violation', and the name must be placed at the start of any value call.

### Violation Packet

The violation info packet is formatted like this example.

The values on the left are the variable names, the values on the right are the example values returned by this packet.

```json
{
    "ViolationID": 237,
    "SemPermitID": null,
    "Ticket": "TT-19026",
    "VehicleID": 5,
    "Spoiled": 0,
    "TicketType": 1,
    "Issued": "2024-07-17 16:11:00",
    "convNotice": null,
    "Due": "2024-07-27 16:11:00",
    "ViolationTypeID": -1,
    "Fine": "50.0000",
    "AdjustedFine": "20.0000",
    "Towing": "0.0000",
    "taxAmount": "0.0000",
    "Writer": 7,
    "LocationID": 10,
    "Comment": null,
    "TicketAppeal": null,
    "appealType": 0,
    "appealFormat": null,
    "AccessAdminID": 50,
    "ActionedPer": null,
    "Created": "2024-07-17 20:12:08",
    "AppealUserID": 0,
    "AppealProcessDate": null,
    "AppealAdminID": 0,
    "AppealComment": null,
    "AppealAdminComment": null,
    "AutoNotice": 0,
    "ProcessedByCollection": null,
    "SentToCollections": null,
    "PrivateComments": "",
    "DriveAway": 0,
    "UUID": null,
    "VioNotice": null,
    "latitude": null,
    "longitude": null,
    "Warning": null,
    "userid": null,
    "incidentID": null,
    "failToIdentify": null,
    "pin": "YL",
    "duplicate": null,
    "AdjustmentReason": null,
    "notices_count": 1,
  
    "user_info": {
            "UserID": 5,
            "studentNo": null,
            "employNo": "00800147",
            "username": "mashbury",
            "firstName": "Michael",
            "preferredname": null,
            "lastName": "Ashbury",
            "street": "688 Zaproxy Ridge",
            "city": "East Romaineburgh",
            "prov": 9,
            "postal": "K2G5B1",
            "email": "mash-bury@tomahawk.ca",
            "display_name": "Michael Ashbury",
            "account_no": "00800147",
            "prov_name": "Ontario",
    },
  
    "writer": {
            "AdminAccessID": 7,
            "Username": "admin",
            "DisplayName": "Administrator"
    },
  
    "vehicle": {
            "VehicleID": 5,
            "Active": 1,
            "Plate": "MASH",
            "Year": 1998,
            "TotalVio": 12,
            "TotalUnpaid": 2,
            "TotalWarning": 0,
            "vehicleAlert": true,
            "vin": "JNAMA43H9XGE50339",
            "electric_vehicle": false,
          
            "province": {
                    "ProvName": "West Virginia",
                    "ProvCode": "WV",
            },

            "make": {
                  "MakeName": "Toyota"
            },
            
            "colour": {
                  "ColourName": "Black"
            },
            
            "plate_type": {
                  "TypeName": " Passenger"
            }
        
            "vehicle_type": {
                  "TypeName": " Van"
            },
      
    },
  
    "location": {
            "LocationID": 10,
            "LocationName": "Hospital & Administration Building",
    },
  
    "details": {
            "ViolationsDetailID": 359,
            "ViolationID": 237,
            "Ticket": "TT-19026",
            "ViolationTypeID": 16,
            "LocationID": 10,
            "offenceFine": 50,
            "discountFlag": 1,
            "discountAmount": 20,
            "discountHours": 240,
          
            "type": {
                    "ViolationTypeID": 16,
                    "ViolationDescr": "No Parking Snow Route - Mandatory Towing",
                    "DefaultCost": 50,
                    "discountFlag": true,
                    "discountAmount": 20,
                    "discountHours": 240,
            }
    }
}
```

### Examples

An example shortcode is provided for each section. To return a specific value in the same section, replace the provided variable name with the sibling value wanted for output.

<table border="1" id="bkmrk-example-shortcode-de" style="border-collapse: collapse; width: 105.238%; height: 268.2px;"><colgroup><col style="width: 44.8211%;"></col><col style="width: 55.1789%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">**Example Shortcode**  
</td><td style="height: 29.8px;">**Description**  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.Ticket\]

</td><td style="height: 29.8px;">Returns the violation ticket number.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.user\_info.username\]</td><td style="height: 29.8px;">Returns the username of the user the violation belongs to.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.writer.DisplayName\]</td><td style="height: 29.8px;">Returns the display name of the admin who assigned the violation to the user.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.vehicle.Plate\]</td><td style="height: 29.8px;">Returns the plate of the vehicle the violation was assigned to, if applicable.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.vehicle.province.ProvName\]</td><td style="height: 29.8px;">Returns the province or state of the vehicle plate.  
</td></tr><tr><td>\[values show=violation.vehicle.colour.ColourName\]</td><td>Returns the colour of the vehicle.  
</td></tr><tr><td>\[values show=violation.vehicle.plate\_type.TypeName\]</td><td>Returns the plate type of the vehicle.</td></tr><tr><td>\[values show=violation.vehicle.vehicle\_type.TypeName\]</td><td>Returns the type of the vehicle.</td></tr><tr><td>\[values show=violation.vehicle.make.MakeName\]</td><td>Returns the make of the vehicle.</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.location.LocationName\]</td><td style="height: 29.8px;">Returns the name of the location the infraction happened.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.details.0.Ticket\]</td><td style="height: 29.8px;">Returns the violation ticket number. Alternate value location.  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">\[values show=violation.details.0.type.ViolationDescr\]</td><td style="height: 29.8px;">Returns the violation type description.  
</td></tr></tbody></table>

# User Information Shortcodes

## Shortcodes

Shortcodes used to display user information.

Keep in mind that the shortcode descriptions are also on the email template page for lost passwords.

<table border="1" id="bkmrk-shortcode-descriptio" style="border-collapse: collapse; width: 85.119%; height: 178.8px;"><colgroup><col style="width: 32.7765%;"></col><col style="width: 67.2216%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">**Shortcode**  
</td><td style="height: 29.8px;">**Description**  
</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;"> \[user show="firstname"\]</td><td style="height: 29.8px;">The first name of the user account receiving the email or messaging. </td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;"> \[user show="lastname"\]</td><td style="height: 29.8px;">The last name of the user account receiving the email or messaging. </td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;"> \[user show="email"\]</td><td style="height: 29.8px;">The email address of the user account receiving the email or messaging. </td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;"> \[user show="username"\]</td><td style="height: 29.8px;">The username of the user account receiving the email or messaging. </td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;"> \[user show="salutation"\]</td><td style="height: 29.8px;">The salutation of the user account receiving the email or messaging. </td></tr></tbody></table>

# User Configuration

# User Types

<p class="callout info">**User Types** in OPSCOM categorize your system users (e.g., Student, Staff, Public) and control various aspects of their interaction with the system, including access to specific lots, available payment options, and the fields visible on their profile. Configuring user types allows administrators to tailor the OPSCOM experience to different user groups, ensuring appropriate permissions and functionalities.</p>

### Setup &amp; Configuration

User Type configurations are managed through the **User Type Administration** tool.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **System Configuration,** then **Users,** and click **Types.**

</div></div></div></div></div></div></div></div>This will open the **User Type Administration** page, displaying a list of your existing User Types.

##### <span style="text-decoration: underline;">Creating a New User Type</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-the-create-new"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click the **Create New User Type** button.
2. Enter the **Type Name** for your new user type (e.g., **Public Parker**).
3. Set the **Grouping** for this user type. This is crucial as it links to OPSCOM's internal master user categories, which govern access to other system items and the appearance of profile forms. The four main internal categories are: 
    - **Staff**
    - **Student**
    - **Public**
    - **Athletics**

</div></div></div></div></div></div></div></div><p class="callout info">New user types must be assigned to one of these categories. These are hardcoded and cannot be changed.</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-you-can-toggle-visib"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. You can toggle **Visible to Users** to make this user type selectable by end-users during registration.
2. Set the number of **Extra Active Vehicles** that users of this type can have. [By default, users can have one active vehicle; this field specifies how many *additional* active vehicles are allowed.](https://opscom.wiki/books/setup-configuration-for-admins/page/limiting-active-vehicles)
3. Choose the **Allowed Payment Types** for this User Type by enabling the checkbox next to the Payment Type. [Refer to this wiki article for more information.](https://opscom.wiki/books/setup-configuration-for-admins/page/managing-payment-types)
4. Click **Create User Type**.

</div></div></div></div></div></div></div></div>[![2025-06-17_15-08-20.jpg](https://opscom.wiki/uploads/images/gallery/2025-06/2025-06-17-15-08-20.jpg)](https://opscom.wiki/uploads/images/gallery/2025-06/2025-06-17-15-08-20.jpg)


Once saved, your new user type (e.g., **Public Parker**) will appear in the list.

<p class="callout success">You can also create user types to allow you to categorize your archived users. [Refer to this wiki article](https://opscom.wiki/books/the-opscom-admin-portal/page/archiving-or-disabling-a-user) to learn about managing archived users by user type.</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--2"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

</div></div></div></div></div></div></div></div>### Using this Feature

##### <span style="text-decoration: underline;">Applying a User Type to a User</span>

A **User Type** can be assigned to a user when their account is created or changed at any time later.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-user-mana"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **User Management** and click **User Search**.
2. Search for the user you want to edit.
3. [Edit the user profile](https://opscom.wiki/books/the-opscom-admin-portal/page/user-profile-overview) and click the **User Type** picklist.
4. Choose the desired User Type (e.g., **Public Parker**).
5. Click **Submit Profile Information**, review the submission, and click the **Information Correct** button.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Searching by User Type</span>

User Types can be used as criteria in various search tools within OPSCOM. You can use the User Search tool or you can click the **\# of Users** button beside the lot to automatically perform a search for this user type.

##### <span style="text-decoration: underline;">Searching for Payment Types Assigned by User Type</span>

You can click the **\# of Payment Types** button to immediately see a list of all payment types associated to each user type.

##### <span style="text-decoration: underline;">Configuring Access to Lots with User Types</span>

User Types play a critical role in controlling access to parking lots.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-parking-m"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **Parking Management,** then **Lot Administration,** and click [**Pricing &amp; Lot Admin**](https://opscom.wiki/books/the-opscom-admin-portal/page/pricing-and-lot-admin).
2. Click on the **Lot Name** of the lot you wish to configure.
3. On the **General Tab**, under the **Lot Access** section, ensure **User Type Lot** is selected.
4. Select the specific **user types** you wish to allow access to this lot in the **Lot Types** picklist. Ctrl + Click to select multiple types. 
    - **Scenario Example**: For a particular lot, you might allow students and public parkers to purchase permits but restrict access for Staff/Faculty users.
5. When viewing the list of lots in **Lot Administration**, you can click **Show/Hide Lot User Types** to quickly see which user types a lot is configured for.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">User-Side Lot Visibility</span>

When a user logs into the system (e.g., as "Joseph Callaghan" who is a student), and attempts to purchase a permit:

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-the-system-will-only"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- The system will **only** display lots that are configured for that user's specific User Type.
- In this example, the user might only see "Standard Permit Lot" and "Text2Park" if those are the only lots accessible to their user type.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Deleting or Archiving a User Type</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-a-user-type-can-only"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- A user type can only be **deleted** or **archived** if **no users are currently assigned to it**. You must reassign all users from a user type before it can be removed. Once you have done so, edit the user and click the **Delete User Type** button.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-align-with-organizat"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- <span style="color: rgb(22, 145, 121);">**Align with Organizational Structure**: Create user types that directly reflect the categories of individuals interacting with your system (e.g., Faculty, Undergraduate, Graduate, Visitor).</span>
- <span style="color: rgb(22, 145, 121);">**Control Vehicle Limits**: Use the **Extra Active Vehicles** setting to manage the number of vehicles associated with users, which can impact parking availability and system load.</span>
- <span style="color: rgb(22, 145, 121);">**Granular Access Control**: Leverage user types in **Lot Administration** to precisely control who can access and purchase permits for specific parking areas, enhancing security and resource allocation.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Profile Fields**: Remember that the **Grouping** (Staff, Student, Public, Athletics) you assign to a User Type affects the visibility of fields in the user's profile registration form. For instance, student users might see specific student ID fields that staff users would not.</span>
- <span style="color: rgb(22, 145, 121);">**Payment Type Restrictions**: Utilize the **Allowed Payment Types** to ensure only relevant payment methods are available to specific user types (e.g., restricting payroll deduction to Staff users only).</span>
- <span style="color: rgb(22, 145, 121);">**Clear User Communication**: Ensure users understand their assigned user type and how it affects their system experience, including visible lots and payment options.</span>

</div></div></div></div></div></div></div></div><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--3"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-align-with-organizat-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-align-with-organizat-2"></div></div></div></div></div></div></div></div>

# Limiting Active Vehicles

<p class="callout info"><span data-colorid="dg9sgk26yn">OPSCOM allows administrators to control the number of active vehicles a user can have associated with their profile. This feature, configured through **User Types**, helps manage parking inventory, prevent abuse, and ensures that users maintain a reasonable number of active vehicles in the system. This article explains how to set these limits and how they impact the user experience.</span></p>

### Setup &amp; Configuration

Limiting active vehicles is controlled through the settings of individual **User Types**. For detailed information on working with user types, [refer to this wiki article](https://opscom.wiki/books/setup-configuration-for-admins/page/user-types).

1. Hover over **System Configuration,** then **Users,** and click **Types**. You'll be redirected to the **User Type Administration** page.

##### <span style="text-decoration: underline;">Editing Active Vehicle Limits for a User Type</span>

1. Locate the **user type** you wish to edit from the list (e.g., **Full Time Student**) and click **Edit**.
2. Locate the **Extra Active Vehicles** field. This number represents how many ***additional*** active vehicles a user of this type may have on their profile, beyond the first required active vehicle. 
    - For example, if you set this number to `1`, the user may have a maximum of `2` active vehicles (their one required active vehicle + one additional).
3. Enter the desired number to reflect the maximum additional active vehicles allowed.
4. Click **Update User Type** to apply your new limit.

---

### Using this Feature

Once the active vehicle limit is set for a user type, it directly affects how users interact with their vehicle information on the user portal.

##### <span style="text-decoration: underline;">What Users See on the User Portal</span>

1. A user logs into their portal and clicks the **Vehicle** tab to access their vehicle information section.
2. This tab displays any vehicles currently associated with their profile (e.g., a "beige Acura" with plate "ABC316").
3. The user attempts to add a new vehicle by clicking **Add New Vehicle**, fills out the information, and clicks **Save Changes**. A pop-up message will confirm the vehicle was successfully added, and it will appear on their **Vehicles** tab.

##### <span style="text-decoration: underline;">Exceeding the Active Vehicle Limit</span>

If a user tries to add a vehicle that would exceed the configured limit (e.g., attempting to add a third vehicle when the limit is set to a maximum of 2 active vehicles):

1. The user enters the vehicle information and clicks **Save Changes**.
2. They will still receive a pop-up message indicating the vehicle was successfully added.
3. However, the newly added vehicle will appear on the **Vehicles** page in an **Inactive** state.
4. If the user attempts to make this third vehicle active by toggling its state, they will receive a pop-up message indicating that the vehicle cannot be made active due to the limit set for their user type.

##### <span style="text-decoration: underline;">Minimum Active Vehicle Requirement</span>

Conversely, if a user attempts to make *all* vehicles on their profile inactive, a pop-up will appear indicating that the user must always have at least **one active vehicle** associated with their profile.

---

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

- <span style="color: rgb(22, 145, 121);">**Understanding the "Additional" Limit**: Remember that the `Active Vehicles` number you set represents *additional* vehicles beyond the *one required active vehicle*. A setting of `0` means a user can have a maximum of one active vehicle. A setting of `1` means a user can have a maximum of two active vehicles, and so on.</span>
- <span style="color: rgb(22, 145, 121);">**Existing Vehicles are Grandfathered**:</span>
    - <span style="color: rgb(22, 145, 121);">**Important Note**: If you reduce the number of allowed active vehicles for a user type, users who *currently* have more active vehicles than the newly reduced setting will **not** be immediately affected. They are "grandfathered in" with their current active vehicles.</span>
    - <span style="color: rgb(22, 145, 121);">The new, stricter rule will only come into effect when the user attempts to **add new vehicles** or reactivate previously inactive vehicles in the future.</span>
- <span style="color: rgb(22, 145, 121);">**Existing Vehicles Already in System**: If the vehicle being added is already present in the system but not currently associated with the user's profile, the user will be prompted to add this existing vehicle. The same active vehicle rules described here will still apply to this process.</span>
- <span style="color: rgb(22, 145, 121);">**Clarity for Users**: While the system provides pop-up messages, it can be helpful to inform users about active vehicle limits in your FAQs or permit purchasing guidelines to manage expectations.</span>

<div class="confluence-information-macro confluence-information-macro-tip conf-macro output-block" data-hasbody="true" data-macro-id="29dc3477-1688-4dc1-acd3-2e4297411a5c" data-macro-name="tip" id="bkmrk-if-the-vehicle-being"><div class="confluence-information-macro-body">  
</div></div>

# Manage User Departments

<p class="callout info">**User Departments** allow administrators to categorize users based on their departmental affiliation within an organization. This feature enhances user management by enabling better organization, reporting, and potentially targeted communications or access controls, ensuring that user data is structured and easily manageable.</p>

## Using this Feature

1. Hover over **System Administration,** then **Users,** and click **Manage User Departments**. The **Manage User Departments** page will display. This page provides a simple interface to add, edit, and delete user departments.

##### <span style="text-decoration: underline;">Adding User Departments</span>

1. Click **Add User Department** and enter the desired **Department Name.**
2. Click **Save Changes**.

##### <span style="text-decoration: underline;">Editing User Departments</span>

1. Locate the user department you wish to modify in the list.
2. Click the **Edit** button next to the department.
3. Update the existing name of that department.
4. Click **Save Changes**.

##### <span style="text-decoration: underline;">Deleting User Departments</span>

<p class="callout warning">In order to delete a user department, it must not currently be in use by any user in the system. Administrators must first ensure that no users are assigned to this department before it can be removed. </p>

1. Locate the department you wish to remove from the list.
2. Click the **Delete** button next to the department and click **Confirm**.

---

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

- <span style="color: rgb(22, 145, 121);">**Reflect Organizational Structure**: Create user departments that accurately reflect the departments or divisions within your organization. This helps with reporting and user organization.</span>
- <span style="color: rgb(22, 145, 121);">**Consistency in Naming**: Use clear, consistent, and recognizable names for your departments to avoid confusion.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always ensure that no users are assigned to a department before attempting to delete it. Reassigning users to another department (or to "None" if applicable) is a necessary step to maintain data integrity.</span>
- <span style="color: rgb(22, 145, 121);">**User Profile Integration**: Remember that these departments are selected when creating or editing a user's profile, providing a key piece of information for user categorization.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting**: Categorizing users by department can be highly valuable for generating targeted reports or analyzing trends across different parts of your organization.</span>

---

### Related Video

<iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="c03115ab-3341-4b92-b30c-2db8ea658b62" data-macro-name="widget" frameborder="0" height="416" src="https://www.youtube.com/embed/d57_-PDGFoE?wmode=opaque" style="width: 832px; height: 416px;" width="832"></iframe>

# Locker User Types

<p class="callout info">**Locker User Types** allow administrators to categorize users specifically for the purpose of locker management. This enables flexible control over who can access and utilize certain locker areas or types, enhancing organizational efficiency and tailored access to locker resources.</p>

### Setup &amp; Configuration

Locker User Types must be created within OPSCOM before they can be assigned. This is done via the **Manage Locker User Types** screen.

1. Hover over **System Configuration,** then **Users,** and click **Locker User Types**.

The **Manage Locker User Types** screen appears, listing any existing Locker User Types. This list typically includes the **Name** of the locker user type, and the Number of user records associated to that type.

<p class="callout warning">If you do not see the settings mentioned above, please contact <support@ops-com.comcom> to have them enabled for you. You will need the permission of your Primary Admin.</p>

##### <span style="text-decoration: underline;">Adding a New Locker User Type</span>

1. Click on the **Add Locker User Type** button.
2. Enter the full **Name** of the user type (e.g., **Public User**).
3. Click **Save Changes** (or similar button).

The **Manage Locker User Types** screen will refresh, and your new user type will be added to the list.

---

### Using this Feature

##### <span style="text-decoration: underline;">Assigning Locker User Types to User Profiles</span>

1. Hover over **User Management** and click **User Search**.
2. Search for the user you want to edit.
3. Edit their profile and choose the **Locker User Type** from the picklist.
4. Click **Submit Profile Information**, review the submission, and click the **Information Correct** button.

<p class="callout warning">Locker User Types are not editable or viewable on the User Side portal. They must be assigned by administrators only.</p>

##### <span style="text-decoration: underline;">Assigning Locker User Types to Locker Areas</span>

Once Locker User Types are created and assigned to users, they must also be associated with **Locker Building Areas** to control user access to specific lockers.

[Refer to this wiki article](https://opscom.wiki/books/the-opscom-admin-portal/page/allocate-lockers) for information about assigning Locker Types to Building areas.

---

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

- <span style="color: rgb(22, 145, 121);">**Logical Categorization**: Create Locker User Types that align with your organization's locker access policies (e.g., "Student Dorm," "Staff Locker," "Gym Member," "Public Day Use").</span>
- <span style="color: rgb(22, 145, 121);">**Deletion Policy**: A Locker User Type can **only be deleted if no users are currently assigned to it**. Once a user has been assigned to a Locker User Type, that user type will no longer display the delete button. You must reassign all users from a Locker User Type before it can be deleted. </span>
- <span style="color: rgb(22, 145, 121);">**Clear Naming**: Use clear and concise names for both the full Name and Short Name to avoid confusion.</span>
- <span style="color: rgb(22, 145, 121);">**Coordinate with Locker Areas**: Remember that simply assigning a Locker User Type to a user profile is not enough. You must also link the Locker User Type to the relevant **Locker Building Areas** to define actual access permissions.</span>
- <span style="color: rgb(22, 145, 121);">**Admin-Only Assignment**: Since Locker User Types are not visible or editable by users, ensure your administrative staff are properly trained on how to assign and manage them.</span>

# Login Sources (SSO)

<p class="callout info">**Login Sources** define the various methods by which users can sign into the system. This feature provides administrators with flexible control over user authentication, allowing for standard OPSCOM logins or integration with external identity providers like SAML or LDAP, enhancing convenience and security for diverse user populations.</p>

### Setup &amp; Configuration

Login sources are managed under the **System Configuration** menu, within the **Users** section.

1. Hover over **System Configuration,** **Users,** and click **Login Sources**.

##### <span style="text-decoration: underline;">Default Login Source</span>

- **OPSCOM** is the default login source. This means that, by default, users will log in directly to OPSCOM using a username and password created within the system itself on the standard login screen.
- If you **disable** the **OPSCOM** default login source, then only other configured login sources, such as SAML or LDAP, will be active for user logins.

##### <span style="text-decoration: underline;">Adding Login Sources</span>

OPSCOM supports multiple login sources, allowing some users to utilize SSO while others log in directly.

1. On the **Login Sources** page, click the **Add Login Source** button.
2. Fill out the required information:
    
    
    - **<span style="color: rgb(224, 62, 45);">Red </span>fields** are **required** to be filled before you can click **Save**.
    - **<span style="color: rgb(241, 196, 15);">Yellow </span>fields** are technically required for the login source to function correctly, but they will still allow empty or invalid values to be saved initially. <span style="color: rgb(241, 196, 15);">**Yellow** </span>**fields** can also indicate that a change has been made to the field.
    
    <p class="callout warning">The **Login Source - Code** field is crucial as it's what the user profile will match against when associating users with this new login source. However, **only one login source code can be activated at a time** for a particular type (e.g., you can have multiple SAML configurations, but only one primary 'SAML' code active for user matching at a time if the system differentiates by 'type' of code rather than unique code string across all). The source name (code) itself is typically determined by your Identity Provider, with the exception of 'OPSCOM' for direct logins.</p>
3. **Name** can be anything that is identifiable to you.
4. **Login Source** is what you will see on the user profile to indicate if this user will login with a special source. Often is is called SSO or SAML
5. **Domain Name for OPSCOM to use** should be set to the OPSCOM domain without any references to admin etc. For example, if the domain name you login looks like CLIENTID.admin.OPSCOM.com/admin, this should be changed to <span style="text-decoration: underline;">**CLIENTID.OPSCOM.com only.**</span>
6. Do not fill out the rest of the fields until you are ready to **[follow the instruction for setting up your SSO information](https://opscom.wiki/books/setup-configuration-for-admins/page/configuring-saml-sso-with-OPSCOM/).**
7. Click **Save** **Changes** to add the new login source.

---

### Using this Feature

Once login sources are added, you can manage their status and properties.

##### <span style="text-decoration: underline;">Managing Login Sources</span>

From the **Login Sources** page, you can manage your configured login sources using the buttons next to each entry:

- Click **Edit** to modify an existing login source's details. This will bring up the same form used for adding, allowing you to update its configuration.
- Click **Delete** to permanently remove a login source from the list. A confirmation pop-up will usually appear before deletion.

##### <span style="text-decoration: underline;">Active/Inactive/Hidden Login Sources</span>

You can make Login Sources **Active, Inactive or Hidden**. If a source is made **Inactive,** users who were previously connected will no longer be able to login and must be changed to a different login source.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/BfFimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/BfFimage.png)

---

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

- <span style="color: rgb(22, 145, 121);">**Strategic Planning for Multiple Sources**: Carefully plan your login source strategy. Determine which user groups will use which login method (e.g., students via SAML, staff via LDAP, public users via OPSCOM direct login).</span>
- <span style="color: rgb(22, 145, 121);">**User Provisioning**: Consider how users will be created and linked to their login sources. Will they be auto-created on first login, or pre-imported? This linkage uses the **Login Source - Code** field.</span>
- <span style="color: rgb(22, 145, 121);">**Disabling Default OPSCOM**: If you intend for *all* users to access via an external SSO, ensure you disable the **OPSCOM** default login source. Test thoroughly before making this change in a live environment.</span>
- <span style="color: rgb(22, 145, 121);">**Testing New Sources**: Always thoroughly test any new login source after configuration to ensure users can successfully authenticate and access the system.</span>
- <span style="color: rgb(22, 145, 121);">**Communication with Users**: Clearly communicate to your users how they are expected to log in, especially if you introduce new SSO options or change existing methods. Provide clear instructions and links.</span>
- <span style="color: rgb(22, 145, 121);">**Inactive vs. Deleting**: Use the **Inactive** function for temporary deactivation or if you foresee needing to reactivate a login source in the future. Use **Delete** only when a login source is permanently no longer needed and has no associated active users.</span>

# Vehicle Configuration

# Vehicle Plate Types

<p class="callout info">**Vehicle Plate Types** allow administrators to categorize vehicles based on their official plate designation (e.g., Passenger, Commercial, Motorcycle). This feature is crucial for accurate vehicle identification, reporting, and aligning with specific parking or violation rules, ensuring your system reflects diverse vehicle classifications. Plate Type, Plate Number and Province/State are considered the 3 essential criteria to making sure a plate is unique in OPSCOM.</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245">  
</div></div></div></div></div><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230">  
</div></div></div></div></div></div>### Using this Feature

Managing Vehicle Plate Types is done through the **Manage Vehicle Plate Types** page.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **System Configuration,** then **Vehicles,** and click **Manage Vehicle Plate Types.**
2. The **Manage Vehicle Plate Types** page shows all currently defined vehicle plate types, providing a straightforward interface to add, edit, and delete various vehicle plate types.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Adding Plate Types</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-plate-type"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Plate Type**.
2. Complete the two required fields: 
    - **Name**: The full, descriptive name of the plate type (e.g., "Passenger").
    - **Short Name**: A shorter name used, for instance, with handheld devices (e.g., "PASS").
3. Click **Save Changes** to add the new plate type to the list.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Editing Plate Types</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the **Plate Type** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Deleting Plate Types</span>

<p class="callout warning">In order to delete a vehicle plate type, it must not be in use by any vehicles in the system. Administrators must first ensure that no vehicles are currently assigned this plate type before it can be removed. This prevents vehicle records from having blank or invalid plate type information. </p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the plate type you wish to remove from the list.
2. Click the **Delete** button next to it and confirm.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-accuracy-is-key%3A-ens"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-accuracy-is-key%3A-ens-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-accuracy-is-key%3A-ens-2">- <span style="color: rgb(22, 145, 121);">**Accuracy is Key**: Ensure your defined plate types accurately match the official plate designations in your region to maintain data integrity and simplify vehicle identification.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Naming**: Use clear and concise names for both the full **Name** and **Short Name** to avoid confusion for both administrators and field users.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Vehicle Records**: Remember that these plate types are assigned to vehicle records. Deleting a plate type that is in use will cause data issues.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting**: Properly categorized plate types are valuable for generating accurate reports on vehicle populations and compliance.</span><button aria-describedby="cdk-describedby-message-ng-1-7" aria-label="Open upload file menu" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger upload-card-button open mat-primary ng-star-inserted"></button>

</div></div></div></div></div></div></div></div>

# Vehicle Colours / Colors

<p class="callout info">**Vehicle Colours / Colors** in OPSCOM allows administrators to define and manage the picklist of available vehicle colours used throughout the system. This feature is important for accurate vehicle identification, detailed record-keeping, and ensuring consistency in data entry, supporting efficient enforcement and management operations.</p>

### Using this Feature

Managing Vehicle Colours is done through the **Vehicle Colours** page.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **System Configuration,** then **Vehicles,** and click **Manage Vehicle Colours.**
2. The **Manage Vehicle Colours** page shows all currently defined vehicle colours, providing a straightforward interface to add, edit, and delete various vehicle colours.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Adding Vehicle Colours</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-plate-type"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Colour**.
2. Complete Name field.
3. Click **Save Changes**.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Editing </span><span style="text-decoration: underline;">Vehicle Colours</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the **Colour** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Deleting </span><span style="text-decoration: underline;">Vehicle Colours</span>

<p class="callout warning">In order to delete a vehicle colour, it must not be in use by any vehicles in the system. Administrators must first ensure that no vehicles are currently assigned this colour before it can be removed. This prevents vehicle records from having blank or invalid information. </p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the Colour you wish to remove from the list.
2. Click the **Delete** button next to it and confirm.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-consistency%3A-use-sta"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- <span style="color: rgb(22, 145, 121);">**Consistency:** Use standard colour names to maintain consistency across your records.</span>
- <span style="color: rgb(22, 145, 121);">**User Experience:** A well-maintained and comprehensive list of vehicle colours makes data entry easier and more accurate for both administrators and users.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting:** Accurate colour data can be useful for various reports, such as identifying common vehicle types in your lots.</span>

</div></div></div></div></div></div></div></div>---

### Related Video

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--2"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--3"><iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="1c679b54-8882-4d99-9342-603af44b0f10" data-macro-name="widget" frameborder="0" height="372" src="https://www.youtube.com/embed/NscjivpLZ0s?wmode=opaque" style="width: 744px; height: 372px;" width="744"></iframe>

</div></div></div></div></div></div><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">  
  
</div></div></div></div></div></div></div></div></div></div>

# Vehicle Makes

<p class="callout info">**Vehicle Makes** in OPSCOM allows administrators to define and manage the picklist of vehicle manufacturers (e.g., Ford, Honda, Toyota) used throughout the system. This feature is essential for accurate vehicle identification, comprehensive record-keeping, and ensuring consistent data entry for all vehicle-related information.</p>

### Using this Feature

Managing Vehicle Makes is done through the **Manage Vehicle Makes** page.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **System Configuration**, **Vehicles**, and click **Manage Vehicle Makes.**
2. The **Manage Vehicle Makes** page displays, showing all currently defined vehicle makes. This page provides a straightforward interface to add, edit, and delete.

</div></div></div></div></div></div></div></div>##### Adding 

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-plate-type"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Make**.
2. Complete Name field.
3. Click **Save Changes**.

</div></div></div></div></div></div></div></div>##### Editing 

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the **Make** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

</div></div></div></div></div></div></div></div>##### Deleting 

<p class="callout warning">In order to delete a vehicle make, it must not be in use by any vehicles in the system. Administrators must first ensure that no vehicles are currently assigned this make before it can be removed. This prevents vehicle records from having blank or invalid information. </p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the make you wish to remove from the list.
2. Click the **Delete** button next to it and confirm.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-consistency%3A-use-sta"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- <span style="color: rgb(22, 145, 121);">**Accuracy and Completeness**: Maintain an accurate and comprehensive list of vehicle makes to ensure precise data capture and easier searching for vehicle records.</span>
- <span style="color: rgb(22, 145, 121);">**Consistency in Naming**: Use clear, consistent, and recognizable names for vehicle makes to avoid confusion and ensure data uniformity.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always verify that no vehicles are assigned to a specific make before attempting to delete it. Reassigning vehicles to another make (or to "Unknown" if applicable) is a crucial step to prevent data issues.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting Value**: Well-categorized vehicle makes contribute to more insightful reports, allowing for analysis of vehicle populations and trends within your parking environment.</span>

</div></div></div></div></div></div></div></div>---

### Related Video

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--2"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-accuracy-is-key%3A-ens-2"></div><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--3"><iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="1c679b54-8882-4d99-9342-603af44b0f10" data-macro-name="widget" frameborder="0" height="372" src="https://www.youtube.com/embed/NscjivpLZ0s?wmode=opaque" width="744"></iframe>

</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>

# Vehicle Types

<p class="callout info">**Vehicle Types** in OPSCOM allows administrators to define and manage categories for different kinds of vehicles (e.g., Car, Truck, Motorcycle, Van). This feature is essential for accurate vehicle classification, supporting specific parking rules, and enhancing reporting capabilities within your OPSCOM system.</p>

### Using this Feature

Managing Vehicle Types is done through the **Manage Vehicle Types** page.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-hover-over-system-co-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-230 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-230"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-230"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Hover over **System Configuration,** then **Vehicles,** and click **Manage Vehicle Types.**
2. The **Manage Vehicle Types** page shows all currently defined vehicle types, providing a straightforward interface to add, edit, and delete various vehicle types.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Adding Vehicle Types</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-plate-type"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Type**.
2. Complete Name field.
3. Click **Save Changes**.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Editing <span style="text-decoration-line: underline;">Vehicle Types</span></span>


<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the **Type** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Deleting <span style="text-decoration-line: underline;">Vehicle Types</span></span>


<p class="callout warning">In order to delete a vehicle type, it must not be in use by any vehicles in the system. Administrators must first ensure that no vehicles are currently assigned this type before it can be removed. This prevents vehicle records from having blank or invalid information.</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-plate-typ-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the Type you wish to remove from the list.
2. Click the **Delete** button next to it and confirm.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-consistency%3A-use-sta"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- <span style="color: rgb(22, 145, 121);">**Comprehensive Categorization**: Ensure your defined vehicle types cover all relevant classifications for vehicles that will interact with your parking system.</span>
- <span style="color: rgb(22, 145, 121);">**Clear and Consistent Naming**: Use descriptive and consistent names for your vehicle types to facilitate easy understanding and accurate data entry for both administrators and users.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting and Analysis**: Properly categorized vehicle types are valuable for generating reports and conducting analysis on vehicle populations and parking trends.</span>

</div></div></div></div></div></div></div></div>---

### Related Video

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--2"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-accuracy-is-key%3A-ens-2"></div><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--3"><iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="1c679b54-8882-4d99-9342-603af44b0f10" data-macro-name="widget" frameborder="0" height="372" src="https://www.youtube.com/embed/NscjivpLZ0s?wmode=opaque" width="744"></iframe>

</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>

# Parking Configuration

# Lot Groups Management

<p class="callout info">**Lot Groups** in OPSCOM allow administrators to logically group similar parking lots together, treating them as a single entity for certain configurations. This feature simplifies management by enabling shared settings like free parking time and vehicle count limits across multiple lots, providing a more streamlined approach to parking administration.</p>

### Setup &amp; Configuration

<p class="callout warning">A lot may only belong to one group, and membership in a group is optional.</p>

1. Hover over **System Configuration,** then **Parking,** and click **Manage Lot Groups**.
2. Click the **Add Lot Group** button. 
    - **Lot Group**: Enter a descriptive Group Name in the text box.
    - Optionally, set a **Free Parking Time Limit** in minutes. This setting is typically used for lots equipped with pay-by-plate meters to provide a grace period for users to register their license plate.
    - **Offence Location:** Offence locations for lot groups are used in conjunction with static cameras. Through the use of a static camera report, a violation can be written that uses the offence location associated to the lot group the camera is in.
    - **Vehicle Counts Limit**: Enter a numerical value for the **Vehicle Counts Limit**. This sets a maximum vehicle count for the entire group of lots.
3. Click **Save Changes** to create the new lot group. The newly created lot group will now appear in the list on the **Manage Lot Groups** page.

---

### Assigning a Lot to a Lot Group

Once a Lot Group is created, you can assign individual lots to it from the **Lot Edit Page**:

1. Hover over **Parking Management,** then **Lot Administration,** and click **Pricing &amp; Lot Admin**.
2. Click on the **Lot Name** of the lot you wish to assign to a group.
3. On the **General** tab, locate the **Lot Group** dropdown menu.
4. Select the desired **Lot Group** from the list.
5. Click **Update Lot** to save your changes.

---

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

- <span style="color: rgb(22, 145, 121);">**Logical Grouping**: Group lots that share similar operational characteristics or pricing rules. For instance, all visitor lots could be in one group, or all faculty lots in another.</span>
- <span style="color: rgb(22, 145, 121);">**Pay-by-Plate Integration**: The **Free Parking Time Limit** is crucial for lots using pay-by-plate systems. Ensure this setting provides adequate time for users to complete their registration.</span>
- <span style="color: rgb(22, 145, 121);">**Centralized Control**: Using Lot Groups allows for centralized management of certain settings, reducing the need to configure them individually for each lot.</span>
- <span style="color: rgb(22, 145, 121);">**Deletion Note**:</span>
    - <span style="color: rgb(22, 145, 121);">**Deleting** a lot group is a **permanent action** from the list.</span>
    - <span style="color: rgb(22, 145, 121);">While the group will no longer appear, its associated data (connections to permits and parking lot historical data) remains stored in the OPSCOM system. This ensures data integrity for past transactions.</span>

# Managing Lot Zones

<p class="callout info">**Lot Zones** in OPSCOM allow administrators to define specific geographical or logical areas within a parking lot. This feature is crucial for managing pricing variations, access controls, and enforcement strategies tailored to different sections of a larger lot, enhancing flexibility and precision in parking operations.</p>

### Using this Feature

The **Manage Lot Zones** page provides a straightforward interface to add, edit, and delete various lot zones.

1\. Hover over **System Configuration,** then **Parking,** and click **Manage Lot Zones**.

##### <span style="text-decoration: underline;">Adding Lot Zones</span>

1. Click the **Add Lot Zone** button.
2. Complete the two required fields: 
    - **Name**: The full, descriptive name of the **Lot Zone** (e.g., "Day Care Center").
    - **Short Name**: A shorter name used, for instance, with handheld devices (e.g., "DAY").
3. Click **Save Changes** when finished to add the new zone to the list.

##### <span style="text-decoration: underline;">Editing Lot Zones</span>

1. Locate the Lot Zone you wish to modify in the list.
2. Click the **Edit** button next to the Lot Zone.
3. Enter the desired changes to the zone's name.
4. Click **Save Changes** to apply your updates.

##### <span style="text-decoration: underline;">Deleting Lot Zones</span>

<p class="callout warning">A Lot Zone can **only be deleted if no records are currently associated with it**. Administrators must first ensure that the zone is not in use (e.g., linked to any specific parking spaces, permits, or configurations within lots) before it can be removed. </p>

1. Locate the Lot Zone you wish to remove from the list.
2. Click the **Delete** button next to the Lot Zone.
3. A confirmation window will appear.
4. If you are sure you wish to delete the zone, click **Delete** in the confirmation window.

---

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

- <span style="color: rgb(22, 145, 121);">**Granular Control**: Use lot zones to apply different rules, prices, or restrictions to sub-sections within a single large parking lot.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Naming**: Use descriptive names for your lot zones that clearly indicate their purpose or location (e.g., "North End Hourly," "Permit Holder Zone A").</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always ensure that a lot zone is not actively referenced by any other part of the system (like lot configurations or specific spaces) before attempting to delete it.</span>
- <span style="color: rgb(22, 145, 121);">**Mapping Integration**: If your system includes mapping features, ensure your defined lot zones can be visually represented for clarity for both administrators and users.</span>

# Common Lots

<p class="callout info">**Common Lot Types** in OPSCOM allow administrators to categorize parking lots based on shared characteristics or administrative distinctions. This feature provides a way to organize lots beyond their physical location, facilitating better management and reporting. This article guides OPSCOM administrators on how to navigate to, add, edit, and delete Common Lot Types.</p>

##### <span style="text-decoration: underline;">Adding/Editing Common Lot Types</span>

1. Hover over **Admin Options,** then **Parking,** and click **Common Lots.**
2. Click the **Add Common Lot Type** button at the top of the page (or Edit button next to an existing one).
3. Enter/Change the **Common Lot Type Name.**
4. Click **Save Changes**.

<p class="callout warning">Making changes to lot types that are being used will reflect the entire system. </p>

##### <span style="text-decoration: underline;"><span data-colorid="w2n1leixjh">Deleting Common Lot Types</span></span>

To delete a common lot type click the **Delete** button next to the type you wish to remove.

<p class="callout warning">You are unable to delete common lot types that are currently being used by lots within the system. You must first reassign or remove the lot type from any associated lots before getting a **Delete** button.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Meaningful Categories**: Create common lot types that genuinely help categorize and distinguish your parking lots (e.g., "Student Resident Lots," "Staff Permit Lots," "Hourly Pay Lots").</span>
- <span style="color: rgb(22, 145, 121);">**Impact of Changes**: Be aware that editing an existing common lot type will immediately update all lots currently assigned to that type.</span>
- <span style="color: rgb(22, 145, 121);">**Deletion Prerequisites**: Always ensure that no active lots are assigned to a common lot type before attempting to delete it. Reassigning lots to another type or to no type will be necessary.</span>
- <span style="color: rgb(22, 145, 121);">**Consistency**: Maintain consistent naming conventions for your common lot types to ensure clarity and ease of use for administrators.</span>

# Permit States

<p class="callout info">**Permit States** in OPSCOM allow administrators to define and manage the various statuses a parking permit can have within the system (e.g., Active, Expired, Voided, Lost). This feature is essential for accurately tracking the lifecycle of permits, facilitating efficient management, and providing clear reporting on permit validity and usage.</p>

### Using this Feature

The **Manage Permit States** page provides a simple interface to add, edit, and delete various permit states.

1\. Hover over **System Configuration,** then **Parking,** and click **Manage Permit States**.

##### <span style="text-decoration: underline;">Adding Permit States</span>

1. Click the **Add Permit State** button.
2. Enter the desired **Permit State Name** and choose if this permit will be a **Valid** state or not.
3. Click **Save Changes** to add the new permit state to the list.

##### <span style="text-decoration: underline;">Editing Permit States</span>

1. To edit an existing permit state, locate it in the list.
2. Click the **Edit** button next to the permit state.
3. Make your updates
4. Click **Save Changes** to apply your updates.

##### <span style="text-decoration: underline;">Deleting Permit States</span>

<p class="callout warning">In order to delete a permit state, it must not currently be in use by any permits in the system. Administrators must first ensure that no permits are currently assigned this permit state before it can be removed. This prevents permit records from having blank or invalid state information if the permit state is deleted while in use. </p>

1. To delete a permit state, locate it in the list.
2. Click the **Delete** button next to the permit state.
3. A modal window will appear, asking for confirmation.
4. If you are sure you wish to delete the permit state, click **Delete** in the confirmation window.

---

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

- <span style="color: rgb(22, 145, 121);">**Comprehensive States**: Define a set of permit states that accurately reflect the entire lifecycle of a permit within your operations, from creation to expiration or invalidation.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Naming**: Use clear, concise, and easily understandable names for your permit states (e.g., "Active," "Pending Payment," "Revoked," "Expired").</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always ensure that no permits are currently assigned to a specific state before attempting to delete it. Reassigning permits to another valid state is crucial to prevent data inconsistencies.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Reporting**: Permit states are fundamental for various reports, such as active permit counts, expired permit analysis, or voided permit reconciliation. Accurate state management ensures reliable reporting.</span>
- <span style="color: rgb(22, 145, 121);">**Workflow Integration**: Consider how different permit states fit into your operational workflows (e.g., what actions trigger a permit to change from "Pending" to "Active").</span>

# Location Configuration

# Locations

<p class="callout info">The **Manage Locations** feature in OPSCOM allows administrators to define and organize various physical locations relevant to your operations, such as buildings, parking areas, or specific points of interest. This is crucial for accurate incident reporting, violation tracking, and providing clear geographical context within the system.</p>

### Using this Feature

The **Manage Locations** page provides a straightforward interface to add and delete various locations.

1\. Hover over **System Configuration,** then **Manage Locations,** and click **Manage Locations**.

##### <span style="text-decoration: underline;">Adding Locations</span>

1. Click the **Add Location** button.
2. **Enter the name** of your new location (e.g., "Mulloy Library").
3. **Select the Sub-Location(s)** you would like associated with this main location. 
    - <p class="callout warning">Sub-Locations are specifically used in **incident reporting** and do not apply to vehicle violations.</p>
4. To make the location visible to violation writers on handheld devices or the admin side, enable the **Writer Visible** checkbox beside the location name.
5. The **GIS Number** field is optional and is used by clients who utilize a geographic location code (GIS maps).
6. Click **Save Changes** to create the new location.

The **Manage Locations** page will refresh and display a confirmation message indicating that the **Location has been updated** (or added).

##### <span style="text-decoration: underline;">Editing Locations</span>

1. Locate the **Location** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

##### <span style="text-decoration: underline;">Deleting Locations</span>

A location can only be deleted from the system if it is **not associated with any existing records** (e.g., incidents, violations, or other data where this location is referenced).

1. If a location is eligible for deletion, you will see a **Delete** button specific to that location
2. Click the **Delete** button and confirm. This action will permanently remove the location from the system.

---

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

- <span style="color: rgb(22, 145, 121);">**Descriptive Naming**: Use clear and concise names for your locations (e.g., "Main Campus Building A," "West Parking Lot," "Gymnasium Entrance"). This improves clarity for all users.</span>
- <span style="color: rgb(22, 145, 121);">**Sub-Location Usage**: Leverage sub-locations to provide more specific detail for incident reporting, which can be crucial for detailed record-keeping and analysis.</span>
- <span style="color: rgb(22, 145, 121);">**Writer Visibility**: Carefully consider which locations need to be "Writer Visible" for your enforcement officers to ensure accurate violation reporting.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always ensure that a location is not actively referenced by any system records before attempting to delete it. Reassigning records to another valid location is crucial to prevent data inconsistencies.</span>

# Locations - Sub Locations

<p class="callout info">**Sub-locations** in OPSCOM allow administrators to define more granular areas within a main location, primarily for detailed incident reporting. This feature enhances the precision of incident documentation by pinpointing specific spots within a larger location, providing richer context for investigations and analysis.</p>

### Using this Feature

The **Manage Sub-Locations** page provides a straightforward interface to add and delete various sub-locations.

1\. Hover over **System Configuration,** then **Manage Locations,** and click **Manage Sub-Locations**.

##### <span style="text-decoration: underline;">Adding Sub-Locations</span>

1. Click the **Add Sub-Location** button.
2. **Enter the name** of your new location.
3. The **GIS Number** field is optional and is used by clients who utilize a geographic location code (GIS maps).
4. Click **Save Changes** to create the new location.

The **Manage Sub-Locations** page will refresh and display a confirmation message indicating that the **Location has been updated** (or added).

##### <span style="text-decoration: underline;">Editing Sub-Locations</span>

1. Locate the **Sub**-**Location** you wish to modify in the list.
2. Click the **Edit** button next to it.
3. Make your updates and click **Save Changes**.

##### <span style="text-decoration: underline;">Deleting Sub-Locations</span>

<p class="callout warning">A sub-location can only be deleted from the system if it is **not associated with any existing records** (e.g., incidents, violations, or other data where this location is referenced).</p>

1. If a sub-location is eligible for deletion, you will see a **Delete** button specific to that location
2. Click the **Delete** button and confirm. This action will permanently remove the location from the system.

---

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

- <span style="color: rgb(22, 145, 121);">Detail for Incident Reporting: Sub-locations are primarily for incident reporting. Use them to add specific detail that goes beyond the general "Location" (e.g., within "Mulloy Library" you might have "Reading Room," "South Entrance," "Loading Dock").</span>
- <span style="color: rgb(22, 145, 121);">Clarity in Naming: Use clear and concise names for your sub-locations to make incident reports easily understandable.</span>
- <span style="color: rgb(22, 145, 121);">GIS Integration: If your organization uses GIS data, ensure your GIS numbers for sub-locations are accurate and consistent with your mapping systems.</span>
- <span style="color: rgb(22, 145, 121);">Data Integrity: Always ensure that a sub-location is not actively referenced by any system records before attempting to delete it.</span>

# Violations Configuration

# Ticket Categories

<p class="callout info"><span class="legacy-color-text-default">**Ticket Categories** in OPSCOM allow administrators to define and manage different types of violations (e.g., Municipal, Parking, Bicycle). This feature is essential for accurate incident reporting, enforcing specific rules, and tailoring violation processes, including whether tickets apply to vehicles or users, and their visibility on handheld devices.</span></p>

### Using this Feature

The **Manage Ticket Categories** screen allows for comprehensive configuration of how different violations are classified and processed.

1\. Hover over **System Configuration,** then **Violations,** and click **Manage Ticket Categories**.

### [![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/5zGimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/5zGimage.png)

##### <span style="text-decoration: underline;">Adding Ticket Categories</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-ticket-cat"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-290 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-290"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Ticket Category**.
2. Enter the **Ticket Category Name** (e.g., Moving Violation).
3. Toggle to **Allow it to be Visible on Handhelds**.
4. For **Violation Applies To**: toggle if this will apply to tickets issued to vehicles and/or to Users.
5. If this is for [**Users**](https://opscom.wiki/books/the-opscom-admin-portal/page/configure-violations-to-a-person), toggle if you wish to **Enable Failed to Identify.**
6. Click **Save Changes**. The new ticket type will now be included in the list.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Editing </span><span style="text-decoration: underline;">Ticket Categories</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-ticket-ty"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-290 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-290"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the ticket type you wish to edit in the list and click the **Edit** button next to it.
2. Make your changes.
3. Click **Save Changes.**

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Archiving </span><span style="text-decoration: underline;">Ticket Categories</span>

<p class="callout warning">Ticket Types can be deleted, however, they are not actually removed from the system's database. Instead, they are **archived** to preserve the integrity of any historical data associated with that Ticket Type (e.g., past violations that used this type).</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-ticket-ty-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-290 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-290"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the ticket type you wish to delete.
2. Click the **Delete** button and confirm.

</div></div></div></div></div></div></div></div><div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-290 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-290"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-clarity-and-specific"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-clarity-and-specific-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-290 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-290"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-290"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-clarity-and-specific-2">- <span style="color: rgb(22, 145, 121);">**Clarity and Specificity**: Create ticket types that are clear, specific, and easily understood by both enforcement officers and users (e.g., "No Permit," "Fire Lane," "Smoking Violation").</span>
- <span style="color: rgb(22, 145, 121);">**Handheld Visibility**: Carefully manage the "Visible on Handhelds" setting. Only enable ticket types that your field officers actively enforce.</span>
- <span style="color: rgb(22, 145, 121);">Leverage the ability to apply tickets to Vehicles, Users or both to accommodate a broader range of enforcement scenarios beyond traditional parking infractions.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity (Archiving)**: Understand that "deleting" a ticket type archives it. This means historical reports will still accurately reflect past violations, even if the category is no longer actively used.</span>
- <span style="color: rgb(22, 145, 121);">**Training**: Ensure enforcement staff are trained on the proper use and selection of ticket categories, especially for "Applies to: Users" violations, to ensure accurate data capture.</span>

</div></div></div></div><div _ngcontent-ng-c4086532758="" class="response-container-footer ng-tns-c4086532758-290"><div _ngcontent-ng-c496010613="" class="actions-container-v2 ng-tns-c496010613-292"><div _ngcontent-ng-c496010613="" class="buttons-container-v2 ng-tns-c496010613-292 ng-star-inserted"><button aria-controls="feedback-form-54" aria-label="Good response" aria-pressed="false" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger icon-button mat-unthemed"></button><div _ngcontent-ng-c3551887693="" class="thumb-animation" hidden="" lottie-animation=""><svg height="96" preserveaspectratio="xMidYMid meet" viewbox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><clippath id="bkmrk--2"><rect height="96" width="96" x="0" y="0"></rect></clippath><mask id="bkmrk--4"><rect fill="#ffffff" height="96" width="96"></rect><path clip-rule="nonzero" d=" M20.823999404907227,-50.45800018310547 C20.823999404907227,-50.45800018310547 -18.42799949645996,-40.75899887084961 -18.42799949645996,-40.75899887084961 C-18.42799949645996,-40.75899887084961 -20.881999969482422,-11.439000129699707 -20.881999969482422,-11.439000129699707 C-20.881999969482422,-11.439000129699707 13.111000061035156,-16.22100067138672 13.111000061035156,-16.22100067138672 C13.111000061035156,-16.22100067138672 20.823999404907227,-50.45800018310547 20.823999404907227,-50.45800018310547" fill="#000000"></path></mask><mask id="bkmrk--5"><rect fill="#ffffff" height="96" width="96"></rect><path clip-rule="nonzero" d=" M21.899999618530273,-45.80699920654297 C21.899999618530273,-45.80699920654297 -10.57800006866455,-36.2400016784668 -10.57800006866455,-36.2400016784668 C-10.57800006866455,-36.2400016784668 21.648000717163086,-8.79800033569336 21.648000717163086,-8.79800033569336 C21.648000717163086,-8.79800033569336 21.899999618530273,-45.80699920654297 21.899999618530273,-45.80699920654297" fill="#000000"></path></mask><clippath id="bkmrk--6"><path clip-rule="nonzero" d=" M21.899999618530273,-45.80699920654297 C21.899999618530273,-45.80699920654297 -10.57800006866455,-36.2400016784668 -10.57800006866455,-36.2400016784668 C-10.57800006866455,-36.2400016784668 20.641000747680664,-6.5320000648498535 20.641000747680664,-6.5320000648498535 C20.641000747680664,-6.5320000648498535 21.899999618530273,-45.80699920654297 21.899999618530273,-45.80699920654297" fill="#ffffff"></path></clippath></defs><g clip-path="url(#__lottie_element_6236)"><g class="lottie-thumbs-up" mask="url(#__lottie_element_6240)"><g><path></path></g></g><g class="lottie-thumbs-up" mask="url(#__lottie_element_6246)"><g><path></path></g></g><g class="lottie-thumbs-up" clip-path="url(#__lottie_element_6248)"><g><path></path></g></g><g class="lottie-thumbs-up" opacity="1" transform="matrix(0.943097710609436,0,0,0.943097710609436,49.22163009643555,46.75019836425781)"><g opacity="1" transform="matrix(4.239999771118164,0,0,4.239999771118164,0,0)"><path d=" M-2.865000009536743,-2.0399999618530273 C-2.865000009536743,-2.0399999618530273 -2.865000009536743,6.210000038146973 -2.865000009536743,6.210000038146973 C-2.865000009536743,6.210000038146973 -2.865000009536743,0.33500000834465027 -2.865000009536743,0.33500000834465027 C-2.865000009536743,0.33500000834465027 -2.865000009536743,-1.0190000534057617 -2.865000009536743,-1.0190000534057617 C-2.865000009536743,-1.0190000534057617 -2.865000009536743,-2.0399999618530273 -2.865000009536743,-2.0399999618530273z M-8.385000228881836,7.564000129699707 C-8.010000228881836,7.925000190734863 -7.559000015258789,8.105999946594238 -7.031000137329102,8.105999946594238 C-7.031000137329102,8.105999946594238 -4.677000045776367,8.105999946594238 -4.677000045776367,8.105999946594238 C-4.677000045776367,8.105999946594238 -4.677000045776367,6.210000038146973 -4.677000045776367,6.210000038146973 C-4.677000045776367,6.210000038146973 -7.031000137329102,6.210000038146973 -7.031000137329102,6.210000038146973 C-7.031000137329102,6.210000038146973 -7.031000137329102,-1.0190000534057617 -7.031000137329102,-1.0190000534057617 C-7.031000137329102,-1.0190000534057617 -4.677000045776367,-1.0190000534057617 -4.677000045776367,-1.0190000534057617 C-4.677000045776367,-1.0190000534057617 -4.677000045776367,-2.9149999618530273 -4.677000045776367,-2.9149999618530273 C-4.677000045776367,-2.9149999618530273 -7.031000137329102,-2.9149999618530273 -7.031000137329102,-2.9149999618530273 C-7.559000015258789,-2.9149999618530273 -8.010000228881836,-2.7279999256134033 -8.385000228881836,-2.3529999256134033 C-8.746000289916992,-1.9919999837875366 -8.927000045776367,-1.5470000505447388 -8.927000045776367,-1.0190000534057617 C-8.927000045776367,-1.0190000534057617 -8.927000045776367,6.210000038146973 -8.927000045776367,6.210000038146973 C-8.927000045776367,6.73799991607666 -8.746000289916992,7.189000129699707 -8.385000228881836,7.564000129699707z M-2.865000009536743,6.210000038146973 C-2.865000009536743,6.210000038146973 -2.865000009536743,-2.0399999618530273 -2.865000009536743,-2.0399999618530273 C-2.865000009536743,-2.0399999618530273 0.4480000138282776,-5.353000164031982 0.4480000138282776,-5.353000164031982 C0.4480000138282776,-5.353000164031982 -0.6150000095367432,-1.0190000534057617 -0.6150000095367432,-1.0190000534057617 C-0.6150000095367432,-1.0190000534057617 7.010000228881836,-1.0190000534057617 7.010000228881836,-1.0190000534057617 C7.010000228881836,-1.0190000534057617 7.010000228881836,0.33500000834465027 7.010000228881836,0.33500000834465027 C7.010000228881836,0.33500000834465027 4.510000228881836,6.210000038146973 4.510000228881836,6.210000038146973 C4.510000228881836,6.210000038146973 -2.865000009536743,6.210000038146973 -2.865000009536743,6.210000038146973z M8.343999862670898,-2.3320000171661377 C7.968999862670898,-2.7209999561309814 7.531000137329102,-2.9149999618530273 7.031000137329102,-2.9149999618530273 C7.031000137329102,-2.9149999618530273 1.7400000095367432,-2.9149999618530273 1.7400000095367432,-2.9149999618530273 C1.7400000095367432,-2.9149999618530273 2.615000009536743,-6.374000072479248 2.615000009536743,-6.374000072479248 C2.697999954223633,-6.692999839782715 2.6700000762939453,-6.998000144958496 2.5309998989105225,-7.289999961853027 C2.3919999599456787,-7.581999778747559 2.177000045776367,-7.803999900817871 1.8849999904632568,-7.956999778747559 C1.5800000429153442,-8.095999717712402 1.2599999904632568,-8.137999534606934 0.9269999861717224,-8.081999778747559 C0.6079999804496765,-8.039999961853027 0.33000001311302185,-7.894000053405762 0.09399999678134918,-7.644000053405762 C0.09399999678134918,-7.644000053405762 -4.677000045776367,-2.9149999618530273 -4.677000045776367,-2.9149999618530273 C-4.677000045776367,-2.9149999618530273 -4.677000045776367,8.105999946594238 -4.677000045776367,8.105999946594238 C-4.677000045776367,8.105999946594238 4.510000228881836,8.105999946594238 4.510000228881836,8.105999946594238 C4.870999813079834,8.105999946594238 5.218999862670898,7.99399995803833 5.552000045776367,7.771999835968018 C5.885000228881836,7.550000190734863 6.120999813079834,7.28000020980835 6.260000228881836,6.960000038146973 C6.260000228881836,6.960000038146973 8.802000045776367,1.0010000467300415 8.802000045776367,1.0010000467300415 C8.829999923706055,0.9039999842643738 8.857000350952148,0.800000011920929 8.885000228881836,0.6890000104904175 C8.913000106811523,0.5640000104904175 8.927000045776367,0.44600000977516174 8.927000045776367,0.33500000834465027 C8.927000045776367,0.33500000834465027 8.927000045776367,-1.0190000534057617 8.927000045776367,-1.0190000534057617 C8.927000045776367,-1.5190000534057617 8.732999801635742,-1.9570000171661377 8.343999862670898,-2.3320000171661377z" fill="rgb(31,31,31)" fill-opacity="1"></path></g></g></g></svg></div><button aria-controls="feedback-form-54" aria-label="Bad response" aria-pressed="false" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger icon-button mat-unthemed"></button><div _ngcontent-ng-c2790744336="" class="thumb-animation" hidden="" lottie-animation=""><svg height="96" preserveaspectratio="xMidYMid meet" viewbox="0 0 96 96" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><clippath id="bkmrk--7"><rect height="96" width="96" x="0" y="0"></rect></clippath><mask id="bkmrk--8"><rect fill="#ffffff" height="96" width="96"></rect><path clip-rule="nonzero" d=" M20.823999404907227,-50.45800018310547 C20.823999404907227,-50.45800018310547 -18.42799949645996,-40.75899887084961 -18.42799949645996,-40.75899887084961 C-18.42799949645996,-40.75899887084961 -20.881999969482422,-11.439000129699707 -20.881999969482422,-11.439000129699707 C-20.881999969482422,-11.439000129699707 13.111000061035156,-16.22100067138672 13.111000061035156,-16.22100067138672 C13.111000061035156,-16.22100067138672 20.823999404907227,-50.45800018310547 20.823999404907227,-50.45800018310547" fill="#000000"></path></mask></defs><g clip-path="url(#__lottie_element_6250)"><g class="lottie-thumbs-down" mask="url(#__lottie_element_6254)"><g><path></path></g></g><g class="lottie-thumbs-down"><g><path></path></g></g><g class="lottie-thumbs-down" opacity="1" transform="matrix(-0.9419913291931152,0,0,-0.9419913291931152,46.50027084350586,49.44205856323242)"><g opacity="1" transform="matrix(4.239999771118164,0,0,4.239999771118164,0,0)"><path d=" M-2.865000009536743,-2.0399999618530273 C-2.865000009536743,-2.0399999618530273 -2.865000009536743,6.210000038146973 -2.865000009536743,6.210000038146973 C-2.865000009536743,6.210000038146973 -2.865000009536743,0.33500000834465027 -2.865000009536743,0.33500000834465027 C-2.865000009536743,0.33500000834465027 -2.865000009536743,-1.0190000534057617 -2.865000009536743,-1.0190000534057617 C-2.865000009536743,-1.0190000534057617 -2.865000009536743,-2.0399999618530273 -2.865000009536743,-2.0399999618530273z M-8.385000228881836,7.564000129699707 C-8.010000228881836,7.925000190734863 -7.559000015258789,8.105999946594238 -7.031000137329102,8.105999946594238 C-7.031000137329102,8.105999946594238 -4.677000045776367,8.105999946594238 -4.677000045776367,8.105999946594238 C-4.677000045776367,8.105999946594238 -4.677000045776367,6.210000038146973 -4.677000045776367,6.210000038146973 C-4.677000045776367,6.210000038146973 -7.031000137329102,6.210000038146973 -7.031000137329102,6.210000038146973 C-7.031000137329102,6.210000038146973 -7.031000137329102,-1.0190000534057617 -7.031000137329102,-1.0190000534057617 C-7.031000137329102,-1.0190000534057617 -4.677000045776367,-1.0190000534057617 -4.677000045776367,-1.0190000534057617 C-4.677000045776367,-1.0190000534057617 -4.677000045776367,-2.9149999618530273 -4.677000045776367,-2.9149999618530273 C-4.677000045776367,-2.9149999618530273 -7.031000137329102,-2.9149999618530273 -7.031000137329102,-2.9149999618530273 C-7.559000015258789,-2.9149999618530273 -8.010000228881836,-2.7279999256134033 -8.385000228881836,-2.3529999256134033 C-8.746000289916992,-1.9919999837875366 -8.927000045776367,-1.5470000505447388 -8.927000045776367,-1.0190000534057617 C-8.927000045776367,-1.0190000534057617 -8.927000045776367,6.210000038146973 -8.927000045776367,6.210000038146973 C-8.927000045776367,6.73799991607666 -8.746000289916992,7.189000129699707 -8.385000228881836,7.564000129699707z M-2.865000009536743,6.210000038146973 C-2.865000009536743,6.210000038146973 -2.865000009536743,-2.0399999618530273 -2.865000009536743,-2.0399999618530273 C-2.865000009536743,-2.0399999618530273 0.4480000138282776,-5.353000164031982 0.4480000138282776,-5.353000164031982 C0.4480000138282776,-5.353000164031982 -0.6150000095367432,-1.0190000534057617 -0.6150000095367432,-1.0190000534057617 C-0.6150000095367432,-1.0190000534057617 7.010000228881836,-1.0190000534057617 7.010000228881836,-1.0190000534057617 C7.010000228881836,-1.0190000534057617 7.010000228881836,0.33500000834465027 7.010000228881836,0.33500000834465027 C7.010000228881836,0.33500000834465027 4.510000228881836,6.210000038146973 4.510000228881836,6.210000038146973 C4.510000228881836,6.210000038146973 -2.865000009536743,6.210000038146973 -2.865000009536743,6.210000038146973z M8.343999862670898,-2.3320000171661377 C7.968999862670898,-2.7209999561309814 7.531000137329102,-2.9149999618530273 7.031000137329102,-2.9149999618530273 C7.031000137329102,-2.9149999618530273 1.7400000095367432,-2.9149999618530273 1.7400000095367432,-2.9149999618530273 C1.7400000095367432,-2.9149999618530273 2.615000009536743,-6.374000072479248 2.615000009536743,-6.374000072479248 C2.697999954223633,-6.692999839782715 2.6700000762939453,-6.998000144958496 2.5309998989105225,-7.289999961853027 C2.3919999599456787,-7.581999778747559 2.177000045776367,-7.803999900817871 1.8849999904632568,-7.956999778747559 C1.5800000429153442,-8.095999717712402 1.2599999904632568,-8.137999534606934 0.9269999861717224,-8.081999778747559 C0.6079999804496765,-8.039999961853027 0.33000001311302185,-7.894000053405762 0.09399999678134918,-7.644000053405762 C0.09399999678134918,-7.644000053405762 -4.677000045776367,-2.9149999618530273 -4.677000045776367,-2.9149999618530273 C-4.677000045776367,-2.9149999618530273 -4.677000045776367,8.105999946594238 -4.677000045776367,8.105999946594238 C-4.677000045776367,8.105999946594238 4.510000228881836,8.105999946594238 4.510000228881836,8.105999946594238 C4.870999813079834,8.105999946594238 5.218999862670898,7.99399995803833 5.552000045776367,7.771999835968018 C5.885000228881836,7.550000190734863 6.120999813079834,7.28000020980835 6.260000228881836,6.960000038146973 C6.260000228881836,6.960000038146973 8.802000045776367,1.0010000467300415 8.802000045776367,1.0010000467300415 C8.829999923706055,0.9039999842643738 8.857000350952148,0.800000011920929 8.885000228881836,0.6890000104904175 C8.913000106811523,0.5640000104904175 8.927000045776367,0.44600000977516174 8.927000045776367,0.33500000834465027 C8.927000045776367,0.33500000834465027 8.927000045776367,-1.0190000534057617 8.927000045776367,-1.0190000534057617 C8.927000045776367,-1.5190000534057617 8.732999801635742,-1.9570000171661377 8.343999862670898,-2.3320000171661377z" fill="rgb(31,31,31)" fill-opacity="1"></path></g></g></g></svg></div>  
</div></div></div></div></div></div></div>

# Ticket Offence Items

<p class="callout info">**Ticket Offence Items** define the specific violations (e.g., "Parked with No Proof of Payment," "Expired Meter") that can be issued within OPSCOM. This feature allows administrators to configure fine amounts, discounts, and specific behaviors for each offence, ensuring accurate and consistent enforcement across both web and handheld platforms.</p>

### Using this Feature

1. Hover over **System Configuration,** then **Violations,** and click **Manage Ticket Offence Items**.
2. The **Manage Ticket Offence Items** page opens. This page provides comprehensive tools to add, edit, and configure individual offence items.

##### <span style="text-decoration: underline;">Adding a New Offence Item</span>

1. In the top left box, select the **Ticket Category** (e.g., "Private Property") you wish to add an offence item to, or choose **Unassigned Offence Items**.
2. Click **Add New Offence Item**.
3. Fill out the following fields: 
    - Enter the **Violation Type Description** (e.g., "Parked With No Proof Of Payment").
    - Select the **Ticket Category** it belongs to (e.g., "Private Property").
    - Enter a **Key**. This optional field indicates specific tracking codes for violations (e.g., internal audit codes).
    - Enter a **By-Law code** This optional field is used by municipalities to link violations to specific by-laws when sending them to court for collections. It is a text field that accepts up to 20 alphanumeric characters.
    - Enable the **Administrative Fee** if required. (More about this below)
    - **Fine Amount, Adjustable Fine Amount,** and **Discount Settings** are covered below.
4. Click **Save New Offence Item** when complete.

##### <span style="text-decoration: underline;">Setting the Fine Amount and Discount</span>

- **Fine Amount**: Set the base fine amount (e.g., "$30.00").
- **Apply Discount**: Enable this checkbox if you wish to offer a discount for early payment. 
    - **Discount Amount**: Enter the amount of the discount (e.g., "$10.00").
    - **Discount Days**: Set the number of days within which the discount applies (e.g., "14" days).
    - **Example**: If the fine is $30.00, and a discount of $10.00 is applied if paid within 14 days, the collected fine will be $20.00. After 14 days, the discount does not apply, and the full $30.00 is due.

5. Click **Save Ticket Offence Item** to save this configuration. You will be returned to the list view with your new offence listed under its Ticket Category.

##### <span style="text-decoration: underline;">Is This Fine Amount Adjustable?</span>

<p class="callout info">This can be useful for scenarios such as repeat offenders or multiple offences. Officers can, at their discretion, increase the ticket amount (e.g., for repeat violations) or reduce it (e.g., when issuing multiple violations for less than the combined full amount), in accordance with your organization's business rules.</p>

Enable the **Adjust Fine Amount** checkbox in the ticket configuration screen:

- **Default - (Off)**: By default, this feature is turned off. The fine amount will appear on handheld units as a grey, non-editable figure.
- **Enabled - (On)**: When turned on, the fine amount will appear in black text on handheld units, allowing patrol officers to edit the amount.

##### <span style="text-decoration: underline;">Administration Fees</span>

<p class="callout info">Admin Fees are useful for charges like Conviction Fees or Booting Fees. Offence items designated as Administration Fees **do not show on handheld units**. They are only visible on the admin interface, ensuring field officers don't issue them directly.</p>

You can designate an offence item as an **Administration Fee** by selecting the **Administrative Fee** checkbox.

- **Configuration Example**: To set up a $20.00 administration fee for removing a boot from a vehicle: 
    1. Toggle the **Administration Fee** checkbox **On**. This will also prevent the offence item from being synced with handhelds.
    2. Set the **Fine Amount** to "$20.00".
    3. Click **Save Ticket Offence Item**.

##### <span style="text-decoration: underline;">Editing, Deleting, and Archiving Offence Items</span>

- **Editing:** Click the **Pencil icon** next to the Offence Item and make your changes. Click the **Update Ticket Offence Item** button to confirm.
- **Deletion**: Ticket Offence Items can only be **deleted** if there are **no violations** already written for that particular offence item.
- **Archiving**: Once a violation has been issued using a specific Offence Item, that item can no longer be deleted. Instead, it will be **archived** to preserve the integrity of any data associated with it, ensuring historical reports remain accurate.

---

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

- <span style="color: rgb(22, 145, 121);">**Clear and Specific Offence Names**: Use descriptive names for offence items to avoid ambiguity (e.g., "No Parking - Fire Lane" vs. "Parking Violation").</span>
- <span style="color: rgb(22, 145, 121);">**Fine and Discount Strategy**: Carefully define your fine amounts and discount structures to encourage timely payment and align with your enforcement policies.</span>
- <span style="color: rgb(22, 145, 121);">**Handheld Visibility Management**: Strategically decide which offence items are visible on handhelds. Keep the list concise for field officers, moving less common or admin-only fees to the "Administration Fees" category.</span>
- <span style="color: rgb(22, 145, 121);">**By-Law Code Accuracy**: For municipalities, ensure the By-Law Code is accurately entered and consistent with legal requirements for court collections.</span>
- <span style="color: rgb(22, 145, 121);">[**Ordering Violation Types**:](https://opscom.wiki/books/setup-configuration-for-admins/page/sort-violations-for-quick-access/edit) The system sorts the list of violation types alphanumerically. To achieve a specific custom sort order on both admin interfaces and handheld units, you can prefix the **Offence Item Name** with numbers or spaces. (A space is considered higher than an 'A'.)</span>
    - <span style="color: rgb(22, 145, 121);">**Example**: `Zebra Offence`, `Test Offence`, `A Test Offence`</span>
- <span style="color: rgb(22, 145, 121);">Leverage "Adjust Fine Amount" with clear business rules for officers, and properly categorize "Violation Applies To" (Vehicle vs. User) to fit various enforcement scenarios.</span>

---

### Related Videos

<iframe class="youtube-player conf-macro output-block" data-hasbody="false" data-macro-id="eef7cfc5-3dcd-40b8-8e05-6477cabf8756" data-macro-name="widget" frameborder="0" height="321" src="https://www.youtube.com/embed/heFG8_ebjQ8?wmode=opaque" style="width: 642px; height: 321px;" width="642"></iframe>

# Sort Violations for Quick Access

<p class="callout info">OPSCOM allows administrators to customize the display order of **Ticket Offence Items** (violations) for quicker access, especially useful for frequently used offences. By strategically adding spaces to the beginning of offence names, you can control their sorting order on both the admin interface and handheld devices, improving efficiency for enforcement officers and data entry personnel.</p>

When managing a long list of violation offence items, it can be time-consuming to scroll and find specific offences. The challenge is to reorder this list for quick access, ensuring the most commonly used offences appear at the top.

The system sorts lists alphanumerically. We can take advantage of the fact that a **space character ()** comes before all alphanumeric characters in the ASCII character table. By prefixing a violation name with one or more spaces, you can force it to appear higher in the sorted list.

**Example of Sorting with Spaces:**

- `Zebra Offence` (two spaces, sorts first)
- `Test Offence` (one space, sorts second)
- `Apple Offence` (no space, sorts third)
- `Bottle Offence` (no space, sorts fourth)

Let's walk through a practical example of reordering a list of violations.

1. Hover over **System Configuration,** then **Violations,** and click **Manage Ticket Offence Items**.
2. In this example, we will select **Private Property** as the ticket category. This will display a list of violations categorized under "Private Property."

##### <span style="text-decoration: underline;">Reordering Violations - An Example</span>

We want to reorder the list so that "Parked in No Parking Area" lists first, "Parked Blocking Fire Hydrant" lists second, and the rest of the violations list in alphabetical order after that.

1. **Modify "Parked in No Parking Area"**:
    
    
    - Click on **Parked in No Parking Area** to select it. The screen will refresh with the entry information for the violation.
    - Add a **single space** to the very beginning of the **Violation Type Description** field.
    - Click **Save Violation Type**.
    - *Result*: The list will now show " Parked in No Parking Area" (with the space) as the first item.
2. **Modify "Parked Blocking Fire Hydrant"**:
    
    
    - Next, select **Parked Blocking Fire Hydrant**.
    - Add a **single space** to the beginning of its **Violation Type Description**.
    - Save the violation type.
    - *Result*: The listing will change again. However, since both now have one space, " Parked Blocking Fire Hydrant" will appear *before* " Parked in No Parking Area" due to alphabetical sorting of the rest of the name.
3. **Adjusting Order with Multiple Spaces**:
    
    
    - To ensure "Parked in No Parking Area" appears first and "Parked Blocking Fire Hydrant" second, we need to use a different number of spaces.
    - Select **Parked in No Parking Area** again.
    - Add a **second space** to the beginning of its **Violation Type Description** (so it has two spaces: `  Parked in No Parking Area`).
    - Save the violation type.
    - *Result*: The list on the left now shows " Parked in No Parking Area" in the first position, followed by " Parked Blocking Fire Hydrant" in the second position, and then the rest of the violations in alphabetical order.

---

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

- <span style="color: rgb(22, 145, 121);">**Consistency is Key**: If you start using spaces to sort, apply the method consistently across all relevant lists (e.g., if you sort one category of offences, consider sorting others for a uniform experience).</span>
- <span style="color: rgb(22, 145, 121);">**Minimal Spaces**: Use the fewest number of spaces necessary to achieve your desired order. For example, if you only need one item at the very top, one space is sufficient. If you need two items, one gets two spaces, the other gets one.</span>
- <span style="color: rgb(22, 145, 121);">**Handheld Impact**: Remember that this sorting method affects the display order on both the admin interface and handheld units, directly impacting the efficiency of your enforcement officers in the field.</span>
- <span style="color: rgb(22, 145, 121);">**Documentation**: If multiple administrators manage ticket offence items, document your sorting strategy internally to maintain consistency and prevent accidental reordering.</span>
- <span style="color: rgb(22, 145, 121);">**No Wildcards**: This method relies on actual space characters, not wildcards (`*`) or other special characters that might not function as expected in sort orders.</span>

# Handhelds Devices Settings (Handheld Commons)

<p class="callout info">The **Handhelds Devices** section in OPSCOM allows administrators to manage and configure handheld devices used for enforcement and data collection. This includes registering new devices, pushing messages, and updating device settings, ensuring seamless operation for field personnel and accurate data synchronization.</p>

### Setup and Configuration

In order to use the handheld as a ticket writer, you will need to have the following permission set:

- **Display as Ticket Writer**: Ability to be a ticket writer on the Handheld Tablets or on the system.

This setting comes with the role Patrol Officer by default. To check if this role is set up in your system:

- Go to **System Configuration**, **Admin Management**, and click **Manage Roles**.
- Select the role for **Patrol Officer** and click on the tab for violations.
- You should see the box labeled **Display as Ticket Writer** checked.

[For more information on managing roles, click here!](https://opscom.wiki/books/setup-configuration-for-admins/page/manage-roles-and-permissions)

<p class="callout warning">Before accessing a handheld device for the first time, new admin users are required to log in through the online admin portal and complete their initial password reset.</p>

### Using this Feature

1. Click **Tools**, then **Handhelds Devices**. Alternatively, you can access this on the **Violations** menu as well.
2. The **Handhelds - Common Settings** screen appears, where you can manage various aspects of your handheld fleet. From here, you can edit settings such as ticket due dates, customize ticket footers, view device information, and add or manage individual handheld units.

##### <span style="text-decoration: underline;">Adding a New Device</span>

When adding a new handheld device, the process involves both the device itself and the OPSCOM system configuration.

1. **Install Software**: Start by installing the OPSCOM enforcement app on the handheld device.
2. **Obtain UUID**: After the first login attempt on the device, you'll receive a notice indicating the device isn't registered. This message will display a **UUID** (Universally Unique Identifier) number. This is a 16-digit alphanumeric code typically found under your login screen on the device.
3. **Register Device in OPSCOM**: 
    - Once on the **Handhelds - Common Settings** page in the admin portal, click **Add New Device**.
    - A new screen will open. You must add the following information: 
        - **UUID**: Enter the UUID obtained from the handheld device.

<p class="callout warning">You will need to include all characters in the UUID, **including dashes between the groups of characters. *Some UUIDs do not have dashes.***</p>

- - - **Server to Sync with**: **Always start by selecting the Production Server.** This is a critical step for initial device registration, regardless of whether the device will eventually be used for testing on a Preview server (explained further in "[Production Server First (Crucial)](https://opscom.wiki/link/191#bkmrk-production-server-fi)" under Best Practices &amp; Considerations).
        - **Name**: Enter a descriptive **name** to easily identify this device (e.g., "Patrol Unit 1," "Enforcement Officer John's Device").
        - Ensure the **Enabled** checkbox at the top of the entry form is selected.
    - Click **Add Device** once all information is in place.

##### <span style="text-decoration: underline;">Pushing Messages</span>

You can send messages directly to your configured handheld units:

1. On the **Handhelds - Common Settings** screen, click the **Push Message** button.
2. Follow the prompts to compose and send your message to the selected devices.

##### <span style="text-decoration: underline;">Updating Device Data</span>

To modify settings for an existing handheld device:

1. On the **Handhelds - Common Settings** screen, click on the **device name** you wish to update. This will open a drop-down list of editable settings.
2. Make your desired changes to the device's configuration.
3. Once finished, ensure you click **Process Updates** to save and apply your changes to the device.

<p class="callout info">To edit the ticket footer, you must have the permission level and role of Primary Admin.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Production Server First (Crucial)**:</span>
    - <span style="color: rgb(22, 145, 121);">**Important Note**: Due to the underlying logic of the Handheld Common tool, you **must always register a new handheld unit on the Production admin portal first**, even if its ultimate purpose is for testing on a Preview site.</span>
    - <span style="color: rgb(22, 145, 121);">The system initially connects to the production server, then references the `PA Common/handheld assignment` table (which is written from production) to determine if a unit is registered for Production or Preview. This ensures the correct routing is established in the database.</span>
    - <span style="color: rgb(22, 145, 121);">This initial production-side registration is also why you can refresh preview sites without losing the handheld units configured for them.</span>
- <span style="color: rgb(22, 145, 121);">**Adding a Handheld Unit to Preview for Testing**:</span>
    1. <span style="color: rgb(22, 145, 121);">Start by **refreshing your preview** site to ensure it’s using the latest data. For details, see **[Create or Refresh a Preview Space](https://opscom.wiki/books/setup-configuration-for-admins/page/create-or-refresh-a-preview-space)**.</span>
    2. <span style="color: rgb(22, 145, 121);">First, add the handheld unit to **Handhelds - Common Settings** on the **production** admin portal as described in "Adding a New Device," but select your **Preview Server** in the **Server to Sync with** field. This sets the proper database route.</span>
    3. <span style="color: rgb(22, 145, 121);">Next, navigate to the **preview** admin portal and enter the exact same device information into its **Handhelds - Common Settings** section.</span>
    4. <span style="color: rgb(22, 145, 121);">Finally, perform a **reinstallation of the OPSCOM enforcement application** on the handheld device itself. This reinstallation allows the handheld to pick up the newly set path to the preview server.</span>
- <span style="color: rgb(22, 145, 121);">**Switching Between Production and Preview**:</span>
    - <span style="color: rgb(22, 145, 121);">Once a handheld entry exists in both Production (configured for Preview sync) and Preview, you can generally switch between environments by re-pointing the **Sync With** setting on both the Production and Preview admin portals to your preferred path.</span>
    - <span style="color: rgb(22, 145, 121);">**However, remember that you must perform a reinstallation of the software on the handheld unit each time you change the synchronization path in the system** for the handheld device itself to update with the selected path.</span>
- <span style="color: rgb(22, 145, 121);">**UUID Accuracy**: Ensure the UUID is entered precisely, as any error will prevent the device from connecting.</span>
- <span style="color: rgb(22, 145, 121);">**Descriptive Naming**: Use clear, identifiable names for your handheld devices to simplify management and troubleshooting.</span>

# Incidents Configuration

# Managing Incident Categories and Sub-Categories

<p class="callout info">**Incident Categories** and **Sub-Categories** in OPSCOM are used to define and classify incidents reported within the system. This feature allows administrators to organize incident types, control their visibility in reports, and manage associated checklists, ensuring precise documentation and effective analysis of various occurrences.</p>

### Using this Feature

The **Edit Categories and Sub Categories** page allows you to add, edit, and manage both main incident categories and their more specific sub-categories.

- Hover over **System Configuration,** then **Incidents,** and click **Categories**.

##### <span style="text-decoration-line: underline; color: rgb(34, 34, 34);">Adding Categories</span>

1. On the **Edit Categories and Sub Categories** page, click **Add New Category** located at the bottom of the page.
2. Fill out the details for your new **Category Name**.
3. Enter the **GIS number** (optional, used by clients with geographic location codes).
4. Select whether it's an **"In House"** category (for internal use).
5. Select if you'd like this category to be **Included in Reports**.
6. Click **Save Incident Category**.

##### <span style="text-decoration: underline;">Editing </span><span style="text-decoration-line: underline; color: rgb(34, 34, 34);">Categories</span>

1. On the **Edit Categories and Sub Categories** main page, locate the desired category from the listed items.
2. Click the **pencil icon** next to it to edit.
3. Make your changes and click **Save Incident Category** to apply your changes.

##### <span style="text-decoration: underline;">Managing Sub-Categories</span>

Sub-categories provide a finer level of detail for incidents.

1. To check a category for its sub-categories, click the **Sub** button next to the Category name.
2. The list of Sub-Categories for that item will display. You can add a new sub-category at the bottom of the list.
3. Enter the **Name** of the sub-category and enable the desired functions: 
    - If a **Checklist** is required for incidents under this sub-category, click **Required**.
    - If it's to be **Included in Reports**, click **Include**.
    - If you wish to archive it, enable the **Archive** checkbox.
    - If you want to change the name of an existing one, click in the text box and change it.

Once you have finished, click **Save Sub-Categories**.

---

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

- <span style="color: rgb(22, 145, 121);">**Logical Hierarchy**: Create a clear and logical hierarchy between categories and sub-categories to ensure accurate incident classification (e.g., Category: "Theft," Sub-Categories: "Vehicle Theft," "Personal Belongings Theft").</span>
- <span style="color: rgb(22, 145, 121);">**Report Inclusion**: Carefully consider which categories and sub-categories should be **Included in Reports** based on your organization's analytical and compliance needs.</span>
- <span style="color: rgb(22, 145, 121);">**In-House vs. Reportable**: Distinguish between "In House" categories (for internal tracking) and those intended for broader reporting or external sharing.</span>
- <span style="color: rgb(22, 145, 121);">**Checklists for Consistency**: Utilizing the "Required Checklist" option for sub-categories can ensure that all necessary information is collected consistently for specific types of incidents, improving data quality.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Review**: Periodically review your incident categories and sub-categories to ensure they remain relevant to your incident reporting needs and operational changes.</span>

# Managing Incident Flags

<p class="callout info">**Incident Flags** in OPSCOM allow administrators to create custom tags or labels that can be attached to incident reports. This feature is vital for quickly categorizing, highlighting, or drawing attention to specific characteristics of an incident, improving reporting, search capabilities, and internal communication.</p>

### Using this Feature

The **Edit Flags** page allows you to add and edit incident flags, as well as control their visibility in reports.

1. Hover over **System Configuration,** then **Incidents,** and click **Flags**.

##### <span style="text-decoration: underline;">Adding Flags</span>

1. At the bottom of the list, click on the empty text box provided for adding a new flag.
2. Fill in the **name** (e.g., "High Priority," "Follow-Up Required," "Safety Concern").
3. Toggle the **Include In Reports** checkbox if you do not want this flag to show up in reports. By default, this checkbox is **on**.
4. Click **Add**. The new Flag entry will now appear in the list and is ready to be used when creating or editing incident reports.

##### <span style="text-decoration: underline;">Deleting Flags</span>

1\. Click the **Delete** button next to the flag and **Confirm**.

---

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

- <span style="color: rgb(22, 145, 121);">**Clear and Concise Names**: Use short, descriptive names for your flags that clearly convey their purpose (e.g., "Critical," "Resolved," "Requires Manager Review").</span>
- <span style="color: rgb(22, 145, 121);">**Report Inclusion**: Carefully consider whether each flag should be **Included In Reports**. Flags used purely for internal workflow might not need to appear in aggregated reports.</span>
- <span style="color: rgb(22, 145, 121);">**Standardization**: Develop a standardized list of flags to ensure consistency across all incident reporting. This makes it easier to filter, search, and analyze incident data.</span>
- <span style="color: rgb(22, 145, 121);">**Workflow Integration**: Think about how flags can integrate with your incident management workflow. For instance, a "Follow-Up Required" flag could trigger a review process.</span>

# Managing Ethnic Types

<p class="callout info">**Ethnic Types** in OPSCOM allows administrators to define and manage a picklist of ethnic classifications for use within incident reporting. This feature supports detailed demographic data collection for incidents, enabling organizations to analyze trends, ensure fair and equitable practices, and comply with reporting standards.</p>

##### Using this Feature

The **Manage Ethnic Types** page provides a straightforward interface to add, edit, and delete various ethnic types.

1. Hover over **System Configuration,** then **Incidents,** and click **Ethnicity**.

##### Adding

1. Click **Add Ethnic Type**.
2. Fill in the **name**.
3. Click **Save Changes**.

##### Editing

1. Click the **Edit** button next to the Ethnic Type you want to change.
2. Make your edits and click **Save Changes**.

##### Deleting

<p class="callout warning">In order to delete an Ethnic Type, it must not be in by any records in the system. You will not see a delete button unless there are no records associated to this type.</p>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-the%C2%A0delete-but"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-245 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-245"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-245"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click the **Delete** button next to the type and **Confirm**.

---

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

- <span style="color: rgb(22, 145, 121);">**Standardization**: Use consistent and recognized terminology for ethnic types to ensure data accuracy and facilitate meaningful analysis.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always verify that an ethnic type is not actively linked to any records before attempting to delete it. This prevents data inconsistencies.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting and Analysis**: Accurate ethnic type data can be crucial for generating demographic reports related to incidents, helping organizations identify patterns and inform initiatives related to diversity, equity, and inclusion.</span>
- <span style="color: rgb(22, 145, 121);">**Sensitivity and Purpose**: When collecting and managing demographic data such as ethnic types, ensure that the purpose is clearly defined, aligns with organizational policies, and adheres to privacy regulations. This information should be handled with sensitivity and used responsibly.</span>
- <span style="color: rgb(22, 145, 121);">**Compliance**: If your organization has specific reporting requirements related to demographics (e.g., for government or grant purposes), ensure your configured ethnic types support those needs.</span>

# Managing Incident Relations

<p class="callout info">**Incident Relations** in OPSCOM allows administrators to define specific types of connections or relationships between individuals involved in an incident (e.g., "Witness," "Victim," "Suspect," "Reporting Party"). This feature is crucial for accurately documenting complex incident scenarios, ensuring all parties are properly identified, and facilitating comprehensive reporting and investigation.</p>

### Using this Feature

The **Relation Administration** page provides a straightforward interface to add and edit various incident relation types.

1\. Hover over **System Configuration,** then **Incidents,** and click **Relations**.

##### <span style="text-decoration: underline;">Adding Relations</span>

1. Locate the empty text box provided at the bottom of the list for adding a new relation.
2. Type in the desired **relation name** (e.g., "Witness," "Victim," "Suspect," "Reporting Party").
3. Choose a unique color for this type.
4. Click **Insert New** to add the new relation to the list.

##### <span style="text-decoration: underline;">Editing Relations</span>

1. Locate the relation you wish to modify in the list and click the **Edit** button.
2. Make your changes and click **Save Changes**.

---

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

- <span style="color: rgb(22, 145, 121);">**Comprehensive Definitions**: Define all relevant relationship types that might occur in your incident reporting to ensure accurate and complete documentation.</span>
- <span style="color: rgb(22, 145, 121);">**Clear Naming**: Use concise and unambiguous names for relations to avoid confusion (e.g., "Victim" vs. "Complainant" if they represent different roles in your context).</span>
- <span style="color: rgb(22, 145, 121);">**Standardization**: Encourage consistent use of defined relations by all personnel involved in incident reporting to improve data quality and reporting consistency.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Always ensure that a relation is not actively linked to any incident parties before attempting to delete it, to prevent data inconsistencies.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting Value**: Properly categorized relations are essential for generating accurate reports on incident demographics and the roles of individuals involved.</span>

# Extended User Profile Options

<p class="callout info">**Extended User Profile Options** in OPSCOM allow administrators to define and manage additional, highly granular descriptive categories and values for user profiles, typically used in incident reporting. This feature enables officers to record unique physical features or identifiers of individuals involved in an incident, enhancing the detail and accuracy of incident reports.</p>

### Using this Feature

The **User Extended Values Administration** page allows you to add and update a variety of descriptive values for user profiles.

1. Hover over **System Configuration,** then **Incidents,** and click **Ext. User Profile Options**.

The **User Extended Values Administration** page displays a list of currently defined extended values. Notice the various **types** you can choose from in the dropdown menus to categorize your extended values. A **Value Type** acts as a category (e.g., "Hair Type"), while the **Value Description** details the specific characteristic (e.g., "Balding," "Red," "Long").

##### <span style="text-decoration: underline;">Adding Extended User Value Types</span>

1. Scroll to the bottom of the page and select a Value Type **from the dropdown menu** (e.g., "Hair Type," "Clothing Color," "Tattoo Location").
2. Type the **Value Description** in the textbox provided (e.g., "Curly," "Blue," "Left Arm"). Value descriptions can include a range of physical features/identifiers of a user, such as the location of a tattoo, the color of clothing, or the style of hair.
3. Click **Insert New** to add and save the new extended user value.

##### <span style="text-decoration: underline;">Editing </span><span style="text-decoration: underline;">Extended User Value Types</span>

1. Locate the extended value you wish to edit in the list and click **Edit.**
2. Adjust the **Category** (Value Type) and/or the **Name** (Value Description) by selecting the appropriate textbox and making the desired changes (e.g., changing "Bald" to "Balding").
3. Click **Save Changes** to save and continue.

---

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

- <span style="color: rgb(22, 145, 121);">**Granular Detail for Incidents**: Leverage extended values to capture specific, unique identifiers for individuals involved in incidents, which can be critical for identification and investigation.</span>
- <span style="color: rgb(22, 145, 121);">**Standardized Terminology**: Establish clear, consistent terminology for both **Value Types** and **Value Descriptions** to ensure uniformity in data collection across all officers and administrators.</span>
- <span style="color: rgb(22, 145, 121);">**Training for Officers**: Train officers on the importance of these fields and how to accurately select and describe extended values when creating incident reports.</span>
- <span style="color: rgb(22, 145, 121);">**Avoid Redundancy**: Review existing categories and values before adding new ones to prevent duplication.</span>
- <span style="color: rgb(22, 145, 121);">**Privacy Considerations**: Be mindful of privacy regulations and your organization's policies regarding the collection of detailed personal identifiers. Ensure that the collection of such data is justified and used responsibly.</span>

# Missing Property Types

<p class="callout info">**Missing Property Types** allows administrators to define and categorize different kinds of missing or stolen property (e.g., Electronics, Jewelry, Documents) within incident reports. This feature enables detailed and structured data collection for lost or stolen items, enhancing the accuracy of incident documentation and supporting investigations.</p>

### Using this Feature

The **Edit Missing Property Types and Fields** page allows you to define both the broad categories of missing property and the specific details (fields) you want to collect for each category.

1. Hover over **System Configuration,** then **Incidents,** and click **Missing Property Types**.

##### <span style="text-decoration: underline;">Adding Property Types</span>

1. Click the **Add New Type** button.
2. Type the **Name** for the new missing property type and click **Add New.**

##### <span style="text-decoration: underline;">Adding Fields to Types</span>

1. Click **View Fields** next to the Property Type you want to add a field to.
2. Click **Add New Field**.
3. Type in the **Field Name** (e.g., "Serial Number," "Color," "Brand").
4. Select the **Field Type** from the dropdown menu (e.g., **checkbox**, **textbox**, **dropdown**, etc.).
5. Select whether or not it is a **required field** by clicking the **Required** checkbox.
6. Click **Add New** to save the new field.

##### <span style="text-decoration: underline;">Editing Property Types</span>

1. Click the name of the property type you wish to change.
2. Change the name and click Save Changes.
3. Click the **View Fields** button if you want to edit any fields associated to this.

##### <span style="text-decoration: underline;">Deleting Property Types</span>

Deleting a missing property type is a two-step process if it has associated fields.

1. **If there are NO fields found associated with that property**: You can immediately click **Delete Property Type**.
2. **If there ARE fields found associated with that property**: 
    - Click View Fields and then click **Delete All**.
    - Click **Save Changes** to delete the selected fields.
    - Follow step one to **Delete Property Type**.

---

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

- <span style="color: rgb(22, 145, 121);">**Structured Data Collection**: Use fields within each property type to ensure structured and consistent data collection for stolen or missing items (e.g., for "Electronics," you might add fields for "Make," "Model," "Serial Number").</span>
- <span style="color: rgb(22, 145, 121);">**Clear and Concise Names**: Use descriptive names for both property types and their fields to improve usability and clarity for officers filling out incident reports.</span>
- <span style="color: rgb(22, 145, 121);">**Required Fields**: Carefully consider which fields are truly **Required** to avoid unnecessary data entry burden while ensuring critical information is captured.</span>
- <span style="color: rgb(22, 145, 121);">**Data Integrity**: Remember that a property type cannot be deleted if it has associated fields. This mechanism helps prevent orphaned data and ensures the integrity of your incident records.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting Value**: Well-defined missing property types and their fields can significantly enhance the quality of reports, aiding in investigations and property recovery efforts.</span>

# Alerts Configuration

# Email Alert List

<p class="callout info">The **Email Alert List** in OPSCOM allows administrators to define a specific set of email addresses that will receive automated warning notifications from the system. This feature is crucial for ensuring that designated personnel are promptly alerted to important system events or potential issues, enabling timely intervention and management.</p>

## Setup &amp; Configuration

The **Email Alert List** is accessed through the **System Configuration** menu.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-system-configu"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **System Configuration**, then **Alerts.**
2. Click **Email Alert List**.

</div></div></div></div></div></div></div></div>You'll be redirected to the **Manage Alert Emails** page, where you can manage the list of recipient email addresses.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

</div></div></div></div></div></div></div></div>### Using this Feature

The **Manage Alert Emails** page enables you to add, edit, or delete email addresses that are designated to receive warning notifications. You can also use the **Toggle Archived** checkbox if you want to see inactive email addresses.

##### <span style="text-decoration: underline;">Adding an Email Address</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-warning-em"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Alert Email**.
2. An input box will appear. Enter the desired email address into the text box.
3. Toggle the Active checkbox to on.
4. Click **Save Changes** to add the email address to the list.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Editing an Email Address</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-email-add"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the email address you wish to modify in the list.
2. Click the **Edit** button next to that email address.
3. Make the desired changes to the email address in the text box.
4. Toggle the Active checkbox if necessary.
5. Click **Save Changes** to update the entry.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Deleting an Email Address</span>

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-email-add-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the email address you wish to remove from the list.
2. Click the **Delete** button to the right of that email address.
3. A pop-up confirmation window will appear.
4. Click **Delete** to confirm the removal, or click **Cancel** to return to the previous page without deleting.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-designated-recipient"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-designated-recipient-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-designated-recipient-2">- <span style="color: rgb(22, 145, 121);">**Designated Recipients**: Only add email addresses of personnel who are responsible for monitoring and acting upon system warnings.</span>
- <span style="color: rgb(22, 145, 121);">**Monitor Regularly**: Periodically review the emails sent to these addresses and the list itself to ensure all recipients are current and the warnings are being received and actioned appropriately.</span>
- <span style="color: rgb(22, 145, 121);">**Group Email Addresses**: Consider using a distribution list or group email address (e.g., `ops-alerts@yourcompany.com`) if multiple individuals need to receive the same warnings. This simplifies management, as you only need to update the group's membership in your email system, not in OPSCOM.</span>
- <span style="color: rgb(22, 145, 121);">**Validation**: Ensure that all entered email addresses are valid and actively monitored to prevent missed critical alerts.</span>

</div></div></div></div></div></div></div></div>

# Manage Email Warnings

<p class="callout info">**Manage Email Warnings** in OPSCOM allows administrators to define and manage a list of email addresses that will receive critical system alerts. This feature is vital for ensuring that designated personnel are promptly notified of important events, such as security breaches, system errors, or specific operational triggers, enabling swift response and management.</p>

### Setup &amp; Configuration

**Manage Email Warnings** is accessed through the **System Configuration** menu.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-system-configu"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **System Configuration**, then **Alerts.**
2. Click **Manage Email Warnings**.

</div></div></div></div></div></div></div></div>You'll be redirected to the **Manage Email Warnings page, where you can manage the list of recipient email addresses.

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

</div></div></div></div></div></div></div></div>### Using this Feature

The **Manage Email Warnings** page enables you to add, edit, or delete email addresses that are designated to receive warning notifications.

##### Adding an Email Address

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-click-add-warning-em"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Click **Add Warning Email**.
2. An input box will appear. Enter the desired email address into the text box.
3. Click **Save Changes** to add the email address to the list.

</div></div></div></div></div></div></div></div>##### Editing an Email Address

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-email-add"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the email address you wish to modify in the list.
2. Click the **Edit** button next to that email address.
3. Make the desired changes to the email address in the text box.
4. Click **Save Changes** to update the entry.

</div></div></div></div></div></div></div></div>##### Deleting an Email Address

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-locate-the-email-add-1"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">1. Locate the email address you wish to remove from the list.
2. Click the **Delete** button to the right of that email address.
3. A pop-up confirmation window will appear.
4. Click **Delete** to confirm the removal, or click **Cancel** to return to the previous page without deleting.

---

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

<div _ngcontent-ng-c617919120="" class="chat-history-scroll-container" id="bkmrk-designated-recipient"><div _ngcontent-ng-c617919120="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-designated-recipient-1"><div _ngcontent-ng-c3942763368=""><div _ngcontent-ng-c4086532758="" class="response-container ng-tns-c4086532758-185 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c4086532758="" class="presented-response-container ng-tns-c4086532758-185"><div _ngcontent-ng-c4086532758="" class="response-container-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3942763368="" class="response-content ng-tns-c4086532758-185"><div _ngcontent-ng-c3017587935="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-designated-recipient-2">- <span style="color: rgb(22, 145, 121);">**Designated Recipients**: Only add email addresses of personnel who are responsible for monitoring and acting upon system warnings.</span>
- <span style="color: rgb(22, 145, 121);">**Monitor Regularly**: Periodically review the emails sent to these addresses and the list itself to ensure all recipients are current and the warnings are being received and actioned appropriately.</span>
- <span style="color: rgb(22, 145, 121);">**Group Email Addresses**: Consider using a distribution list or group email address (e.g., `ops-alerts@yourcompany.com`) if multiple individuals need to receive the same warnings. This simplifies management, as you only need to update the group's membership in your email system, not in OPSCOM.</span>
- <span style="color: rgb(22, 145, 121);">**Validation**: Ensure that all entered email addresses are valid and actively monitored to prevent missed critical alerts.</span>

</div></div></div></div></div></div></div></div>

# Payments Configuration

# Manage Deposit Types

<p class="callout info">**Deposit Types** allow administrators to define and manage various categories of deposits (e.g., for permits, equipment, or specific services). This feature is essential for accurately tracking refundable amounts, providing clear financial oversight, and ensuring proper accounting for deposited funds within the system.</p>

### Using this Feature

The **Manage Deposits** page provides a straightforward interface to add, edit, and view the usage of various deposit types.

1. Hover over **System Configuration,** then **Payments,** and click **Manage Deposit Types**.

##### <span style="text-decoration: underline;">Adding a Deposit Type</span>

1. Click **Add Deposit Type**.
2. Fill out the information as needed: 
    - **Label**: This is the name that will be used to identify the deposit type (e.g., "Permit Deposit," "Key Fob Deposit").
    - **Placeholder Text**: This field is optional. It provides a prompt or sample information that will appear in the deposit information text field when creating a deposit record.
    - **Flags**: This toggle controls the ability to edit the **Assignable Text** field in the resulting active deposit record. This text will appear in the user's profile associated with the deposit.
    - **Amount**: The amount that the deposit will cost.
    - **Active checkbox:** This determines if the deposit is currently available to be assigned.
3. Click **Save Changes**.

##### <span style="text-decoration: underline;">Editing a Deposit Type</span>

1. Locate the deposit type and click the **Edit** button next to it.
2. Make any necessary changes to the fields.
3. Click **Save Changes**.

##### <span style="text-decoration: underline;">Deleting a Deposit Type</span>

1\. If no records are associated with this deposit you can click the **Delete** button.

---

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

- <span style="color: rgb(22, 145, 121);">**Clear Labeling**: Use descriptive labels for your deposit types (e.g., "Annual Permit Deposit," "Visitor Pass Deposit") to ensure clarity for both administrators and users.</span>
- <span style="color: rgb(22, 145, 121);">**Placeholder Text Utility**: Utilize the **Placeholder Text** to provide clear instructions or examples for administrators when entering deposit information.</span>
- <span style="color: rgb(22, 145, 121);">**Understanding "Flags"**: The "Flags" setting for `Assignable Text` can be useful for adding specific, customizable notes to individual deposit records on user profiles, allowing for unique details per transaction.</span>
- **Financial Reconciliation**: Accurately tracking deposit types is crucial for financial reconciliation and managing refundable amounts.

# New Page

<p class="callout info">Preview Spaces in OPSCOM provide clients and support staff with a secure, isolated testing environment that mirrors your live production system's data. These spaces are invaluable for testing new features, staging changes, or conducting training without impacting your operational system, ensuring a safe sandbox for development and learning.</p>


### Setup &amp; Configuration

Preview spaces are typically created on demand. Your production/live OPSCOM system is used to either create a new preview space or refresh an existing one with current or historical data.

##### <span style="text-decoration: underline;">Creating or Refreshing a Preview Space</span>

1. Click **Tools,** then **Database to Preview**.

From this page, you have two options for refreshing your preview database:

- **For Up-to-Date Information**: 
    1. Select **Backup Production Database**.
    2. Wait for the backup process to complete.
    3. Click the **Refresh Preview Database** button.
- **For an Older Backup**: 
    1. Select the specific date of the backup you wish to restore the preview database to.
    2. Click the **Refresh Preview Database** button.

<p class="callout warning">It may take a few minutes to refresh the database. Generally, a database is refreshed in 1-2 minutes, but it can take up to 15 minutes depending on the size of your database. A message will be displayed along the top of the screen notifying you when the database refresh is complete.</p>

Once the preview database has been refreshed, your preview system will automatically be created or updated. You can access the preview system by adding ".preview" before "OPSCOM.com" in your browser's address bar. For example, if your production space is `https://tomahawku.OPSCOM.com`, your preview space will be `https://tomahawku.preview.OPSCOM.com`.

---

### Using this Feature

##### <span style="text-decoration: underline;">Accessing Your Preview Space</span>

As an OPSCOM client, you can access your preview space directly by simply adding the ".preview." suffix to your subdomain name. For instance, if your production site is located at `https://yourorganization.OPSCOM.com`, your preview space can be found at `https://yourorganization.preview.OPSCOM.com`.

##### <span style="text-decoration: underline;">Preview Space Banner</span>

To clearly distinguish a preview space from a live production system, all preview spaces are denoted with an **amber warning banner** displayed prominently at the top of the page.

##### <span style="text-decoration: underline;">Locking and Unlocking Database Reset Option</span>

You can now lock and unlock preview and development OPSCOM databases to prevent them from being reset or refreshed accidentally.

1. On your preview site, click **Tools**, then **Reset Database**.
2. Toggle the lock/unlock setting as needed. 
    - You will be prompted to provide a **reason** for locking or unlocking the database.
    - A history of the previous 10 lock/unlock actions will be displayed below for your reference.

This feature allows you to ensure that if you are actively working on a preview/development system and do **NOT** wish for your changes to be reset or lost, you can place a lock. This lock notifies others attempting to refresh the database that a reset is not desired.

---

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

- <span style="color: rgb(22, 145, 121);">**Testing and Training Benefits**: Preview spaces are extremely useful for testing and training purposes. They allow you to work with a copy of your live database, providing real data for exercises without any risk of affecting your production system. The database can be manually reset at any time, allowing you to "erase" training data and start testing scenarios from scratch.</span>
- <span style="color: rgb(22, 145, 121);">**Daily Data Backups**: Production/live data is backed up daily at **2 AM EST** and is available to push to the testing environment at any time. This means if you perform a refresh of your preview site, it will pull data captured the night before. This operation is specifically for providing relevant data for testing and preview during training or similar efforts and is separate from normal system backup procedures.</span>
- <span style="color: rgb(22, 145, 121);">**Automatic Deletion of Inactive Spaces**: Preview sites are automatically deleted after **7 days of no login activity**.</span>
    - <span style="color: rgb(22, 145, 121);">If you require a preview site for an extended period, please contact OPSCOM support staff, and an expiry date can be set.</span>
- <span style="color: rgb(22, 145, 121);">**Email Notifications are Suppressed**: No Emails Sent from Preview/Testing - All email notifications that would normally be sent from the server are captured and suppressed in preview/testing environments. Therefore, any email notifications generated within your preview space will **not** reach clients or external recipients. This is a deliberate security measure to prevent accidental communication from a non-production environment.</span>

# Managing Payment Types

<p class="callout info">**Managing Payment Types** allows administrators to control which payment methods are available throughout the system. This comprehensive control enables you to define new payment options, assign them to specific user types (e.g., Staff, Students, Public), and configure their usage for subscriptions or guest payments, thereby streamlining transactions and ensuring alignment with your organization's financial policies.</p>

### Using this Feature

The **Payment Types** screen gives you a comprehensive interface to create, edit, and view details about different payment methods available in OPSCOM.

1. Go to **System Configuration,** then **Payments,** and click **$ Setup Payment Types**.

##### <span style="text-decoration: underline;">Adding Payment Types</span>

<p class="callout success">**Use Case -** For this example, we will setup a Payment type that will use the provider Always Successful. This will allow payments to immediately be flagged as fully processed with no intervention of any admin. This is often used for things like Payroll deduction. For example, you want your users to be able to purchase a permit through Payroll deduction that will immediately be valid upon checkout. The actual payments will take place through payroll and have nothing to do with OPSCOM.</p>

1. Click the **Add Type** button.
2. The list of **Providers** is hard coded and controlled by Tomahawk. You will not be able to change this picklist. The tooltip below the provider will tell you what each provider means.
3. Pick **Always Successful** for this example.
4. Click **Next Step.**
5. Provide a **Type Name.**
6. Choose the **User Types** this will be available to.
7. On the **Settings** tab, Enable the checkboxes as you required.
8. In the section **Allowed Payment Types**, you will see any payment types that are currently active first, then a list of inactive payment types after.
9. Click **Update Payment Type**.

##### <span style="text-decoration: underline;">Hosted Payment Providers</span>

The following links will detail the process of setting up a Hosted Payment provider, of which currently support. Click the link matching the payment provider you are adding below and follow the steps outlined on those articles.

- [OpenEdge](https://opscom.wiki/books/the-opscom-admin-portal/page/openedge-hosted-payments): 
    - We need the following credentials to work with OpenEdge;
    - **Auth Key**: a multi-digit string key
    - **Terminal ID**: a 8 digit numeric key
    - **X-Web ID**: a 12 digit numeric key
- [Moneris Checkout](https://opscom.wiki/books/the-opscom-admin-portal/page/moneris-checkout): 
    - We need the following credentials to work with Moneris Checkout;
    - **<span class="legacy-color-text-blue3">store\_id: </span>***store#***<span class="legacy-color-text-blue3">  
        </span>**
    - <span class="legacy-color-text-blue3">**api\_token:** </span>*xxxxxxx*<span class="legacy-color-text-blue3">  
        </span>
    - <span class="legacy-color-text-blue3">**checkout\_id:** </span>*xxxxxxxxStore#*
- [Bambora Checkout](https://opscom.wiki/books/the-opscom-admin-portal/page/bambora-checkout): 
    - We need the following credentials to work with Bambora Checkout (JSBambora): 
        - **Payment Authorization Header:** An alphanumeric passcode
        - **Profile Authorization Header:** An alphanumeric passcode

Once you retrieve the required values from your hosted payment provider of choice, save the credentials securely and contact OPSCOM Support for further instructions.

<p class="callout danger">The information you obtain in the above documentation are **credentials that secure the information exchanged between OPSCOM and the provider.** Please save these in a secure manner, it is important they are stored properly to ensure operational security.</p>

##### <span style="text-decoration: underline;">Extended Payment Information</span>

For each payment type, you can view extended information on the Payment Types screen.

- A **general description** of the payment type.
- An **indication of what the user will be prompted for** when selecting that payment type. For example, in a hosted payment scenario like EdgeExpress, the user might be prompted to enter an email address before being redirected to the payment provider to enter credit card information.
- The number of users associated to this payment type.

There are also three columns on the far right that use an **X** or **checkmark** to indicate specific uses of the payment type:

- **Column 1**: Indicates if this payment type can be used for **guest payments**.
- **Column 2**: Indicates if this payment type can be used for **permit and invoice renewal payments**.
- **Column 3**: Indicates if this payment type can be used for **Text2ParkMe subscriptions**.

##### <span style="text-decoration: underline;">Configuring Payment Types for Subscriptions and Guest Payments</span>

You can fine-tune how specific payment types are used for subscriptions and guest payments.

1. Find the payment type you wish to configure and click the **Pencil icon**.
2. Click the **Settings** tab.
3. Select the items you wish to allow the payment type to be used for (e.g., enable **Text2ParkMe**, **subscriptions to permit renewals**, as well as **guest payments**).
4. Prompt Information can be changed as well. You can enable only an **email address** or **full address information**. Full address info is required when the provider is doing Address Verification using AVS, 3DS or other similar service. This controls what shows up on the **QR Code reservations** screen after the **Payment Type** is selected.
5. Click **Update Payment Type**.

##### <span style="text-decoration: underline;">Processing as an Admin</span>

When processing payments as an administrator, the payment types presented will be split into two categories:

- What the user would be allowed to use for their specific User Type.
- What an administrator can choose (which may include additional options not visible to the user).

---

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

- <span style="color: rgb(22, 145, 121);">**Granular Control**: Leverage User Types to restrict payment methods, ensuring users only see relevant options. For example, you might only allow "Payroll Deduction" for Staff users.</span>
- <span style="color: rgb(22, 145, 121);">**Clear User Experience**: By limiting available payment types based on context or user, you simplify the checkout process and reduce confusion for users.</span>
- <span style="color: rgb(22, 145, 121);">**Refund Alignment**: Ensure that appropriate refund types are linked to their corresponding payment types to facilitate smooth and accurate refund processing.</span>
- <span style="color: rgb(22, 145, 121);">**Subscription Compatibility**: When enabling payment types for subscriptions (recurring billing), verify that the chosen payment gateway provider fully supports recurring transactions.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Review**: Periodically review your payment type configurations and their associated settings to ensure they remain aligned with your organization's financial policies and evolving needs.</span>

# Managing Convenience Fees

<p class="callout info">**Convenience Fees** in OPSCOM allow administrators to add an additional flat-rate charge directly to user payments, managed entirely within the OPSCOM system. This feature provides flexibility to offset processing costs, incentivize certain payment methods, or cover administrative burdens, distinct from any transaction fees imposed by external payment providers.</p>

### Difference Between Transaction Fees and Convenience Fees

It's crucial to understand the distinction between these two types of fees:

- **Transaction Fees**: These are charges applied by your **payment provider** (e.g., credit card processor) for processing a payment. They are independent of OPSCOM's internal settings. Depending on your setup, OPSCOM and end-users may not be directly aware of these fees as they are managed solely by the payment provider.
- **Convenience Fees**: These are additional charges that are **managed and applied directly through OPSCOM**. For example, your OPSCOM system can add a $5 convenience fee onto a payment. This fee amount is visible within OPSCOM and is added to the grand total before being sent to the payment provider.

It is possible for a system to utilize both Convenience Fees (managed by OPSCOM) and Transaction Fees (managed by the payment provider), but recognizing their distinct origins and management is important.

---

### Using this Feature

The **Fees Page** allows you to set up various convenience fees.

<p class="callout warning">You can only use Convenience fees if you have Bambora/Worldline as your payment provider.</p>

##### <span style="text-decoration: underline;">Fee Limitations</span>

Before configuring, understand these limitations:

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-applied-once-per-ord"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Applied Once Per Order**: Fees are applied once per fee type per order. This means if a fee is set for permits, only a single fee is applied to the order, regardless of whether it contains one permit or five permits.
- **Flat Rate Only**: Fees are currently a flat rate. There is no percentage-based fee option at this time.
- **Grand Total Sent**: Fees are not sent to the payment provider as a secondary item. Only the grand total (item price + convenience fee) is sent for processing.

</div></div></div></div></div></div></div></div>##### <span style="text-decoration: underline;">Fee Examples and Setup</span>

<span style="text-decoration: underline;">**Admin Collected Fee for Collecting Cash and Cheques (Deterrent Fee)**</span>

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-scenario%3A-the-admini"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Scenario**: The administrator wants to encourage online payments. A fee is set up as a deterrent when users pay with cash or cheque, covering the increased administrative burden.
- **Setup**: The fee would apply to all item types but only to payment types of **Cash** and **Cheque**.

</div></div></div></div></div></div></div></div><span style="text-decoration: underline;">**Admin Collected Fee for Permits**</span>

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-scenario%3A-permits-ar"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Scenario**: Permits are sent to a third party for enforcement, and that third party charges $0.50 per permit they enforce. The client wishes to pass this cost onto the user.
- **Setup**: The fee would apply to all payment types, but only to **Permits** and **Temp Permits**. The setup would specify `$0.50` as the fee amount.

</div></div></div></div></div></div></div></div><span style="text-decoration: underline;">**Admin Charges a Convenience Fee to Cover an OPSCOM Collected Transaction Fee**</span>

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-scenario%3A-there%27s-an"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Scenario**: There's an agreement with the payment provider that all permits will incur a $2.95 transaction fee paid to OPSCOM. The client still wants to receive the full $150 for a purchased permit, so they set up a convenience fee to cover this cost.
- **Setup**: The convenience fee will be charged when selecting the specific payment type that incurs the $2.95 transaction fee. For example, the setup would apply to the relevant payment provider and define the convenience fee as `$2.95`.

</div></div></div></div></div></div></div></div>**<span style="text-decoration: underline;">Admin Includes the Transaction Fee in the Price of the Item (No Fee Setup in OPSCOM)</span>**

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-scenario%3A-an-agreeme"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">- **Scenario**: An agreement exists where all permits incur a $2.95 transaction fee paid to OPSCOM. However, the client chooses to *absorb* this fee by increasing the item's price. If a permit costs $150, then $2.95 of that will be sent to OPSCOM, leaving the client with $147.05.
- **Setup**: **There is no specific setup for fees in this scenario within OPSCOM**, as the fee is already embedded in the item's base price. If you want to inform users that a transaction fee is included in the final amount, you will need to update a relevant footer message (e.g., in email templates or on the user portal) stating this.

---

</div></div></div></div></div></div></div></div>### Setting Up the Fees

You can access the Fees page to accommodate any of the scenarios above.

1. Hover over **System Configuration,** then **Payments,** and click **Fees**.
2. Click **Add Fee** and follow the diagram below.
3. Click the **Update** button to save.

##### ![3791d194-e0da-433d-bf84-b470d263c958.png](https://opscom.wiki/uploads/images/gallery/2024-10/scaled-1680-/LnM3791d194-e0da-433d-bf84-b470d263c958.png)

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk--1"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr">---

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

<div _ngcontent-ng-c1014978951="" class="chat-history-scroll-container" id="bkmrk-clarity-for-users%3A-c"><div _ngcontent-ng-c1014978951="" class="conversation-container message-actions-hover-boundary ng-star-inserted" id="bkmrk-clarity-for-users%3A-c-1"><div _ngcontent-ng-c1379262811=""><div _ngcontent-ng-c3275733674="" class="response-container ng-tns-c3275733674-70 response-container-with-gpi ng-star-inserted response-container-has-multiple-responses" jslog="173900;track:impression"><div _ngcontent-ng-c3275733674="" class="presented-response-container ng-tns-c3275733674-70"><div _ngcontent-ng-c3275733674="" class="response-container-content ng-tns-c3275733674-70"><div _ngcontent-ng-c1379262811="" class="response-content ng-tns-c3275733674-70"><div _ngcontent-ng-c2159209055="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-clarity-for-users%3A-c-2">- <span style="color: rgb(22, 145, 121);">**Clarity for Users**: Clearly communicate any convenience fees to your users before they complete a transaction. Transparency builds trust.</span>
- <span style="color: rgb(22, 145, 121);">**Strategic Application**: Use convenience fees strategically. They can deter cash payments, offset third-party costs, or cover transaction fees, but ensure they align with your overall pricing strategy.</span>
- <span style="color: rgb(22, 145, 121);">**Flat Rate Limitation**: Remember that fees are flat rate, not percentage-based. Plan your fee amounts accordingly.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Grand Total**: Be aware that OPSCOM adds the convenience fee to the item's price to form the grand total before sending it to the payment provider.</span>
- <span style="color: rgb(22, 145, 121);">**External Transaction Fees**: Distinguish between OPSCOM's convenience fees and any external transaction fees imposed by your payment gateway. Understand where each fee is applied and how it impacts your revenue.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting**: Consider how convenience fees will be reported and accounted for in your financial reconciliation processes.</span>

</div></div></div></div><div _ngcontent-ng-c3275733674="" class="response-container-footer ng-tns-c3275733674-70"></div></div></div></div></div>

# Taxes

<p class="callout info">The **Taxes** configuration page in OPSCOM allows administrators to define and manage the tax percentages applied to payments made within the system. This feature is crucial for ensuring accurate tax calculation during checkout, maintaining compliance with local tax regulations, and providing transparency to users regarding applicable taxes.</p>

### Setup &amp; Configuration

You must be a Primary Admin with the permission to **Manage System Configuration** to be able to edit the system settings.

<p class="callout warning">If you do not see the settings mentioned in this article, please contact <support@ops-com.com> to have them enabled for you. You will need, in writing, the permission of your Primary Admin.</p>

### Using this Feature

The **Taxes** page allows you to configure multiple settings for each tax type, ensuring accurate calculation and display.

1\. Hover over **System Configuration,** then **Payments,** and click **Taxes**.

##### <span style="text-decoration: underline;">Editing a Tax Type</span>

When editing an existing tax type, the following settings are available:

- **Enable**: Check this box to **enable** the tax type, making it active and applied to transactions. Uncheck to **disable** it.
- **Percentage**: Enter the numerical percentage of tax to be calculated (e.g., `13` for 13%).
- **Tax Label &amp; Translation**: This field defines how this tax will be displayed to users during the cart and checkout process (e.g., "HST," "Sales Tax," "VAT"). Multiple languages are supported for translation to ensure clarity for diverse users.
- **Apply to the following items**: Check the specific system modules or item types to which you want this tax to be applied (e.g., Permits, Violations, Lockers, Access Cards).

---

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

- <span style="color: rgb(22, 145, 121);">**Compliance**: Ensure your tax configurations (percentages, labels, and applicability) are always compliant with current local, provincial/state, and national tax regulations.</span>
- <span style="color: rgb(22, 145, 121);">**Clarity for Users**: Use clear and understandable **Tax Labels** that resonate with your users (e.g., "HST" for Canadian users where applicable).</span>
- <span style="color: rgb(22, 145, 121);">**Module Applicability**: Carefully select the **"Apply to the following items"** checkboxes to ensure taxes are only applied to the correct modules and items, preventing incorrect charges.</span>
- <span style="color: rgb(22, 145, 121);">**Testing**: After making any changes to tax settings, perform test transactions in a [Preview Space](https://opscom.wiki/books/setup-configuration-for-admins/page/create-or-refresh-a-preview-space) to verify that taxes are calculated and displayed correctly in the cart and on receipts.</span>
- <span style="color: rgb(22, 145, 121);">**Communication with Finance**: Coordinate closely with your organization's finance or accounting department to ensure OPSCOM's tax configuration aligns with their reconciliation processes.</span>

# The Invoice Template

## Editing the template

To access the template, go to the **System Config** menu and click on **Email Templates.**

The screen will refresh with a list of possible templates to edit. In our case, we want to click on the **Edit** button for **Permit Invoice** to access the template.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Tpcimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Tpcimage.png)

The screen will refresh with the complete Template form as seen below.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Wr2image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Wr2image.png)

The form contains 4 areas:  
  
At the top, **Meta Data** for this specific template.  
On the left, a list of possible **Short Codes** that can be used on this template form.  
On the right, the actual **Template**.  
At the bottom, a **Text Content field** (This field can be configured for a plain text version of the

## Meta Data

**Label -** Enter a name for this Template.  
**Type -** This field auto fills.   
**Language -** Choose the language of the template.  
**Layout -** Choose default layout.  
**Subject -** This text will appear as the Email Subject. Note that the use of short code is permitted in this field. In this case, we are calling up the account name for the company being invoiced.

## Short Code List  


<span class="legacy-color-text-default">The template allows the use of special tokens, or short codes, to pull information from the database to appear on the invoice when sent.  
These include:</span>

<span class="legacy-color-text-default">**<span class="badge click-copy">\[</span><span class="badge click-copy">invoice account="number"\]</span>** The account number for the company.  
**<span class="badge click-copy">\[invoice account="name"\]</span>** The account name for the company.  
**<span class="badge click-copy">\[invoice account="fulladdress"\]</span>**<span data-colorid="rterxjuhci"> The full address for the company.</span>  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice account="invoice\_comments"\]</span>**<span class="legacy-color-text-default"> The invoice comment value that is editable for companies only. Any line breaks will be preserved.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="invoiceno"\]</span>** Invoice Number.  
**<span class="badge click-copy legacy-color-text-default">\[invoice show="duedate"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">Invoice due date.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="billdate"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">Invoice bill date.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="subtotal"\]</span><span class="legacy-color-text-default"> </span>**<span class="legacy-color-text-default">Subtotal of all items before tax.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="taxtotal"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">Total amount of tax.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="amounttotal"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">The total sum amount for all outstanding permits for this invoice.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="counttotal"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">The total number of permits for the selected sales window.  
</span>**<span class="badge click-copy legacy-color-text-default">\[invoice show="details"\]</span>**<span class="legacy-color-text-default"> </span><span class="legacy-color-text-default">The list of permits, cost and who has the permit.  
  
</span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/Yosimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/Yosimage.png)

<span class="legacy-color-text-default">  
</span>

<span class="legacy-color-text-default">These tokens can be placed anywhere on the template and will pull data from the system, similar to a mail merge functionality.  
  
For example, in the **Bill To:** area, the system will retrieve the **Full Address of the Company** as well as the **Company Account Number** using these two short code tokens:  
**<span class="badge click-copy">\[invoice account="fulladdress"\]</span>**<span data-colorid="vue4k7mrbj"> The full address for the company.  
**<span class="badge click-copy">\[</span><span class="badge click-copy">invoice account="number"\]</span>** The account number for the company.</span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/54gimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/54gimage.png)

<span class="legacy-color-text-default"><span data-colorid="bjj6i4g3nf">  
</span></span>

## <span class="legacy-color-text-default"><span data-colorid="y8mzp1helo">The Template</span></span>

<span class="legacy-color-text-default"><span data-colorid="sq21corqza">There are a number of areas on the template that can be edited by the admin. To add branding to the template there are two areas that will be of concern.  
  
**The Company Logo Field:**  
This is where you would place your company logo. Using a .JPEG or .PNG file format is recommended. </span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/L35image.png)](https://opscom.wiki/uploads/images/gallery/2024-06/L35image.png)

<span class="legacy-color-text-default"><span data-colorid="hg235a233q">**Your Company Address:**  
Enter your company address here.</span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/eqBimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/eqBimage.png)

<span class="legacy-color-text-default"><span data-colorid="gzfgxacea5">**Invoice Identification:**  
</span></span><span data-colorid="jt8341smay">In this section use short code to pull in the **Invoice Number, Billing Date, and Due Date**.</span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/uoVimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/uoVimage.png)

**<span class="legacy-color-text-default"><span data-colorid="jem9hq3l03">Invoice Details:</span></span>**

<span class="legacy-color-text-default"><span data-colorid="sx1cc226ly">The short code **<span class="badge click-copy legacy-color-text-default">\[invoice show="details"\] </span>**<span class="badge click-copy legacy-color-text-default">pulls in the list of permits that will appear on the Invoice. (See a sample of the Invoice below)  
  
These include:</span></span></span>

<span class="legacy-color-text-default"><span data-colorid="zbxyeezt3b"><span class="badge click-copy legacy-color-text-default">Parker's Name  
Item type being Paid for (Permit, Access card, etc.)  
Item number (Permit Number)  
Sales Window  
Lot Name  
Quantity  
Cost  
</span></span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/19Nimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/19Nimage.png)

<span class="legacy-color-text-default"><span data-colorid="zbxyeezt3b"><span class="badge click-copy legacy-color-text-default">  
</span></span></span>

<span class="legacy-color-text-default"><span data-colorid="mxea081e6o">**Payment Information** (Billing Cost)**:** </span></span>In this section use short code to pull in the billing information such as **Subtotal, Calculated Taxes, and Total Billing Amount.

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/4xEimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/4xEimage.png)

<span class="legacy-color-text-default"><span data-colorid="vu5ogl5uow">You may also wish to add comments to the invoice. Comments can be added in the company configuration. </span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/SInimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/SInimage.png)

<span class="legacy-color-text-default"><span data-colorid="bpiaf01uli">**The Email with PDF attached:**  
Here is a sample of what the resulting email would look like. There is also a .PDF version of this invoice attached to the email.  
  
</span></span>

[![image.png](https://opscom.wiki/uploads/images/gallery/2024-06/scaled-1680-/UANimage.png)](https://opscom.wiki/uploads/images/gallery/2024-06/UANimage.png)

<span class="legacy-color-text-default"><span data-colorid="bpiaf01uli">  
</span></span>

# Setup payments with Flex Dollars

<p class="callout info">This article describes the Flex Dollar and Payroll Deduction feature, a specialized payment method for handling partial payments with credits. This feature allows your users to apply a pre-defined amount of **flex dollars** towards a permit purchase, with the system automatically notifying administrators of the remaining balance to be processed via payroll. </p>

#### OPSCOM Support Configuration<span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#bf2600">The </span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#bf2600">Flex Dollar Payment</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#bf2600"> feature is a </span>*<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#bf2600">custom development,</span>*<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#bf2600"> tailored specifically for one client, Trent University. It is not intended to be useful to, or available to all clients. Its availability is controlled by specific configurations set up by an OPSCOM Support team member.</span>

This feature requires configuration by an administration of your system, and must also be enabled by an OPSCOM support team member before it can be used. The setup involves defining the selectable flex dollar amounts, setting the notification email, and assigning the payment type to the appropriate users.

#### This feature is enabled by a system-level setting that is typically configured by OPSCOM support upon request. Once enabled, you may proceed with the steps below.

#### Configuration and Functionality<span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

1. To enable flex dollars, hover over **System Configuration**, and click **System Settings**.
2. Click **Permits**.
3. Enable the checkbox beside **Enable Flex Dollars**.

##### <u data-renderer-mark="true">Configure Email Notifications</u><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

An email address must be configured to receive a notification internally and each time this payment method is used (and the details of the transaction for accounting).

1. Hover over **System Configuration, Payments** and click **Manage** **Flex Dollars**
2. In the **Flex Dollars Alert Email** text box, enter an email address you will be monitoring.

<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f">This email address must be monitored for any changes to be made to student flex dollar balances.</span>

##### <u data-renderer-mark="true">Define Flex Dollar Amount</u><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

Create the specific flex dollar values that users can select during checkout.

1. Hover over **System Configuration, Payments,** and click **Manage** **Flex Dollars.**
2. Click the **Add New** button.
3. Enter a **Label**. This is the text the user will see in the drop-down menu (e.g., "Apply $100 of Flex Credit").
4. Enter the corresponding numeric **Value** (e.g., `100.00`).
5. Click **Save**.
6. Repeat this process for all the pre-determined flex dollar amounts your organization offers.

##### <u data-renderer-mark="true">Assign Payment Method to User Types</u><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

Finally, this payment method must be enabled for the specific user types who are permitted to use it.

1. Hover over **System Configuration**, **Users**, and and click **User Types**.
2. Select the user type you wish to grant access to (e.g., Staff).
3. In the user type settings, assign the **Flex Dollars/Payroll Deduction** payment option.
4. For detailed instructions, please refer to the [<u data-renderer-mark="true">User Types Administration wiki article</u>](https://opscom.wiki/books/setup-configuration-for-admins/page/user-types "https://opscom.wiki/books/adminstrators-setup-configuration/page/user-types").

### Using this Feature<span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

Once configured, the feature provides a streamlined workflow for users and a clear notification process for administrators.

##### <u data-renderer-mark="true">User Purchase Workflow</u><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

1. An eligible user adds a standard term permit to their shopping cart.
2. On the checkout page, they select **Flex Dollars/Payroll Deduction** as the payment method.
3. A new drop-down menu appears, populated with the flex dollar **Labels** you configured.
4. The user selects an amount and completes the transaction. Their permit is considered valid and is issued immediately.

##### <u data-renderer-mark="true">Administrator Workflow (Post-Purchase)</u><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span>

1. Upon successful purchase, an email is automatically sent to the address configured in ***"Flex Dollar Alert Email"*** field.
2. This notification contains the key information needed for manual processing:
    
    
    - User's Name and Contact Information
    - Permit Details
    - Flex Dollar Amount Applied
    - Remaining Balance Due
3. Your administrative team (e.g., Payroll or Parking department) uses this information to confirm users flex dollar balances the remaining balance via your organization's internal payroll system.
4. For auditing purposes, a note detailing the flex dollar amount is also automatically added to the users transaction payment record.

<p class="callout warning"><span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f">The payroll deduction component is </span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f">not an automated process</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f"> and </span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f">neither is the updating of Flex Dollar balance</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#ff991f">. The system's function is to calculate and report the remaining payroll deduction balance to administrators. </span></p>

# <span style="color: rgb(22, 145, 121);"><span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">Best Practices &amp; Considerations</span><span class="heading-anchor-wrapper" role="presentation"><button aria-hidden="true" class="cc-vhh4ux" data-testid="anchor-button" type="button"><span aria-label="Copy" class="_1e0c1o8l _vchhusvi _1o9zidpf _vwz4kb7n _y4ti1igz _bozg1mb9 _12va18uv _jcxd1r8n" role="img"><svg class="_1reo15vq _18m915vq _syaz1r31 _lcxvglyw _s7n4yfq0 _vc881r31 _1bsbpxbi _4t3ipxbi" fill="none" role="presentation" viewbox="0 0 16 16"><path clip-rule="evenodd" d="M8.22 2.22a3.932 3.932 0 1 1 5.56 5.56l-2.25 2.25-1.06-1.06 2.25-2.25a2.432 2.432 0 0 0-3.44-3.44L7.03 5.53 5.97 4.47zm3.06 3.56-5.5 5.5-1.06-1.06 5.5-5.5zM2.22 8.22l2.25-2.25 1.06 1.06-2.25 2.25a2.432 2.432 0 0 0 3.44 3.44l2.25-2.25 1.06 1.06-2.25 2.25a3.932 3.932 0 1 1-5.56-5.56" fill="currentcolor" fill-rule="evenodd"></path></svg></span></button></span></span>

- <span style="color: rgb(22, 145, 121);"><span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">This payment option will </span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">only appear to eligible users when their cart contains only standard permits</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">. It will not be available if other items, such as violation payments or locker rentals, are also in the cart.</span></span>
- <span style="color: rgb(22, 145, 121);">**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">Use clear and descriptive labels</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e"> for the flex dollar amounts (e.g., "Use $75 Payroll Credit"). This transparency is key to reducing user confusion and support requests during the checkout process.</span></span>
- <span style="color: rgb(22, 145, 121);">**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">Ensure the staff who manage payroll are aware of this workflow</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e"> and understand how to act on the email notifications. Clear internal communication is critical to the success of this feature.</span></span>
- <span style="color: rgb(22, 145, 121);">**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">External Verification &amp; Reconciliation:</span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e"> It is critical to understand that OPSCOM does not verify real-time flex dollar balances with any external system. Administrators are solely responsible for independently verifying the spent flex dollar amounts with their HR/payroll department and managing any discrepancies or adjustments outside of the OPSCOM system. </span></span>  
    <span style="color: rgb(22, 145, 121);">**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">Note: </span>**<span class="fabric-text-color-mark" data-renderer-mark="true" data-text-custom-color="#36b37e">this type of payment is treated as a full, successful payment. The system does not have split-payment logic or backend validation of flex balances beyond recording the user's chosen amount.</span></span>

# Stripe Payment Provider Setup

<div _ngcontent-ng-c2426258411="" class="ng-tns-c2426258411-28" id="bkmrk-"><section class="processing-state_container is-gpi-avatar ng-tns-c2426258411-28 ng-trigger ng-trigger-processingStateShowHide ng-star-inserted is-done-processing" id="bkmrk--1"><div _ngcontent-ng-c2426258411="" aria-hidden="true" class="processing-state_details is-gpi-avatar ng-trigger ng-trigger-menuExpansion ng-tns-c2426258411-28 ng-star-inserted" id="bkmrk--2"></div></section></div><div _ngcontent-ng-c2362448710="" class="response-content ng-tns-c3088276128-27" id="bkmrk--3"></div><p class="callout info">This feature shows how to integrate with Stripe to process credit card payments directly within the system. Its primary purpose is to provide a secure and seamless checkout experience for users while simplifying financial reconciliation for operations. This article is intended for **OPSCOM administrators** responsible for financial setup.</p>

---

## Setup and Configuration

### Admin Portal

To begin the integration, an administrator must setup a payment type in OPSCOM, with will be linked to their Stripe account. This is handled through the central administration portal where you will input your unique credentials.

- Hover over **System Configuration &gt; Payments**, then click **Setup Payment Types**.
- Click **Add Type**.
- Click the **Payment Provider** drop-down menu and choose **Stripe.js** from the available options.

Once the provider is selected, you can **name the payment type**, **select applicable user types**, and then **go to the settings tab*.***

Now, you have to get the API keys for your Stripe account, and setup webhooks, which can be found on the stripe dashboard, which you should be logged into, from a previous step. Your **Publishable Key**, and **Secret Key**, can be found and copied here. You can click on these values to copy them, and paste them into the payment type settings in OPSCOM.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/VOiimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/VOiimage.png)

<p class="callout warning">You must provide your unique identification keys. Enter your Stripe public key into the **Publishable Key** field and your Stripe secret key into the **Secret Key** field. **<u>Only enter the Testing Credentials until you are ready for your users to have access to this.</u>**</p>

<span style="text-decoration: underline;">Take this time to ensure that the ***Currency*** setting is correct</span>, in the payment type settings (the default is US dollars). The next steps will be about populating the **Webhook ID** and **Webhook Secret** fields, in OPSCOM, with the correct information from your Stripe dashboard.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/gCTimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/gCTimage.png)

---

### Third-Party Webhook Configuration

Webhooks are essential for Stripe to notify OPSCOM regarding payment successes or refund completions.

<p class="callout warning">Without these Webhooks, the system **WILL NOT** communicate any transaction information to OPSCOM.</p>

<div class="my-4 rounded-lg overflow-x-auto overflow-y-hidden border border-gray-500/20 [&_thead_tr:first-child_th:first-child]:border-t-0 [&_thead_tr:first-child_th:first-child]:border-l-0 [&_thead_tr:first-child_th:last-child]:border-t-0 [&_thead_tr:first-child_th:last-child]:border-r-0 [&_tbody_tr:last-child_td:first-child]:border-b-0 [&_tbody_tr:last-child_td:first-child]:border-l-0 [&_tbody_tr:last-child_td:last-child]:border-b-0 [&_tbody_tr:last-child_td:last-child]:border-r-0 [&_thead_tr:first-child_th]:border-t-0 [&_tbody_tr:last-child_td]:border-b-0 [&_th:first-child]:border-l-0 [&_td:first-child]:border-l-0 [&_th:last-child]:border-r-0 [&_td:last-child]:border-r-0" id="bkmrk-sub-section-what-it-"><table class="min-w-full border-separate border-spacing-0"><thead><tr><th class="bg-gray-500/20 px-3 py-2 text-left font-medium leading-snug border border-gray-500/20">Sub-section</th><th class="bg-gray-500/20 px-3 py-2 text-left font-medium leading-snug border border-gray-500/20">What it covers</th></tr></thead><tbody><tr><td class="px-3 py-2 leading-snug border border-gray-500/20">**Register Your Endpoint**</td><td class="px-3 py-2 leading-snug border border-gray-500/20">Step-by-step Stripe Dashboard instructions to create an event destination, select event types, and enter the OPSCOM webhook URL</td></tr><tr><td class="px-3 py-2 leading-snug border border-gray-500/20">**Retrieve Your Signing Secret**</td><td class="px-3 py-2 leading-snug border border-gray-500/20">How to reveal and copy the `whsec_` secret, and destination ID into OPSCOM</td></tr><tr><td class="px-3 py-2 leading-snug border border-gray-500/20">**Test Your Endpoint**</td><td class="px-3 py-2 leading-snug border border-gray-500/20">Stripe CLI commands to forward live test events locally before going live</td></tr><tr><td class="px-3 py-2 leading-snug border border-gray-500/20">**Secure Your Endpoint**</td><td class="px-3 py-2 leading-snug border border-gray-500/20">Signature verification explanation and IP allowlisting recommendation</td></tr><tr><td class="px-3 py-2 leading-snug border border-gray-500/20">**Manage Event Delivery**</td><td class="px-3 py-2 leading-snug border border-gray-500/20">Delivered/Pending/Failed status descriptions and how to manually resend events</td></tr></tbody></table>

</div>### Register Your Endpoint

To begin receiving notifications, you must define where Stripe should send transaction data. In your Stripe Dashboard, click on **Developers** (bottom left) and select **Webhooks**.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/iIBimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/iIBimage.png)

Click the **Add Destination** button to open the configuration window.

You must select the specific event types the system needs to process. For a standard setup, ensure you select **payment\_intent.succeeded** for successful payments, **payment\_intent.payment\_failed** for failed payments, and **payment\_intent.canceled** for canceled payments. Now click Continue.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/5dlimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/5dlimage.png)

 Select **Webhook endpoint**, and click continue again.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/eGjimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/eGjimage.png)

Give the webhook a descriptive name, and in the **Endpoint URL** field, enter the specific URL provided by OPSCOM, in this format: `https://[CLIENTID].ops-com.com/api/system/payments/stripe/callback`

### Retrieve Your Signing Secret

Once the endpoint is created, Stripe generates a unique security key to verify that the data sent to your server is authentic. On the summary page for your newly created webhook, locate the **Signing secret** section.

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/BsHimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/BsHimage.png)

Click **Reveal** to display the string, which typically begins with the prefix `whsec_`.

Copy (***highlighted in a <span style="color: rgb(22, 145, 121);">green</span> box in the picture above!***) this entire string and navigate back to your OPSCOM **Payment Gateway** settings. Paste the secret into the **Webhook Secret** field. This handshake ensures that OPSCOM only processes legitimate requests from Stripe and ignores any unauthorized attempts to alter transaction data.

Once the endpoint is saved, you'll see the **<span style="color: rgb(0, 0, 0); background-color: rgb(191, 237, 210);">Signing secret</span>**, and <span style="background-color: rgb(191, 237, 210); color: rgb(0, 0, 0);">**Destination ID**</span> provided by ***<span style="background-color: rgb(191, 237, 210); color: rgb(0, 0, 0);">Stripe</span>***. Return to your *<span style="text-decoration: underline;"><span style="background-color: rgb(248, 202, 198); color: rgb(186, 55, 42); text-decoration: underline;">**OPSCOM**</span></span>*<span style="color: rgb(186, 55, 42);"> </span>configuration and paste the <span style="color: rgb(0, 0, 0); background-color: rgb(191, 237, 210);">**Signing secret**</span> into the <span style="text-decoration: underline;"><span style="background-color: rgb(248, 202, 198); color: rgb(186, 55, 42); text-decoration: underline;">**Webhook Secret**</span></span> field, and the <span style="background-color: rgb(251, 238, 184);"><span style="color: rgb(0, 0, 0); background-color: rgb(191, 237, 210);">**Destination ID**</span><span style="background-color: rgb(255, 255, 255);"> </span></span>into the <span style="text-decoration: underline;"><span style="color: rgb(186, 55, 42); text-decoration: underline;">**<span style="background-color: rgb(248, 202, 198);">Webhook ID</span>**</span></span> field to ensure all incoming data is securely verified.

<p class="callout warning">Ensure that your **Webhook Secret** is correctly matched between Stripe and OPSCOM to prevent "Pending" status errors on completed payments.</p>

[![image.png](https://opscom.wiki/uploads/images/gallery/2026-04/scaled-1680-/E3jimage.png)](https://opscom.wiki/uploads/images/gallery/2026-04/E3jimage.png)

---

## User Experience and Handheld Use

### Web Portal Transactions

Users will interact with the Stripe interface during their standard checkout process. When they reach the final stage of a transaction, they simply click the **Pay with Credit Card** button to open the secure payment form. After they enter the credit card details into the form, they click the **Submit Payment** button to complete the purchase.

### Handheld App — *OPSCOM Parking Enforcement*

For administrators or staff using handheld units in the field, the process is optimized for touch interaction. Tap **Checkout** to open the payment summary within the app. From there, tap **Select Payment Method** and choose **Stripe**. To prevent accidental charges, the final step requires you to tap and hold the **Process Payment** button to finalize the transaction.

## Managing Transactions and Reports

Administrators can review all processed payments and manage financial returns through the standard reporting interfaces. Hover over **Financial Management** and click **Transaction Reports** then **Recent Payments** to view a live list of activity.

Within this report, the **Status** column displays the current state of each payment, while the **Payment Date** indicates exactly when the transaction occurred. If you need more detail, click the **View Details** icon next to a specific transaction to see the full Stripe receipt.

If a correction is needed, click the **Refund Payment** button to initiate a return of funds. You will then click the **Confirm Refund** drop-down menu and choose **Full Refund** to finalize the reversal.

<p class="callout info">You can quickly find a specific transaction by using the search bar to enter a user's name or a specific receipt order ID/Confirm Code.</p>

---

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

- <span style="color: rgb(22, 145, 121);">**Deployment Testing** Organizations should always keep **Live Mode** disabled during the initial deployment until all testing is verified with test credit card information. It is highly recommended to process a single, small test transaction in **Live Mode** using a real card before making the payment option available to the general public.</span>
- <span style="color: rgb(22, 145, 121);">**Security Requirements** Maintaining the security of your financial environment is critical. You should never share your **Stripe Secret Key** or **Webhook Secret** with anyone or store it in plain text outside of the secure administration configuration screens.</span>
- <span style="color: rgb(22, 145, 121);">**Change the signing secret periodically**, and only subscribe to required event types.</span>

<div _ngcontent-ng-c2362448710="" class="response-content ng-tns-c3088276128-27" id="bkmrk--16"><div _ngcontent-ng-c1098760420="" class="container"><div _ngcontent-ng-c1840272799="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--17" inline-copy-host=""></div></div></div>

# Dispatch Configuration

# Managing Dispatch Categories

<p class="callout info">**Dispatch Categories** allow administrators to define and classify the types of dispatchable events or incidents (e.g., "Parking Incident," "Security Alert," "Maintenance Request"). This feature is crucial for organizing dispatch logs, streamlining response protocols, and enabling accurate reporting on the nature of dispatched activities.</p>

### Using this Feature

The **Dispatch Categories Administration** page provides a straightforward interface to manage your various dispatch categories.

Click **System Administration, Dispatch,** and click **Manage Dispatch Categories.**

##### Adding Dispatch Categories

1. Click the **Add Dispatch Category** button.
2. Type in the **Name** and click **Save Changes.**

##### Editing Dispatch Categories

1. Choose the Edit button next to the category you wish to edit.
2. Make the changes and click **Save Changes.**

<p class="callout warning">**System-Wide Impact of Edits** - When you make changes to a dispatch category that is currently in use by records in the system, these updates will be reflected across the **entire system** for all associated dispatch logs and related data. </p>

---

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

- <span style="color: rgb(22, 145, 121);">**Comprehensive Classification**: Define categories that accurately represent all types of dispatchable events your organization handles.</span>
- <span style="color: rgb(22, 145, 121);">**Clear and Concise Names**: Use descriptive and unambiguous names for your categories to facilitate quick understanding and accurate logging by dispatch personnel.</span>
- <span style="color: rgb(22, 145, 121);">**Impact on Reporting**: Dispatch categories are fundamental for generating reports on types of incidents, call volumes, and resource allocation. Accurate categorization ensures meaningful data analysis.</span>
- <span style="color: rgb(22, 145, 121);">**Training**: Ensure that dispatch personnel are well-trained on selecting the correct categories for various events to maintain data quality and reporting consistency.</span>
- <span style="color: rgb(22, 145, 121);">**Regular Review**: Periodically review your dispatch categories to ensure they remain relevant to your current operations and incident types.</span>

# Managing Dispatch Sources

<p class="callout info">**Dispatch Sources** in OPSCOM allow administrators to define and categorize the origins of dispatch calls or events (e.g., "Phone Call," "Email," "Officer Initiated"). This feature enables better tracking of incident intake, facilitates efficient routing to relevant categories, and enhances reporting on the origins of dispatch activities.</p>

### Using this Feature

The **Dispatch Category Link Administration** page allows you to define where your dispatch calls originate from and link them to relevant dispatch categories.

1\. Click **System Administration,** then **Dispatch,** and click **Manage Dispatch Sources.**

##### <span style="text-decoration: underline;">Adding a Dispatch Source</span>

1. Click the **Add Dispatch Source** button.
2. Type in the **Name** (e.g., "Walk-In," "Radio," "Internal Alert").
3. Select the **categories** that should be linked to this source from the connected dropdown menu. 
    - Note: If you want to select all categories, you can left-click on the first category and use CTRL Click to select them all.
4. Click **Save Changes**

##### <span style="text-decoration: underline;">Editing a Dispatch Source</span>

1. Choose the Edit button next to the source you wish to edit.
2. Make the changes and click **Save Changes.**

---

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

- <span style="color: rgb(22, 145, 121);">**Comprehensive Definitions**: Define all common methods by which dispatch calls or alerts are received in your organization (e.g., "Emergency Line," "Non-Emergency Phone," "Email," "Mobile App Submission").</span>
- <span style="color: rgb(22, 145, 121);">**Logical Category Linking**: Link each source to all relevant dispatch categories it might generate (e.g., "Phone Call" might link to "Parking Incident," "Security Alert," "Maintenance Request").</span>
- <span style="color: rgb(22, 145, 121);">**Consistency**: Ensure consistent use of defined dispatch sources by all personnel involved in dispatch activities to maintain accurate reporting.</span>
- <span style="color: rgb(22, 145, 121);">**Reporting Value**: Properly categorized dispatch sources are invaluable for generating reports on call volume, types of incidents by source, and identifying trends in how incidents are reported.</span>
- <span style="color: rgb(22, 145, 121);">**Review Regularly**: Periodically review your list of dispatch sources to ensure they remain current and relevant to your operational needs.</span>

# Changing the Organization Name Displayed to Parkers

<p class="callout info">This article describes how to change your organization's display name. This global setting updates the name that appears on the public-facing website and on the screen of all connected handheld units. It also controls the name that appears at the top of violation printouts.</p>

### Using this Feature

This is a core system setting and does not require any special configuration to access or modify.

1. Go to **System Configuration**, and click **System Settings**.
2. Click **General System Settings** from the list.
3. Locate the following two fields at the top of the page:
    
    
    - **Organization Name: Website** (*This appears on your website)*
    - **Organization name: Handheld** *(This appears on your handhelds, and violation notices printed with a handheld)*
4. Enter the desired display name into each field.
5. Scroll to the bottom of the page and click the **Save Changes** button.

---

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

- <span style="color: rgb(22, 145, 121);">The **Organization name: Handheld** setting is a global configuration. **The name you enter here will be displayed on all handheld units** connected to your system. This setting cannot be changed on the indi<span class="citation-56">vidual handheld devices themselves.</span></span><div class="confluence-information-macro-body"><span style="color: rgb(22, 145, 121);"><span class="citation-56 citation-end-56"><sup class="superscript" data-turn-source-index="1"></sup></span> </span><div _ngcontent-ng-c492230922="" class="source-inline-chip-container ng-star-inserted"><span style="color: rgb(22, 145, 121);"></span></div><span style="color: rgb(22, 145, 121);"></span></div><span style="color: rgb(22, 145, 121);"><span class="citation-55 citation-end-55"><sup class="superscript" data-turn-source-index="2"></sup></span> </span><div _ngcontent-ng-c492230922="" class="source-inline-chip-container ng-star-inserted"><span style="color: rgb(22, 145, 121);"></span></div><span style="color: rgb(22, 145, 121);"></span>
- <span style="color: rgb(22, 145, 121);">The **Organization Name: Website** is a public-facing setting. **Ensure the name is spelled correctly and reflects your official branding** before saving, as it will be visible to all end-users on your portal.</span>
- <span style="color: rgb(22, 145, 121);">**For brand consistency, it is recommended to keep the Website and Handheld names the same** unless your organization has a specific reason for displaying them differently.</span>