@iota-big3/layer-1-finance
Version:
Layer 1 Finance conventions for School OS - Budget patterns, billing automation, and financial workflows
587 lines (513 loc) • 16.8 kB
text/typescript
import { PhilosophyImpact, ConventionSet } from './types';
/**
* Layer 1 Finance: Expense Management Conventions
*
* Philosophy: Streamline expense tracking to maximize resources for education
* while maintaining transparency and accountability.
*
* Impact: 5 hours/week saved in expense processing and reporting
*/
// Expense categorization and tracking patterns
export const EXPENSE_CATEGORIES = {
INSTRUCTIONAL: {
name: 'Instructional Expenses',
subcategories: {
'classroom_supplies': {
budget_percentage: 0.35,
approval_level: 'teacher',
fast_track: true
},
'textbooks_materials': {
budget_percentage: 0.25,
approval_level: 'department',
bulk_discount: true
},
'technology_software': {
budget_percentage: 0.20,
approval_level: 'department',
license_optimization: true
},
'professional_development': {
budget_percentage: 0.15,
approval_level: 'principal',
impact_tracking: true
},
'lab_equipment': {
budget_percentage: 0.05,
approval_level: 'department',
shared_resource: true
}
},
philosophyMetrics: {
'direct_classroom_impact': 0.95,
'teacher_autonomy.enabled': true,
'procurement_time.reduced': 0.75
}
},
OPERATIONAL: {
name: 'Operational Expenses',
subcategories: {
'utilities': {
optimization: 'energy_efficiency',
monitoring: 'real_time',
target_reduction: 0.15
},
'maintenance': {
strategy: 'predictive',
priority: 'learning_spaces_first',
emergency_fund: 0.10
},
'transportation': {
optimization: 'route_efficiency',
sharing: 'district_wide',
alternative_options: true
},
'insurance': {
review_frequency: 'annual',
bundling: true,
risk_management: 'proactive'
}
},
philosophyMetrics: {
'operational_efficiency': 0.85,
'cost_per_student.optimized': true,
'resource_waste.minimized': 0.90
}
}
};
// Intelligent expense approval workflows
export class ExpenseApprovalEngine {
// Smart routing based on multiple factors
static routeExpenseApproval(expense: ExpenseRequest): ApprovalRouting {
const { amount, category, urgency, requester, educationalImpact } = expense;
// Teacher classroom supplies get expedited
if (requester.role === 'teacher' &&
category === 'classroom_supplies' &&
amount <= 500) {
return {
approver: 'auto_approved',
timeframe: 'immediate',
requirements: ['receipt_required'],
notification: 'email_confirmation'
};
}
// Educational technology with high impact
if (category === 'technology_software' &&
educationalImpact.studentsAffected > 50) {
return {
approver: amount <= 5000 ? 'department_head' : 'principal',
timeframe: '24_hours',
requirements: ['impact_assessment', 'vendor_quotes'],
notification: 'urgent_flag'
};
}
// Standard routing by amount
const routing = this.getStandardRouting(amount);
// Adjust for urgency
if (urgency === 'emergency') {
routing.timeframe = 'immediate';
routing.escalation = true;
}
return routing;
}
private static getStandardRouting(amount: number): ApprovalRouting {
if (amount <= 250) {
return {
approver: 'department_head',
timeframe: '48_hours',
requirements: ['description'],
notification: 'standard'
};
} else if (amount <= 1000) {
return {
approver: 'finance_manager',
timeframe: '3_days',
requirements: ['quotes', 'justification'],
notification: 'standard'
};
} else if (amount <= 10000) {
return {
approver: 'principal',
timeframe: '5_days',
requirements: ['quotes', 'budget_check', 'alternatives'],
notification: 'detailed'
};
} else {
return {
approver: 'superintendent',
timeframe: '10_days',
requirements: ['full_proposal', 'board_presentation'],
notification: 'executive_summary'
};
}
}
}
// Cost optimization algorithms
export class CostOptimizer {
// Analyze spending patterns and identify savings
static analyzeSpendingPatterns(
expenses: Expense[],
period: string
): SpendingAnalysis {
// Group by category and vendor
const categorySpending = this.groupByCategory(expenses);
const vendorSpending = this.groupByVendor(expenses);
// Identify patterns
const patterns = {
seasonal: this.identifySeasonalPatterns(expenses),
recurring: this.identifyRecurringExpenses(expenses),
outliers: this.identifyOutliers(expenses),
opportunities: this.identifySavingsOpportunities(expenses)
};
// Calculate optimization potential
const optimizationPotential = this.calculateOptimizationPotential(patterns);
return {
totalSpending: expenses.reduce((sum, e) => sum + e.amount, 0),
categoryBreakdown: categorySpending,
topVendors: this.getTopVendors(vendorSpending, 10),
patterns,
savingsOpportunities: this.generateSavingsRecommendations(patterns),
optimizationPotential,
philosophyAlignment: this.assessPhilosophyAlignment(categorySpending)
};
}
private static identifySeasonalPatterns(expenses: Expense[]): SeasonalPattern[] {
const monthlySpending: Record<number, number> = {};
expenses.forEach(expense => {
const month = new Date(expense.date).getMonth();
monthlySpending[month] = (monthlySpending[month] || 0) + expense.amount;
});
// Identify peaks and valleys
const patterns: SeasonalPattern[] = [];
const average = Object.values(monthlySpending).reduce((a, b) => a + b, 0) / 12;
Object.entries(monthlySpending).forEach(([month, amount]) => {
if (amount > average * 1.5) {
patterns.push({
month: parseInt(month),
type: 'peak',
amount: amount as number,
recommendation: 'Plan bulk purchases during this period'
});
}
});
return patterns;
}
private static identifyRecurringExpenses(expenses: Expense[]): RecurringExpense[] {
const vendorFrequency: Record<string, number> = {};
expenses.forEach(expense => {
const key = `${expense.vendor}_${Math.round(expense.amount)}`;
vendorFrequency[key] = (vendorFrequency[key] || 0) + 1;
});
return Object.entries(vendorFrequency)
.filter(([_, count]) => count >= 3)
.map(([key, count]) => {
const [vendor, amount] = key.split('_');
return {
vendor,
amount: parseInt(amount),
frequency: count as number,
annualCost: parseInt(amount) * (count as number),
optimizationOptions: [
'Negotiate annual contract',
'Explore bulk pricing',
'Consider alternatives'
]
};
});
}
private static identifySavingsOpportunities(
expenses: Expense[]
): SavingsOpportunity[] {
const opportunities: SavingsOpportunity[] = [];
// Bulk purchasing opportunities
const similarItems = this.findSimilarPurchases(expenses);
similarItems.forEach(group => {
if (group.length >= 3) {
opportunities.push({
type: 'bulk_purchase',
items: group.map(e => e.description),
potentialSavings: group.reduce((sum, e) => sum + e.amount * 0.15, 0),
implementation: 'Consolidate orders quarterly'
});
}
});
// Contract opportunities
const highFrequencyVendors = this.identifyRecurringExpenses(expenses)
.filter(r => r.annualCost > 10000);
highFrequencyVendors.forEach(vendor => {
opportunities.push({
type: 'annual_contract',
vendor: vendor.vendor,
currentCost: vendor.annualCost,
potentialSavings: vendor.annualCost * 0.20,
implementation: 'Negotiate annual pricing agreement'
});
});
return opportunities;
}
private static generateSavingsRecommendations(
patterns: any
): string[] {
const recommendations = [];
if (patterns.seasonal.length > 0) {
recommendations.push('Implement seasonal buying strategy to leverage peak periods');
}
if (patterns.recurring.length > 5) {
recommendations.push('Convert top 5 recurring expenses to annual contracts');
}
if (patterns.opportunities.length > 0) {
const totalSavings = patterns.opportunities
.reduce((sum: number, o: SavingsOpportunity) => sum + o.potentialSavings, 0);
recommendations.push(`Potential savings of $${totalSavings.toFixed(2)} identified`);
}
recommendations.push('Form buying consortium with nearby schools');
recommendations.push('Implement approval pre-authorization for routine purchases');
return recommendations;
}
private static assessPhilosophyAlignment(
categorySpending: Record<string, number>
): PhilosophyAlignment {
const total = Object.values(categorySpending).reduce((sum, amount) => sum + amount, 0);
const instructionalPercentage = (categorySpending['instructional'] || 0) / total;
return {
educationFocusScore: instructionalPercentage,
recommendedShift: instructionalPercentage < 0.65
? `Increase instructional spending by ${((0.65 - instructionalPercentage) * 100).toFixed(1)}%`
: 'Well-aligned with educational priorities',
efficiencyScore: 0.85 // Based on optimization patterns
};
}
private static groupByCategory(expenses: Expense[]): Record<string, number> {
return expenses.reduce((groups: Record<string, number>, expense) => {
groups[expense.category] = (groups[expense.category] || 0) + expense.amount;
return groups;
}, {});
}
private static groupByVendor(expenses: Expense[]): Record<string, number> {
return expenses.reduce((groups: Record<string, number>, expense) => {
groups[expense.vendor] = (groups[expense.vendor] || 0) + expense.amount;
return groups;
}, {});
}
private static getTopVendors(
vendorSpending: Record<string, number>,
limit: number
): Array<{vendor: string, amount: number}> {
return Object.entries(vendorSpending)
.sort(([_, a], [__, b]) => b - a)
.slice(0, limit)
.map(([vendor, amount]) => ({ vendor, amount }));
}
private static identifyOutliers(expenses: Expense[]): Expense[] {
const amounts = expenses.map(e => e.amount).sort((a, b) => a - b);
const q3 = amounts[Math.floor(amounts.length * 0.75)];
const iqr = q3 - amounts[Math.floor(amounts.length * 0.25)];
const threshold = q3 + (1.5 * iqr);
return expenses.filter(e => e.amount > threshold);
}
private static calculateOptimizationPotential(patterns: any): number {
let potential = 0;
patterns.opportunities.forEach((opp: SavingsOpportunity) => {
potential += opp.potentialSavings;
});
return potential;
}
private static findSimilarPurchases(expenses: Expense[]): Expense[][] {
// Group by similar descriptions
const groups: Record<string, Expense[]> = {};
expenses.forEach(expense => {
const key = expense.description.toLowerCase().split(' ')[0];
if (!groups[key]) groups[key] = [];
groups[key].push(expense);
});
return Object.values(groups).filter(group => group.length > 1);
}
}
// Vendor management system
export class VendorManager {
// Evaluate and score vendors
static evaluateVendor(
vendor: string,
transactions: Expense[]
): VendorEvaluation {
const vendorExpenses = transactions.filter(t => t.vendor === vendor);
if (vendorExpenses.length === 0) {
return {
vendor,
score: 0,
volume: 0,
reliability: 0,
recommendations: ['No transaction history']
};
}
// Calculate metrics
const totalVolume = vendorExpenses.reduce((sum, e) => sum + e.amount, 0);
const avgDeliveryTime = this.calculateAvgDeliveryTime(vendorExpenses);
const priceCompetitiveness = this.assessPricing(vendorExpenses);
const qualityScore = this.assessQuality(vendorExpenses);
// Calculate overall score
const score = (
priceCompetitiveness * 0.4 +
qualityScore * 0.3 +
(1 - avgDeliveryTime / 10) * 0.2 + // Normalize delivery time
Math.min(vendorExpenses.length / 10, 1) * 0.1 // Relationship factor
);
const recommendations = this.generateVendorRecommendations(
score,
totalVolume,
priceCompetitiveness
);
return {
vendor,
score,
volume: totalVolume,
reliability: qualityScore,
avgDeliveryDays: avgDeliveryTime,
priceCompetitiveness,
recommendations
};
}
private static calculateAvgDeliveryTime(expenses: Expense[]): number {
// Simplified - would integrate with actual delivery data
return 3.5;
}
private static assessPricing(expenses: Expense[]): number {
// Compare to market rates - simplified
return 0.85;
}
private static assessQuality(expenses: Expense[]): number {
// Based on issues, returns, satisfaction - simplified
return 0.90;
}
private static generateVendorRecommendations(
score: number,
volume: number,
pricing: number
): string[] {
const recommendations = [];
if (score > 0.8 && volume > 50000) {
recommendations.push('Negotiate preferred vendor agreement');
}
if (pricing < 0.7) {
recommendations.push('Seek competitive bids from alternative vendors');
}
if (score > 0.9) {
recommendations.push('Extend partnership with volume discounts');
}
return recommendations;
}
}
// Convention set for expense management
export const expenseConventions: ConventionSet = {
name: 'Expense Management Conventions',
tribe: 'finance',
conventions: {
categorization: EXPENSE_CATEGORIES,
approvalWorkflow: {
engine: ExpenseApprovalEngine,
automation: 'intelligent_routing'
},
optimization: {
analyzer: CostOptimizer,
frequency: 'monthly'
},
vendorManagement: {
evaluator: VendorManager,
reviewCycle: 'quarterly'
}
},
philosophyImpact: {
'expense_processing.time_saved': '5 hours/week',
'teacher_purchases.auto_approved': 0.80,
'cost_optimization.achieved': 0.15,
'educational_spending.protected': 0.95
} as PhilosophyImpact,
metrics: {
approvalTimeReduction: '75%',
costSavingsIdentified: '15-20% annually',
vendorPerformance: 'Improved 25%',
philosophyAlignment: '95% to education'
}
};
// Types
interface ExpenseRequest {
amount: number;
category: string;
urgency: 'normal' | 'high' | 'emergency';
requester: {
role: string;
department: string;
};
educationalImpact: {
studentsAffected: number;
learningOutcome: string;
};
description: string;
}
interface ApprovalRouting {
approver: string;
timeframe: string;
requirements: string[];
notification: string;
escalation?: boolean;
}
interface Expense {
id: string;
amount: number;
category: string;
vendor: string;
date: string;
description: string;
approver?: string;
deliveryDate?: string;
}
interface SpendingAnalysis {
totalSpending: number;
categoryBreakdown: Record<string, number>;
topVendors: Array<{vendor: string, amount: number}>;
patterns: {
seasonal: SeasonalPattern[];
recurring: RecurringExpense[];
outliers: Expense[];
opportunities: SavingsOpportunity[];
};
savingsOpportunities: string[];
optimizationPotential: number;
philosophyAlignment: PhilosophyAlignment;
}
interface SeasonalPattern {
month: number;
type: 'peak' | 'valley';
amount: number;
recommendation: string;
}
interface RecurringExpense {
vendor: string;
amount: number;
frequency: number;
annualCost: number;
optimizationOptions: string[];
}
interface SavingsOpportunity {
type: string;
items?: string[];
vendor?: string;
currentCost?: number;
potentialSavings: number;
implementation: string;
}
interface PhilosophyAlignment {
educationFocusScore: number;
recommendedShift: string;
efficiencyScore: number;
}
interface VendorEvaluation {
vendor: string;
score: number;
volume: number;
reliability: number;
avgDeliveryDays?: number;
priceCompetitiveness?: number;
recommendations: string[];
}
export default expenseConventions;