From 90f194f2e13fc6a06a67dd1bcf9f591985578146 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 04:55:28 +0000 Subject: [PATCH 1/2] Initial plan From 9761d5b15dbdddb9a88f00469abc874aa464e800 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 05:06:35 +0000 Subject: [PATCH 2/2] Refactor PlanRegistrationHelper: replace duplicate PlanText parsing with PlanTextHelper.ParsePlanText Replace two large blocks of duplicated PlanText parsing logic (splitList + regex + shift assignment + PlanHours calculation) with calls to PlanTextHelper.ParsePlanText(). Each block was ~340 lines of duplicated code reduced to 2 lines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: renemadsen <76994+renemadsen@users.noreply.github.com> --- .../PlanTextHelperTests.cs | 392 +++++++++++ .../Helpers/GoogleSheetHelper.cs | 663 +----------------- .../Helpers/PlanRegistrationHelper.cs | 663 +----------------- .../Infrastructure/Helpers/PlanTextHelper.cs | 291 ++++++++ .../TimePlanningPlanningService.cs | 2 + 5 files changed, 689 insertions(+), 1322 deletions(-) create mode 100644 eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn.Test/PlanTextHelperTests.cs create mode 100644 eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanTextHelper.cs diff --git a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn.Test/PlanTextHelperTests.cs b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn.Test/PlanTextHelperTests.cs new file mode 100644 index 00000000..0f2700e6 --- /dev/null +++ b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn.Test/PlanTextHelperTests.cs @@ -0,0 +1,392 @@ +using Microting.TimePlanningBase.Infrastructure.Data.Entities; +using NUnit.Framework; +using TimePlanning.Pn.Infrastructure.Helpers; + +namespace TimePlanning.Pn.Test; + +[TestFixture] +public class PlanTextHelperTests +{ + // ────────────────────────────────────────────── + // BreakTimeCalculator tests + // ────────────────────────────────────────────── + + [TestCase("0.1", 5)] + [TestCase(".1", 5)] + [TestCase("0.15", 10)] + [TestCase(".15", 10)] + [TestCase("0.25", 15)] + [TestCase(".25", 15)] + [TestCase("0.3", 20)] + [TestCase(".3", 20)] + [TestCase("0.4", 25)] + [TestCase(".4", 25)] + [TestCase("0.5", 30)] + [TestCase(".5", 30)] + [TestCase("0.6", 35)] + [TestCase(".6", 35)] + [TestCase("0.7", 40)] + [TestCase(".7", 40)] + [TestCase("0.75", 45)] + [TestCase(".75", 45)] + [TestCase("0.8", 50)] + [TestCase(".8", 50)] + [TestCase("0.9", 55)] + [TestCase(".9", 55)] + [TestCase("¾", 45)] + [TestCase("½", 30)] + [TestCase("1", 60)] + [TestCase("unknown", 0)] + [TestCase("", 0)] + public void BreakTimeCalculator_ReturnsCorrectMinutes(string input, int expectedMinutes) + { + Assert.That(PlanTextHelper.BreakTimeCalculator(input), Is.EqualTo(expectedMinutes)); + } + + // ────────────────────────────────────────────── + // MinutesToBreakString tests (reverse of BreakTimeCalculator) + // ────────────────────────────────────────────── + + [TestCase(5, "0.1")] + [TestCase(10, "0.15")] + [TestCase(15, "0.25")] + [TestCase(20, "0.3")] + [TestCase(25, "0.4")] + [TestCase(30, "0.5")] + [TestCase(35, "0.6")] + [TestCase(40, "0.7")] + [TestCase(45, "0.75")] + [TestCase(50, "0.8")] + [TestCase(55, "0.9")] + [TestCase(60, "1")] + [TestCase(0, "0")] + [TestCase(7, "0")] // not in the mapping + public void MinutesToBreakString_ReturnsCorrectString(int minutes, string expected) + { + Assert.That(PlanTextHelper.MinutesToBreakString(minutes), Is.EqualTo(expected)); + } + + // ────────────────────────────────────────────── + // MinutesToBreakString round-trip with BreakTimeCalculator + // ────────────────────────────────────────────── + + [TestCase(5)] + [TestCase(10)] + [TestCase(15)] + [TestCase(20)] + [TestCase(25)] + [TestCase(30)] + [TestCase(35)] + [TestCase(40)] + [TestCase(45)] + [TestCase(50)] + [TestCase(55)] + [TestCase(60)] + public void BreakRoundTrip_MinutesToStringToMinutes(int minutes) + { + var str = PlanTextHelper.MinutesToBreakString(minutes); + var result = PlanTextHelper.BreakTimeCalculator(str); + Assert.That(result, Is.EqualTo(minutes)); + } + + // ────────────────────────────────────────────── + // ParseTimeToMinutes tests + // ────────────────────────────────────────────── + + [TestCase("8:00", 480)] + [TestCase("8.00", 480)] + [TestCase("16:00", 960)] + [TestCase("8:30", 510)] + [TestCase("8.30", 510)] + [TestCase("0:00", 0)] + [TestCase("12:45", 765)] + public void ParseTimeToMinutes_ReturnsCorrectValue(string input, int expected) + { + Assert.That(PlanTextHelper.ParseTimeToMinutes(input), Is.EqualTo(expected)); + } + + // ────────────────────────────────────────────── + // MinutesToTimeString tests + // ────────────────────────────────────────────── + + [TestCase(480, "8:00")] + [TestCase(960, "16:00")] + [TestCase(510, "8:30")] + [TestCase(0, "0:00")] + [TestCase(765, "12:45")] + public void MinutesToTimeString_ReturnsCorrectValue(int minutes, string expected) + { + Assert.That(PlanTextHelper.MinutesToTimeString(minutes), Is.EqualTo(expected)); + } + + // ────────────────────────────────────────────── + // ParsePlanText tests – single shift + // ────────────────────────────────────────────── + + [Test] + public void ParsePlanText_SingleShiftNoBreak() + { + var reg = new PlanRegistration { PlanText = "8:00-16:00" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(480)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(960)); + Assert.That(reg.PlannedBreakOfShift1, Is.EqualTo(0)); + Assert.That(reg.PlanHours, Is.EqualTo(8.0)); + } + + [Test] + public void ParsePlanText_SingleShiftWithBreak() + { + var reg = new PlanRegistration { PlanText = "8:00-16:00/0.5" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(480)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(960)); + Assert.That(reg.PlannedBreakOfShift1, Is.EqualTo(30)); + Assert.That(reg.PlanHours, Is.EqualTo(7.5)); + } + + [Test] + public void ParsePlanText_SingleShiftDotSeparator() + { + var reg = new PlanRegistration { PlanText = "8.00-16.00/0.5" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(480)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(960)); + Assert.That(reg.PlannedBreakOfShift1, Is.EqualTo(30)); + } + + // ────────────────────────────────────────────── + // ParsePlanText tests – multiple shifts + // ────────────────────────────────────────────── + + [Test] + public void ParsePlanText_TwoShifts() + { + var reg = new PlanRegistration { PlanText = "8:00-12:00/0.25;13:00-17:00/0.5" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(480)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(720)); + Assert.That(reg.PlannedBreakOfShift1, Is.EqualTo(15)); + + Assert.That(reg.PlannedStartOfShift2, Is.EqualTo(780)); + Assert.That(reg.PlannedEndOfShift2, Is.EqualTo(1020)); + Assert.That(reg.PlannedBreakOfShift2, Is.EqualTo(30)); + + // Total: (720-480-15) + (1020-780-30) = 225 + 210 = 435 min = 7.25 hours + Assert.That(reg.PlanHours, Is.EqualTo(435.0 / 60.0)); + } + + [Test] + public void ParsePlanText_FiveShifts() + { + var reg = new PlanRegistration + { + PlanText = "6:00-8:00;9:00-11:00;12:00-14:00;15:00-17:00;18:00-20:00" + }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(360)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(480)); + Assert.That(reg.PlannedStartOfShift2, Is.EqualTo(540)); + Assert.That(reg.PlannedEndOfShift2, Is.EqualTo(660)); + Assert.That(reg.PlannedStartOfShift3, Is.EqualTo(720)); + Assert.That(reg.PlannedEndOfShift3, Is.EqualTo(840)); + Assert.That(reg.PlannedStartOfShift4, Is.EqualTo(900)); + Assert.That(reg.PlannedEndOfShift4, Is.EqualTo(1020)); + Assert.That(reg.PlannedStartOfShift5, Is.EqualTo(1080)); + Assert.That(reg.PlannedEndOfShift5, Is.EqualTo(1200)); + Assert.That(reg.PlanHours, Is.EqualTo(10.0)); + } + + [Test] + public void ParsePlanText_EmptyString_NoChange() + { + var reg = new PlanRegistration { PlanText = "" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(0)); + Assert.That(reg.PlannedEndOfShift1, Is.EqualTo(0)); + } + + [Test] + public void ParsePlanText_NullString_NoChange() + { + var reg = new PlanRegistration { PlanText = null }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedStartOfShift1, Is.EqualTo(0)); + } + + // ────────────────────────────────────────────── + // GeneratePlanText tests + // ────────────────────────────────────────────── + + [Test] + public void GeneratePlanText_SingleShiftNoBreak() + { + var reg = new PlanRegistration + { + PlannedStartOfShift1 = 480, + PlannedEndOfShift1 = 960, + PlannedBreakOfShift1 = 0 + }; + var result = PlanTextHelper.GeneratePlanText(reg); + Assert.That(result, Is.EqualTo("8:00-16:00")); + } + + [Test] + public void GeneratePlanText_SingleShiftWithBreak() + { + var reg = new PlanRegistration + { + PlannedStartOfShift1 = 480, + PlannedEndOfShift1 = 960, + PlannedBreakOfShift1 = 30 + }; + var result = PlanTextHelper.GeneratePlanText(reg); + Assert.That(result, Is.EqualTo("8:00-16:00/0.5")); + } + + [Test] + public void GeneratePlanText_TwoShifts() + { + var reg = new PlanRegistration + { + PlannedStartOfShift1 = 480, + PlannedEndOfShift1 = 720, + PlannedBreakOfShift1 = 15, + PlannedStartOfShift2 = 780, + PlannedEndOfShift2 = 1020, + PlannedBreakOfShift2 = 30 + }; + var result = PlanTextHelper.GeneratePlanText(reg); + Assert.That(result, Is.EqualTo("8:00-12:00/0.25;13:00-17:00/0.5")); + } + + [Test] + public void GeneratePlanText_NoShifts_ReturnsEmpty() + { + var reg = new PlanRegistration(); + var result = PlanTextHelper.GeneratePlanText(reg); + Assert.That(result, Is.EqualTo("")); + } + + [Test] + public void GeneratePlanText_FiveShifts() + { + var reg = new PlanRegistration + { + PlannedStartOfShift1 = 360, PlannedEndOfShift1 = 480, + PlannedStartOfShift2 = 540, PlannedEndOfShift2 = 660, + PlannedStartOfShift3 = 720, PlannedEndOfShift3 = 840, + PlannedStartOfShift4 = 900, PlannedEndOfShift4 = 1020, + PlannedStartOfShift5 = 1080, PlannedEndOfShift5 = 1200 + }; + var result = PlanTextHelper.GeneratePlanText(reg); + Assert.That(result, Is.EqualTo("6:00-8:00;9:00-11:00;12:00-14:00;15:00-17:00;18:00-20:00")); + } + + // ────────────────────────────────────────────── + // Round-trip tests: Parse → Generate → Parse should yield same shift values + // ────────────────────────────────────────────── + + [TestCase("8:00-16:00/0.5")] + [TestCase("8:00-12:00/0.25;13:00-17:00/0.5")] + [TestCase("6:00-8:00;9:00-11:00;12:00-14:00;15:00-17:00;18:00-20:00")] + [TestCase("7:30-15:30/0.75")] + [TestCase("8:00-16:00")] + public void RoundTrip_ParseThenGenerate_ProducesBitwiseSameShifts(string planText) + { + // Parse the original text + var reg1 = new PlanRegistration { PlanText = planText }; + PlanTextHelper.ParsePlanText(reg1); + + // Generate text from the parsed shifts + var generatedText = PlanTextHelper.GeneratePlanText(reg1); + + // Parse the generated text + var reg2 = new PlanRegistration { PlanText = generatedText }; + PlanTextHelper.ParsePlanText(reg2); + + // Assert all shift fields are bitwise identical + Assert.That(reg2.PlannedStartOfShift1, Is.EqualTo(reg1.PlannedStartOfShift1)); + Assert.That(reg2.PlannedEndOfShift1, Is.EqualTo(reg1.PlannedEndOfShift1)); + Assert.That(reg2.PlannedBreakOfShift1, Is.EqualTo(reg1.PlannedBreakOfShift1)); + Assert.That(reg2.PlannedStartOfShift2, Is.EqualTo(reg1.PlannedStartOfShift2)); + Assert.That(reg2.PlannedEndOfShift2, Is.EqualTo(reg1.PlannedEndOfShift2)); + Assert.That(reg2.PlannedBreakOfShift2, Is.EqualTo(reg1.PlannedBreakOfShift2)); + Assert.That(reg2.PlannedStartOfShift3, Is.EqualTo(reg1.PlannedStartOfShift3)); + Assert.That(reg2.PlannedEndOfShift3, Is.EqualTo(reg1.PlannedEndOfShift3)); + Assert.That(reg2.PlannedBreakOfShift3, Is.EqualTo(reg1.PlannedBreakOfShift3)); + Assert.That(reg2.PlannedStartOfShift4, Is.EqualTo(reg1.PlannedStartOfShift4)); + Assert.That(reg2.PlannedEndOfShift4, Is.EqualTo(reg1.PlannedEndOfShift4)); + Assert.That(reg2.PlannedBreakOfShift4, Is.EqualTo(reg1.PlannedBreakOfShift4)); + Assert.That(reg2.PlannedStartOfShift5, Is.EqualTo(reg1.PlannedStartOfShift5)); + Assert.That(reg2.PlannedEndOfShift5, Is.EqualTo(reg1.PlannedEndOfShift5)); + Assert.That(reg2.PlannedBreakOfShift5, Is.EqualTo(reg1.PlannedBreakOfShift5)); + Assert.That(reg2.PlanHours, Is.EqualTo(reg1.PlanHours)); + } + + [Test] + public void RoundTrip_Generate_Then_Parse_Matches() + { + var reg1 = new PlanRegistration + { + PlannedStartOfShift1 = 480, + PlannedEndOfShift1 = 960, + PlannedBreakOfShift1 = 30, + PlannedStartOfShift2 = 1020, + PlannedEndOfShift2 = 1200, + PlannedBreakOfShift2 = 15, + }; + + var text = PlanTextHelper.GeneratePlanText(reg1); + var reg2 = new PlanRegistration { PlanText = text }; + PlanTextHelper.ParsePlanText(reg2); + + Assert.That(reg2.PlannedStartOfShift1, Is.EqualTo(reg1.PlannedStartOfShift1)); + Assert.That(reg2.PlannedEndOfShift1, Is.EqualTo(reg1.PlannedEndOfShift1)); + Assert.That(reg2.PlannedBreakOfShift1, Is.EqualTo(reg1.PlannedBreakOfShift1)); + Assert.That(reg2.PlannedStartOfShift2, Is.EqualTo(reg1.PlannedStartOfShift2)); + Assert.That(reg2.PlannedEndOfShift2, Is.EqualTo(reg1.PlannedEndOfShift2)); + Assert.That(reg2.PlannedBreakOfShift2, Is.EqualTo(reg1.PlannedBreakOfShift2)); + } + + // ────────────────────────────────────────────── + // Edge cases for break values with comma + // ────────────────────────────────────────────── + + [Test] + public void ParsePlanText_CommaInBreak() + { + // PlanText uses comma as decimal separator - should be handled + var reg = new PlanRegistration { PlanText = "8:00-16:00/0,5" }; + PlanTextHelper.ParsePlanText(reg); + + Assert.That(reg.PlannedBreakOfShift1, Is.EqualTo(30)); + } + + // ────────────────────────────────────────────── + // MinutesToBreakString with unmapped break value + // ────────────────────────────────────────────── + + [Test] + public void GeneratePlanText_UnmappedBreak_OmitsBreak() + { + // 7 minutes doesn't map to a known break string -> "0" + // The generated text should include /0 which means 0 break + var reg = new PlanRegistration + { + PlannedStartOfShift1 = 480, + PlannedEndOfShift1 = 960, + PlannedBreakOfShift1 = 7 + }; + var result = PlanTextHelper.GeneratePlanText(reg); + // Since MinutesToBreakString(7) = "0", and breakMinutes > 0, it will be "8:00-16:00/0" + Assert.That(result, Is.EqualTo("8:00-16:00/0")); + } +} diff --git a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/GoogleSheetHelper.cs b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/GoogleSheetHelper.cs index 1163639b..c3bd6ce8 100644 --- a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/GoogleSheetHelper.cs +++ b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/GoogleSheetHelper.cs @@ -325,335 +325,7 @@ public static async Task PullEverythingFromGoogleSheet(Core core, TimePlanningPn StatusCaseId = 0 }; - if (!string.IsNullOrEmpty(planRegistration.PlanText)) - { - var splitList = planRegistration.PlanText.Split(';'); - var firsSplit = splitList[0]; - - var regex = new Regex(@"(.*)-(.*)\/(.*)"); - var match = regex.Match(firsSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(firsSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - - if (splitList.Length > 1) - { - var secondSplit = splitList[1]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(secondSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(secondSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (splitList.Length > 2) - { - var thirdSplit = splitList[2]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(thirdSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(thirdSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift3 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift3 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift3 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift3 = 0; - } - } - } - } - - if (splitList.Length > 3) - { - var fourthSplit = splitList[3]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fourthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fourthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift4 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift4 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift4 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift4 = 0; - } - } - } - } - - if (splitList.Length > 4) - { - var fifthSplit = splitList[4]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fifthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fifthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift5 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift5 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift5 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift5 = 0; - } - } - } - - var calculatedPlanHoursInMinutes = 0; - var originalPlanHours = planRegistration.PlanHours; - if (planRegistration.PlannedStartOfShift1 != 0 && planRegistration.PlannedEndOfShift1 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift1 - - planRegistration.PlannedStartOfShift1 - - planRegistration.PlannedBreakOfShift1; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift2 != 0 && planRegistration.PlannedEndOfShift2 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift2 - - planRegistration.PlannedStartOfShift2 - - planRegistration.PlannedBreakOfShift2; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift3 != 0 && planRegistration.PlannedEndOfShift3 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift3 - - planRegistration.PlannedStartOfShift3 - - planRegistration.PlannedBreakOfShift3; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift4 != 0 && planRegistration.PlannedEndOfShift4 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift4 - - planRegistration.PlannedStartOfShift4 - - planRegistration.PlannedBreakOfShift4; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift5 != 0 && planRegistration.PlannedEndOfShift5 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift5 - - planRegistration.PlannedStartOfShift5 - - planRegistration.PlannedBreakOfShift5; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - } - } + PlanTextHelper.ParsePlanText(planRegistration); if (preTimePlanning != null) { @@ -695,338 +367,7 @@ public static async Task PullEverythingFromGoogleSheet(Core core, TimePlanningPn planRegistration.PlanHours = parsedPlanHours; planRegistration.UpdatedByUserId = 1; - var splitList = planRegistration.PlanText.Replace(",", ".").Split(';'); - var firsSplit = splitList[0]; - - var regex = new Regex(@"(.*)-(.*)\/(.*)"); - var match = regex.Match(firsSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(firsSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - - if (splitList.Length > 1) - { - var secondSplit = splitList[1]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(secondSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(secondSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (splitList.Length > 2) - { - var thirdSplit = splitList[2]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(thirdSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(thirdSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift3 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift3 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift3 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift3 = 0; - } - } - } - } - - if (splitList.Length > 3) - { - var fourthSplit = splitList[3]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fourthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fourthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift4 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift4 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift4 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift4 = 0; - } - } - } - } - - if (splitList.Length > 4) - { - var fifthSplit = splitList[4]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fifthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fifthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift5 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift5 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift5 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift5 = 0; - } - } - } - } - - var calculatedPlanHoursInMinutes = 0; - var originalPlanHours = planRegistration.PlanHours; - if (planRegistration.PlannedStartOfShift1 != 0 && planRegistration.PlannedEndOfShift1 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift1 - - planRegistration.PlannedStartOfShift1 - - planRegistration.PlannedBreakOfShift1; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift2 != 0 && planRegistration.PlannedEndOfShift2 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift2 - - planRegistration.PlannedStartOfShift2 - - planRegistration.PlannedBreakOfShift2; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift3 != 0 && planRegistration.PlannedEndOfShift3 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift3 - - planRegistration.PlannedStartOfShift3 - - planRegistration.PlannedBreakOfShift3; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift4 != 0 && planRegistration.PlannedEndOfShift4 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift4 - - planRegistration.PlannedStartOfShift4 - - planRegistration.PlannedBreakOfShift4; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift5 != 0 && planRegistration.PlannedEndOfShift5 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift5 - - planRegistration.PlannedStartOfShift5 - - planRegistration.PlannedBreakOfShift5; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } + PlanTextHelper.ParsePlanText(planRegistration); if (preTimePlanning != null) { diff --git a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanRegistrationHelper.cs b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanRegistrationHelper.cs index f6956cd3..64d5ebd3 100644 --- a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanRegistrationHelper.cs +++ b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanRegistrationHelper.cs @@ -641,343 +641,8 @@ IPluginDbOptions options { if (!string.IsNullOrEmpty(planRegistration.PlanText)) { - var splitList = planRegistration.PlanText.Replace(",", ".").Split(';'); - var firsSplit = splitList[0]; - - var regex = new Regex(@"(.*)-(.*)\/(.*)"); - var match = regex.Match(firsSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(firsSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - - if (splitList.Length > 1) - { - var secondSplit = splitList[1]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(secondSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(secondSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (splitList.Length > 2) - { - var thirdSplit = splitList[2]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(thirdSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(thirdSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift3 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift3 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift3 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift3 = 0; - } - } - } - } - - if (splitList.Length > 3) - { - var fourthSplit = splitList[3]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fourthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fourthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift4 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift4 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift4 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift4 = 0; - } - } - } - } - - if (splitList.Length > 4) - { - var fifthSplit = splitList[4]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fifthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fifthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], - StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift5 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift5 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift5 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift5 = 0; - } - } - } - } - - var calculatedPlanHoursInMinutes = 0; var originalPlanHours = planRegistration.PlanHours; - if (planRegistration.PlannedStartOfShift1 != 0 && - planRegistration.PlannedEndOfShift1 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift1 - - planRegistration.PlannedStartOfShift1 - - planRegistration.PlannedBreakOfShift1; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift2 != 0 && - planRegistration.PlannedEndOfShift2 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift2 - - planRegistration.PlannedStartOfShift2 - - planRegistration.PlannedBreakOfShift2; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift3 != 0 && - planRegistration.PlannedEndOfShift3 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift3 - - planRegistration.PlannedStartOfShift3 - - planRegistration.PlannedBreakOfShift3; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift4 != 0 && - planRegistration.PlannedEndOfShift4 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift4 - - planRegistration.PlannedStartOfShift4 - - planRegistration.PlannedBreakOfShift4; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift5 != 0 && - planRegistration.PlannedEndOfShift5 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift5 - - planRegistration.PlannedStartOfShift5 - - planRegistration.PlannedBreakOfShift5; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } + PlanTextHelper.ParsePlanText(planRegistration); if (originalPlanHours != planRegistration.PlanHours || tainted) { @@ -1667,332 +1332,8 @@ DateTime dayOfPayment { if (!string.IsNullOrEmpty(planRegistration.PlanText)) { - var splitList = planRegistration.PlanText.Replace(",", ".").Split(';'); - var firsSplit = splitList[0]; - - var regex = new Regex(@"(.*)-(.*)\/(.*)"); - var match = regex.Match(firsSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(firsSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift1 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift1 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift1 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift1 = 0; - } - } - - if (splitList.Length > 1) - { - var secondSplit = splitList[1]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(secondSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(secondSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift2 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift2 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift2 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift2 = 0; - } - } - } - - if (splitList.Length > 2) - { - var thirdSplit = splitList[2]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(thirdSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(thirdSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift3 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift3 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift3 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift3 = 0; - } - } - } - } - - if (splitList.Length > 3) - { - var fourthSplit = splitList[3]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fourthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fourthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift4 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift4 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift4 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift4 = 0; - } - } - } - } - - if (splitList.Length > 4) - { - var fifthSplit = splitList[4]; - regex = new Regex(@"(.*)-(.*)\/(.*)"); - match = regex.Match(fifthSplit); - if (match.Captures.Count == 0) - { - regex = new Regex(@"(.*)-(.*)"); - match = regex.Match(fifthSplit); - - if (match.Captures.Count == 1) - { - var firstPart = match.Groups[1].Value; - var firstPartSplit = - firstPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var firstPartHours = int.Parse(firstPartSplit[0]); - var firstPartMinutes = - firstPartSplit.Length > 1 ? int.Parse(firstPartSplit[1]) : 0; - var firstPartTotalMinutes = firstPartHours * 60 + firstPartMinutes; - var secondPart = match.Groups[2].Value; - var secondPartSplit = - secondPart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); - var secondPartHours = int.Parse(secondPartSplit[0]); - var secondPartMinutes = - secondPartSplit.Length > 1 ? int.Parse(secondPartSplit[1]) : 0; - var secondPartTotalMinutes = secondPartHours * 60 + secondPartMinutes; - planRegistration.PlannedStartOfShift5 = firstPartTotalMinutes; - planRegistration.PlannedEndOfShift5 = secondPartTotalMinutes; - - if (match.Groups.Count == 4) - { - var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); - - var breakPartMinutes = BreakTimeCalculator(breakPart); - - planRegistration.PlannedBreakOfShift5 = breakPartMinutes; - } - else - { - planRegistration.PlannedBreakOfShift5 = 0; - } - } - } - } - - var calculatedPlanHoursInMinutes = 0; var originalPlanHours = planRegistration.PlanHours; - if (planRegistration.PlannedStartOfShift1 != 0 && planRegistration.PlannedEndOfShift1 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift1 - - planRegistration.PlannedStartOfShift1 - - planRegistration.PlannedBreakOfShift1; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift2 != 0 && planRegistration.PlannedEndOfShift2 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift2 - - planRegistration.PlannedStartOfShift2 - - planRegistration.PlannedBreakOfShift2; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift3 != 0 && planRegistration.PlannedEndOfShift3 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift3 - - planRegistration.PlannedStartOfShift3 - - planRegistration.PlannedBreakOfShift3; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift4 != 0 && planRegistration.PlannedEndOfShift4 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift4 - - planRegistration.PlannedStartOfShift4 - - planRegistration.PlannedBreakOfShift4; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } - - if (planRegistration.PlannedStartOfShift5 != 0 && planRegistration.PlannedEndOfShift5 != 0) - { - calculatedPlanHoursInMinutes += planRegistration.PlannedEndOfShift5 - - planRegistration.PlannedStartOfShift5 - - planRegistration.PlannedBreakOfShift5; - planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; - } + PlanTextHelper.ParsePlanText(planRegistration); if (originalPlanHours != planRegistration.PlanHours || tainted) { diff --git a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanTextHelper.cs b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanTextHelper.cs new file mode 100644 index 00000000..ff3b3b3b --- /dev/null +++ b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Infrastructure/Helpers/PlanTextHelper.cs @@ -0,0 +1,291 @@ +using System; +using System.Text.RegularExpressions; +using Microting.TimePlanningBase.Infrastructure.Data.Entities; + +namespace TimePlanning.Pn.Infrastructure.Helpers; + +public static class PlanTextHelper +{ + /// + /// Parses a PlanText string and populates the shift fields on the given PlanRegistration. + /// PlanText format: "HH:MM-HH:MM/break;HH:MM-HH:MM/break;..." (up to 5 shifts separated by ';'). + /// Each shift segment is "start-end" or "start-end/break". + /// Times can use ':' or '.' as separator. Break is a decimal fraction of an hour. + /// Also recalculates PlanHours from the parsed shifts. + /// + public static void ParsePlanText(PlanRegistration planRegistration) + { + if (string.IsNullOrEmpty(planRegistration.PlanText)) + { + return; + } + + var splitList = planRegistration.PlanText.Replace(",", ".").Split(';'); + + for (int i = 0; i < splitList.Length && i < 5; i++) + { + var segment = splitList[i]; + ParseShiftSegment(segment, out var start, out var end, out var breakMinutes); + SetShift(planRegistration, i + 1, start, end, breakMinutes); + } + + RecalculatePlanHours(planRegistration); + } + + /// + /// Generates a PlanText string from the shift start/stop/break fields on a PlanRegistration. + /// This is the reverse of ParsePlanText. The output format uses "HH:MM-HH:MM/break" for each + /// shift, separated by ';'. Break is expressed as a decimal fraction of an hour. + /// + public static string GeneratePlanText(PlanRegistration planRegistration) + { + var segments = new System.Collections.Generic.List(); + + for (int i = 1; i <= 5; i++) + { + GetShift(planRegistration, i, out var start, out var end, out var breakMinutes); + if (start == 0 && end == 0) + { + continue; + } + + var startStr = MinutesToTimeString(start); + var endStr = MinutesToTimeString(end); + + if (breakMinutes > 0) + { + var breakStr = MinutesToBreakString(breakMinutes); + segments.Add($"{startStr}-{endStr}/{breakStr}"); + } + else + { + segments.Add($"{startStr}-{endStr}"); + } + } + + return string.Join(";", segments); + } + + /// + /// Recalculates PlanHours on a PlanRegistration from its shift fields. + /// + public static void RecalculatePlanHours(PlanRegistration planRegistration) + { + var calculatedPlanHoursInMinutes = 0; + + for (int i = 1; i <= 5; i++) + { + GetShift(planRegistration, i, out var start, out var end, out var breakMinutes); + if (start != 0 && end != 0) + { + calculatedPlanHoursInMinutes += end - start - breakMinutes; + } + } + + if (calculatedPlanHoursInMinutes > 0) + { + planRegistration.PlanHours = calculatedPlanHoursInMinutes / 60.0; + } + } + + /// + /// Parses a single shift segment like "8:00-16:00/0.5" or "8.00-16.00". + /// + public static void ParseShiftSegment(string segment, out int startMinutes, out int endMinutes, out int breakMinutes) + { + startMinutes = 0; + endMinutes = 0; + breakMinutes = 0; + + if (string.IsNullOrEmpty(segment)) + { + return; + } + + var regexWithBreak = new Regex(@"(.*)-(.*)\/(.*)"); + var match = regexWithBreak.Match(segment); + + if (match.Captures.Count == 0) + { + // Try without break + var regexNoBreak = new Regex(@"(.*)-(.*)"); + match = regexNoBreak.Match(segment); + + if (match.Captures.Count == 1) + { + startMinutes = ParseTimeToMinutes(match.Groups[1].Value); + endMinutes = ParseTimeToMinutes(match.Groups[2].Value); + + if (match.Groups.Count == 4) + { + var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); + breakMinutes = BreakTimeCalculator(breakPart); + } + } + + return; + } + + if (match.Captures.Count == 1) + { + startMinutes = ParseTimeToMinutes(match.Groups[1].Value); + endMinutes = ParseTimeToMinutes(match.Groups[2].Value); + + if (match.Groups.Count == 4) + { + var breakPart = match.Groups[3].Value.Replace(",", ".").Trim(); + breakMinutes = BreakTimeCalculator(breakPart); + } + } + } + + /// + /// Parses a time string like "8:00", "8.30", "16:00" into total minutes since midnight. + /// + public static int ParseTimeToMinutes(string timePart) + { + var parts = timePart.Split(['.', ':', '½'], StringSplitOptions.RemoveEmptyEntries); + var hours = int.Parse(parts[0]); + var minutes = parts.Length > 1 ? int.Parse(parts[1]) : 0; + return hours * 60 + minutes; + } + + /// + /// Converts total minutes since midnight to "H:MM" format. + /// + public static string MinutesToTimeString(int totalMinutes) + { + var hours = totalMinutes / 60; + var minutes = totalMinutes % 60; + return $"{hours}:{minutes:D2}"; + } + + /// + /// Converts break minutes to a decimal string representation used in PlanText. + /// This is the reverse of BreakTimeCalculator. + /// + public static string MinutesToBreakString(int breakMinutes) + { + return breakMinutes switch + { + 5 => "0.1", + 10 => "0.15", + 15 => "0.25", + 20 => "0.3", + 25 => "0.4", + 30 => "0.5", + 35 => "0.6", + 40 => "0.7", + 45 => "0.75", + 50 => "0.8", + 55 => "0.9", + 60 => "1", + _ => "0" + }; + } + + /// + /// Converts a decimal break string to minutes. Mirrors GoogleSheetHelper.BreakTimeCalculator. + /// + public static int BreakTimeCalculator(string breakPart) + { + return breakPart switch + { + "0.1" => 5, + ".1" => 5, + "0.15" => 10, + ".15" => 10, + "0.25" => 15, + ".25" => 15, + "0.3" => 20, + ".3" => 20, + "0.4" => 25, + ".4" => 25, + "0.5" => 30, + ".5" => 30, + "0.6" => 35, + ".6" => 35, + "0.7" => 40, + ".7" => 40, + "0.75" => 45, + ".75" => 45, + "0.8" => 50, + ".8" => 50, + "0.9" => 55, + ".9" => 55, + "¾" => 45, + "½" => 30, + "1" => 60, + _ => 0 + }; + } + + private static void SetShift(PlanRegistration reg, int shiftNumber, int start, int end, int breakMinutes) + { + switch (shiftNumber) + { + case 1: + reg.PlannedStartOfShift1 = start; + reg.PlannedEndOfShift1 = end; + reg.PlannedBreakOfShift1 = breakMinutes; + break; + case 2: + reg.PlannedStartOfShift2 = start; + reg.PlannedEndOfShift2 = end; + reg.PlannedBreakOfShift2 = breakMinutes; + break; + case 3: + reg.PlannedStartOfShift3 = start; + reg.PlannedEndOfShift3 = end; + reg.PlannedBreakOfShift3 = breakMinutes; + break; + case 4: + reg.PlannedStartOfShift4 = start; + reg.PlannedEndOfShift4 = end; + reg.PlannedBreakOfShift4 = breakMinutes; + break; + case 5: + reg.PlannedStartOfShift5 = start; + reg.PlannedEndOfShift5 = end; + reg.PlannedBreakOfShift5 = breakMinutes; + break; + } + } + + private static void GetShift(PlanRegistration reg, int shiftNumber, out int start, out int end, out int breakMinutes) + { + switch (shiftNumber) + { + case 1: + start = reg.PlannedStartOfShift1; + end = reg.PlannedEndOfShift1; + breakMinutes = reg.PlannedBreakOfShift1; + break; + case 2: + start = reg.PlannedStartOfShift2; + end = reg.PlannedEndOfShift2; + breakMinutes = reg.PlannedBreakOfShift2; + break; + case 3: + start = reg.PlannedStartOfShift3; + end = reg.PlannedEndOfShift3; + breakMinutes = reg.PlannedBreakOfShift3; + break; + case 4: + start = reg.PlannedStartOfShift4; + end = reg.PlannedEndOfShift4; + breakMinutes = reg.PlannedBreakOfShift4; + break; + case 5: + start = reg.PlannedStartOfShift5; + end = reg.PlannedEndOfShift5; + breakMinutes = reg.PlannedBreakOfShift5; + break; + default: + start = 0; + end = 0; + breakMinutes = 0; + break; + } + } +} diff --git a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Services/TimePlanningPlanningService/TimePlanningPlanningService.cs b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Services/TimePlanningPlanningService/TimePlanningPlanningService.cs index 8d9482fa..918a6ff0 100644 --- a/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Services/TimePlanningPlanningService/TimePlanningPlanningService.cs +++ b/eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/Services/TimePlanningPlanningService/TimePlanningPlanningService.cs @@ -649,6 +649,7 @@ public async Task Update(int id, TimePlanningPlanningPrDayModel planning.PlannedStartOfShift5 = model.PlannedStartOfShift5; planning.PlannedBreakOfShift5 = model.PlannedBreakOfShift5; planning.PlannedEndOfShift5 = model.PlannedEndOfShift5; + planning.PlanText = PlanTextHelper.GeneratePlanText(planning); planning.CommentOffice = model.CommentOffice; planning.NettoHoursOverride = model.NettoHoursOverride; planning.NettoHoursOverrideActive = model.NettoHoursOverrideActive; @@ -1287,6 +1288,7 @@ public async Task UpdateByCurrentUserNam( planning.PlannedStartOfShift5 = model.PlannedStartOfShift5; planning.PlannedBreakOfShift5 = model.PlannedBreakOfShift5; planning.PlannedEndOfShift5 = model.PlannedEndOfShift5; + planning.PlanText = PlanTextHelper.GeneratePlanText(planning); if (!assignedSite.UseDetailedPauseEditing) {