Ermögliche individuelle Arbeitszeit jedes Technikers

master
Niko Diamadis 5 years ago
parent 2ab87135b6
commit 92df8e1b82

@ -142,7 +142,6 @@ class ListingFragment : Fragment() {
if (techniker.getBoolean("admin")) {
adminMode = true
sharedPrefEditor.putBoolean("admin", adminMode)
sharedPrefEditor.putString("technikerId", techniker.objectId).apply()
binding.floatingActionButton.show()
binding.floatingActionButton.setOnClickListener {
val action = ListingFragmentDirections.navigateToPusher()
@ -150,9 +149,10 @@ class ListingFragment : Fragment() {
}
} else {
adminMode = false
sharedPrefEditor.putBoolean("admin", adminMode).apply()
sharedPrefEditor.putBoolean("admin", adminMode)
binding.floatingActionButton.hide()
}
sharedPrefEditor.putString("technikerId", techniker.objectId).apply()
} else {
binding.floatingActionButton.hide()
adminMode = false

@ -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,37 +65,124 @@ 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)
val query = ParseQuery.getQuery<ParseObject>("Teilnahme")
query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key))
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}"
} else {
Toasty.error(myContext, "Fehler bei Techniker-Löschung").show()
Log.e("TechnikLogger.TechLösch", it.message.toString())
}
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 {
Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show()
Log.e("TechnikLogger.TechSuche", e.message.toString())
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) {
adapter.notifyDataSetChanged()
binding.recyclerView.scheduleLayoutAnimation()
binding.technikerView.text = "Techniker: ${techniker.size}"
} else {
Toasty.error(myContext, "Fehler bei Techniker-Löschung").show()
Log.e("TechnikLogger.TechLösch", it.message.toString())
}
}
} else {
Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show()
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) {

@ -4,6 +4,9 @@ sealed class ProjectTechnikerViewState {
data class ProjectTechniker(
val name: String,
val key: String
val key: String,
var teilnahmeKey: String,
var dauer: String,
var uhrzeit: String
) : ProjectTechnikerViewState()
}

Loading…
Cancel
Save