예제 #1
0
def test_create_payment_for_booking_takes_recipient_name_and_siren_from_offerer(
        app):
    # given
    user = create_user()
    stock = create_stock(price=10, quantity=5)
    booking = create_booking(user=user, quantity=1, stock=stock)
    booking.stock.offer = Offer()
    offerer = create_offerer(name="Test Offerer", siren="123456789")
    venue = create_venue(offerer, name="Test Venue")

    create_bank_information(bic="QSDFGH8Z555",
                            iban="CF13QSDFGH456789",
                            offerer=offerer)
    create_bank_information(bic=None, iban=None, venue=venue)

    booking.stock.offer.venue = venue
    booking.stock.offer.venue.managingOfferer = offerer
    booking_reimbursement = BookingReimbursement(
        booking, ReimbursementRules.PHYSICAL_OFFERS, Decimal(10))

    # when
    payment = create_payment_for_booking(booking_reimbursement)

    # then
    assert payment.recipientName == "Test Offerer"
    assert payment.recipientSiren == "123456789"
예제 #2
0
def test_create_payment_for_booking_when_no_iban_on_venue_should_take_payment_info_from_offerer(
        app):
    # given
    user = create_user()
    stock = create_stock(price=10, quantity=5)
    offerer = create_offerer(name="Test Offerer")
    venue = create_venue(offerer, name="Test Venue")

    create_bank_information(bic="QsdFGH8Z555",
                            iban="cf13QSDFGH456789",
                            offerer=offerer)
    create_bank_information(bic=None, iban=None, venue=venue)

    booking = create_booking(user=user, quantity=1, stock=stock)
    booking.stock.offer = Offer()
    booking.stock.offer.venue = venue
    booking.stock.offer.venue.managingOfferer = offerer
    booking_reimbursement = BookingReimbursement(
        booking, ReimbursementRules.PHYSICAL_OFFERS, Decimal(10))

    # when
    payment = create_payment_for_booking(booking_reimbursement)

    # then
    assert payment.iban == "CF13QSDFGH456789"
    assert payment.bic == "QSDFGH8Z555"
예제 #3
0
def test_create_payment_for_booking_with_common_information(app):
    # given
    user = create_user()
    stock = create_stock(price=10, quantity=5)
    booking = create_booking(user=user, quantity=1, stock=stock)
    booking.stock.offer = Offer()
    booking.stock.offer.venue = VenueSQLEntity()
    offerer = create_offerer()
    create_bank_information(bic="QSDFGH8Z555",
                            iban="CF13QSDFGH456789",
                            offerer=offerer)
    booking.stock.offer.venue.managingOfferer = offerer
    booking_reimbursement = BookingReimbursement(
        booking, ReimbursementRules.PHYSICAL_OFFERS, Decimal(10))

    # when
    payment = create_payment_for_booking(booking_reimbursement)

    # then
    assert payment.booking == booking
    assert payment.amount == Decimal(10)
    assert payment.reimbursementRule == ReimbursementRules.PHYSICAL_OFFERS.value.description
    assert payment.reimbursementRate == ReimbursementRules.PHYSICAL_OFFERS.value.rate
    assert payment.comment is None
    assert payment.author == "batch"
    assert payment.transactionLabel == "pass Culture Pro - remboursement 2nde quinzaine 10-2018"
예제 #4
0
def test_create_payment_for_booking_when_iban_is_on_venue_should_take_payment_info_from_venue(
        app):
    # given
    user = create_user()
    stock = create_stock(price=10, quantity=5)
    offerer = create_offerer(name="Test Offerer")
    venue = create_venue(
        offerer,
        name="Test Venue",
    )
    booking = create_booking(user=user, quantity=1, stock=stock)

    create_bank_information(bic="Lajr93",
                            iban="B135TGGEG532TG",
                            offerer=offerer)
    create_bank_information(bic="LokiJU76",
                            iban="KD98765RFGHZ788",
                            venue=venue)

    booking.stock.offer = Offer()
    booking.stock.offer.venue = venue
    booking.stock.offer.venue.managingOfferer = offerer
    booking_reimbursement = BookingReimbursement(
        booking, ReimbursementRules.PHYSICAL_OFFERS, Decimal(10))

    # when
    payment = create_payment_for_booking(booking_reimbursement)

    # then
    assert payment.iban == "KD98765RFGHZ788"
    assert payment.bic == "LOKIJU76"
예제 #5
0
        def test_when_status_change_rib_should_be_correctly_updated(
                self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            bank_information = create_bank_information(
                application_id=8,
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                offerer=offerer,
                status=BankInformationStatus.ACCEPTED,
                date_modified=datetime(2018, 1, 1),
            )
            repository.save(offerer, bank_information)
            mock_application_details.return_value = offerer_demarche_simplifiee_application_detail_response(
                siren="793875030",
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                idx=8,
                state="initiated")

            # When
            self.save_offerer_bank_informations.execute(
                application_id=application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == None
            assert bank_information.iban == None
            assert bank_information.status == BankInformationStatus.DRAFT
예제 #6
0
        def test_when_receive_new_application_with_lower_status_should_reject(self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            venue = create_venue(offerer, siret="79387503012345")
            bank_information = create_bank_information(
                application_id=79,
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                venue=venue,
                date_modified=datetime(2018, 1, 1),
                status=BankInformationStatus.ACCEPTED,
            )
            repository.save(bank_information)
            mock_application_details.return_value = venue_demarche_simplifiee_application_detail_response_with_siret(
                siret="79387503012345", bic="SOGEFRPP", iban="FR7630007000111234567890144", idx=8, state="initiated"
            )

            # When
            with pytest.raises(CannotRegisterBankInformation) as error:
                self.save_venue_bank_informations.execute(application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == "QSDFGH8Z555"
            assert bank_information.iban == "NL36INGB2682297498"
            assert bank_information.status == BankInformationStatus.ACCEPTED
            assert bank_information.applicationId == 79
            assert error.value.args == ("Received application details state does not allow to change bank information",)
예제 #7
0
        def test_when_rib_and_offerer_change_everything_should_be_updated(
                self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            new_offerer = create_offerer(siren="793875019")
            bank_information = create_bank_information(
                application_id=8,
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                offerer=offerer,
                date_modified=datetime(2018, 1, 1),
            )
            repository.save(offerer, new_offerer, bank_information)
            mock_application_details.return_value = offerer_demarche_simplifiee_application_detail_response(
                siren="793875019",
                bic="SOGEFRPP",
                iban="FR7630007000111234567890144",
                idx=8)

            # When
            self.save_offerer_bank_informations.execute(
                application_id=application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == "SOGEFRPP"
            assert bank_information.iban == "FR7630007000111234567890144"
            assert bank_information.offererId == new_offerer.id
예제 #8
0
        def test_when_receive_new_closed_application_should_override_previous_one(
                self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            bank_information = create_bank_information(
                application_id=79,
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                offerer=offerer,
                date_modified=datetime(2018, 1, 1),
            )
            repository.save(offerer, bank_information)
            mock_application_details.return_value = offerer_demarche_simplifiee_application_detail_response(
                siren="793875030",
                bic="SOGEFRPP",
                iban="FR7630007000111234567890144",
                idx=8)

            # When
            self.save_offerer_bank_informations.execute(
                application_id=application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == "SOGEFRPP"
            assert bank_information.iban == "FR7630007000111234567890144"
            assert bank_information.applicationId == 8
예제 #9
0
        def test_when_receive_older_application_should_reject(
                self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            bank_information = create_bank_information(
                application_id=79,
                bic="QSDFGH8Z555",
                iban="NL36INGB2682297498",
                offerer=offerer,
                date_modified=datetime(2020, 2, 2),
            )
            repository.save(offerer, bank_information)
            mock_application_details.return_value = offerer_demarche_simplifiee_application_detail_response(
                siren="793875030",
                bic="SOGEFRPP",
                iban="FR7630007000111234567890144",
                idx=8)

            # When
            with pytest.raises(CannotRegisterBankInformation) as error:
                self.save_offerer_bank_informations.execute(
                    application_id=application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == "QSDFGH8Z555"
            assert bank_information.iban == "NL36INGB2682297498"
            assert bank_information.status == BankInformationStatus.ACCEPTED
            assert bank_information.applicationId == 79
            assert error.value.args == (
                "Received application details are older than saved one", )
    def test_should_return_payment_to_retry_if_bank_information_linked_to_venue_and_current_status_is_not_processable(
            self, app):
        # Given
        offerer = create_offerer()
        user = users_factories.UserFactory()
        venue = create_venue(offerer)
        stock = create_stock_from_offer(create_offer_with_thing_product(venue),
                                        price=0)
        booking = create_booking(user=user, stock=stock)
        not_processable_payment = create_payment(
            booking,
            offerer,
            10,
            status=TransactionStatus.NOT_PROCESSABLE,
            iban="CF13QSDFGH456789",
            bic="QSDFGH8Z555")
        bank_information = create_bank_information(venue=venue)
        repository.save(not_processable_payment, bank_information)

        # When
        payments_to_retry = payment_queries.find_not_processable_with_bank_information(
        )

        # Then
        assert not_processable_payment in payments_to_retry
예제 #11
0
        def test_when_receive_new_application_with_draft_state_should_update_previously_rejected_bank_information(
                self, mock_application_details, app):
            # Given
            application_id = "8"
            offerer = create_offerer(siren="793875030")
            bank_information = create_bank_information(
                application_id=79,
                bic=None,
                iban=None,
                offerer=offerer,
                date_modified=datetime(2018, 1, 1),
                status=BankInformationStatus.REJECTED,
            )
            repository.save(offerer, bank_information)
            mock_application_details.return_value = offerer_demarche_simplifiee_application_detail_response(
                siren="793875030",
                bic="SOGEFRPP",
                iban="FR7630007000111234567890144",
                idx=8,
                state="initiated")

            # When
            self.save_offerer_bank_informations.execute(
                application_id=application_id)

            # Then
            bank_information_count = BankInformation.query.count()
            assert bank_information_count == 1
            bank_information = BankInformation.query.one()
            assert bank_information.bic == None
            assert bank_information.iban == None
            assert bank_information.status == BankInformationStatus.DRAFT
예제 #12
0
        def when_user_has_an_offerer_attached(self, app):
            # Given
            user = create_user(email="*****@*****.**")
            deposit = create_deposit(user, amount=500, source="public")
            offerer1 = create_offerer()
            offerer2 = create_offerer(siren="123456788")
            user_offerer1 = create_user_offerer(user, offerer1, validation_token=None)
            user_offerer2 = create_user_offerer(user, offerer2, validation_token=None)
            venue1 = create_venue(offerer1)
            venue2 = create_venue(offerer1, siret="12345678912346")
            venue3 = create_venue(offerer2, siret="12345678912347")
            bank_information1 = create_bank_information(application_id=1, venue=venue1)
            bank_information2 = create_bank_information(application_id=7, venue=venue2)
            stock1 = create_stock_with_thing_offer(offerer=offerer1, venue=venue1, price=10)
            stock2 = create_stock_with_thing_offer(offerer=offerer1, venue=venue2, price=11)
            stock3 = create_stock_with_thing_offer(offerer=offerer2, venue=venue3, price=12)
            stock4 = create_stock_with_thing_offer(offerer=offerer2, venue=venue3, price=13)
            booking1 = create_booking(user=user, stock=stock1, is_used=True, token="ABCDEF", venue=venue1)
            booking2 = create_booking(user=user, stock=stock1, token="ABCDEG", venue=venue1)
            booking3 = create_booking(user=user, stock=stock2, is_used=True, token="ABCDEH", venue=venue2)
            booking4 = create_booking(user=user, stock=stock3, is_used=True, token="ABCDEI", venue=venue3)
            booking5 = create_booking(user=user, stock=stock4, is_used=True, token="ABCDEJ", venue=venue3)
            booking6 = create_booking(user=user, stock=stock4, is_used=True, token="ABCDEK", venue=venue3)
            repository.save(
                deposit,
                booking1,
                booking2,
                booking3,
                booking4,
                booking5,
                booking6,
                user_offerer1,
                user_offerer2,
                bank_information1,
                bank_information2,
            )
            generate_new_payments()

            # When
            response = TestClient(app.test_client()).with_auth(user.email).get("/reimbursements/csv")
            response_lines = response.data.decode("utf-8").split("\n")

            # Then
            assert response.status_code == 200
            assert response.headers["Content-type"] == "text/csv; charset=utf-8;"
            assert response.headers["Content-Disposition"] == "attachment; filename=remboursements_pass_culture.csv"
            assert len(response_lines) == 7
    def test_find_all_offerer_reimbursement_details(self, app):
        # Given
        user = users_factories.UserFactory(email="*****@*****.**")
        offerer1 = create_offerer(siren="123456789")
        user_offerer1 = create_user_offerer(user,
                                            offerer1,
                                            validation_token=None)
        venue1 = create_venue(offerer1)
        venue2 = create_venue(offerer1, siret="12345678912346")
        bank_information1 = create_bank_information(application_id=1,
                                                    venue=venue1)
        bank_information2 = create_bank_information(application_id=2,
                                                    venue=venue2)
        create_offer_with_thing_product(
            venue1,
            url="https://host/path/{token}?offerId={offerId}&email={email}")
        create_offer_with_thing_product(venue2)
        stock1 = create_stock_with_thing_offer(offerer=offerer1,
                                               venue=venue1,
                                               price=10)
        stock2 = create_stock_with_thing_offer(offerer=offerer1,
                                               venue=venue2,
                                               price=11)
        booking1 = create_booking(user=user,
                                  stock=stock1,
                                  is_used=True,
                                  token="ABCDEF",
                                  venue=venue1)
        booking2 = create_booking(user=user,
                                  stock=stock1,
                                  token="ABCDEG",
                                  venue=venue1)
        booking3 = create_booking(user=user,
                                  stock=stock2,
                                  is_used=True,
                                  token="ABCDEH",
                                  venue=venue2)
        repository.save(booking1, booking2, booking3, user_offerer1,
                        bank_information1, bank_information2)
        generate_new_payments()

        # When
        reimbursement_details = find_all_offerer_reimbursement_details(
            offerer1.id)

        # Then
        assert len(reimbursement_details) == 2
    def when_param_validated_is_true_returns_all_info_of_validated_offerers(self, app):
        # given
        pro = users_factories.ProFactory()
        offerer1 = create_offerer(siren="123456781", name="offreur C", validation_token=None)
        offerer2 = create_offerer(siren="123456782", name="offreur A", validation_token="AZE123")
        offerer3 = create_offerer(siren="123456783", name="offreur B", validation_token=None)
        user_offerer1 = create_user_offerer(pro, offerer1)
        user_offerer2 = create_user_offerer(pro, offerer2)
        user_offerer3 = create_user_offerer(pro, offerer3)
        bank_information1 = create_bank_information(application_id=1, offerer=offerer1)
        bank_information2 = create_bank_information(application_id=2, offerer=offerer2)
        bank_information3 = create_bank_information(application_id=3, offerer=offerer3)
        repository.save(
            bank_information1, bank_information2, bank_information3, user_offerer1, user_offerer2, user_offerer3
        )

        # when
        response = TestClient(app.test_client()).with_session_auth(pro.email).get("/offerers?validated=true")

        # then
        assert response.status_code == 200
        assert len(response.json) == 2
        assert list(response.json[0].keys()) == [
            "address",
            "bic",
            "city",
            "dateCreated",
            "dateModifiedAtLastProvider",
            "dateValidated",
            "demarchesSimplifieesApplicationId",
            "fieldsUpdated",
            "iban",
            "id",
            "idAtProviders",
            "isActive",
            "isValidated",
            "lastProviderId",
            "managedVenues",
            "nOffers",
            "name",
            "postalCode",
            "siren",
            "thumbCount",
            "userHasAccess",
        ]
def test_validate_bank_information_raises_an_error_if_iban_is_missing():
    # given
    bank_information = create_bank_information(bic="BDFEFR2LCCB", iban=None)

    # when
    errors = entity_validator.validate(bank_information)

    # then
    assert errors.errors["iban"] == ["Cette information est obligatoire"]
예제 #16
0
        def when_user_has_rights_on_offerer(self, app):
            # given
            user = create_user()
            offerer = create_offerer()
            venue = create_venue(offerer)
            create_bank_information(venue=venue)
            user_offerer = create_user_offerer(user, offerer)
            repository.save(user_offerer, venue)
            # when
            response = TestClient(app.test_client()).with_auth(
                user.email).get(f"/offerers/{humanize(offerer.id)}")

            # then
            assert response.status_code == 200
            response_json = response.json
            assert "bic" in response_json["managedVenues"][0]
            assert "iban" in response_json["managedVenues"][0]
            assert response_json["userHasAccess"] is True
def test_should_not_return_errors_when_valid_bank_information():
    # Given
    bank_information = create_bank_information(bic="AGFBFRCC", iban="FR7014508000301971798194B82")

    # When
    api_errors = validate(bank_information)

    # Then
    assert api_errors.errors == {}
    def when_user_is_admin_and_param_validated_is_true_and_returns_only_validated_offerer(self, app):
        # given
        offerer1 = create_offerer(siren="123456781", name="offreur C", validation_token=None)
        offerer2 = create_offerer(siren="123456782", name="offreur A", validation_token="AFYDAA")
        bank_information1 = create_bank_information(application_id=1, offerer=offerer1)
        bank_information2 = create_bank_information(application_id=2, offerer=offerer2)

        user = users_factories.AdminFactory(offerers=[offerer1, offerer2])
        repository.save(bank_information1, bank_information2)

        # when
        response = TestClient(app.test_client()).with_session_auth(user.email).get("/offerers?validated=true")

        # then
        assert response.status_code == 200
        assert len(response.json) == 1
        offerer_response = response.json[0]
        assert offerer_response["name"] == "offreur C"
def test_validate_bank_information_raises_an_error_if_bic_is_missing():
    # given
    bank_information = create_bank_information(
        bic=None, iban="FR7630006000011234567890189")

    # when
    errors = entity_validator.validate(bank_information)

    # then
    assert errors.errors["bic"] == ["Cette information est obligatoire"]
def test_offerer_errors_raises_an_error_if_both_iban_and_bic_are_none():
    # given
    bank_information = create_bank_information(bic=None, iban=None)

    # when
    errors = entity_validator.validate(bank_information)

    # then
    assert errors.errors["iban"] == ["Cette information est obligatoire"]
    assert errors.errors["bic"] == ["Cette information est obligatoire"]
def test_offerer_errors_raises_an_error_if_both_iban_and_bic_are_empty():
    # given
    bank_information = create_bank_information(bic="", iban="")

    # when
    errors = entity_validator.validate(bank_information)

    # then
    assert errors.errors["iban"] == ['L’IBAN renseigné ("") est invalide']
    assert errors.errors["bic"] == ['Le BIC renseigné ("") est invalide']
예제 #22
0
def test_should_return_no_error_message_when_iban_and_bic_are_valid_and_status_accepted(
):
    # Given
    bank_information = create_bank_information()
    api_errors = ApiErrors()

    # When
    api_error = validate(bank_information, api_errors)

    # Then
    assert api_error.errors == {}
예제 #23
0
    def test_iban_property_returns_bank_information_iban_when_offerer_has_bank_information(self, app):
        # Given
        offerer = create_offerer(siren="123456789")
        bank_information = create_bank_information(iban="FR7630007000111234567890144", offerer=offerer)
        repository.save(bank_information)

        # When
        iban = offerer.iban

        # Then
        assert iban == "FR7630007000111234567890144"
예제 #24
0
    def test_bic_property_returns_bank_information_bic_when_offerer_has_bank_information(self, app):
        # Given
        offerer = create_offerer(siren="123456789")
        bank_information = create_bank_information(bic="BDFEFR2LCCB", offerer=offerer)
        repository.save(bank_information)

        # When
        bic = offerer.bic

        # Then
        assert bic == "BDFEFR2LCCB"
        def when_user_is_admin_and_param_validated_is_false_and_returns_all_info_of_all_offerers(self, app):
            # given
            offerer1 = create_offerer(siren="123456781", name="offreur A", validation_token="F1TVYSGV")
            offerer2 = create_offerer(siren="123456782", name="offreur B")
            bank_information1 = create_bank_information(application_id=1, offerer=offerer1)
            bank_information2 = create_bank_information(application_id=2, offerer=offerer2)

            user = create_user(is_beneficiary=False, is_admin=True)
            user.offerers = [offerer1, offerer2]
            repository.save(user, bank_information1, bank_information2)

            # when
            response = TestClient(app.test_client()).with_auth(user.email).get("/offerers?validated=false")

            # then
            assert response.status_code == 200
            assert len(response.json) == 1
            offerer_response = response.json[0]
            assert offerer_response["name"] == "offreur A"
            assert set(offerer_response.keys()) == {
                "address",
                "bic",
                "city",
                "dateCreated",
                "dateModifiedAtLastProvider",
                "demarchesSimplifieesApplicationId",
                "fieldsUpdated",
                "iban",
                "id",
                "idAtProviders",
                "isActive",
                "isValidated",
                "lastProviderId",
                "managedVenues",
                "nOffers",
                "name",
                "postalCode",
                "siren",
                "thumbCount",
                "userHasAccess",
            }
예제 #26
0
    def test_returns_none_when_offerer_has_no_bank_informations(self, app):
        # given
        offerer = create_offerer()
        bank_informations = create_bank_information(offerer=offerer)
        repository.save(bank_informations)

        # when
        bank_informations = self.bank_informations_sql_repository.find_by_offerer(
            offerer_id=0)

        # then
        assert bank_informations is None
예제 #27
0
def test_should_not_return_an_error_if_status_is_not_accepted_and_bic_and_iban_are_empty(
):
    # Given
    bank_information = create_bank_information(
        bic=None, iban=None, status=BankInformationStatus.DRAFT)
    api_errors = ApiErrors()

    # When
    api_error = validate(bank_information, api_errors)

    # Then
    assert api_error.errors == {}
예제 #28
0
def test_should_return_error_message_when_iban_is_invalid():
    # Given
    bank_information = create_bank_information(iban="FR76")
    api_errors = ApiErrors()

    # When
    api_error = validate(bank_information, api_errors)

    # Then
    assert api_error.errors["iban"] == [
        'L’IBAN renseigné ("FR76") est invalide'
    ]
예제 #29
0
def test_should_return_error_message_when_bic_is_invalid():
    # Given
    bank_information = create_bank_information(bic="1234")
    api_errors = ApiErrors()

    # When
    api_error = validate(bank_information, api_errors)

    # Then
    assert api_error.errors["bic"] == [
        'Le BIC renseigné ("1234") est invalide'
    ]
def test_should_return_errors_when_invalid_bank_information():
    # Given
    bank_information = create_bank_information(bic="1234", iban="1234")

    # When
    api_errors = validate(bank_information)

    # Then
    assert api_errors.errors == {
        "bic": ['Le BIC renseigné ("1234") est invalide'],
        "iban": ['L’IBAN renseigné ("1234") est invalide'],
    }