Skip to content

Commit c3af83b

Browse files
authored
Merge branch 'development' into 2166_form_speaker_session
2 parents d74d906 + 629b01f commit c3af83b

28 files changed

+103
-86
lines changed

README.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,18 @@ Our chat channel is on gitter [here](https://gitter.im/fossasia/open-event-atten
2727
## Screenshots
2828
<table>
2929
<tr>
30-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_1.png"></td>
31-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_2.png"></td>
32-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_3.png"></td>
30+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_1.jpg"></td>
31+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_2.jpg"></td>
32+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_3.jpg"></td>
3333
</tr>
3434
<tr>
35-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_4.png"></td>
36-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_5.png"></td>
37-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_6.png"></td>
35+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_5.jpg"></td>
36+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_6.jpg"></td>
37+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_7.jpg"></td>
3838
</tr>
3939
<tr>
40-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_7.png"></td>
41-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_8.png"></td>
42-
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_9.png"></td>
40+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_8.jpg"></td>
41+
<td><img src = "fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot_9.jpg"></td>
4342
</tr>
4443
</table>
4544

app/src/main/java/org/fossasia/openevent/general/attendees/AttendeeFragment.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import kotlinx.android.synthetic.main.fragment_attendee.view.firstName
3434
import kotlinx.android.synthetic.main.fragment_attendee.view.helloUser
3535
import kotlinx.android.synthetic.main.fragment_attendee.view.lastName
3636
import kotlinx.android.synthetic.main.fragment_attendee.view.billingPostalCode
37+
import kotlinx.android.synthetic.main.fragment_attendee.view.billingInfoCheckboxSection
38+
import kotlinx.android.synthetic.main.fragment_attendee.view.billingEnabledCheckbox
3739
import kotlinx.android.synthetic.main.fragment_attendee.view.attendeeScrollView
3840
import kotlinx.android.synthetic.main.fragment_attendee.view.accept
3941
import kotlinx.android.synthetic.main.fragment_attendee.view.amount
@@ -132,7 +134,6 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment {
132134
private val safeArgs: AttendeeFragmentArgs by navArgs()
133135
private lateinit var timer: CountDownTimer
134136
private lateinit var card: Card
135-
private var showBillingInfoLayout = false
136137

137138
override fun onCreate(savedInstanceState: Bundle?) {
138139
super.onCreate(savedInstanceState)
@@ -141,8 +142,6 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment {
141142
attendeeViewModel.singleTicket = safeArgs.ticketIdAndQty?.value?.map { it.second }?.sum() == 1
142143
}
143144

144-
showBillingInfoLayout = safeArgs.hasPaidTickets || safeArgs.amount > 0
145-
146145
attendeeRecyclerAdapter.setEventId(safeArgs.eventId)
147146
if (attendeeViewModel.paymentCurrency.isNotBlank())
148147
ticketsRecyclerAdapter.setCurrency(attendeeViewModel.paymentCurrency)
@@ -503,12 +502,17 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment {
503502
}
504503

505504
private fun setupBillingInfo() {
506-
rootView.billingInfoContainer.isVisible = showBillingInfoLayout
507-
attendeeViewModel.billingEnabled = showBillingInfoLayout
505+
rootView.billingInfoCheckboxSection.isVisible = safeArgs.amount > 0
508506
rootView.billingCompanyLayout.setRequired()
509507
rootView.billingAddressLayout.setRequired()
510508
rootView.billingCityLayout.setRequired()
511509
rootView.billingPostalCodeLayout.setRequired()
510+
rootView.billingInfoContainer.isVisible = rootView.billingEnabledCheckbox.isChecked
511+
attendeeViewModel.billingEnabled = rootView.billingEnabledCheckbox.isChecked
512+
rootView.billingEnabledCheckbox.setOnCheckedChangeListener { _, isChecked ->
513+
attendeeViewModel.billingEnabled = isChecked
514+
rootView.billingInfoContainer.isVisible = isChecked
515+
}
512516
}
513517

514518
private fun setupCountryOptions() {
@@ -691,7 +695,7 @@ class AttendeeFragment : Fragment(), ComplexBackPressFragment {
691695
rootView.email.checkEmpty()
692696

693697
var checkBillingInfo = true
694-
if (showBillingInfoLayout) {
698+
if (rootView.billingEnabledCheckbox.isChecked) {
695699
checkBillingInfo = rootView.billingCompany.checkEmpty() && rootView.billingAddress.checkEmpty() &&
696700
rootView.billingCity.checkEmpty() && rootView.billingPostalCode.checkEmpty()
697701
}

app/src/main/java/org/fossasia/openevent/general/discount/DiscountApi.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import retrofit2.http.Query
77

88
interface DiscountApi {
99

10-
@GET("discount-codes/{code}?include=event,tickets")
11-
fun getDiscountCodes(@Path("code") code: String, @Query("filter") filter: String): Single<DiscountCode>
10+
@GET("events/{eventId}/discount-codes/{code}?include=event,tickets")
11+
fun getDiscountCodes(
12+
@Path("eventId") eventId: Long,
13+
@Path("code") code: String,
14+
@Query("filter") filter: String
15+
): Single<DiscountCode>
1216
}

app/src/main/java/org/fossasia/openevent/general/event/EventDetailsFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ class EventDetailsFragment : Fragment() {
136136

137137
rootView.buttonTickets.setOnClickListener {
138138
val ticketUrl = currentEvent?.ticketUrl
139-
if (Uri.parse(ticketUrl).host != getString(R.string.FRONTEND_HOST) &&
140-
!ticketUrl.isNullOrEmpty()) {
139+
if (!ticketUrl.isNullOrEmpty() &&
140+
Uri.parse(ticketUrl).host != getString(R.string.FRONTEND_HOST)) {
141141
Utils.openUrl(requireContext(), ticketUrl)
142142
} else {
143143
loadTicketFragment()

app/src/main/java/org/fossasia/openevent/general/ticket/TicketService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ class TicketService(
4848
return ticketDao.getTicketsWithIds(ids)
4949
}
5050

51-
fun getDiscountCode(code: String): Single<DiscountCode> {
51+
fun getDiscountCode(eventId: Long, code: String): Single<DiscountCode> {
5252
val filter = "[{\"name\":\"is-active\",\"op\":\"like\",\"val\":\"true\"}," +
5353
"{\"name\":\"valid-from\",\"op\":\"<\",\"val\":\"%${EventUtils.getTimeInISO8601(Date())}%\"}," +
5454
"{\"name\":\"valid-till\",\"op\":\">\",\"val\":\"%${EventUtils.getTimeInISO8601(Date())}%\"}]"
55-
return discountApi.getDiscountCodes(code, filter)
55+
return discountApi.getDiscountCodes(eventId, code, filter)
5656
}
5757
}

app/src/main/java/org/fossasia/openevent/general/ticket/TicketViewHolder.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,14 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
8181

8282
var ticketPrice = ticket.price
8383
if (tax?.rate != null) {
84-
val taxPrice = (ticketPrice * tax.rate / 100)
85-
ticketPrice += taxPrice
86-
itemView.taxInfo.text = "(+ $eventCurrency$taxPrice ${tax.name})"
84+
if (!tax.isTaxIncludedInPrice) {
85+
val taxPrice = (ticketPrice * tax.rate / 100)
86+
ticketPrice += taxPrice
87+
itemView.taxInfo.text = "(+ $eventCurrency${"%.2f".format(taxPrice)} ${tax.name})"
88+
} else {
89+
val taxPrice = (ticket.price * tax.rate) / (100 + tax.rate)
90+
itemView.taxInfo.text = "( $eventCurrency${"%.2f".format(taxPrice)} ${tax.name} included)"
91+
}
8792
}
8893

8994
when (ticket.type) {
@@ -107,7 +112,9 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
107112
}
108113
setupQtyPicker(minQty, maxQty, selectedListener, ticket, ticketQuantity)
109114

110-
val priceInfo = "<b>${resource.getString(R.string.price)}:</b> ${ticket.price}"
115+
val price = if (tax?.rate != null && tax.isTaxIncludedInPrice) (ticket.price * 100) / (100 + tax.rate)
116+
else ticket.price
117+
val priceInfo = "<b>${resource.getString(R.string.price)}:</b> ${"%.2f".format(price)}"
111118
itemView.priceInfo.text = Html.fromHtml(priceInfo)
112119

113120
if (ticket.description.isNullOrEmpty()) {

app/src/main/java/org/fossasia/openevent/general/ticket/TicketsFragment.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class TicketsFragment : Fragment() {
5555
private lateinit var rootView: View
5656
private lateinit var linearLayoutManager: LinearLayoutManager
5757
private var ticketIdAndQty = ArrayList<Triple<Int, Int, Float>>()
58-
private var totalAmount: Float = 0.0f
5958

6059
override fun onCreate(savedInstanceState: Bundle?) {
6160
super.onCreate(savedInstanceState)
@@ -122,19 +121,12 @@ class TicketsFragment : Fragment() {
122121

123122
rootView.register.setOnClickListener {
124123
if (!ticketsViewModel.totalTicketsEmpty(ticketIdAndQty)) {
125-
ticketsViewModel.getAmount(ticketIdAndQty)
124+
checkForAuthentication()
126125
} else {
127126
showErrorMessage(resources.getString(R.string.no_tickets_message))
128127
}
129128
}
130129

131-
ticketsViewModel.amount
132-
.nonNull()
133-
.observe(viewLifecycleOwner, Observer {
134-
totalAmount = it
135-
checkForAuthentication()
136-
})
137-
138130
rootView.retry.setOnClickListener {
139131
loadTickets()
140132
loadTaxDetails()
@@ -150,7 +142,7 @@ class TicketsFragment : Fragment() {
150142
return@setOnClickListener
151143
}
152144
hideSoftKeyboard(context, rootView)
153-
ticketsViewModel.fetchDiscountCode(rootView.discountCodeEditText.text.toString().trim())
145+
ticketsViewModel.fetchDiscountCode(safeArgs.eventId, rootView.discountCodeEditText.text.toString().trim())
154146
}
155147

156148
ticketsViewModel.discountCode
@@ -195,6 +187,19 @@ class TicketsFragment : Fragment() {
195187
override fun onSelected(ticketId: Int, quantity: Int, donation: Float) {
196188
handleTicketSelect(ticketId, quantity, donation)
197189
ticketsViewModel.ticketIdAndQty.value = ticketIdAndQty
190+
ticketsViewModel.totalAmount = ticketsViewModel.getAmount(ticketIdAndQty)
191+
when {
192+
ticketsViewModel.totalAmount == -1F -> {
193+
ticketsViewModel.tickets.value?.let {
194+
if (it.any { ticket -> ticket.price > 0 })
195+
rootView.register.text = getString(R.string.order_now)
196+
else
197+
rootView.register.text = getString(R.string.register)
198+
}
199+
}
200+
ticketsViewModel.totalAmount > 0 -> rootView.register.text = getString(R.string.order_now)
201+
else -> rootView.register.text = getString(R.string.register)
202+
}
198203
}
199204
}
200205
ticketsRecyclerAdapter.setSelectListener(ticketSelectedListener)
@@ -218,16 +223,13 @@ class TicketsFragment : Fragment() {
218223

219224
private fun redirectToAttendee() {
220225
val wrappedTicketAndQty = TicketIdAndQtyWrapper(ticketIdAndQty)
221-
ticketsViewModel.mutableAmount.value = null
222226
findNavController(rootView).navigate(TicketsFragmentDirections.actionTicketsToAttendee(
223227
eventId = safeArgs.eventId,
224228
ticketIdAndQty = wrappedTicketAndQty,
225229
currency = safeArgs.currency,
226-
amount = totalAmount,
227-
taxAmount = ticketsViewModel.totalTaxAmount,
228-
hasPaidTickets = ticketsViewModel.hasPaidTickets
230+
amount = ticketsViewModel.totalAmount,
231+
taxAmount = ticketsViewModel.totalTaxAmount
229232
))
230-
ticketsViewModel.hasPaidTickets = false
231233
}
232234

233235
private fun redirectToLogin() {

app/src/main/java/org/fossasia/openevent/general/ticket/TicketsViewModel.kt

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,11 @@ class TicketsViewModel(
4545
val taxInfo: LiveData<Tax> = mutableTaxInfo
4646
var appliedDiscountCode: DiscountCode? = null
4747
var totalTaxAmount = 0f
48-
val mutableAmount = MutableLiveData<Float>()
49-
val amount: LiveData<Float> = mutableAmount
5048
private val mutableTicketTableVisibility = MutableLiveData<Boolean>()
5149
val ticketTableVisibility: LiveData<Boolean> = mutableTicketTableVisibility
5250
val ticketIdAndQty = MutableLiveData<List<Triple<Int, Int, Float>>>()
5351
var discountCodeCurrentLayout = APPLY_DISCOUNT_CODE
54-
var hasPaidTickets = false
52+
var totalAmount: Float = 0.0f
5553

5654
fun isLoggedIn() = authHolder.isLoggedIn()
5755

@@ -89,8 +87,8 @@ class TicketsViewModel(
8987
})
9088
}
9189

92-
fun fetchDiscountCode(code: String) {
93-
compositeDisposable += ticketService.getDiscountCode(code)
90+
fun fetchDiscountCode(eventId: Long, code: String) {
91+
compositeDisposable += ticketService.getDiscountCode(eventId, code)
9492
.withDefaultSchedulers()
9593
.doOnSubscribe {
9694
mutableProgress.value = true
@@ -107,47 +105,42 @@ class TicketsViewModel(
107105
})
108106
}
109107

110-
fun getAmount(ticketIdAndQty: List<Triple<Int, Int, Float>>) {
108+
fun getAmount(ticketIdAndQty: List<Triple<Int, Int, Float>>): Float {
111109
val ticketIds = ArrayList<Int>()
112110
val qty = ArrayList<Int>()
113-
val taxRate = taxInfo.value?.rate ?: 0f
111+
val tax = taxInfo.value
112+
var taxRate = 0f
113+
if (tax != null && !tax.isTaxIncludedInPrice) {
114+
taxRate = tax.rate ?: 0f
115+
}
114116
ticketIdAndQty.forEach {
115117
if (it.second > 0) {
116118
ticketIds.add(it.first)
117119
qty.add(it.second)
118120
}
119121
}
120122
val donation = ticketIdAndQty.map { it.third*it.second }.sum()
121-
compositeDisposable += ticketService.getTicketsWithIds(ticketIds)
122-
.withDefaultSchedulers()
123-
.doOnSubscribe {
124-
mutableProgress.value = true
125-
}.doFinally {
126-
mutableProgress.value = false
127-
}.subscribe({ tickets ->
128-
var prices = 0F
129-
var index = 0
130-
val code = appliedDiscountCode
131-
tickets.forEach { ticket ->
132-
var price = ticket.price
133-
totalTaxAmount += (ticket.price * taxRate / 100) * qty[index]
134-
if (code?.value != null) {
135-
appliedDiscountCode?.tickets?.forEach { ticketId ->
136-
if (ticket.id == ticketId.id.toInt()) {
137-
price -= if (code.type == AMOUNT) code.value else price*(code.value / 100)
138-
}
123+
tickets.value?.filter { ticketIds.contains(it.id) }?.let { tickets ->
124+
var prices = 0F
125+
var index = 0
126+
val code = appliedDiscountCode
127+
tickets.forEach { ticket ->
128+
var price = ticket.price
129+
totalTaxAmount += (ticket.price * taxRate / 100) * qty[index]
130+
if (code?.value != null) {
131+
appliedDiscountCode?.tickets?.forEach { ticketId ->
132+
if (ticket.id == ticketId.id.toInt()) {
133+
price -= if (code.type == AMOUNT) code.value else price*(code.value / 100)
139134
}
140135
}
141-
price.let { prices += price * qty[index] }
142-
if (ticket.type == TICKET_TYPE_PAID)
143-
hasPaidTickets = true
144-
index++
145136
}
146-
prices += totalTaxAmount
147-
mutableAmount.value = prices + donation
148-
}, {
149-
Timber.e(it, "Error Loading tickets!")
150-
})
137+
price.let { prices += price * qty[index] }
138+
index++
139+
}
140+
prices += totalTaxAmount
141+
return prices + donation
142+
}
143+
return -1F
151144
}
152145

153146
fun getTaxDetails(eventId: Long) {

app/src/main/res/layout/fragment_attendee.xml

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,25 @@
425425
tools:itemCount="3"
426426
tools:listitem="@layout/item_attendee" />
427427

428+
<RelativeLayout
429+
android:id="@+id/billingInfoCheckboxSection"
430+
android:layout_width="match_parent"
431+
android:layout_height="wrap_content">
432+
<TextView
433+
android:layout_width="wrap_content"
434+
android:layout_height="wrap_content"
435+
android:text="@string/billing_information"
436+
android:textColor="@color/black"
437+
android:textSize="@dimen/heading_text_size"
438+
android:layout_alignParentStart="true"
439+
android:layout_centerVertical="true"/>
440+
<CheckBox
441+
android:id="@+id/billingEnabledCheckbox"
442+
android:layout_width="wrap_content"
443+
android:layout_height="wrap_content"
444+
android:layout_alignParentEnd="true"/>
445+
</RelativeLayout>
446+
428447
<LinearLayout
429448
android:id="@+id/billingInfoContainer"
430449
android:layout_width="match_parent"
@@ -434,13 +453,6 @@
434453
android:visibility="gone"
435454
tools:visibility="visible">
436455

437-
<TextView
438-
android:layout_width="wrap_content"
439-
android:layout_height="wrap_content"
440-
android:text="@string/billing_information"
441-
android:textColor="@color/black"
442-
android:textSize="@dimen/heading_text_size"/>
443-
444456
<com.google.android.material.textfield.TextInputLayout
445457
android:id="@+id/billingCompanyLayout"
446458
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"

app/src/main/res/navigation/navigation_graph.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -761,11 +761,6 @@
761761
app:argType="float"
762762
app:nullable="false"
763763
android:defaultValue="0.0"/>
764-
765-
<argument
766-
android:name="hasPaidTickets"
767-
app:argType="boolean"
768-
android:defaultValue="false"/>
769764
</fragment>
770765
<fragment
771766
android:id="@+id/orderCompletedFragment"

0 commit comments

Comments
 (0)