|
|
|
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.content.SharedPreferences
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.text.Html
|
|
|
|
|
import android.util.Log
|
|
|
|
|
import android.view.*
|
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
|
@ -19,6 +20,8 @@ import com.cyb3rko.techniklogger.R
|
|
|
|
|
import com.cyb3rko.techniklogger.databinding.FragmentProjectBinding
|
|
|
|
|
import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewHolder
|
|
|
|
|
import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewState
|
|
|
|
|
import com.google.android.material.timepicker.MaterialTimePicker
|
|
|
|
|
import com.google.android.material.timepicker.TimeFormat
|
|
|
|
|
import com.parse.ParseObject
|
|
|
|
|
import com.parse.ParseQuery
|
|
|
|
|
import es.dmoral.toasty.Toasty
|
|
|
|
|
@ -26,6 +29,8 @@ import java.lang.IndexOutOfBoundsException
|
|
|
|
|
import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter.Companion.adapterOf
|
|
|
|
|
import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter
|
|
|
|
|
import me.ibrahimyilmaz.kiel.core.RecyclerViewHolder
|
|
|
|
|
import java.sql.Time
|
|
|
|
|
import java.text.DecimalFormat
|
|
|
|
|
|
|
|
|
|
@SuppressLint("SetTextI18n")
|
|
|
|
|
class ProjectFragment : Fragment() {
|
|
|
|
|
@ -36,9 +41,11 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
private lateinit var adapter: RecyclerViewAdapter<ProjectTechnikerViewState, RecyclerViewHolder<ProjectTechnikerViewState>>
|
|
|
|
|
private var adminMode = false
|
|
|
|
|
private var childKey = ""
|
|
|
|
|
private var dauer = ""
|
|
|
|
|
private lateinit var einsatz: ParseObject
|
|
|
|
|
private lateinit var sharedPref: SharedPreferences
|
|
|
|
|
private val techniker: MutableList<ProjectTechnikerViewState.ProjectTechniker> = mutableListOf()
|
|
|
|
|
private var time = ""
|
|
|
|
|
|
|
|
|
|
private val binding get() = _binding!!
|
|
|
|
|
|
|
|
|
|
@ -58,21 +65,108 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
layoutResource = R.layout.item_recycler_techniker,
|
|
|
|
|
viewHolder = ::ProjectTechnikerViewHolder,
|
|
|
|
|
onBindBindViewHolder = { vh, _, clickedTechniker ->
|
|
|
|
|
vh.textView.text = clickedTechniker.name
|
|
|
|
|
vh.textView.text = "${clickedTechniker.name}, ${clickedTechniker.dauer} h"
|
|
|
|
|
vh.itemView.setOnClickListener {
|
|
|
|
|
if (adminMode) {
|
|
|
|
|
if (adminMode || clickedTechniker.name == sharedPref.getString("name", "")) {
|
|
|
|
|
MaterialDialog(myContext)
|
|
|
|
|
.show {
|
|
|
|
|
message(text = "Möchtest du \'${clickedTechniker.name}\' entfernen?")
|
|
|
|
|
positiveButton(text = "Ja") {
|
|
|
|
|
techniker.remove(clickedTechniker)
|
|
|
|
|
title(text = clickedTechniker.name)
|
|
|
|
|
val uhrzeit = if (clickedTechniker.uhrzeit == "0") time else clickedTechniker.uhrzeit
|
|
|
|
|
message(text = Html.fromHtml("<strong><u>Arbeitszeit:</u></strong><br/>$uhrzeit Uhr<br/><br/>Wie möchtest du " +
|
|
|
|
|
"diesen Eintrag bearbeiten?"))
|
|
|
|
|
positiveButton(text = "Arbeitszeit ändern") {
|
|
|
|
|
var tempTime = ""
|
|
|
|
|
var time1 = Time(0)
|
|
|
|
|
var time2 = Time(0)
|
|
|
|
|
val builder = MaterialTimePicker.Builder().setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Von")
|
|
|
|
|
val builder2 = MaterialTimePicker.Builder().setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Bis")
|
|
|
|
|
val picker = builder.build()
|
|
|
|
|
val picker2 = builder2.build()
|
|
|
|
|
var hour: String
|
|
|
|
|
var minute: String
|
|
|
|
|
var hoursInMillis: Long
|
|
|
|
|
var minutesInMillis: Long
|
|
|
|
|
if (clickedTechniker.uhrzeit != "0") {
|
|
|
|
|
val times = clickedTechniker.uhrzeit.split(" - ")
|
|
|
|
|
builder.setHour(times[0].split(":")[0].toInt())
|
|
|
|
|
.setMinute(times[0].split(":")[1].toInt())
|
|
|
|
|
builder2.setHour(times[1].split(":")[0].toInt())
|
|
|
|
|
.setMinute(times[1].split(":")[1].toInt())
|
|
|
|
|
}
|
|
|
|
|
picker.addOnPositiveButtonClickListener {
|
|
|
|
|
hour = picker.hour.toString()
|
|
|
|
|
hour = if (hour.length != 1) hour else "0$hour"
|
|
|
|
|
minute = picker.minute.toString()
|
|
|
|
|
minute = if (minute.length != 1) minute else "0$minute"
|
|
|
|
|
hoursInMillis = picker.hour.toLong() * 3600000
|
|
|
|
|
minutesInMillis = picker.minute.toLong() * 60000
|
|
|
|
|
time1 = Time(hoursInMillis + minutesInMillis)
|
|
|
|
|
tempTime += "${hour}:${minute} - "
|
|
|
|
|
activity?.let { it1 -> picker2.show(it1.supportFragmentManager, picker2.tag) }
|
|
|
|
|
}
|
|
|
|
|
picker2.addOnPositiveButtonClickListener {
|
|
|
|
|
hour = picker2.hour.toString()
|
|
|
|
|
hour = if (hour.length != 1) hour else "0$hour"
|
|
|
|
|
minute = picker2.minute.toString()
|
|
|
|
|
minute = if (minute.length != 1) minute else "0$minute"
|
|
|
|
|
hoursInMillis = hour.toLong() * 3600000
|
|
|
|
|
minutesInMillis = minute.toLong() * 60000
|
|
|
|
|
time2 = Time(hoursInMillis + minutesInMillis)
|
|
|
|
|
tempTime += "${hour}:${minute}"
|
|
|
|
|
clickedTechniker.uhrzeit = tempTime
|
|
|
|
|
val tempDauer = DecimalFormat("#.#").format((time2.time - time1.time) / 3600 / 1000.toFloat())
|
|
|
|
|
clickedTechniker.dauer = tempDauer.replace(",", ".")
|
|
|
|
|
|
|
|
|
|
if (clickedTechniker.teilnahmeKey != "0") {
|
|
|
|
|
val dauerFloat = clickedTechniker.dauer.toFloat()
|
|
|
|
|
ParseObject.createWithoutData("Teilnahme", clickedTechniker.teilnahmeKey).apply {
|
|
|
|
|
put("dauer", dauerFloat)
|
|
|
|
|
put("uhrzeit", clickedTechniker.uhrzeit)
|
|
|
|
|
saveInBackground()
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
val query = ParseQuery.getQuery<ParseObject>("Teilnahme")
|
|
|
|
|
query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key))
|
|
|
|
|
query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", childKey))
|
|
|
|
|
query.getFirstInBackground { obj, e ->
|
|
|
|
|
if (e == null) {
|
|
|
|
|
clickedTechniker.teilnahmeKey = obj.objectId
|
|
|
|
|
val dauerFloat = clickedTechniker.dauer.toFloat()
|
|
|
|
|
ParseObject.createWithoutData("Teilnahme", clickedTechniker.teilnahmeKey).apply {
|
|
|
|
|
put("dauer", dauerFloat)
|
|
|
|
|
put("uhrzeit", clickedTechniker.uhrzeit)
|
|
|
|
|
saveInBackground()
|
|
|
|
|
}
|
|
|
|
|
adapter.notifyDataSetChanged()
|
|
|
|
|
binding.recyclerView.scheduleLayoutAnimation()
|
|
|
|
|
} else {
|
|
|
|
|
Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show()
|
|
|
|
|
Log.e("TechnikLogger.TechSuche", e.message.toString())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
adapter.notifyDataSetChanged()
|
|
|
|
|
binding.recyclerView.scheduleLayoutAnimation()
|
|
|
|
|
}
|
|
|
|
|
activity?.let { it1 -> picker.show(it1.supportFragmentManager, picker.tag) }
|
|
|
|
|
}
|
|
|
|
|
negativeButton(text = "Entfernen") {
|
|
|
|
|
techniker.remove(clickedTechniker)
|
|
|
|
|
if (clickedTechniker.teilnahmeKey != "0") {
|
|
|
|
|
ParseObject.createWithoutData ("Teilnahme", clickedTechniker.teilnahmeKey).deleteInBackground() {
|
|
|
|
|
adapter.notifyDataSetChanged()
|
|
|
|
|
binding.recyclerView.scheduleLayoutAnimation()
|
|
|
|
|
binding.technikerView.text = "Techniker: ${techniker.size}"
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
val query = ParseQuery.getQuery<ParseObject>("Teilnahme")
|
|
|
|
|
query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key))
|
|
|
|
|
query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", childKey))
|
|
|
|
|
query.getFirstInBackground { obj, e ->
|
|
|
|
|
if (e == null) {
|
|
|
|
|
obj.deleteInBackground() {
|
|
|
|
|
if (it == null) {
|
|
|
|
|
einsatz.saveInBackground()
|
|
|
|
|
adapter.notifyDataSetChanged()
|
|
|
|
|
binding.recyclerView.scheduleLayoutAnimation()
|
|
|
|
|
binding.technikerView.text = "Techniker: ${techniker.size}"
|
|
|
|
|
@ -86,9 +180,9 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
Log.e("TechnikLogger.TechSuche", e.message.toString())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (techniker.size == 0) showDivider(false)
|
|
|
|
|
}
|
|
|
|
|
negativeButton(text = "Abbrechen")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -104,7 +198,9 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
val dates = einsatz["datum"].toString().split(",")
|
|
|
|
|
val dateParts = dates[0].split(".")
|
|
|
|
|
val date = "${dateParts[2]}.${dateParts[1]}.${dateParts[0]}"
|
|
|
|
|
val time = if (dates.size > 1) ", ${dates[1]}" else ", ${einsatz.getNumber("dauer")} h"
|
|
|
|
|
dauer = einsatz.getNumber("dauer")!!.toString()
|
|
|
|
|
if (dates.size > 1) time = dates[1]
|
|
|
|
|
val time = if (dates.size > 1) ", ${dates[1]}" else ", $dauer h"
|
|
|
|
|
binding.dateView.text = date + time
|
|
|
|
|
|
|
|
|
|
val query2 = ParseQuery.getQuery<ParseObject>("Teilnahme")
|
|
|
|
|
@ -115,7 +211,16 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
if (objects2.isNotEmpty()) {
|
|
|
|
|
objects2.forEach {
|
|
|
|
|
val teilnehmenderTechniker = it.getParseObject("von")!!
|
|
|
|
|
techniker.add(ProjectTechnikerViewState.ProjectTechniker(teilnehmenderTechniker.getString("name")!!, teilnehmenderTechniker.objectId))
|
|
|
|
|
val dauerEntry = it.getNumber("dauer")!!
|
|
|
|
|
val dauer = if (dauerEntry == 0) einsatz.getNumber("dauer")!!.toString() else dauerEntry.toString()
|
|
|
|
|
val time = it.getString("uhrzeit")!!
|
|
|
|
|
techniker.add(ProjectTechnikerViewState.ProjectTechniker(
|
|
|
|
|
teilnehmenderTechniker.getString("name")!!,
|
|
|
|
|
teilnehmenderTechniker.objectId,
|
|
|
|
|
it.objectId,
|
|
|
|
|
dauer,
|
|
|
|
|
time
|
|
|
|
|
))
|
|
|
|
|
}
|
|
|
|
|
techniker.sortBy { it.name }
|
|
|
|
|
binding.recyclerView.scheduleLayoutAnimation()
|
|
|
|
|
@ -270,7 +375,7 @@ class ProjectFragment : Fragment() {
|
|
|
|
|
entryObject.put("von", it)
|
|
|
|
|
entryObject.put("an", project)
|
|
|
|
|
entryList.add(entryObject)
|
|
|
|
|
techniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId))
|
|
|
|
|
techniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId, "0", dauer, time))
|
|
|
|
|
}
|
|
|
|
|
ParseObject.saveAllInBackground(entryList) {
|
|
|
|
|
if (it == null) {
|
|
|
|
|
|