perl实例

#!/opt/perl/5.8.0/bin/perl
#ident "%W%"

$run_time = &timestamp();

#$asof = substr($run_time, 0, 8);
$asof = $ARGV[0];
$default_stale_cutoff = $ARGV[1];
$default_stale_cutoff = 30 if $default_stale_cutoff <= 0;


$light_yellow="#FFFF88";
$light_red="#FC8E8E";
$orange="#FFA500";

$emct_subord_map->{"SENIOR_UNSECURED"} = "sen";
$emct_subord_map->{"SENIOR_SECURED"} = "sensec";
$emct_subord_map->{"SUBORDINATE"} = "sub";

$ca_subord_map->{"SENIOR_UNSECURED"} = "sen";
$ca_subord_map->{"SENIOR_SECURED"} = "sensec";
$ca_subord_map->{"SUBORDINATE"} = "sub";

$tennor_map->{"3M"} = "3M";
$tennor_map->{"6M"} = "6M";
$tennor_map->{"1Y"} = "1Y";
$tennor_map->{"2Y"} = "2Y";
$tennor_map->{"3Y"} = "3Y";
$tennor_map->{"4Y"} = "4Y";
$tennor_map->{"5Y"} = "5Y";
$tennor_map->{"7Y"} = "7Y";
$tennor_map->{"10Y"} = "10Y";
$tennor_map->{"15Y"} = "15Y";
$tennor_map->{"20Y"} = "20Y";
$tennor_map->{"30Y"} = "30Y";


# load excluded list
$basedir = $ENV{"GCDR_BASEDIR"};
open(EX_FILE, "< $basedir/config/excluded.txt");
print "open file $basedir/config/excluded.txt\n";
while ($line = <EX_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^\|exclude_type\s*\|ticker\s*\|reason\s*\|/)
{next;}
($dummy,
$excluded_type,
$ticker,
$reason) = split (/\s*\|\s*|\|/, $line);

$excluded_list->{$excluded_type}->{$ticker} = $reason;
}
close(EX_FILE);

open(MAP_FILE, "< subord_map_$asof.txt");
while ($line = <MAP_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^\|code\s*\|name\s*\|/)
{next;}
($dummy,
$code,
$name) = split (/\s*\|\s*|\|/, $line);

$subord_map->{$code} = $name;
}
close(MAP_FILE);

open(MAP_FILE, "< curve_type_map_$asof.txt");
while ($line = <MAP_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^\|type\s*\|name\s*\|/)
{next;}
($dummy,
$type,
$name) = split (/\s*\|\s*|\|/, $line);
$curve_type_map->{$type} = $name;
}
close(MAP_FILE);

open(MAP_FILE, "< desk_map_$asof.txt");
while ($line = <MAP_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^\|owner_code\s*\|label\s*\|/)
{next;}
($dummy,
$desk,
$label) = split (/\s*\|\s*|\|/, $line);
$desk_map->{$desk} = $label;
}
close(MAP_FILE);

open(MAP_FILE, "< sector_map_$asof.txt");
while ($line = <MAP_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^\|sector_id\s*\|owner_code\s*\|label\s*\|/)
{next;}
($dummy,
$sector_id, $desk, $label) = split (/\s*\|\s*|\|/, $line);
$sector_map->{$sector_id}->{desk} = $desk;
$sector_map->{$sector_id}->{label} = $label;
}
close(MAP_FILE);

open(USER_FILE, "< user_file_${asof}.txt");
while ($line = <USER_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^username/)
{next;}
($dummy, $user_id, $name) = split (/\s*\|\s*|\|/, $line);

$username_map->{$user_id} = $name;
}
close(USER_FILE);

open(ISSUER_FILE, "< issuer_map_${asof}.txt");
while ($line = <ISSUER_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^issuer_id/)
{next;}
($dummy, $issuer_id, $ticker, $name, $sector_id) = split (/\s*\|\s*|\|/, $line);

$issuer_sector_map->{$issuer_id} = $sector_id;
}
close(ISSUER_FILE);

open(SNAP_FILE, "< stale_snapshot_${asof}.txt");
while ($line = <SNAP_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^curve_id/)
{next;}
($curve_id, $last_date) = split (/\s*\|\s*|\|/, $line);

$last_change_date->{$curve_id} = $last_date;
}
close(SNAP_FILE);

open(BLOTTER_FILE, "< blotter_file_${asof}.txt");
while ($line = <BLOTTER_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
if ($line =~ /^instrument_id/)
{next;}
($dummy, $curve_id, $owner_code) = split (/\s*\|\s*|\|/, $line);

$blotter_id_sector_map->{$curve_id} = $owner_code;
}
close(BLOTTER_FILE);

open(CURVE_FILE, "< GCDR.curves_${asof}_1830.revised") or print "Cannot open GCDR.curves_${asof}_1830.revised\n";
while ($line = <CURVE_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^issuerName\|issuerShortCode/)
{next;}
($issuerName, $issuerShortCode, $curveCurrency, $curveSubord, $docClause, $curveId, $curveSource, $curveRecovery, $countryName, $issuerId, $curveLastModTime,
$curveRollType, $curveMaturity, $countryIsoCode, $curveType, $curveStatus, $moodyIndustry, $moodyRating, $moodyWatch, $snpRating,
$snpWatch, $moodyOutlook, $snpOutlook, $isin, $cbCurveId, $sourceLabel, $curveExternalName,
$curvePath, $curveShortCode, $curveEnteredUser, $issuerLegalName) = split (/\s*\|\s*|\|/, $line);

if ($curveStatus ne "ok") {next;}

#AP
$gcdr_curves->{$issuerShortCode}->{$curveCurrency}->{$curveSubord}->{$docClause}->{$curveType}->{$curveSource} = $curveId;

if ($curveSource eq "pc") {
$pc_map_list->{$issuerShortCode}->{$curveCurrency}->{$curveSubord}->{$docClause}->{$curveType} = $curveId;

$issuer_map->{$curveId}->{ticker} = $issuerShortCode;
$issuer_map->{$curveId}->{subord} = $curveSubord;
$issuer_sector_id = $issuer_sector_map->{$issuerId};
$ticker_sector_map->{$issuerShortCode} = &get_sector_label($issuer_sector_id);
} elsif ($curveExternalName ne "NULL") {
$src_id_to_name->{$curveId} = $curveExternalName;
$src_name_to_ticker->{$curveSource}->{$curveExternalName} = $issuerShortCode;
$src_name_to_subord->{$curveSource}->{$curveExternalName} = $curveSubord;
}

if ($curveSource eq "blotter") {
$src_id_to_name->{$curveId} = $curveShortCode;
}
}
close(CURVE_FILE);

open(CURVE_FILE, "< GCDR.curves_${asof}_1830.revised");
while ($line = <CURVE_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^issuerName\|issuerShortCode/)
{next;}
($issuerName, $issuerShortCode, $curveCurrency, $curveSubord, $docClause, $curveId, $curveSource, $curveRecovery, $countryName, $issuerId, $curveLastModTime,
$curveRollType, $curveMaturity, $countryIsoCode, $curveType, $curveStatus, $moodyIndustry, $moodyRating, $moodyWatch, $snpRating,
$snpWatch, $moodyOutlook, $snpOutlook, $isin, $cbCurveId, $sourceLabel, $curveExternalName,
$curvePath, $curveShortCode, $curveEnteredUser, $issuerLegalName) = split (/\s*\|\s*|\|/, $line);

if ($curveStatus ne "ok") {next;}

if ($curveSource ne "pc" && $curveExternalName ne "NULL") {
$prc_curve_id = $pc_map_list->{$issuerShortCode}->{$curveCurrency}->{$curveSubord}->{$docClause}->{$curveType};
$src_name_to_pc_id->{$curveSource}->{$curveExternalName} = $prc_curve_id;
}
}
close(CURVE_FILE);

open(LEVEL_FILE, "< GCDR.levels_${asof}_1830.roll");
while ($line = <LEVEL_FILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^curve_id\|roll/)
{next;}
($curve_id, $roll, $type, $tag, $roll_date, $date, $maturity, $maturity_string, $bid, $ask, $entered_date, $entered_user) = split (/\s*\|\s*|\|/, $line);

if ($type eq "close" && $tag eq "") {
$last_close_date->{$curve_id} = $date;
$last_close_user->{$curve_id} = $entered_user;

#AP - load mid levels
$gcdr_levels->{$curve_id}->{$tennor_map->{$maturity_string}} = ($bid + $ask)/2;
#print "$curve_id|$tennor_map->{$maturity_string}|$gcdr_levels->{$curve_id}->{$tennor_map->{$maturity_string}}\n";
}
}
close(LEVEL_FILE);

open (PCFILE, "< pc_file_$asof.txt");
while ($line = <PCFILE>)
{
chomp($line);

# remove heading etc
if ($line =~ /curve_id\b|^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}

($dummy,
$prc_curve_id,
$prc_source,
$prc_ref_id
) = split (/\s*\|\s*|\|/, $line);

$pc_source_map->{$prc_curve_id} = $prc_source;
$pc_ref_id_map->{$prc_curve_id} = $prc_ref_id;
}
close (PCFILE);

open(PT_FILE, "< curves.csv_$asof");
while (<PT_FILE>) {
chomp;
($creditRiskId,
$issuerId,
$curveId,
$issuerNameAndSubord,
$date,
$currency,
$frequency,
$daycount,
$calendar,
$rollingConvention,
$industry,
$recovery,
$accrue,
$numPoints,
@levels) = split /,/;

$recovery *= 100.0 if $recovery != 0;

# if (defined($recovery)) {
$pt_recovery_list->{$curveId}->{$recovery} = $curveId;
# }

$prc_ticker = $issuer_map->{$curveId}->{ticker};
$prc_subord = $issuer_map->{$curveId}->{subord};
$pt_rating_list->{$prc_ticker}->{$prc_subord}->{"//"} = $curveId;

for ($i = 0; $i < $numPoints; $i++) {
$t_str = $levels[2 * $i];
$l = $levels[2 * $i + 1];
if ($t_str =~ /(\d+)Y\b/) {
$t = $1 . ".000000";
$pt_level_list->{$curveId}->{$t} = $l;
} elsif ($t_str =~ /(\d+)M\b/) {
$t = sprintf("%8.6f", $1 / 12.0);
$pt_level_list->{$curveId}->{$t} = $l;
}
}
}
close(PT_FILE);

@storm_trade_files = `ls mkt_tmapp_NY_STORM.*$asof*`;
foreach $storm_trade_file (@storm_trade_files) {
$storm_db = "";
open(STORM_TRADE_FILE, "< $storm_trade_file");
while ($line = <STORM_TRADE_FILE>) {
if ($line =~ /^#/) {
if ($line =~ /\|DATABASE=(\w+)\|/) {
$storm_db = $1;
}
} else {
chomp($line);

($storm_trade_id,
$oasys_id,
$type,
$description,
$curve) = split (/\|/, $line);

$storm_active_list->{"$storm_db/$curve"}->{$type} += 1;
}
}
close(STORM_TRADE_FILE);
}


open(GK_FILE, "< gk_curve_$asof.txt");
while (<GK_FILE>) {
chomp;
@fields = split /\s*\|\s*|\|/;
if ($fields[4] =~ /^Z/ && $fields[25] =~ /Default Swap/ && defined($fields[22]) && $fields[20] ne "") {
$gk_curve = "$fields[7]/$fields[20]";
$gk_recovery = $fields[22];
$prc_curve_id = $src_name_to_pc_id->{"gk"}->{$gk_curve};
if (defined($prc_curve_id)) {
$gk_recovery_list->{$prc_curve_id}->{$gk_recovery} = $gk_curve;
} else {
# Unmapped GK curve
}
}
}
close(GK_FILE);

open (STORM_FILE, "< storm_curves_$asof.txt");
while ($line = <STORM_FILE>)
{
chomp($line);

# remove heading etc
if ($line =~ /source\b|^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
($dummy,
$storm_db,
$storm_curve,
$storm_recovery,
$storm_mdy,
$storm_snp) = split (/\s*\|\s*|\|/, $line);

$storm_recovery = "" if $storm_recovery eq "NULL";
# Rating
##$storm_mdy = "-" if $storm_mdy =~ /^N|^\s*$/;
##$storm_snp = "-" if $storm_snp =~ /^N|^\s*$/;
$storm_mdy = "-" if $storm_mdy =~ /^NotRa|^\s*$/;
$storm_snp = "-" if $storm_snp =~ /^NotRa|^\s*$/;
$prc_curve_id = $src_name_to_pc_id->{"storm"}->{$storm_curve};
$prc_ticker = $src_name_to_ticker->{"storm"}->{$storm_curve};
$prc_subord = $src_name_to_subord->{"storm"}->{$storm_curve};

if (defined($storm_active_list->{"$storm_db/$storm_curve"})) {
$storm_recovery_list->{$prc_curve_id}->{$storm_recovery} = "$storm_db/$storm_curve";
$storm_rating_list->{$prc_ticker}->{$prc_subord}->{"$storm_snp/$storm_mdy/"} = "$storm_db/$storm_curve";
}

$all_storm_recovery_list->{$storm_curve}->{$storm_db} = $storm_recovery;
$all_storm_db_list->{$storm_db} = 1;
}
close(STORM_FILE);

open (MARKIT_FILE, "< markit_file_$asof.txt");

while ($line = <MARKIT_FILE>)
{
chomp($line);

# remove heading etc
if ($line =~ /instrument_id\b|^(-|\s|\|)*$|^\(.*rows affected\)$|^\(return status =.*\)$/)
{next;}
($dummy,
$markit_curve,
$markit_recovery,
$prc_curve_id,
$markit_composite) = split (/\s*\|\s*|\|/, $line);

$markit_recovery = "" if $markit_recovery eq "NULL";
$markit_curve = "" if $markit_curve eq "NULL";

$markit_composite = "" if $markit_composite eq "NULL";
$markit_composite *= 100.0 if $markit_composite != 0;

$markit_recovery_list->{$prc_curve_id}->{$markit_recovery} = $markit_curve;
$markit_comp_list->{$prc_curve_id}->{$markit_recovery} = $markit_composite;
}
close(MARKIT_FILE);

@emct_trade_files = `ls EMCT.*.$asof`;

foreach $emct_file (@emct_trade_files) {
read_emct_file($emct_file);
}

$emct_recovery_list = &read_calypso_curve_file("EMCTCurveRecoveryRate_${asof}.txt", $emct_curve_list);

@calypso_trade_files = `ls solarfeed.*.$asof`;

foreach $calypso_file (@calypso_trade_files) {
read_calypso_file($calypso_file);
}

$ca_recovery_list = &read_calypso_curve_file("FlowCurveRecoveryRate_${asof}.txt", $ca_curve_list);

open (CFILE, "< GCDR.curves_${asof}_1830.revised");
open (UFILE, "> pc_usage.csv");
open (UMAP_FILE, "> calypso_umapped.txt");
open (EUMAP_FILE, "> emct_umapped.txt");
while ($line = <CFILE>)
{
chomp($line);
# remove heading etc
if ($line =~ /^issuerName\|issuerShortCode/)
{next;}
($issuerName, $issuerShortCode, $curveCurrency, $curveSubord, $docClause, $curveId, $curveSource, $curveRecovery, $countryName, $issuerId, $curveLastModTime,
$curveRollType, $curveMaturity, $countryIsoCode, $curveType, $curveStatus, $moodyIndustry, $moodyRating, $moodyWatch, $snpRating,
$snpWatch, $moodyOutlook, $snpOutlook, $isin, $cbCurveId, $sourceLabel, $curveExternalName,
$curvePath, $curveShortCode, $curveEnteredUser, $issuerLegalName) = split (/\s*\|\s*|\|/, $line);

if ($curveStatus ne "ok") {next;}

if ($curveSource eq "pc") {
#print "Processing PC ".$curveId;
process_recovery($curveId, $issuerId, $issuerName, $issuerShortCode, $curveCurrency, $curveSubord, $docClause, $curveType, $curveRecovery)
}
}

close (CFILE);
close (UFILE);

foreach $emct_curve (sort keys %$emct_cr01_list) {
print EUMAP_FILE "$emct_curve,$emct_cr01_list->{$emct_curve}\n";
}
close (EUMAP_FILE);

foreach $ca_curve (sort keys %$ca_cr01_list) {
print UMAP_FILE "$ca_curve,$ca_cr01_list->{$ca_curve}\n";
}
close (UMAP_FILE);

@all_storm_db = sort keys %$all_storm_db_list;

open(OFILE, "> recovery_recon.${asof}.xls");
open(OSFILE, "> storm_recon.${asof}.xls");

print OFILE <<EOF;
<html>
<head>
<title>Recovery Recon Report</title>
</head>
<body>
<p>Report Date: $asof</p>
EOF

print OSFILE <<EOF;
<html>
<head>
<title>Storm Recon Report</title>
</head>
<body>
<p>Report Date: $asof</p>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="$light_yellow"><b>Action</b></td>
<td bgcolor="$light_yellow"><b>Owner</b></td>
<td bgcolor="$light_yellow"><b>Marx Ticker</b></td>
<td bgcolor="$light_yellow"><b>Marx Issuer Name</b></td>
<td bgcolor="$light_yellow"><b>CCY</b></td>
<td bgcolor="$light_yellow"><b>Subord</b></td>
<td bgcolor="$light_yellow"><b>Doc Clause</b></td>
<td bgcolor="$light_yellow"><b>Type</b></td>
<td bgcolor="$light_yellow"><b>Pricing Source</b></td>
<td bgcolor="$light_yellow"><b>Pricing Curve ID</b></td>
<td bgcolor="$light_yellow"><b>Marx Recovery</b></td>
<td bgcolor="$light_yellow"><b>Storm Curve</b></td>
EOF

foreach $storm_db (@all_storm_db) {
print OSFILE <<EOF;
<td bgcolor="$light_yellow"><b>$storm_db</b></td>
EOF
}

print OSFILE " </tr>\n";

open(SUM_FILE, "> summary_$asof.txt");

print_recovery_report("Recovery Rate Reconciliation Report", \@recovery_recon_report, 0);

print_mismatch_summary("Recovery Rate Reconciliation Report");

print_recovery_report("Zero Recovery in Marx", \@zero_report, 1);

print_recovery_report("Senior Unsecured Recovery not Valid in Marx", \@senior_not_40_report, 1);

print_recovery_report("Subordinated Recovery not Valid in Marx", \@sub_not_25_report, 1);

print_excluded_report(\@recovery_excluded_report, "recovery");

close(SUM_FILE);

print OFILE <<EOF;
</body>
</html>
EOF

print OSFILE <<EOF;
</table>
</body>
</html>
EOF

close (OFILE);
close (OSFILE);

open(SUM_FILE, "> stale_summary_$asof.txt");
print_stale_report(\@stale_report);

print_excluded_report(\@stale_excluded_report, "stale");
close(SUM_FILE);

print_prod_cntrl_report(\@stale_report_prod_ctrl);

open (RFILE, "< GCDR.issuer_ratings.data.$asof");
while ($line = <RFILE>) {
chomp($line);
if ($line =~ /^issuer_id\|ticker/)
{next;}

($issuer_id, $ticker, $name, $equity_ticker, $red, $country, $region, $industry, $sub, $subord, $mdy_rating, $snp_rating, $rni_rating, $fch_rating,
$mdy_watch, $snp_watch, $rni_watch, $fch_watch, $issuer_type) = split (/\s*\|\s*|\|/, $line);

process_rating($ticker, $name, $equity_ticker, $red, $sub, $subord, $snp_rating, $mdy_rating, $fch_rating);
}
close(RFILE);

open(SUM_FILE, "> rating_summary_$asof.txt");

open(SFILE, "> rating_recon.${asof}.xls");
print SFILE <<EOF;
<html>
<head>
<title>Issuer Rating Report</title>
</head>
<body>
<p>Report Date: $asof</p>
EOF
###print_rating_report("Issuer Rating Recon Report", \@rating_report);
print_rating_report("Missing rating everywhere", \@blank_rating_report2);
print_rating_report("Missing rating in Marx but present in another", \@blank_rating_report1);
print_rating_report("Rating Mismatch", \@rating_report);
print SFILE <<EOF;
</body>
</html>
EOF
close (SFILE);
print_rating_excluded_report(\@rating_excluded_report, "rating");
close(SUM_FILE);

###########################################################################

sub read_emct_file() {
my($fname) = @_;

open(EMCT_FILE, "< $fname") or return;

while (<EMCT_FILE>) {
@fields = split /\|/;
if ($fields[0] !~ /^\*/) {
$ops_file = $fields[4];
$firm_acct = $fields[10];
$trade_type = $fields[11];
$ticker = $fields[17];
$subord = $fields[18];
$snp= $fields[19];
$mdy = $fields[20];
$fch= $fields[21];
$term_date = $fields[23];
$emct_curve = $fields[42];
$emct_recovery = $fields[43];
$ccy = $fields[45];
$cr01 = $fields[76];
$dv01 = $fields[77];
$rr01 = $fields[80];

if ($emct_curve ne "") {
$emct_cr01_list->{"$emct_curve,$firm_acct"} += $cr01;
$emct_rr01_list->{"$emct_curve,$firm_acct"} += $rr01;
} elsif ($cr01 != 0.0) {
# print "No Curve: $ticker, $cr01\n";
}

if ($trade_type eq "CreditDefaultSwap" && $term_date eq "" &&
$emct_curve =~ /^(\S+)-pc-(.+)$/) {
@tail = split /-/, $emct_curve;
$prc_curve_id = $tail[-1];
if ($prc_curve_id ne "") {
#$curve_recovery = $emct_curve_recovery_list->{$prc_curve_id};
#if (!defined($curve_recovery)) {
# $curve_recovery = $emct_recovery;
#}
#$emct_recovery_list->{$prc_curve_id}->{$curve_recovery} = $emct_curve;
$emct_curve_list->{$prc_curve_id} = $emct_curve;

# Rating
#$mdy = "-" if $mdy =~ /^N|^W|^\s*$/;
#$snp = "-" if $snp =~ /^N|^W|^\s*$/;
#$fch = "-" if $fch =~ /^N|^W|^\s*$/;
$emct_rating_list->{$ticker}->{$emct_subord_map->{$subord}}->{"$snp/$mdy/$fch"} = $emct_curve;

}
}
}
}
close(EMCT_FILE);
}

sub read_calypso_file() {
my($fname) = @_;

open(CA_FILE, "< $fname") or return;

while (<CA_FILE>) {
@fields = split /\|/;
if ($fields[0] !~ /^\*/) {
$ops_file = $fields[4];
$firm_acct = $fields[10];
$trade_type = $fields[11];
$ticker = $fields[17];
$subord = $fields[18];
$snp= $fields[19];
$mdy = $fields[20];
$fch= $fields[21];
$term_date = $fields[23];
$ca_curve = $fields[42];
$ca_recovery = $fields[43];
$ccy = $fields[45];
$cr01 = $fields[76];
$dv01 = $fields[77];
$rr01 = $fields[80];

if ($ca_curve ne "") {
$ca_cr01_list->{"$ca_curve,$firm_acct"} += $cr01;
$ca_rr01_list->{"$ca_curve,$firm_acct"} += $rr01;
} elsif ($cr01 != 0.0) {
# print "No Curve: $ticker, $cr01\n";
}

if ($trade_type eq "CreditDefaultSwap" && $term_date eq "" &&
$ca_curve =~ /^(\S+)-pc-(.+)$/) {
# AMCOR-pc-USD-SEN-MR-19965
# 03072STM7-pc-USD-SEN-mbs-64213
# 437084CE4-pc-USD-SEN-mbs-NA-71570
@tail = split /-/, $ca_curve;
$prc_curve_id = $tail[-1];
if ($prc_curve_id ne "") {
#$curve_recovery = $ca_curve_recovery_list->{$prc_curve_id};
#if (!defined($curve_recovery)) {
# $curve_recovery = $ca_recovery;
#}
#$ca_recovery_list->{$prc_curve_id}->{$curve_recovery} = $ca_curve;
$ca_curve_list->{$prc_curve_id} = $ca_curve;

# Rating
#$mdy = "-" if $mdy =~ /^N|^W|^\s*$/;
#$snp = "-" if $snp =~ /^N|^W|^\s*$/;
#$fch = "-" if $fch =~ /^N|^W|^\s*$/;
$ca_rating_list->{$ticker}->{$ca_subord_map->{$subord}}->{"$snp/$mdy/$fch"} = $ca_curve;

}
}
}
}
close(CA_FILE);
}


sub read_calypso_curve_file() {
my($fname, $curve_list) = @_;
my($curve_recovery_list) = {};

open(CA_FILE, "< $fname") or return;

while ($line = <CA_FILE>) {
chomp($line);
if ($line =~ /^ticker_name\|/)
{next;}
my ($ca_curve, $ca_recovery) = split(/\|/, $line);
if ($ca_curve =~ /^(\S+)-pc-(.+)$/) {
# AMCOR-pc-USD-SEN-MR-19965
# 03072STM7-pc-USD-SEN-mbs-64213
# 437084CE4-pc-USD-SEN-mbs-NA-71570
@tail = split /-/, $ca_curve;
$prc_curve_id = $tail[-1];
if ($prc_curve_id ne "") {
$ca_curve = $curve_list->{$prc_curve_id};
if (defined($ca_curve)) {
$curve_recovery = $ca_recovery*100.0;
$curve_recovery_list->{$prc_curve_id}->{$curve_recovery} = $ca_curve;
}
}
}
}
close(CA_FILE);
return $curve_recovery_list;
}


sub print_recovery_report() {
my($rpt_title, $rpt, $print_sector_summary) = @_;

$num_curves = scalar @$rpt;

print OFILE <<EOF;
<p><b>$rpt_title</b> ($num_curves curves)</p>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="$light_yellow"><b>Action</b></td>
<td bgcolor="$light_yellow"><b>Owner</b></td>
<td bgcolor="$light_yellow"><b>Marx Ticker</b></td>
<td bgcolor="$light_yellow"><b>Marx Issuer Name</b></td>
<td bgcolor="$light_yellow"><b>CCY</b></td>
<td bgcolor="$light_yellow"><b>Subord</b></td>
<td bgcolor="$light_yellow"><b>Doc Clause</b></td>
<td bgcolor="$light_yellow"><b>Type</b></td>
<td bgcolor="$light_yellow"><b>Pricing Source</b></td>
<td bgcolor="$light_yellow"><b>Pricing Curve ID</b></td>
<td bgcolor="$light_yellow"><b>Last Close Date</b></td>
<td bgcolor="$light_yellow"><b>Username</b></td>
<td bgcolor="$light_yellow"><b>Marx Recovery</b></td>
<td bgcolor="$light_yellow"><b>Mark-It Name</b></td>
<td bgcolor="$light_yellow"><b>Mark-It Composite</b></td>
<td bgcolor="$light_yellow"><b>Mark-It Recovery</b></td>
<td bgcolor="$light_yellow"><b>EMCT Name</b></td>
<td bgcolor="$light_yellow"><b>EMCT Recovery</b></td>
<td bgcolor="$light_yellow"><b>Calypso Name</b></td>
<td bgcolor="$light_yellow"><b>Calypso Recovery</b></td>
<td bgcolor="$light_yellow"><b>PT Recovery</b></td>
<td bgcolor="$light_yellow"><b>Storm Name</b></td>
<td bgcolor="$light_yellow"><b>Storm Recovery</b></td>
<td bgcolor="$light_yellow"><b>GK Name</b></td>
<td bgcolor="$light_yellow"><b>GK Recovery</b></td>
</tr>
EOF

my($sector_summary) = {};

foreach $rec (sort {$a->{prc_sector} cmp $b->{prc_sector} || $a->{prc_source} cmp $b->{prc_source} || $a->{prc_ticker} cmp $b->{prc_ticker} || $a->{prc_currency} cmp $b->{prc_currency} || $a->{prc_subord} cmp $b->{prc_subord} || $a->{prc_doc_id} cmp $b->{prc_doc_id}} @$rpt) {

$desk = &get_summary_desk($rec->{prc_sector});
$sector_summary->{$desk} += 1;

print OFILE <<EOF;
<tr>
<td>$rec->{prc_action}</td>
<td>$rec->{prc_sector}</td>
<td>$rec->{prc_ticker}</td>
<td>$rec->{prc_iname}</td>
<td>$rec->{prc_currency}</td>
<td>$rec->{prc_subord}</td>
<td>$rec->{prc_doc_id}</td>
<td>$rec->{prc_type}</td>
<td>$rec->{prc_source}</td>
<td>$rec->{prc_curve_id}</td>
<td>$rec->{prc_last_date}</td>
<td>$rec->{prc_last_user}</td>
<td $rec->{prc_color}>$rec->{prc_recovery}</td>
<td>$rec->{markit_id}</td>
<td>$rec->{markit_comp}</td>
<td $rec->{markit_color}>$rec->{markit_recovery}</td>
<td>$rec->{emct_id}</td>
<td $rec->{emct_color}>$rec->{emct_recovery}</td>
<td>$rec->{ca_id}</td>
<td $rec->{ca_color}>$rec->{ca_recovery}</td>
<td $rec->{pt_color}>$rec->{pt_recovery}</td>
<td>$rec->{storm_id}</td>
<td $rec->{storm_color}>$rec->{storm_recovery}</td>
<td>$rec->{gk_id}</td>
<td $rec->{gk_color}>$rec->{gk_recovery}</td>
</tr>
EOF
if ($rec->{storm_id} ne "" || $rec->{prc_source} eq "storm") {
if ($rec->{storm_id} eq "" && $rec->{prc_source} eq "storm") {
$storm_curve = $src_id_to_name->{$rec->{prc_ref_id}}
} else {
$storm_curve = $rec->{storm_id};
$storm_curve =~ s/^.*\///;
}

print OSFILE <<EOF;
<tr>
<td>$rec->{prc_action}</td>
<td>$rec->{prc_sector}</td>
<td>$rec->{prc_ticker}</td>
<td>$rec->{prc_iname}</td>
<td>$rec->{prc_currency}</td>
<td>$rec->{prc_subord}</td>
<td>$rec->{prc_doc_id}</td>
<td>$rec->{prc_type}</td>
<td>$rec->{prc_source}</td>
<td>$rec->{prc_curve_id}</td>
<td $rec->{prc_color}>$rec->{prc_recovery}</td>
<td>$storm_curve</td>
EOF

foreach $storm_db (@all_storm_db) {
$storm_recovery = $all_storm_recovery_list->{$storm_curve}->{$storm_db};
$storm_color = (defined($storm_recovery) && $storm_recovery != $rec->{prc_recovery})?"bgcolor=\"$light_red\"":"";
print OSFILE <<EOF;
<td $storm_color>$storm_recovery</td>
EOF
}

print OSFILE " </tr>\n";
}
}
print OFILE <<EOF;
</table>
EOF

if ($print_sector_summary) {
print SUM_FILE "$rpt_title\n\n";
if (keys %$sector_summary > 0) {
foreach $desk (sort keys %$sector_summary) {
$n_mismatch = $sector_summary->{$desk};
print SUM_FILE sprintf "\t%35s%6d\n", ($desk,$n_mismatch);
}
} else {
print SUM_FILE sprintf "\t%35s\n", ("None");
}
print SUM_FILE "\n";
}
}

sub process_recovery() {
my($prc_curve_id, $prc_issuer_id, $prc_iname, $prc_ticker, $prc_currency, $prc_subord_id, $prc_doc_id, $prc_type_id, $prc_recovery) = @_;
#print join('|', "Processing ", $prc_curve_id, $prc_issuer_id, $prc_iname, $prc_ticker, $prc_currency, $prc_subord_id, $prc_doc_id, $prc_type_id, $prc_recovery);
$prc_source = $pc_source_map->{$prc_curve_id};
$prc_ref_id = $pc_ref_id_map->{$prc_curve_id};

#AP
$prc_owner_id = $blotter_id_sector_map->{$prc_ref_id};
$prc_sector = $desk_map->{$prc_owner_id};

$prc_subord = $subord_map->{$prc_subord_id};
$prc_type = $curve_type_map->{$prc_type_id};

$prc_recovery = 0.0 if $prc_recovery eq "NULL";

# $prc_last_date = $last_close_date->{$prc_curve_id};
$summary_desk = &get_summary_desk($prc_sector);
$prc_last_date = $last_close_date->{$prc_curve_id};
$prc_last_date_prod_ctrl = $prc_last_date;
$prc_last_change_date = $last_change_date->{$prc_curve_id};
$prc_use_level_change = "";
$prc_use_level_change_prod_ctrl = "";

$consecutive_days_closed_same = "";

if (defined($excluded_list->{"level_change"}->{$summary_desk}) && defined($prc_last_change_date) && $prc_last_change_date < $prc_last_date) {
$prc_last_date = $prc_last_change_date;
$prc_use_level_change = "Yes";
}


if (defined($excluded_list->{"level_change_prod_ctrl"}->{$summary_desk}) && defined($prc_last_change_date) && $prc_last_change_date < $prc_last_date_prod_ctrl) {
$consecutive_days_closed_same = &diff_dates($asof, $prc_last_change_date);
$prc_last_date_prod_ctrl = $prc_last_change_date;
$prc_use_level_change_prod_ctrl = "Yes";
}

$prc_last_date = "" if $prc_last_date eq "NULL";
$prc_last_date_prod_ctrl = "" if $prc_last_date_prod_ctrl eq "NULL";

$prc_last_user = $last_close_user->{$prc_curve_id};
if (defined($username_map->{$prc_last_user})) {
$prc_last_user = $username_map->{$prc_last_user};
}

my($markit_recovery, $markit_id, $markit_comp, $markit_mismatch, $markit_color);
my($pt_recovery, $pt_id, $pt_mismatch, $pt_color);
my($gk_recovery, $gk_id, $gk_mismatch, $gk_color);
my($emct_recovery, $emct_id, $emct_mismatch, $emct_color);
my($ca_recovery, $ca_id, $ca_mismatch, $ca_color);
my($storm_recovery, $storm_id, $storm_mismatch, $storm_color);

$nn = 0;

@markit_rates = sort keys %{$markit_recovery_list->{$prc_curve_id}};
$n_markit = @markit_rates;
# $nn = $n_markit if $nn < $n_markit;

@pt_rates = sort keys %{$pt_recovery_list->{$prc_curve_id}};
$n_pt = @pt_rates;
$nn = $n_pt if $nn < $n_pt;

@gk_rates = sort keys %{$gk_recovery_list->{$prc_curve_id}};
$n_gk = @gk_rates;
$nn = $n_gk if $nn < $n_gk;

@emct_rates = sort keys %{$emct_recovery_list->{$prc_curve_id}};
$n_emct = @emct_rates;
if ($n_emct > 1) {
my($ok) = 0;

foreach $emct_rate (@emct_rates) {
if ($emct_rate == $prc_recovery) {
$ok = 1;
break;
}
}
if ($ok) {
@emct_rates = ($prc_recovery);
$n_emct = @emct_rates;
}
}
$nn = $n_emct if $nn < $n_emct;

if ($emct_curve_list->{$prc_curve_id} && $n_emct == 0) {
$emct_subord = uc $prc_subord_id;
if ($prc_type_id eq "cds") {
print EUMAP_FILE "$prc_ticker-pc-$prc_currency-$emct_subord-$prc_curve_id\t$emct_curve_list->{$prc_curve_id}\n";
} else {
print EUMAP_FILE "$prc_ticker-pc-$prc_currency-$emct_subord-$prc_type_id-$prc_curve_id\t$emct_curve_list->{$prc_curve_id}\n";
}
}

@ca_rates = sort keys %{$ca_recovery_list->{$prc_curve_id}};
$n_ca = @ca_rates;
if ($n_ca > 1) {
my($ok) = 0;

foreach $ca_rate (@ca_rates) {
if ($ca_rate == $prc_recovery) {
$ok = 1;
break;
}
}
if ($ok) {
@ca_rates = ($prc_recovery);
$n_ca = @ca_rates;
}
}
$nn = $n_ca if $nn < $n_ca;

if ($ca_curve_list->{$prc_curve_id} && $n_ca == 0) {
$ca_subord = uc $prc_subord_id;
if ($prc_type_id eq "cds") {
print UMAP_FILE "$prc_ticker-pc-$prc_currency-$ca_subord-$prc_curve_id\t$ca_curve_list->{$prc_curve_id}\n";
} else {
print UMAP_FILE "$prc_ticker-pc-$prc_currency-$ca_subord-$prc_type_id-$prc_curve_id\t$ca_curve_list->{$prc_curve_id}\n";
}
}

@storm_rates = sort keys %{$storm_recovery_list->{$prc_curve_id}};
$n_storm = @storm_rates;
$nn = $n_storm if $nn < $n_storm;

$prc_senior_not_40 = 0;
$prc_sub_not_25 = 0;
$action = "";

$standard_recovery = &get_standard_recovery($prc_sector, $prc_subord, $prc_ticker, $prc_iname, "HI");
$standard_recovery_lo = &get_standard_recovery($prc_sector, $prc_subord, $prc_ticker, $prc_iname, "LO");

$prc_is_zero = (! &allow_zero_recovery($prc_sector) && $prc_recovery == 0 && $standard_recovery != 0);

if ($prc_is_zero) {
$action = &get_action($prc_source, $prc_sector, $standard_recovery, $standard_recovery_lo);
}

if ($prc_source eq "gk") {
# should not use GK
if ($prc_subord =~ /^Senior Unsecured/) {
$prc_senior_not_40 = 1;
} else {
$prc_sub_not_25 = 1;
}
$action = &get_action($prc_source, "", $standard_recovery, $standard_recovery_lo);
}


$prc_mismatch = ($prc_is_zero || $prc_senior_not_40 || $prc_sub_not_25);
$prc_color = $prc_mismatch?"bgcolor=\"$light_red\"":"";

for ($i = 0; $i < $nn; $i++) {

if ($i < $n_markit) {
$markit_recovery = $markit_rates[$i];
$markit_id = $markit_recovery_list->{$prc_curve_id}->{$markit_recovery};
$markit_comp = $markit_comp_list->{$prc_curve_id}->{$markit_recovery};

$markit_mismatch = $markit_recovery ne "" && abs($prc_recovery - $markit_recovery) >= 1.0;
$markit_color = $markit_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i < $n_pt) {
$pt_recovery = $pt_rates[$i];
$pt_id = $pt_recovery_list->{$prc_curve_id}->{$pt_recovery};
$pt_mismatch = defined($pt_recovery) && (abs($prc_recovery - $pt_recovery) >= 1.0);
$pt_color = $pt_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i < $n_gk) {
$gk_recovery = $gk_rates[$i];
$gk_id = $gk_recovery_list->{$prc_curve_id}->{$gk_recovery};
$gk_mismatch = defined($gk_recovery) && (abs($prc_recovery - $gk_recovery) >= 1.0);
$gk_color = $gk_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i < $n_emct) {
$emct_recovery = $emct_rates[$i];
$emct_id = $emct_recovery_list->{$prc_curve_id}->{$emct_recovery};
$emct_mismatch = defined($emct_recovery) && (abs($prc_recovery - $emct_recovery) >= 1.0);
$emct_color = $emct_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i < $n_ca) {
$ca_recovery = $ca_rates[$i];
$ca_id = $ca_recovery_list->{$prc_curve_id}->{$ca_recovery};
$ca_mismatch = defined($ca_recovery) && (abs($prc_recovery - $ca_recovery) >= 1.0);
$ca_color = $ca_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i < $n_storm) {
$storm_recovery = $storm_rates[$i];
$storm_id = $storm_recovery_list->{$prc_curve_id}->{$storm_recovery};
$storm_mismatch = defined($storm_recovery) && (abs($prc_recovery - $storm_recovery) >= 1.0);
$storm_color = $storm_mismatch?"bgcolor=\"$light_red\"":"";
}

if ($i == 0) {
print UFILE join(',', $prc_curve_id, $prc_ticker,
$prc_currency, $prc_subord, $prc_type, $prc_recovery,
$prc_source, "\"$prc_sector\"", $prc_last_date, $emct_id, $ca_id, $pt_id, $storm_id, $gk_id, "\n");
}

#AP
#$markit_level = $gcdr_levels->{$markit_id} #will only work if we add the markit curve_id in the query in runReconRpt.ksh, line 93

$markit_curve_id = $gcdr_curves->{$prc_ticker}->{$prc_currency}->{$prc_subord_id}->{$prc_doc_id}->{$prc_type_id}->{"markit"};
# print join('|', "PC Details", $prc_curve_id, $prc_source, $prc_ref_id);
# print join('|', "Found Markit Curve", $markit_curve_id, $prc_ticker, $prc_currency, $prc_subord_id, $prc_doc_id, $prc_type_id);

#for all in tennor_map
$markit_level_3M = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"3M"}} : "";
$markit_level_6M = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"6M"}} : "";
$markit_level_1Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"1Y"}} : "";
$markit_level_2Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"2Y"}} : "";
$markit_level_3Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"3Y"}} : "";
$markit_level_4Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"4Y"}} : "";
$markit_level_5Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"5Y"}} : "";
$markit_level_7Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"7Y"}} : "";
$markit_level_10Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"10Y"}} : "";
$markit_level_15Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"15Y"}} : "";
$markit_level_20Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"20Y"}} : "";
$markit_level_30Y = $markit_curve_id ne "" ? $gcdr_levels->{$markit_curve_id}->{$tennor_map->{"30Y"}} : "";

$prc_level_3M= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"3M"}};
$prc_level_6M= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"6M"}};
$prc_level_1Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"1Y"}};
$prc_level_2Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"2Y"}};
$prc_level_3Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"3Y"}};
$prc_level_4Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"4Y"}};
$prc_level_5Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"5Y"}};
$prc_level_7Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"7Y"}};
$prc_level_10Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"10Y"}};
$prc_level_15Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"15Y"}};
$prc_level_20Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"20Y"}};
$prc_level_30Y= $gcdr_levels->{$prc_curve_id}->{$tennor_map->{"30Y"}};

# print "$prc_curve_id|$prc_ticker|$prc_currency|$prc_subord_id|$prc_type_id|$prc_level_5Y|$markit_curve_id|$markit_level_5Y\n";
# print "$markit_curve_id|$tennor_map->{\"5Y\"}|$gcdr_levels->{$markit_curve_id}->{$tennor_map->{\"5Y\"}}\n";
# print "$prc_curve_id|$tennor_map->{\"5Y\"}|$gcdr_levels->{$prc_curve_id}->{$tennor_map->{\"5Y\"}}\n";

my($rec) = {};
$rec->{prc_action} = $action;
$rec->{prc_sector} = $prc_sector;
$rec->{prc_ticker} = $prc_ticker;
$rec->{prc_iname} = $prc_iname;
$rec->{prc_currency} = $prc_currency;
$rec->{prc_subord} = $prc_subord;
$rec->{prc_doc_id} = $prc_doc_id;
$rec->{prc_type} = $prc_type;
$rec->{prc_source} = $prc_source;
$rec->{prc_curve_id} = $prc_curve_id;
$rec->{prc_ref_id} = $prc_ref_id;
$rec->{prc_color} = $prc_color;
$rec->{prc_recovery} = $prc_recovery;
$rec->{prc_last_date} = $prc_last_date;
$rec->{prc_last_date_prod_ctrl} = $prc_last_date_prod_ctrl;
$rec->{consecutive_days_closed_same} = $consecutive_days_closed_same;
$rec->{prc_use_level_change} = $prc_use_level_change;
$rec->{prc_use_level_change_prod_ctrl} = $prc_use_level_change_prod_ctrl;
$rec->{prc_last_user} = $prc_last_user;
$rec->{markit_id} = $markit_id;
$rec->{markit_curve_id} = $markit_curve_id;
$rec->{markit_comp} = $markit_comp;

#AP
$rec->{prc_level_3M} = $prc_level_3M;
$rec->{prc_level_6M} = $prc_level_6M;
$rec->{prc_level_1Y} = $prc_level_1Y;
$rec->{prc_level_2Y} = $prc_level_2Y;
$rec->{prc_level_3Y} = $prc_level_3Y;
$rec->{prc_level_4Y} = $prc_level_4Y;
$rec->{prc_level_5Y} = $prc_level_5Y;
$rec->{prc_level_7Y} = $prc_level_7Y;
$rec->{prc_level_10Y} = $prc_level_10Y;
$rec->{prc_level_15Y} = $prc_level_15Y;
$rec->{prc_level_20Y} = $prc_level_20Y;
$rec->{prc_level_30Y} = $prc_level_30Y;

$rec->{markit_level_3M} = $markit_level_3M;
$rec->{markit_level_6M} = $markit_level_6M;
$rec->{markit_level_1Y} = $markit_level_1Y;
$rec->{markit_level_2Y} = $markit_level_2Y;
$rec->{markit_level_3Y} = $markit_level_3Y;
$rec->{markit_level_4Y} = $markit_level_4Y;
$rec->{markit_level_5Y} = $markit_level_5Y;
$rec->{markit_level_7Y} = $markit_level_7Y;
$rec->{markit_level_10Y} = $markit_level_10Y;
$rec->{markit_level_15Y} = $markit_level_15Y;
$rec->{markit_level_20Y} = $markit_level_20Y;
$rec->{markit_level_30Y} = $markit_level_30Y;

$rec->{diff_level_3M} = $prc_level_3M-$markit_level_3M;
$rec->{diff_level_6M} = $prc_level_6M-$markit_level_6M;
$rec->{diff_level_1Y} = $prc_level_1Y-$markit_level_1Y;
$rec->{diff_level_2Y} = $prc_level_2Y-$markit_level_2Y;
$rec->{diff_level_3Y} = $prc_level_3Y-$markit_level_3Y;
$rec->{diff_level_4Y} = $prc_level_4Y-$markit_level_4Y;
$rec->{diff_level_5Y} = $prc_level_5Y-$markit_level_5Y;
$rec->{diff_level_7Y} = $prc_level_7Y-$markit_level_7Y;
$rec->{diff_level_10Y} = $prc_level_10Y-$markit_level_10Y;
$rec->{diff_level_15Y} = $prc_level_15Y-$markit_level_15Y;
$rec->{diff_level_20Y} = $prc_level_20Y-$markit_level_20Y;
$rec->{diff_level_30Y} = $prc_level_30Y-$markit_level_30Y;

$rec->{markit_color} = $markit_color;
$rec->{markit_recovery} = $markit_recovery;
$rec->{pt_id} = $pt_id;
$rec->{pt_color} = $pt_color;
$rec->{pt_recovery} = $pt_recovery;
$rec->{gk_id} = $gk_id;
$rec->{gk_color} = $gk_color;
$rec->{gk_recovery} = $gk_recovery;
$rec->{emct_id} = $emct_id;
$rec->{emct_color} = $emct_color;
$rec->{emct_recovery} = $emct_recovery;
$rec->{ca_id} = $ca_id;
$rec->{ca_color} = $ca_color;
$rec->{ca_recovery} = $ca_recovery;
$rec->{storm_id} = $storm_id;
$rec->{storm_color} = $storm_color;
$rec->{storm_recovery} = $storm_recovery;

$rec->{workdays_stale} = 1;

$stale_excluded = &excluded_stale($rec);
$no_standard = &no_standard($rec);

if ($no_standard) {
$rec->{excluded} = $no_standard;
push(@recovery_excluded_report, $rec);
} elsif ($prc_is_zero || $prc_senior_not_40 || $prc_sub_not_25) {
if ($prc_is_zero) {
push(@zero_report, $rec);
} elsif ($prc_senior_not_40) {
push(@senior_not_40_report, $rec);
} elsif ($prc_sub_not_25) {
push(@sub_not_25_report, $rec);
}
} elsif ($pt_mismatch || $gk_mismatch || $emct_mismatch || $ca_mismatch || $storm_mismatch) {
$rec->{prc_action} = get_mismatch_action($prc_source, $prc_sector, $pt_mismatch, $gk_mismatch, $emct_mismatch, $ca_mismatch, $storm_mismatch);
push(@recovery_recon_report, $rec);
add_mismatch_summary($pt_mismatch, $gk_mismatch, $emct_mismatch, $ca_mismatch, $storm_mismatch, $storm_id);
}

#
$stale_cutoff = &stale_threshhold($rec);
if (! $stale_cutoff) {
$stale_cutoff = $default_stale_cutoff;
}
# print "Stale Cutoff used for $prc_ticker: $stale_cutoff\n";

if (($n_emct > 0 || $n_ca > 0 || $n_pt > 0 || $n_gk > 0) && ($prc_last_date eq "" || &diff_dates($asof, $prc_last_date) > $stale_cutoff) || $consecutive_days_closed_same ne "" ) {
if ($i == 0) {
if ($stale_excluded) {
$rec->{excluded} = $stale_excluded;
push(@stale_excluded_report, $rec);
} else {
$flag = 0; #prevent duplicates from being added to product control report
if ($prc_last_date eq "" || (&diff_dates($asof, $prc_last_date) > $stale_cutoff) ) {
push(@stale_report, $rec);
push(@stale_report_prod_ctrl, $rec);
$flag = 1;
}
if ($consecutive_days_closed_same ne "") {
if ($flag == 0) {
push(@stale_report_prod_ctrl, $rec);
}
}
}
}
}
}
}

sub is_dummy_curve {
my($rec) = @_;

my($excluded) = $excluded_list->{"dummy"}->{$rec->{prc_ticker}};
return $excluded if $excluded;

# Mortgages
return "" if ($rec->{prc_ticker} eq "ABXHEAAA06");
return "" if ($rec->{prc_ticker} eq "ABXHEAA06");
return "" if ($rec->{prc_ticker} eq "ABXHEA06");
return "" if ($rec->{prc_ticker} eq "ABXHEBBB06");
return "" if ($rec->{prc_ticker} eq "ABXHEBBBM6");
return "Mortgage: Dummy Curve" if ($rec->{prc_sector} =~ /Mortgage/);

return "";
}


sub no_standard() {
my($rec) = @_;

my($excluded) = $excluded_list->{"recovery"}->{$rec->{prc_ticker}};
return $excluded if $excluded;


# Paul Lim, Dan McCarthy
return "NA SN: Special Subordinated" if ($rec->{prc_ticker} eq "TSO" && $rec->{prc_subord} eq "Subordinated");

return "NSSB: non-standard rate" if ($rec->{prc_ticker} =~ /^ITRXAB5/ &&
$rec->{prc_sector} =~ /^NSSB Credit Derivatives/);

# BeachStreet
return "NA Corr: Beach Street" if ($rec->{prc_ticker} =~ /^BEACHST/ &&
$rec->{prc_iname} =~ /^LL/);

return "";
}


sub excluded_stale() {
my($rec) = @_;

$is_dummy = is_dummy_curve($rec);
return $is_dummy if $is_dummy;

my($excluded) = $excluded_list->{"stale"}->{$rec->{prc_ticker}};
return $excluded if $excluded;

return "";
}


sub excluded_rating() {
my($rec) = @_;

##$is_dummy = is_dummy_curve($rec);
##return $is_dummy if ($is_dummy =~ /Dummy/);

my($excluded) = $excluded_list->{"rating"}->{$rec->{prc_ticker}};
if ($excluded) {
$desk = &get_summary_desk($rec->{prc_sector});
return $desk;
}

return "";
}

# Threshold
sub stale_threshhold() {
my($rec) = @_;

my($threshhold) = $excluded_list->{"threshhold"}->{$rec->{prc_ticker}};
if ($threshhold) {
return $threshhold;
}

return "";
}


sub get_mismatch_action() {
my($source, $sector, $pt_mismatch, $gk_mismatch, $emct_mismatch, $ca_mismatch, $storm_mismatch) = @_;
my($action);
$action = "Correct the break of:";

if ($storm_mismatch && $sector =~ /^Latin/) {
$action .= " $source/Storm.";
} else {
$action .= " EMCT" if ($emct_mismatch);
$action .= " Calypso" if ($ca_mismatch);
$action .= " PT" if ($pt_mismatch);
$action .= " Storm" if ($storm_mismatch);
$action .= " GK" if ($gk_mismatch);
$action .= ".";
}

if ($source ne "blotter") {
$action .= " Change pricing source to blotter.";
}

return $action;
}

sub get_action() {
my($source, $sector, $recovery, $recovery_lo) = @_;
my($action);

if ($source eq "gk") {
return "Change pricing source to blotter.";
}

if ($recovery < 0) {
$action = "Change $source recovery to non-zero.";
} elsif ($recovery == $recovery_lo) {
$action = "Change $source recovery to $recovery.";
} else {
$action = "Change $source recovery to (${recovery_lo}, ${recovery}).";
}
if ($source ne "blotter") {
if ($sector eq "" || $source eq "gk") {
$action .= " Change pricing source to blotter.";
} else {
$action .= " Change pricing source to blotter.";
}
}

return $action;
}

sub allow_zero_recovery() {
my($prc_sector) = @_;

return ($prc_sector =~ /Mortgage/);
}

# return -1 if there is no standard
sub get_standard_recovery() {
my($prc_sector, $prc_subord, $prc_ticker, $prc_iname, $hi_lo) = @_;

if ($prc_sector =~ /Mortgage/) {
return -1;
}

if ($prc_sector =~ /^North America/) {
if ($prc_subord =~ /^Senior Unsecured/) {
return 40;
} elsif ($prc_subord =~ /^Subordinated/) {
return 25;
}
return -1;
}

if ($prc_sector =~ /^European Single|^European Port/) {
if ($prc_subord =~ /^Senior Unsecured/) {
return 40;
} elsif ($prc_subord =~ /^Subordinated/) {
if ($hi_lo eq "HI") {
return 25;
} else {
return 20;
}
}
return -1;
}

if ($prc_sector =~ /^NSSB Credit Derivatives/) {
if ($prc_subord =~ /^Senior Unsecured/) {
return 35;
} elsif ($prc_subord =~ /^Subordinated/) {
return 30;
}
return -1;
}

return -1;
}

sub add_mismatch_summary() {
my($pt_mismatch, $gk_mismatch, $emct_mismatch, $ca_mismatch, $storm_mismatch, $storm_id) = @_;
$mismatch_summary->{"EMCT"} += 1 if ($emct_mismatch);
$mismatch_summary->{"Calypso"} += 1 if ($ca_mismatch);
$mismatch_summary->{"PT"} += 1 if ($pt_mismatch);
$mismatch_summary->{"Storm"} += 1 if ($storm_mismatch);
$mismatch_summary->{"GK"} += 1 if ($gk_mismatch);

if ($storm_mismatch) {
$storm_db = $storm_id;
$storm_db =~ s/\/.*$//;
$storm_summary->{$storm_db} += 1;
}
}

sub print_mismatch_summary() {
my($title) = @_;

print SUM_FILE "Report Summary\n\n$title\n\n";
print_system_mismatch("EMCT");
print_system_mismatch("Calypso");
print_system_mismatch("PT");
print_system_mismatch("GK");
print_system_mismatch("Storm");
print SUM_FILE "\n";
}


sub print_system_mismatch() {
my($sys_name) = @_;
$n_mismatch = $mismatch_summary->{$sys_name};
print SUM_FILE sprintf "\t%10s%6d\n", ($sys_name, $n_mismatch);
if ($sys_name eq "Storm" && $n_mismatch > 0) {
print SUM_FILE "\t\t by database:\n";
foreach $storm_db (sort keys %$storm_summary) {
$n_mismatch = $storm_summary->{$storm_db};
print SUM_FILE sprintf "\t\t%10s%6d\n", ($storm_db, $n_mismatch);
}
}
}


sub print_stale_report() {
my($rpt) = @_;

open(SFILE, "> stale_curve.${asof}.xls");

print SFILE <<EOF;
<html>
<head>
<title>Stale Curve Report</title>
</head>
<body>
<p>Report Date: $asof</p>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="$light_yellow"><b>Threshold Day Count</b></td>
<td bgcolor="$light_yellow"><b>Last Closing Date</b></td>
<td bgcolor="$light_yellow"><b>User</b></td>
<td bgcolor="$light_yellow"><b>Owner</b></td>
<td bgcolor="$light_yellow"><b>Marx Ticker</b></td>
<td bgcolor="$light_yellow"><b>Marx Issuer Name</b></td>
<td bgcolor="$light_yellow"><b>CCY</b></td>
<td bgcolor="$light_yellow"><b>Subord</b></td>
<td bgcolor="$light_yellow"><b>Doc Clause</b></td>
<td bgcolor="$light_yellow"><b>Type</b></td>
<td bgcolor="$light_yellow"><b>Pricing Source</b></td>
<td bgcolor="$light_yellow"><b>Pricing Curve ID</b></td>
<td bgcolor="$light_yellow"><b>Blotter ShortCode</b></td>
<td bgcolor="$light_yellow"><b>MarkIt Name</b></td>
<td bgcolor="$light_yellow"><b>EMCT Name</b></td>
<td bgcolor="$light_yellow"><b>Calypso Name</b></td>
<td bgcolor="$light_yellow"><b>PT Name</b></td>
<td bgcolor="$light_yellow"><b>Storm Name</b></td>
<td bgcolor="$light_yellow"><b>GK Name</b></td>
<td bgcolor="$light_yellow"><b>PC Level</b></td>
<td bgcolor="$light_yellow"><b>MarkIt Level</b></td>
<td bgcolor="$light_yellow"><b>Level Diff</b></td>
<td bgcolor="$light_yellow"><b>Workdays Stale</b></td>
<td bgcolor="$light_yellow"><b>Age Bucket</b></td>
</tr>
EOF

foreach $rec (sort {$a->{prc_last_date} cmp $b->{prc_last_date} || $a->{prc_sector} cmp $b->{prc_sector} || $a->{prc_source} cmp $b->{prc_source} || $a->{prc_ticker} cmp $b->{prc_ticker} || $a->{prc_currency} cmp $b->{prc_currency} || $a->{prc_subord} cmp $b->{prc_subord} || $a->{prc_doc_id} cmp $b->{prc_doc_id}} @$rpt) {

# Set stale color
$stale_days = &diff_dates($asof, $rec->{prc_last_date});
if ($rec->{prc_last_date} eq "" || $stale_days >= 180) {
$last_color = "bgcolor=\"$light_red\"";
} elsif ($stale_days >= 90) {
$last_color = "bgcolor=\"$light_yellow\"";
} else {
$last_color = "";
}

#AP
# Set level difference color

$level_diff_color = "";
if ($rec->{diff_level_5Y} != 0 && $rec->{markit_level_5Y} == 0) {
$level_diff_color = "bgcolor=\"$light_yellow\"";
}
elsif ( $rec->{diff_level_5Y} != 0 ) {
$level_diff_color = "bgcolor=\"$light_red\"";
}


# Threshold
$stale_cutoff = &stale_threshhold($rec);
if (! $stale_cutoff) {
$stale_cutoff = $default_stale_cutoff;
}
$rec->{prc_threshhold} = $stale_cutoff;

if ( ! (($rec->{prc_last_date} eq "") || ($rec->{prc_use_level_change} =~ /Yes/)) ) {
$temp_date = $rec->{prc_last_date};
while ( $temp_date != $asof ) {
$temp_date = `/export1/app/gcdrbatch/bin/bumpweekdays "${temp_date}" 1`;
$rec->{workdays_stale}+=1;
}
}
else {
$rec->{workdays_stale} = "";
}

$rec->{prc_last_date} = "Never Closed" if ($rec->{prc_last_date} eq "");
$rec->{prc_last_date} = "Closed same level" if ($rec->{prc_use_level_change} =~ /Yes/);

if ($rec->{prc_source} eq "markit") {
$short_code = "";
$markit_id = $src_id_to_name->{$rec->{prc_ref_id}};
} else {
$short_code = $src_id_to_name->{$rec->{prc_ref_id}};
$markit_id = $rec->{markit_id};
}

$prc_sector = $rec->{prc_sector};
$desk = &get_summary_desk($prc_sector);
$stale_summary->{$desk} += 1;

$age_bucket="";
$age_bucket_color="#FFFFFF";
if (! defined($rec->{workdays_stale}) || $rec->{workdays_stale} eq "") {
$age_bucket="Never Closed";
$age_bucket_color=$light_red;
} elsif ($rec->{workdays_stale} >= 0 && $rec->{workdays_stale} <= 15) {
$age_bucket = "0-15";
$age_bucket_color=$light_yellow;
} elsif ($rec->{workdays_stale} >= 16 && $rec->{workdays_stale} <= 30) {
$age_bucket="16-30";
$age_bucket_color=$orange;
} elsif ($rec->{workdays_stale} >= 31) {
$age_bucket="31+";
$age_bucket_color=$light_red;
}

print SFILE <<EOF;
<tr>
<td>$rec->{prc_threshhold}</td>
<td $last_color>$rec->{prc_last_date}</td>
<td>$rec->{prc_last_user}</td>
<td>$rec->{prc_sector}</td>
<td>$rec->{prc_ticker}</td>
<td>$rec->{prc_iname}</td>
<td>$rec->{prc_currency}</td>
<td>$rec->{prc_subord}</td>
<td>$rec->{prc_doc_id}</td>
<td>$rec->{prc_type}</td>
<td>$rec->{prc_source}</td>
<td>$rec->{prc_curve_id}</td>
<td>$short_code</td>
<td>$markit_id</td>
<td>$rec->{emct_id}</td>
<td>$rec->{ca_id}</td>
<td>$rec->{pt_id}</td>
<td>$rec->{storm_id}</td>
<td>$rec->{gk_id}</td>
<td>$rec->{prc_level_5Y}</td>
<td>$rec->{markit_level_5Y}</td>
<td $level_diff_color>$rec->{diff_level_5Y}</td>
<td>$rec->{workdays_stale}</td>
<td bgcolor="$age_bucket_color">$age_bucket</td>
</tr>
EOF
}

print SFILE <<EOF;
</table>
</body>
</html>
EOF

close (SFILE);

$tot_mismatch = 0;
if (keys %$stale_summary > 0) {
foreach $desk (sort keys %$stale_summary) {
$n_mismatch = $stale_summary->{$desk};
print SUM_FILE sprintf "\t%35s%6d\n", ($desk,$n_mismatch);
$tot_mismatch += $n_mismatch
}
} else {
print SUM_FILE sprintf "\t%35s\n", ("None");
}
print SUM_FILE sprintf "\n\t%35s%6d\n\n", (Total,$tot_mismatch);

print SUM_FILE sprintf "Following businesses use last changed dates instead of last closed to check staleness:\n\n";
my($use_level_change) = $excluded_list->{"level_change"};
if (keys %$use_level_change > 0) {
foreach $desk (sort keys %$use_level_change) {
print SUM_FILE sprintf "\t%35s\n", ($desk);
}
} else {
print SUM_FILE sprintf "\t%35s\n", ("None");
}

}

#Marx Stale Curve Report - Product Control
sub print_prod_cntrl_report() {
my($rpt) = @_;

open(SFILE, "> stale_curve_product_control.${asof}.xls");

print SFILE <<EOF;
<html>
<head>
<title>Marx Stale Curve Report - Product Control</title>
</head>
<body>
<p>Report Date: $asof</p>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="$light_yellow"><b>Threshold Day Count</b></td>
<td bgcolor="$light_yellow"><b>Last Closing Date</b></td>
<td bgcolor="$light_yellow"><b>Days Closed At Same Levels</b></td>
<td bgcolor="$light_yellow"><b>User</b></td>
<td bgcolor="$light_yellow"><b>Owner</b></td>
<td bgcolor="$light_yellow"><b>Marx Ticker</b></td>
<td bgcolor="$light_yellow"><b>Marx Issuer Name</b></td>
<td bgcolor="$light_yellow"><b>CCY</b></td>
<td bgcolor="$light_yellow"><b>Subord</b></td>
<td bgcolor="$light_yellow"><b>Doc Clause</b></td>
<td bgcolor="$light_yellow"><b>Type</b></td>
<td bgcolor="$light_yellow"><b>Pricing Source</b></td>
<td bgcolor="$light_yellow"><b>Pricing Curve ID</b></td>
<td bgcolor="$light_yellow"><b>Blotter ShortCode</b></td>
<td bgcolor="$light_yellow"><b>MarkIt Name</b></td>
<td bgcolor="$light_yellow"><b>EMCT Name</b></td>
<td bgcolor="$light_yellow"><b>Calypso Name</b></td>
<td bgcolor="$light_yellow"><b>PT Name</b></td>
<td bgcolor="$light_yellow"><b>Storm Name</b></td>
<td bgcolor="$light_yellow"><b>GK Name</b></td>
<td bgcolor="$light_yellow"><b>PC 3M</b></td>
<td bgcolor="$light_yellow"><b>PC 6M</b></td>
<td bgcolor="$light_yellow"><b>PC 1Y</b></td>
<td bgcolor="$light_yellow"><b>PC 2Y</b></td>
<td bgcolor="$light_yellow"><b>PC 3Y</b></td>
<td bgcolor="$light_yellow"><b>PC 4Y</b></td>
<td bgcolor="$light_yellow"><b>PC 5Y</b></td>
<td bgcolor="$light_yellow"><b>PC 7Y</b></td>
<td bgcolor="$light_yellow"><b>PC 10Y</b></td>
<td bgcolor="$light_yellow"><b>PC 15Y</b></td>
<td bgcolor="$light_yellow"><b>PC 20Y</b></td>
<td bgcolor="$light_yellow"><b>PC 30Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 3M</b></td>
<td bgcolor="$light_yellow"><b>Markit 6M</b></td>
<td bgcolor="$light_yellow"><b>Markit 1Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 2Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 3Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 4Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 5Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 7Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 10Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 15Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 20Y</b></td>
<td bgcolor="$light_yellow"><b>Markit 30Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 3M</b></td>
<td bgcolor="$light_yellow"><b>Diff 6M</b></td>
<td bgcolor="$light_yellow"><b>Diff 1Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 2Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 3Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 4Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 5Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 7Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 10Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 15Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 20Y</b></td>
<td bgcolor="$light_yellow"><b>Diff 30Y</b></td>
</tr>
EOF

foreach $rec (sort {$a->{prc_last_date_prod_ctrl} cmp $b->{prc_last_date_prod_ctrl} || $a->{prc_sector} cmp $b->{prc_sector} || $a->{prc_source} cmp $b->{prc_source} || $a->{prc_ticker} cmp $b->{prc_ticker} || $a->{prc_currency} cmp $b->{prc_currency} || $a->{prc_subord} cmp $b->{prc_subord} || $a->{prc_doc_id} cmp $b->{prc_doc_id}} @$rpt) {

# Set stale color
$stale_days = &diff_dates($asof, $rec->{prc_last_date_prod_ctrl});
if ($rec->{prc_last_date_prod_ctrl} eq "" || $stale_days >= 180) {
$last_color = "bgcolor=\"$light_red\"";
} elsif ($stale_days >= 90) {
$last_color = "bgcolor=\"$light_yellow\"";
} else {
$last_color = "";
}

# #AP
# # Set level difference color
# #$level_diff_color = $rec->{diff_level_5Y} == 0 ? "" : "bgcolor=\"$light_red\"";
# if ($rec->{diff_level_5Y} != 0 && $rec->{markit_level_5Y} == 0) {
# $level_diff_color = "bgcolor=\"$light_yellow\"";
# }
# elsif ($rec->{diff_level_5Y} != 0) {
# }

# Threshold
$stale_cutoff = &stale_threshhold($rec);
if (! $stale_cutoff) {
$stale_cutoff = $default_stale_cutoff;
}
$rec->{prc_threshhold} = $stale_cutoff;

$rec->{prc_last_date_prod_ctrl} = "Never Closed" if ($rec->{prc_last_date_prod_ctrl} eq "");
$rec->{prc_last_date_prod_ctrl} = "Closed same level" if ($rec->{prc_use_level_change_prod_ctrl} =~ /Yes/);

if ($rec->{prc_source} eq "markit") {
$short_code = "";
$markit_id = $src_id_to_name->{$rec->{prc_ref_id}};
} else {
$short_code = $src_id_to_name->{$rec->{prc_ref_id}};
$markit_id = $rec->{markit_id};
}

$prc_sector = $rec->{prc_sector};
$desk = &get_summary_desk($prc_sector);
$stale_summary->{$desk} += 1;

print SFILE <<EOF;
<tr>
<td>$rec->{prc_threshhold}</td>
<td $last_color>$rec->{prc_last_date_prod_ctrl}</td>
<td>$rec->{consecutive_days_closed_same}</td>
<td>$rec->{prc_last_user}</td>
<td>$rec->{prc_sector}</td>
<td>$rec->{prc_ticker}</td>
<td>$rec->{prc_iname}</td>
<td>$rec->{prc_currency}</td>
<td>$rec->{prc_subord}</td>
<td>$rec->{prc_doc_id}</td>
<td>$rec->{prc_type}</td>
<td>$rec->{prc_source}</td>
<td>$rec->{prc_curve_id}</td>
<td>$short_code</td>
<td>$markit_id</td>
<td>$rec->{emct_id}</td>
<td>$rec->{ca_id}</td>
<td>$rec->{pt_id}</td>
<td>$rec->{storm_id}</td>
<td>$rec->{gk_id}</td>
<td>$rec->{prc_level_3M}</td>
<td>$rec->{prc_level_6M}</td>
<td>$rec->{prc_level_1Y}</td>
<td>$rec->{prc_level_2Y}</td>
<td>$rec->{prc_level_3Y}</td>
<td>$rec->{prc_level_4Y}</td>
<td>$rec->{prc_level_5Y}</td>
<td>$rec->{prc_level_7Y}</td>
<td>$rec->{prc_level_10Y}</td>
<td>$rec->{prc_level_15Y}</td>
<td>$rec->{prc_level_20Y}</td>
<td>$rec->{prc_level_30Y}</td>
<td>$rec->{markit_level_3M}</td>
<td>$rec->{markit_level_6M}</td>
<td>$rec->{markit_level_1Y}</td>
<td>$rec->{markit_level_2Y}</td>
<td>$rec->{markit_level_3Y}</td>
<td>$rec->{markit_level_4Y}</td>
<td>$rec->{markit_level_5Y}</td>
<td>$rec->{markit_level_7Y}</td>
<td>$rec->{markit_level_10Y}</td>
<td>$rec->{markit_level_15Y}</td>
<td>$rec->{markit_level_20Y}</td>
<td>$rec->{markit_level_30Y}</td>
<td>$rec->{diff_level_3M}</td>
<td>$rec->{diff_level_6M}</td>
<td>$rec->{diff_level_1Y}</td>
<td>$rec->{diff_level_2Y}</td>
<td>$rec->{diff_level_3Y}</td>
<td>$rec->{diff_level_4Y}</td>
<td>$rec->{diff_level_5Y}</td>
<td>$rec->{diff_level_7Y}</td>
<td>$rec->{diff_level_10Y}</td>
<td>$rec->{diff_level_15Y}</td>
<td>$rec->{diff_level_20Y}</td>
<td>$rec->{diff_level_30Y}</td>
</tr>
EOF
}


print SFILE <<EOF;
</table>
</body>
</html>
EOF

close (SFILE);

$tot_mismatch = 0;
if (keys %$stale_summary > 0) {
foreach $desk (sort keys %$stale_summary) {
$n_mismatch = $stale_summary->{$desk};
print SUM_FILE sprintf "\t%35s%6d\n", ($desk,$n_mismatch);
$tot_mismatch += $n_mismatch
}
} else {
print SUM_FILE sprintf "\t%35s\n", ("None");
}
print SUM_FILE sprintf "\n\t%35s%6d\n\n", (Total,$tot_mismatch);
}


sub print_excluded_report() {
my($rpt, $title) = @_;

my($excluded_summary) = {};
open(SFILE, "> ${title}_excluded.${asof}.xls");

print SFILE <<EOF;
<html>
<head>
<title>$title excluded report</title>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="$light_yellow"><b>Reason</b></td>
<td bgcolor="$light_yellow"><b>Owner</b></td>
<td bgcolor="$light_yellow"><b>Marx Ticker</b></td>
<td bgcolor="$light_yellow"><b>Marx Issuer Name</b></td>
<td bgcolor="$light_yellow"><b>CCY</b></td>
<td bgcolor="$light_yellow"><b>Subord</b></td>
<td bgcolor="$light_yellow"><b>Doc Clause</b></td>
<td bgcolor="$light_yellow"><b>Type</b></td>
<td bgcolor="$light_yellow"><b>Pricing Source</b></td>
<td bgcolor="$light_yellow"><b>Pricing Curve ID</b></td>
<td bgcolor="$light_yellow"><b>Last Close Date</b></td>
<td bgcolor="$light_yellow"><b>Username</b></td>
<td bgcolor="$light_yellow"><b>Marx Recovery</b></td>
<td bgcolor="$light_yellow"><b>Blotter ShortCode</b></td>
<td bgcolor="$light_yellow"><b>MarkIt Name</b></td>
<td bgcolor="$light_yellow"><b>Mark-It Recovery</b></td>
<td bgcolor="$light_yellow"><b>EMCT Name</b></td>
<td bgcolor="$light_yellow"><b>EMCT Recovery</b></td>
<td bgcolor="$light_yellow"><b>Calypso Name</b></td>
<td bgcolor="$light_yellow"><b>Calypso Recovery</b></td>
<td bgcolor="$light_yellow"><b>PT Name</b></td>
<td bgcolor="$light_yellow"><b>PT Recovery</b></td>
<td bgcolor="$light_yellow"><b>Storm Name</b></td>
<td bgcolor="$light_yellow"><b>Storm Recovery</b></td>
<td bgcolor="$light_yellow"><b>GK Name</b></td>
<td bgcolor="$light_yellow"><b>GK Recovery</b></td>
</tr>
EOF

foreach $rec (sort {$a->{excluded} cmp $b->{excluded} || $a->{prc_sector} cmp $b->{prc_sector} || $a->{prc_source} cmp $b->{prc_source} || $a->{prc_ticker} cmp $b->{prc_ticker} || $a->{prc_currency} cmp $b->{prc_currency} || $a->{prc_subord} cmp $b->{prc_subord} || $a->{prc_doc_id} cmp $b->{prc_doc_id}} @$rpt) {


if ($rec->{prc_source} eq "markit") {
$short_code = "";
$markit_id = $src_id_to_name->{$rec->{prc_ref_id}};
} else {
$short_code = $src_id_to_name->{$rec->{prc_ref_id}};
$markit_id = $rec->{markit_id};
}

$prc_sector
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值