Compare commits

..

3 Commits

Author SHA1 Message Date
Ronald A Richardson
f4715d137f fix: update schedule-item model default status from 'pending' to 'scheduled' 2026-04-05 04:29:00 -04:00
Ronald A Richardson
a83f1f7079 fix: use start_at/end_at in schedule-exception model to match backend schema
The backend schedule_exceptions table uses start_at/end_at timestamp columns,
not start_date/end_date. Update the Ember model to match.
2026-04-05 03:51:46 -04:00
Ronald A Richardson
7f5242fff4 feat: update scheduling Ember Data models for robust recurring schedule framework
- schedule-item: add schedule_template_uuid, title, notes, is_exception,
  exception_for_date fields; async relationships to schedule and scheduleTemplate
- schedule: add last_materialized_at, materialization_horizon_days fields;
  add exceptions hasMany relationship; make relationships async
- schedule-template: add break_start_time, break_end_time, color fields;
  add recurrenceSummary computed getter for human-readable RRULE display;
  make company relationship async
- schedule-exception: new model for time-off requests, sick leave, holidays,
  shift swaps and other deviations from recurring schedule patterns;
  includes isPending/isApproved/isRejected and typeLabel getters

These changes align the Ember Data layer with the core-api scheduling
framework refactoring (dev-v1.6.39) that introduces RRULE-based
materialization and exception handling.
2026-04-04 23:46:06 -04:00
20 changed files with 636 additions and 2044 deletions

View File

@@ -25,14 +25,6 @@
"fleetbase/registry-bridge": "^0.1.8",
"fleetbase/storefront-api": "^0.4.14",
"fleetbase/ledger-api": "^0.0.1",
"fleetbase/flespi-integration": "^0.1.16",
"fleetbase/samsara-api": "^0.0.3",
"fleetbase/vroom-api": "^0.0.3",
"fleetbase/valhalla-api": "^0.0.3",
"fleetbase/billing-api": "^0.1.21",
"fleetbase/internals-api": "^0.0.29",
"fleetbase/aws-marketplace": "^0.0.8",
"fleetbase/customer-portal-api": "^0.0.10",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^10.0",
"laravel/octane": "^2.3",
@@ -58,25 +50,9 @@
"phpunit/phpunit": "^10.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/fleetbase/aws-marketplace"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/billing"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/internals"
},
{
"type": "vcs",
"url": "https://github.com/fleetbase/customer-portal"
},
{
"type": "composer",
"url": "https://registry.qa.fleetbase.io"
"url": "https://registry.fleetbase.io"
}
],
"autoload": {

745
api/composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "a9e31f5e2ce4aae390057a568acfd684",
"content-hash": "27439bd81bfcb386af0e9dcfdf62bf7c",
"packages": [
{
"name": "appstract/laravel-opcache",
@@ -124,16 +124,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.374.1",
"version": "3.374.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "fa9801583e679aecc95660838708acfd98aa28e7"
"reference": "18525c8cc2a3aa2c1db23ceca5f57c5f8380d9c4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fa9801583e679aecc95660838708acfd98aa28e7",
"reference": "fa9801583e679aecc95660838708acfd98aa28e7",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/18525c8cc2a3aa2c1db23ceca5f57c5f8380d9c4",
"reference": "18525c8cc2a3aa2c1db23ceca5f57c5f8380d9c4",
"shasum": ""
},
"require": {
@@ -215,9 +215,9 @@
"support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.374.1"
"source": "https://github.com/aws/aws-sdk-php/tree/3.374.0"
},
"time": "2026-03-26T18:06:13+00:00"
"time": "2026-03-25T18:05:48+00:00"
},
{
"name": "aws/aws-sdk-php-laravel",
@@ -2153,208 +2153,6 @@
},
"time": "2026-02-25T22:16:40+00:00"
},
{
"name": "fleetbase/aws-marketplace",
"version": "0.0.8",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/aws-marketplace.git",
"reference": "ae041a5fa5165ca26de0c58bcc1522cd72dd28f9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/aws-marketplace/zipball/ae041a5fa5165ca26de0c58bcc1522cd72dd28f9",
"reference": "ae041a5fa5165ca26de0c58bcc1522cd72dd28f9",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.0",
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\AwsMarketplace\\Providers\\AwsMarketplaceServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\AwsMarketplace\\": "server/src/",
"Fleetbase\\AwsMarketplace\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\AwsMarketplace\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "AWS Marketplace SaaS integration extension for Fleetbase",
"keywords": [
"aws",
"billing",
"cloudformation",
"deployment",
"fleetbase",
"fleetbase-extension",
"marketplace",
"saas"
],
"support": {
"source": "https://github.com/fleetbase/aws-marketplace/tree/v0.0.8",
"issues": "https://github.com/fleetbase/aws-marketplace/issues"
},
"time": "2025-12-06T10:25:37+00:00"
},
{
"name": "fleetbase/billing-api",
"version": "0.1.21",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/billing.git",
"reference": "7b213aaa751a79a525a472c8c800f0cec7116182"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/billing/zipball/7b213aaa751a79a525a472c8c800f0cec7116182",
"reference": "7b213aaa751a79a525a472c8c800f0cec7116182",
"shasum": ""
},
"require": {
"fleetbase/core-api": "*",
"laravel/cashier": "^16.2.0",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*",
"stripe/stripe-php": "^17.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^7.0",
"pestphp/pest": "^2.33.2",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Billing\\Providers\\BillingServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/billing-api": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Billing\\": "server/src/",
"Fleetbase\\Billing\\Seeders\\": "server/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Billing\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
},
{
"name": "Ronald A. Richardson",
"email": "ron@fleetbase.io"
}
],
"description": "Multi-Tenant Billing and Subscriptions Extension for Fleetbase",
"keywords": [
"billing",
"billing system",
"fleetbase",
"fleetbase-extension",
"revenue engine",
"revenue generator",
"stripe",
"stripe api"
],
"support": {
"source": "https://github.com/fleetbase/billing/tree/v0.1.21",
"issues": "https://github.com/fleetbase/billing/issues"
},
"time": "2026-03-26T09:21:33+00:00"
},
{
"name": "fleetbase/core-api",
"version": "1.6.38",
@@ -2524,96 +2322,6 @@
},
"time": "2025-07-10T14:06:48+00:00"
},
{
"name": "fleetbase/customer-portal-api",
"version": "0.0.10",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/customer-portal.git",
"reference": "99a072129a60c71fd9f2703166b15f442b7072bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/customer-portal/zipball/99a072129a60c71fd9f2703166b15f442b7072bb",
"reference": "99a072129a60c71fd9f2703166b15f442b7072bb",
"shasum": ""
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\CustomerPortal\\Providers\\CustomerPortalServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\CustomerPortal\\": "server/src/",
"Fleetbase\\CustomerPortal\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\CustomerPortal\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
}
],
"description": "Extendable Customer Portal for Fleetbase",
"keywords": [
"customer",
"customer management",
"customer portal",
"customer support",
"customer tracking",
"fleetbase",
"fleetbase-extension"
],
"support": {
"source": "https://github.com/fleetbase/customer-portal/tree/v0.0.10",
"issues": "https://github.com/fleetbase/customer-portal/issues"
},
"time": "2025-12-06T10:12:51+00:00"
},
{
"name": "fleetbase/fleetops-api",
"version": "0.6.38",
@@ -2704,199 +2412,6 @@
},
"time": "2026-03-26T09:07:51+00:00"
},
{
"name": "fleetbase/flespi-integration",
"version": "0.1.16",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/flespi-engine/flespi-engine-0.1.16.tgz?AWSAccessKeyId=ASIA26E6KG6WHVYYZTDS&Expires=1774572847&Signature=74H%2F3aolVkCOxwPkq0ItMqrSFzc%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEAgaDmFwLXNvdXRoZWFzdC0xIkgwRgIhAPElz5JCKFGi6jeZjFko5c4inuOq0G3GO%2FHCBU0SFi1fAiEA6o6Gg6vTsq%2Fz2JSyIuFz%2BBC%2FGuQc44BLVr8olP8Bv%2BoqjwQI0v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw3NTE5NTEyOTY0MjgiDFnJ4EZd5uadTV%2FMySrjA5%2FddXbmE2XHWLCSgNHFbqhoj5Wz0a0T0Bx6i9WQOP%2Fxt7AJo%2F3oBf6NieVmFotkBsrcfNFPk2D7ooxXRLRUfZ5PBf7lw3NO8Ohn9QCz0Pcw5U%2BYOJ6DK8bCafRg7PUwzbX6Jo6bsQmkHqj23%2FZ7y7LZRPcMGzIAgE7t5hE%2BjUnwJxBDL8PXFfRhahFbbFpWgGzON%2Bwc9qgy4GDuTg4ObNH4oatedcdkoMW1xrw5p%2BYxh4AJDNRa6Ydd3lhLGYVnQqLs70waldlCUIe5JmGVTgf1HYQb3LyBuiRhRrzVJ826HeBVFsfPRgIjd8BDzoggk5e%2FSknC7kKpY3LGdm%2BcRsrVmWbdRyl4zn3EeD96egM5rQCL6tnMm9dryeo2ItrTVe42AAz6maiDsUqWY9TmcvCTRC7W9zNT14lmZMJfiBqOkZREcSGGBYC8k%2BdqxoaSBkz%2BxJqj9y02J5iql0ZMPLPoD1GidsPa8%2BKsMKK5eYf3%2B7ejnX5gngwmUGd3pwKfcipkYuSQ75KRBeuhA79Ko123S%2BMLrrwdTmgXQKA26wHpIKNqc7qR4d7qxZyLSr5HAdoPUzwUm%2BM%2BbfKLBjB9UvtQBVbOK4udLyluUwc5CoYILU2KPcrrz4H7gvT1gtKH1jFAezDCm5fOBjqkAc82rrjMlDnnLZHhsLniUAm%2FysjzvlB8kVP8OEW9ftrbnNNKsLZJitBHXgUKfJcb9SYuVMkFV4ehM%2B5z5STXp8Auq9NsJZoYOtIAghvZv3jtuVILzDC7PWtFdMJFiIHmt382gu6LATVHEwxC0wsn7ukGa6QyxTXIJHAayBTBBj%2Bk%2BabBtgxv02CAwScvyLf5bpP5BEX9N4%2BLD%2FZHg%2FQZN%2B%2BIKrPe"
},
"require": {
"fleetbase/core-api": "*",
"fleetbase/fleetops-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*",
"vlucas/phpdotenv": "^5.5"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Flespi\\Providers\\FlespiIntegrationServiceProvider",
"Fleetbase\\Flespi\\Providers\\NotificationServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/flespi-integration": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Flespi\\": "server/src/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Flespi\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
}
],
"description": "Flespi Universal Telematics Gateway, Parser & API Extension for Fleetbase",
"keywords": [
"fleetbase-extension",
"flespi"
]
},
{
"name": "fleetbase/internals-api",
"version": "0.0.29",
"source": {
"type": "git",
"url": "git@github.com:fleetbase/internals.git",
"reference": "a433fbdb3360be07752a1cf5c63a0b69a4707155"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fleetbase/internals/zipball/a433fbdb3360be07752a1cf5c63a0b69a4707155",
"reference": "a433fbdb3360be07752a1cf5c63a0b69a4707155",
"shasum": ""
},
"require": {
"fleetbase/billing-api": "*",
"fleetbase/core-api": "*",
"fleetbase/registry-bridge": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^7.0",
"pestphp/pest": "^2.33.2",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Internals\\Providers\\InternalServiceProvider"
]
},
"fleetbase": {
"sandbox-migrations": false
},
"fleetbase/internals-api": {
"excludes": [
"addon",
"app",
"assets",
"config",
"tests",
"vendor"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Internals\\": "server/src/",
"Fleetbase\\Internals\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Internals\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd.",
"email": "hello@fleetbase.io"
},
{
"name": "Ronald A. Richardson",
"email": "ron@fleetbase.io"
}
],
"description": "Private internal functionality for Fleetbase SaaS",
"keywords": [
"fleetbase",
"fleetbase-extension",
"fleetbase-internals"
],
"support": {
"source": "https://github.com/fleetbase/internals/tree/v0.0.29",
"issues": "https://github.com/fleetbase/internals/issues"
},
"time": "2026-03-26T09:20:28+00:00"
},
{
"name": "fleetbase/laravel-mysql-spatial",
"version": "1.0.2",
@@ -3123,84 +2638,6 @@
},
"time": "2026-03-26T09:06:26+00:00"
},
{
"name": "fleetbase/samsara-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/samsara-engine/samsara-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WHVYYZTDS&Expires=1774572847&Signature=SuphOkTCGqd3%2BDNAmLEhO5nxdMc%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEAgaDmFwLXNvdXRoZWFzdC0xIkgwRgIhAPElz5JCKFGi6jeZjFko5c4inuOq0G3GO%2FHCBU0SFi1fAiEA6o6Gg6vTsq%2Fz2JSyIuFz%2BBC%2FGuQc44BLVr8olP8Bv%2BoqjwQI0v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw3NTE5NTEyOTY0MjgiDFnJ4EZd5uadTV%2FMySrjA5%2FddXbmE2XHWLCSgNHFbqhoj5Wz0a0T0Bx6i9WQOP%2Fxt7AJo%2F3oBf6NieVmFotkBsrcfNFPk2D7ooxXRLRUfZ5PBf7lw3NO8Ohn9QCz0Pcw5U%2BYOJ6DK8bCafRg7PUwzbX6Jo6bsQmkHqj23%2FZ7y7LZRPcMGzIAgE7t5hE%2BjUnwJxBDL8PXFfRhahFbbFpWgGzON%2Bwc9qgy4GDuTg4ObNH4oatedcdkoMW1xrw5p%2BYxh4AJDNRa6Ydd3lhLGYVnQqLs70waldlCUIe5JmGVTgf1HYQb3LyBuiRhRrzVJ826HeBVFsfPRgIjd8BDzoggk5e%2FSknC7kKpY3LGdm%2BcRsrVmWbdRyl4zn3EeD96egM5rQCL6tnMm9dryeo2ItrTVe42AAz6maiDsUqWY9TmcvCTRC7W9zNT14lmZMJfiBqOkZREcSGGBYC8k%2BdqxoaSBkz%2BxJqj9y02J5iql0ZMPLPoD1GidsPa8%2BKsMKK5eYf3%2B7ejnX5gngwmUGd3pwKfcipkYuSQ75KRBeuhA79Ko123S%2BMLrrwdTmgXQKA26wHpIKNqc7qR4d7qxZyLSr5HAdoPUzwUm%2BM%2BbfKLBjB9UvtQBVbOK4udLyluUwc5CoYILU2KPcrrz4H7gvT1gtKH1jFAezDCm5fOBjqkAc82rrjMlDnnLZHhsLniUAm%2FysjzvlB8kVP8OEW9ftrbnNNKsLZJitBHXgUKfJcb9SYuVMkFV4ehM%2B5z5STXp8Auq9NsJZoYOtIAghvZv3jtuVILzDC7PWtFdMJFiIHmt382gu6LATVHEwxC0wsn7ukGa6QyxTXIJHAayBTBBj%2Bk%2BabBtgxv02CAwScvyLf5bpP5BEX9N4%2BLD%2FZHg%2FQZN%2B%2BIKrPe"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Samsara\\Providers\\SamsaraServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Samsara\\": "server/src/",
"Fleetbase\\Samsara\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Samsara\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Developer",
"email": "developer@fleetbase.io"
}
],
"description": "Vehicle Data Import & Location Integration via Samsara API",
"keywords": [
"fleet",
"fleetbase",
"fleetbase-extension",
"integration",
"samsara",
"tracking",
"vehicle"
]
},
{
"name": "fleetbase/storefront-api",
"version": "0.4.14",
@@ -3361,160 +2798,6 @@
],
"time": "2024-08-15T08:26:54+00:00"
},
{
"name": "fleetbase/valhalla-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/valhalla-engine/valhalla-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WHVYYZTDS&Expires=1774572847&Signature=CJwAZSoGY1s6hYd4a84Hi3fKQJ4%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEAgaDmFwLXNvdXRoZWFzdC0xIkgwRgIhAPElz5JCKFGi6jeZjFko5c4inuOq0G3GO%2FHCBU0SFi1fAiEA6o6Gg6vTsq%2Fz2JSyIuFz%2BBC%2FGuQc44BLVr8olP8Bv%2BoqjwQI0v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw3NTE5NTEyOTY0MjgiDFnJ4EZd5uadTV%2FMySrjA5%2FddXbmE2XHWLCSgNHFbqhoj5Wz0a0T0Bx6i9WQOP%2Fxt7AJo%2F3oBf6NieVmFotkBsrcfNFPk2D7ooxXRLRUfZ5PBf7lw3NO8Ohn9QCz0Pcw5U%2BYOJ6DK8bCafRg7PUwzbX6Jo6bsQmkHqj23%2FZ7y7LZRPcMGzIAgE7t5hE%2BjUnwJxBDL8PXFfRhahFbbFpWgGzON%2Bwc9qgy4GDuTg4ObNH4oatedcdkoMW1xrw5p%2BYxh4AJDNRa6Ydd3lhLGYVnQqLs70waldlCUIe5JmGVTgf1HYQb3LyBuiRhRrzVJ826HeBVFsfPRgIjd8BDzoggk5e%2FSknC7kKpY3LGdm%2BcRsrVmWbdRyl4zn3EeD96egM5rQCL6tnMm9dryeo2ItrTVe42AAz6maiDsUqWY9TmcvCTRC7W9zNT14lmZMJfiBqOkZREcSGGBYC8k%2BdqxoaSBkz%2BxJqj9y02J5iql0ZMPLPoD1GidsPa8%2BKsMKK5eYf3%2B7ejnX5gngwmUGd3pwKfcipkYuSQ75KRBeuhA79Ko123S%2BMLrrwdTmgXQKA26wHpIKNqc7qR4d7qxZyLSr5HAdoPUzwUm%2BM%2BbfKLBjB9UvtQBVbOK4udLyluUwc5CoYILU2KPcrrz4H7gvT1gtKH1jFAezDCm5fOBjqkAc82rrjMlDnnLZHhsLniUAm%2FysjzvlB8kVP8OEW9ftrbnNNKsLZJitBHXgUKfJcb9SYuVMkFV4ehM%2B5z5STXp8Auq9NsJZoYOtIAghvZv3jtuVILzDC7PWtFdMJFiIHmt382gu6LATVHEwxC0wsn7ukGa6QyxTXIJHAayBTBBj%2Bk%2BabBtgxv02CAwScvyLf5bpP5BEX9N4%2BLD%2FZHg%2FQZN%2B%2BIKrPe"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Valhalla\\Providers\\ValhallaServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Valhalla\\": "server/src/",
"Fleetbase\\Valhalla\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Valhalla\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "Valhalla routing engine extension for Fleetbase",
"keywords": [
"fleetbase",
"fleetbase",
"fleetbase-extension",
"routing",
"routing engine",
"valhalla"
]
},
{
"name": "fleetbase/vroom-api",
"version": "0.0.3",
"dist": {
"type": "tar",
"url": "https://s3.ap-southeast-1.amazonaws.com/fleetbase-registry-qa/flb/%40fleetbase/vroom-engine/vroom-engine-0.0.3.tgz?AWSAccessKeyId=ASIA26E6KG6WHVYYZTDS&Expires=1774572847&Signature=8GkhLPhpwIPqJLdZfixLBqyFLJA%3D&x-amz-security-token=IQoJb3JpZ2luX2VjEAgaDmFwLXNvdXRoZWFzdC0xIkgwRgIhAPElz5JCKFGi6jeZjFko5c4inuOq0G3GO%2FHCBU0SFi1fAiEA6o6Gg6vTsq%2Fz2JSyIuFz%2BBC%2FGuQc44BLVr8olP8Bv%2BoqjwQI0v%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw3NTE5NTEyOTY0MjgiDFnJ4EZd5uadTV%2FMySrjA5%2FddXbmE2XHWLCSgNHFbqhoj5Wz0a0T0Bx6i9WQOP%2Fxt7AJo%2F3oBf6NieVmFotkBsrcfNFPk2D7ooxXRLRUfZ5PBf7lw3NO8Ohn9QCz0Pcw5U%2BYOJ6DK8bCafRg7PUwzbX6Jo6bsQmkHqj23%2FZ7y7LZRPcMGzIAgE7t5hE%2BjUnwJxBDL8PXFfRhahFbbFpWgGzON%2Bwc9qgy4GDuTg4ObNH4oatedcdkoMW1xrw5p%2BYxh4AJDNRa6Ydd3lhLGYVnQqLs70waldlCUIe5JmGVTgf1HYQb3LyBuiRhRrzVJ826HeBVFsfPRgIjd8BDzoggk5e%2FSknC7kKpY3LGdm%2BcRsrVmWbdRyl4zn3EeD96egM5rQCL6tnMm9dryeo2ItrTVe42AAz6maiDsUqWY9TmcvCTRC7W9zNT14lmZMJfiBqOkZREcSGGBYC8k%2BdqxoaSBkz%2BxJqj9y02J5iql0ZMPLPoD1GidsPa8%2BKsMKK5eYf3%2B7ejnX5gngwmUGd3pwKfcipkYuSQ75KRBeuhA79Ko123S%2BMLrrwdTmgXQKA26wHpIKNqc7qR4d7qxZyLSr5HAdoPUzwUm%2BM%2BbfKLBjB9UvtQBVbOK4udLyluUwc5CoYILU2KPcrrz4H7gvT1gtKH1jFAezDCm5fOBjqkAc82rrjMlDnnLZHhsLniUAm%2FysjzvlB8kVP8OEW9ftrbnNNKsLZJitBHXgUKfJcb9SYuVMkFV4ehM%2B5z5STXp8Auq9NsJZoYOtIAghvZv3jtuVILzDC7PWtFdMJFiIHmt382gu6LATVHEwxC0wsn7ukGa6QyxTXIJHAayBTBBj%2Bk%2BabBtgxv02CAwScvyLf5bpP5BEX9N4%2BLD%2FZHg%2FQZN%2B%2BIKrPe"
},
"require": {
"fleetbase/core-api": "*",
"php": "^8.0",
"php-http/guzzle7-adapter": "^1.0",
"psr/http-factory-implementation": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.34.1",
"nunomaduro/collision": "^5.11.0|^6.4.0",
"pestphp/pest": "^1.22.6",
"phpstan/phpstan": "^1.10.38",
"symfony/var-dumper": "^5.4.29"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Fleetbase\\Vroom\\Providers\\VroomServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Fleetbase\\Vroom\\": "server/src/",
"Fleetbase\\Vroom\\Seeds\\": "server/seeds/"
}
},
"autoload-dev": {
"psr-4": {
"Fleetbase\\Vroom\\Tests\\": "server/tests/"
}
},
"scripts": {
"lint": [
"php-cs-fixer fix -v"
],
"test:lint": [
"php-cs-fixer fix -v --dry-run"
],
"test:types": [
"phpstan analyse --ansi --memory-limit=0"
],
"test:unit": [
"pest --colors=always"
],
"test": [
"@test:lint",
"@test:types",
"@test:unit"
]
},
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Fleetbase Pte Ltd",
"email": "hello@fleetbase.io"
}
],
"description": "VROOM route optimization machine extension for Fleetbase",
"keywords": [
"fleetbase",
"fleetbase",
"fleetbase-extension",
"route optimization",
"routing",
"vroom"
]
},
{
"name": "fruitcake/php-cors",
"version": "v1.4.0",
@@ -4725,20 +4008,20 @@
},
{
"name": "grpc/grpc",
"version": "1.78.0",
"version": "1.74.0",
"source": {
"type": "git",
"url": "https://github.com/grpc/grpc-php.git",
"reference": "9891a9aa0de41c4ceb07a50dbb5a3aa96c229082"
"reference": "32bf4dba256d60d395582fb6e4e8d3936bcdb713"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/grpc/grpc-php/zipball/9891a9aa0de41c4ceb07a50dbb5a3aa96c229082",
"reference": "9891a9aa0de41c4ceb07a50dbb5a3aa96c229082",
"url": "https://api.github.com/repos/grpc/grpc-php/zipball/32bf4dba256d60d395582fb6e4e8d3936bcdb713",
"reference": "32bf4dba256d60d395582fb6e4e8d3936bcdb713",
"shasum": ""
},
"require": {
"php": ">=7.1.0"
"php": ">=7.0.0"
},
"require-dev": {
"google/auth": "^v1.3.0"
@@ -4763,9 +4046,9 @@
"rpc"
],
"support": {
"source": "https://github.com/grpc/grpc-php/tree/v1.78.0"
"source": "https://github.com/grpc/grpc-php/tree/v1.74.0"
},
"time": "2026-03-25T08:47:43+00:00"
"time": "2025-07-24T20:02:16+00:00"
},
{
"name": "guzzlehttp/guzzle",

View File

@@ -0,0 +1,69 @@
import Model, { attr, belongsTo } from '@ember-data/model';
/**
* ScheduleException
*
* Represents a deviation from a driver's recurring schedule — time off requests,
* sick leave, holidays, shift swaps, training days, or other exceptions.
*
* An exception is submitted by a driver or dispatcher, then approved or rejected
* by a manager. When approved, all ScheduleItem records that fall within the
* exception's date range are automatically cancelled.
*
* @see core-api ScheduleException model
*/
export default class ScheduleExceptionModel extends Model {
/** @ids */
@attr('string') public_id;
@attr('string') schedule_uuid;
@attr('string') subject_uuid;
@attr('string') subject_type;
@attr('string') requested_by_uuid;
/** @attributes */
@attr('string', { defaultValue: 'time_off' }) type;
@attr('string', { defaultValue: 'pending' }) status;
@attr('date') start_at;
@attr('date') end_at;
@attr('string') reason;
@attr('string') notes;
@attr('string') rejection_reason;
@attr('date') reviewed_at;
@attr('string') reviewed_by_uuid;
/** @meta */
@attr('object') meta;
/** @relationships */
@belongsTo('schedule', { async: true }) schedule;
/** @dates */
@attr('date') created_at;
@attr('date') updated_at;
@attr('date') deleted_at;
/** @computed */
get isPending() {
return this.status === 'pending';
}
get isApproved() {
return this.status === 'approved';
}
get isRejected() {
return this.status === 'rejected';
}
get typeLabel() {
const labels = {
time_off: 'Time Off',
sick_leave: 'Sick Leave',
holiday: 'Holiday',
swap: 'Shift Swap',
training: 'Training',
other: 'Other',
};
return labels[this.type] || this.type;
}
}

View File

@@ -1,8 +1,10 @@
import Model, { attr, belongsTo } from '@ember-data/model';
export default class ScheduleItemModel extends Model {
/** @ids */
@attr('string') public_id;
@attr('string') schedule_uuid;
@attr('string') schedule_template_uuid;
@attr('string') assignee_uuid;
@attr('string') assignee_type;
@attr('string') resource_uuid;
@@ -12,10 +14,20 @@ export default class ScheduleItemModel extends Model {
@attr('number') duration;
@attr('date') break_start_at;
@attr('date') break_end_at;
@attr('string', { defaultValue: 'pending' }) status;
@attr('string') title;
@attr('string', { defaultValue: 'scheduled' }) status;
@attr('string') notes;
/** @exception fields */
@attr('boolean', { defaultValue: false }) is_exception;
@attr('date') exception_for_date;
/** @meta */
@attr('object') meta;
@belongsTo('schedule') schedule;
/** @relationships */
@belongsTo('schedule', { async: true }) schedule;
@belongsTo('schedule-template', { async: true }) scheduleTemplate;
@attr('date') created_at;
@attr('date') updated_at;

View File

@@ -1,22 +1,51 @@
import Model, { attr, belongsTo } from '@ember-data/model';
/**
* ScheduleTemplate
*
* A reusable recurring shift pattern that a manager can apply to one or many
* drivers. Stores the RRULE (e.g. FREQ=WEEKLY;BYDAY=MO,TU,TH) plus the
* daily start/end times. When applied to a driver's Schedule, the
* ScheduleService materialises ScheduleItem records for the rolling horizon.
*/
export default class ScheduleTemplateModel extends Model {
/** @ids */
@attr('string') public_id;
@attr('string') company_uuid;
@attr('string') subject_uuid;
@attr('string') subject_type;
/** @attributes */
@attr('string') name;
@attr('string') description;
@attr('string') start_time;
@attr('string') end_time;
@attr('number') duration;
@attr('number') break_duration;
@attr('string') rrule;
@attr('string') start_time; // HH:mm — e.g. "08:00"
@attr('string') end_time; // HH:mm — e.g. "16:00"
@attr('string') break_start_time; // HH:mm — e.g. "12:00" (optional)
@attr('string') break_end_time; // HH:mm — e.g. "13:00" (optional)
@attr('number') duration; // computed minutes (end - start)
@attr('number') break_duration; // minutes
@attr('string') rrule; // RFC 5545 RRULE string
@attr('string') color; // hex color for calendar display
@attr('object') meta;
@belongsTo('company') company;
/** @relationships */
@belongsTo('company', { async: true }) company;
/** @dates */
@attr('date') created_at;
@attr('date') updated_at;
@attr('date') deleted_at;
/**
* Parse the RRULE string and return a human-readable summary.
* e.g. "Weekly on Mon, Tue, Thu · 08:0016:00"
*/
get recurrenceSummary() {
if (!this.rrule) return null;
const dayMap = { MO: 'Mon', TU: 'Tue', WE: 'Wed', TH: 'Thu', FR: 'Fri', SA: 'Sat', SU: 'Sun' };
const byday = this.rrule.match(/BYDAY=([^;]+)/);
const days = byday ? byday[1].split(',').map((d) => dayMap[d] || d).join(', ') : '';
const freq = this.rrule.match(/FREQ=(\w+)/);
const freqLabel = freq ? freq[1].charAt(0) + freq[1].slice(1).toLowerCase() : '';
const times = this.start_time && this.end_time ? ` · ${this.start_time}${this.end_time}` : '';
return `${freqLabel} on ${days}${times}`;
}
}

View File

@@ -16,9 +16,14 @@ export default class ScheduleModel extends Model {
@attr('string', { defaultValue: 'draft' }) status;
@attr('object') meta;
/** @materialization tracking */
@attr('date') last_materialized_at;
@attr('number', { defaultValue: 60 }) materialization_horizon_days;
/** @relationships */
@hasMany('schedule-item') items;
@belongsTo('company') company;
@hasMany('schedule-item', { async: true }) items;
@hasMany('schedule-exception', { async: true }) exceptions;
@belongsTo('company', { async: true }) company;
/** @dates */
@attr('date') created_at;

View File

@@ -1,9 +1,8 @@
API_HOST=https://api.fleetbase.io
API_HOST=
API_NAMESPACE=int/v1
API_SECURE=true
SOCKETCLUSTER_PATH=/socketcluster/
SOCKETCLUSTER_HOST=socket.fleetbase.io
SOCKETCLUSTER_HOST=
SOCKETCLUSTER_SECURE=true
SOCKETCLUSTER_PORT=8000
OSRM_HOST=https://router.project-osrm.org
DISABLE_RUNTIME_CONFIG=true
SOCKETCLUSTER_PORT=38000
OSRM_HOST=https://router.project-osrm.org

View File

@@ -1,9 +0,0 @@
API_HOST=https://api.qa.fleetbase.io
API_NAMESPACE=int/v1
API_SECURE=true
SOCKETCLUSTER_PATH=/socketcluster/
SOCKETCLUSTER_HOST=socket.qa.fleetbase.io
SOCKETCLUSTER_SECURE=true
SOCKETCLUSTER_PORT=8000
OSRM_HOST=https://router.project-osrm.org
DISABLE_RUNTIME_CONFIG=true

View File

@@ -33,24 +33,16 @@
},
"dependencies": {
"@ember/legacy-built-in-components": "^0.4.2",
"@fleetbase/aws-marketplace": "^0.0.8",
"@fleetbase/billing-engine": "^0.1.21",
"@fleetbase/customer-portal-engine": "^0.0.10",
"@fleetbase/dev-engine": "^0.2.13",
"@fleetbase/ember-core": "^0.3.18",
"@fleetbase/ember-ui": "^0.3.25",
"@fleetbase/fleetops-data": "^0.1.25",
"@fleetbase/fleetops-engine": "^0.6.38",
"@fleetbase/iam-engine": "^0.1.8",
"@fleetbase/flespi-engine": "^0.1.16",
"@fleetbase/internals-engine": "^0.0.29",
"@fleetbase/leaflet-routing-machine": "^3.2.17",
"@fleetbase/registry-bridge-engine": "^0.1.8",
"@fleetbase/samsara-engine": "^0.0.3",
"@fleetbase/valhalla-engine": "^0.0.3",
"@fleetbase/vroom-engine": "^0.0.3",
"@fleetbase/storefront-engine": "^0.4.14",
"@fleetbase/ledger-engine": "^0.0.1",
"@fleetbase/registry-bridge-engine": "^0.1.8",
"@fleetbase/storefront-engine": "^0.4.14",
"@formatjs/intl-datetimeformat": "^6.18.2",
"@formatjs/intl-numberformat": "^8.15.6",
"@formatjs/intl-pluralrules": "^5.4.6",

1720
console/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff