Beispiel #1
0
    def test_deposit_created_when_another_type_already_exist_for_user(self):
        birth_date = datetime.combine(datetime.utcnow(), time(
            0, 0)) - relativedelta(years=18, months=4)
        with freeze_time(datetime.utcnow() - relativedelta(years=3)):
            beneficiary = users_factories.UnderageBeneficiaryFactory(
                dateOfBirth=birth_date)

        api.create_deposit(beneficiary, "created by test")

        assert beneficiary.deposit.type == DepositType.GRANT_18
        assert len(beneficiary.deposits) == 2
Beispiel #2
0
def save_users_with_deposits():
    user1 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**")
    user2 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**")
    user3 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**")
    user4 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**")
    user5 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**")
    deposit1 = payments_api.create_deposit(user1, "sandbox")
    deposit2 = payments_api.create_deposit(user2, "sandbox")
    deposit3 = payments_api.create_deposit(user3, "sandbox")
    deposit4 = payments_api.create_deposit(user4, "sandbox")
    deposit5 = payments_api.create_deposit(user5, "sandbox")
    repository.save(deposit1, deposit2, deposit3, deposit4, deposit5)
    logger.info("created 5 users with deposits")
    return user1, user2, user3, user4, user5
Beispiel #3
0
def to_model(beneficiary_pre_subscription: BeneficiaryPreSubscription) -> User:
    beneficiary = User()

    beneficiary.activity = beneficiary_pre_subscription.activity
    beneficiary.address = beneficiary_pre_subscription.address
    beneficiary.city = beneficiary_pre_subscription.city
    beneficiary.civility = beneficiary_pre_subscription.civility
    beneficiary.dateOfBirth = beneficiary_pre_subscription.date_of_birth
    beneficiary.departementCode = beneficiary_pre_subscription.department_code
    beneficiary.email = beneficiary_pre_subscription.email
    beneficiary.firstName = beneficiary_pre_subscription.first_name
    beneficiary.hasSeenTutorials = False
    beneficiary.isAdmin = False
    beneficiary.lastName = beneficiary_pre_subscription.last_name
    beneficiary.password = random_password()
    beneficiary.phoneNumber = beneficiary_pre_subscription.phone_number
    beneficiary.postalCode = beneficiary_pre_subscription.postal_code
    beneficiary.publicName = beneficiary_pre_subscription.public_name
    beneficiary.isBeneficiary = True

    generate_reset_token(beneficiary,
                         validity_duration_hours=THIRTY_DAYS_IN_HOURS)

    deposit = payments_api.create_deposit(
        beneficiary, beneficiary_pre_subscription.deposit_source)
    beneficiary.deposits = [deposit]
    users_api.attach_beneficiary_import_details(beneficiary,
                                                beneficiary_pre_subscription)

    return beneficiary
Beispiel #4
0
def signup_webapp():
    objects_to_save = []
    check_valid_signup_webapp(request)

    new_user = User(from_dict=request.json)
    new_user.email = sanitize_email(new_user.email)
    new_user.notificationSubscriptions = asdict(
        NotificationSubscriptions(marketing_email=bool(request.json.get("contact_ok")))
    )

    if settings.IS_INTEGRATION:
        objects_to_save.append(payments_api.create_deposit(new_user, "test"))
    else:
        authorized_emails, departement_codes = get_authorized_emails_and_dept_codes(ttl_hash=get_ttl_hash())
        departement_code = _get_departement_code_when_authorized_or_error(authorized_emails, departement_codes)
        new_user.departementCode = departement_code

    new_user.remove_admin_role()
    new_user.remove_beneficiary_role()
    new_user.isEmailValidated = True
    new_user.needsToFillCulturalSurvey = False
    new_user.hasSeenTutorials = True
    objects_to_save.append(new_user)

    repository.save(*objects_to_save)

    update_external_user(new_user)

    return jsonify(as_dict(new_user, includes=BENEFICIARY_INCLUDES)), 201
def create_beneficiary_from_application(application_detail: dict,
                                        user: Optional[User] = None) -> User:
    if not user:
        beneficiary = User()
        beneficiary.password = random_password()
        beneficiary.email = application_detail["email"]
        beneficiary.dateOfBirth = application_detail["birth_date"]
    else:
        beneficiary = user

    beneficiary.lastName = application_detail["last_name"]
    beneficiary.firstName = application_detail["first_name"]
    beneficiary.publicName = "%s %s" % (application_detail["first_name"],
                                        application_detail["last_name"])
    beneficiary.phoneNumber = application_detail["phone"]
    beneficiary.departementCode = application_detail["department"]
    beneficiary.postalCode = application_detail["postal_code"]
    beneficiary.civility = application_detail["civility"]
    beneficiary.activity = application_detail["activity"]
    beneficiary.isAdmin = False
    beneficiary.hasSeenTutorials = False
    generate_reset_token(beneficiary,
                         validity_duration_hours=THIRTY_DAYS_IN_HOURS)

    beneficiary.isBeneficiary = True
    application_id = application_detail["application_id"]
    deposit = payments_api.create_deposit(
        beneficiary, f"démarches simplifiées dossier [{application_id}]")
    beneficiary.deposits = [deposit]

    return beneficiary
Beispiel #6
0
def fulfill_beneficiary_data(user: User, deposit_source: str, deposit_version: int = None) -> User:
    _generate_random_password(user)

    deposit = payment_api.create_deposit(user, deposit_source, version=deposit_version)
    user.deposits = [deposit]

    return user
Beispiel #7
0
def activate_beneficiary(
    user: users_models.User, deposit_source: str = None, has_activated_account: Optional[bool] = True
) -> users_models.User:
    if not deposit_source:
        beneficiary_import = subscription_repository.get_beneficiary_import_for_beneficiary(user)
        if not beneficiary_import:
            raise exceptions.BeneficiaryImportMissingException()

        eligibility = beneficiary_import.eligibilityType
        deposit_source = beneficiary_import.get_detailed_source()
    else:
        eligibility = users_models.EligibilityType.AGE18

    if eligibility == users_models.EligibilityType.UNDERAGE:
        user.add_underage_beneficiary_role()
    elif eligibility == users_models.EligibilityType.AGE18:
        user.add_beneficiary_role()
    else:
        raise users_exception.InvalidEligibilityTypeException()

    if "apps_flyer" in user.externalIds:
        apps_flyer_job.log_user_becomes_beneficiary_event_job.delay(user.id)

    deposit = payments_api.create_deposit(user, deposit_source=deposit_source, eligibility=eligibility)

    db.session.add_all((user, deposit))
    db.session.commit()
    logger.info("Activated beneficiary and created deposit", extra={"user": user.id, "source": deposit_source})

    db.session.refresh(user)

    update_external_user(user)
    _send_beneficiary_activation_email(user, has_activated_account)

    return user
Beispiel #8
0
def fulfill_user_data(user: User, deposit_source: str) -> User:
    user.password = random_password()
    generate_reset_token(user, validity_duration_hours=THIRTY_DAYS_IN_HOURS)

    deposit = payment_api.create_deposit(user, deposit_source)
    user.deposits = [deposit]

    return user
Beispiel #9
0
def activate_beneficiary(user: User, deposit_source: str) -> User:
    if not is_user_eligible(user):
        raise exceptions.NotEligible()
    user.isBeneficiary = True
    deposit = payment_api.create_deposit(user, deposit_source=deposit_source)
    db.session.add_all((user, deposit))
    db.session.commit()
    return user
def grant_wallet_to_existing_users(user_ids: List[int]):
    if settings.IS_PROD:
        raise ValueError("This action is not available on production")
    users = User.query.filter(User.id.in_(user_ids)).all()
    for user in users:
        user.isBeneficiary = True
        deposit = payments_api.create_deposit(user, "public")
        repository.save(user, deposit)
Beispiel #11
0
def create_or_update_users(rows: Iterable[dict]) -> list[User]:
    # The purpose of this function is to recreate test users on
    # staging after the staging database is reset. It's not meant to
    # be used anywhere else, and certainly not on production.
    if settings.IS_PROD:
        raise ValueError(
            "This function is not supposed to be run on production")

    users = []
    for row in rows:
        user = find_user_by_email(row["Mail"])
        birthdate = datetime.strptime(row["Date de naissance"], "%Y-%m-%d")
        if user:
            user.dateOfBirth = birthdate
            user.setPassword(settings.STAGING_TEST_USER_PASSWORD)
        else:
            user = users_api.create_account(
                email=sanitize_email(row["Mail"]),
                password=settings.STAGING_TEST_USER_PASSWORD,
                birthdate=birthdate,
                is_email_validated=True,
                send_activation_mail=False,
                remote_updates=False,
            )
            deposit = payments_api.create_deposit(user, "import_users (csv)")
            repository.save(deposit)

        user.add_beneficiary_role()
        user.lastName = row["Nom"]
        user.firstName = row["Prénom"]
        user.publicName = f"{user.firstName} {user.lastName}"
        user.phoneNumber = row["Téléphone"]
        user.departementCode = row["Département"]
        user.postalCode = row["Code postal"]
        repository.save(user)

        users.append(user)
        logger.info("Created or updated user=%s from CSV import", user.id)

    admin = find_user_by_email("*****@*****.**")
    if not admin:
        admin = users_api.create_account(
            email="*****@*****.**",
            password=settings.STAGING_TEST_USER_PASSWORD,
            birthdate=datetime(1946, 12, 24),
            is_email_validated=True,
            send_activation_mail=False,
            remote_updates=False,
        )
    admin.setPassword(settings.STAGING_TEST_USER_PASSWORD)
    admin.remove_beneficiary_role()
    admin.add_admin_role()
    admin.firstName = "Jeanne"
    admin.lastName = "Admin"
    admin.publicName = f"{user.firstName} {user.lastName}"
    repository.save(admin)
    logger.info("Created or updated admin user=%s", admin.id)
    return users
def change_pro_users_to_beneficiary(pro_users_ids: list[int]) -> None:
    users = User.query.filter(User.id.in_(pro_users_ids)).all()
    for user in users:
        user.add_beneficiary_role()
        user.remove_pro_role()
        user.needsToFillCulturalSurvey = True
        deposit = payments_api.create_deposit(user, "public")
        repository.save(user, deposit)
        user_offerer = UserOfferer.query.filter_by(user=user).all()
        repository.delete(*user_offerer)
Beispiel #13
0
    def test_cannot_create_twice_a_deposit_of_same_type(self):
        # Given
        AGE18_ELIGIBLE_BIRTH_DATE = datetime.now().replace(
            hour=0, minute=0, second=0, microsecond=0) - relativedelta(
                years=18, months=2)
        beneficiary = users_factories.BeneficiaryGrant18Factory(
            dateOfBirth=AGE18_ELIGIBLE_BIRTH_DATE)

        # When
        with pytest.raises(
                exceptions.DepositTypeAlreadyGrantedException) as error:
            api.create_deposit(beneficiary, "created by test")

        # Then
        assert Deposit.query.filter(
            Deposit.userId == beneficiary.id).count() == 1
        assert error.value.errors["user"] == [
            'Cet utilisateur a déjà été crédité de la subvention "GRANT_18".'
        ]
Beispiel #14
0
    def test_deposit_created_with_an_expiration_date(self, app):
        # Given
        beneficiary = UserFactory(email="*****@*****.**")
        repository.delete(*beneficiary.deposits)

        # When
        deposit = create_deposit(beneficiary, "created by test")

        # Then
        assert deposit.expirationDate == datetime(2023, 2, 5, 9, 0, 0)
Beispiel #15
0
    def test_deposit_created_with_version_1(self):
        # Given
        beneficiary = users_factories.UserFactory(
            dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) -
            relativedelta(years=18, months=2))

        deposit = api.create_deposit(beneficiary, "created by test", version=1)

        assert deposit.version == 1
        assert deposit.amount == Decimal(500)
        assert deposit.source == "created by test"
Beispiel #16
0
    def test_create_18_years_old_deposit(self):
        beneficiary = users_factories.UserFactory(
            dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) -
            relativedelta(years=18, months=4))

        deposit = api.create_deposit(beneficiary, "created by test")

        assert deposit.type == DepositType.GRANT_18
        assert deposit.version == 2
        assert deposit.amount == Decimal(300)
        assert deposit.user.id == beneficiary.id
        assert deposit.expirationDate == datetime(2023, 2, 5, 9, 0, 0)
Beispiel #17
0
    def test_wallet_balance(self):
        with freeze_time(datetime.utcnow() - relativedelta(years=2, days=2)):
            user = users_factories.UnderageBeneficiaryFactory(
                subscription_age=16)
            # disable trigger because deposit.expirationDate > now() is False in database time
            db.session.execute(
                "ALTER TABLE booking DISABLE TRIGGER booking_update;")
            bookings_factories.IndividualBookingFactory(
                individualBooking__user=user, amount=18)
            db.session.execute(
                "ALTER TABLE booking ENABLE TRIGGER booking_update;")

        payments_api.create_deposit(user, "test")

        bookings_factories.IndividualBookingFactory(
            individualBooking__user=user, isUsed=True, amount=10)
        bookings_factories.IndividualBookingFactory(
            individualBooking__user=user, isUsed=False, amount=1)

        assert db.session.query(func.get_wallet_balance(
            user.id, False)).first()[0] == Decimal(289)
        assert db.session.query(func.get_wallet_balance(
            user.id, True)).first()[0] == Decimal(290)
Beispiel #18
0
    def test_create_underage_deposit(self, age, expected_amount):
        beneficiary = users_factories.UserFactory(
            dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) -
            relativedelta(years=age, months=2))

        deposit = api.create_deposit(beneficiary, "created by test",
                                     beneficiary.eligibility)

        assert deposit.type == DepositType.GRANT_15_17
        assert deposit.version == 1
        assert deposit.amount == expected_amount
        assert deposit.user.id == beneficiary.id
        assert deposit.expirationDate == datetime(2021 - (age + 1) + 18, 12, 5,
                                                  0, 0, 0)
Beispiel #19
0
def create_pro_user(pro_user: ProUserCreationBodyModel) -> User:
    new_pro_user = User(from_dict=pro_user.dict(by_alias=True))
    new_pro_user.email = sanitize_email(new_pro_user.email)
    new_pro_user.notificationSubscriptions = asdict(NotificationSubscriptions(marketing_email=pro_user.contact_ok))
    new_pro_user.remove_admin_role()
    new_pro_user.remove_beneficiary_role()
    new_pro_user.needsToFillCulturalSurvey = False
    new_pro_user.generate_validation_token()

    if pro_user.postal_code:
        new_pro_user.departementCode = PostalCode(pro_user.postal_code).get_departement_code()

    if settings.IS_INTEGRATION:
        new_pro_user.add_beneficiary_role()
        deposit = payment_api.create_deposit(new_pro_user, "integration_signup")
        new_pro_user.deposits = [deposit]

    return new_pro_user
Beispiel #20
0
def signup_webapp():
    objects_to_save = []
    check_valid_signup_webapp(request)

    new_user = User(from_dict=request.json)
    if request.json.get("contact_ok"):
        new_user.hasAllowedRecommendations = True

    if settings.IS_INTEGRATION:
        new_user.departementCode = "00"
        objects_to_save.append(payments_api.create_deposit(new_user, "test"))
    else:
        authorized_emails, departement_codes = get_authorized_emails_and_dept_codes()
        departement_code = _get_departement_code_when_authorized_or_error(authorized_emails, departement_codes)
        new_user.departementCode = departement_code

    new_user.isBeneficiary = False
    new_user.isAdmin = False
    new_user.isEmailValidated = True
    objects_to_save.append(new_user)

    repository.save(*objects_to_save)

    return jsonify(as_dict(new_user, includes=BENEFICIARY_INCLUDES)), 201
Beispiel #21
0
def activate_beneficiary(user: User, deposit_source: str) -> User:
    user.isBeneficiary = True
    deposit = payment_api.create_deposit(user, deposit_source=deposit_source)
    db.session.add_all((user, deposit))
    db.session.commit()
    return user
Beispiel #22
0
def create_industrial_webapp_users():
    logger.info("create_industrial_webapp_users")

    users_by_name = {}
    deposit_versions = {}

    validation_prefix, validation_suffix = "AZERTY", 123
    validation_suffix += 1

    variants = itertools.product(DEPARTEMENT_CODES, WEBAPP_TAGS,
                                 DEPOSIT_VERSIONS)

    for departement_code, tag, deposit_version in variants:
        short_tag = "".join([chunk[0].upper() for chunk in tag.split("-")])

        if tag == "has-signed-up":
            reset_password_token = "{}{}".format(validation_prefix,
                                                 validation_suffix)
            validation_suffix += 1
        else:
            reset_password_token = None

        cultural_survey_id = None
        needs_to_fill_cultural_survey = False
        has_seen_tutorials = True

        if tag == "has-filled-cultural-survey":
            has_seen_tutorials = False

        if tag == "has-signed-up":
            cultural_survey_id = uuid.uuid4()
            needs_to_fill_cultural_survey = True
            has_seen_tutorials = False

        email = f"pctest.jeune{departement_code}.{tag}.v{deposit_version}@example.com"

        user = create_user(
            cultural_survey_id=cultural_survey_id,
            departement_code=str(departement_code),
            email=email,
            first_name="PC Test Jeune",
            date_of_birth=datetime(2003, 1, 1),
            has_seen_tutorials=has_seen_tutorials,
            last_name=f"{departement_code} {short_tag} {deposit_version}",
            needs_to_fill_cultural_survey=needs_to_fill_cultural_survey,
            postal_code="{}100".format(departement_code),
            public_name=
            f"PC Test Jeune {departement_code} {short_tag} {deposit_version}",
            reset_password_token=reset_password_token,
            reset_password_token_validity_limit=datetime.utcnow() +
            timedelta(hours=24),
        )
        user_key = f"jeune{departement_code} {tag} v{deposit_version}"
        users_by_name[user_key] = user
        deposit_versions[user_key] = deposit_version

    repository.save(*users_by_name.values())
    for user_key, user in users_by_name.items():
        # FIXME (asaunier, 2021-01-27): There are only 2 accounts in production where beneficiaries have no deposit
        #  including one passculture account.
        if not ("has-signed-up" in user_key
                or "has-booked-activation" in user_key):
            deposit = create_deposit(
                user,
                deposit_source="sandbox",
                version=deposit_versions[user_key],
            )
            repository.save(deposit)

    logger.info("created %d users", len(users_by_name))

    return users_by_name
def save_bookings_recap_sandbox():
    yesterday = datetime.utcnow() - timedelta(days=1)
    today = datetime.utcnow()

    beneficiary1 = create_user(
        public_name="Riri Duck",
        first_name="Riri",
        last_name="Duck",
        email="*****@*****.**",
    )
    beneficiary2 = create_user(
        public_name="Fifi Brindacier",
        first_name="Fifi",
        last_name="Brindacier",
        email="*****@*****.**",
    )
    beneficiary3 = create_user(
        public_name="LouLou Duck",
        first_name="Loulou",
        last_name="Duck",
        email="*****@*****.**",
    )

    repository.save(beneficiary1, beneficiary2, beneficiary3)
    deposit1 = create_deposit(beneficiary1, "public")
    deposit2 = create_deposit(beneficiary2, "public")
    deposit3 = create_deposit(beneficiary3, "public")
    repository.save(deposit1, deposit2, deposit3)

    pro = create_user(
        public_name="Balthazar Picsou",
        first_name="Balthazar",
        last_name="Picsou",
        email="*****@*****.**",
        is_beneficiary=False,
    )
    offerer = create_offerer(siren="645389012", )
    user_offerer = create_user_offerer(user=pro, offerer=offerer)
    venue1 = create_venue(offerer,
                          name="Cinéma Le Monde Perdu",
                          siret="64538901265877")
    venue2 = create_venue(offerer,
                          name="Librairie Atlantis",
                          siret="64538901201379")
    venue3 = create_venue(offerer,
                          name="Théatre Mordor",
                          siret="64538954601379")
    venue4_virtual = create_venue(offerer,
                                  name="Un lieu virtuel",
                                  siret=None,
                                  is_virtual=True)

    offer1_venue1 = create_offer_with_event_product(
        venue=venue1,
        event_name="Jurassic Park",
        event_type=EventType.CINEMA,
        is_duo=True,
    )
    stock_1_offer1_venue1 = create_stock(
        offer=offer1_venue1,
        beginning_datetime=yesterday,
        quantity=None,
        price=12.99,
    )
    offer2_venue1 = create_offer_with_event_product(
        venue=venue1,
        event_name="Matrix",
        event_type=EventType.CINEMA,
        is_duo=False,
    )
    stock_2_offer2_venue1 = create_stock(
        offer=offer2_venue1,
        beginning_datetime=today,
        quantity=None,
        price=0,
    )

    offer1_venue2 = create_offer_with_thing_product(
        venue=venue2,
        thing_name="Fondation",
        thing_type=ThingType.LIVRE_EDITION,
        extra_data={"isbn": "9788804119135"})
    stock_1_offer1_venue2 = create_stock(
        offer=offer1_venue2,
        quantity=42,
        price=9.99,
    )
    offer2_venue2 = create_offer_with_thing_product(
        venue=venue2,
        thing_name="Martine à la playa",
        thing_type=ThingType.LIVRE_EDITION,
        extra_data={"isbn": "9787605639121"},
    )
    stock_1_offer2_venue2 = create_stock(
        offer=offer2_venue2,
        quantity=12,
        price=49.99,
    )

    offer1_venue3 = create_offer_with_event_product(
        venue=venue3,
        event_name="Danse des haricots",
        event_type=EventType.SPECTACLE_VIVANT,
    )
    stock_1_offer1_venue3 = create_stock(
        offer=offer1_venue3,
        quantity=44,
        price=18.50,
    )

    offer1_venue4 = create_offer_with_thing_product(
        venue=venue4_virtual,
        thing_name="Le livre des haricots",
        thing_type=ThingType.LIVRE_EDITION,
    )
    stock_1_offer1_venue4 = create_stock(
        offer=offer1_venue4,
        quantity=70,
        price=10.99,
    )

    booking1_beneficiary1 = create_booking(
        user=beneficiary1,
        stock=stock_1_offer1_venue1,
        date_created=datetime(2020, 3, 18, 14, 56, 12, 0),
        is_used=True,
        date_used=datetime(2020, 3, 22, 17, 00, 10, 0),
        quantity=2,
    )
    booking2_beneficiary1 = create_booking(
        user=beneficiary1,
        stock=stock_2_offer2_venue1,
        date_created=datetime(2020, 4, 22, 9, 17, 12, 0),
    )
    booking1_beneficiary2 = create_booking(
        user=beneficiary2,
        stock=stock_1_offer1_venue1,
        date_created=datetime(2020, 3, 18, 12, 18, 12, 0),
        is_used=True,
        date_used=datetime(2020, 5, 2),
        quantity=2,
    )
    booking2_beneficiary2 = create_booking(
        user=beneficiary2,
        stock=stock_1_offer1_venue2,
        date_created=datetime(2020, 4, 12, 14, 31, 12, 0),
        is_cancelled=False,
    )
    booking1_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_2_offer2_venue1,
        date_created=datetime(2020, 1, 4, 19, 31, 12, 0),
        is_cancelled=False,
        is_used=True,
        date_used=datetime(2020, 1, 4, 23, 00, 10, 0),
        quantity=2,
    )
    booking2_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_1_offer1_venue2,
        date_created=datetime(2020, 3, 21, 22, 9, 12, 0),
        is_cancelled=False,
    )
    booking3_beneficiary1 = create_booking(
        user=beneficiary1,
        stock=stock_1_offer1_venue3,
        date_created=datetime(2020, 4, 12, 14, 31, 12, 0),
    )
    payment_booking3_beneficiary1 = create_payment(
        booking=booking3_beneficiary1,
        offerer=offerer,
        status=TransactionStatus.PENDING)
    booking3_beneficiary2 = create_booking(
        user=beneficiary2,
        stock=stock_1_offer1_venue3,
        date_created=datetime(2020, 4, 12, 19, 31, 12, 0),
        is_used=True,
        date_used=datetime(2020, 4, 22, 17, 00, 10, 0),
        is_cancelled=False,
    )
    payment_booking3_beneficiary2 = create_payment(
        booking=booking3_beneficiary2,
        offerer=offerer,
        status=TransactionStatus.SENT)
    booking3_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_1_offer1_venue3,
        date_created=datetime(2020, 4, 12, 22, 9, 12, 0),
    )
    payment_booking3_beneficiary3 = create_payment(
        booking=booking3_beneficiary3,
        offerer=offerer,
        status=TransactionStatus.ERROR)
    booking4_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_1_offer1_venue2,
        date_created=datetime(2020, 3, 21, 22, 9, 12, 0),
        is_cancelled=False,
        is_used=False,
    )
    booking5_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_1_offer1_venue4,
        date_created=datetime(2020, 3, 21, 22, 9, 12, 0),
        is_cancelled=False,
    )

    booking6_beneficiary3 = create_booking(
        user=beneficiary3,
        stock=stock_1_offer2_venue2,
        date_created=datetime(2020, 3, 21, 22, 9, 12, 0),
        is_used=True,
        date_used=datetime(2020, 4, 22, 21, 9, 12, 0),
    )
    payment_booking6_beneficiary3 = create_payment(
        booking=booking6_beneficiary3,
        offerer=offerer,
        status=TransactionStatus.SENT)

    booking7_beneficiary2 = create_booking(
        user=beneficiary2,
        stock=stock_1_offer2_venue2,
        date_created=datetime(2020, 4, 21, 22, 6, 12, 0),
        is_used=True,
        date_used=datetime(2020, 4, 22, 22, 9, 12, 0),
    )

    payment_booking7_beneficiary2 = create_payment(
        booking=booking7_beneficiary2,
        offerer=offerer,
        status=TransactionStatus.RETRY)

    booking8_beneficiary1 = create_booking(
        user=beneficiary1,
        stock=stock_1_offer2_venue2,
        date_created=datetime(2020, 2, 21, 22, 6, 12, 0),
        is_used=True,
        date_used=datetime(2020, 4, 22, 23, 9, 12, 0),
    )

    payment_booking8_beneficiary1 = create_payment(
        booking=booking8_beneficiary1,
        offerer=offerer,
        status=TransactionStatus.PENDING)

    repository.save(
        pro,
        booking1_beneficiary1,
        booking2_beneficiary1,
        booking1_beneficiary2,
        booking2_beneficiary2,
        booking1_beneficiary3,
        booking2_beneficiary3,
        booking5_beneficiary3,
        payment_booking3_beneficiary1,
        payment_booking3_beneficiary2,
        payment_booking3_beneficiary3,
        user_offerer,
        payment_booking6_beneficiary3,
        payment_booking7_beneficiary2,
        payment_booking8_beneficiary1,
        booking4_beneficiary3,
    )

    bookings_to_cancel = [
        booking2_beneficiary2,
        booking1_beneficiary3,
        booking2_beneficiary3,
        booking3_beneficiary2,
        booking5_beneficiary3,
    ]

    for booking in bookings_to_cancel:
        booking.isCancelled = True
    repository.save(*bookings_to_cancel)