# Project Naming Code Generator

## Overview
The `ProjectNamingSchema` class provides a utility to generate project names based on the ISO 19650 naming convention. This ensures consistency and compliance with industry standards.

## Installation
Ensure the `ProjectNamingSchema` class is located in the `App\Helpers` namespace. No additional installation steps are required.

## Usage
To generate a project name, use the `generate` method of the `ProjectNamingSchema` class. This method accepts an associative array of fields and returns the generated project name.

### Example
```php
use App\Helpers\ProjectNamingSchema;

$fields = [
    'project' => 'PRJ001',
    'creator' => 'ORG01',
    'volume' => 'V01',
    'level' => 'L01',
    'documentType' => 'DOC',
    'discipline' => 'ARC',
    'number' => '1',
    'description' => 'Description',
    'status' => 'ST',
    'revision' => '1',
];

$projectName = ProjectNamingSchema::generate($fields);

// Output: PRJ001-ORG01-V01-L01-DOC-ARC-001-Description-ST-0001
```

## Fields
The following fields are supported:

| Field              | Definition                                                                 | Requirement       | Length       |
|--------------------|---------------------------------------------------------------------------|-------------------|--------------|
| **project**        | Identifies the project, contract, or file.                                | Required          | 2-12         |
| **creator**        | Organization responsible for creating the document.                      | Required          | 3-6          |
| **volume**         | Representative groupings, areas, or sections of the project.             | Required          | 2-3          |
| **level**          | Location within a Volume or System.                                      | Required          | 3            |
| **documentType**   | Document type, deliverable, or auxiliary.                                | Required          | 3            |
| **discipline**     | Scope to which the document corresponds.                                 | Required          | 3            |
| **number**         | Part enumerator.                                                         | Required          | 3            |
| **description**    | Text describing the document and its content.                            | Optional          | Unlimited     |
| **status**         | Temporary or definitive status of the document.                         | Optional          | 2            |
| **revision**       | Document version.                                                        | Optional          | 4            |

## Validation
The `generate` method validates that all required fields are provided. If any required field is missing, an `InvalidArgumentException` is thrown.

### Example
```php
$fields = [
    'creator' => 'ORG01',
    'volume' => 'V01',
    'level' => 'L01',
    'documentType' => 'DOC',
    'discipline' => 'ARC',
    'number' => '1',
];

try {
    $projectName = ProjectNamingSchema::generate($fields);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(); // Output: The field 'project' is required.
}
```

## Testing
Unit tests for the `ProjectNamingSchema` class are located in the `tests/Unit/ProjectNamingSchemaTest.php` file. Run the tests using the following command:

```bash
vendor\bin\pest --filter ProjectNamingSchemaTest
```

## Notes
- All fields marked as "Required" must be included.
- Optional fields can be omitted if not applicable.