def test_generate_payment_csv_raw_contains_human_readable_status_with_details_when_error(
            self, app):
        # given
        user = users_factories.UserFactory(email="*****@*****.**")
        offerer = create_offerer()
        venue = create_venue(offerer)
        stock = create_stock_with_thing_offer(offerer=offerer,
                                              venue=venue,
                                              price=10)
        booking = create_booking(user=user,
                                 stock=stock,
                                 is_used=True,
                                 token="ABCDEF",
                                 venue=venue)
        payment = create_payment(
            booking,
            offerer,
            transaction_label=
            "pass Culture Pro - remboursement 1ère quinzaine 07-2019",
            status=TransactionStatus.ERROR,
            amount=50,
            detail="Iban non fourni",
        )
        repository.save(payment)

        payments_info = find_all_offerer_payments(offerer.id)

        # when
        raw_csv = ReimbursementDetails(payments_info[0]).as_csv_row()

        # then
        assert raw_csv[
            13] == "Erreur d'envoi du remboursement : Iban non fourni"
示例#2
0
        def when_booking_is_already_validated(self, app):
            # Given
            user = create_user(email="*****@*****.**")
            admin_user = create_user(email="*****@*****.**")
            offerer = create_offerer()
            venue = create_venue(offerer)
            stock = create_stock_with_thing_offer(offerer,
                                                  venue,
                                                  offer=None,
                                                  price=0)
            booking = create_booking(user=user,
                                     stock=stock,
                                     is_used=True,
                                     venue=venue)
            repository.save(admin_user, booking)
            url = f"/bookings/token/{booking.token}[email protected]&offer_id={humanize(stock.offerId)}"

            # When
            response = TestClient(app.test_client()).get(url)

            # Then
            assert response.status_code == 410
            assert response.json["booking"] == [
                "Cette réservation a déjà été validée"
            ]
示例#3
0
        def when_user_has_booked_some_offers(self, app):
            # Given
            user = UserFactory(
                email="*****@*****.**",
                postalCode="93020",
            )

            offerer = create_offerer(
                siren="999199987", address="2 Test adress", city="Test city", postal_code="93000", name="Test offerer"
            )
            venue = create_venue(offerer)
            thing_offer = create_offer_with_thing_product(venue=None)
            stock = create_stock_with_thing_offer(offerer, venue, thing_offer, price=5)
            booking = create_booking(user=user, stock=stock, venue=venue, quantity=1)

            repository.save(venue, booking)

            # When
            response = TestClient(app.test_client()).with_auth("*****@*****.**").get("/beneficiaries/current")

            # Then
            assert response.json["wallet_balance"] == 495.0
            assert response.json["expenses"] == [
                {"domain": "all", "current": 5.0, "limit": 500.0},
                {"domain": "digital", "current": 0.0, "limit": 200.0},
                {"domain": "physical", "current": 5.0, "limit": 200.0},
            ]
示例#4
0
        def when_booking_is_already_validated(self, app):
            # Given
            user = create_user(email="*****@*****.**")
            admin_user = create_user(email="*****@*****.**")
            offerer = create_offerer()
            user_offerer = create_user_offerer(admin_user, offerer)
            venue = create_venue(offerer)
            stock = create_stock_with_thing_offer(offerer,
                                                  venue,
                                                  offer=None,
                                                  price=0)
            booking = create_booking(user=user,
                                     stock=stock,
                                     is_used=True,
                                     venue=venue)
            repository.save(admin_user, booking, user_offerer)
            offererApiKey = create_api_key(offerer_id=offerer.id)
            repository.save(offererApiKey)
            user2ApiKey = f"Bearer {offererApiKey.value}"
            url = f"/v2/bookings/token/{booking.token}"

            # When
            response = TestClient(app.test_client()).get(url,
                                                         headers={
                                                             "Authorization":
                                                             user2ApiKey,
                                                             "Origin":
                                                             "http://localhost"
                                                         })

            # Then
            assert response.status_code == 410
            assert response.json["booking"] == [
                "Cette réservation a déjà été validée"
            ]
示例#5
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
示例#7
0
    def test_should_return_one_payment_info_with_sent_status(self, app):
        # Given
        user = users_factories.UserFactory(lastName="User", firstName="Plus")
        offerer = create_offerer(address="7 rue du livre")
        venue = create_venue(offerer)
        stock = create_stock_with_thing_offer(offerer=offerer,
                                              venue=venue,
                                              price=10)
        now = datetime.utcnow()
        booking = create_booking(user=user,
                                 stock=stock,
                                 is_used=True,
                                 date_used=now,
                                 token="ABCDEF",
                                 venue=venue)

        payment = create_payment(
            booking,
            offerer,
            transaction_label=
            "pass Culture Pro - remboursement 1ère quinzaine 07-2019",
            status=TransactionStatus.ERROR,
            amount=50,
            detail="Iban non fourni",
            status_date=now - timedelta(days=2),
        )
        payment_status1 = create_payment_status(payment,
                                                detail="All good",
                                                status=TransactionStatus.RETRY,
                                                date=now - timedelta(days=1))
        payment_status2 = create_payment_status(payment,
                                                detail="All good",
                                                status=TransactionStatus.SENT)
        repository.save(payment, payment_status1, payment_status2)

        # When
        payments = find_all_offerer_payments(offerer.id)

        # Then
        assert len(payments) == 1
        assert payments[0] == (
            "User",
            "Plus",
            "ABCDEF",
            now,
            "Test Book",
            "7 rue du livre",
            "La petite librairie",
            "12345678912345",
            "123 rue de Paris",
            Decimal("50.00"),
            None,
            "pass Culture Pro - remboursement 1ère quinzaine 07-2019",
            TransactionStatus.SENT,
            "All good",
        )
示例#8
0
def create_booking(
    user: User,
    amount: Optional[Union[Decimal, float]] = None,
    date_created: datetime = datetime.utcnow(),
    date_used: datetime = None,
    idx: int = None,
    is_cancelled: bool = False,
    is_used: bool = False,
    quantity: int = 1,
    stock: Stock = None,
    token: str = None,
    venue: VenueSQLEntity = None,
) -> Booking:
    booking = Booking()
    offerer = create_offerer(siren="987654321",
                             address="Test address",
                             city="Test city",
                             postal_code="93000",
                             name="Test name")
    if venue is None:
        venue = create_venue(
            offerer=offerer,
            name="Test offerer",
            booking_email="*****@*****.**",
            address="123 rue test",
            postal_code="93000",
            city="Test city",
            departement_code="93",
        )
    if stock is None:
        price = amount if amount is not None else 10
        product_with_thing_type = create_offer_with_thing_product(venue)
        stock = create_stock_with_thing_offer(offerer=offerer,
                                              venue=venue,
                                              offer=product_with_thing_type,
                                              price=price)

    if not stock.offer:
        stock.offer = create_offer_with_thing_product(venue)

    booking.user = user
    booking.amount = amount if amount is not None else stock.price
    booking.dateCreated = date_created
    booking.dateUsed = date_used
    booking.id = idx
    booking.isCancelled = is_cancelled
    booking.isUsed = is_used
    booking.quantity = quantity
    booking.stock = stock
    booking.token = token if token is not None else random_token()
    booking.userId = user.id
    booking.confirmationDate = bookings_api.compute_confirmation_date(
        stock.beginningDatetime, date_created)

    return booking
示例#9
0
    def test_is_deletable_when_stock_is_not_an_event(self):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer)
        stock = create_stock_with_thing_offer(offerer=offerer, venue=venue)

        # When
        is_event_deletable = stock.isEventDeletable

        # Then
        assert is_event_deletable is True
示例#10
0
    def test_is_not_expired_when_stock_is_not_an_event(self):
        # Given
        offerer = create_offerer()
        venue = create_venue(offerer)
        stock = create_stock_with_thing_offer(offerer=offerer, venue=venue)

        # When
        is_event_expired = stock.isEventExpired

        # Then
        assert is_event_expired is False
示例#11
0
def save_sandbox():

    offerer = create_offerer()
    venue = create_venue(offerer, is_virtual=True, siret=None)
    offer = create_offer_with_thing_product(
        venue, thing_subcategory_id=subcategories.ACTIVATION_THING.id)
    stock = create_stock_with_thing_offer(offerer,
                                          venue,
                                          offer=offer,
                                          price=0,
                                          quantity=10000)
    repository.save(stock)
示例#12
0
def save_sandbox():

    offerer = create_offerer()
    venue = create_venue(offerer, is_virtual=True, siret=None)
    offer = create_offer_with_thing_product(venue,
                                            thing_type=ThingType.ACTIVATION)
    stock = create_stock_with_thing_offer(offerer,
                                          venue,
                                          offer=offer,
                                          price=0,
                                          quantity=10000)
    repository.save(stock)
def create_industrial_activation_offers():
    logger.info("create_industrial_activation_offers")

    activated_user = User.query.filter_by(has_beneficiary_role=True).first()
    offerer = create_offerer()
    venue = create_venue(offerer, is_virtual=True, siret=None)
    offer = create_offer_with_thing_product(venue, thing_subcategory_id=subcategories.ACTIVATION_THING.id)
    stock = create_stock_with_thing_offer(offerer, venue, offer=offer, price=0, quantity=10000)

    booking = create_booking(user=activated_user, stock=stock, offerer=offerer, venue=venue, token="ACTIVA")

    repository.save(booking)
    logger.info("created 1 activation offer")
        def when_user_has_bookings_and_qr_code_feature_is_active(self, qr_code_is_active, app):
            # Given
            user1 = create_user(email="*****@*****.**")
            user2 = create_user(email="*****@*****.**")
            offerer = create_offerer()
            venue = create_venue(offerer=offerer)
            offer = create_offer_with_thing_product(venue)
            stock = create_stock_with_thing_offer(offerer=offerer, venue=venue, offer=offer, price=0)
            offer2 = create_offer_with_thing_product(venue)
            stock2 = create_stock_with_thing_offer(offerer=offerer, venue=venue, offer=offer2, price=0)
            booking1 = create_booking(user=user1, stock=stock, venue=venue, token="ABCDEF")
            booking2 = create_booking(user=user2, stock=stock, venue=venue, token="GHIJK")
            booking3 = create_booking(user=user1, stock=stock2, venue=venue, token="BBBBB")

            repository.save(booking1, booking2, booking3)

            # When
            response = TestClient(app.test_client()).with_auth(user1.email).get("/bookings")

            # Then
            all_bookings = response.json
            assert len(all_bookings) == 2
            first_booking = all_bookings[0]
            assert response.status_code == 200
            assert "qrCode" in first_booking
            assert "completedUrl" in first_booking
            assert "isEventExpired" in first_booking
            assert "offer" in first_booking["stock"]
            assert "isEventExpired" in first_booking["stock"]
            assert "isDigital" in first_booking["stock"]["offer"]
            assert "isEvent" in first_booking["stock"]["offer"]
            assert "offerType" in first_booking["stock"]["offer"]
            assert "thumbUrl" in first_booking["stock"]["offer"]
            assert "stocks" in first_booking["stock"]["offer"]
            assert "venue" in first_booking["stock"]["offer"]
            assert "validationToken" not in first_booking["stock"]["offer"]["venue"]
示例#15
0
        def when_user_not_logged_in_and_give_right_email_and_offer_id_thing(
                self, app):
            # Given
            user = create_user(email="*****@*****.**")
            admin_user = create_user(email="*****@*****.**")
            offerer = create_offerer()
            venue = create_venue(offerer)
            stock = create_stock_with_thing_offer(offerer,
                                                  venue,
                                                  offer=None,
                                                  price=0)
            booking = create_booking(user=user, stock=stock, venue=venue)
            repository.save(admin_user, booking)
            url = f"/bookings/token/{booking.token}[email protected]&offer_id={humanize(stock.offerId)}"

            # When
            response = TestClient(app.test_client()).get(url)

            # Then
            assert response.status_code == 204
示例#16
0
def create_industrial_activation_offers():
    logger.info("create_industrial_activation_offers")

    activated_user = User.query.filter_by(isBeneficiary=True).first()
    offerer = create_offerer()
    venue = create_venue(offerer, is_virtual=True, siret=None)
    offer = create_offer_with_thing_product(venue,
                                            thing_type=ThingType.ACTIVATION)
    stock = create_stock_with_thing_offer(offerer,
                                          venue,
                                          offer=offer,
                                          price=0,
                                          quantity=10000)

    booking = create_booking(user=activated_user,
                             stock=stock,
                             token="ACTIVA",
                             venue=venue)

    repository.save(booking)
    logger.info("created 1 activation offer")
    def test_generate_payment_details_csv_with_right_values(self, app):
        # given
        user = users_factories.UserFactory(firstName="John", lastName="Doe")
        offerer1 = create_offerer(siren="123456789",
                                  address="123 rue de Paris")
        user_offerer1 = create_user_offerer(user,
                                            offerer1,
                                            validation_token=None)
        venue1 = create_venue(offerer1)
        bank_information1 = create_bank_information(venue=venue1)
        stock1 = create_stock_with_thing_offer(offerer=offerer1,
                                               venue=venue1,
                                               price=10)
        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)

        repository.save(booking1, booking2, user_offerer1, bank_information1)

        generate_new_payments()

        reimbursement_details = find_all_offerer_reimbursement_details(
            offerer1.id)

        # when
        csv = generate_reimbursement_details_csv(reimbursement_details)

        # then
        assert _count_non_empty_lines(csv) == 2
        assert (
            _get_header(csv, 1) ==
            "2019;Juillet : remboursement 1ère quinzaine;La petite librairie;12345678912345;123 rue de Paris;FR7630006000011234567890189;La petite librairie;Test Book;Doe;John;ABCDEF;;10.00;Remboursement initié"
        )
示例#18
0
        def when_user_not_logged_in_right_email_and_wrong_offer(self, app):
            # Given
            user = create_user(email="*****@*****.**")
            admin_user = create_user(email="*****@*****.**")
            offerer = create_offerer()
            venue = create_venue(offerer)
            stock = create_stock_with_thing_offer(offerer,
                                                  venue,
                                                  offer=None,
                                                  price=0)
            booking = create_booking(user=user, stock=stock, venue=venue)
            repository.save(admin_user, booking)
            url = f"/bookings/token/{booking.token}[email protected]&offer_id={humanize(123)}"

            # When
            response = TestClient(app.test_client()).get(url)

            # Then
            assert response.status_code == 404
            assert response.json["global"] == [
                "Cette contremarque n'a pas été trouvée"
            ]
示例#19
0
    def test_should_return_last_matching_status_based_on_date_for_each_payment(
            self, app):
        # Given
        user = users_factories.UserFactory(lastName="User", firstName="Plus")
        offerer = create_offerer(address="7 rue du livre")
        venue = create_venue(offerer)
        stock = create_stock_with_thing_offer(offerer=offerer,
                                              venue=venue,
                                              price=10)
        now = datetime.utcnow()
        booking1 = create_booking(user=user,
                                  stock=stock,
                                  is_used=True,
                                  date_used=now,
                                  token="ABCDEF",
                                  venue=venue)
        booking2 = create_booking(user=user,
                                  stock=stock,
                                  is_used=True,
                                  date_used=now,
                                  token="ABCDFE",
                                  venue=venue)

        payment1 = create_payment(
            booking1,
            offerer,
            transaction_label=
            "pass Culture Pro - remboursement 1ère quinzaine 07-2019",
            status=TransactionStatus.PENDING,
            amount=50,
            status_date=now - timedelta(days=2),
        )
        payment2 = create_payment(
            booking2,
            offerer,
            transaction_label=
            "pass Culture Pro - remboursement 2ème quinzaine 07-2019",
            status=TransactionStatus.PENDING,
            amount=75,
            status_date=now - timedelta(days=4),
        )

        repository.save(payment1, payment2)

        last_status_for_payment1 = create_payment_status(
            payment1,
            detail="All good",
            status=TransactionStatus.SENT,
            date=now)
        last_status_for_payment2 = create_payment_status(
            payment2, detail=None, status=TransactionStatus.SENT, date=now)
        repository.save(last_status_for_payment1, last_status_for_payment2)

        first_status_for_payment1 = create_payment_status(
            payment1,
            detail="Retry",
            status=TransactionStatus.RETRY,
            date=now - timedelta(days=1))
        first_status_for_payment2 = create_payment_status(
            payment2,
            detail="Iban non fournis",
            status=TransactionStatus.ERROR,
            date=now - timedelta(days=3))
        repository.save(first_status_for_payment1, first_status_for_payment2)

        # When
        payments = find_all_offerer_payments(offerer.id)

        # Then
        assert len(payments) == 2
        assert payments[0] == (
            "User",
            "Plus",
            "ABCDFE",
            now,
            "Test Book",
            "7 rue du livre",
            "La petite librairie",
            "12345678912345",
            "123 rue de Paris",
            Decimal("75.00"),
            None,
            "pass Culture Pro - remboursement 2ème quinzaine 07-2019",
            TransactionStatus.SENT,
            None,
        )
        assert payments[1] == (
            "User",
            "Plus",
            "ABCDEF",
            now,
            "Test Book",
            "7 rue du livre",
            "La petite librairie",
            "12345678912345",
            "123 rue de Paris",
            Decimal("50.00"),
            None,
            "pass Culture Pro - remboursement 1ère quinzaine 07-2019",
            TransactionStatus.SENT,
            "All good",
        )