Skip to content

Inventory matching platform: ML recommendations, AI contracts, PCI-compliant payments. Connects any ERP/WMS via AWS ETL. Laravel + Python + AWS infrastructure.

Notifications You must be signed in to change notification settings

dpmorr/inventory-match

Repository files navigation

Inventory Matching Platform

A production inventory matching system that automates surplus/shortfall trading between locations, facilities, or organizations. The platform integrates with existing inventory systems, uses machine learning to recommend matches, generates contracts automatically, and handles payment processing.

What This Does

This platform solves a common problem in organizations with multiple inventory locations: matching surplus inventory in one place with shortfall in another. Instead of manual phone calls and spreadsheets, it automates the entire process from matching to settlement.

Primary use case: You have 10 warehouses. Warehouse A has 5,000 extra units of SKU-123. Warehouse B needs 3,000 units of SKU-123. The platform automatically identifies this match, generates a contract, handles payment, and tracks the transaction to completion.

Core Components

The platform consists of five independent modules that can be used separately or together:

1. Data Integration Layer

What it does: Connects to your existing inventory systems and consolidates data into a unified format.

Supported sources:

  • ERP systems (SAP, Oracle, Dynamics, NetSuite, Odoo, custom)
  • Warehouse management systems (any with API or database access)
  • Legacy databases (PostgreSQL, MySQL, SQL Server, Oracle)
  • File feeds (SFTP, CSV, Excel, XML)
  • REST/GraphQL/SOAP APIs

How it works:

Your Systems → AWS Glue ETL → S3 Data Lake → Delta Lake Tables

The ETL pipeline runs on schedule (hourly, daily, real-time) and:

  1. Extracts data from your systems
  2. Normalizes formats (different SKU naming, quantity units, etc.)
  3. Validates data quality
  4. Removes duplicates
  5. Stores in queryable format

File: data-pipeline/etl/glue_etl_pipeline.py

To integrate your system:

# Configure your data source
source_config = {
    'type': 'api',  # or 'database', 'sftp', 'file'
    'endpoint': 'https://your-erp.com/api/inventory',
    'auth': 'oauth2',
    'schedule': 'hourly'
}

# Map your fields to standard format
field_mapping = {
    'your_sku_field': 'sku',
    'your_quantity_field': 'quantity',
    'your_location_field': 'location',
    'your_price_field': 'unit_price'
}

2. Machine Learning Recommendation Engine

What it does: Analyzes historical transaction patterns to predict which surplus/shortfall pairs should be matched.

How it works:

The system uses SVD++ (Singular Value Decomposition), a collaborative filtering algorithm that:

  1. Learns from past successful matches between locations/traders
  2. Identifies patterns in what gets traded where
  3. Predicts demand for each SKU at each location
  4. Scores potential matches on likelihood of success

Example:

Historical data shows:
- Location A frequently sends SKU-123 to Location B
- Location B typically needs 2000-5000 units when they order
- Transactions happen every 2-3 weeks
- Success rate: 95%

Current situation:
- Location A has surplus of 4000 units SKU-123
- Location B has shortfall of 3500 units SKU-123

Recommendation: Match these (confidence: 94%)

File: ml_recommendation_engine.py

Standalone usage:

from ml_recommendation_engine import InventoryRecommendationEngine

# Initialize
engine = InventoryRecommendationEngine(n_components=50)

# Train on your historical data
transactions = pd.read_csv('your_transactions.csv')
engine.train(transactions)

# Get recommendations
current_inventory = pd.read_csv('current_inventory.csv')
matches = engine.generate_matches(current_inventory, top_n=100)

# Results include confidence scores
for match in matches:
    print(f"Match: {match['sku']}")
    print(f"From: {match['surplus_trader']} ({match['quantity']} units)")
    print(f"To: {match['shortfall_trader']}")
    print(f"Confidence: {match['confidence_score']:.1%}")

The model retrains daily on new transaction data to improve accuracy over time.

3. Contract Generation System

What it does: Converts match recommendations into formal contracts with validation, risk assessment, and digital signatures.

The contract generation process:

Step 1: Input Validation

# Required information
contract_data = {
    'seller_id': 'Location A',
    'buyer_id': 'Location B',
    'sku': 'SKU-12345',
    'quantity': 2500,
    'unit_price': 19.00,
    'product_description': 'Tasmanian Oak Board 2400x600x18mm',
    'seller_location': 'Melbourne, VIC',
    'buyer_location': 'Sydney, NSW'
}

Step 2: Automated Validation Checks

The system performs six validation checks:

  1. Trader Identity Verification

    • Validates trader IDs exist in system
    • Checks trader status (active/suspended)
    • Prevents self-trading (same location buying from itself)
  2. SKU Authenticity

    • Verifies SKU exists in product catalog
    • Checks product is tradeable
    • Validates quantity is within reasonable bounds
  3. Pricing Reasonableness

    • Compares price against historical average
    • Flags if >30% above/below typical price
    • Checks for decimal errors (e.g., $1900 instead of $19.00)
  4. Geographic Feasibility

    • Calculates shipping distance
    • Estimates delivery time
    • Flags unusual cross-region trades
  5. Fraud Pattern Detection

    • Checks for unusual trading patterns
    • Identifies suspicious repetitive transactions
    • Compares against known fraud indicators
  6. Duplicate Detection

    • Prevents creating multiple contracts for same inventory
    • Checks for recent similar transactions

Step 3: Risk Assessment

# Risk scoring logic
risk_score = 0

if total_value > 100000:
    risk_score += 2  # High value transaction
if quantity > 10000:
    risk_score += 1  # Large quantity
if seller_location != buyer_location (different regions):
    risk_score += 1  # Geographic distance
if price_variance > 30%:
    risk_score += 2  # Unusual pricing

# Risk level determination
if risk_score >= 4: risk_level = 'HIGH'
elif risk_score >= 2: risk_level = 'MEDIUM'
else: risk_level = 'LOW'

Step 4: Contract Generation

The system generates a formatted contract with:

  • Unique contract ID
  • All transaction details
  • Terms and conditions
  • Payment terms (escrow details)
  • Delivery timeline
  • SHA-256 hash for integrity verification
  • Digital signature

Step 5: Approval Workflow

  • LOW risk: Automatic approval, proceeds to escrow
  • MEDIUM risk: Requires both parties to approve (48-hour window)
  • HIGH risk: Requires human review before proceeding

File: ai_contract_generator.py

Standalone usage:

from ai_contract_generator import AIContractGenerator

generator = AIContractGenerator()

# Generate contract from match
result = generator.generate_contract(match_data)

if result['success']:
    print(f"Contract ID: {result['contract_id']}")
    print(f"Risk Level: {result['risk_level']}")
    print(f"Status: {result['validation_status']}")

    if result['requires_human_review']:
        # Route to manual review queue
        send_for_review(result['contract_id'])
    else:
        # Proceed to payment
        create_escrow(result['contract_id'])

Why this matters:

Traditional process:

  1. Manual contract creation: 2-4 hours
  2. Legal review: 1-2 days
  3. Signature collection: 1-2 days
  4. Payment setup: 1 day
  5. Total: 3-5 days minimum

Automated process:

  1. Contract generation: <2 seconds
  2. Validation: automatic
  3. Approval: same day (or instant for low-risk)
  4. Payment setup: automatic
  5. Total: <24 hours typical

4. Payment Escrow System

What it does: Holds payment in escrow until delivery is confirmed, then releases funds to the seller.

Payment flow:

1. Contract approved
   → System creates escrow account

2. Buyer funds escrow
   → Multiple payment methods supported:
      - Credit card (via Stripe)
      - Bank transfer (via NPP for Australia)
      - Credit facility (for enterprise)

3. Funds held in escrow
   → Platform fee calculated (default 2.5%)
   → Net amount reserved for seller

4. Delivery confirmation
   → Manual confirmation or automatic based on shipping
   → Optional: requires both parties to confirm

5. Funds released
   → Seller receives net amount
   → Platform receives fee
   → Transaction marked complete

Security features:

  • PCI-DSS Level 1 compliant
  • No credit card data stored on platform
  • All payment data tokenized by payment gateways
  • TLS 1.3 encryption for all communications
  • Complete audit trail in database

High-value transaction handling:

For transactions above configurable threshold (default $50,000):

  • Automatic approval disabled
  • Requires human review
  • Additional verification steps
  • Manual release approval required

File: backend/app/Http/Controllers/EscrowController.php

API usage:

// Create escrow for approved contract
POST /api/escrow/create
{
    "contract_id": "CNT-2024-8734",
    "payment_method": "stripe"  // or "npp", "credit"
}

// Fund the escrow
POST /api/escrow/{id}/fund
{
    "payment_intent_id": "pi_xxxxx"  // from Stripe
}

// Release payment (after delivery)
POST /api/escrow/{id}/release
{
    "approved_by": "user_id",
    "delivery_confirmed": true
}

5. Product Catalog & Search

What it does: Maintains searchable product catalog with semantic search and duplicate detection.

Features:

Semantic search: Understands intent, not just keywords

  • Query: "oak wood panels" → Finds "Tasmanian Oak Boards", "Oak Veneer Sheets"
  • Query: "cabinet hinges soft close" → Finds "Blum Blumotion" even without exact terms

Geo-optimization: Prioritizes geographically closer matches

  • Reduces shipping costs
  • Faster delivery times
  • Shows distance in results

Duplicate detection: Identifies same products with different names

  • "MDF Board 16mm" vs "Medium Density Fibreboard 16mm"
  • Different suppliers, same product
  • Prevents data fragmentation

File: backend/app/Http/Controllers/CatalogController.php

Using Components Independently

Each component can be used standalone:

Just the ML engine:

# Use only the recommendation engine
python ml_recommendation_engine.py

# Reads: transactions.csv
# Outputs: match_recommendations.csv
# No backend needed

Just the contract generator:

# Generate contracts from your own data
from ai_contract_generator import AIContractGenerator

generator = AIContractGenerator()
contract = generator.generate_contract(your_data)
# Returns formatted contract text and validation results

Just the data integration:

# Run ETL pipeline independently
python data-pipeline/etl/glue_etl_pipeline.py

# Connects to your sources
# Outputs to S3 or local file
# No other components required

Full platform: Use the Laravel backend to coordinate all components via REST API.

Connecting Your Inventory System

Option 1: Direct Database Connection

If your inventory system has a database:

# In data-pipeline/etl/glue_etl_pipeline.py

db_config = {
    'type': 'postgresql',  # or mysql, mssql, oracle
    'host': 'your-db-server.internal',
    'port': 5432,
    'database': 'inventory',
    'username': 'readonly_user',
    'password': 'stored_in_secrets_manager',
    'table': 'stock_levels'
}

The ETL will query your database on schedule and sync data.

Option 2: API Integration

If your system has an API:

api_config = {
    'endpoint': 'https://your-erp.com/api/v2/inventory',
    'method': 'GET',
    'auth_type': 'oauth2',
    'client_id': 'your_client_id',
    'client_secret': 'stored_in_secrets_manager',
    'pagination': True,
    'rate_limit': 100  # requests per minute
}

Option 3: File-Based Integration

If your system exports files:

sftp_config = {
    'host': 'sftp.yourcompany.com',
    'port': 22,
    'username': 'integration_user',
    'key_file': '/path/to/ssh/key',
    'remote_path': '/exports/inventory/',
    'file_pattern': 'inventory_*.csv',
    'schedule': 'daily'  # or 'hourly', 'realtime'
}

Schema Mapping

Your data fields are mapped to standard format:

field_mappings = {
    # Your field name: Standard field name
    'item_code': 'sku',
    'stock_qty': 'quantity',
    'warehouse_code': 'location',
    'cost_price': 'unit_price',
    'item_description': 'product_name'
}

The ETL handles:

  • Type conversion (strings to numbers, etc.)
  • Unit normalization (kg to g, meters to cm)
  • Date format standardization
  • Null value handling
  • Validation and error reporting

Installation & Setup

Local Development

# 1. Clone repository
git clone https://github.com/yourusername/inventory-match.git
cd inventory-match

# 2. Configure environment
cp .env.example .env
# Edit .env with your database, AWS, and API credentials

# 3. Start services
cd docker
docker-compose up -d

# 4. Run migrations
docker-compose exec app php artisan migrate

# 5. (Optional) Train ML model
docker-compose exec ml-worker python ml_recommendation_engine.py

Access:

Production Deployment on AWS

# 1. Deploy infrastructure
aws cloudformation create-stack \
  --stack-name inventory-platform \
  --template-body file://infrastructure/aws/cloudformation-template.yaml \
  --parameters ParameterKey=Environment,ParameterValue=production

# 2. Upload Lambda functions
cd data-pipeline
zip -r functions.zip .
aws lambda update-function-code \
  --function-name inventory-data-ingestion \
  --zip-file fileb://functions.zip

# 3. Build and push Docker image
docker build -t inventory-platform -f docker/Dockerfile .
docker tag inventory-platform:latest ${ECR_URI}:latest
docker push ${ECR_URI}:latest

Technology Stack

Backend: PHP 8.2 with Laravel framework Database: PostgreSQL 15 Cache: Redis 7 ML/Python: Python 3.11, scikit-learn, pandas Cloud: AWS (S3, Glue, Lambda, ECS, RDS, ElastiCache, SageMaker) Search: Algolia Payments: Stripe, NPP, custom gateway Monitoring: Datadog, CloudWatch Containers: Docker, Docker Compose

API Documentation

Get ML Recommendations

GET /api/recommendations/matches?limit=100&min_confidence=0.70
Authorization: Bearer {token}

Response:

{
  "matches": [
    {
      "match_id": "M-2024-12345",
      "sku": "SKU-89234",
      "shortfall_trader": "Location-B",
      "surplus_trader": "Location-A",
      "quantity": 2500,
      "confidence_score": 0.94
    }
  ],
  "count": 100
}

Generate Contract

POST /api/contracts/generate
Authorization: Bearer {token}
Content-Type: application/json

{
  "seller_id": "LOC-A",
  "buyer_id": "LOC-B",
  "sku": "SKU-89234",
  "quantity": 2500,
  "unit_price": 19.00,
  "product_description": "Product Name",
  "seller_location": "Location A",
  "buyer_location": "Location B"
}

Response:

{
  "success": true,
  "contract_id": "CNT-2024-8734",
  "risk_level": "LOW",
  "validation_status": "APPROVED",
  "requires_human_review": false,
  "estimated_settlement": "18-24 hours"
}

Search Products

GET /api/catalog/semantic-search?q=oak+boards&location=melbourne
Authorization: Bearer {token}

Performance Characteristics

The platform is designed for:

  • API response time: Target p95 < 200ms
  • Contract generation: Target < 2 seconds
  • ML recommendation: Target < 500ms for batch of 100 matches
  • Settlement time: Target < 24 hours (vs typical 3-5 days manual process)

Designed to scale:

  • Hundreds of thousands of SKUs
  • Multiple data sources (tested with 10+ concurrent integrations)
  • High transaction volumes

Security & Compliance

PCI-DSS: Level 1 compliant payment processing Data encryption: TLS 1.3 in transit, AES-256 at rest Authentication: OAuth2 / JWT tokens Authorization: Role-based access control Audit logging: 7-year retention for financial transactions Secrets management: AWS Secrets Manager Network security: VPC isolation, security groups

License

This code is provided as a technical demonstration. Contact for production licensing.

Documentation

  • ARCHITECTURE.md - Detailed technical architecture
  • PROJECT_OVERVIEW.md - Business and technical overview
  • /backend/routes/api.php - Complete API route listing
  • /backend/database/migrations/ - Database schema documentation

Support

For implementation questions, review the architecture documentation or open an issue on GitHub.

About

Inventory matching platform: ML recommendations, AI contracts, PCI-compliant payments. Connects any ERP/WMS via AWS ETL. Laravel + Python + AWS infrastructure.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published