Preview: creditScoreController.js
Size: 6.32 KB
/home/byroehnu/easepay.easetack.com/controllers/creditScoreController.js
const { prisma } = require('../config/prisma');
const { calculateCreditScore } = require('../utils/creditScoreCalculator');
const getCreditScore = async (req, res) => {
try {
// Get existing credit score
const existingScore = await prisma.creditScore.findFirst({
where: { userId: req.user.id },
orderBy: { createdAt: 'desc' }
});
let creditScore;
const now = new Date();
// If no score exists or score is older than 30 days, calculate new one
if (!existingScore ||
(now - new Date(existingScore.createdAt)) > 30 * 24 * 60 * 60 * 1000) {
// Calculate new credit score
const scoreData = await calculateCreditScore(req.user.id);
// Save new score to database
const newScore = await prisma.creditScore.create({
data: {
userId: req.user.id,
score: scoreData.score,
factors: scoreData.factors,
recommendations: scoreData.recommendations,
paymentHistoryScore: scoreData.paymentHistoryScore,
revenueStabilityScore: scoreData.revenueStabilityScore,
businessAgeScore: scoreData.businessAgeScore,
expenseManagementScore: scoreData.expenseManagementScore
}
});
creditScore = newScore;
} else {
creditScore = existingScore;
}
res.status(200).json({
success: true,
creditScore: {
score: creditScore.score,
factors: creditScore.factors,
recommendations: creditScore.recommendations,
breakdown: {
paymentHistory: creditScore.paymentHistoryScore,
revenueStability: creditScore.revenueStabilityScore,
businessAge: creditScore.businessAgeScore,
expenseManagement: creditScore.expenseManagementScore
},
lastUpdated: creditScore.createdAt
}
});
} catch (error) {
console.error('Get credit score error:', error);
res.status(500).json({
success: false,
message: 'Failed to get credit score'
});
}
};
const getCreditScoreHistory = async (req, res) => {
try {
const { limit = 12 } = req.query;
const history = await prisma.creditScore.findMany({
where: { userId: req.user.id },
orderBy: { createdAt: 'desc' },
take: parseInt(limit),
select: {
score: true,
paymentHistoryScore: true,
revenueStabilityScore: true,
businessAgeScore: true,
expenseManagementScore: true,
createdAt: true
}
});
const scores = history.map(score => ({
score: score.score,
breakdown: {
paymentHistory: score.paymentHistoryScore,
revenueStability: score.revenueStabilityScore,
businessAge: score.businessAgeScore,
expenseManagement: score.expenseManagementScore
},
date: score.createdAt
}));
res.status(200).json({
success: true,
history: scores
});
} catch (error) {
console.error('Get credit score history error:', error);
res.status(500).json({
success: false,
message: 'Failed to get credit score history'
});
}
};
const recalculateCreditScore = async (req, res) => {
try {
// Calculate new credit score
const scoreData = await calculateCreditScore(req.user.id);
// Save new score to database
const newScore = await prisma.creditScore.create({
data: {
userId: req.user.id,
score: scoreData.score,
factors: scoreData.factors,
recommendations: scoreData.recommendations,
paymentHistoryScore: scoreData.paymentHistoryScore,
revenueStabilityScore: scoreData.revenueStabilityScore,
businessAgeScore: scoreData.businessAgeScore,
expenseManagementScore: scoreData.expenseManagementScore
}
});
res.status(200).json({
success: true,
message: 'Credit score recalculated successfully',
creditScore: {
score: newScore.score,
factors: newScore.factors,
recommendations: newScore.recommendations,
breakdown: {
paymentHistory: newScore.paymentHistoryScore,
revenueStability: newScore.revenueStabilityScore,
businessAge: newScore.businessAgeScore,
expenseManagement: newScore.expenseManagementScore
},
lastUpdated: newScore.createdAt
}
});
} catch (error) {
console.error('Recalculate credit score error:', error);
res.status(500).json({
success: false,
message: 'Failed to recalculate credit score'
});
}
};
const getCreditScoreFactors = async (req, res) => {
try {
const factors = {
paymentHistory: {
weight: 35,
description: 'Consistency and timeliness of business transactions',
factors: [
'Regular sales activity',
'Consistent revenue patterns',
'Transaction frequency',
'Business consistency over time'
]
},
revenueStability: {
weight: 30,
description: 'Stability and growth of business revenue',
factors: [
'Monthly revenue consistency',
'Revenue growth trends',
'Seasonal patterns',
'Revenue predictability'
]
},
businessAge: {
weight: 20,
description: 'Length of time in business and account history',
factors: [
'Account age',
'Business establishment date',
'Historical data depth',
'Business maturity indicators'
]
},
expenseManagement: {
weight: 15,
description: 'How well expenses are managed relative to income',
factors: [
'Expense to revenue ratio',
'Expense categorization',
'Cost control efficiency',
'Profit margin maintenance'
]
}
};
res.status(200).json({
success: true,
factors
});
} catch (error) {
console.error('Get credit score factors error:', error);
res.status(500).json({
success: false,
message: 'Failed to get credit score factors'
});
}
};
module.exports = {
getCreditScore,
getCreditScoreHistory,
recalculateCreditScore,
getCreditScoreFactors
};
Directory Contents
Dirs: 1 × Files: 17