Files
BeWoPlaner/BeWoPlanerMobil/Views/Report/Report.cshtml

624 lines
27 KiB
Plaintext

@using BeWoPlanerMobil.Util
@model BeWoPlanerMobil.Models.ReportModel
@{
ViewBag.Title = "Quittierungsbeleg";
if(TempData[TempDataConstants.DoLogoutKey] is bool doLogout && doLogout)
{
<text>
<script type="text/javascript">
$("#second-logout-form").submit();
</script>
</text>
}
}
<style type="text/css">
.btn-group {
width: 135px;
}
</style>
<script type="text/javascript">
function getChangeDateSelectionUrl() {
return "@Url.Action("ChangeDateSelection")";
}
function getChangeFiltersUrl() {
return "@Url.Action("ChangeFilters")";
}
function getSetCustomerUrl() {
return "@Url.Action("SetCustomer")";
}
function getValidateCustomerSignatureUrl() {
// TODO: implementieren? Ja!
}
function getCreateSignatureForServiceOverviewUrl() {
return "@Url.Action("CreateSignatureForServiceOverview")";
}
$(document).ready(function() {
initializeReportView();
calcReportFormPrependWidth();
if($("#selected-employee-cb").is(":checked")) {
$("#employee-select-container").removeClass("d-none");
$("#employee-select-container").addClass("d-block");
}
if($("#selected-organisation-cb").is(":checked")) {
$("#organisation-select-container").removeClass("d-none");
$("#organisation-select-container").addClass("d-block");
}
if($("#selected-category-cb").is(":checked")) {
$("#test-div3").removeClass("d-none");
$("#test-div3").addClass("d-block");
}
@if(Model.QuittierungsbelegsReportObject != null)
{
<text>
const windowHeight = $(window).height() * .8;
$("#qb-container").height(windowHeight);
$("#qb-report-popup").modal("show");
</text>
}
});
$(window).resize(function() {
calcReportFormPrependWidth();
});
function getLoadConfirmationReceiptSignaturesUrl() {
return "@Url.Action("LoadConfirmationReceiptSignatures")";
}
function createServiceOverview() {
try {
showSpinner();
$("#report-signatures-container").load("@Url.Action("LoadServiceOverview")",
function () {
hideSpinner();
}
);
} catch (error) {
window.showErrorPopup(error);
}
}
var reportFormWidth = 0;
function calcReportFormPrependWidth() {
try {
if(reportFormWidth === 0) {
reportFormWidth = getMaxWidth("sm-report-prepend-input-group-text");
}
let newWidth = reportFormWidth;
if($(document).width() <= 768) {
newWidth = getMaxWidth("sm-report-prepend-input-group-text");
}
$(".sm-report-prepend-input-group-text").width(newWidth);
} catch (error) {
window.showErrorPopup(error);
}
}
function setIsOnlyForSelectedEmployee() {
try {
var isChecked = $("#selected-employee-cb").is(":checked");
$.get("@Url.Action("CheckForSelectedEmployee")", function(employeeName2Oid) {
if(!employeeName2Oid.includes("_")) {
return;
}
const [name, employeeOid] = employeeName2Oid.split("_");
$("#qb-employee-popup").parent().find(".dropdown-toggle").text(name);
$.get("@Url.Action("ChangeIsForSelectedEmployeesOnly")", {isForSelectedEmployeeOnly: isChecked, employeeOid: isChecked ? parseFloat(employeeOid) : null});
});
} catch(error) {
window.showErrorPopup(error);
}
}
function setIsOnlyForSelectedOrganisation() {
try {
var isChecked = $("#selected-organisation-cb").is(":checked");
var organizationOid = null;
$.get("@Url.Action("CheckForSelectedOrganization")",
function(organizationName2Oid) {
const popup = $("#qb-organization-popup");
const links = popup.find("a");
const dropdownToggleButton = popup.parent().find(".dropdown-toggle");
if(organizationName2Oid === " " && links.length > 0) {
const firstOrganization = $(links[0]);
dropdownToggleButton.text(firstOrganization.text());
const id = firstOrganization.attr("id");
if(false === isUndefinedOrNull(id) && id.includes("_")) {
organizationOid = parseFloat(id.split("_")[1]);
}
} else if(organizationName2Oid.includes("_")) {
const splitName2Oid = organizationName2Oid.split("_");
const organizationName = splitName2Oid[0];
const oid = parseFloat(splitName2Oid[1]);
organizationOid = oid;
dropdownToggleButton.text(organizationName);
}
$.get("@Url.Action("ChangeIsForSelectedOrganisationOnly")", {isForSelectedOrganisationOnly: isChecked, organisationOid: isChecked ? organizationOid : null});
});
} catch(error) {
window.showErrorPopup(error);
}
}
function setIsOnlyForSelectedServiceCategory() {
try {
const isChecked = $("#selected-category-cb").is(":checked");
const serviceCategoryOid = isChecked ? parseFloat($("#category-select option:selected").val()) : null;
$.get("@Url.Action("ChangeIsForSelectedServiceCategoryOnly")", { isForSelectedServiceCategoryOnly: isChecked, serviceCategoryOid: serviceCategoryOid});
} catch(error) {
window.showErrorPopup(error);
}
}
function setReportEmployee(selectedDropdownItem, employeeOid) {
try {
$.get("@Url.Action("SetEmployeeOid")", { employeeOid: employeeOid }, function(employeeName) {
$("#qb-employee-popup").parent().find(".dropdown-toggle").text(employeeName);
$("#qb-employee-popup").modal("hide");
});
} catch(error) {
window.showErrorPopup(error);
}
}
function setReportOrganization(selectedDropdownItem, organisationOid) {
try {
if(organisationOid !== null && $.isNumeric(organisationOid)) {
$.get("@Url.Action("SetOrganisationOid")", { organisationOid: organisationOid }, function(organisationName) {
$("#qb-organization-popup").parent().find(".dropdown-toggle").text(organisationName);
$("#qb-organization-popup").modal("hide");
});
}
} catch(error) {
window.showErrorPopup(error);
}
}
function setReportServiceCategory() {
try {
const serviceCategoryOid = parseFloat($("#category-select option:selected").val());
if(serviceCategoryOid !== null && $.isNumeric(serviceCategoryOid)) {
$.get("@Url.Action("SetServiceCategoryOid")", { serviceCategoryOid: serviceCategoryOid });
}
} catch (error) {
window.showErrorPopup(error);
}
}
function previewQBReport() {
try {
showSpinner();
$("#load-report-form").submit();
} catch(error) {
window.showErrorPopup(error);
}
}
function resetQuittierungsbeleg() {
try {
$.get("@Url.Action("ResetQuittierungsbeleg")");
} catch(error) {
window.showErrorPopup(error);
}
}
$(document).on("shown.bs.modal", "#qb-report-popup", function () {
quittierungsbelegsViewer.AdjustControl();
});
function checkForExistingSignature() {
try {
const month = $("#month-select option:selected").val();
const year = $("#year-select option:selected").val();
const startDay = $("#start-day-select option:selected").val();
const endDay = $("#end-day-select option:selected").val();
if(startDay === 0 || endDay === 0 || year === 0 || month === 0 || areUndefinedOrNull([month, year, startDay, endDay])) {
return;
}
$.get("@Url.Action("ChangeDateSelection")",
{
startDayString: startDay,
endDayString: endDay,
monthString: month,
yearString: year
});
} catch(error) {
window.showErrorPopup(error);
}
}
function qbFilterSelectionChange() {
try {
const selectedOption = $("#qb-filter-select option:selected").val();
switch(selectedOption) {
case "3": // Klient auswählen
$("#team-selection-container").removeClass("d-block");
$("#team-selection-container").addClass("d-none");
$("#customer-selection-container").removeClass("d-none");
$("#customer-selection-container").addClass("d-block");
break;
case "4": // Team auswählen
$("#customer-selection-container").removeClass("d-block");
$("#customer-selection-container").addClass("d-none");
$("#team-selection-container").removeClass("d-none");
$("#team-selection-container").addClass("d-block");
break;
default:
$("#customer-selection-container, #team-selection-container").removeClass("d-block");
$("#customer-selection-container, #team-selection-container").addClass("d-none");
break;
}
window.calcPrependWidth();
$.get("@Url.Action("SetQbFilterEnum")", { filterEnumString: selectedOption });
} catch(error) {
window.showErrorPopup(error);
}
}
function onQBCustomerDropdownItemClick(selectedDropdownItem, customerOid) {
try {
$.get("@Url.Action("SetCustomer")", {customerOid: customerOid}).done(function(customerName) {
$("#qb-customer-popup").parent().find(".dropdown-toggle").text(customerName);
$("#qb-customer-popup").modal("hide");
checkForExistingSignature();
});
} catch(error) {
window.showErrorPopup(error);
}
}
function onQBTeamDropdownItemClick(selectedDropdownItem, teamOid) {
try {
$.get("@Url.Action("SetTeam")", {teamOid: teamOid}).done(function(teamName) {
$("#qb-team-popup").parent().find(".dropdown-toggle").text(teamName);
$("#qb-team-popup").modal("hide");
checkForExistingSignature();
});
} catch(error) {
window.showErrorPopup(error);
}
}
</script>
<div class="container-fluid my-3 lg-max-width" id="report-form-container">
<div class="row">
<div class="col col-12">
@* ----- Filter ----- *@
<div class="mt-3">
<div class="form-row">
<div class="col-md">
<div class="form-group mb-1">
@Html.DropDownListFor(m => m.SelectedFilterItemId, Model.QbFilterItems, new { id = "qb-filter-select", @class = "custom-select", onchange = "qbFilterSelectionChange()" })
</div>
</div>
</div>
</div>
@* ----- Klient ----- *@
<div class="mt-3">
<div class="form-row">
<div class="col-md">
<div class="mt-3" id="customer-selection-container">
@Html.PopupWithSearchForIFilterables(Model.Customers, "onQBCustomerDropdownItemClick", null, Model.SelectedCustomer?.DetailDescription, "qb-customer-popup", false)
</div>
</div>
</div>
</div>
@* ----- Team ----- *@
<div class="mt-3">
<div class="form-row">
<div class="col-md">
<div class="mb-1 d-none" id="team-selection-container">
@Html.PopupWithSearchForIFilterables(Model.AllTeams, "onQBTeamDropdownItemClick", null, Model.SelectedTeam?.DetailDescription, "qb-team-popup", false)
</div>
</div>
</div>
</div>
<div class="mt-3">
<div class="form-row">
<div class="col-xl">
<div class="form-group mb-1">
@* Nur für ausgewählten Mitarbeiter *@
<div class="custom-control custom-checkbox custom-control-inline">
@Html.CheckBoxFor(m => m.IsForSelectedEmployeesOnly, new { onchange = "setIsOnlyForSelectedEmployee()", @class = "custom-control-input", id = "selected-employee-cb", data_toggle = "collapse", data_target = "#employee-select-container" })
<label class="custom-control-label" for="selected-employee-cb">Nur für ausgewählten Mitarbeiter</label>
</div>
</div>
<div class="form-group mb-1 collapse" id="employee-select-container">
@Html.PopupWithSearchForIFilterables(Model.Employees, "setReportEmployee", null, Model.SelectedEmployee?.DetailDescription, "qb-employee-popup", false)
</div>
</div>
<div class="col-xl">
<div class="form-group mb-1">
@* Nur für ausgewählten Kostenträger *@
<div class="custom-control custom-checkbox custom-control-inline">
@Html.CheckBoxFor(m => m.IsForSelectedCostbearersOnly, new { id = "selected-organisation-cb", @class = "custom-control-input", onchange = "setIsOnlyForSelectedOrganisation()", data_toggle = "collapse", data_target = "#organisation-select-container" })
<label class="custom-control-label" for="selected-organisation-cb">Nur für ausgewählten Kostenträger</label>
</div>
</div>
<div class="form-group mb-1 collapse" id="organisation-select-container">
@Html.PopupWithSearchForIFilterables(Model.Organisations, "setReportOrganization", null, Model.SelectedOrganisation?.DetailDescription, "qb-organization-popup", false)
</div>
</div>
<div class="col-xl">
<div class="form-group mb-1">
@* Nur für ausgewählte Leistungskategorie *@
<div class="custom-control custom-checkbox custom-control-inline">
@Html.CheckBoxFor(m => m.IsForSelectedCategoryOnly, new { id = "selected-category-cb", @class = "custom-control-input", onchange = "setIsOnlyForSelectedServiceCategory()", data_toggle = "collapse", data_target = "#test-div3" })
<label class="custom-control-label" for="selected-category-cb">Nur für ausgewählte Leistungskategorie</label>
</div>
</div>
<div class="form-group mb-1 collapse" id="test-div3">
@Html.DropDownListFor(m => m.SelectedServiceCategoryOid, Model.ServiceCategoryItems, new { id = "category-select", @class = "custom-select", onchange = "setReportServiceCategory()" })
</div>
</div>
</div>
</div>
<div class="mt-3">
<div class="form-row">
<div class="col-lg-5">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text sm-report-prepend-input-group-text">
Monat
</div>
</div>
@Html.DropDownListFor(m => m.SelectedMonth, Model.Months, new { id = "month-select", onchange = "onMonthOrYearChange()", @class = "custom-select" })
</div>
</div>
</div>
<div class="col-lg-2">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text sm-report-prepend-input-group-text">
Vom
</div>
</div>
@Html.DropDownListFor(m => m.SelectedStartDay, Model.Days, new { id = "start-day-select", onchange = "checkForExistingSignature()", @class = "custom-select" })
</div>
</div>
</div>
<div class="col-lg-2">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text sm-report-prepend-input-group-text">
Bis
</div>
</div>
@Html.DropDownListFor(m => m.SelectedEndDay, Model.Days, new { id = "end-day-select", onchange = "checkForExistingSignature()", @class = "custom-select" })
</div>
</div>
</div>
<div class="col-lg-3">
<div class="form-group mb-1">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text sm-report-prepend-input-group-text">
Jahr
</div>
</div>
@Html.DropDownListFor(m => m.SelectedYear, Model.Years, new { id = "year-select", onchange = "onMonthOrYearChange()", @class = "custom-select" })
</div>
</div>
</div>
</div>
</div>
@* Info-, Erstellen- und Vorschau-Buttons *@
<div class="clearfix mt-3">
<button type="button" class="btn btn-info float-left" data-toggle="modal" data-target="#qb-info-popup">
<span class="fas fa-info"></span>
</button>
<button type="button" class="btn btn-primary float-right" id="create-button" onclick="createServiceOverview()">Erstellen</button>
@using(Html.BeginForm("LoadQuittierungsbeleg", "Report", FormMethod.Post, new { id = "load-report-form" }))
{
<button type="button" class="btn btn-primary float-right mr-2" onclick="previewQBReport()">
<span class="fas fa-file-alt"></span>
Vorschau
</button>
}
</div>
</div>
<div class="col col-12" id="report-signatures-container">
@Html.Partial("QuittierungsbelegsResultPartial", Model)
</div>
</div>
</div>
<!-- Container für die Mitarbeiterunterschrift -->
<div class="container-fluid d-none my-3 lg-max-width" id="report-signature-container">
</div>
<!-- /Container für die Mitarbeiterunterschrift -->
<!-- Container für die Unterschrift -->
<div class="container-fluid d-none my-3 lg-max-width" id="report-signature-container-div">
<div class="container-fluid">
<div class="row">
<div class="col">
<h4 class="d-inline" id="report-info-column-h4">Unterschrift</h4>
<button type="button" class="btn btn-primary float-right" id="cancel-report-signature-button">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
<div id="signature-container-div" class="mt-4">
</div>
<div class="row mt-3 signingContent">
<div class="col">
<div class="alert alert-primary d-none" role="alert" id="overwriting-signature-alert">
Achtung, Sie sind dabei eine vorhandene Unterschrift zu ersetzen!
</div>
</div>
</div>
<div class="row mt-3 signingContent" id="report-canvas-row-div">
<div class="canvas-container" id="canvas-container-div">
<canvas id="report-sketch-pad-canvas" width="500" height="200" style="border: 1px solid #343A40;" class="bg-white rounded"></canvas>
</div>
</div>
<div class="row signingContent">
<div class="col-12">
<button type="button" class="btn btn-primary float-right" id="save-report-signature-button">Speichern</button>
<button type="button" class="btn btn-secondary float-right mr-3" id="clear-report-canvas-button">Neu</button>
</div>
</div>
</div>
</div>
<!-- /Container für die Unterschrift -->
<!-- Popup der Legende -->
<div class="modal" tabindex="-1" role="dialog" id="qb-info-popup">
<div class="modal-dialog modal-xl modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-danger font-weight-bold">Legende</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" style="background-color: #F7F7F7 !important">
<button type="button" class="btn btn-bewo-customers d-inline">
<span class="fas fa-signature"></span>
<span class="fa-stack align-middle bg-dark" style="height: auto !important">
<i class="fas fa-check fa-stack-1x"></i>
<i class="fas fa-slash fa-stack-1x text-danger"></i>
</span>
K
</button>
/
<button type="button" class="btn btn-bewo-employee d-inline">
<span class="fas fa-signature"></span>
<span class="fa-stack align-middle bg-dark" style="height: auto !important">
<i class="fas fa-check fa-stack-1x"></i>
<i class="fas fa-slash fa-stack-1x text-danger"></i>
</span>
M
</button>
- Es gibt noch keine Monatsunterschrift für alle Zeiterfassungseinträge im ausgewählten Zeitraum; Es wird keine Unterschrift auf dem Quittierungsbeleg angezeigt.
<br />
<br />
<button type="button" class="btn btn-bewo-customers d-inline">
<span class="fas fa-signature"></span>
<span class="fas fa-check-double" style="color: greenyellow !important"></span>
K
</button>
/
<button type="button" class="btn btn-bewo-employee d-inline">
<span class="fas fa-signature"></span>
<span class="fas fa-check-double" style="color: greenyellow !important"></span>
M
</button>
- Alle Zeiterfassungseinträge haben eine Monatsunterschrift; Die Unterschrift wird auf dem Quittierungsbeleg angezeigt.
<br />
<br />
<button type="button" class="btn btn-bewo-employee d-inline">
<span class="fas fa-signature"></span>
<span class="fas fa-ban" style="color: tomato;"></span>
M
</button>
- Es wurden die von Ihnen geleisteten Zeiterfassungseinträge unterschrieben. Es fehlen jedoch die Unterschriften der anderen Mitarbeiter, für die das Recht "Unterschriften für den Quittierungsbeleg stellvertretend leisten (monatlich)" notwendig wäre.
<br />
<hr />
<p><span class="fas fa-check text-bewo-customers"></span> - Dieser Zeiterfassungseintrag hat vom Klienten eine Monatsunterschrift.</p>
<p><span class="fas fa-check text-bewo-employee"></span> - Dieser Zeiterfassungseintrag hat vom Mitarbeiter eine Monatsunterschrift.</p>
<p>
<span class="fa-stack fa-1x text-secondary">
<i class="fas fa-signature fa-stack-1x"></i>
<i class="fas fa-ban fa-stack-2x"></i>
</span>
- Dieser Zeiterfassungseinträge kann von Ihnen nicht unterschrieben werden, da Ihnen das dazu notwendige Recht "Unterschriften für den Quittierungsbeleg stellvertretend leisten (monatlich)." fehlt.
</p>
<br />
<hr />
<p>Um einen Quittierungsbeleg aus der Vorschau herunterzuladen, klicken oder tippen Sie auf den Bericht. Dann erscheint ein Button zur Formatsauswahl.</p>
</div>
<div class="modal-footer">
<div class="clearfix">
<button class="btn btn-primary float-right" type="button" data-dismiss="modal">Schlie&szlig;en</button>
</div>
</div>
</div>
</div>
</div>
<!-- /Popup der Legende -->
<!-- Popup des Quittierungsbelegsdokuments -->
<div class="modal" tabindex="-1" data-backdrop="static" role="dialog" id="qb-report-popup">
<div class="modal-dialog modal-xl modal-dialog-scrollable" role="document">
<div class="modal-content">
<div class="modal-header py-1">
<p class="modal-title font-weight-bold">Quittierungsbeleg</p>
<button class="close" type="button" data-dismiss="modal" aria-label="close" onclick="resetQuittierungsbeleg()">
<span>&times;</span>
</button>
</div>
<div class="modal-body" id="qb-container">
@if(Model.QuittierungsbelegsReportObject != null)
{
@Html.Partial("QuittierungsbelegsPreviewPartial", Model)
}
</div>
</div>
</div>
</div>
<!-- /Popup des Quittierungsbelegsdokuments -->