Merge pull request #1470 from alphagov/refactor-letter-rates

Refactor letter rates
This commit is contained in:
Rebecca Law
2017-12-07 11:15:50 +00:00
committed by GitHub
5 changed files with 141 additions and 11 deletions

View File

@@ -0,0 +1,23 @@
from app import db
from app.dao.dao_utils import transactional
from app.models import LetterRate
@transactional
def dao_create_letter_rate(letter_rate):
db.session.add(letter_rate)
def get_letter_rates_for_daterange(date, crown, sheet_count, post_class='second'):
rates = LetterRate.query.filter(
LetterRate.start_date <= date
).filter((LetterRate.end_date == None) | # noqa
(LetterRate.end_date > date)
).filter(
LetterRate.crown == crown
).filter(
LetterRate.sheet_count == sheet_count
).filter(
LetterRate.post_class == post_class
).all()
return rates

View File

@@ -1484,17 +1484,12 @@ class LetterRate(db.Model):
__tablename__ = 'letter_rates'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
valid_from = valid_from = db.Column(db.DateTime, nullable=False)
class LetterRateDetail(db.Model):
__tablename__ = 'letter_rate_details'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
letter_rate_id = db.Column(UUID(as_uuid=True), db.ForeignKey('letter_rates.id'), index=True, nullable=False)
letter_rate = db.relationship('LetterRate', backref='letter_rates')
page_total = db.Column(db.Integer, nullable=False)
start_date = db.Column(db.DateTime, nullable=False)
end_date = db.Column(db.DateTime, nullable=True)
sheet_count = db.Column(db.Integer, nullable=False) # double sided sheet
rate = db.Column(db.Numeric(), nullable=False)
crown = db.Column(db.Boolean, nullable=False)
post_class = db.Column(db.String, nullable=False)
class MonthlyBilling(db.Model):

View File

@@ -1,6 +1,6 @@
"""
Revision ID: 0149_add_crown_column_to_services
Revision ID: 0149_add_crown_to_services
Revises: 0148_add_letters_as_pdf_svc_perm
Create Date: 2017-12-04 12:13:35.268712

View File

@@ -0,0 +1,71 @@
"""
Revision ID: 0151_refactor_letter_rates
Revises: 0150_another_letter_org
Create Date: 2017-12-05 10:24:41.232128
"""
import uuid
from datetime import datetime
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
revision = '0151_refactor_letter_rates'
down_revision = '0150_another_letter_org'
def upgrade():
op.drop_table('letter_rate_details')
op.drop_table('letter_rates')
op.create_table('letter_rates',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('start_date', sa.DateTime(), nullable=False),
sa.Column('end_date', sa.DateTime(), nullable=True),
sa.Column('sheet_count', sa.Integer(), nullable=False),
sa.Column('rate', sa.Numeric(), nullable=False),
sa.Column('crown', sa.Boolean(), nullable=False),
sa.Column('post_class', sa.String(), nullable=False),
sa.PrimaryKeyConstraint('id')
)
start_date = datetime(2016, 3, 31, 23, 00, 00)
op.execute("insert into letter_rates values('{}', '{}', null, 1, 0.30, True, 'second')".format(
str(uuid.uuid4()), start_date)
)
op.execute("insert into letter_rates values('{}', '{}', null, 2, 0.33, True, 'second')".format(
str(uuid.uuid4()), start_date)
)
op.execute("insert into letter_rates values('{}', '{}', null, 3, 0.36, True, 'second')".format(
str(uuid.uuid4()), start_date)
)
op.execute("insert into letter_rates values('{}', '{}', null, 1, 0.33, False, 'second')".format(
str(uuid.uuid4()), start_date)
)
op.execute("insert into letter_rates values('{}', '{}', null, 2, 0.39, False, 'second')".format(
str(uuid.uuid4()), start_date)
)
op.execute("insert into letter_rates values('{}', '{}', null, 3, 0.45, False, 'second')".format(
str(uuid.uuid4()), start_date)
)
def downgrade():
op.drop_table('letter_rates')
op.create_table('letter_rates',
sa.Column('id', postgresql.UUID(), autoincrement=False, nullable=False),
sa.Column('valid_from', postgresql.TIMESTAMP(), autoincrement=False, nullable=False),
sa.PrimaryKeyConstraint('id', name='letter_rates_pkey'),
postgresql_ignore_search_path=False
)
op.create_table('letter_rate_details',
sa.Column('id', postgresql.UUID(), autoincrement=False, nullable=False),
sa.Column('letter_rate_id', postgresql.UUID(), autoincrement=False, nullable=False),
sa.Column('page_total', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('rate', sa.NUMERIC(), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['letter_rate_id'], ['letter_rates.id'],
name='letter_rate_details_letter_rate_id_fkey'),
sa.PrimaryKeyConstraint('id', name='letter_rate_details_pkey')
)

View File

@@ -0,0 +1,41 @@
from datetime import datetime
from decimal import Decimal
from app.dao.letter_rate_dao import dao_create_letter_rate, get_letter_rates_for_daterange
from app.models import LetterRate
def test_dao_create_letter_rate(notify_db_session):
letter_rate = LetterRate(start_date=datetime(2017, 12, 1),
rate=0.33,
crown=True,
sheet_count=1,
post_class='second')
dao_create_letter_rate(letter_rate)
rates = LetterRate.query.all()
assert len(rates) == 1
def test_get_letter_rates_for_daterange(notify_db_session):
letter_rate = LetterRate(start_date=datetime(2017, 12, 1),
rate=0.33,
crown=True,
sheet_count=1,
post_class='second')
dao_create_letter_rate(letter_rate)
letter_rate = LetterRate(start_date=datetime(2016, 12, 1),
end_date=datetime(2017, 12, 1),
rate=0.30,
crown=True,
sheet_count=1,
post_class='second')
dao_create_letter_rate(letter_rate)
results = get_letter_rates_for_daterange(date=datetime(2017, 12, 2), crown=True, sheet_count=1, post_class='second')
assert len(results) == 1
assert results[0].rate == Decimal('0.33')