PHP 8.2.30
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

Name Size Perms Modified Actions
- drwxr-xr-x 2026-03-20 23:25:48
Edit Download
127 B lr--r--r-- 2026-03-14 01:49:22
Edit Download
15.34 KB lrw-r--r-- 2026-02-19 22:06:47
Edit Download
30.77 KB lrw-r--r-- 2026-03-04 06:33:18
Edit Download
62.98 KB lrw-r--r-- 2026-03-01 23:46:52
Edit Download
10.79 KB lrw-r--r-- 2026-02-07 16:28:16
Edit Download
14.17 KB lrw-r--r-- 2026-02-27 04:02:38
Edit Download
6.32 KB lrw-r--r-- 2026-02-06 17:10:19
Edit Download
15.13 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
8.50 KB lrw-r--r-- 2026-03-01 05:05:52
Edit Download
12.15 KB lrw-r--r-- 2026-02-27 04:02:38
Edit Download
25.39 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
17.61 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
6.45 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
2.33 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
12.78 KB lrw-r--r-- 2026-02-21 08:13:30
Edit Download
9.96 KB lrw-r--r-- 2026-03-01 05:05:51
Edit Download
8.51 KB lrw-r--r-- 2026-02-20 19:31:28
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).