PlanSolve is still in pre-alpha – Features may change or break. Feedback welcome!
JavaScript/TypeScript SDK
Official JavaScript and TypeScript SDK for the Shift Assignment Solver. Full TypeScript support with promise-based API and comprehensive error handling.
Installation
Package Installation
npm
npm install @plansolve/shift-solver
yarn
yarn add @plansolve/shift-solver
pnpm
pnpm add @plansolve/shift-solver
Basic Example
Simple Shift Assignment
import { ShiftSolver } from '@plansolve/shift-solver';
const solver = new ShiftSolver({
apiKey: 'your-api-key-here'
});
const request = {
name: "Hospital Shift Assignment",
description: "Weekly shift assignment for hospital staff",
contracts: [
{
name: "FULL_TIME",
max: "PT40H",
min: "PT32H",
maxConsecutiveWorkDays: 5
}
],
shifts: [
{
name: "morning_shift",
from: "2024-01-15T06:00:00",
to: "2024-01-15T14:00:00",
skills: ["nursing", "patient_care"],
value: 3
}
],
employees: [
{
name: "Alice Johnson",
contract: "FULL_TIME",
skills: ["nursing", "patient_care", "emergency"],
availability: ["2024-01-15"]
}
]
};
try {
const result = await solver.solve(request);
console.log('Optimization completed:', result);
} catch (error) {
console.error('Optimization failed:', error);
}
Advanced Examples
Skill-Based Assignment
Advanced Skills Matching
const request = {
// ... basic setup
shifts: [
{
name: "emergency_shift",
from: "2024-01-15T22:00:00",
to: "2024-01-16T06:00:00",
skills: ["emergency", "critical_care"],
value: 2,
priority: 1
}
],
employees: [
{
name: "Dr. Smith",
contract: "FULL_TIME",
skills: ["emergency", "critical_care", "surgery"],
availability: ["2024-01-15"],
preference: ["emergency_shift"]
},
{
name: "Nurse Johnson",
contract: "PART_TIME",
skills: ["nursing", "patient_care"],
availability: ["2024-01-15"]
}
],
weights: {
requiredSkills: 1000,
shiftPreferences: 100,
workloadBalance: 50
}
};
Fairness Rules
Workload Distribution
const request = {
// ... basic setup
fairness: {
fairnessBuckets: [
{
employees: ["Alice", "Bob", "Carol"],
shifts: ["night_shift", "weekend_shift"],
maxAssignments: 2
}
],
workloadDistribution: {
targetHoursPerEmployee: 40,
tolerance: 4
}
}
};
Contract Compliance
Multiple Contract Types
const request = {
// ... basic setup
contracts: [
{
name: "FULL_TIME",
max: "PT40H",
min: "PT32H",
maxConsecutiveWorkDays: 5,
maxShiftsDay: 1,
minRestBetweenShifts: "PT11H",
maxWorkingDays: 5
},
{
name: "PART_TIME",
max: "PT24H",
min: "PT16H",
maxConsecutiveWorkDays: 3,
maxShiftsDay: 1,
minRestBetweenShifts: "PT11H",
maxWorkingDays: 3
}
]
};
API Patterns
Async/Await vs Promises
Both Patterns Supported
// Async/await pattern
const solveAsync = async () => {
try {
const result = await solver.solve(request);
return result;
} catch (error) {
if (error.code === 'RATE_LIMIT_EXCEEDED') {
// Wait and retry
await new Promise(resolve => setTimeout(resolve, 60000));
return await solver.solve(request);
}
throw error;
}
};
// Promise pattern
solver.solve(request)
.then(result => {
console.log('Success:', result);
})
.catch(error => {
console.error('Error:', error);
});
Error Handling
Comprehensive Error Handling
try {
const result = await solver.solve(request);
} catch (error) {
switch (error.code) {
case 'VALIDATION_ERROR':
console.error('Invalid request:', error.details);
break;
case 'INSUFFICIENT_CREDITS':
console.error('Not enough credits:', error.remaining);
break;
case 'RATE_LIMIT_EXCEEDED':
console.error('Rate limit exceeded, retry in:', error.retryAfter);
break;
default:
console.error('Unexpected error:', error.message);
}
}
TypeScript Support
Full Type Definitions
Complete TypeScript definitions for all request parameters, response types, and error objects.
IntelliSense Support
Full autocomplete and type checking in modern IDEs like VS Code, WebStorm, and others.
Generic Types
Flexible generic types for custom data structures and extended functionality.
Ready to Get Started?
Install the package and start building optimized shift assignments into your JavaScript or TypeScript application.