# Installation

## SmartPad Installation Guide

This document will guide you through the basic setup of SmartPad, including inventory integration and database initialization.

***

### 🧳 Inventory Setup

#### 📦 QB Inventory, QS Inventory, LJ Inventory, PS Inventory, Core Inventory

If you are using **these inventories** you must add the following items to your `qb-core/shared/items.lua` file: or wherever the item list is.

{% tabs %}
{% tab title="QB Inventory, QS Inventory, LJ Inventory, PS Inventory, Core Inventory" %}

<pre class="language-lua"><code class="lang-lua">smartpad = {
    name = 'smartpad',
    label = 'SmartPad',
    weight = 2000,
    type = 'item',
    image = 'tablet.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'SmartPad'
},

powerbank = {
    name = 'powerbank',
    label = 'Powerbank',
    weight = 200,
    type = 'item',
    image = 'powerbank.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Capacity: 10000mAh | Output: 5V/2.1A | USB Type-C.'
},

<strong>weaponlicense = { 
</strong>    name = 'weaponlicense', 
    label = 'Weapon License', 
    weight = 0, 
    type = 'item', 
    image = 'weapon_license.png', 
    unique = true, 
    useable = true, 
    shouldClose = true, 
    description = 'Weapon License' 
},

</code></pre>

{% endtab %}

{% tab title="Ox Inventory" %}

```lua
['smartpad'] = {
    label = 'SmartPad',
    weight = 2000,
    stack = false,
    consume = 0,
    unique = true,
    close = true,
    description = 'SmartPad',
    server = {
        export = 'kibra-smartpad.useTablet'
    },
    image = 'tablet.png'
},
    
['powerbank'] = {
    label = 'Powerbank',
    weight = 200,
    stack = false,
    close = true,
    description = 'Capacity: 10000mAh | Output: 5V/2.1A | USB Type-C.',
    server = {
        export = 'kibra-smartpad.usePowerbank'
    },
    image = 'powerbank.png'
},

['wlicense'] = {
    label = 'Weapon License',
    weight = 0,
    stack = false,
    close = true,
    description = 'Weapon License',
    server = {
        export = 'kibra-smartpad.useWeaponLicense'
    },
    unique = true,
    image = 'weapon_license.png',
},
```

{% endtab %}
{% endtabs %}

> ⚠️ Don't forget to assign the appropriate `client.export` functions according to your implementation.

***

## SQL File

Normally, SQL is installed automatically, but if it is not installed, you can run this SQL directly.

```sql
CREATE DATABASE IF NOT EXISTS kibra_smartpad CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE kibra_smartpad;
CREATE TABLE IF NOT EXISTS kibra_smartpad_tablets ( id INT NOT NULL AUTO_INCREMENT, serialnumber VARCHAR(64) NOT NULL, owner VARCHAR(255) DEFAULT NULL, data JSON NOT NULL DEFAULT (JSON_ARRAY()), notifications JSON NOT NULL DEFAULT (JSON_ARRAY()), gallery JSON NOT NULL DEFAULT (JSON_ARRAY()), albums JSON NOT NULL DEFAULT (JSON_ARRAY()), email VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_tablets_serial (serialnumber), KEY idx_tablets_owner (owner) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_allergies ( id INT NOT NULL AUTO_INCREMENT, citizen_id VARCHAR(64) DEFAULT NULL, drug_name VARCHAR(100) DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_allergies_citizen (citizen_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_crime_records ( id INT NOT NULL AUTO_INCREMENT, offenders JSON NOT NULL DEFAULT (JSON_ARRAY()), crime_id VARCHAR(64) NOT NULL, date DATETIME NOT NULL, officer_name VARCHAR(100) NOT NULL, officer_id VARCHAR(50) DEFAULT NULL, articles JSON NOT NULL DEFAULT (JSON_ARRAY()), description TEXT DEFAULT NULL, location VARCHAR(255) DEFAULT NULL, fine_amount INT NOT NULL DEFAULT 0, jail_time INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, media JSON NOT NULL DEFAULT (JSON_ARRAY()), witnesses JSON NOT NULL DEFAULT (JSON_ARRAY()), vehicle_data JSON NOT NULL DEFAULT (JSON_ARRAY()), status TINYINT NOT NULL DEFAULT 0, approved_by VARCHAR(255) DEFAULT NULL, reason TEXT DEFAULT NULL, casedate DATETIME NOT NULL, lawyer VARCHAR(255) DEFAULT NULL, timeline JSON NOT NULL DEFAULT (JSON_ARRAY()), PRIMARY KEY (id), KEY idx_crime_records_crime_id (crime_id), KEY idx_crime_records_officer (officer_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_newsapplications ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT NOT NULL, role VARCHAR(255) NOT NULL, experience TEXT NOT NULL, motivation TEXT NOT NULL, cid VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_newsapps_cid (cid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_news ( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(255) NOT NULL, data JSON NOT NULL DEFAULT (JSON_ARRAY()), author VARCHAR(255) NOT NULL, media JSON NOT NULL DEFAULT (JSON_ARRAY()), category VARCHAR(255) NOT NULL, tags JSON NOT NULL DEFAULT (JSON_ARRAY()), status TINYINT NOT NULL DEFAULT 0, published_at DATETIME DEFAULT NULL, comments JSON NOT NULL DEFAULT (JSON_ARRAY()), likes INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_news_code (code), KEY idx_news_category (category), KEY idx_news_status (status), KEY idx_news_published_at (published_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_court_hearings ( id INT NOT NULL AUTO_INCREMENT, case_id VARCHAR(50) NOT NULL, date DATE NOT NULL, time TIME NOT NULL, assigned_judge VARCHAR(100) NOT NULL, courtroom JSON NOT NULL DEFAULT (JSON_ARRAY()), notes TEXT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_hearings_case (case_id), KEY idx_hearings_datetime (date,time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_doctor_notes ( id INT NOT NULL AUTO_INCREMENT, citizen_id VARCHAR(64) DEFAULT NULL, doctor_name VARCHAR(100) DEFAULT NULL, note TEXT DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_doctor_notes_citizen (citizen_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_invoices ( id INT NOT NULL AUTO_INCREMENT, ikey VARCHAR(255) NOT NULL, owner VARCHAR(255) NOT NULL, date DATETIME NOT NULL, duedate DATETIME NOT NULL, content JSON NOT NULL DEFAULT (JSON_ARRAY()), totalamount DECIMAL(12,2) NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 0, notes LONGTEXT NOT NULL, job VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_invoices_ikey (ikey), KEY idx_invoices_owner (owner), KEY idx_invoices_status (status), KEY idx_invoices_dates (date, duedate) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_mails ( id INT NOT NULL AUTO_INCREMENT, receiver VARCHAR(255) NOT NULL, from_name VARCHAR(255) NOT NULL, data JSON NOT NULL DEFAULT (JSON_ARRAY()), from VARCHAR(255) NOT NULL, type TINYINT NOT NULL DEFAULT 0, date DATETIME NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_mails_receiver (receiver), KEY idx_mails_from (from), KEY idx_mails_date (date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_mdt_announcements ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL, message TEXT NOT NULL, announcement_type ENUM('General','Emergency','Warning','Info') DEFAULT 'General', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, created_by VARCHAR(100) NOT NULL, PRIMARY KEY (id), KEY idx_mdt_ann_created_by (created_by), KEY idx_mdt_ann_type (announcement_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_mdt_history ( id INT NOT NULL AUTO_INCREMENT, created_by VARCHAR(255) NOT NULL, transaction TEXT NOT NULL, casenumber VARCHAR(255) NOT NULL, date DATETIME NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_mdt_hist_case (casenumber), KEY idx_mdt_hist_date (date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_treatments ( id INT NOT NULL AUTO_INCREMENT, patient_id VARCHAR(64) DEFAULT NULL, drug VARCHAR(100) DEFAULT NULL, responsible VARCHAR(100) DEFAULT NULL, date DATETIME DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_treatments_patient (patient_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_vehicle_crimes ( id INT NOT NULL AUTO_INCREMENT, case_id VARCHAR(255) NOT NULL, cars JSON NOT NULL DEFAULT (JSON_ARRAY()), dname VARCHAR(255) NOT NULL, fine_amount DECIMAL(12,2) NOT NULL DEFAULT 0, crimes JSON NOT NULL DEFAULT (JSON_ARRAY()), date DATETIME NOT NULL, location VARCHAR(255) DEFAULT NULL, officer_id VARCHAR(50) DEFAULT NULL, officer_name VARCHAR(100) DEFAULT NULL, notes TEXT DEFAULT NULL, media JSON DEFAULT NULL, vehicle_data JSON NOT NULL DEFAULT (JSON_ARRAY()), created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_vehicle_crimes_case (case_id), KEY idx_vehicle_crimes_date (date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_wanted_people ( id INT NOT NULL AUTO_INCREMENT, cid VARCHAR(255) NOT NULL, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, crime_description TEXT NOT NULL, wanted_since DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, last_seen_location VARCHAR(255) DEFAULT NULL, danger_level ENUM('Low','Medium','High') DEFAULT 'Low', added_by VARCHAR(100) NOT NULL, medias JSON NOT NULL DEFAULT (JSON_ARRAY()), created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_wanted_people_cid (cid), KEY idx_wanted_people_level (danger_level) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_wanted_vehicles ( id INT NOT NULL AUTO_INCREMENT, plate VARCHAR(10) NOT NULL, model VARCHAR(100) NOT NULL, modellabel VARCHAR(255) NOT NULL, color VARCHAR(50) DEFAULT NULL, last_seen_location VARCHAR(255) DEFAULT NULL, wanted_since DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, danger_level ENUM('Low','Medium','High') DEFAULT 'Low', reason TEXT NOT NULL, added_by VARCHAR(100) NOT NULL, medias JSON NOT NULL DEFAULT (JSON_ARRAY()), status TINYINT NOT NULL DEFAULT 1, approved_by VARCHAR(255) DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_wanted_vehicles_plate (plate), KEY idx_wanted_vehicles_status (status), KEY idx_wanted_vehicles_level (danger_level) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_weapon_licenses ( id INT NOT NULL AUTO_INCREMENT, citizen_id VARCHAR(255) NOT NULL, playername VARCHAR(50) NOT NULL, dob DATE NOT NULL, license_number VARCHAR(50) NOT NULL, weapon_type VARCHAR(100) NOT NULL, expiration_date DATE NOT NULL, status ENUM('Active','Suspended','Revoked') DEFAULT 'Active', issued_by VARCHAR(100) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_weapon_licenses_number (license_number), KEY idx_weapon_licenses_citizen (citizen_id), KEY idx_weapon_licenses_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS kibra_smartpad_resmoncloud ( id INT NOT NULL AUTO_INCREMENT, devices JSON NOT NULL DEFAULT (JSON_ARRAY()), owner VARCHAR(255) NOT NULL, firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL, birthdate DATE NOT NULL, password VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_resmoncloud_owner (owner), KEY idx_resmoncloud_mail (mail) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

### 📷 Camera App Installation

#### Overview

The Camera App on your tablet captures photos and videos, which are then uploaded and stored securely on **fivemanage.com**.

To enable upload functionality, each user must obtain a personal API key.

***

### 📌 Steps to Get Started

#### 1. Visit the API Key Portal

Go to <https://fivemanage.com/developer> and sign in with your account.

#### 2. Generate Your API Key

After logging in:

* Navigate to the **API Keys** section.
* Click **"Generate New Key"**.
* Copy the generated key and store it somewhere safe.

#### 3. Update Your Project Configuration

In your `camera.json` file (under `/shared` folder), structure your data as follows:

```json
{
  "photo": "https://fivemanage.com/media/photo1.jpg",
  "video": "https://fivemanage.com/media/video1.mp4",
}
```

#### ⚠️ Important Notes

* **Do not share** your API key with others.
* If your key is compromised, revoke and regenerate it immediately.
* Uploaded media is only accessible via authenticated requests.

***

### 🧪 Testing Uploads

After configuring your key, try capturing media using the Camera App. You should see files uploaded to `https://fivemanage.com/media/`.

If any issue occurs, verify:

* Your API key is correct and active.
* Your internet connection is stable.

***

### 🧬 SQL Setup

All necessary SQL files are installed automatically during the first resource run.\
You do **not** need to import anything manually.

> ✅ Make sure the database connection is properly configured in your `server.cfg` and `qb-core or es_extended or qbx_core`.

***

### Installing Dependencies (`node_modules`)

After placing the `kibra-smartpad` folder inside your server's `resources` directory, you **must install the required dependencies** to ensure the script works correctly.

#### Steps

1. **Open your terminal and navigate to the script's directory:**

   ```sh
   cd resources/kibra-smartpad
   ```
2. **Install all dependencies:**

   ```sh
   npm install
   ```

   > This command will automatically create the `node_modules` folder with all the necessary packages. **Never copy node\_modules manually.** Always use `npm install`.
3. **(If the script uses a frontend/build step) Build the project:**

   ```sh
   npm run build
   ```

   > The build folder is usually included. If you get errors about missing build files, run this command.

***

**If you see any errors about missing modules, just run `npm install` and try again.**

### 🔧 Dependencies & Start Order

To ensure the SmartPad script works properly, `0r_lib` must be installed on your server.

#### ✅ Required Start Order in `server.cfg`:

```cfg
ensure yourcore
ensure oxmysql
ensure 0r_lib
ensure ox_lib
ensure kibra-smartpad
```

> 📌 Always start `0r_lib` before `kibra-smartpad` to prevent any missing export errors.

***

### 🔌 Optional Compatible Scripts

SmartPad is also compatible with the following scripts, offering additional integration:

* **0R Housing** – House-related app support for SmartPad.
* **Wais Bodycam V2** – EMS/Police bodycam viewer integration.
