← back to Sdcc Awards
cypressaward/scraper/master-awards-list.js
114 lines
const crypto = require('crypto');
// Import all award files
const { comprehensiveCyPresAwards } = require('./comprehensive-awards-crawler');
const { cypresAwardsData } = require('./cypres-awards-crawler');
const { expandedCyPresAwards } = require('./expanded-awards-crawler');
const { twentyMoreCyPresAwards } = require('./twenty-more-cypres-awards');
// Combine all awards
const allAwards = [
...comprehensiveCyPresAwards,
...cypresAwardsData,
...expandedCyPresAwards,
...twentyMoreCyPresAwards
];
// Remove duplicates based on hash
const uniqueAwards = [];
const seenHashes = new Set();
allAwards.forEach(award => {
if (!award.hash) {
const uniqueString = `${award.recipient_organization}-${award.case_name}-${award.amount}`;
award.hash = crypto.createHash('md5').update(uniqueString).digest('hex');
}
if (!seenHashes.has(award.hash)) {
seenHashes.add(award.hash);
uniqueAwards.push(award);
}
});
// Sort by date (newest first) then by organization name
uniqueAwards.sort((a, b) => {
const dateA = new Date(a.date_awarded);
const dateB = new Date(b.date_awarded);
if (dateB.getTime() !== dateA.getTime()) {
return dateB.getTime() - dateA.getTime();
}
return a.recipient_organization.localeCompare(b.recipient_organization);
});
console.log('═'.repeat(80));
console.log('🏆 MASTER CY PRES AWARDS DATABASE');
console.log('═'.repeat(80));
console.log(`\n📊 Summary Statistics:`);
console.log(` Total Awards (before deduplication): ${allAwards.length}`);
console.log(` Unique Awards: ${uniqueAwards.length}`);
console.log(` Duplicates Removed: ${allAwards.length - uniqueAwards.length}`);
// Calculate total amount
const totalAmount = uniqueAwards.reduce((sum, award) => sum + award.amount, 0);
console.log(` Total Amount Distributed: $${totalAmount.toLocaleString()}`);
// Count by year
const yearCounts = {};
uniqueAwards.forEach(award => {
const year = award.year || new Date(award.date_awarded).getFullYear();
yearCounts[year] = (yearCounts[year] || 0) + 1;
});
console.log(`\n📅 Awards by Year:`);
Object.entries(yearCounts)
.sort((a, b) => b[0] - a[0])
.forEach(([year, count]) => {
console.log(` ${year}: ${count} awards`);
});
// Top recipients by amount
console.log(`\n💰 Top 10 Recipients by Amount:`);
uniqueAwards
.sort((a, b) => b.amount - a.amount)
.slice(0, 10)
.forEach((award, index) => {
console.log(` ${index + 1}. ${award.recipient_organization}: ${award.amount_text}`);
console.log(` Case: ${award.case_name}`);
});
// Count by court
const courtCounts = {};
uniqueAwards.forEach(award => {
if (award.court) {
courtCounts[award.court] = (courtCounts[award.court] || 0) + 1;
}
});
console.log(`\n⚖️ Top Courts by Number of Awards:`);
Object.entries(courtCounts)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.forEach(([court, count]) => {
console.log(` ${court}: ${count} awards`);
});
// Export for use in other scripts
module.exports = {
allCyPresAwards: uniqueAwards,
totalCount: uniqueAwards.length,
totalAmount: totalAmount
};
// Display all awards
console.log(`\n📋 Complete List of ${uniqueAwards.length} Unique Awards:`);
console.log('─'.repeat(80));
uniqueAwards.forEach((award, index) => {
console.log(`\n${index + 1}. ${award.recipient_organization}`);
console.log(` Amount: ${award.amount_text}`);
console.log(` Case: ${award.case_name}`);
console.log(` Court: ${award.court}`);
console.log(` Date: ${award.date_awarded}`);
console.log(` Purpose: ${award.purpose.substring(0, 100)}${award.purpose.length > 100 ? '...' : ''}`);
});