sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/m/MessageBox", "sap/ui/core/format/DateFormat", ], function (Controller, MessageBox, DateFormat) { "use strict"; return Controller.extend("restaurant.z00124ss25restaurant.controller.tablePos", { onInit: function () { // Initialize your controller logic here var oDatePicker = this.byId("booked-date"); oDatePicker.setDateValue(new Date()); // Set default time value (e.g., 18:00 for dinner) var oTimePicker = this.byId("booked-time"); var oDefaultTime = new Date(); oDefaultTime.setHours(18, 0, 0); oTimePicker.setDateValue(oDefaultTime); // Set default booking period (120 minutes = 2 hours) this.byId("booked-period").setValue("120"); }, _padAndEncodeId: function (id) { id = id.toString(); // Ensure it's a string if (id.length === 9) { return id; } var padding = 9 - id.length; return "%20".repeat(padding) + id; }, handleChange: function (oEvent) { // Handle date selection change if needed var oDatePicker = oEvent.getSource(); var oSelectedDate = oDatePicker.getDateValue(); // Additional validation could go here // For example, prevent past dates if (oSelectedDate && oSelectedDate < new Date()) { MessageBox.warning("Please select a future date for your reservation"); oDatePicker.setDateValue(new Date()); } }, onSaveReservation: function () { // Get values from the form var sReservationName = this.byId("res-name").getValue(); var iNumGuests = parseInt(this.byId("num-guests").getValue(), 10); var oBookedTime = this.byId("booked-time").getDateValue(); var oBookedDate = this.byId("booked-date").getDateValue(); var sBookedPeriod = this.byId("booked-period").getValue(); var sComments = this.byId("comments").getValue(); // Get the selected TableId from the Select control var oTableSelect = this.byId("table-id"); var oSelectedItem = oTableSelect.getSelectedItem(); var sSelectedTableId = oSelectedItem ? oSelectedItem.getKey().trim() : null; // Minimal validation for required fields if (!sReservationName) { MessageBox.error("Please enter a reservation name"); return; } if (!oBookedDate) { MessageBox.error("Please select a date for your reservation"); return; } if (!oBookedTime) { MessageBox.error("Please select a time for your reservation"); return; } if (!sBookedPeriod) { MessageBox.error("Please enter a booking period"); return; } if (!sSelectedTableId) { MessageBox.error("Please select a table"); return; } // Format time for backend (HHMMSS format for ABAP TIMS) var sFormattedTime = this._formatTimeForABAP(oBookedTime); // Combine date and time into a single date object const oCombinedDateTime = new Date( oBookedDate.getFullYear(), oBookedDate.getMonth(), oBookedDate.getDate(), oBookedTime.getHours(), oBookedTime.getMinutes(), oBookedTime.getSeconds() ); // Format using DateTimeOffset type const oDateTimeFormat = DateFormat.getDateTimeInstance({ pattern: "yyyy-MM-dd'T'HH:mm:ss", UTC: true // Use UTC to avoid timezone issues }); const sFormattedDateTime = oDateTimeFormat.format(oCombinedDateTime); // Create payload for OData service - matching your table structure var oPayload = { NumOfGuests: iNumGuests, ReservationName: sReservationName, CommentSection: sComments || "", BookedDate: sFormattedDateTime, BookedTime: sFormattedTime, BookedPeriod: parseInt(sBookedPeriod, 10) || 0 // Created_by and other administrative fields will be handled by the backend }; // Get the OData model var oModel = this.getOwnerComponent().getModel(); // Show busy indicator this.getView().setBusy(true); // FIX: Correct the endpoint format based on your OData service structure // Get the full service path from the model var sServiceUrl = oModel.sServiceUrl; console.log("Service URL:", sServiceUrl); // Try different path formats - the correct format depends on your OData service definition // Option 1: Original path from your code, but with proper formatting console.log(sSelectedTableId); var encoded = this._padAndEncodeId(sSelectedTableId); var endPoint = "/tablePos('" + encoded + "')/to_rese"; oModel.create(endPoint, oPayload, { success: function (oData, oResponse) { this.getView().setBusy(false); MessageBox.success("Reservation created successfully", { onClose: this._resetForm.bind(this) }); }.bind(this), error: function (oError) { this.getView().setBusy(false); // Extract error message from backend response var sErrorMessage = "Error creating reservation"; try { if (oError.responseText) { var oErrorResponse = JSON.parse(oError.responseText); sErrorMessage = oErrorResponse.error.message.value || (oErrorResponse.error.innererror && oErrorResponse.error.innererror.errordetails && oErrorResponse.error.innererror.errordetails.length > 0 ? oErrorResponse.error.innererror.errordetails[0].message : sErrorMessage); } } catch (e) { // Use default error message if parsing fails console.error("Error parsing error response:", e); } // Log detailed error information for debugging console.error("Error status:", oError.statusCode); console.error("Error message:", sErrorMessage); console.error("Request URL:", oError.request ? oError.request.requestUri : "unknown"); console.error("Full error object:", oError); MessageBox.error(sErrorMessage); // Test with a different endpoint if this fails if (oError.statusCode === 404) { console.log("Trying alternative endpoint format..."); this._tryAlternativeEndpoint(oPayload); } }.bind(this) }); }, onCancelPress: function () { // Ask for confirmation before resetting MessageBox.confirm("Are you sure you want to cancel? All entered data will be lost.", { title: "Confirmation", actions: [MessageBox.Action.YES, MessageBox.Action.NO], emphasizedAction: MessageBox.Action.YES, onClose: function (sAction) { if (sAction === MessageBox.Action.YES) { this._resetForm(); } }.bind(this) }); }, onTableItemChange: function (oEvent) { var oSelectedItem = oEvent.getParameter("selectedItem"); if (oSelectedItem) { var sSelectedItemId = oSelectedItem.getKey(); var sSelectedItemText = oSelectedItem.getText(); console.log("Selected Item ID:", sSelectedItemId); console.log("Selected Item Text:", sSelectedItemText); // Perform further actions based on the selected item } }, _resetForm: function () { this.byId("res-name").setValue(""); this.byId("num-guests").setValue(1); this.byId("booked-date").setDateValue(new Date()); // Reset time to default (6:00 PM) var oDefaultTime = new Date(); oDefaultTime.setHours(18, 0, 0); this.byId("booked-time").setDateValue(oDefaultTime); this.byId("booked-period").setValue("120"); this.byId("comments").setValue(""); }, _formatDateForAbapDats: function (oDate) { var oType = new TypeDateTime(); if (!oDate) return null; // Use UI5's built-in ISO date formatting const oDateFormat = DateFormat.getDateInstance({ pattern: "yyyy-MM-dd", UTC: true // Critical for ABAP compatibility }); return oDateFormat.format(oDate); }, _formatTimeForABAP: function (oTime) { if (!oTime) { return "PT00H00M00S"; } var oTimeFormat = sap.ui.core.format.DateFormat.getTimeInstance({ pattern: "HH:mm:ss" }); var oTimeFormatString = "PT" + oTimeFormat.format(oTime); oTimeFormatString = oTimeFormatString.replace(":", "H"); // Replace the next colon with 'M' oTimeFormatString = oTimeFormatString.replace(":", "M"); // Add 'S' at the end to mark seconds oTimeFormatString = oTimeFormatString + "S"; console.log(oTimeFormatString); return oTimeFormatString; }, onManagerPress: function () { console.log("yes you clicked the button of manager"); let man_id = prompt("Please enter manager id:"); if (man_id != "z00124") { alert("You are not manager or typed it wrong try again"); } else { var oRouter = sap.ui.core.UIComponent.getRouterFor(this); oRouter.navTo("RouteManagerReservation"); // make sure this route is defined in your manifest.json // visible="{= ${isManager} }" // do it when it is implemented } } }); });