First pass at v0.2 of supporter database.
Redesign of database, mainly for three reasons: (a) we need to send renewal notices to Supporters, and need to keep a record of when we've sent them, (b) We need to keep better track of t-shirt requests, (c) We need to allow for different email addresses for contact other than the PayPal payer one. Before doing this, I briefly looked again at CiviCRM. While I can complete this conversion and all my scripts in just a matter of a few hours, setup of CiviCRM would take a minimum of a few hours just to investigate its viability for us and whether I'd be able to maintain it. So, we're doing custom, ad-hoc stuff still. This commit has not been tested, it's a first pass that I'll adjust.
This commit is contained in:
parent
6c67503f00
commit
203d810498
2 changed files with 183 additions and 9 deletions
111
scripts/db-convert-0.1-to-0.2.plx
Normal file
111
scripts/db-convert-0.1-to-0.2.plx
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use DBI;
|
||||||
|
use Encode qw(encode decode);
|
||||||
|
|
||||||
|
my($OLD_SUPPORTERS_SQLITE_DB_FILE, $NEW_SUPPORTERS_SQLITE_DB_FILE) = @ARGV;
|
||||||
|
|
||||||
|
my $dbhOld = DBI->connect("dbi:SQLite:dbname=$OLD_SUPPORTERS_SQLITE_DB_FILE", "", "",
|
||||||
|
{ RaiseError => 1, sqlite_unicode => 1 })
|
||||||
|
or die $DBI::errstr;
|
||||||
|
|
||||||
|
my $dbhNew = DBI->connect("dbi:SQLite:dbname=$NEW_SUPPORTERS_SQLITE_DB_FILE", "", "",
|
||||||
|
{ RaiseError => 1, sqlite_unicode => 1 })
|
||||||
|
or die $DBI::errstr;
|
||||||
|
|
||||||
|
# Insert t-shirt types and sizes
|
||||||
|
|
||||||
|
my $sthNew = $dbhNew->prepare("INSERT INTO request_type(type) values(?)");
|
||||||
|
|
||||||
|
$sthNew->execute("t-shirt-0");
|
||||||
|
my $tShirt0RequestTypeId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthNew->execute("t-shirt-1");
|
||||||
|
my $tShirt1RequestTypeId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthNew->finish();
|
||||||
|
|
||||||
|
my %tShirt0SizeRequestConfigurationIds;
|
||||||
|
|
||||||
|
$sthNew = $dbhNew->prepare("INSERT INTO request_configuration" .
|
||||||
|
"(request_type_id, description) values(?, ?)");
|
||||||
|
foreach my $requestTypeId (qw/$tShirt1RequestTypeId $tShirt0RequestTypeId/) {
|
||||||
|
foreach my $size (qw/LadiesS LadiesM LadiesL LadiesXL MenS MenM MenXL Men2XL/) {
|
||||||
|
$sthNew->execute($requestTypeId, $size);
|
||||||
|
$tShirt0SizeRequestConfigurationIds{$size} = $dbhNew->last_insert_id("","","","");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sthNew->execute("join-announce-email-list");
|
||||||
|
my $announceEmailListRequestTypeId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthNew->finish();
|
||||||
|
|
||||||
|
# Only one email Adress type so far
|
||||||
|
$sthNew = $dbhNew->prepare("INSERT INTO address_type(name) values('paypal_payer')");
|
||||||
|
my $paypalPayerEmailAddresTypeId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthNew->finish();
|
||||||
|
|
||||||
|
# Legacy fulfillment confirmation
|
||||||
|
$sthNew = $dbhNew->prepare("INSERT INTO fulfillment(date, who, how)" .
|
||||||
|
"values(date('now'), 'bkuhn', 'legacy import of old database; exact details of this fulfillment are unknown')");
|
||||||
|
my $fulfillmentId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthNew->finish();
|
||||||
|
|
||||||
|
my $sthNewInsertSupporter = $dbhNew->prepare('INSERT INTO supporter(' .
|
||||||
|
'ledger_entity_id, display_name, public_ack) values (?, ?, ?)');
|
||||||
|
my $sthInsertEmailAddress = $dbhNew->prepare('INSERT INTO email_address(supporter_id, email_address, email_type_id, date_encountered)' .
|
||||||
|
"values(?, ?, $paypalPayerEmailAddresTypeId, date('now'))");
|
||||||
|
|
||||||
|
my $sthLinkSupporterToEmail = $dbhNew->prepare('INSERT INTO supporter_email_address_mapping(supporter_id, email_address_id, preferred)' .
|
||||||
|
"values(?, ?, $paypalPayerEmailAddresTypeId, date('now'), 1)");
|
||||||
|
|
||||||
|
my $sthLinkSupporterToPostal = $dbhNew->prepare('INSERT INTO supporter_postal_address_mapping(supporter_id, postal_address_id, preferred)' .
|
||||||
|
"values(?, ?, $paypalPayerEmailAddresTypeId, date('now'), 1)");
|
||||||
|
|
||||||
|
my $sthInsertRequest = $dbhNew->prepare('INSERT INTO request' .
|
||||||
|
'(supporter_id, request_type_id, request_configuration_id, date_requested, fulfillment_id, notes) ' .
|
||||||
|
"values(?, ?, ?, date('now'), ?," .
|
||||||
|
'"import of old database; exact date of this request is unknown")');
|
||||||
|
|
||||||
|
my $sthPostalAddress = 'INSERT INTO postal_address(formatted_address, date_encountered)' .
|
||||||
|
"VALUES(? , date('now'))";
|
||||||
|
|
||||||
|
my $sthOld = $dbhOld->prepare('SELECT * from supporters order by id;');
|
||||||
|
$sthOld->execute();
|
||||||
|
while (my $row = $sthOld->fetchrow_hashref) {
|
||||||
|
$sthNewInsertSupporter->execute($row->{ledger_entity_id}, $row->{display_name},
|
||||||
|
$row->{public_ack});
|
||||||
|
my $supporterId = $dbhNew->last_insert_id("","","","");
|
||||||
|
die("Database conversion failed on id matching: $row->{ledger_entity_id} had ID $row->{id} now has $supporterId")
|
||||||
|
unless ($row->{id} == $supporterId);
|
||||||
|
if ($row->{want_gift}) {
|
||||||
|
die "DB Convert Fail: Unknown shirt size of $row->{shirt_size} when someone wanted a shirt"
|
||||||
|
unless defined $tShirt0SizeRequestConfigurationIds{$row->{shirt_size}};
|
||||||
|
$sthInsertRequest->execute($supporterId, $tShirt0RequestTypeId,
|
||||||
|
$tShirt0SizeRequestConfigurationIds{$row->{shirt_size}},
|
||||||
|
($row->{gift_sent} ? $fulfillmentId : undef));
|
||||||
|
}
|
||||||
|
if ($row->{join_list}) {
|
||||||
|
$sthInsertRequest->execute($supporterId, $announceEmailListRequestTypeId, undef,
|
||||||
|
($row->{on_announce_mailman_list} ? $fulfillmentId : undef));
|
||||||
|
}
|
||||||
|
$sthInsertEmailAddress->execute($supporterId, $row->{paypal_payer});
|
||||||
|
my $emailId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthLinkSupporterToEmail->execute($supporterId, $emailId);
|
||||||
|
$sthPostalAddress->execute($supporterId, $row->{formatted_address});
|
||||||
|
my $postalId = $dbhNew->last_insert_id("","","","");
|
||||||
|
$sthLinkSupporterToPostal->($supporterId, $postalId);
|
||||||
|
}
|
||||||
|
foreach my $sth (qw/$sthOld $sthOld $sthNewInsertSupporter $sthInsertEmailAddress
|
||||||
|
$sthLinkSupporterToEmail $sthInsertRequest $sthPostalAddress $sthLinkSupporterToPostal/) {
|
||||||
|
$sth->finish();
|
||||||
|
}
|
||||||
|
foreach my $dbh (qw/$dbhNew $dbhOld/) {
|
||||||
|
$dbhNew->disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# Local variables:
|
||||||
|
# compile-command: "perl -c db-convert-0.1-to-0.2.plx"
|
||||||
|
# End:
|
|
@ -1,16 +1,79 @@
|
||||||
DROP TABLE IF EXISTS "supporters";
|
-- Conservancy Supporter Database, Version 0.2
|
||||||
|
|
||||||
CREATE TABLE "supporters" (
|
DROP TABLE IF EXISTS "supporter";
|
||||||
|
|
||||||
|
CREATE TABLE "supporter" (
|
||||||
"id" integer NOT NULL PRIMARY KEY,
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
"paypal_payer" varchar(300) NOT NULL UNIQUE,
|
|
||||||
"ledger_entity_id" varchar(300) NOT NULL UNIQUE,
|
"ledger_entity_id" varchar(300) NOT NULL UNIQUE,
|
||||||
|
"postal_address_id " integer,
|
||||||
|
"email_address_id " integer,
|
||||||
"display_name" varchar(300),
|
"display_name" varchar(300),
|
||||||
"public_ack" bool NOT NULL,
|
"public_ack" bool NOT NULL,
|
||||||
"want_gift" bool NOT NULL,
|
|
||||||
"join_list" bool,
|
|
||||||
"shirt_size" varchar(10),
|
|
||||||
"gift_sent" integer NOT NULL DEFAULT 0,
|
|
||||||
"on_announce_mailman_list" bool NOT NULL DEFAULT 0,
|
|
||||||
"formatted_address" varchar(5000)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "request" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"supporter_id" integer NOT NULL,
|
||||||
|
"request_type_id" integer NOT NULL,
|
||||||
|
"request_configuration_id" integer,
|
||||||
|
"date_requested" date NOT NULL,
|
||||||
|
"fulfillment_id" integer,
|
||||||
|
"notes" TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "request_configuration" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"request_type_id" integer NOT NULL,
|
||||||
|
"description" varchar(100) NOT NULL,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "fulfillment" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"date" TEXT NOT NULL,
|
||||||
|
"who" varchar(300) NOT NULL,
|
||||||
|
"how" TEXT,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "request_type" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"type" varchar(100) NOT NULL,
|
||||||
|
);
|
||||||
|
|
||||||
|
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,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "supporter_email_address_mapping" (
|
||||||
|
"supporter_id" integer NOT NULL,
|
||||||
|
"email_address_id integer NOT NULL,
|
||||||
|
"preferred" bool,
|
||||||
|
PRIMARY KEY(supporter_id, email_address_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX supporter2email_single_prefferred_per_supporter
|
||||||
|
ON supporter2email(supporter_id, preferred);
|
||||||
|
|
||||||
|
CREATE TABLE "address_type" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"name" varchar(50) NOT NULL UNIQUE,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "postal_address" (
|
||||||
|
"id" integer NOT NULL PRIMARY KEY,
|
||||||
|
"formatted_address" varchar(5000),
|
||||||
|
"type_id" INTEGER NOT NULL,
|
||||||
|
"date_encountered" date NOT NULL,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "supporter_postal_address_mapping" (
|
||||||
|
"postal_address_id integer NOT NULL,
|
||||||
|
"preferred" bool,
|
||||||
|
PRIMARY KEY(supporter_id, email_address_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX supporter2postal_single_prefferred_per_supporter
|
||||||
|
ON supporter2email(supporter_id, preferred);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue