aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/Dawn/models.py4
-rw-r--r--python/Dawn/views.py3
-rw-r--r--sql/dawn.sql35
3 files changed, 37 insertions, 5 deletions
diff --git a/python/Dawn/models.py b/python/Dawn/models.py
index 24dc8b37..70a3cce7 100644
--- a/python/Dawn/models.py
+++ b/python/Dawn/models.py
@@ -171,6 +171,8 @@ class CDSDeal(db.Model):
upfront_settle_date = db.Column(db.Date, nullable=False)
initial_margin_percentage = db.Column(db.Float)
swap_type = db.Column(SWAP_TYPE, nullable=False)
+ orig_attach = db.Column(db.SmallInteger, info={'min': 0, 'max': 100})
+ orig_detach = db.Column(db.SmallInteger, info={'min': 0, 'max': 100})
attach = db.Column(db.Float, info={'min': 0., 'max': 100.})
detach = db.Column(db.Float, info={'min': 0., 'max': 100.})
corr_attach = db.Column(db.Float, info={'min': 0., 'max': 1.})
@@ -188,7 +190,7 @@ class CDSDeal(db.Model):
termination_counterparty = db.relationship(Counterparties, foreign_keys=[termination_cp])
fcm_account = db.relationship(Accounts, foreign_keys=[account_code])
__table_args__ = (db.CheckConstraint("swap_type!='CD_INDEX_TRANCHE' or " \
- "(attach is not NULL and detach is not NULL AND " \
+ "(orig_attach is not NULL and orig_detach is not NULL AND " \
"clearing_facility is NULL)"),)
class RepoDeal(db.Model):
diff --git a/python/Dawn/views.py b/python/Dawn/views.py
index eebb2671..086d7d99 100644
--- a/python/Dawn/views.py
+++ b/python/Dawn/views.py
@@ -102,7 +102,8 @@ class CDSForm(ModelForm):
model = CDSDeal
include_foreign_keys = True
exclude = ['dealid', 'lastupdate', 'termination_amount',
- 'termination_cp', 'termination_date', 'custodian', 'cashaccount']
+ 'termination_cp', 'termination_date', 'custodian',
+ 'cashaccount', 'attach', 'detach']
class SwaptionForm(ModelForm):
diff --git a/sql/dawn.sql b/sql/dawn.sql
index e3bd7640..161c734a 100644
--- a/sql/dawn.sql
+++ b/sql/dawn.sql
@@ -133,6 +133,8 @@ CREATE TABLE cds(id serial primary key,
upfront float NOT NULL,
upfront_settle_date date NOT NULL,
swap_type swap_type NOT NULL,
+ orig_attach smallint,
+ orig_detach smallint,
attach float,
detach float,
clearing_facility varchar(12) DEFAULT NULL,
@@ -145,9 +147,11 @@ CREATE TABLE cds(id serial primary key,
corr_attach float DEFAULT NULL,
corr_detach float DEFAULT NULL,
account_code varchar(5) NOT NULL,
- CONSTRAINT tranche_check CHECK (swap_type != 'CD_INDEX_TRANCHE' OR
- (attach IS NOT NULL AND detach IS NOT NULL AND
- clearing_facility IS NULL))
+ CONSTRAINT tranche_check CHECK ((
+ swap_type IN ('CD_INDEX_TRANCHE', 'BESPOKE') AND
+ (orig_attach IS NOT NULL AND orig_detach IS NOT NULL AND clearing_facility IS NULL))
+ OR (swap_type='CD_INDEX' AND orig_attach IS NULL AND orig_detach IS NULL AND clearing_facility='ICE-CREDIT')
+ OR (swap_type='ABS_CDS' AND orig_attach IS NULL AND orig_detach IS NULL AND clearing_faciliy IS NULL))
);
ALTER TABLE cds OWNER TO dawn_user;
@@ -290,11 +294,35 @@ identifier = COALESCE(identifier, cusip, isin)', NEW.id);
END;
$$ language plpgsql;
+CREATE OR REPLACE function update_attach()
+RETURNS TRIGGER AS $$
+DECLARE
+ factor float;
+ cum_loss float;
+BEGIN
+IF NEW.orig_attach IS NULL AND NEW.orig_detach IS NULL THEN
+RETURN NEW;
+ELSE
+SELECT indexfactor, cumulativeloss INTO factor, cum_loss
+ FROM index_version WHERE redindexcode=NEW.security_id;
+UPDATE cds
+ SET attach=100*LEAST(GREATEST((NEW.orig_attach - cum_loss)/factor, 0), 1),
+ detach=100*LEAST(GREATEST((NEW.orig_detach - cum_loss)/factor, 0), 1)
+WHERE id=NEW.id;
+RETURN NEW;
+END IF;
+END
+$$ LANGUAGE plpgsql;
+
+
create
trigger dealid after insert
on
capfloors for each row execute procedure auto_dealid() ;
+CREATE TRIGGER cds_attach AFTER INSERT OR UPDATE OF orig_attach, orig_detach ON cds
+FOR EACH ROW EXECUTE PROCEDURE update_attach();
+
CREATE TRIGGER swaptions_dealid AFTER INSERT ON swaptions
FOR EACH ROW EXECUTE PROCEDURE auto_dealid();
@@ -903,6 +931,7 @@ RETURN (newdetach-newattach)/(detach-attach)*index_factor;
END;
$$ LANGUAGE plpgsql;
+
CREATE OR REPLACE function fx_rate(p_date date) RETURNS TABLE(currency currency, fxrate float) AS $$
BEGIN
RETURN QUERY SELECT unnest(Array['USD', 'EUR', 'CAD'])::currency,