Merge branch 'master' of ssh://float.ownsoft.de/git/beyondSoft/BeWo

This commit is contained in:
2023-07-25 09:25:32 +02:00
32 changed files with 10670 additions and 8452 deletions

View File

@@ -582,6 +582,12 @@ namespace BeWo.Scheduler.View
BeWoApp.AppSettings.SchedulerViewType = schedulerViewType;
var settings = ViewModel.GetActiveSettings();
if(settings is null)
{
return;
}
BeWoApp.AppSettings.SchedulerTimelineViewDayCount = settings.TimelineIntervalCount;
BeWoApp.SaveAppSettings();

View File

@@ -792,6 +792,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLWV", "ReportImp\TestLW
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Alloheim", "ReportImp\Alloheim\Alloheim.csproj", "{D2821E8E-76BE-4865-B5B3-381457BB5D71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZuhauseWohnenIrisThimm", "ReportImp\ZuhauseWohnenIrisThimm\ZuhauseWohnenIrisThimm.csproj", "{22E7F5F8-BB34-4243-896B-221F78837F83}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|.NET = Debug|.NET
@@ -9679,6 +9681,30 @@ Global
{D2821E8E-76BE-4865-B5B3-381457BB5D71}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D2821E8E-76BE-4865-B5B3-381457BB5D71}.Release|x86.ActiveCfg = Release|Any CPU
{D2821E8E-76BE-4865-B5B3-381457BB5D71}.Release|x86.Build.0 = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|.NET.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|.NET.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|x86.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Debug|x86.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|.NET.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|.NET.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|Any CPU.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|Any CPU.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|Mixed Platforms.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|Mixed Platforms.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|x86.ActiveCfg = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.DebugRemote|x86.Build.0 = Debug|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|.NET.ActiveCfg = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|.NET.Build.0 = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|Any CPU.Build.0 = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|x86.ActiveCfg = Release|Any CPU
{22E7F5F8-BB34-4243-896B-221F78837F83}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -10073,6 +10099,7 @@ Global
{8404C9FB-662A-4676-8454-64ED3CED2014} = {D8A691C5-146D-4613-86CC-438F02FE9106}
{BA124454-FE85-4909-8271-62544E13CAA8} = {D8A691C5-146D-4613-86CC-438F02FE9106}
{D2821E8E-76BE-4865-B5B3-381457BB5D71} = {D8A691C5-146D-4613-86CC-438F02FE9106}
{22E7F5F8-BB34-4243-896B-221F78837F83} = {D8A691C5-146D-4613-86CC-438F02FE9106}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FBE985BB-9F0F-4DBB-8F94-ABC37A803FF9}

View File

@@ -125,6 +125,7 @@ textarea {
--danger: #dc3545;
--light: #f8f9fa;
--dark: #343a40;
--service-record-marked: #c5e3ff;
--bewo-teams: #565999;
--bewo-goal-rating: #0000ff;
--bewo-dev: #00cf7c;
@@ -1992,6 +1993,26 @@ pre code {
background-color: #b9bbbe;
}
.table-service-record-marked,
.table-service-record-marked > th,
.table-service-record-marked > td {
background-color: #eff7ff;
}
.table-service-record-marked th,
.table-service-record-marked td,
.table-service-record-marked thead th,
.table-service-record-marked tbody + tbody {
border-color: #e1f0ff;
}
.table-hover .table-service-record-marked:hover {
background-color: #d6eaff;
}
.table-hover .table-service-record-marked:hover > td,
.table-hover .table-service-record-marked:hover > th {
background-color: #d6eaff;
}
.table-bewo-teams,
.table-bewo-teams > th,
.table-bewo-teams > td {
@@ -3060,6 +3081,36 @@ fieldset:disabled a.btn {
box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
}
.btn-service-record-marked {
color: #212529;
background-color: #c5e3ff;
border-color: #c5e3ff;
}
.btn-service-record-marked:hover {
color: #212529;
background-color: #9fd1ff;
border-color: #92caff;
}
.btn-service-record-marked:focus, .btn-service-record-marked.focus {
color: #212529;
background-color: #9fd1ff;
border-color: #92caff;
box-shadow: 0 0 0 0.2rem rgba(172, 199, 223, 0.5);
}
.btn-service-record-marked.disabled, .btn-service-record-marked:disabled {
color: #212529;
background-color: #c5e3ff;
border-color: #c5e3ff;
}
.btn-service-record-marked:not(:disabled):not(.disabled):active, .btn-service-record-marked:not(:disabled):not(.disabled).active, .show > .btn-service-record-marked.dropdown-toggle {
color: #212529;
background-color: #92caff;
border-color: #85c4ff;
}
.btn-service-record-marked:not(:disabled):not(.disabled):active:focus, .btn-service-record-marked:not(:disabled):not(.disabled).active:focus, .show > .btn-service-record-marked.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2rem rgba(172, 199, 223, 0.5);
}
.btn-bewo-teams {
color: #fff;
background-color: #565999;
@@ -3680,6 +3731,31 @@ fieldset:disabled a.btn {
box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
}
.btn-outline-service-record-marked {
color: #c5e3ff;
border-color: #c5e3ff;
}
.btn-outline-service-record-marked:hover {
color: #212529;
background-color: #c5e3ff;
border-color: #c5e3ff;
}
.btn-outline-service-record-marked:focus, .btn-outline-service-record-marked.focus {
box-shadow: 0 0 0 0.2rem rgba(197, 227, 255, 0.5);
}
.btn-outline-service-record-marked.disabled, .btn-outline-service-record-marked:disabled {
color: #c5e3ff;
background-color: transparent;
}
.btn-outline-service-record-marked:not(:disabled):not(.disabled):active, .btn-outline-service-record-marked:not(:disabled):not(.disabled).active, .show > .btn-outline-service-record-marked.dropdown-toggle {
color: #212529;
background-color: #c5e3ff;
border-color: #c5e3ff;
}
.btn-outline-service-record-marked:not(:disabled):not(.disabled):active:focus, .btn-outline-service-record-marked:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-service-record-marked.dropdown-toggle:focus {
box-shadow: 0 0 0 0.2rem rgba(197, 227, 255, 0.5);
}
.btn-outline-bewo-teams {
color: #565999;
border-color: #565999;
@@ -5905,6 +5981,19 @@ a.badge-dark:focus, a.badge-dark.focus {
box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
}
.badge-service-record-marked {
color: #212529;
background-color: #c5e3ff;
}
a.badge-service-record-marked:hover, a.badge-service-record-marked:focus {
color: #212529;
background-color: #92caff;
}
a.badge-service-record-marked:focus, a.badge-service-record-marked.focus {
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(197, 227, 255, 0.5);
}
.badge-bewo-teams {
color: #fff;
background-color: #565999;
@@ -6228,6 +6317,18 @@ a.badge-bewo-report:focus, a.badge-bewo-report.focus {
color: #040505;
}
.alert-service-record-marked {
color: #667685;
background-color: #f3f9ff;
border-color: #eff7ff;
}
.alert-service-record-marked hr {
border-top-color: #d6eaff;
}
.alert-service-record-marked .alert-link {
color: #505c68;
}
.alert-bewo-teams {
color: #2d2e50;
background-color: #dddeeb;
@@ -6753,6 +6854,20 @@ a.badge-bewo-report:focus, a.badge-bewo-report.focus {
border-color: #1b1e21;
}
.list-group-item-service-record-marked {
color: #667685;
background-color: #eff7ff;
}
.list-group-item-service-record-marked.list-group-item-action:hover, .list-group-item-service-record-marked.list-group-item-action:focus {
color: #667685;
background-color: #d6eaff;
}
.list-group-item-service-record-marked.list-group-item-action.active {
color: #fff;
background-color: #667685;
border-color: #667685;
}
.list-group-item-bewo-teams {
color: #2d2e50;
background-color: #d0d1e2;
@@ -7781,6 +7896,16 @@ button.bg-dark:focus {
background-color: #1d2124 !important;
}
.bg-service-record-marked {
background-color: #c5e3ff !important;
}
a.bg-service-record-marked:hover, a.bg-service-record-marked:focus,
button.bg-service-record-marked:hover,
button.bg-service-record-marked:focus {
background-color: #92caff !important;
}
.bg-bewo-teams {
background-color: #565999 !important;
}
@@ -8001,6 +8126,10 @@ button.bg-bewo-report:focus {
border-color: #343a40 !important;
}
.border-service-record-marked {
border-color: #c5e3ff !important;
}
.border-bewo-teams {
border-color: #565999 !important;
}
@@ -11640,6 +11769,14 @@ a.text-dark:hover, a.text-dark:focus {
color: #121416 !important;
}
.text-service-record-marked {
color: #c5e3ff !important;
}
a.text-service-record-marked:hover, a.text-service-record-marked:focus {
color: #79beff !important;
}
.text-bewo-teams {
color: #565999 !important;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
$theme-colors: ("bewo-teams": #565999, "bewo-goal-rating": #0000ff,"bewo-dev": #00cf7c, "primary": #FF5A00, "bewo-customers": #3b7799, "bewo-service-records": #c80000, "bewo-calendar": #04b4d0, "bewo-is-about-to-expire": #FF0000, "bewo-expires-in-three-months": #FF9400, "bewo-group-booking": #f9e79f, "bewo-customer-card-header": #AB4A07, "bewo-employee": #45993B, "bewo-resource": #04B4D0, "bewo-task-red": #993B3B, "bewo-report": #995E3B);
$theme-colors: ("service-record-marked": #c5e3ff, "bewo-teams": #565999, "bewo-goal-rating": #0000ff,"bewo-dev": #00cf7c, "primary": #FF5A00, "bewo-customers": #3b7799, "bewo-service-records": #c80000, "bewo-calendar": #04b4d0, "bewo-is-about-to-expire": #FF0000, "bewo-expires-in-three-months": #FF9400, "bewo-group-booking": #f9e79f, "bewo-customer-card-header": #AB4A07, "bewo-employee": #45993B, "bewo-resource": #04B4D0, "bewo-task-red": #993B3B, "bewo-report": #995E3B);
textarea {
min-height: 150px !important;

View File

@@ -83,8 +83,6 @@ namespace BeWoPlanerMobil.Controllers
{
Log.Error("Fehler beim Speichern der BrowserInfo: " + exception);
}
// ToDo: Hier durch die Mandatorsettings den Timeout setzen!
AbstractModel.TimeOfLastAction = $"{DateTime.Now:yyyy-MM-dd}T{DateTime.Now:HH:mm:ss}";

View File

@@ -2454,7 +2454,7 @@ namespace BeWoPlanerMobil.Controllers
var allowDeleteAll = MobileSessionFacade.CheckForUserRight(UserRightType.CreateAll);
var validationResultList = OperationsService.ValidateServiceRecordDeletion(serviceRecord, Model.Employee.EmployeeOid.Value);
if(validationResultList.Count > 0)
{
foreach(var result in validationResultList)
@@ -2463,11 +2463,17 @@ namespace BeWoPlanerMobil.Controllers
{
case Custom:
newResult.KannTrotzdemGespeichertWerden = true;
newResult.Message += "Dieser Eintrag wurde bereits unterschrieben.<br/>Möchten Sie ihn trotzdem löschen?<br/><br/>";
newResult.Message += RemoveConfirmationFromValidationResultMessage(result.Message) + "<br /><br />";
break;
}
}
if(newResult.Message?.Length > 0)
{
newResult.Message += "Möchten Sie ihn trotzdem löschen?<br/><br/>";
}
return SerializeObject(newResult);
}
@@ -2476,6 +2482,28 @@ namespace BeWoPlanerMobil.Controllers
: SerializeObject(new ValidationResult {KannTrotzdemGespeichertWerden = true, Message = null});
}
private static string RemoveConfirmationFromValidationResultMessage(string resultMessage)
{
if(resultMessage is null)
{
return string.Empty;
}
var confirmation = "Möchten Sie ihn trotzdem löschen?";
if(resultMessage.Contains(confirmation))
{
var length = resultMessage.Length - confirmation.Length;
if(length > 0)
{
resultMessage = resultMessage.Substring(0, length);
}
}
return resultMessage;
}
[Authorize]
public string SetServiceRecordEmployee(long employeeOid)
{

View File

@@ -174,12 +174,14 @@ namespace BeWoPlanerMobil.Controllers
if(AbstractModel.HasRightToViewCustomerSelectionInScheduler)
{
Model.AllCustomers = EmployeeService.GetActiveCompactCustomersForEmployee(Model.Employee.EmployeeOid).OrderBy(o => o.DetailDescription).ToList();
//Model.AllCustomers = EmployeeService.GetActiveCompactCustomersForEmployee(Model.Employee.EmployeeOid).OrderBy(o => o.DetailDescription).ToList();
Model.AllCustomers = CustomerService.GetAllActiveCompactCustomers();
}
if(AbstractModel.HasRightToViewEmployeeAppointments)
{
Model.AllEmployees = EmployeeService.GetActiveCompactEmployeesForEmployee(Model.Employee.EmployeeOid.Value).OrderBy(o => o.DetailDescription).ToList();
//Model.AllEmployees = EmployeeService.GetActiveCompactEmployeesForEmployee(Model.Employee.EmployeeOid.Value).OrderBy(o => o.DetailDescription).ToList();
Model.AllEmployees = EmployeeService.GetAllActiveEmployeesCompact();
}
}
@@ -594,34 +596,73 @@ namespace BeWoPlanerMobil.Controllers
return JsonConvert.SerializeObject(Model.SelectedCustomers.OrderBy(o => o.LastNameFirstName));
}
// ToDo: AUSFÜHRLICH TESTEN!
[Authorize]
public string CheckResourcesAvailability(string start, string end, string resourceOids)
public string CheckResourcesAvailability(string start, string end, string resourceOids, bool allDay)
{
if(!AbstractModel.HasRightToInsertRessourceAppointments)
{
return "Fehler!Sie haben nicht das Recht, Termine mit Ressourcen anzulegen!";
}
if(string.IsNullOrWhiteSpace(start) || string.IsNullOrWhiteSpace(end) || string.IsNullOrWhiteSpace(resourceOids) || Model is null)
{
return LeerzeichenFuerGetMethoden;
}
if(!string.IsNullOrWhiteSpace(start) && !string.IsNullOrWhiteSpace(end) && !string.IsNullOrWhiteSpace(resourceOids) && Model != null)
var oidList = ConvertOidStringToList(resourceOids);
foreach(var oid in oidList)
{
var oidList = ConvertOidStringToList(resourceOids);
foreach(var oid in oidList)
if(!Model.ResourceCategories2Resources.Any(a => a.Value.All(b => b.ResourceOid != oid)))
{
if(!Model.ResourceCategories2Resources.Any(a => a.Value.All(b => b.ResourceOid != oid)))
{
return JsonConvert.SerializeObject(new List<ResourceDC>());
}
return JsonConvert.SerializeObject(new List<ResourceDC>());
}
var dateTimes = ConvertStringDatesToDateTimes(start, end);
var unavailableResources = KalenderService.CheckResourceAvailability(dateTimes.StartDate, dateTimes.EndDate, oidList, Model.SelectedAppointment?.SchedulerAppointmentOid);
return JsonConvert.SerializeObject(unavailableResources);
}
return LeerzeichenFuerGetMethoden;
var dateTimes = ConvertStringDatesToDateTimes(start, end);
var unavailableResources = KalenderService.CheckResourceAvailability(dateTimes.StartDate, dateTimes.EndDate, oidList, Model.SelectedAppointment?.SchedulerAppointmentOid);
return JsonConvert.SerializeObject(unavailableResources);
// ToDo: Wieder einchecken
//var oidList = ConvertOidStringToList(resourceOids);
//foreach(var oid in oidList)
//{
// if(!Model.ResourceCategories2Resources.Any(a => a.Value.All(b => b.ResourceOid != oid)))
// {
// return LeerzeichenFuerGetMethoden;
// }
//}
//var dateTimes = ConvertStringDatesToDateTimes(start, end);
//if(allDay)
//{
// dateTimes.EndDate = dateTimes.EndDate.AddDays(1);
//}
//var info = KalenderService.CheckResourceAvailabilityWithEmployeeInformation(dateTimes.StartDate, dateTimes.EndDate, oidList, Model.SelectedAppointment?.SchedulerAppointmentOid);
//var result = string.Empty;
//foreach(var kvp in info)
//{
// result += $"Die Ressource \"{kvp.Key}\" ist im ausgewählten Zeitraum {start} bis {end} bereits gebucht";
// if(!kvp.Value.All(string.IsNullOrWhiteSpace))
// {
// result += ":<br /><br />";
// }
// foreach(var interval in kvp.Value)
// {
// result += $"{interval}<br />";
// }
//}
//return result;
}
[Authorize]

View File

@@ -101,7 +101,6 @@ function validateAppointmentForm() {
if(endDate.isBefore(startDate)) {
hideSpinner();
//$("#messagePopup .modal-body").html('<div class="alert alert-danger" role="alert">Das Startdatum muss vor dem Enddatum liegen.</div>');
showMessagePopupWithHtml("Fehler", '<div class="alert alert-danger" role="alert">Das Startdatum muss vor dem Enddatum liegen.</div>');
return;
}
@@ -111,20 +110,35 @@ function validateAppointmentForm() {
$("#resources-popup input:checked").each(function() {
var id = $(this).attr("id");
selectedOids.push(id.split("-")[0]);
logInfo(id);
selectedOids.push(id.split("-")[1]);
});
for(var i = 0; i < selectedOids.length; i++) {
oidString += selectedOids[i] + ",";
}
$.get(getCheckResourcesAvailabilityUrl(), { start: startDate.format("DD.MM.YYYY HH:mm"), end: endDate.format("DD.MM.YYYY HH:mm"), resourceOids: oidString }).done(function(result) {
if(result === undefined || result === null || result.length === 0) {
return;
}
$.get(getCheckResourcesAvailabilityUrl(), { start: startDate.format("DD.MM.YYYY HH:mm"), end: endDate.format("DD.MM.YYYY HH:mm"), resourceOids: oidString, allDay: isAllDay }).done(function(result) {
if (result.length > 1) {
try {
// ToDo: Wieder einchecken! (24.07.2023)
//hideSpinner();
//if (result.includes("Fehler!")) {
// showErrorMessagePopup(result.substring(7));
// return;
//} else {
// showMessagePopupWithHtml("Überschneidung",
// result,
// function() {
// $("#messagePopup .modal-body").html();
// showSpinner();
// insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
// },
// false);
//}
var unavailableResources = $.parseJSON(result);
var resourceCount = 0;
var names = "";
@@ -140,14 +154,14 @@ function validateAppointmentForm() {
});
var unavailableResourcesMessage;
if(resourceCount > 0) {
if(resourceCount > 1) {
unavailableResourcesMessage = "Einige der ausgewählten Ressourcen (" + names + ") sind zum gewählten Zeitpunkt nicht verfügbar.";
} else {
unavailableResourcesMessage = "Eine der ausgewählten Ressourcen (" + names + ") ist zum gewählten Zeitpunkt nicht verfügbar.";
}
hideSpinner();
showWarningMessageBox("Überschneidung", unavailableResourcesMessage, function() {
@@ -158,13 +172,13 @@ function validateAppointmentForm() {
return;
}
} catch(error) {
} catch (error) {
showErrorPopup(error);
return;
}
} else {
insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
}
insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
});
}

View File

@@ -32,15 +32,12 @@
var form = $('#change-password-form');
var isValid = true;
// ToDo: Hier weitermachen
//$.each($(".pw-chng-inv-fdb"),
$.each($(".pw-ch-in-container"),
function (index, item) {
var input = $(item).find("input");
var feedback = $(item).find(".pw-chng-inv-fdb");
logInfo3(input.val());
if (isEmptyOrSpaces(input.val())) {
feedback.addClass("d-block");
isValid = false;
@@ -248,6 +245,8 @@
"#distance, textarea, #reset-button, #create-button, #textbausteine-button, #hours-minutes-dropdown-btn").prop("disabled", (hasSelectedSupportConcepts ? false : true));
}
$("#fehlerdetail-textarea").prop("disabled", false);
if ("@Model.IsInMultiBookingMode".toLowerCase() === "true") {
var isMultiBookingFormEnabeld = "@Model.MultiBookingSelectedConceptCostBearerRelations.Any()".toLowerCase() === "true";

View File

@@ -757,7 +757,7 @@
}
}
var cardBackground = serviceRecord.GroupOid.HasValue ? "bg-bewo-group-booking" : string.Empty;
var cardBackground = serviceRecord.ServiceRecordType == ServiceRecordTypeId.Content ? "bg-service-record-marked" : serviceRecord.GroupOid.HasValue ? "bg-bewo-group-booking" : string.Empty;
<div class="row mb-3">
<div class="card w-100 @cardBackground">

View File

@@ -106,6 +106,11 @@
configureErrorPopup(textToShow);
}
function showErrorMessagePopup(text) {
hideSpinner();
configureErrorPopup(text);
}
function configureErrorPopup(textToShow) {
$("#fehlerdetail-textarea").text(textToShow);
$("#error-message-popup").modal("show");

View File

@@ -5183,7 +5183,8 @@ namespace BeWo.Data.Access
return signature.Count == 1;
}
// ToDo: Nach Meeting mit Jörg am 10.07.2023 weitermachen
// ToDo: FALSCHE METHODE! SUCHT NUR NACH SERIENTERMINEN, DIE SO NICHT IN DER DATENBANK SIND!
// ToDo: SQL BEARBEITEN, DAMIT DIE SCHEDULERAPPOINTMENT-OBJEKTE ZURÜCKGEGEBEN WERDEN UND NICHT DIE GEBUCHTEN RESSOURCEN!
/// <summary>
/// Prüft anhand der Oids von Ressourcen deren Verfügbarkeit in einem Zeitraum.
/// Gibt die nicht verfügbaren Ressourcen und Mitarbeiter, die sie gebucht aben zurück für eine detaillierte Fehlermeldung.
@@ -5195,23 +5196,39 @@ namespace BeWo.Data.Access
/// <param name="recurrenceId">Recurrence Id, falls es sich um einen Serientermin handelt, der keine eigene Oid hat.</param>
/// <param name="occurrenceIndex">Occurrence-Index des Serientermins ohne eigene Oid</param>
/// <returns>Die im angegebenen Zeitraum belegten Ressourcen mit den Mitarbeitern, die sie gebucht haben</returns>
public Dictionary<Resource, List<Employee>> FindBookedResourcesWithBookingEmployees(List<long> resourceOids, DateTime start, DateTime end, long? selectedAppointmentOid, Guid? recurrenceId = null, int? occurrenceIndex = null)
public List<SchedulerAppointment> FindAppointmentsByResourcesInInterval(List<long> resourceOids, DateTime start, DateTime end, long? selectedAppointmentOid, Guid? recurrenceId = null, int? occurrenceIndex = null)
{
var result = new Dictionary<Resource, List<Employee>>();
//var c = CreateCriteria<Resource>("r").Add(Restrictions.Eq(nameof(BeWoEntityBase.IsActive), ActivationTypeId.Active)).Add(Restrictions.In(nameof(BeWoEntityBase.Oid), resourceOids));
var c = CreateCriteria<Resource>("r").Add(Restrictions.Eq(nameof(BeWoEntityBase.IsActive), ActivationTypeId.Active)).Add(Restrictions.In(nameof(BeWoEntityBase.Oid), resourceOids));
//var excludingSelectedAppointment = selectedAppointmentOid.HasValue ? $"Oid <> {selectedAppointmentOid} AND " : "";
var excludingSelectedAppointment = selectedAppointmentOid.HasValue ? $"Oid <> {selectedAppointmentOid} AND " : "";
//var sql = "Oid IN " +
// "(SELECT ResourceOid FROM resource2newschapp r2n WHERE r2n.NewSchAppOid IN " +
// $"(SELECT Oid FROM newschedulerappointment WHERE IsActive = 1 AND Type <> 4 AND {excludingSelectedAppointment}('{start:yyyy-MM-dd HH:mm:ss}' > StartDate OR '{end:yyyy-MM-dd HH:mm:ss}' > StartDate) AND ('{start:yyyy-MM-dd HH:mm:ss}' < EndDate OR '{end:yyyy-MM-dd HH:mm:ss}' < EndDate)))";
var sql = "Oid IN " +
"(SELECT ResourceOid FROM resource2newschapp r2n WHERE r2n.NewSchAppOid IN " +
$"(SELECT Oid FROM newschedulerappointment WHERE IsActive = 1 AND Type <> 4 AND {excludingSelectedAppointment}('{start:yyyy-MM-dd HH:mm:ss}' > StartDate OR '{end:yyyy-MM-dd HH:mm:ss}' > StartDate) AND ('{start:yyyy-MM-dd HH:mm:ss}' < EndDate OR '{end:yyyy-MM-dd HH:mm:ss}' < EndDate)))";
//var criterion = Expression.Sql(sql);
//c.Add(criterion);
//var resources = c.List<Resource>().ToList();
var c2 = CreateCriteriaIsActive<SchedulerAppointment>()
.Add(Restrictions.Not(Restrictions.Eq(nameof(SchedulerAppointment.Type), 4)))
.Add(Expression.Sql($"'{start:yyyy-MM-dd HH:mm:ss}' BETWEEN StartDate AND EndDate OR '{end:yyyy-MM-dd HH:mm:ss}' BETWEEN StartDate AND EndDate OR StartDate BETWEEN '{start:yyyy-MM-dd HH:mm:ss}' AND '{end:yyyy-MM-dd HH:mm:ss}' OR EndDate BETWEEN '{start:yyyy-MM-dd HH:mm:ss}' AND '{end:yyyy-MM-dd HH:mm:ss}'"));
if(!(selectedAppointmentOid is null))
{
c2.Add(Restrictions.Not(Restrictions.Eq(nameof(BeWoEntityBase.Oid), selectedAppointmentOid)));
}
c2.CreateAlias(nameof(SchedulerAppointment.ResourceList), "resources", JoinType.InnerJoin)
.Add(Restrictions.In($"resources.{nameof(BeWoEntityBase.Oid)}", resourceOids));
var appointments = c2.List<SchedulerAppointment>().ToList();
var criterion = Expression.Sql(sql);
c.Add(criterion);
var resources = c.List<Resource>().ToList();
var recurringAppointmentsCriteria = CreateRecurrenceCriteria(start, end).Add(Restrictions.Eq(nameof(SchedulerAppointment.Type), 1));
@@ -5219,9 +5236,10 @@ namespace BeWo.Data.Access
recurringAppointments = recurringAppointments.Where(s => s.ResourceList.Any(r => r.Oid.HasValue && resourceOids.Contains(r.Oid.Value))).ToList();
// ToDo: Wieso wird das gemacht?
if(recurringAppointments.Count == 0)
{
return result;
//return new List<SchedulerAppointment>();
}
var changedOccurrencesCriteria = CreateCriteriaIsActive<SchedulerAppointment>().Add(Restrictions.Eq(nameof(SchedulerAppointment.Type), 3));
@@ -5232,7 +5250,7 @@ namespace BeWo.Data.Access
changedOccurrencesCriteria.Add(inBetween);
deletedOccurrencesCriteria.Add(inBetween);
var appointments = new List<SchedulerAppointment>();
//var appointments = new List<SchedulerAppointment>();
if(selectedAppointmentOid.HasValue)
{
@@ -5302,12 +5320,7 @@ namespace BeWo.Data.Access
return false;
}
if(guid.Value.Equals(patternId) && index == i)
{
return true;
}
return false;
return guid.Value.Equals(patternId) && index == i;
}) || deletedOccurrences.Any(a =>
{
var guid = a.GetRecurrenceIdAndIndex(out var i);
@@ -5317,12 +5330,7 @@ namespace BeWo.Data.Access
return false;
}
if(guid.Value.Equals(patternId) && index == i)
{
return true;
}
return false;
return guid.Value.Equals(patternId) && index == i;
});
if(isDeletedOrChanged)
@@ -5340,21 +5348,21 @@ namespace BeWo.Data.Access
var occurrenceAppointment = new SchedulerAppointment
{
AllDay = occurrence.AllDay,
CustomerList = recurringAppointment.CustomerList,
Notice = recurringAppointment.Notice,
EmployeeList = recurringAppointment.EmployeeList,
EndDate = occurrence.Start.AddMinutes(duration),
AllDay = occurrence.AllDay,
CustomerList = recurringAppointment.CustomerList,
Notice = recurringAppointment.Notice,
EmployeeList = recurringAppointment.EmployeeList,
EndDate = occurrence.Start.AddMinutes(duration),
FormerBookingSequenceOid = recurringAppointment.FormerBookingSequenceOid,
IsPrivate = recurringAppointment.IsPrivate,
Location = recurringAppointment.Location,
Originator = recurringAppointment.Originator,
RecurrenceInfo = occurrence.RecurrenceInfo.ToXml(),
ReminderInfo = recurringAppointment.ReminderInfo,
ResourceList = recurringAppointment.ResourceList,
StartDate = occurrence.Start,
Subject = recurringAppointment.Subject ?? Empty,
Type = recurringAppointment.Type
IsPrivate = recurringAppointment.IsPrivate,
Location = recurringAppointment.Location,
Originator = recurringAppointment.Originator,
RecurrenceInfo = occurrence.RecurrenceInfo.ToXml(),
ReminderInfo = recurringAppointment.ReminderInfo,
ResourceList = recurringAppointment.ResourceList,
StartDate = occurrence.Start,
Subject = recurringAppointment.Subject ?? Empty,
Type = recurringAppointment.Type
};
if(!(recurrenceId is null) && occurrenceIndex.HasValue)
@@ -5371,16 +5379,19 @@ namespace BeWo.Data.Access
}
}
// ToDo: Hier noch die Mitarbeiter zurückgeben
appointments.DoForEach(a => a.ResourceList.DoForEach(resources.AddIfNotIn));
return appointments.ToList();
}
appointments.DoForEach(appointment =>
{
appointment.ResourceList.DoForEach(resource =>
{
public List<ConfirmationReceiptSignature> LoadAllConfirmationReceiptSignaturesByServiceRecordOids(IList<long> serviceRecordOids)
{
var c = CreateCriteria<ConfirmationReceiptSignature>()
.CreateAlias(nameof(ConfirmationReceiptSignature.ServiceRecords), "sr", JoinType.InnerJoin)
.Add(Restrictions.In($"sr.{nameof(BeWoEntityBase.Oid)}", serviceRecordOids.ToArray()));
});
});
// Der ResultTransformer erzeugt ein SELECT DISTINCT für den Roottypen (ConfirmationReceiptSignature)
c.SetResultTransformer(new DistinctRootEntityResultTransformer());
var result = c.List<ConfirmationReceiptSignature>().ToList();
return result;
}

View File

@@ -3,7 +3,6 @@ using System.Collections.Generic;
using BeWo.Data.Access;
using BeWo.Service.Plugins;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
namespace BetreuWoReports.Service
{
@@ -22,9 +21,9 @@ namespace BetreuWoReports.Service
return new List<ResourceDC>();
}
public override Dictionary<ResourceDC, List<CompactEmployeeDC>> CheckResourceAvailabilityWithBookingEmployees(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid)
public override List<SchedulerAppointmentDC> CheckResourceAvailabilityWithBookingEmployees(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid)
{
return new Dictionary<ResourceDC, List<CompactEmployeeDC>>();
return new List<SchedulerAppointmentDC>();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -26,25 +26,31 @@ namespace BhsSolingen
bool isFreizeit = false;
String cat = "";
double minutes = 0;
double flMinutes = 0;
double fkMinutes = 0;
if (pRO.Services != null)
{
List<ServicesOverviewRO.ServiceDetail> servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
foreach (var sd in pRO.Services)
{
if (sd.IsBillable)
if (sd.IsBillable || sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
{
ServicesOverviewRO.CreateSignatureString(sd);
sd.Notice5 = "E";
if (sd.ServiceDescription.ToLower().Contains("fehlkontakt"))
if (sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
{
sd.Notice5 = "F";
fkMinutes += sd.Minutes;
}
else
{
flMinutes += sd.Minutes;
}
else if (sd.IsGroup)
if (sd.IsGroup)
{
//sd.Notice5 = String.Format("{0} Teilnehmer", sd.CustomerCount);
hatGruppen = true;
sd.Notice5 = "GR";
}
@@ -60,7 +66,6 @@ namespace BhsSolingen
cat = sd.ServiceCategory;
minutes += sd.Minutes;
servicesBillable.Add(sd);
}
}
@@ -68,8 +73,9 @@ namespace BhsSolingen
pRO.Services = servicesBillable;
}
lblGesamtminuten.Text = string.Format("{0:0.##}", minutes);
lblGesamtstunden.Text = string.Format("{0:0.00}", minutes / 60);
lblGesamtminuten.Text = string.Format("{0:0.##}", flMinutes);
lblGesamtstunden.Text = string.Format("{0:0.00}", flMinutes / 60);
lblGesamtFkMinuten.Text = string.Format("{0:0.##}", fkMinutes);
if (String.IsNullOrWhiteSpace(pRO.AbsenceTimes))
{

View File

@@ -1,279 +1,279 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>21, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="xrPictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEBIAEgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADGAToDASIAAhEBAxEB/8QA
HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAoanrVho/kfbp/KEzFUJUkceuOlUvEWuTaVoa6
nYRRXcYdd53cbD3BHvgfjWrd2dtfwGC6gjmiPVXXIrhNZ8Paj4etrltHLXOlToyz2cmW2A9x/j1HfNAH
YaJrdprunrdWre0kZ+8jehrSrwzQdVuNInF1YFvPQnzYSfllj+nqK9JbxWmraMJdGureG9yMx3XAHqM9
M1m61ON7ytYtU5PZHVUV5heeMvFmmE/a7O3C9n8olT9GBwas2fxC1SbbnT7SYn+GObY35Ek/pWi11IPR
qK4+L4g2aMF1HT7yyPqybl/of0roLDXdL1MD7JfQyMf4N2G/I80AaFFFFABRRRQAUUUUAFFFFABRRRQA
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
gMAWxj14Irs6KACiiigArz34pyJ9m06PevmbnbbnnGBzXReJ/FVt4ct1BXzbuQExxA/qfb+deY2Wn6v4
01l5SxdmOZZn+5GPT/ACgCjplnqWsyRaZab5E3l9mfkQnALH07c17D4c8NWnh2z2RfvLhwPNmI5b2HoP
ap9C0Cy0Cy8i1XLtgySt95z/AIe1alABRRRQAVznju4Nv4QvMHmTbH+bDP6Zro6xvE+ivr+ivZRyrHJv
V1ZumR60AeGRl1kUxkhwQVI65r3nw7BdW3h+yivZGe4EYLluozyAfcDj8KxfDngSy0Zkuboi6vF5DEfI
h9h3Puf0rraACvNviiJJLvTIkUsSr4AGSTkV6TTSilgxUFh0JHIoA8t8K+BdRkvra/vlNrDE6yKjfffB
yOOw+teqUUUAFFFFAEF7O9rYzzxxNK8cbOsa9WIGcV4Lqd9falfSXF9I7zE8hv4fYDsPavoGoJLG0mk8
yW1gd/7zRgn86APn6G1uLg4ggkkPoik1uad4I13USCLQwRn+Of5P06/pXtSoqLtRQo9AMU6gDidG+HGn
2RWXUZDdyj+AfLGP6n/PFdnFDHBEsUMaxxqMKqDAH4U+igAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigDy240Wfxd451FJrgRQ277D3IRTgBf8969I0/TrXS7JLSziEcKdAOpPqT3NFFAFqiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9k=
</value>
</data>
<data name="xrRichText2.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAGwAYQBuAGcAMQAwADMAMQBcAGwAYQBuAGcAZgBlADEAMAAzADEAXAB1AGwAXABmADIAXABmAHMAMgAwAFwAYwBmADEAIABLAHIAYQBuAGsAZQBuAGgAYQB1AHMAYQB1AGYAZQBuAHQAaABhAGwAdABlAH0AXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxAFwAcABhAHIAXABwAGEAcgBkAFwAcABsAGEAaQBuAFwAcQBsAHsAXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxACAAYgBlAGsAYQBuAG4AdAAgAG8AZABlAHIAIAB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQBcAHAAYQByAFwAcABhAHIAZABcAHAAbABhAGkAbgBcAHEAbAB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAGEAYgByAGUAYwBoAG4AdQBuAGcAcwByAGUAbABlAHYAYQBuAHQAfQB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMQBcAGYAcwAyADQAXABjAGYAMQBcAHAAYQByAH0A</value>
</data>
<data name="xrRichText1.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEcAcgB1AHAAcABlAG4AYQBuAGcAZQBiAG8AdABlAH0AewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAZgAxAFwAZgBzADIANABcAGMAZgAxAFwAcABhAHIAfQA=</value>
</data>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>21, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="xrPictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEBIAEgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADGAToDASIAAhEBAxEB/8QA
HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAoanrVho/kfbp/KEzFUJUkceuOlUvEWuTaVoa6
nYRRXcYdd53cbD3BHvgfjWrd2dtfwGC6gjmiPVXXIrhNZ8Paj4etrltHLXOlToyz2cmW2A9x/j1HfNAH
YaJrdprunrdWre0kZ+8jehrSrwzQdVuNInF1YFvPQnzYSfllj+nqK9JbxWmraMJdGureG9yMx3XAHqM9
M1m61ON7ytYtU5PZHVUV5heeMvFmmE/a7O3C9n8olT9GBwas2fxC1SbbnT7SYn+GObY35Ek/pWi11IPR
qK4+L4g2aMF1HT7yyPqybl/of0roLDXdL1MD7JfQyMf4N2G/I80AaFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFc54q8S/wBjQra2aedqU4/dRgZ2
j+8f8/yrQ1/WodB0qS8lG5h8saZ++x6CuEu7e40/w/Pq1+Wk1vVz5USkcxo3UAdjt49sgUAbXw5N3Ppl
7fXUskjXE/Bc5zgcn8z+ldDrWsJpFvG5UPI7YCZ7dzS6LYJo2g21qxC+TFmRu27qx/PNcLrWpNqeovNk
+WPljHoteVm+PeFo+4/elt+rO7AYb29T3tluW/EPhu31S2GvaCAtwnzywqMb/Xjsfbv/AD4eOcI5vbVc
D/lvD6e49q6zSdWn0q5EkZ3Rnh0PRhTPFXh5JE/4SHQxmFstPEg+4e5x6eo/HpXLhcRTzKDvpNKzXRr/
AC/GL/HatSnhJafD0fZ/196KlvduYhJBK2xxng9frUckFrOSZrWJiepA2n9MVhWN+tvPtPywyHlf7h9v
at/qMivBxVLEZfVtCTSe3/B6XR6dGdLFQvJJtbjUsLLbtW4vbceiOGX/AL54/nQnhOxnfdDryoSc4mgK
4/EEinUVtRz7F0/ial6r/KxnUyyhLbQ6TTtK8WWkIjstds7iEdN7F8e2SpOKtGLx0CQLjTCPXB/wrlI5
pIm3RyMreoODWnb+JNUt8AXJdR2kG7+fNenS4jpv+LBr01/yOOplMl8Er+puf8Vz/wBQj/x6mu3jpcYT
Sm/3c/1NMt/GrjAubVT6tG2P0Oa17XxPpl0VUytE57SD+o4r1KOa4SrpGaT89PzOKpgq8N4/dqZPm+O/
+eGmfn/9eni48bqnNnpjEf7R5/8AHq6J9SsIrg28l7bpMMZjaUBuenGalnuYLWLzbiaOKPIG92Cjn3Ne
gcpzJ1jxbB/rfDsUoH/PKcD+pqM+M7+3IF74av4xjlkBb+g/nXXg5GR0ooAzdG1qDW7d5oIp4wh2sJk2
nNaVFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXP+MdYbSdEZYCftdyfJgC9
cnqR9B+pFAGQFHi7xgxYbtK0s4A7Syf15H5D3p9sP+Eo8aPefe07Sjsi9Hl9fz5/BfWorwP4U8I22k2g
3arfHYNvXe33j+GQB+FdDpllb+GPDqREjEKb5WH8bnr+vA/ClKSinJ7IaTbsij4u1TyLYWMTfvJRl8dl
9PxriKsXt3JfXktzKfmc5+ntVevzzMMW8XXdTpsvQ+qwtBUKSj16hWlpGry6XcZHzwPxJGejCs2iualV
nSmpwdmjacIzi4yV0x/irwrElv8A21ow32D/ADSRL1hPf8P5fSsTSb/payn/AHCf5V1WkavJpkxBHmW0
nEsR6MP8azfFPhaO3iGs6NmTT5PmZF6wn/D+VfYUa9HNsO6U9Jr8H3Xl/wAMeBUp1MDVU46x/rRhRWbp
2pi4xDMQJex7N/8AXrSr5PE4aphqjp1FZnu0a0K0eeDCiiiuc1CiiigBJLC01Nity7QzkALcDkDHADDu
PpyPfpS3DzaZ4ZutB1SJ0kZhcWtxu3RvjHAP0z+fOKK0LS+he2bT9Si+0WMnVT96M/3lPY19Fleculaj
Xd49H2/4H5Hk43L1O9Slv27lnwx4ludItrK31VxJp1wuLe7ByIz0KN9D+X06ehqwZQykFSMgg8EV5ght
/DgbTNRX7d4fvzvimA5jboT7MOM/p6Vo2t/eeDjEWkbUPDs/MM6fMYgen/6vy9K+uTUldbHgtNOzO/oq
K2uoL22S4tpVlhcZV1OQalpgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcMsia94
3nvZmUadoqkAnoXGcn8wT/wEV03iHUxpGg3d4D86JiP/AHjwP1Nc7p3ha4l8DJYpcfZ7i8YTzuRkkHna
fwx+tADfDQk8SeIrnxFcoRbw/ubNG7e/5fqx9Kk8X6p5ky6fE3yx/NIR3bsPw/rW5O1t4a8PrHAoCQps
iU/xN6n9Sa87kkaWRpHYs7HJJ7mvnc/xvJBYeD1e/p/wT1srw/NL2stlt6jaKKK+QPeCiiigArU0fV30
6Ro5FEtpLxLE3IIrLorWjWnRmqlN2aIqU41IuMldMh8TeH4tNkF9ZkyaVcnKSLyYW9D/AJ/UVVsr1i4t
rkjzcfI/ZxXRabqKQJLZ3cYmsZxtljP8x71g63oTaSUXzPN06Y7rW6H8B/ut6e/519R7SjmlDVe8t11X
mu67rr62v4vLUwVXTZ7efk/0f6FyiqOn3hnUwzcTp1/2h61er5ivQnQqOnPdf1c9mlUjUipRCiiisTQK
KKKAJRIslpJZ3AL20vLL3Ujow9CP/rVT0zWpvDVzJYXSC90qb70TDhge4z0PqP8A9dT1Dc20V1F5co47
EdRXs5Zm08K/Z1NYfl6f5Hn4zAxrrmjpL8zoLKf/AIRsDVNIla98PTt++iBy9ufXH+ffsa720u4L61ju
baRZIZBlWXvXiVjPqOhXxFvcKiS/Kd/Mcg9GB4/OtrTfEdx4X1gxyWU1vZzHM1q3IQ/3oye3+cnrX2tO
pCrBTg7pnzs4ShJxkrM9ZoqK2uIru2iuIH3xSqHRvUHpUtWSFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQB538TNW2PY6bHhiD58inoeyg/+PV3WmSXEul2sl3Gsdw0SmRFGAGxyK4HS9Ll8V+MrjWbi
Nxp8Ev7veuN+3hVwfoCf/r13uqXZsNJu7sAFoYmcA9CQOKAOK8Uap9u1Ewxt+5gJQe7dz/n0rCrK0ed5
XuBIxLs3mEnuT1Natfn2awnHGTU3d/1Y+pwUoyoRcVYKKKK886wooooAKKKKACtLTr+JI5LG/j8+wn4k
jP8AD/tD0IrNorWhXnQqKpTdmjOpTjUi4SWjK+u+GLjRbqK805zc2T/NE46gf3TU6ksoJGCRkj0re8O3
TS3A0ucCS1uMgq38JxnI9DxVXWdHm0m52t88Lco/r7H3r1cwrTxtGOIUdFo+6fb07P5Pz4sLTjh6jpN6
vVf137mZRRRXinohRQflGTwPU1Vk1G0iyDMGPovNaU6NSq7U4t+iInUhBXk7FqioIGv77/jx0u5mX++V
wv59KGttRjkBu7nT7RQeVaZWYj6Ak16McmxbV3G39dldnLLMKCdk7/15lgbdylo0cA52uoYH8DXfabqG
m+ILYW9zbQGVB/qZEBGPVc15xLqNhESBceaR/wA80P8AUCm2mo3006tplhcyupyrIDwfwrtyylmOGn7t
NuL3Tsvz6nNjJ4StHWWvc9kiijgiSKJFSNBtVVGAB6Cn1y2iXviy6u4f7QsLa3tAMSMxw546gZ6/gK6m
vrlseCFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAOlZXiZS/hjUwOv2d/5Vq1W1C2F7pt1a
n/ltEyfmMUAeMwx/Z9Sth0E1ojde+0f4VpVkRylrnTQ2d0aPCw9CGb+hFa9fE59G2JT7r9Wj6PLHei15
/ogooorxD0QooooAKKKKACiiigDV8N/8jBaf7x/9BNd9qMVpNYyrfFFtwMsznAX3z2ryttQl0tGu4TiZ
FIQ+hIxn9an0PQdT8UWktte6tLFHaS7WgkUsQTznqO+etfYcPwUsJNSV02/yR4GaSarxa3t+rLOoa54V
sNyWlvPfyDuX2J+fX9Kw7nxbJIhS102ztwf4tpkYf99Ej9K7e1+GmjQ8zy3M59CwUfoM/rW3a+FNCs8e
VpkBI7yDef8Ax7NevDA4WHw019yOCWJrS3m/vPFW+36pKTtmuH/uopP6Ct7TPDXifaotrDyP+mkiIrfm
3NewxxRwptijVFHZRgU+ulJRVkrGLberPNk+H+uXwB1LWAB/d3NJj88CtW0+GmkxYNzPc3B9MhR+nP61
2lFMDIs/C2h2ODDpsG4dGkXefzbNayqqKFVQqjoAMClooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKAPE9YtfsHja5gA+X7QWUegbkfzq/Vnx7b+R4ytJwOJo0J+oJH8gKrV8hxGv38H
5fqe9lL/AHcl5/oFFFFfOnrBRRRQAUUUUAFFFFAFLVcfYwW+6HUn6V3Hgtll1vxFNEcxNcjafxauSmth
dWd0mOVhZx/wEbv6V0vwvU/2LeOf4rjH5KP8a+14ed8I1/ef5I+dzVfv16f5ndUUUV7h5oUUUUAFFIzB
VLMQABkk9q5zU/HWh6aWT7QbmUfwwDd+vT9aAOkorzC++KF25ZbGxiiXs0pLn8hj+tYw8f8AiITGT7ap
B/gMSY/lQB7RRWT4a1WXWtBt76eNY5JNwYL0OCRkflWtQAUUUUAQ3N3bWaB7m4ihUnAMjhQT+NTAgjIO
Qa8Z8c6rc6h4kmtnf9zauY4kAxj1P1JFeuabAbXS7S3OcxQohz6gAUAWqyPEevQeH9La5kw8rfLDHn77
f4eta9eafFObNxp0Gfuo7kfUgf0oAseE/Geq614ijtLoReS6MdsaYwQMg569v1r0OvLfhfZmTVru7I+W
KEID7sf8Aa9SoAKKKwdY8X6RowZZbgTTj/ljD8zZ9+w/GgDeoryzUfibfzErYWsVuvZn+dv8P0NULfV/
Gmr/ADW0t7Ip/iiTav5gAUAexUV4/dv410aEXdzNfJH3Yy7wPrycfjVzRPiRfQTpFqoW4gJw0iqA6+/H
BoA9UoqOCeK5gjngdZIpFDKy9CDUlABRRRQB598R4h/aGjTdyzr+q/41h10PxMIWDSnxys55/Kuer5Li
RfvKb8me5lD9yS8wooor5s9gKKKKACiiigAooooA0tFhFxdyxEZ3W8q/mhFbvw4UL4WyP4p3J/Qf0rE0
L/j9l/695f8A0A1sfDX/AJFiT/r5f+S19pw9/uj/AMT/ACR87mv8den+Z2NFFIzBVLMQABkk9q9080Wv
K/H3id7rUFsLC6b7PAP3jRNw7/h1x/PNQeJvHt3qfm2dj/o9pkqWU/PIPr2HtXKXFjdWsME08LRx3Cl4
mb+IetAFu/8AEGranEkN3fTSRqoUJnAOPUDqfc1b0Xwjq2uFXhgMVues8vC/h6/hXVfDzQNNvNNfUbq2
WadZii+ZyoAAPTpnnvXowAAAAwBTA4S0+F+npGPtd7cSyd/LAQfrmuEudIim8UPpWlu80Zm8qN26+5OO
w559BXovjrxQNJszp9o4+2zryQeYkPf6nt+dJ4D8M/2VZf2jdp/plwvygjmND2+ppAdVY2cWn2MFpCMR
woEX8O9WKKKACmSyrDC8rnCopYn2FPrnfG+o/wBneFroqcST/uV/4F1/TNAHlmlq+s+LrcyfM1xdB3+m
7J/TNe615L8NbH7R4gku2GVtoiQf9puB+ma9aoAK8X8e3323xXcKDlLcCFfw6/qTXsV3cJaWc1zIcJEj
O30AzXz7czvd3ktxIcvK5dvqTmgD1j4b2f2fwyZyPmuJmb8BwP5GuukkSKNpJGCogLMxPAA71n6NbppX
h+ygkZUEUK7yxwAcZP65rl/Gfi7S5NGutOs7nzriUBcxDKgZGefoD0zQBz/inx3cam72mmu8FmDguOHk
/wAB7fn6Vxg5PzHikr0Hwr4Bt7+zg1LULgSQyruWGI/+hN/QfnTEUfAlpb3usqp0pbiJAS88xyE9OOnX
sc160AFAAAAHQCoLOxtdPgEFpbxwxj+FFxn6+tWKQxk0MdxC8MyK8bqVZWGQQe1cDf8AwvhluGexvzDE
TkRyJu2/jmvQaKAMzQNKbRdFgsHn84xbvnxjqSen41p0UUAFFFFAHI/EePf4W345jnRun1H9a45DujVv
UA16H4wtvtXhPUUxkrH5g/4CQf6V5vZPvsYW/wBgV81xJC9OnPs2vv8A+GPXyiXvSiT0UUV8me6FFFFA
BRRRQAUUUUAaWjlllupF6payt/44a2/hsCPDDkjg3LkfktYmj/8AL/8A9eU3/oNdD8PEK+E4jn70rn9c
f0r7Xh9f7I/V/ofO5p/H+R1VUdZs5b/Rry0gk8uWaJkVs45P+cVeor3DzTyjRfh3qM2or/asfkWqHLYc
Ev7DB4+taPxPt44rTSvLVVWPfGqgdBhcD9K9Grz/AOKf/Hlp3/XR/wCQoAu/DP8A5FqX/r5b/wBBWtHx
X4oh8PWRWMq99IP3UZ7f7R9v51x3hzxTb+HfB0oG2S9kuG8qLPT5V+Y+386d4W8OXPiXUG1vWSz25bcA
/wDy2P8A8SP/AK1AFrwd4Xm1G6/t/WQ0hdt8SSc7z/ePt6f4V6PXN6x410bRQYRJ9omUYEUGCF9iegrh
dS+I2s3jMtp5dpGemwbm/M/0AoA9dJCjLEAeppFdHOFZT9DXz9d6hf3zF7q6nmz/AM9HJ/nV3wxFeXHi
KyjspHSUyAllPRRyc+2AaAPdq8w+J+o+ZfWmnI3ESGRx7t0/QfrXp5IAyeleCa/qB1XX7y7zlZJDs/3R
wP0AoA9H+Glj9n8Py3bLhrmU4Pqq8D9d1dpXDp4v0fw1olpYRP8Aa7iGIKywn5d3fLdOuema5DVvHOs6
sTHHL9lhPHlwZBP1brQB2vxA1y3ttClsIbhGup2CMitllXqSfTpj8a8lRijqy9VORxmpLmC4t5dtzHJH
IRuw4IOD35rq/h3o9vqerzzXUKSxW8eQjjILE8Z/I0xFO2sPEni+dXd55oicGWVsRr9O35V2ek/DbTrQ
rJqEr3cg52j5U/xP512qqqKFVQqjgADAFLSGeR+LvBM+lTSXthG0tiTuKryYvY+3v+dQ+EPGL6AxtbpX
lsXbOB1jPcj/AAr2LrXLa14D0nVS0sK/Y7g87oh8pPuv+GKAN6w1Sx1SHzbK5jmXvtPI+o6irdeRz+Bf
EekXHnae3mlT8slvJtYfgcH8qtw+L/FWjAJqVi0qL1aeEqf++hj+tAHqNFcXp/xK0q4wt5DNaP643r+Y
5/SurstQtNRg86zuI54+hKNnB9/SgCzRRRQAUUUUAQ3cIubOeAjIkjZD+IxXAeDtHs9Y0F0kLxXNvM0b
MpzkdRkfifyr0WvMrHSb1/EWvaPZ6hLZSFxOjJkBhk4BxzjDj8qyrUKdePJVV0XTqzpy5oOzNC88I39v
loNtwn+ycH8j/wDXrDmt5rdyk0TxsOoZSDRP4V8YW8zMHnmI6PFd9fzOarTW3jC3Qo8OovGP4ZAZh/UV
4WI4dpS1oy5fJ6r/AD/M9Klm01pUVyWip20LxNHax3Taek6OoYpGcOuexXrn6Cs37fGkhiuY5LaUdVlU
jFeJiMnxdHVxuvLX/g/gelSx9Cp1s/Mt0UisrLuUhh6g5pa8xq2jOwKKKKQzS0f/AJf/APrym/8AQa6f
wGoXwfZ47lyf++zXK6eVW01Zm6Cwl/kK6/wUAPCGn4GMqx/8eNfb5Av9j+bPnM0f7/5G/RRRXtHnBXnv
xTdPsunJuG/e5255xgc12Ot6za6Fpr3ly3ThEB5duwFeH6tqtzrOoy3t02Xc8Dso7Ae1AE+j21izvd6n
MFtYCCYVP7yY9lUdh6ntWpqnivVdc22FhE1vaY2R21uCSQOgOOT9OlN8LeD7jxETO0ghskbaz9WJ9APx
616tpOg6dokPl2VuqMRhpDy7fU0xHn+h/De5ulWfVZTbIeRCvLn6noP1rtrDwhoengeVYRyMP45hvP68
D8K3Ogya858YeNmkZtK0Zyxb5JJ4+Sc/wp/j+VIYvjbxPbiJ9D0qNHd/kmeNRgf7C47+v5Vr+DvDUfhz
T2vr4ql3ImZGY4ESdcZ/nWT4f8OW/hjTH8Qa2v7+Nd0cJ/gPb/gR/T+XIa94o1HX5j58nl24PyQIflH1
9T7mgDtfE3xAs1tp7HS8zySKUM/RVyMZHqf8815nBbzXUyxQRPLI3RUXJP4Vc1PTF06O2IvLe4eZN5ED
bggzwCfX2rufhdpwEd5qTrySIYz+rf8AstMRm6R8N9Ru9suoyLaRH+D7zn8Og/zxXfaR4V0jRgGtrVWm
H/LaX5n/AA9PwrZqvfXK2en3N03SGJn/ACGaQzxHxXefbvFGoTA5HmlB9F+UfyrvfhhaeVol1dEczTbR
9FH+JNeWOxkkZmOWY5Jr3HwjZ/YvCunxYwWi8w/Vvm/rTEbdFFFIYUUUUAFBAIweRRRQBgax4O0jWEYv
brBOek0I2nPuOhrzXUtJ1rwXqCzQzOsZP7u4i4V/Yj+h/WvaaztetLe+0K9gucCIxMxY/wAJAyD+GKAO
c8K+PItWdLLUQsN4eEccJIf6H/PtXaV85AlWyDgg8Gu5tviTeQ2sMTxCRkQKXbqxA6mgD1SiiigAqomm
2kepyaisQF1JGI2kyeVHt07D8qt0UAFFFFABVa80+z1CLy7y2inT0dQcfT0qzRQBxN/8OrUs0uk3ctm/
9wnch/r/ADrnbzRPEOlEm4sftcI/5a23zfp1/SvWKK5cRgsPiP4sE/z+/c2pYirS+CVjxhNRtmO1nMbd
CsgwRVlXV13IwYeoOa9QvtG03Uhi8soZj/eZfm/PrVG28I6JaQyRw2YUSHJJdiR9DmvExHDsGm6ErPs/
8z0qWbSvaovuOMsF32WrrnH+gS/0rsPBRB8Iafg5wrD/AMeNVL/w9DpemapcwTMUaylXYw6ZHr+FZfwy
1O5uLW6sJWUwWwUxccjcWJ5716eU4aphsP7Ootbs4sdWhWq88NrHfUUUV6RyHm/jfSdb1vxHFBbWkr2s
cYEbdEyeWJPQen4Vz3iPwm/hzT7OWa4WSedmDqo+VcAdD3617TXn/wAU/wDjy07/AK6P/IUAXfhn/wAi
1L/18t/6CtdhLLHBE0srqkaDLMxwAK4fwDfW2m+Drm6u5VihS4bLN/urwPU1zmueIdS8ZaimnadE4tS3
yRDq/wDtOf8AIFAFzxP4xutcuf7J0QSeQ52FkHzzH0HoP510fhLwVDoqreXoWW/IyB1WL6e/v+VXfC/h
K18PQCRts184w82Pu+y+3866KgDI8SaCniHSjZtM0LBg6OOQGAI5Hcc1xll8LpPPzfagnlDtCpJP4np+
telVXv7pbLTrm6bpDEz/AJDNAHhviGO1h126t7JNtvC/lIM5J28Ek+5Br17whYf2d4XsYiPndPNb6tz/
ACIH4V4jlri5yxy8j8n1JNfQ8MYhgjiAwEUKPwFAD65vx5efZPCV0AcNMViH4nn9Aa6SuA+KUpXTtPi5
w0rMfwA/xoA8ziQySog6swFfREMYihjjUYCKFA+grwDSU83WLKPAO6dBg9OWFfQVABRRRQAUUVUv9Tst
Mh829uY4EPTeeT9B1NAFuiuKvPiZpMDlbaCe5/2sBAfz5/Sm6Z8RrO6FzLfQpaQxAbAJN7yE9gMD86AO
3rzvx74uj8mTRrCQMzfLcSLyAP7o/r+VZPiL4g3epq9tp6ta2x4LZ/eOPr2H0/OsHRfDmo69PstIT5YO
HmfhF/H+goAz7S1mvruK2t42klkYKqjua9Wt/hzpS20QnLtKEAcqeC2OcfjWn4b8KWXh6Hcn767YYedh
z9AOwrfoAKKKKACiiigAooooAKKKKACiiigAooooAR0WRGR1DKwwVIyCK43wZo1zpWta5vt3itzIFhZh
gMAWxj14Irs6KACiiigArz34pyJ9m06PevmbnbbnnGBzXReJ/FVt4ct1BXzbuQExxA/qfb+deY2Wn6v4
01l5SxdmOZZn+5GPT/ACgCjplnqWsyRaZab5E3l9mfkQnALH07c17D4c8NWnh2z2RfvLhwPNmI5b2HoP
ap9C0Cy0Cy8i1XLtgySt95z/AIe1alABRRRQAVznju4Nv4QvMHmTbH+bDP6Zro6xvE+ivr+ivZRyrHJv
V1ZumR60AeGRl1kUxkhwQVI65r3nw7BdW3h+yivZGe4EYLluozyAfcDj8KxfDngSy0Zkuboi6vF5DEfI
h9h3Puf0rraACvNviiJJLvTIkUsSr4AGSTkV6TTSilgxUFh0JHIoA8t8K+BdRkvra/vlNrDE6yKjfffB
yOOw+teqUUUAFFFFAEF7O9rYzzxxNK8cbOsa9WIGcV4Lqd9falfSXF9I7zE8hv4fYDsPavoGoJLG0mk8
yW1gd/7zRgn86APn6G1uLg4ggkkPoik1uad4I13USCLQwRn+Of5P06/pXtSoqLtRQo9AMU6gDidG+HGn
2RWXUZDdyj+AfLGP6n/PFdnFDHBEsUMaxxqMKqDAH4U+igAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigDy240Wfxd451FJrgRQ277D3IRTgBf8969I0/TrXS7JLSziEcKdAOpPqT3NFFAFqiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9k=
</value>
</data>
<data name="xrRichText2.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAGwAYQBuAGcAMQAwADMAMQBcAGwAYQBuAGcAZgBlADEAMAAzADEAXAB1AGwAXABmADIAXABmAHMAMgAwAFwAYwBmADEAIABLAHIAYQBuAGsAZQBuAGgAYQB1AHMAYQB1AGYAZQBuAHQAaABhAGwAdABlAH0AXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxAFwAcABhAHIAXABwAGEAcgBkAFwAcABsAGEAaQBuAFwAcQBsAHsAXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxACAAYgBlAGsAYQBuAG4AdAAgAG8AZABlAHIAIAB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQBcAHAAYQByAFwAcABhAHIAZABcAHAAbABhAGkAbgBcAHEAbAB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAGEAYgByAGUAYwBoAG4AdQBuAGcAcwByAGUAbABlAHYAYQBuAHQAfQB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMQBcAGYAcwAyADQAXABjAGYAMQBcAHAAYQByAH0A</value>
</data>
<data name="xrRichText1.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEcAcgB1AHAAcABlAG4AYQBuAGcAZQBiAG8AdABlAH0AewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAZgAxAFwAZgBzADIANABcAGMAZgAxAFwAcABhAHIAfQA=</value>
</data>
</root>

View File

@@ -47,7 +47,6 @@ namespace BeWo.IntegroReports
this.xrTableCell15 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell6 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
this.formattingRuleStartDate = new DevExpress.XtraReports.UI.FormattingRule();
this.ReportHeader = new DevExpress.XtraReports.UI.ReportHeaderBand();
this.xrLabel10 = new DevExpress.XtraReports.UI.XRLabel();
@@ -81,6 +80,9 @@ namespace BeWo.IntegroReports
this.fieldAbrechenbareMinuten = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldBillableFLS = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldAbrechenbareFLS = new DevExpress.XtraReports.UI.CalculatedField();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
this.xrLabel8 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel11 = new DevExpress.XtraReports.UI.XRLabel();
((System.ComponentModel.ISupportInitialize)(this.xrTableServiceRecords1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
@@ -273,10 +275,6 @@ namespace BeWo.IntegroReports
this.xrTableCell2.Name = "xrTableCell2";
this.xrTableCell2.Weight = 0.18308090025194024D;
//
// bindingSource1
//
this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.ServicesOverviewRO);
//
// formattingRuleStartDate
//
this.formattingRuleStartDate.Condition = "[StartDate2] < [StartDate]";
@@ -304,14 +302,14 @@ namespace BeWo.IntegroReports
this.xrLabel12,
this.xrLabel1});
this.ReportHeader.Font = new System.Drawing.Font("Arial", 11F);
this.ReportHeader.HeightF = 271.5833F;
this.ReportHeader.HeightF = 264.2916F;
this.ReportHeader.Name = "ReportHeader";
this.ReportHeader.StylePriority.UseFont = false;
//
// xrLabel10
//
this.xrLabel10.Font = new System.Drawing.Font("Arial", 11F, System.Drawing.FontStyle.Bold);
this.xrLabel10.LocationFloat = new DevExpress.Utils.PointFloat(2F, 235F);
this.xrLabel10.LocationFloat = new DevExpress.Utils.PointFloat(2F, 227F);
this.xrLabel10.Name = "xrLabel10";
this.xrLabel10.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel10.SizeF = new System.Drawing.SizeF(62.99998F, 18F);
@@ -397,7 +395,7 @@ namespace BeWo.IntegroReports
this.xrLabel21.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "Year")});
this.xrLabel21.Font = new System.Drawing.Font("Arial", 11F, System.Drawing.FontStyle.Bold);
this.xrLabel21.LocationFloat = new DevExpress.Utils.PointFloat(299F, 235F);
this.xrLabel21.LocationFloat = new DevExpress.Utils.PointFloat(299F, 227F);
this.xrLabel21.Name = "xrLabel21";
this.xrLabel21.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel21.SizeF = new System.Drawing.SizeF(225F, 18F);
@@ -409,7 +407,7 @@ namespace BeWo.IntegroReports
this.xrLabel9.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "Month")});
this.xrLabel9.Font = new System.Drawing.Font("Arial", 11F, System.Drawing.FontStyle.Bold);
this.xrLabel9.LocationFloat = new DevExpress.Utils.PointFloat(65F, 235F);
this.xrLabel9.LocationFloat = new DevExpress.Utils.PointFloat(65F, 227F);
this.xrLabel9.Name = "xrLabel9";
this.xrLabel9.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel9.SizeF = new System.Drawing.SizeF(161.125F, 18F);
@@ -419,7 +417,7 @@ namespace BeWo.IntegroReports
// xrLabel20
//
this.xrLabel20.Font = new System.Drawing.Font("Arial", 11F, System.Drawing.FontStyle.Bold);
this.xrLabel20.LocationFloat = new DevExpress.Utils.PointFloat(245.75F, 235F);
this.xrLabel20.LocationFloat = new DevExpress.Utils.PointFloat(245.75F, 227F);
this.xrLabel20.Name = "xrLabel20";
this.xrLabel20.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel20.SizeF = new System.Drawing.SizeF(53.25014F, 18F);
@@ -520,6 +518,8 @@ namespace BeWo.IntegroReports
// ReportFooter
//
this.ReportFooter.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrLabel8,
this.xrLabel11,
this.xrLabel2,
this.xrLabel7,
this.xrLabel6,
@@ -527,14 +527,14 @@ namespace BeWo.IntegroReports
this.xrLabel4,
this.xrLabel3});
this.ReportFooter.Font = new System.Drawing.Font("Arial", 11F);
this.ReportFooter.HeightF = 170.8333F;
this.ReportFooter.HeightF = 182.2917F;
this.ReportFooter.Name = "ReportFooter";
this.ReportFooter.StylePriority.UseFont = false;
//
// xrLabel2
//
this.xrLabel2.Font = new System.Drawing.Font("Arial", 10F);
this.xrLabel2.LocationFloat = new DevExpress.Utils.PointFloat(1.999919F, 127.0833F);
this.xrLabel2.LocationFloat = new DevExpress.Utils.PointFloat(2.000046F, 138.5417F);
this.xrLabel2.Multiline = true;
this.xrLabel2.Name = "xrLabel2";
this.xrLabel2.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
@@ -548,7 +548,7 @@ namespace BeWo.IntegroReports
// xrLabel7
//
this.xrLabel7.Borders = DevExpress.XtraPrinting.BorderSide.Top;
this.xrLabel7.LocationFloat = new DevExpress.Utils.PointFloat(443.3334F, 86.58333F);
this.xrLabel7.LocationFloat = new DevExpress.Utils.PointFloat(443.3336F, 98.04166F);
this.xrLabel7.Name = "xrLabel7";
this.xrLabel7.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel7.SizeF = new System.Drawing.SizeF(231.6666F, 17.99997F);
@@ -559,7 +559,7 @@ namespace BeWo.IntegroReports
// xrLabel6
//
this.xrLabel6.Borders = DevExpress.XtraPrinting.BorderSide.Top;
this.xrLabel6.LocationFloat = new DevExpress.Utils.PointFloat(164.9999F, 86.58333F);
this.xrLabel6.LocationFloat = new DevExpress.Utils.PointFloat(165F, 98.04166F);
this.xrLabel6.Name = "xrLabel6";
this.xrLabel6.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel6.SizeF = new System.Drawing.SizeF(249.5833F, 17.99997F);
@@ -570,7 +570,7 @@ namespace BeWo.IntegroReports
// xrLabel5
//
this.xrLabel5.Borders = DevExpress.XtraPrinting.BorderSide.Top;
this.xrLabel5.LocationFloat = new DevExpress.Utils.PointFloat(1.999919F, 86.58333F);
this.xrLabel5.LocationFloat = new DevExpress.Utils.PointFloat(2.000046F, 98.04166F);
this.xrLabel5.Name = "xrLabel5";
this.xrLabel5.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel5.SizeF = new System.Drawing.SizeF(135F, 17.99997F);
@@ -594,21 +594,21 @@ namespace BeWo.IntegroReports
this.xrLabel4.StylePriority.UseFont = false;
this.xrLabel4.StylePriority.UsePadding = false;
this.xrLabel4.StylePriority.UseTextAlignment = false;
this.xrLabel4.Text = "[TotalFLMBillable]";
this.xrLabel4.Text = "[TotalFLMoFehlkontakte]";
this.xrLabel4.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
//
// xrLabel3
//
this.xrLabel3.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold);
this.xrLabel3.LocationFloat = new DevExpress.Utils.PointFloat(1.999919F, 0F);
this.xrLabel3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrLabel3.Multiline = true;
this.xrLabel3.Name = "xrLabel3";
this.xrLabel3.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrLabel3.SizeF = new System.Drawing.SizeF(277F, 20F);
this.xrLabel3.SizeF = new System.Drawing.SizeF(279F, 20F);
this.xrLabel3.StylePriority.UseFont = false;
this.xrLabel3.StylePriority.UsePadding = false;
this.xrLabel3.StylePriority.UseTextAlignment = false;
this.xrLabel3.Text = "Summe";
this.xrLabel3.Text = "Summe Fachleistungen";
this.xrLabel3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight;
//
// fieldAbrechenbareMinuten
@@ -630,6 +630,42 @@ namespace BeWo.IntegroReports
this.fieldAbrechenbareFLS.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldAbrechenbareFLS.Name = "fieldAbrechenbareFLS";
//
// bindingSource1
//
this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.ServicesOverviewRO);
//
// xrLabel8
//
this.xrLabel8.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.xrLabel8.LocationFloat = new DevExpress.Utils.PointFloat(0F, 20.00001F);
this.xrLabel8.Multiline = true;
this.xrLabel8.Name = "xrLabel8";
this.xrLabel8.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrLabel8.SizeF = new System.Drawing.SizeF(279F, 20F);
this.xrLabel8.StylePriority.UseFont = false;
this.xrLabel8.StylePriority.UsePadding = false;
this.xrLabel8.StylePriority.UseTextAlignment = false;
this.xrLabel8.Text = "Summe Fehlkontakte";
this.xrLabel8.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight;
//
// xrLabel11
//
this.xrLabel11.Borders = ((DevExpress.XtraPrinting.BorderSide)(((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrLabel11.BorderWidth = 1F;
this.xrLabel11.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.xrLabel11.LocationFloat = new DevExpress.Utils.PointFloat(279F, 20.00001F);
this.xrLabel11.Name = "xrLabel11";
this.xrLabel11.Padding = new DevExpress.XtraPrinting.PaddingInfo(3, 3, 0, 0, 100F);
this.xrLabel11.SizeF = new System.Drawing.SizeF(151F, 20F);
this.xrLabel11.StylePriority.UseBorders = false;
this.xrLabel11.StylePriority.UseBorderWidth = false;
this.xrLabel11.StylePriority.UseFont = false;
this.xrLabel11.StylePriority.UsePadding = false;
this.xrLabel11.StylePriority.UseTextAlignment = false;
this.xrLabel11.Text = "[TotalFLMFehlkontakte]";
this.xrLabel11.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
//
// Stundenzettel
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
@@ -715,6 +751,7 @@ namespace BeWo.IntegroReports
private DevExpress.XtraReports.UI.XRLabel xrLabel2;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell5;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell6;
private DevExpress.XtraReports.UI.XRLabel xrLabel8;
private DevExpress.XtraReports.UI.XRLabel xrLabel11;
}
}

View File

@@ -23,13 +23,22 @@ namespace BeWo.IntegroReports
foreach (ServicesOverviewRO.ServiceDetail s in pRO.Services)
{
if (s.IsBillable)
if (s.IsBillable || s.ServiceDescription.ToLower().Contains("fehlkontakt") || s.ServiceCategory.ToLower().Contains("fehlkontakt"))
servicesBillable.Add(s);
if (s.IsGroup)
s.Notice = "GA";
else
s.Notice = "DL";
if (s.IsGroup)
{
s.Notice = "GA";
}
else
{
s.Notice = "DL";
}
if (s.ServiceDescription.ToLower().Contains("fehlkontakt") || s.ServiceCategory.ToLower().Contains("fehlkontakt"))
{
s.Notice = "FK";
}
}
pRO.Services = servicesBillable;

View File

@@ -1,16 +1,12 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared.Core;
using DevExpress.XtraReports.Design;
using DevExpress.XtraReports.UI;
namespace SKFLeverkusen

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,160 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BS.Shared.Core;
using DevExpress.XtraReports.UI;
namespace SKFLeverkusen
{
public partial class Quittierungsbeleg : XtraReport, IBeWoReport<ServicesOverviewRO>
{
public Quittierungsbeleg()
{
InitializeComponent();
}
public void SetReportDataSource(ServicesOverviewRO pRO)
{
var hatGruppen = false;
if(pRO.Services != null)
{
var servicesBillable = new List<ServicesOverviewRO.ServiceDetail>();
foreach(var sd in pRO.Services)
{
if(sd.IsBillable || sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
{
ServicesOverviewRO.CreateSignatureString(sd);
sd.Notice5 = "E";
if(sd.IsGroup)
{
sd.Notice5 = "GR";
hatGruppen = true;
}
if(sd.ServiceDescription.ToLower().Contains("fehlkontakt") || sd.ServiceCategory.ToLower().Contains("fehlkontakt"))
{
sd.Notice5 = "F";
}
servicesBillable.Add(sd);
}
}
pRO.Services = servicesBillable;
}
if(string.IsNullOrWhiteSpace(pRO.AbsenceTimes))
{
lblHatAbwesenheiten.Text = "X";
}
if(!hatGruppen)
{
lblHatGruppen.Text = "X";
}
ErstelleAbwesenheitenTabelle(pRO);
bindingSource1.DataSource = pRO;
}
private void ErstelleAbwesenheitenTabelle(ServicesOverviewRO pRo)
{
if(pRo.Abwesenheiten is null)
{
return;
}
var newRows = 0;
var index = 1;
foreach(var at in pRo.Abwesenheiten)
{
XRTableRow row;
if(index < xrTableAbwesenheiten.Rows.Count)
{
row = xrTableAbwesenheiten.Rows[index];
}
else
{
row = xrTableAbwesenheiten.InsertRowBelow(xrTableAbwesenheiten.Rows[xrTableAbwesenheiten.Rows.Count - 1]);
newRows++;
}
row.Cells[0].Text = $"{at.Start:dd.MM.yyyy}";
int? days = null;
if(at.End.HasValue)
{
row.Cells[1].Text = $"{at.End:dd.MM.yyyy}";
days = (int)at.End.Value.Subtract(at.Start.Value).TotalDays + 1;
}
else
{
row.Cells[1].Text = "unbekannt";
}
row.Cells[2].Text = String.Format("{0:0}", days);
index++;
}
if(newRows <= 0)
{
return;
}
lblUnterschriftKlient.Top += newRows * 20;
lblUnterschriftMitarbeiter.Top += newRows * 20;
}
private void picSignature_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
if(sender is XRPictureBox xrPictureBox && xrPictureBox.Tag is string base64ImageString)
{
if(!string.IsNullOrWhiteSpace(base64ImageString))
{
var base64Data = Regex.Match(base64ImageString, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
var img = ByteArrayToImage(binData);
xrPictureBox.Image = Utils.CropImage(img);
}
else
{
xrPictureBox.Image = null;
}
}
var xrBox = sender as XRPictureBox;
var base64String = xrBox.Tag as string;
if (!string.IsNullOrWhiteSpace(base64String))
{
var base64Data = Regex.Match(base64String, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
var img = ByteArrayToImage(binData);
xrBox.Image = Utils.CropImage(img);
}
else
{
xrBox.Image = null;
}
}
public Image ByteArrayToImage(byte[] byteArrayIn)
{
using(var memoryStream = new MemoryStream(byteArrayIn))
{
return Image.FromStream(memoryStream);
}
}
}
}

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>21, 17</value>
</metadata>
<data name="xrRichText2.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAGwAYQBuAGcAMQAwADMAMQBcAGwAYQBuAGcAZgBlADEAMAAzADEAXAB1AGwAXABmADIAXABmAHMAMgAwAFwAYwBmADEAIABLAHIAYQBuAGsAZQBuAGgAYQB1AHMAYQB1AGYAZQBuAHQAaABhAGwAdABlAH0AXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxAFwAcABhAHIAXABwAGEAcgBkAFwAcABsAGEAaQBuAFwAcQBsAHsAXABsAGEAbgBnADEAMAAzADEAXABsAGEAbgBnAGYAZQAxADAAMwAxAFwAdQBsAFwAZgAyAFwAZgBzADIAMABcAGMAZgAxACAAYgBlAGsAYQBuAG4AdAAgAG8AZABlAHIAIAB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQBcAHAAYQByAFwAcABhAHIAZABcAHAAbABhAGkAbgBcAHEAbAB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAGEAYgByAGUAYwBoAG4AdQBuAGcAcwByAGUAbABlAHYAYQBuAHQAfQB7AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAbABhAG4AZwAxADAAMwAxAFwAbABhAG4AZwBmAGUAMQAwADMAMQBcAGYAMQBcAGYAcwAyADQAXABjAGYAMQBcAHAAYQByAH0A</value>
</data>
<data name="xrRichText1.SerializableRtfString" xml:space="preserve">
<value>ewBcAHIAdABmADEAXABkAGUAZgBmADAAewBcAGYAbwBuAHQAdABiAGwAewBcAGYAMAAgAEMAYQBsAGkAYgByAGkAOwB9AHsAXABmADEAIABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgA7AH0AewBcAGYAMgAgAEEAcgBpAGEAbAA7AH0AfQB7AFwAYwBvAGwAbwByAHQAYgBsACAAOwBcAHIAZQBkADAAXABnAHIAZQBlAG4AMABcAGIAbAB1AGUAMAAgADsAXAByAGUAZAAwAFwAZwByAGUAZQBuADAAXABiAGwAdQBlADIANQA1ACAAOwB9AHsAXAAqAFwAZABlAGYAYwBoAHAAIABcAGYAMQBcAGYAcwAyADQAfQB7AFwAcwB0AHkAbABlAHMAaABlAGUAdAAgAHsAXABxAGwAXABmADEAXABmAHMAMgA0ACAATgBvAHIAbQBhAGwAOwB9AHsAXAAqAFwAYwBzADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0ADsAfQB7AFwAKgBcAGMAcwAyAFwAcwBiAGEAcwBlAGQAbwBuADEAXABmADEAXABmAHMAMgA0AFwAYwBmADEAIABMAGkAbgBlACAATgB1AG0AYgBlAHIAOwB9AHsAXAAqAFwAYwBzADMAXAB1AGwAXABmADEAXABmAHMAMgA0AFwAYwBmADIAIABIAHkAcABlAHIAbABpAG4AawA7AH0AewBcACoAXAB0AHMANABcAHQAcwByAG8AdwBkAFwAZgAxAFwAZgBzADIANABcAHEAbABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgBsADMAXAB0AHMAYwBlAGwAbABwAGEAZABkAGwAMQAwADgAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAYgAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwBjAGUAbABsAHAAYQBkAGQAZgB0ADMAXAB0AHMAdgBlAHIAdABhAGwAdABcAGMAbAB0AHgAbAByAHQAYgAgAE4AbwByAG0AYQBsACAAVABhAGIAbABlADsAfQB7AFwAKgBcAHQAcwA1AFwAdABzAHIAbwB3AGQAXABzAGIAYQBzAGUAZABvAG4ANABcAGYAMQBcAGYAcwAyADQAXABxAGwAXAB0AHIAYgByAGQAcgB0AFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGwAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAYgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHIAYgByAGQAcgByAFwAYgByAGQAcgBzAFwAYgByAGQAcgB3ADEAMABcAHQAcgBiAHIAZAByAGgAXABiAHIAZAByAHMAXABiAHIAZAByAHcAMQAwAFwAdAByAGIAcgBkAHIAdgBcAGIAcgBkAHIAcwBcAGIAcgBkAHIAdwAxADAAXAB0AHMAYwBlAGwAbABwAGEAZABkAGYAbAAzAFwAdABzAGMAZQBsAGwAcABhAGQAZABsADEAMAA4AFwAdABzAGMAZQBsAGwAcABhAGQAZABmAHIAMwBcAHQAcwBjAGUAbABsAHAAYQBkAGQAcgAxADAAOABcAHQAcwB2AGUAcgB0AGEAbAB0AFwAYwBsAHQAeABsAHIAdABiACAAVABhAGIAbABlACAAUwBpAG0AcABsAGUAIAAxADsAfQB9AHsAXAAqAFwAbABpAHMAdABvAHYAZQByAHIAaQBkAGUAdABhAGIAbABlAH0AXABuAG8AdQBpAGMAbwBtAHAAYQB0AFwAcwBwAGwAeQB0AHcAbgBpAG4AZQBcAGgAdABtAGEAdQB0AHMAcABcAHAAYQByAGQAXABwAGwAYQBpAG4AXABxAGwAewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEsAZQBpAG4AZQAgAH0AewBcAHUAbABcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgAEcAcgB1AHAAcABlAG4AYQBuAGcAZQBiAG8AdABlAH0AewBcAGYAMgBcAGYAcwAyADAAXABjAGYAMQAgACAAaQBtACAAQQBiAHIAZQBjAGgAbgB1AG4AZwBzAHoAZQBpAHQAcgBhAHUAbQB9AFwAZgAxAFwAZgBzADIANABcAGMAZgAxAFwAcABhAHIAfQA=</value>
</data>
</root>

View File

@@ -119,6 +119,12 @@
<Compile Include="Betreuungsvertrag.Designer.cs">
<DependentUpon>Betreuungsvertrag.cs</DependentUpon>
</Compile>
<Compile Include="Quittierungsbeleg.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Quittierungsbeleg.Designer.cs">
<DependentUpon>Quittierungsbeleg.cs</DependentUpon>
</Compile>
<Compile Include="SettlementReport.cs">
<SubType>Component</SubType>
</Compile>
@@ -192,6 +198,10 @@
<EmbeddedResource Include="Betreuungsvertrag.resx">
<DependentUpon>Betreuungsvertrag.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Quittierungsbeleg.resx">
<DependentUpon>Quittierungsbeleg.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="SettlementReport.resx">
<DependentUpon>SettlementReport.cs</DependentUpon>
<SubType>Designer</SubType>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -195,7 +195,7 @@ namespace BeWo.Service.Plugins
//t = "9556218062"; // Diakonie Landshut
//t = "2279593936"; // Diakonie Mülheim
//t = "3623837005"; // Betreuwo Wesel
//t = "8407321888"; // AWO Wesel
t = "8407321888"; // AWO Wesel
//t = "8454426692"; // Mit-Menschen Wuppertal
//t = "0629004412"; // BeWo-Colonia Basaran (Projekt
//t = "7668701607"; // Wohnstätten Essen

View File

@@ -1,13 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using NHibernate.Util;
namespace BeWo.Service.Plugins
{
@@ -32,21 +34,77 @@ namespace BeWo.Service.Plugins
return list;
}
public virtual Dictionary<ResourceDC, List<CompactEmployeeDC>> CheckResourceAvailabilityWithBookingEmployees(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid)
public virtual Dictionary<string, List<string>> CheckResourceAvailabilityWithBookingEmployees(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid)
{
var result = new Dictionary<ResourceDC, List<CompactEmployeeDC>>();
var appointments = DAOFactory.SearchDAO.FindAppointmentsByResourcesInInterval(resourceOids, start, end, selectedAppointmentOid);
var dictionary = DAOFactory.SearchDAO.CheckAvailabilityOfResources(resourceOids, start, end, selectedAppointmentOid);
var user = LoggedInUserOperationContextExt.Current?.User ?? SessionFacade.LoggedInUser;
dictionary.DoForEach(kvp =>
var result = new Dictionary<string, List<string>>();
if(user is null)
{
//var resourceDC = MapperFactory.ResourceDC_Resource.MapToNewDC(kvp.Key);
//var compactEmployeeDCs = MapperFactory.CompactEmployeeDC_Employee.MapToNewDCs(kvp.Value);
return result;
}
//result.Add(resourceDC, compactEmployeeDCs);
});
var loggedInEmployee = user.Employee;
var hasRightToViewEmployeeAppointments = user.CheckForRight(UserRightType.KalenderMitarbeitertermineAnsehen);
var hasRightToViewResourceAppointments = user.CheckForRight(UserRightType.KalenderRessourcentermineAnsehen);
var dictionary = new Dictionary<Resource, List<SchedulerAppointment>>();
foreach(var appointment in appointments)
{
foreach(var resource in appointment.ResourceList)
{
dictionary.AddOrUpdateValueInDictionary(resource, appointment);
}
}
foreach(var resource2Appointments in dictionary)
{
foreach(var appointment in resource2Appointments.Value)
{
var originator = appointment.Originator;
var employee2Appointments = appointment.EmployeeList;
var isOwnAppointment = (originator?.Equals(loggedInEmployee) ?? false) || employee2Appointments.ToList().Any(e2a => e2a.Employee.Equals(loggedInEmployee));
// Wenn isOwnAppointment true ist, darf der Benutzer die Uhrzeiten und die Mitarbeiter sehen. Ansonsten müssen die Rechte geprüft werden.
if(isOwnAppointment || hasRightToViewEmployeeAppointments) // Es werden Zeit und Mitarbeiter angezeigt
{
result.AddOrUpdateValueInDictionary(resource2Appointments.Key.Name, $"{CreateDateTimeInfoFromAppointment(appointment.StartDate, appointment.EndDate, appointment.AllDay)} von {originator}");
}
else if(hasRightToViewResourceAppointments && !hasRightToViewEmployeeAppointments) // Nur die Uhrzeit anzeigen
{
result.AddOrUpdateValueInDictionary(resource2Appointments.Key.Name, $"{CreateDateTimeInfoFromAppointment(appointment.StartDate, appointment.EndDate, appointment.AllDay)}");
}
else if(!hasRightToViewEmployeeAppointments) // Es werden weder Zeit noch Mitarbeiter angezeigt
{
result.AddOrUpdateValueInDictionary(resource2Appointments.Key.Name, string.Empty);
}
}
}
return result;
}
private string CreateDateTimeInfoFromAppointment(DateTime? start, DateTime? end, bool allDay)
{
if(start.HasValue && end.HasValue)
{
return start.Value.Date == end.Value.Date ?
$"{start.Value.ToShortTimeString()} - {end.Value.ToShortTimeString()} " :
$"{start.Value:dd.MM.yyyy HH:mm} - {end.Value:dd.MM.yyyy HH:mm} ";
}
if(allDay && start.HasValue && end.HasValue)
{
return start.Value.Date == end.Value.Date ? " " : $"{start.Value.ToShortDateString()} - {end.Value.ToShortDateString()} ";
}
return string.Empty;
}
}
}

View File

@@ -230,7 +230,6 @@ namespace BeWo.Service.Plugins
// });
//}
#if DEBUG
if(!(newServiceRecord.ServiceRecordOid is null))
{
var original = DAOFactory.GenericDAO.LoadByID<ServiceRecord>(newServiceRecord.ServiceRecordOid.Value);
@@ -241,19 +240,11 @@ namespace BeWo.Service.Plugins
var areTimesEqual = startEqual && endEqual;
var confirmationReceiptSignatures = DAOFactory.SearchDAO.GetConfirmationReceiptSignaturesByServiceRecord(newServiceRecord.ServiceRecordOid.Value);
// ToDo: Nur anzeigen, wenn die Monatsunterschrift auch gültig ist? Welchen Zeitraum wählen? Den, der ausgewählt ist?
if(!areTimesEqual && confirmationReceiptSignatures.Any())
{
var sum = confirmationReceiptSignatures.Sum(s => s.ServiceRecords.Count);
var message = "Für diesen Eintrag existiert bereits eine Monatsunterschrift. Das Verändern von Datum oder Uhrzeit führt zu einer ungültigen Monatsunterschrift, die erneut geleistet werden muss, um auf dem Quittierungsbeleg angezeigt zu werden.";
if(sum == 1)
{
// Die Unterschrift wird gelöscht, weil der einzige damit verknüpfte Zeiterfassungseintrag geändert wird.
message = "Der zu speichernde Zeiterfassungseintrag ist der einzige, für den eine Monatsunterschrift geleistet wurde. Das Speichern führt zur Löschung der Monatsunterschrift.";
}
result.Add(new ServiceRecordValidationResultDC
{
ResultType = ServiceRecordValidationResult.SignatureExists,
@@ -262,7 +253,6 @@ namespace BeWo.Service.Plugins
});
}
}
#endif
bool isGroupRecord = (cb2scOids != null && cb2scOids.Count > 1) ||
(employeeOids != null && employeeOids.Count > 1);
@@ -1094,24 +1084,42 @@ namespace BeWo.Service.Plugins
{
Allow = true,
ResultType = ServiceRecordValidationResult.Custom,
Message = "Dieser Eintrag wurde bereits unterschrieben.\nMöchten Sie ihn trotzdem löschen?"
});
Message = "Dieser Eintrag wurde bereits unterschrieben.\n\nMöchten Sie ihn trotzdem löschen?"
});
}
// TODO: Flag beachten
// 2. Prüfe, ob eine Mitarbeiterunterschrift mit diesem Eintrag verknüpft ist
//if(serviceRecord.ServiceRecordOid.HasValue)
//{
// var hasEmployeeSignature = DAOFactory.SearchDAO.HasEmployeeSignaturesForServiceRecord(serviceRecord.ServiceRecordOid.Value);
// 2. Prüfe, ob eine Mitarbeiterunterschrift mit diesem Eintrag verknüpft ist
//if(serviceRecord.ServiceRecordOid.HasValue)
//{
// var hasEmployeeSignature = DAOFactory.SearchDAO.HasEmployeeSignaturesForServiceRecord(serviceRecord.ServiceRecordOid.Value);
// if(hasEmployeeSignature)
// {
// result.Add(new ServiceRecordValidationResultDC
// {
// ResultType = ServiceRecordValidationResult.HasEmployeeSignature
// });
// }
//}
// if(hasEmployeeSignature)
// {
// result.Add(new ServiceRecordValidationResultDC
// {
// ResultType = ServiceRecordValidationResult.HasEmployeeSignature
// });
// }
//}
// 3. Prüfe, ob eine Monatsunterschrift vorhanden ist.
if(serviceRecord.ServiceRecordOid is null)
{
return result;
}
var confirmationReceiptSignatures = DAOFactory.SearchDAO.GetConfirmationReceiptSignaturesByServiceRecord(serviceRecord.ServiceRecordOid.Value);
if(confirmationReceiptSignatures.Any(crs => crs.IsActive == ActivationTypeId.Active))
{
result.Add(new ServiceRecordValidationResultDC
{
ResultType = ServiceRecordValidationResult.Custom,
Message = "Für diesen Eintrag existiert bereits eine Monatsunterschrift. Das Löschen dieses Eintrags führt zu einer ungültigen Monatsunterschrift, die erneut geleistet werden muss, um auf dem Quittierungsbeleg angezeigt zu werden.\n\nMöchten Sie ihn trotzdem löschen?",
Allow = true
});
}
return result;
}

View File

@@ -240,5 +240,9 @@ namespace BeWo.Service.ServiceContracts
[FaultContract(typeof(BeWoFault))]
[OperationContract]
List<AbsenceTimeDC> GetAllActiveEmployeeAbsenceTimesInInterval(DateTime start, DateTime end, long employeeOid, List<long> selectedEmployeeOids);
[FaultContract(typeof(BeWoFault))]
[OperationContract]
Dictionary<string, List<string>> CheckResourceAvailabilityWithEmployeeInformation(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid);
}
}

View File

@@ -325,6 +325,8 @@ namespace BeWo.Service.ServiceImplementations
{
if(item.Group != null)
{
RemoveServiceRecordsFromConfirmationReceiptSignatureForDeletion(item.Group.ServiceRecordList);
DeleteServiceRecordsFromAppointments(item.Group.ServiceRecordList.ToList());
DAOFactory.GenericDAO.Delete(item.Group);
@@ -340,6 +342,8 @@ namespace BeWo.Service.ServiceImplementations
return;
}
RemoveServiceRecordsFromConfirmationReceiptSignatureForDeletion(srListToDelete);
DeleteServiceRecordsFromAppointments(srListToDelete);
DAOFactory.GenericDAO.Delete(srListToDelete);
@@ -7560,10 +7564,12 @@ namespace BeWo.Service.ServiceImplementations
{
try
{
var originals = DAOFactory.GenericDAO.LoadByIDs<ConfirmationReceiptSignature>(oid2Version.Select(e => e.Key));
originals.DoForEach(or => MapperFactory.ConfirmationReceiptSignatureDC_ConfirmationReceiptSignature.ConcurrencyCheck(oid2Version[or.Oid.Value], or));
//var originals = DAOFactory.GenericDAO.LoadByIDs<ConfirmationReceiptSignature>(oid2Version.Select(e => e.Key));
//originals.DoForEach(or => MapperFactory.ConfirmationReceiptSignatureDC_ConfirmationReceiptSignature.ConcurrencyCheck(oid2Version[or.Oid.Value], or));
DAOFactory.GenericDAO.Delete(originals);
//DAOFactory.GenericDAO.Delete(originals);
ServiceLogic.SetActivationType<ConfirmationReceiptSignature>(oid2Version, ActivationTypeId.Deleted);
}
catch(Exception e)
{
@@ -7672,7 +7678,7 @@ namespace BeWo.Service.ServiceImplementations
}
}
var confirmationReceiptSignatures = DAOFactory.SearchDAO.LoadConfirmationReceiptSignaturesByServiceRecordOids(serviceRecordOids);
var confirmationReceiptSignatures = DAOFactory.SearchDAO.LoadAllConfirmationReceiptSignaturesByServiceRecordOids(serviceRecordOids);
var confirmationReceiptSignatures2Delete = new List<ConfirmationReceiptSignature>();
var confirmationReceiptSignatures2Update = new List<ConfirmationReceiptSignature>();
@@ -7704,6 +7710,22 @@ namespace BeWo.Service.ServiceImplementations
ServiceLogic.SetActivationType<ConfirmationReceiptSignature>(oids2Versions, ActivationTypeId.Deleted);
}
private static void RemoveServiceRecordsFromConfirmationReceiptSignatureForDeletion(IEnumerable<ServiceRecord> serviceRecords)
{
var serviceRecordOids = serviceRecords.Select(serviceRecord => serviceRecord.Oid.Value).ToList();
var confirmationReceiptSignatures = DAOFactory.SearchDAO.LoadAllConfirmationReceiptSignaturesByServiceRecordOids(serviceRecordOids);
foreach(var signature in confirmationReceiptSignatures)
{
var serviceRecords2Keep = signature.ServiceRecords.Where(serviceRecord => serviceRecord.Oid.HasValue && !serviceRecordOids.Contains(serviceRecord.Oid.Value)).ToList();
signature.ServiceRecords.Clear();
signature.ServiceRecords = serviceRecords2Keep;
}
DAOFactory.GenericDAO.Update(confirmationReceiptSignatures);
}
public List<RatingTypeDC> GetRatingTypesByOids(List<long> ratingTypeOids)
{
try

View File

@@ -2570,13 +2570,11 @@ namespace BeWo.Service.ServiceImplementations
var s = PluginLoader.FindClass<ResourceService>();
return s.CheckResourceAvailability(start, end, resourceOids, selectedAppointmentOid);
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
public SchedulerAppointmentDC FindRootAppointmentByRecurrenceId(string recurrenceId)
@@ -2713,5 +2711,19 @@ namespace BeWo.Service.ServiceImplementations
throw Utils.CreateBeWoFaultException(e);
}
}
public Dictionary<string, List<string>> CheckResourceAvailabilityWithEmployeeInformation(DateTime start, DateTime end, List<long> resourceOids, long? selectedAppointmentOid)
{
try
{
var s = PluginLoader.FindClass<ResourceService>();
return s.CheckResourceAvailabilityWithBookingEmployees(start, end, resourceOids, selectedAppointmentOid);
}
catch(Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
}
}