PHPackages                             ashokdubariya/casms - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. ashokdubariya/casms

ActiveProject

ashokdubariya/casms
===================

Client Approval &amp; Sign-Off Management System - A focused Laravel application for managing client approvals with version history and audit records.

00Blade

Since Feb 4Pushed 3mo agoCompare

[ Source](https://github.com/ashokdubariya/laravel-casms)[ Packagist](https://packagist.org/packages/ashokdubariya/casms)[ RSS](/packages/ashokdubariya-casms/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Client Approval &amp; Sign-Off Management System
================================================

[](#client-approval--sign-off-management-system)

[![Version](https://camo.githubusercontent.com/4f7e0d0b2eb3de8c977c19f21c7250bee9dcbaef07d742736035565ed3a1f2e6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e302e302d626c7565)](https://camo.githubusercontent.com/4f7e0d0b2eb3de8c977c19f21c7250bee9dcbaef07d742736035565ed3a1f2e6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e302e302d626c7565)[![Laravel](https://camo.githubusercontent.com/b22a63bdda5ff22e3921fd1828095975b2d9df1746d03705b53ced992c809d95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31322e34392e302d726564)](https://camo.githubusercontent.com/b22a63bdda5ff22e3921fd1828095975b2d9df1746d03705b53ced992c809d95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31322e34392e302d726564)[![PHP](https://camo.githubusercontent.com/3f55c87364aa35ec65a7ab89134395aeaa6e28f40f60be1006eaff8c088b40e9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322b2d707572706c65)](https://camo.githubusercontent.com/3f55c87364aa35ec65a7ab89134395aeaa6e28f40f60be1006eaff8c088b40e9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322b2d707572706c65)[![Tailwind](https://camo.githubusercontent.com/80eb73747fbfffb9b89c4ccefefead365d9875115709e7305d2112a935df1ab0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e642d342e312d333862646638)](https://camo.githubusercontent.com/80eb73747fbfffb9b89c4ccefefead365d9875115709e7305d2112a935df1ab0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e642d342e312d333862646638)[![Alpine](https://camo.githubusercontent.com/caa0d3adc168ff88064a5ca98b262777c40c48ed1d084a0b301c299d00108141/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416c70696e652e6a732d332e31352d386263306430)](https://camo.githubusercontent.com/caa0d3adc168ff88064a5ca98b262777c40c48ed1d084a0b301c299d00108141/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416c70696e652e6a732d332e31352d386263306430)[![License](https://camo.githubusercontent.com/c0fe1f4e3360a673b8e316491f355a722c6366a6b48ad3c402fa583be8286248/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d50726f70726965746172792d677265656e)](https://camo.githubusercontent.com/c0fe1f4e3360a673b8e316491f355a722c6366a6b48ad3c402fa583be8286248/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d50726f70726965746172792d677265656e)

A professional, self-hosted Laravel application for managing client approvals and sign-offs with version history, secure token-based access, and comprehensive audit trails.

---

📸 Application Screenshots
-------------------------

[](#-application-screenshots)

[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/01-dashboard.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/01-dashboard.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/02-client-management.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/02-client-management.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/03-view-client.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/03-view-client.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/04-approval-requests.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/04-approval-requests.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/05-view-approval-requests.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/05-view-approval-requests.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/06-activity-history.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/06-activity-history.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/07-email-templates.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/07-email-templates.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/08-user-management.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/08-user-management.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/09-user-profile-management.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/09-user-profile-management.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/10-role-management.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/10-role-management.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/11-role-details.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/11-role-details.png)[![](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/12-edit-role.png)](https://raw.githubusercontent.com/ashokdubariya/laravel-casms/main/screenshots/12-edit-role.png)---

Table of Contents
-----------------

[](#table-of-contents)

- [What This Is](#what-this-is)
- [What This Is Not](#what-this-is-not)
- [Key Features](#key-features)
- [Requirements](#requirements)
- [Installation](#installation)
- [Configuration](#configuration)
- [Usage Guide](#usage-guide)
- [Testing](#testing)
- [Security](#security)
- [Support](#support)
- [License](#license)

---

What This Is
------------

[](#what-this-is)

A **focused approval tracking system** designed for:

- Agencies managing client approvals
- Freelancers tracking project sign-offs
- Consultants requiring verifiable acceptance records
- Service providers needing audit trails

This system centralizes approval workflows, eliminates email-based approvals, and provides legally useful proof of client decisions.

---

What This Is Not
----------------

[](#what-this-is-not)

This is **NOT**:

- A project management system
- A CRM platform
- An invoicing or payment solution
- A time tracking tool
- A messaging or collaboration suite
- A task management system

If you need those features, this product is not for you. This application is **deliberately focused** on approval workflows only.

---

Key Features
------------

[](#key-features)

### Core Approval Management

[](#core-approval-management)

- Create approval requests with title, description, and version
- Attach files, images, and URLs
- Add internal team notes (never shown to clients)
- Track approval status: Pending, Approved, Rejected

### Secure Client Access

[](#secure-client-access)

- Token-based approval links (no client login required)
- Time-limited expiry (default: 7 days)
- Single-use tokens prevent reuse
- IP address and user agent tracking

### Approval Workflow

[](#approval-workflow)

- Clients approve with one click
- Clients reject with mandatory feedback
- Email notifications to team and clients
- Reminder emails for pending approvals

### Audit &amp; History

[](#audit--history)

- Immutable activity timeline
- Complete approval lifecycle tracking
- PDF export of approval proof
- Search and filter approvals

### Team Management

[](#team-management)

- Admin and Team Member roles
- Active/inactive user management
- Permission-based access control

---

Requirements
------------

[](#requirements)

### Server Requirements

[](#server-requirements)

- **PHP**: 8.2 or higher
- **Database**: MySQL 5.7+ or MariaDB 10.3+
- **Web Server**: Apache or Nginx
- **Composer**: 2.x
- **Node.js**: 18.x or higher (for asset compilation, optional)

### PHP Extensions

[](#php-extensions)

- BCMath
- Ctype
- Fileinfo
- JSON
- Mbstring
- OpenSSL
- PDO
- Tokenizer
- XML
- GD or Imagick (for PDF generation)

---

Installation
------------

[](#installation)

### Step 1: Upload Files

[](#step-1-upload-files)

Extract the ZIP file to your web server directory:

```
/var/www/html/your-domain/
```

### Step 2: Install Dependencies

[](#step-2-install-dependencies)

```
cd /var/www/html/your-domain
composer install --no-dev --optimize-autoloader
```

### Step 3: Environment Configuration

[](#step-3-environment-configuration)

Copy the example environment file:

```
cp .env.example .env
```

Edit `.env` and configure:

```
APP_NAME="Client Approval System"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_database_user
DB_PASSWORD=your_database_password

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_mail_username
MAIL_PASSWORD=your_mail_password
MAIL_FROM_ADDRESS="noreply@your-domain.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### Step 4: Generate Application Key

[](#step-4-generate-application-key)

```
php artisan key:generate
```

### Step 5: Run Migrations

[](#step-5-run-migrations)

```
php artisan migrate --force
```

### Step 6: Create Storage Symlink

[](#step-6-create-storage-symlink)

```
php artisan storage:link
```

### Step 7: Set Permissions

[](#step-7-set-permissions)

```
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
```

### Step 8: Create Admin User

[](#step-8-create-admin-user)

```
php artisan tinker
```

Then run:

```
\App\Models\User::create([
    'name' => 'Admin',
    'email' => 'admin@example.com',
    'password' => bcrypt('secure-password'),
    'role' => 'admin',
    'is_active' => true,
]);
```

### Step 9: Configure Web Server

[](#step-9-configure-web-server)

**For Apache (.htaccess included)**: Ensure `mod_rewrite` is enabled.

**For Nginx**:

```
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/html/your-domain/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

### Step 10: Access the Application

[](#step-10-access-the-application)

Navigate to: `https://your-domain.com`

Login with the admin credentials created in Step 8.

---

Configuration
-------------

[](#configuration)

### Email Configuration

[](#email-configuration)

Configure email in `.env`:

**For SMTP**:

```
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-email@gmail.com
MAIL_PASSWORD=your-app-password
MAIL_ENCRYPTION=tls
```

**For Mailgun, Postmark, SES**: See [Laravel Mail Documentation](https://laravel.com/docs/11.x/mail)

### Approval Settings

[](#approval-settings)

Edit `config/approval.php`:

```
'token' => [
    'expiry_days' => 7, // Token expiry in days
],

'attachments' => [
    'max_count' => 10, // Maximum attachments per approval
    'max_file_size' => 20480, // Max file size in KB (20MB)
],
```

Or use `.env`:

```
APPROVAL_TOKEN_EXPIRY_DAYS=7
APPROVAL_MAX_ATTACHMENTS=10
APPROVAL_MAX_FILE_SIZE=20480
```

### PDF Configuration

[](#pdf-configuration)

PDF generation uses DomPDF. Customize in `config/approval.php`:

```
'pdf' => [
    'orientation' => 'portrait',
    'paper_size' => 'a4',
    'company_name' => env('APP_NAME', 'Client Approval System'),
],
```

---

Usage Guide
-----------

[](#usage-guide)

### Creating an Approval Request

[](#creating-an-approval-request)

1. **Navigate to Dashboard**: Click "New Approval Request"
2. **Fill in Details**:
    - **Title**: Brief description (required)
    - **Description**: Detailed context (optional)
    - **Version**: e.g., v1, v2.1 (optional)
    - **Client Name**: Full name (required)
    - **Client Email**: Valid email (required)
    - **Internal Notes**: Team-only notes (optional)
3. **Add Attachments**: Upload images, documents, or add URLs
4. **Submit**: System generates secure approval link

### Sending Approval to Client

[](#sending-approval-to-client)

After creating an approval:

1. Copy the **secure approval link**
2. Email it to the client (or use built-in reminder feature)
3. Link expires in 7 days by default
4. Client can approve or reject (once only)

### Client Approval Process

[](#client-approval-process)

Clients receive a link and can:

1. **View** approval details and attachments
2. **Approve** with one click
3. **Reject** with mandatory feedback
4. No login or account required
5. Secure, single-use token

### Managing Approvals

[](#managing-approvals)

- **Filter**: By status, client email, or date range
- **Edit**: Pending approvals only (completed are immutable)
- **Send Reminder**: Nudge clients for pending approvals
- **Regenerate Link**: Create new token if needed
- **View History**: See complete audit trail
- **Download PDF**: Export approval proof

### Admin Features

[](#admin-features)

Admins can:

- Manage all users (create, deactivate)
- Delete any approval request
- Access all approvals (not just their own)

---

Testing
-------

[](#testing)

Run the complete test suite:

```
php artisan test
```

### Test Coverage

[](#test-coverage)

- **Feature Tests**: Full workflow testing
- **Unit Tests**: Model logic and helpers
- **Validation Tests**: Input sanitization
- **Security Tests**: Token security, authorization, SQL injection prevention

---

Security
--------

[](#security)

### Token Security

[](#token-security)

- Cryptographically secure random generation (64 characters)
- SHA-256 hashing with entropy
- Single-use enforcement
- Time-based expiry
- IP and user agent tracking

### Authorization

[](#authorization)

- Laravel Policy-based authorization
- Role-based access control (Admin, Team Member)
- Active user enforcement
- Owner-based approval access

### Data Protection

[](#data-protection)

- Immutable audit history
- Internal notes isolation
- SQL injection prevention
- XSS protection via Blade templating
- CSRF token validation

### Best Practices

[](#best-practices)

- HTTPS enforcement recommended
- Strong password requirements
- Session security
- Input validation and sanitization

---

Support
-------

[](#support)

### Common Issues

[](#common-issues)

**Issue**: Emails not sending

- **Solution**: Check `.env` mail configuration
- Verify SMTP credentials
- Check firewall/port blocking

**Issue**: File upload fails

- **Solution**: Check `upload_max_filesize` in `php.ini`
- Verify storage permissions: `chmod 775 storage`

**Issue**: Token link shows "expired"

- **Solution**: Token expired (default 7 days)
- Regenerate new link from approval details page

**Issue**: 500 error after installation

- **Solution**: Check storage permissions
- Run `php artisan config:cache`
- Check error logs: `storage/logs/laravel.log`

---

Version History
---------------

[](#version-history)

### v1.0.0 (January 2026)

[](#v100-january-2026)

- Initial release
- Core approval workflow
- Token-based client access
- PDF export
- Audit history
- Email notifications
- Comprehensive test coverage

---

Credits
-------

[](#credits)

Built with:

- [Laravel](https://laravel.com/) - PHP Framework
- [Tailwind CSS](https://tailwindcss.com/) - Styling
- [Alpine.js](https://alpinejs.dev/) - Interactivity
- [DomPDF](https://github.com/barryvdh/laravel-dompdf) - PDF Generation

---

**Thank you for choosing Client Approval &amp; Sign-Off Management System!**

###  Health Score

18

—

LowBetter than 8% of packages

Maintenance55

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/f09ff3ec3fc22f4d87f788868b887484162170a1c44377ec74e23e45c217face?d=identicon)[ashokdubariya](/maintainers/ashokdubariya)

---

Top Contributors

[![ashokdubariya](https://avatars.githubusercontent.com/u/12961793?v=4)](https://github.com/ashokdubariya "ashokdubariya (2 commits)")

### Embed Badge

![Health badge](/badges/ashokdubariya-casms/health.svg)

```
[![Health](https://phpackages.com/badges/ashokdubariya-casms/health.svg)](https://phpackages.com/packages/ashokdubariya-casms)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
