OpsHub - Office Manager

Version: 1.3 · Last updated: August 2026 · PHP: 8.2+ · Laravel: 12.65 · Database: MySQL / MariaDB

Office Manager

Overview

OpsHub - Office Manager with Invoicing, HR & Client Portal Suite Full-featured invoice management application with invoicing, quotations, payments (with advance/deposit handling), expense tracking, product catalog, HR management, support tickets, SMS notifications, and multi-language support. Single-tenant architecture, deployable on shared hosting — including subdirectory installs.

Key Features

Initial view
📸 Before Install
Dashboard stats
📸 Dashboard stats
Language Selction
📸 Language Selection

Tech Stack

ComponentTechnology
Backend FrameworkLaravel 12.65
PHP Version8.2+
DatabaseMySQL / MariaDB with fx_ table prefix (configurable)
FrontendBootstrap 5, Choices.js, FullCalendar, DataTables
Auth (Staff)Laravel UI (session-based)
Auth (Client Portal)Custom clients guard (Authenticatable model)
API AuthLaravel Sanctum (token-based)
PDFBlade-to-PDF (custom rendering)
MailSMTP (configurable via settings)
SessionFile-based driver

Installation

Prerequisites

Manual Setup

  1. Upload the script files to your web server.
  2. Run composer install --no-dev in the script root.
  3. Set webroot to public/ directory.
  4. Navigate to your domain in a browser — the installer will launch automatically.

Web Installer (Recommended)

The application includes a 5-step web-based installer that guides you through setup. Simply visit your domain and the installer starts automatically.

Step 1: Welcome

Introduction screen with the application name and a "Start Installation" button.

Welcome Page
Installer Step 1

Step 2: Requirements Check

The installer checks PHP version (≥ 8.2) and required extensions (PDO, MySQL, cURL, mbstring, XML, BCMath, JSON, Tokenizer, Fileinfo). It also verifies directory permissions for storage/, bootstrap/cache/, and public/. Any failures are displayed with clear status indicators.

System Requirements
Installer Step 2

Step 3: Database Configuration

Enter your database credentials:

A connection test is performed before proceeding.

Database Configuration
Installer Step 3

Step 4: Admin Account & Configuration

Configure the application and create the admin user:

Deployment Guide

This guide covers deploying the application on cPanel-based shared hosting (Namecheap, Hostinger, etc.).

cPanel Deployment (Namecheap / Hostinger)

1. Prepare the Files

  1. On your local machine, run composer install --no-dev --optimize-autoloader in the script root.
  2. Create a ZIP archive of all files except .env (the installer creates it) and node_modules/.
  3. Log in to your cPanel and open File Manager.
  4. Navigate to public_html (or a subdirectory like public_html/invoice).
  5. Upload the ZIP and extract it there.
cPanel home
📸 cPanel home
cPanel File Manager
📸 cPanel File Manager
Upload the ZIP
📸 Upload the ZIP archive
Extract the ZIP
📸 Extract the archive
Extraction complete
📸 Extraction complete

2. Set Folder Permissions

The web server needs write access to the following directories:

chmod 775 storage bootstrap/cache
chmod 775 storage/logs storage/framework/{views,cache,sessions}

In cPanel File Manager: right-click each folder → Change Permissions → set 0755 or 0775.

3. Create a MySQL Database

  1. In cPanel, open MySQL Databases.
  2. Create a new database (e.g., cpaneluser_invoice).
  3. Create a database user with a strong password.
  4. Add the user to the database with All Privileges.
Create MySQL database
📸 Create the MySQL database
Create MySQL user
📸 Create the database user
Add user to database
📸 Add the user to the database
Database user privileges
📸 User privileges set to All Privileges

4. Point Document Root to public/

If deploying to a subdirectory (e.g., example.com/invoice), the .htaccess file in the script root handles internal routing automatically — no additional configuration needed.

If deploying to the domain root, set the document root to the public/ directory in cPanel's Domains section.

Point document root to public
📸 Point the domain document root to public/

5. Run the Web Installer

  1. Visit your domain in a browser (e.g., https://example.com/invoice).
  2. The 5-step web installer will launch automatically.
  3. Enter your database credentials (host: localhost, database name, username, password).
  4. Complete the installation and log in with the admin credentials you set.

6. Post-Installation

Namecheap cPanel-Specific Notes

Hostinger cPanel-Specific Notes

Apache Subdirectory Config (Legacy)

The application includes a .htaccess in both the script root and public/ to support subdirectory deployments (example.com/invoice). No additional Apache virtual host configuration is needed.

If you need to customize, create or modify public/.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

Troubleshooting

ProblemSolution
Blank white pageCheck storage/logs/laravel.log; enable PHP error display temporarily: edit public/index.php, add ini_set('display_errors', 1); error_reporting(E_ALL); at the top.
"No application encryption key"Run the web installer again, or set APP_KEY manually in .env: php artisan key:generate.
403 Forbidden on public/Ensure public/.htaccess exists and Apache has AllowOverride All for the directory.
500 error after uploadCheck folder permissions (storage/ and bootstrap/cache/ must be writable). Run php artisan optimize if SSH is available.
"Class ... not found"Re-run composer install --no-dev --optimize-autoloader on the server, or upload the vendor/ folder from local.
SQLSTATE[HY000] [1045] Access deniedVerify database host, username, password, and database name in .env. Use localhost for cPanel databases.
Mail not sendingGo to Settings → Email and configure SMTP credentials. For Namecheap Private Email, use mail.privateemail.com on port 465 with SSL.

Modules

Invoicing

The core module. Supports full invoice lifecycle with discount engine (per-line + invoice-level), multi-tax (deductible + compound), advance payments, and automatic status determination.

Line Total = qty × unit_price
  ↓
Line Discount (percentage|fixed)
  ↓
Taxable Amount = Line Total - Discount
  ↓
Deductible Taxes → calculated on taxable amount
Compound Taxes → calculated on (taxable + deductible)
  ↓
Item Total = taxable + deductible + compound
  ↓
Sum → Sub Total → Invoice Discount → Grand Total
StatusCondition
Drafttotal ≤ 0
Sentpaid_amount = 0, future due date
Overduepaid_amount = 0, past due date
Paidpaid_amount ≥ total
Partially PaidOtherwise
Invoice list
📸 Invoice list
Invoice create/edit
📸 Invoice create/edit form
Invoice view
📸 Invoice view page
Invoice payment
📸 Invoice payment

Quotations

Draft → Sent → Accepted/Rejected → Converted to Invoice. Same item/tax structure as invoices. One-click conversion via QuotationService::convertToInvoice().

Quotation create/edit
📸 Quotation create/edit form

Payments

Recorded against invoices. Supports cash payments and advance/deposit deductions. Multiple advances can be applied to a single payment. Overpayment protection — excess is first cut from cash, then from advance proportionally across all selected advances.

Payment receipt PDF available. Payment modes: Cash, Bank Transfer, Credit/Debit Card, Check, PayPal, Stripe, Other.

Payment recording
📸 Payment recording form
Payment list
📸 Payment list
Payment receipt PDF
📸 Payment receipt PDF
Payment methods
📸 Payment methods
Payment method add
📸 Add payment method

Client Advances

Prepayments received from clients before invoicing. Statuses: unused → partially_used → fully_used. Applied automatically during invoice creation or manually via payment recording.

Advances list
📸 Advances list
Advance create
📸 Advance create

Expenses

Two-state status: pending | released. Categorized under expense categories. Supports partial payments via expense payments.

Expenses list
📸 Expenses list
Expense create
📸 Expense create

Products

Auto-generated SKU (OM-00001). Categorizable under product categories. Searchable by name and SKU.

Products list
📸 Products list
Product create
📸 Product create

Clients

CRM records with optional portal access. Company name displayed from related Company model (via company_id) with fallback to free-text company_name. GDPR-compliant client portal with data export and account erasure.

FieldType
Client NumberAuto-generated (prefix + number)
Company NameRelated Company or free-text
Email / PhoneUsed for portal login
Tax / VAT NumberOptional
AddressLine 1 + Line 2 (no city/state)
StatusActive / Inactive
Client view page
📸 Client view page
Client list
📸 Client list
Client create
📸 Client create
Client ledger
📸 Client ledger

HR Module

EntityRelationships
DepartmenthasMany Designation, Employee, Task
DesignationbelongsTo Department, hasMany Employee
EmployeebelongsTo User, Department, Designation
PayrollbelongsTo Employee
Employee list
📸 Employee list
Employee create
📸 Employee create
Department & Designation
📸 Department list
Designation list
📸 Designation list
Payroll list
📸 Payroll list
Payroll create
📸 Payroll create

Tasks

Simple task management within HR. Statuses: pending, in_progress, completed, cancelled. Priorities: low, medium, high, urgent. Dashboard shows "My Tasks" widget.

Tasks list
📸 Tasks list
Task create
📸 Task create

Support Tickets

Client-facing support. Ticket → hasMany TicketReply. Statuses tracked per ticket. Dashboard integration.

Tickets list
📸 Tickets list
Ticket create
📸 Ticket create

SMS

Outbound SMS compose/send interface. Providers: Log (default), Twilio, Vonage. All sends recorded in sms_logs table. Configurable via SMS Settings page. Permissions: view_sms, send_sms, view_sms_settings, edit_sms_settings.

SMS compose page
📸 SMS compose page

Email Logs

Every outgoing email is automatically recorded in the email_logs table — invoice/quotation/payment emails, OTP codes, password reset links, ticket replies, advances — showing recipient, subject, body, provider, and status. A Send Email page lets you compose a message to a client (or any address) directly. The default mail transport is PHP sendmail; if no sendmail binary is available on the host, sending falls back to the log transport automatically (messages are written to storage/logs and no sending is attempted). Permissions: view_email_logs, send_email.

Email logs page
📸 Email logs page

Settings

General Settings

Typed key-value store via SettingService. Includes invoice prefixes, company info, localization (date/time format, timezone, language), currency format (symbol, position, decimal/thousand separators).

General settings
📸 General settings

Whitelabel / Branding

Dynamic logo and site identity. Upload logos at /settings/whitelabel. Files stored in storage/app/public/whitelabel/ (symlinked from public/storage/whitelabel/).

Runtime override via WhitelabelServiceProvider reading whitelabel.* settings from DB. Configurable: site_name, footer_text, logo_dark, logo_light, logo_sm, favicon, auth_background.

Whitelabel settings
📸 Whitelabel settings page

Email Settings

SMTP configuration stored in settings table. Mail driver, host, port, encryption, username, password, from address configurable via UI.

Email settings
📸 Email settings page

SMS Settings

Provider selection + credentials. Supports Twilio (Account SID, Auth Token, From number) and Vonage (API Key, API Secret, From). Defaults to log provider.

SMS settings
📸 SMS settings page

Notification Preferences

Per-user opt-in/opt-out for email and in-app notifications. Types: invoice, expense, payment, task, ticket, ticket_reply. Default: all opted in.

Notification preferences
📸 Notification preferences page

Invoice Designer

Customize PDF appearance: accent color (primary + secondary), labels (invoice, tax, total), show/hide logo. Live preview available.

Invoice designer
📸 Invoice designer

Shortcut Settings

Up to 3 quick-access buttons in the topbar. Options: Invoices, Payments, Clients, Quotations, Advances, Expenses. Default: Invoices + Payments.

Settings Shortcuts
📸 Shortcut settings page

Location Management

Manage countries, states/regions, and cities. Hierarchical selection with AJAX-dependent dropdowns.

Location management
📸 Location management page

Reset System

Three reset operations on the settings page:

OperationDeletesPreserves
Full System Reset Invoices, quotations, payments, advances, expenses, products, clients, companies, employees, payrolls, tickets, tasks, activity logs, SMS logs, notifications Users, roles, settings, configurations
Sales & Payment Reset Invoices, quotations, advances, payments, expenses —
Location Management Countries, states, cities —

Full system reset requires typing the application name to confirm (:value parameter in the type-confirm translation key).

Additional Modules

Companies

Manage client companies with contact details.

Company list
📸 Company list
Company add
📸 Company add

Tax Rules

Configure tax rates with deductible/compound types.

Tax rules
📸 Tax rules
Tax rule add
📸 Add tax rule

Reports

Invoice, payment, expense, and item reports with PDF/Excel export.

Invoice reports
📸 Invoice reports
Payment reports
📸 Payment reports
Expense reports
📸 Reports Overview

Profile & Users

User profile settings and user management.

Profile view
📸 Profile view
Profile settings
📸 Profile settings
User management
📸 User list
Roles
📸 Roles
Role edit
📸 Role edit

Activity Log & Notifications

Track all user actions and view notification popups.

Activity log
📸 Activity log
Notifications
📸 Notification popup

Client Portal (GDPR)

A self-service area for your clients at /client/login, protected by a dedicated clients auth guard (separate from staff users).

Access

Client portal
📸 Client portal
Client Register
📸 Client Registration portal
Client portal verification
📸 Client verification portal
Client verification email
📸 Client verification Code email

Portal Features

Client portal dashboard
📸 Client portal dashboard

GDPR Compliance

RightFeature
AccessClient can view all stored personal data on their profile.
RectificationClient can edit and correct their own profile data.
Data exportGET /client/profile/export downloads a JSON file with all personal data.
ErasureDELETE /client/profile deletes the account and personal data. Blocked while the client has outstanding invoices or advance balances — these must be settled first.
Client GDPR Profile
📸 Client GDPR Profile

How to Enable Portal Access

  1. Create or edit a client under Clients.
  2. Ensure the client has a valid email (or phone) address — no password is set by staff.
  3. Client visits /client/register, enters their email or phone, and follows the OTP code verification to set their own password.
  4. Clients log in at /client/login afterwards.

Localization

Languages (14)

CodeLanguageRTL
enEnglish—
bnবাংলা (Bengali)—
frFrançais—
spEspañol—
deDeutsch—
aeالعربية (Arabic)✅
ch中文 (Chinese)—
viTiếng Việt—
tlFilipino—
kr한국어—
ptPortuguês—
itItaliano—
ruРусский—
grΕλληνικά—

Translation Files

Each language has a translation.php file with ~720 keys covering the full UI. The AppServiceProvider registers resources/lang/ as the translation namespace; all strings are accessed via __('translation.*').

Language Switching

Topbar dropdown → GET /index/{locale} → HomeController@lang() → maps code → stores in session → Localization middleware applies on every request.

Language selector
📸 Language switcher dropdown

RTL Support (Arabic)

When Session::get('lang') === 'ae': <html dir="rtl"> is set, CSS overrides flip sidebar to right, swap margin/padding utilities, adjust DataTables and dropdowns.

Permissions & Roles

Roles

Permission Groups (73 total)

Invoices, Clients, Products, Payments, Expenses, Quotations, Advances, Tickets, Companies, Departments, Designations, Employees, Payrolls, Tasks, Activity Log, Email, SMS, Reports, Settings, Users.

Each group has view_, create_, edit_, delete_ permissions (REST-style).

Roles & Permissions
📸 Roles & Permissions page

REST API

All endpoints authenticated via auth:sanctum middleware (token-based).

MethodEndpointController
GET/api/dashboard/statsInvoiceController@dashboard
CRUD/api/clientsClientController
CRUD/api/productsProductController
CRUD/api/invoicesInvoiceController
CRUD/api/tax-rulesTaxRuleController
CRUD/api/expensesExpenseController
CRUD/api/categoriesCategoryController
GET/api/payment-modesPaymentModeController@index
GET/api/currenciesCurrencyController
POST/api/invoices/{id}/paymentsInvoiceController@recordPayment
POST/api/invoices/{id}/sendInvoiceController@send
POST/api/expenses/{id}/paymentsExpenseController@recordPayment
CRUD/api/settingsSettingController
GET/api/countriesLocationController
GET/api/countries/{id}/statesLocationController
GET/api/states/{id}/citiesLocationController
📸 Screenshot: API token management

CLI Commands

Run Artisan commands from the script root using your PHP CLI binary.

php artisan migrate:fresh --seed    # Full reset
php artisan migrate:refresh --seed   # Refresh
php artisan db:seed --class=...      # Single seeder
php artisan tinker                   # Interactive shell
php artisan storage:link             # Create storage symlink
rm -f storage/framework/views/*.php  # Clear view cache

View Cache Note

View cache files may need clearing if you switch between different PHP users (e.g., CLI vs web server user).


Logo

OpsHub - Office Manager — Documentation
Generated August 2026