- Clean Architecture + MVP Pattern
- Kotlin Language
- Main libs : Room, RxAndroid, Retrofit
- Custom Dependency injection framework (less intrusive and more simple to apply)
- Modularity [ domain, data, log, resources, commons, analytics, app ]
- AppCenter to track events and visualize crash infos, like purchases
Besides providing exceptional transportation services, Cabify also runs a physical store which sells Products.
Our products are like this:
Code | Name | Price
-------------------------------------------------
VOUCHER | Cabify Voucher | 5.00€
TSHIRT | Cabify T-Shirt | 20.00€
MUG | Cabify Coffee Mug | 7.50€
Various departments have insisted on the following discounts:
-
The marketing department believes in 2-for-1 promotions (buy two of the same product, get one free), and would like for there to be a 2-for-1 special on
VOUCHER
items. -
The CFO insists that the best way to increase sales is with discounts on bulk purchases (buying x or more of a product, the price of that product is reduced), and demands that if you buy 3 or more
TSHIRT
items, the price per unit should be 19.00€.
Cabify's checkout process allows for items to be scanned in any order, and should return the total amount to be paid.
Examples:
Items: VOUCHER, TSHIRT, MUG
Total: 32.50€
Items: VOUCHER, TSHIRT, VOUCHER
Total: 25.00€
Items: TSHIRT, TSHIRT, TSHIRT, VOUCHER, TSHIRT
Total: 81.00€
Items: VOUCHER, TSHIRT, VOUCHER, VOUCHER, MUG, TSHIRT, TSHIRT
Total: 74.50€
- Implement an app where a user can pick products from a list and checkout them to get the resulting price. No need to implement any real payment system, just a fake feedback about the payment has been completed.
- The discounts can change in the future, depending on the year season we apply different ones.
- There is no need for a user login screen.
- We would like to show users what discounts have been applied in their purchase.
- You should get the list of products from here.
In Cabify we use Swift 4 to build our iOS app and Kotlin to build our Android app, but we want you to feel comfortable during the exercise, so feel free to pick the best platform for you: Swift/Objective-C or Kotlin/Java
The code should:
- Be written as production-ready code. You will write production code. We would like you to build it in the same way as if you were going to publish to the store.
- Be easy to grow and easy to add new functionality.
- Have notes attached, explaning the solution and why certain things are included and others are left out.