← back to Sdcc Awards

cypressaward/scraper/all-settlements-combined.js

156 lines

// Combined data from all cy pres settlement sources
// This file merges data from multiple scrapers

const { cyPresAwards } = require('./cypres-awards');
const { twentyMoreCyPresAwards } = require('./twenty-more-cypres-awards');
const { fetchAllRealSettlements } = require('./fetch-real-settlements');

// Convert real settlements to award format
function convertSettlementsToAwards(settlements) {
  return settlements.map(s => ({
    recipient_organization: s.recipients[0], // Use first recipient as main
    amount: s.cypres_amount,
    amount_text: `$${s.cypres_amount.toLocaleString()}`,
    case_name: s.case_name,
    case_year: s.year,
    court: s.court,
    settlement_fund: s.settlement_amount,
    settlement_fund_text: `$${s.settlement_amount.toLocaleString()}`,
    description: s.description,
    source_url: s.source_url,
    all_recipients: s.recipients,
    category: determineCategory(s.case_name, s.description)
  }));
}

function determineCategory(caseName, description) {
  const text = (caseName + ' ' + description).toLowerCase();
  if (text.includes('privacy') || text.includes('data') || text.includes('biometric')) return 'Privacy';
  if (text.includes('consumer') || text.includes('fraud')) return 'Consumer';
  if (text.includes('environment') || text.includes('oil') || text.includes('emission')) return 'Environmental';
  if (text.includes('health') || text.includes('pharma') || text.includes('opioid')) return 'Healthcare';
  if (text.includes('student') || text.includes('education')) return 'Student';
  if (text.includes('employ') || text.includes('wage') || text.includes('overtime')) return 'Employment';
  if (text.includes('securities') || text.includes('investor')) return 'Securities';
  return 'Other';
}

async function getAllCyPresData() {
  // Get original 45 awards
  const original45 = cyPresAwards;
  
  // Get 20 more awards
  const twenty = twentyMoreCyPresAwards;
  
  // Get real settlements (17 more)
  const realSettlements = await fetchAllRealSettlements();
  const realAwards = convertSettlementsToAwards(realSettlements);
  
  // Combine all data
  const allAwards = [...original45, ...twenty, ...realAwards];
  
  // Remove duplicates based on case name
  const uniqueAwards = [];
  const seenCases = new Set();
  
  for (const award of allAwards) {
    const caseKey = award.case_name.toLowerCase().replace(/[^a-z0-9]/g, '');
    if (!seenCases.has(caseKey)) {
      seenCases.add(caseKey);
      uniqueAwards.push(award);
    }
  }
  
  return {
    awards: uniqueAwards,
    stats: {
      totalAwards: uniqueAwards.length,
      totalAmount: uniqueAwards.reduce((sum, a) => sum + a.amount, 0),
      categories: uniqueAwards.reduce((cats, a) => {
        cats[a.category] = (cats[a.category] || 0) + 1;
        return cats;
      }, {}),
      years: uniqueAwards.reduce((years, a) => {
        const year = a.case_year || 2020;
        years[year] = (years[year] || 0) + 1;
        return years;
      }, {})
    }
  };
}

module.exports = {
  getAllCyPresData,
  convertSettlementsToAwards
};

// Export static data for immediate use
const staticCombinedData = {
  awards: [
    ...cyPresAwards,
    ...twentyMoreCyPresAwards,
    // Add key real settlements manually
    {
      recipient_organization: 'Electronic Frontier Foundation',
      amount: 97500000,
      amount_text: '$97,500,000',
      case_name: 'In re Facebook Biometric Information Privacy Litigation',
      case_year: 2021,
      court: 'N.D. Cal.',
      settlement_fund: 650000000,
      settlement_fund_text: '$650,000,000',
      description: 'Settlement for Illinois residents whose biometric data was collected without consent',
      category: 'Privacy'
    },
    {
      recipient_organization: 'Gulf Coast Restoration Trust Fund',
      amount: 8100000000,
      amount_text: '$8,100,000,000',
      case_name: 'United States v. BP (Deepwater Horizon)',
      case_year: 2016,
      court: 'E.D. La.',
      settlement_fund: 20800000000,
      settlement_fund_text: '$20,800,000,000',
      description: 'Largest environmental settlement in US history',
      category: 'Environmental'
    },
    {
      recipient_organization: 'State Opioid Abatement Funds',
      amount: 5000000000,
      amount_text: '$5,000,000,000',
      case_name: 'Multistate v. Johnson & Johnson (Opioid)',
      case_year: 2022,
      court: 'Multiple State Courts',
      settlement_fund: 26000000000,
      settlement_fund_text: '$26,000,000,000',
      description: 'Nationwide opioid crisis settlement',
      category: 'Healthcare'
    },
    {
      recipient_organization: 'EPA Diesel Emissions Reduction Program',
      amount: 2000000000,
      amount_text: '$2,000,000,000',
      case_name: 'FTC v. Volkswagen Group',
      case_year: 2016,
      court: 'N.D. Cal.',
      settlement_fund: 14700000000,
      settlement_fund_text: '$14,700,000,000',
      description: 'Clean diesel emissions fraud settlement',
      category: 'Environmental'
    },
    {
      recipient_organization: 'Investor Protection Trust',
      amount: 150000000,
      amount_text: '$150,000,000',
      case_name: 'In re Petrobras Securities Litigation',
      case_year: 2018,
      court: 'S.D.N.Y.',
      settlement_fund: 3000000000,
      settlement_fund_text: '$3,000,000,000',
      description: 'Largest securities class action settlement',
      category: 'Securities'
    }
  ]
};

module.exports.staticCombinedData = staticCombinedData;