Esempio n. 1
0
def test_fetch_monthly_billing_for_year_adds_data_for_today(notify_db_session):
    service = create_service()
    template = create_template(service=service, template_type="email")
    for i in range(1, 32):
        create_ft_billing(utc_date='2018-07-{}'.format(i),
                          service=service,
                          template=template,
                          notification_type='email',
                          rate=0.162)
    create_notification(template=template, status='delivered')

    assert db.session.query(FactBilling.bst_date).count() == 31
    results = fetch_monthly_billing_for_year(service_id=service.id, year=2018)
    assert db.session.query(FactBilling.bst_date).count() == 32
    assert len(results) == 2
Esempio n. 2
0
def test_get_provider_contains_correct_fields(client, sample_template):
    create_ft_billing('2018-06-01',
                      sample_template,
                      provider='mmg',
                      billable_unit=1)

    response = client.get('/provider-details',
                          headers=[create_authorization_header()])
    json_resp = json.loads(response.get_data(as_text=True))['provider_details']
    allowed_keys = {
        "id", "created_by_name", "display_name", "identifier", "priority",
        'notification_type', "active", "updated_at", "supports_international",
        "current_month_billable_sms"
    }
    assert len(json_resp) == 4
    assert allowed_keys == set(json_resp[0].keys())
Esempio n. 3
0
def test_get_organisation_services_usage_sort_active_first(
        admin_request, notify_db_session):
    org = create_organisation(name='Organisation without live services')
    service = create_service(service_name='live service')
    archived_service = create_service(service_name='archived_service')
    template = create_template(service=service)
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    dao_add_service_to_organisation(service=archived_service,
                                    organisation_id=org.id)
    create_annual_billing(service_id=service.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2019)
    create_ft_billing(bst_date=datetime.utcnow().date(),
                      template=template,
                      billable_unit=19,
                      rate=0.060,
                      notifications_sent=19)
    response = admin_request.get(
        'organisation.get_organisation_services_usage',
        organisation_id=org.id,
        **{"year": 2019})
    assert len(response) == 1
    assert len(response['services']) == 2
    first_service = response['services'][0]
    assert first_service['service_id'] == str(archived_service.id)
    assert first_service['service_name'] == archived_service.name
    assert first_service['active'] is True
    last_service = response['services'][1]
    assert last_service['service_id'] == str(service.id)
    assert last_service['service_name'] == service.name
    assert last_service['active'] is True

    dao_archive_service(service_id=archived_service.id)
    response_after_archive = admin_request.get(
        'organisation.get_organisation_services_usage',
        organisation_id=org.id,
        **{"year": 2019})
    first_service = response_after_archive['services'][0]
    assert first_service['service_id'] == str(service.id)
    assert first_service['service_name'] == service.name
    assert first_service['active'] is True
    last_service = response_after_archive['services'][1]
    assert last_service['service_id'] == str(archived_service.id)
    assert last_service['service_name'] == archived_service.name
    assert last_service['active'] is False
def test_fetch_sms_free_allowance_remainder_with_two_services(
        notify_db_session):
    service = create_service(service_name='has free allowance')
    template = create_template(service=service)
    org = create_organisation(name="Org for {}".format(service.name))
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    create_annual_billing(service_id=service.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2016)
    create_ft_billing(template=template,
                      bst_date=datetime(2016, 4, 20),
                      billable_unit=2,
                      rate=0.11)
    create_ft_billing(template=template,
                      bst_date=datetime(2016, 5, 20),
                      billable_unit=3,
                      rate=0.11)

    service_2 = create_service(service_name='used free allowance')
    template_2 = create_template(service=service_2)
    org_2 = create_organisation(name="Org for {}".format(service_2.name))
    dao_add_service_to_organisation(service=service_2,
                                    organisation_id=org_2.id)
    create_annual_billing(service_id=service_2.id,
                          free_sms_fragment_limit=20,
                          financial_year_start=2016)
    create_ft_billing(template=template_2,
                      bst_date=datetime(2016, 4, 20),
                      billable_unit=12,
                      rate=0.11)
    create_ft_billing(template=template_2,
                      bst_date=datetime(2016, 4, 22),
                      billable_unit=10,
                      rate=0.11)
    create_ft_billing(template=template_2,
                      bst_date=datetime(2016, 5, 20),
                      billable_unit=3,
                      rate=0.11)

    results = fetch_sms_free_allowance_remainder(datetime(2016, 5, 1)).all()
    assert len(results) == 2
    service_result = [row for row in results if row[0] == service.id]
    assert service_result[0] == (service.id, 10, 2, 8)
    service_2_result = [row for row in results if row[0] == service_2.id]
    assert service_2_result[0] == (service_2.id, 20, 22, 0)
Esempio n. 5
0
def test_delete_billing_data(notify_db_session):
    service_1 = create_service(service_name="1")
    service_2 = create_service(service_name="2")
    sms_template = create_template(service_1, "sms")
    email_template = create_template(service_1, "email")
    other_service_template = create_template(service_2, "sms")

    existing_rows_to_delete = [  # noqa
        create_ft_billing("2018-01-01", "sms", sms_template, service_1, billable_unit=1),
        create_ft_billing("2018-01-01", "email", email_template, service_1, billable_unit=2),
    ]
    other_day = create_ft_billing("2018-01-02", "sms", sms_template, service_1, billable_unit=3)
    other_service = create_ft_billing("2018-01-01", "sms", other_service_template, service_2, billable_unit=4)

    delete_billing_data_for_service_for_day("2018-01-01", service_1.id)

    current_rows = FactBilling.query.all()
    assert sorted(x.billable_units for x in current_rows) == sorted([other_day.billable_units, other_service.billable_units])
def test_fetch_sms_billing_for_all_services_for_first_quarter(
        notify_db_session):
    # This test is useful because the inner query resultset is empty.
    service = create_service(service_name='a - has free allowance')
    template = create_template(service=service)
    org = create_organisation(name="Org for {}".format(service.name))
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    create_annual_billing(service_id=service.id,
                          free_sms_fragment_limit=25000,
                          financial_year_start=2019)
    create_ft_billing(template=template,
                      bst_date=datetime(2019, 4, 20),
                      billable_unit=44,
                      rate=0.11)
    results = fetch_sms_billing_for_all_services(datetime(2019, 4, 1),
                                                 datetime(2019, 5, 30))
    assert len(results) == 1
    assert results[0] == (org.name, org.id, service.name, service.id, 25000,
                          Decimal('0.11'), 25000, 44, 0, Decimal('0'))
Esempio n. 7
0
def test_delete_billing_data(notify_db_session):
    service_1 = create_service(service_name='1')
    service_2 = create_service(service_name='2')
    sms_template = create_template(service_1, 'sms')
    email_template = create_template(service_1, 'email')
    other_service_template = create_template(service_2, 'sms')

    existing_rows_to_delete = [  # noqa
        create_ft_billing('2018-01-01', sms_template, billable_unit=1),
        create_ft_billing('2018-01-01', email_template, billable_unit=2)
    ]
    other_day = create_ft_billing('2018-01-02', sms_template, billable_unit=3)
    other_service = create_ft_billing('2018-01-01', other_service_template, billable_unit=4)

    delete_billing_data_for_service_for_day('2018-01-01', service_1.id)

    current_rows = FactBilling.query.all()
    assert sorted(x.billable_units for x in current_rows) == sorted(
        [other_day.billable_units, other_service.billable_units]
    )
def test_dao_get_provider_stats_counts_billable_sms_within_last_month_with_rate_multiplier(setup_provider_details):
    sms_provider = next((provider for provider in setup_provider_details if provider.notification_type == 'sms'), None)

    service = create_service(service_name='1')
    sms_template = create_template(service, 'sms')

    create_ft_billing(
        '2018-06-05',
        'sms',
        sms_template,
        service,
        provider=sms_provider.identifier,
        billable_unit=4,
        rate_multiplier=2
    )

    results = dao_get_provider_stats()

    sms_provider_result = next((result for result in results if result.identifier == sms_provider.identifier), None)

    assert sms_provider_result.current_month_billable_sms == 8
def test_dao_get_provider_stats_ignores_billable_sms_older_than_1_month(
        setup_provider_details):
    sms_provider = next((provider for provider in setup_provider_details
                         if provider.notification_type == 'sms'), None)

    service = create_service(service_name='1')
    sms_template = create_template(service, 'sms')

    create_ft_billing('2017-06-05',
                      'sms',
                      sms_template,
                      service,
                      provider=sms_provider.identifier,
                      billable_unit=4)

    results = dao_get_provider_stats()

    sms_provider_result = next(
        (result for result in results
         if result.identifier == sms_provider.identifier), None)

    assert sms_provider_result.current_month_billable_sms == 0
Esempio n. 10
0
def test_fetch_monthly_billing_for_year(notify_db_session):
    service = create_service()
    template = create_template(service=service, template_type="sms")
    for i in range(1, 31):
        create_ft_billing(
            utc_date="2018-06-{}".format(i),
            service=service,
            template=template,
            notification_type="sms",
            rate_multiplier=2,
            rate=0.162,
        )
    for i in range(1, 32):
        create_ft_billing(
            utc_date="2018-07-{}".format(i),
            service=service,
            template=template,
            notification_type="sms",
            rate=0.158,
        )

    results = fetch_monthly_billing_for_year(service_id=service.id, year=2018)

    assert len(results) == 2
    assert str(results[0].month) == "2018-06-01"
    assert results[0].notifications_sent == 30
    assert results[0].billable_units == Decimal("60")
    assert results[0].rate == Decimal("0.162")
    assert results[0].notification_type == "sms"
    assert results[0].postage == "none"

    assert str(results[1].month) == "2018-07-01"
    assert results[1].notifications_sent == 31
    assert results[1].billable_units == Decimal("31")
    assert results[1].rate == Decimal("0.158")
    assert results[1].notification_type == "sms"
    assert results[1].postage == "none"
Esempio n. 11
0
def set_up_yearly_data():
    service = create_service()
    sms_template = create_template(service=service, template_type="sms")
    email_template = create_template(service=service, template_type="email")
    letter_template = create_template(service=service, template_type="letter")

    start_date = date(2016, 3, 31)
    end_date = date(2017, 4, 2)

    for n in range((end_date - start_date).days):
        dt = start_date + timedelta(days=n)

        create_ft_billing(bst_date=dt, template=sms_template, rate=0.162)
        create_ft_billing(bst_date=dt, template=email_template, rate=0)
        create_ft_billing(bst_date=dt, template=letter_template, rate=0.33, postage='second')
        create_ft_billing(bst_date=dt, template=letter_template, rate=0.30, postage='second')
    return service
Esempio n. 12
0
def test_get_yearly_usage_by_monthly_from_ft_billing(client, notify_db_session):
    service = create_service()
    sms_template = create_template(service=service, template_type="sms")
    email_template = create_template(service=service, template_type="email")
    letter_template = create_template(service=service, template_type="letter")
    for month in range(1, 13):
        mon = str(month).zfill(2)
        for day in range(1, monthrange(2016, month)[1] + 1):
            d = str(day).zfill(2)
            create_ft_billing(utc_date='2016-{}-{}'.format(mon, d),
                              service=service,
                              template=sms_template,
                              notification_type='sms',
                              billable_unit=1,
                              rate=0.162)
            create_ft_billing(utc_date='2016-{}-{}'.format(mon, d),
                              service=service,
                              template=email_template,
                              notification_type='email',
                              rate=0)
            create_ft_billing(utc_date='2016-{}-{}'.format(mon, d),
                              service=service,
                              template=letter_template,
                              notification_type='letter',
                              billable_unit=1,
                              rate=0.33,
                              postage='second')

    response = client.get('service/{}/billing/ft-monthly-usage?year=2016'.format(service.id),
                          headers=[('Content-Type', 'application/json'), create_authorization_header()])

    json_resp = json.loads(response.get_data(as_text=True))
    ft_letters = [x for x in json_resp if x['notification_type'] == 'letter']
    ft_sms = [x for x in json_resp if x['notification_type'] == 'sms']
    ft_email = [x for x in json_resp if x['notification_type'] == 'email']
    keys = [x.keys() for x in ft_sms][0]
    expected_sms_april = {"month": "April",
                          "notification_type": "sms",
                          "billing_units": 30,
                          "rate": 0.162,
                          "postage": "none"
                          }
    expected_letter_april = {"month": "April",
                             "notification_type": "letter",
                             "billing_units": 30,
                             "rate": 0.33,
                             "postage": "second"
                             }

    for k in keys:
        assert ft_sms[0][k] == expected_sms_april[k]
        assert ft_letters[0][k] == expected_letter_april[k]
    assert len(ft_email) == 0
def test_fetch_usage_year_for_organisation_only_returns_data_for_live_services(
        notify_db_session):
    org = create_organisation(name='Organisation without live services')
    live_service = create_service(restricted=False)
    sms_template = create_template(service=live_service)
    trial_service = create_service(restricted=True,
                                   service_name='trial_service')
    email_template = create_template(service=trial_service,
                                     template_type='email')
    trial_sms_template = create_template(service=trial_service,
                                         template_type='sms')
    trial_letter_template = create_template(service=trial_service,
                                            template_type='letter')
    dao_add_service_to_organisation(service=live_service,
                                    organisation_id=org.id)
    dao_add_service_to_organisation(service=trial_service,
                                    organisation_id=org.id)
    create_ft_billing(bst_date=datetime.utcnow().date(),
                      template=sms_template,
                      rate=0.0158,
                      billable_unit=19,
                      notifications_sent=19)
    create_ft_billing(bst_date=datetime.utcnow().date(),
                      template=email_template,
                      billable_unit=0,
                      notifications_sent=100)
    create_ft_billing(bst_date=datetime.utcnow().date(),
                      template=trial_sms_template,
                      billable_unit=200,
                      rate=0.0158,
                      notifications_sent=100)
    create_ft_billing(bst_date=datetime.utcnow().date(),
                      template=trial_letter_template,
                      billable_unit=40,
                      rate=0.30,
                      notifications_sent=20)

    results = fetch_usage_year_for_organisation(organisation_id=org.id,
                                                year=2019)

    assert len(results) == 1
    assert results[str(live_service.id)]['sms_billable_units'] == 19
    assert results[str(live_service.id)]['emails_sent'] == 0
Esempio n. 14
0
def set_up_yearly_data():
    service = create_service()
    sms_template = create_template(service=service, template_type="sms")
    email_template = create_template(service=service, template_type="email")
    letter_template = create_template(service=service, template_type="letter")
    for month in range(1, 13):
        mon = str(month).zfill(2)
        for day in range(1, monthrange(2016, month)[1] + 1):
            d = str(day).zfill(2)
            create_ft_billing(
                utc_date="2016-{}-{}".format(mon, d),
                service=service,
                template=sms_template,
                notification_type="sms",
                rate=0.0162,
            )
            create_ft_billing(
                utc_date="2016-{}-{}".format(mon, d),
                service=service,
                template=sms_template,
                notification_type="sms",
                rate_multiplier=2,
                rate=0.0162,
            )
            create_ft_billing(
                utc_date="2016-{}-{}".format(mon, d),
                service=service,
                template=email_template,
                notification_type="email",
                billable_unit=0,
                rate=0,
            )
            create_ft_billing(
                utc_date="2016-{}-{}".format(mon, d),
                service=service,
                template=letter_template,
                notification_type="letter",
                rate=0.33,
                postage="second",
            )
        start_date, end_date = get_month_start_and_end_date_in_utc(datetime(2016, int(mon), 1))
    return service
Esempio n. 15
0
def set_up_yearly_data():
    service = create_service()
    sms_template = create_template(service=service, template_type="sms")
    email_template = create_template(service=service, template_type="email")
    letter_template = create_template(service=service, template_type="letter")
    for year in (2016, 2017):
        for month in range(1, 13):
            mon = str(month).zfill(2)
            for day in range(1, monthrange(year, month)[1] + 1):
                d = str(day).zfill(2)
                create_ft_billing(
                    utc_date="{}-{}-{}".format(year, mon, d),
                    service=service,
                    template=sms_template,
                    notification_type="sms",
                    rate=0.162,
                )
                create_ft_billing(
                    utc_date="{}-{}-{}".format(year, mon, d),
                    service=service,
                    template=email_template,
                    notification_type="email",
                    rate=0,
                )
                create_ft_billing(
                    utc_date="{}-{}-{}".format(year, mon, d),
                    service=service,
                    template=letter_template,
                    notification_type="letter",
                    rate=0.33,
                    postage="second",
                )
                create_ft_billing(
                    utc_date="{}-{}-{}".format(year, mon, d),
                    service=service,
                    template=letter_template,
                    notification_type="letter",
                    rate=0.30,
                    postage="second",
                )
    return service
Esempio n. 16
0
def test_dao_fetch_live_services_data(sample_user):
    org = create_organisation(organisation_type="nhs_central")
    service = create_service(go_live_user=sample_user,
                             go_live_at="2014-04-20T10:00:00")
    template = create_template(service=service)
    service_2 = create_service(
        service_name="second",
        go_live_at="2017-04-20T10:00:00",
        go_live_user=sample_user,
    )
    service_3 = create_service(service_name="third",
                               go_live_at="2016-04-20T10:00:00")
    # below services should be filtered out:
    create_service(service_name="restricted", restricted=True)
    create_service(service_name="not_active", active=False)
    create_service(service_name="not_live", count_as_live=False)
    template2 = create_template(service=service, template_type="email")
    template_letter_1 = create_template(service=service,
                                        template_type="letter")
    template_letter_2 = create_template(service=service_2,
                                        template_type="letter")
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    # two sms billing records for 1st service within current financial year:
    create_ft_billing(
        utc_date="2019-04-20",
        notification_type="sms",
        template=template,
        service=service,
    )
    create_ft_billing(
        utc_date="2019-04-21",
        notification_type="sms",
        template=template,
        service=service,
    )
    # one sms billing record for 1st service from previous financial year, should not appear in the result:
    create_ft_billing(
        utc_date="2018-04-20",
        notification_type="sms",
        template=template,
        service=service,
    )
    # one email billing record for 1st service within current financial year:
    create_ft_billing(
        utc_date="2019-04-20",
        notification_type="email",
        template=template2,
        service=service,
    )
    # one letter billing record for 1st service within current financial year:
    create_ft_billing(
        utc_date="2019-04-15",
        notification_type="letter",
        template=template_letter_1,
        service=service,
    )
    # one letter billing record for 2nd service within current financial year:
    create_ft_billing(
        utc_date="2019-04-16",
        notification_type="letter",
        template=template_letter_2,
        service=service_2,
    )

    # 1st service: billing from 2018 and 2019
    create_annual_billing(service.id, 500, 2018)
    create_annual_billing(service.id, 100, 2019)
    # 2nd service: billing from 2018
    create_annual_billing(service_2.id, 300, 2018)
    # 3rd service: billing from 2019
    create_annual_billing(service_3.id, 200, 2019)

    results = dao_fetch_live_services_data()
    assert len(results) == 3
Esempio n. 17
0
def test_dao_fetch_live_services_data(sample_user):
    org = create_organisation(organisation_type='other')
    service = create_service(go_live_user=sample_user,
                             go_live_at='2014-04-20T10:00:00')
    template = create_template(service=service)
    service_2 = create_service(service_name='second',
                               go_live_at='2017-04-20T10:00:00',
                               go_live_user=sample_user)
    service_3 = create_service(service_name='third',
                               go_live_at='2016-04-20T10:00:00')
    # below services should be filtered out:
    create_service(service_name='restricted', restricted=True)
    create_service(service_name='not_active', active=False)
    create_service(service_name='not_live', count_as_live=False)
    template2 = create_template(service=service, template_type='email')
    template_letter_1 = create_template(service=service,
                                        template_type='letter')
    template_letter_2 = create_template(service=service_2,
                                        template_type='letter')
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    # two sms billing records for 1st service within current financial year:
    create_ft_billing(utc_date='2019-04-20',
                      notification_type='sms',
                      template=template,
                      service=service)
    create_ft_billing(utc_date='2019-04-21',
                      notification_type='sms',
                      template=template,
                      service=service)
    # one sms billing record for 1st service from previous financial year, should not appear in the result:
    create_ft_billing(utc_date='2018-04-20',
                      notification_type='sms',
                      template=template,
                      service=service)
    # one email billing record for 1st service within current financial year:
    create_ft_billing(utc_date='2019-04-20',
                      notification_type='email',
                      template=template2,
                      service=service)
    # one letter billing record for 1st service within current financial year:
    create_ft_billing(utc_date='2019-04-15',
                      notification_type='letter',
                      template=template_letter_1,
                      service=service)
    # one letter billing record for 2nd service within current financial year:
    create_ft_billing(utc_date='2019-04-16',
                      notification_type='letter',
                      template=template_letter_2,
                      service=service_2)

    # 1st service: billing from 2018 and 2019
    create_annual_billing(service.id, 500, 2018)
    create_annual_billing(service.id, 100, 2019)
    # 2nd service: billing from 2018
    create_annual_billing(service_2.id, 300, 2018)
    # 3rd service: billing from 2019
    create_annual_billing(service_3.id, 200, 2019)

    results = dao_fetch_live_services_data()
    assert len(results) == 3
def test_dao_get_provider_stats(notify_db_session):
    service_1 = create_service(service_name='1')
    service_2 = create_service(service_name='2')
    sms_template_1 = create_template(service_1, 'sms')
    sms_template_2 = create_template(service_2, 'sms')

    create_ft_billing('2017-06-05',
                      'sms',
                      sms_template_2,
                      service_1,
                      provider='mmg',
                      billable_unit=4)
    create_ft_billing('2018-05-31',
                      'sms',
                      sms_template_1,
                      service_1,
                      provider='sns',
                      billable_unit=1)
    create_ft_billing('2018-06-01',
                      'sms',
                      sms_template_1,
                      service_1,
                      provider='sns',
                      rate_multiplier=2,
                      billable_unit=1)
    create_ft_billing('2018-06-03',
                      'sms',
                      sms_template_2,
                      service_1,
                      provider='mmg',
                      billable_unit=4)
    create_ft_billing('2018-06-15',
                      'sms',
                      sms_template_1,
                      service_2,
                      provider='mmg',
                      billable_unit=1)
    create_ft_billing('2018-06-28',
                      'sms',
                      sms_template_2,
                      service_2,
                      provider='sns',
                      billable_unit=2)

    provider = get_provider_details_by_identifier('pinpoint')
    provider.priority = 50
    dao_update_provider_details(provider)

    result = dao_get_provider_stats()

    assert len(result) == 7

    assert result[0].identifier == 'ses'
    assert result[0].display_name == 'AWS SES'
    assert result[0].created_by_name is None
    assert result[0].current_month_billable_sms == 0

    assert result[1].identifier == 'sns'
    assert result[1].display_name == 'AWS SNS'
    assert result[1].supports_international is False
    assert result[1].active is True
    assert result[1].current_month_billable_sms == 4

    assert result[2].identifier == 'mmg'
    assert result[2].notification_type == 'sms'
    assert result[2].supports_international is True
    assert result[2].active is False
    assert result[2].current_month_billable_sms == 5

    assert result[3].identifier == 'firetext'
    assert result[3].active is False
    assert result[3].current_month_billable_sms == 0

    assert result[4].identifier == 'loadtesting'
    assert result[4].active is False
    assert result[4].current_month_billable_sms == 0
    assert result[4].supports_international is False

    assert result[5].identifier == 'pinpoint'
    assert result[5].notification_type == 'sms'
    assert result[5].supports_international is False
    assert result[5].active is False
    assert result[5].current_month_billable_sms == 0
def test_fetch_sms_billing_for_all_services_with_remainder(notify_db_session):
    service = create_service(service_name='a - has free allowance')
    template = create_template(service=service)
    org = create_organisation(name="Org for {}".format(service.name))
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    create_annual_billing(service_id=service.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2019)
    create_ft_billing(service=service,
                      template=template,
                      utc_date=datetime(2019, 4, 20),
                      notification_type='sms',
                      billable_unit=2,
                      rate=0.11)
    create_ft_billing(service=service,
                      template=template,
                      utc_date=datetime(2019, 5, 20),
                      notification_type='sms',
                      billable_unit=2,
                      rate=0.11)
    create_ft_billing(service=service,
                      template=template,
                      utc_date=datetime(2019, 5, 22),
                      notification_type='sms',
                      billable_unit=1,
                      rate=0.11)

    service_2 = create_service(service_name='b - used free allowance')
    template_2 = create_template(service=service_2)
    org_2 = create_organisation(name="Org for {}".format(service_2.name))
    dao_add_service_to_organisation(service=service_2,
                                    organisation_id=org_2.id)
    create_annual_billing(service_id=service_2.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2019)
    create_ft_billing(service=service_2,
                      template=template_2,
                      utc_date=datetime(2019, 4, 20),
                      notification_type='sms',
                      billable_unit=12,
                      rate=0.11)
    create_ft_billing(service=service_2,
                      template=template_2,
                      utc_date=datetime(2019, 5, 20),
                      notification_type='sms',
                      billable_unit=3,
                      rate=0.11)
    service_3 = create_service(service_name='c - partial allowance')
    template_3 = create_template(service=service_3)
    org_3 = create_organisation(name="Org for {}".format(service_3.name))
    dao_add_service_to_organisation(service=service_3,
                                    organisation_id=org_3.id)
    create_annual_billing(service_id=service_3.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2019)
    create_ft_billing(service=service_3,
                      template=template_3,
                      utc_date=datetime(2019, 4, 20),
                      notification_type='sms',
                      billable_unit=5,
                      rate=0.11)
    create_ft_billing(service=service_3,
                      template=template_3,
                      utc_date=datetime(2019, 5, 20),
                      notification_type='sms',
                      billable_unit=7,
                      rate=0.11)

    service_4 = create_service(service_name='d - email only')
    email_template = create_template(service=service_4, template_type='email')
    org_4 = create_organisation(name="Org for {}".format(service_4.name))
    dao_add_service_to_organisation(service=service_4,
                                    organisation_id=org_4.id)
    create_annual_billing(service_id=service_4.id,
                          free_sms_fragment_limit=10,
                          financial_year_start=2019)
    create_ft_billing(service=service_4,
                      template=email_template,
                      utc_date=datetime(2019, 5, 22),
                      notifications_sent=5,
                      notification_type='email',
                      billable_unit=0,
                      rate=0)

    results = fetch_sms_billing_for_all_services(datetime(2019, 5, 1),
                                                 datetime(2019, 5, 31))
    assert len(results) == 3
    # (organisation_name, organisation_id, service_name, free_sms_fragment_limit, sms_rate,
    #  sms_remainder, sms_billable_units, chargeable_billable_sms, sms_cost)
    assert results[0] == (org.name, org.id, service.name, service.id, 10,
                          Decimal('0.11'), 8, 3, 0, Decimal('0'))
    assert results[1] == (org_2.name, org_2.id, service_2.name, service_2.id,
                          10, Decimal('0.11'), 0, 3, 3, Decimal('0.33'))
    assert results[2] == (org_3.name, org_3.id, service_3.name, service_3.id,
                          10, Decimal('0.11'), 5, 7, 2, Decimal('0.22'))
Esempio n. 20
0
def test_dao_fetch_live_services_data(sample_user):
    org = create_organisation(organisation_type='nhs_central')
    service = create_service(go_live_user=sample_user, go_live_at='2014-04-20T10:00:00')
    sms_template = create_template(service=service)
    service_2 = create_service(service_name='second', go_live_at='2017-04-20T10:00:00', go_live_user=sample_user)
    service_3 = create_service(service_name='third', go_live_at='2016-04-20T10:00:00')
    # below services should be filtered out:
    create_service(service_name='restricted', restricted=True)
    create_service(service_name='not_active', active=False)
    create_service(service_name='not_live', count_as_live=False)
    email_template = create_template(service=service, template_type='email')
    template_letter_1 = create_template(service=service, template_type='letter')
    template_letter_2 = create_template(service=service_2, template_type='letter')
    dao_add_service_to_organisation(service=service, organisation_id=org.id)
    # two sms billing records for 1st service within current financial year:
    create_ft_billing(bst_date='2019-04-20', template=sms_template)
    create_ft_billing(bst_date='2019-04-21', template=sms_template)
    # one sms billing record for 1st service from previous financial year, should not appear in the result:
    create_ft_billing(bst_date='2018-04-20', template=sms_template)
    # one email billing record for 1st service within current financial year:
    create_ft_billing(bst_date='2019-04-20', template=email_template)
    # one letter billing record for 1st service within current financial year:
    create_ft_billing(bst_date='2019-04-15', template=template_letter_1)
    # one letter billing record for 2nd service within current financial year:
    create_ft_billing(bst_date='2019-04-16', template=template_letter_2)

    # 1st service: billing from 2018 and 2019
    create_annual_billing(service.id, 500, 2018)
    create_annual_billing(service.id, 100, 2019)
    # 2nd service: billing from 2018
    create_annual_billing(service_2.id, 300, 2018)
    # 3rd service: billing from 2019
    create_annual_billing(service_3.id, 200, 2019)

    results = dao_fetch_live_services_data()
    assert len(results) == 3
    # checks the results and that they are ordered by date:
    assert results == [
        {'service_id': mock.ANY, 'service_name': 'Sample service', 'organisation_name': 'test_org_1',
            'organisation_type': 'nhs_central', 'consent_to_research': None, 'contact_name': 'Test User',
            'contact_email': '*****@*****.**', 'contact_mobile': '+447700900986',
            'live_date': datetime(2014, 4, 20, 10, 0), 'sms_volume_intent': None, 'email_volume_intent': None,
            'letter_volume_intent': None, 'sms_totals': 2, 'email_totals': 1, 'letter_totals': 1,
            'free_sms_fragment_limit': 100},
        {'service_id': mock.ANY, 'service_name': 'third', 'organisation_name': None, 'consent_to_research': None,
            'organisation_type': None, 'contact_name': None, 'contact_email': None,
            'contact_mobile': None, 'live_date': datetime(2016, 4, 20, 10, 0), 'sms_volume_intent': None,
            'email_volume_intent': None, 'letter_volume_intent': None,
            'sms_totals': 0, 'email_totals': 0, 'letter_totals': 0,
            'free_sms_fragment_limit': 200},
        {'service_id': mock.ANY, 'service_name': 'second', 'organisation_name': None, 'consent_to_research': None,
            'contact_name': 'Test User', 'contact_email': '*****@*****.**',
            'contact_mobile': '+447700900986', 'live_date': datetime(2017, 4, 20, 10, 0), 'sms_volume_intent': None,
            'organisation_type': None, 'email_volume_intent': None, 'letter_volume_intent': None,
            'sms_totals': 0, 'email_totals': 0, 'letter_totals': 1,
            'free_sms_fragment_limit': 300}
    ]
def test_dao_get_provider_stats(notify_db_session):
    service_1 = create_service(service_name='1')
    service_2 = create_service(service_name='2')
    sms_template_1 = create_template(service_1, 'sms')
    sms_template_2 = create_template(service_2, 'sms')

    create_ft_billing('2017-06-05',
                      sms_template_2,
                      provider='firetext',
                      billable_unit=4)
    create_ft_billing('2018-05-31',
                      sms_template_1,
                      provider='mmg',
                      billable_unit=1)
    create_ft_billing('2018-06-01',
                      sms_template_1,
                      provider='mmg',
                      rate_multiplier=2,
                      billable_unit=1)
    create_ft_billing('2018-06-03',
                      sms_template_2,
                      provider='firetext',
                      billable_unit=4)
    create_ft_billing('2018-06-15',
                      sms_template_1,
                      provider='firetext',
                      billable_unit=1)
    create_ft_billing('2018-06-28',
                      sms_template_2,
                      provider='mmg',
                      billable_unit=2)

    result = dao_get_provider_stats()

    assert len(result) == 4

    assert result[0].identifier == 'ses'
    assert result[0].display_name == 'AWS SES'
    assert result[0].created_by_name is None
    assert result[0].current_month_billable_sms == 0

    assert result[1].identifier == 'firetext'
    assert result[1].notification_type == 'sms'
    assert result[1].supports_international is False
    assert result[1].active is True
    assert result[1].current_month_billable_sms == 5

    assert result[2].identifier == 'mmg'
    assert result[2].display_name == 'MMG'
    assert result[2].supports_international is True
    assert result[2].active is True
    assert result[2].current_month_billable_sms == 4

    assert result[3].identifier == 'dvla'
    assert result[3].current_month_billable_sms == 0
    assert result[3].supports_international is False
Esempio n. 22
0
def set_up_data_for_all_cases():
    service = create_service()
    sms_template = create_template(service=service, template_type="sms")
    email_template = create_template(service=service, template_type="email")
    letter_template = create_template(service=service, template_type="letter")
    create_ft_billing(utc_date='2018-05-16',
                      notification_type='sms',
                      template=sms_template,
                      service=service,
                      rate_multiplier=1,
                      international=False,
                      rate=0.162,
                      billable_unit=1,
                      notifications_sent=1)
    create_ft_billing(utc_date='2018-05-17',
                      notification_type='sms',
                      template=sms_template,
                      service=service,
                      rate_multiplier=2,
                      international=False,
                      rate=0.162,
                      billable_unit=2,
                      notifications_sent=1)
    create_ft_billing(utc_date='2018-05-16',
                      notification_type='sms',
                      template=sms_template,
                      service=service,
                      rate_multiplier=2,
                      international=False,
                      rate=0.0150,
                      billable_unit=2,
                      notifications_sent=1)
    create_ft_billing(utc_date='2018-05-16',
                      notification_type='email',
                      template=email_template,
                      service=service,
                      rate_multiplier=1,
                      international=False,
                      rate=0,
                      billable_unit=0,
                      notifications_sent=1)
    create_ft_billing(utc_date='2018-05-16',
                      notification_type='letter',
                      template=letter_template,
                      service=service,
                      rate_multiplier=1,
                      international=False,
                      rate=0.33,
                      billable_unit=1,
                      notifications_sent=1,
                      postage='second')
    create_ft_billing(utc_date='2018-05-17',
                      notification_type='letter',
                      template=letter_template,
                      service=service,
                      rate_multiplier=1,
                      international=False,
                      rate=0.36,
                      billable_unit=2,
                      notifications_sent=1,
                      postage='second')
    create_ft_billing(utc_date='2018-05-18',
                      notification_type='letter',
                      template=letter_template,
                      service=service,
                      rate_multiplier=1,
                      international=False,
                      rate=0.39,
                      billable_unit=3,
                      notifications_sent=1,
                      postage='first')
    return service
Esempio n. 23
0
def test_dao_get_provider_stats(notify_db_session):
    service_1 = create_service(service_name="1")
    service_2 = create_service(service_name="2")
    sms_template_1 = create_template(service_1, "sms")
    sms_template_2 = create_template(service_2, "sms")

    create_ft_billing("2017-06-05", "sms", sms_template_2, service_1, provider="mmg", billable_unit=4)
    create_ft_billing("2018-05-31", "sms", sms_template_1, service_1, provider="sns", billable_unit=1)
    create_ft_billing(
        "2018-06-01",
        "sms",
        sms_template_1,
        service_1,
        provider="sns",
        rate_multiplier=2,
        billable_unit=1,
    )
    create_ft_billing("2018-06-03", "sms", sms_template_2, service_1, provider="mmg", billable_unit=4)
    create_ft_billing("2018-06-15", "sms", sms_template_1, service_2, provider="mmg", billable_unit=1)
    create_ft_billing("2018-06-28", "sms", sms_template_2, service_2, provider="sns", billable_unit=2)

    provider = get_provider_details_by_identifier("pinpoint")
    provider.priority = 50
    dao_update_provider_details(provider)

    result = dao_get_provider_stats()

    assert len(result) == 7

    assert result[0].identifier == "ses"
    assert result[0].display_name == "AWS SES"
    assert result[0].created_by_name is None
    assert result[0].current_month_billable_sms == 0

    assert result[1].identifier == "sns"
    assert result[1].display_name == "AWS SNS"
    assert result[1].supports_international is False
    assert result[1].active is True
    assert result[1].current_month_billable_sms == 4

    assert result[2].identifier == "mmg"
    assert result[2].notification_type == "sms"
    assert result[2].supports_international is True
    assert result[2].active is False
    assert result[2].current_month_billable_sms == 5

    assert result[3].identifier == "firetext"
    assert result[3].active is False
    assert result[3].current_month_billable_sms == 0

    assert result[4].identifier == "loadtesting"
    assert result[4].active is False
    assert result[4].current_month_billable_sms == 0
    assert result[4].supports_international is False

    assert result[5].identifier == "pinpoint"
    assert result[5].notification_type == "sms"
    assert result[5].supports_international is False
    assert result[5].active is False
    assert result[5].current_month_billable_sms == 0