From 5b2912c0f516e70a2b147d810fbe40f9b3dc04f3 Mon Sep 17 00:00:00 2001 From: venusbb Date: Wed, 18 Oct 2017 15:09:05 +0100 Subject: [PATCH] create new table annual_billing --- app/commands.py | 24 ++++++++++++++- app/dao/date_util.py | 2 +- app/models.py | 20 +++++++++++++ application.py | 2 ++ .../versions/0126_add_annual_billing.py | 29 +++++++++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/0126_add_annual_billing.py diff --git a/app/commands.py b/app/commands.py index 8686eeb0e..cb1298382 100644 --- a/app/commands.py +++ b/app/commands.py @@ -247,7 +247,7 @@ class PopulateServiceEmailReplyTo(Command): result = db.session.execute(services_to_update) db.session.commit() - print("Populated email reply to adderesses for {}".format(result.rowcount)) + print("Populated email reply to addresses for {}".format(result.rowcount)) class PopulateServiceSmsSender(Command): @@ -329,3 +329,25 @@ class PopulateServiceAndServiceHistoryFreeSmsFragmentLimit(Command): print("Populated free sms fragment limits for {} services".format(services_result.rowcount)) print("Populated free sms fragment limits for {} services history".format(services_history_result.rowcount)) + + +class PopulateAnnualBilling(Command): + def run(self): + financial_year=[2016,2017,2018] + + for fy in financial_year: + populate_data = """ + INSERT INTO annual_billing(id, service_id, free_sms_fragment_limit, financial_year_start, + created_at, updated_at) + SELECT uuid_in(md5(random()::text || now()::text)::cstring), id, 250000, {}, '{}', '{}' + FROM services + WHERE id NOT IN( + SELECT service_id + FROM annual_billing + WHERE financial_year_start={}) + """.format(fy, datetime.utcnow(), datetime.utcnow(), fy) + + services_result1 = db.session.execute(populate_data) + db.session.commit() + + print("Populated annual billing {} for {} services".format(fy, services_result1.rowcount)) diff --git a/app/dao/date_util.py b/app/dao/date_util.py index 8815e94cd..a0044517d 100644 --- a/app/dao/date_util.py +++ b/app/dao/date_util.py @@ -26,7 +26,7 @@ def get_financial_year(year): def get_april_fools(year): """ This function converts the start of the financial year April 1, 00:00 as BST (British Standard Time) to UTC, - the tzinfo is lastly removed from the datetime becasue the database stores the timestamps without timezone. + the tzinfo is lastly removed from the datetime because the database stores the timestamps without timezone. :param year: the year to calculate the April 1, 00:00 BST for :return: the datetime of April 1 for the given year, for example 2016 = 2016-03-31 23:00:00 """ diff --git a/app/models.py b/app/models.py index 809c32eb6..bd4a51668 100644 --- a/app/models.py +++ b/app/models.py @@ -1462,3 +1462,23 @@ class NotificationEmailReplyTo(db.Model): nullable=False, primary_key=True ) + + +class AnnualBilling(db.Model): + __tablename__ = "annual_billing" + id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), unique=False, index=True, nullable=False) + financial_year_start = db.Column(db.Integer, nullable=False, default=True) + free_sms_fragment_limit = db.Column(db.Integer, nullable=False, index=False, unique=False) + updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow) + created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow) + + def serialize(self): + return { + 'id': str(self.id), + 'service_id': str(self.service_id), + 'free_sms_fragment_limit': str(self.free_sms_fragment_limit), + 'financial_year_start': str(self.financial_year_start), + 'created_at': self.created_at.strftime(DATETIME_FORMAT), + 'updated_at': self.updated_at.strftime(DATETIME_FORMAT) if self.updated_at else None + } diff --git a/application.py b/application.py index 07fe4f0de..fb4f815c7 100644 --- a/application.py +++ b/application.py @@ -23,6 +23,8 @@ manager.add_command('populate_service_sms_sender', commands.PopulateServiceSmsSe manager.add_command('populate_service_letter_contact', commands.PopulateServiceLetterContact) manager.add_command('populate_service_and_service_history_free_sms_fragment_limit', commands.PopulateServiceAndServiceHistoryFreeSmsFragmentLimit) +manager.add_command('populate_annual_billing', + commands.PopulateAnnualBilling) @manager.command diff --git a/migrations/versions/0126_add_annual_billing.py b/migrations/versions/0126_add_annual_billing.py new file mode 100644 index 000000000..7f6dfe5b2 --- /dev/null +++ b/migrations/versions/0126_add_annual_billing.py @@ -0,0 +1,29 @@ +""" + +Revision ID: 0126_add_annual_billing +Revises: 0125_add_organisation_type +Create Date: 2017-10-18 11:42:54.261575 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +revision = '0126_add_annual_billing' +down_revision = '0125_add_organisation_type' + + +def upgrade(): + op.create_table('annual_billing', + sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('service_id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('financial_year_start', sa.Integer(), nullable=False), + sa.Column('free_sms_fragment_limit', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['service_id'], ['services.id'], ), + sa.PrimaryKeyConstraint('id')) + + +def downgrade(): + op.drop_table('annual_billing')