Dental Lab Orders & Prosthetics

v0.1.0

External and in-house laboratory tracking, 3D optical scans (STL/PLY), VITA shade matching, and custom prosthetic workflows.

Dental Lab Orders & Prosthetics

The Dental Lab Orders & Prosthetics bounded context coordinates the fabrication, digital modeling, shade matching, and logistics of custom dental restorations. It bridges chairside operatory impressions with external commercial laboratories and in-house CAD/CAM milling units.


Lab Order Aggregate & Lifecycle

Every laboratory work ticket is managed as an independent LabOrder aggregate:

stateDiagram-v2
    [*] --> CREATED
    CREATED --> IMPRESSION_TAKEN: Physical or 3D STL scan captured
    IMPRESSION_TAKEN --> SENT_TO_LAB: Courier dispatched or CAD model sent
    SENT_TO_LAB --> IN_FABRICATION: Lab technician milling or layering
    IN_FABRICATION --> RECEIVED: Restorative package delivered to clinic
    RECEIVED --> DELIVERED: Seated chairside in patient mouth
    DELIVERED --> [*]
use Obelaw\Ium\Dental\Enums\LabOrderStatus;

enum LabOrderStatus: string
{
    case CREATED = 'created';
    case IMPRESSION_TAKEN = 'impression_taken';
    case SENT_TO_LAB = 'sent_to_lab';
    case IN_FABRICATION = 'in_fabrication';
    case RECEIVED = 'received';         // Inspected and stored in clinic lab staging
    case DELIVERED = 'delivered';       // Restorative crown seated and cemented
    case CANCELLED = 'cancelled';
}

Prosthetic Restoration Types

Obelawium Dental categorizes prosthetics via RestorationType:

use Obelaw\Ium\Dental\Enums\RestorationType;

enum RestorationType: string
{
    case CROWN = 'crown';                     // Single unit (Zirconia, E.max, PFM, Gold)
    case BRIDGE = 'bridge';                   // Multi-unit fixed partial denture
    case VENEER = 'veneer';                   // Anterior esthetic ceramic laminate
    case INLAY_ONLAY = 'inlay_onlay';         // Indirect cast or milled ceramic
    case IMPLANT_ABUTMENT = 'implant_abutment';// Custom titanium or hybrid Ti-base
    case DENTURE_COMPLETE = 'denture_complete';// Complete upper or lower prosthesis
    case DENTURE_PARTIAL = 'denture_partial'; // Removable cast metal/acrylic framework
    case NIGHTGUARD = 'nightguard';           // Hard/soft occlusal guard for bruxism
    case ALIGNER = 'aligner';                 // Clear orthodontic movement tray
}

Shade Matching: The ShadeMatch Value Object

Esthetic indirect restorations demand precise shade communication between the dentist and dental ceramist:

  • Body / Main Shade: VITA Classical (e.g., A2, B1) or VITA 3D-Master (2M2, 3M1).
  • Bleach Shades: For cosmetic smile makeovers (OM1, OM2, OM3).
  • Preparation / Stump Shade (ND): The underlying prepared tooth core (e.g., ND2, ND4), critical for translucent lithium disilicate (IPS e.max) crowns.
  • Incisal Translucency: High, medium, low halo effect.
  • Characterization: Mamelon anatomy, white hypocalcification spots, cervical gingival warm tones.
use Obelaw\Ium\Dental\ValueObjects\ShadeMatch;

$shade = new ShadeMatch(
    shadeGuide: 'VITA Classical',
    bodyShade: 'A2',
    cervicalShade: 'A3',
    incisalShade: 'Enamel Translucent Medium',
    stumpShade: 'ND2',
    notes: 'Warm cervical third with subtle incisal halo and moderate mamelon anatomy.'
);

Digital Impressions & 3D Scans

Rather than traditional polyvinyl siloxane (PVS) physical trays, modern operatories capture 3D intraoral scans. Obelawium Dental attaches raw digital impression files directly to the lab ticket:

  • file_path: Path to stereolithography (.stl) or color polygonal mesh (.ply) files.
  • lab_identifier: External laboratory account and routing number.
  • due_date: Promised return date, used by the scheduling engine to prevent booking crown insertion visits before the case arrives.

Fluent Service Operations

All laboratory workflows are invoked through ium()->dental()->labOrders():

1. Creating a Lab Order

use Obelaw\Ium\Dental\Data\CreateLabOrderDto;
use Obelaw\Ium\Dental\ValueObjects\ToothNumber;
use Obelaw\Ium\Dental\Enums\RestorationType;
use DateTimeImmutable;

$order = ium()->dental()->labOrders()->createOrder(CreateLabOrderDto::from([
    'patient_id' => $patient->id,
    'procedure_id' => $plannedProcedure->id,
    'lab_name' => 'Apex Dental Ceramics Lab',
    'restoration_type' => RestorationType::CROWN,
    'tooth_number' => ToothNumber::fromUniversal(8), // Upper Right Central Incisor
    'material' => 'Layered Zirconia (Katana UTML)',
    'shade' => 'A1 Body / Translucent Halo',
    'due_date' => new DateTimeImmutable('2026-10-24 12:00:00'),
    'scan_file_path' => 'scans/patients/482/tooth-8-prep.stl',
    'notes' => 'Please match surface micro-texture of adjacent natural tooth 9.',
    'actor_id' => 'DR-MARTINEZ',
]));

2. Submitting Case to the Laboratory

$submitted = ium()->dental()->labOrders()->submit($order->id);
echo $submitted->status->value; // 'sent_to_lab'

3. Receiving and Checking In Restorations

When the courier delivers the finished crown to the clinic, the assistant logs receipt and inspects margins:

$received = ium()->dental()->labOrders()->receive($order->id);
echo $received->status->value; // 'received'

4. Chairside Cementation & Delivery

Once seated and permanently cemented in the patient’s mouth:

$completed = ium()->dental()->labOrders()->complete($order->id);
echo $completed->status->value; // 'delivered'