supporters/sql/supporters-schema.sql
Bradley M. Kuhn 89bd74a50a Implement ability to put requests on hold.
Requests can now be placed "on hold", and getRequest() can ignore held
requests.

This required addition of a table, and another API call holdRequest().

Tests were not written here, which was a mistake.  Unit tests and docs
are needed.  A FIXME was added, at least.

Also, minor imporvements to reporting on fulfilled requests.
2016-12-08 15:10:16 -08:00

114 lines
3 KiB
SQL

-- Conservancy Supporter Database, Version 0.2
DROP TABLE IF EXISTS "donor";
CREATE TABLE "donor" (
"id" integer NOT NULL PRIMARY KEY,
"ledger_entity_id" varchar(300) NOT NULL UNIQUE,
"display_name" varchar(300),
"public_ack" bool,
"is_supporter" bool NOT NULL
);
DROP TABLE IF EXISTS "request";
CREATE TABLE "request" (
"id" integer NOT NULL PRIMARY KEY,
"donor_id" integer NOT NULL,
"request_type_id" integer NOT NULL,
"request_configuration_id" integer,
"date_requested" date NOT NULL,
"notes" TEXT
);
CREATE UNIQUE INDEX request__one_request_for_each_type_per_donor
ON request(donor_id, request_type_id);
DROP TABLE IF EXISTS "request_configuration";
CREATE TABLE "request_configuration" (
"id" integer NOT NULL PRIMARY KEY,
"request_type_id" integer NOT NULL,
"description" varchar(100) NOT NULL
);
CREATE UNIQUE INDEX request_configuration__single_description
ON request_configuration(request_type_id, description);
DROP TABLE IF EXISTS "fulfillment";
CREATE TABLE "fulfillment" (
"id" integer NOT NULL PRIMARY KEY,
"request_id" integer NOT NULL,
"date" TEXT NOT NULL,
"who" varchar(300) NOT NULL,
"how" TEXT
);
CREATE UNIQUE INDEX fulfillment__one_fulfillment_per_request ON fulfillment(request_id);
DROP TABLE IF EXISTS "request_hold";
CREATE TABLE "request_hold" (
"id" integer NOT NULL PRIMARY KEY,
"request_id" integer NOT NULL,
"hold_date" TEXT NOT NULL,
"release_date" TEXT,
"who" varchar(300) NOT NULL,
"why" TEXT
);
CREATE UNIQUE INDEX request_hold__one_hold_per_request ON request_hold(request_id);
DROP TABLE IF EXISTS "request_type";
CREATE TABLE "request_type" (
"id" integer NOT NULL PRIMARY KEY,
"type" varchar(100) NOT NULL
);
DROP TABLE IF EXISTS "email_address";
CREATE TABLE "email_address" (
"id" integer NOT NULL PRIMARY KEY,
"email_address" varchar(300) NOT NULL UNIQUE,
"type_id" integer,
"date_encountered" date NOT NULL
);
DROP TABLE IF EXISTS "donor_email_address_mapping";
CREATE TABLE "donor_email_address_mapping" (
"donor_id" integer NOT NULL,
"email_address_id" integer NOT NULL,
"preferred" bool,
PRIMARY KEY(donor_id, email_address_id)
);
DROP TABLE IF EXISTS "address_type";
CREATE TABLE "address_type" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(50) NOT NULL UNIQUE
);
DROP TABLE IF EXISTS "postal_address";
CREATE TABLE "postal_address" (
"id" integer NOT NULL PRIMARY KEY,
"formatted_address" varchar(5000),
"type_id" INTEGER NOT NULL,
"date_encountered" date NOT NULL
);
DROP TABLE IF EXISTS "donor_postal_address_mapping";
CREATE TABLE "donor_postal_address_mapping" (
"donor_id" integer NOT NULL,
"postal_address_id" integer NOT NULL,
"preferred" bool,
PRIMARY KEY(donor_id, postal_address_id)
);
CREATE UNIQUE INDEX donor_postal_address_mapping_single_prefferred_per_donor
ON donor_postal_address_mapping(donor_id, preferred);