3neti/settlement-envelope

Driver-based evidence envelope system for settlement gating

Maintainers

👁 3neti

Package info

github.com/3neti/settlement-envelope

pkg:composer/3neti/settlement-envelope

Statistics

Installs: 65

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v1.1.0 2026-04-10 03:13 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT bbe0e60d61a8bc74ce4b1d839924d961079fe383

  • Lester Hurtado <lester.woop@3neti.ph>

This package is auto-updated.

Last update: 2026-06-10 03:32:24 UTC


README

A driver-based evidence envelope system for settlement gating. This package provides a structured way to collect and validate evidence before allowing settlement of financial transactions.

Installation

composer require 3neti/settlement-envelope

Core Concepts

  • Envelope: A container bound to a settlement reference (e.g., voucher code, loan ID)
  • Driver: A YAML configuration that defines the schema, checklist, permissions, and gates
  • Payload: Versioned JSON metadata attached to the envelope
  • Attachments: Typed document uploads with review workflow
  • Signals: External boolean flags (e.g., KYC passed, account created)
  • Gates: Computed readiness states that determine when settlement is allowed

Usage

Creating an Envelope

use LBHurtado\SettlementEnvelope\Services\EnvelopeService;

$service = app(EnvelopeService::class);

$envelope = $service->create(
 referenceCode: 'BST-001',
 driverId: 'bank.home-loan-takeout',
 initialPayload: [
 'borrower' => ['full_name' => 'Juan Dela Cruz'],
 'loan' => ['tcp' => 2000000, 'amount' => 1800000],
 ]
);

Updating Payload

$service->updatePayload($envelope, [
 'loan' => ['ltv' => 0.9]
]);

Uploading Attachments

$attachment = $service->uploadAttachment(
 $envelope,
 'BORROWER_ID_FRONT',
 $uploadedFile
);

Setting Signals

$service->setSignal($envelope, 'kyc_passed', true);
$service->setSignal($envelope, 'account_created', true);

Checking Settleable Status

if ($envelope->isSettleable()) {
 $service->lock($envelope);
 $service->settle($envelope);
}

Driver Configuration

Create YAML driver files in config/envelope-drivers/:

driver:
 id: "my-driver"
 version: "1.0.0"
 title: "My Settlement Driver"

payload:
 schema:
 id: "my-driver.v1"
 format: "json_schema"
 inline:
 type: "object"
 required: ["name"]
 properties:
 name:
 type: "string"

documents:
 registry:
 - type: "ID_DOCUMENT"
 title: "ID Document"
 allowed_mimes: ["application/pdf", "image/jpeg"]
 max_size_mb: 10

checklist:
 template:
 - key: "name_provided"
 kind: "payload_field"
 payload_pointer: "/name"
 required: true
 - key: "id_uploaded"
 kind: "document"
 doc_type: "ID_DOCUMENT"
 required: true
 review: "required"

signals:
 definitions:
 - key: "approved"
 type: "boolean"
 default: false

gates:
 definitions:
 - key: "settleable"
 rule: "checklist.required_accepted && signal.approved"

Model Integration

Add the HasEnvelopes trait to any model:

use LBHurtado\SettlementEnvelope\Traits\HasEnvelopes;

class Voucher extends Model
{
 use HasEnvelopes;
}

// Usage
$voucher->createEnvelope('bank.home-loan-takeout');
$voucher->isEnvelopeSettleable();

Events

The package fires the following events:

  • EnvelopeCreated
  • PayloadUpdated
  • AttachmentUploaded
  • AttachmentReviewed
  • SignalChanged
  • GateChanged

License

MIT