diff --git a/app/dao/letter_rate_dao.py b/app/dao/letter_rate_dao.py new file mode 100644 index 000000000..e69001a44 --- /dev/null +++ b/app/dao/letter_rate_dao.py @@ -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 diff --git a/app/models.py b/app/models.py index 6eeda9a77..bd016b4d0 100644 --- a/app/models.py +++ b/app/models.py @@ -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): diff --git a/migrations/versions/0149_add_crown_to_services.py b/migrations/versions/0149_add_crown_to_services.py index bfbbf976c..0a6412e9d 100644 --- a/migrations/versions/0149_add_crown_to_services.py +++ b/migrations/versions/0149_add_crown_to_services.py @@ -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 diff --git a/migrations/versions/0151_refactor_letter_rates.py b/migrations/versions/0151_refactor_letter_rates.py new file mode 100644 index 000000000..7a969cc42 --- /dev/null +++ b/migrations/versions/0151_refactor_letter_rates.py @@ -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') + ) diff --git a/tests/app/dao/test_letter_rate_dao.py b/tests/app/dao/test_letter_rate_dao.py new file mode 100644 index 000000000..f3fd0d139 --- /dev/null +++ b/tests/app/dao/test_letter_rate_dao.py @@ -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')