first commit

This commit is contained in:
Dongho Kim
2025-05-21 15:00:13 +00:00
commit da3ac0e469
39 changed files with 16602 additions and 0 deletions

10
.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
node_modules/
dist/
.scp/
.env
Makefile*.mta
mta_archives
mta-*
resources
archive.zip
.*_mta_build_tmp

42
README.md Normal file
View File

@ -0,0 +1,42 @@
## Application Details
| |
| ------------- |
|**Generation Date and Time**<br>Sun May 18 2025 10:11:57 GMT+0000 (Coordinated Universal Time)|
|**App Generator**<br>SAP Fiori Application Generator|
|**App Generator Version**<br>1.17.5|
|**Generation Platform**<br>SAP Business Application Studio|
|**Template Used**<br>Basic V2|
|**Service Type**<br>OData Url|
|**Service URL**<br>https://s40lp1.ucc.cit.tum.de/sap/opu/odata/sap/Z_00_124_SS25_RES_SRV/|
|**Module Name**<br>z_00_124_ss25_restaurant|
|**Application Title**<br>restaurant|
|**Namespace**<br>restaurant|
|**UI5 Theme**<br>sap_horizon|
|**UI5 Version**<br>1.108.33|
|**Enable Code Assist Libraries**<br>False|
|**Enable TypeScript**<br>False|
|**Add Eslint configuration**<br>False|
## z_00_124_ss25_restaurant
restaurant application
### Starting the generated app
- This app has been generated using the SAP Fiori tools - App Generator, as part of the SAP Fiori tools suite. In order to launch the generated app, simply run the following from the generated app root folder:
```
npm start
```
- It is also possible to run the application using mock data that reflects the OData Service URL supplied during application generation. In order to run the application with Mock Data, run the following from the generated app root folder:
```
npm run start-mock
```
#### Pre-requisites:
1. Active NodeJS LTS (Long Term Support) version and associated supported NPM version. (See https://nodejs.org)

13724
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

30
package.json Normal file
View File

@ -0,0 +1,30 @@
{
"name": "z_00_124_ss25_restaurant",
"version": "0.0.1",
"description": "restaurant application",
"keywords": [
"ui5",
"openui5",
"sapui5"
],
"main": "webapp/index.html",
"dependencies": {},
"devDependencies": {
"@ui5/cli": "^3.0.0",
"@sap/ux-ui5-tooling": "1",
"@sap-ux/ui5-middleware-fe-mockserver": "2"
},
"scripts": {
"start": "fiori run --open \"test/flp.html#app-preview\"",
"start-local": "fiori run --config ./ui5-local.yaml --open \"test/flp.html#app-preview\"",
"build": "ui5 build --config=ui5.yaml --clean-dest --dest dist",
"deploy": "fiori verify",
"deploy-config": "fiori add deploy-config",
"start-noflp": "fiori run --open \"index.html?sap-ui-xx-viewCache=false\"",
"start-mock": "fiori run --config ./ui5-mock.yaml --open \"test/flp.html#app-preview\"",
"int-test": "fiori run --config ./ui5-mock.yaml --open 'test/integration/opaTests.qunit.html'",
"start-variants-management": "fiori run --open \"preview.html#app-preview\"",
"unit-test": "fiori run --config ./ui5-mock.yaml --open 'test/unit/unitTests.qunit.html'"
},
"sapuxLayer": "CUSTOMER_BASE"
}

47
ui5-local.yaml Normal file
View File

@ -0,0 +1,47 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "3.1"
metadata:
name: restaurant.z00124ss25restaurant
type: application
framework:
name: SAPUI5
version: 1.108.33
libraries:
- name: sap.m
- name: sap.ui.core
- name: sap.ushell
- name: themelib_sap_horizon
server:
customMiddleware:
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertError: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
backend:
- path: /sap
url: https://s40lp1.ucc.cit.tum.de
client: '300'
- name: sap-fe-mockserver
beforeMiddleware: csp
configuration:
mountPath: /
services:
- urlPath: /sap/opu/odata/sap/Z_00_124_SS25_RES_SRV
metadataPath: ./webapp/localService/mainService/metadata.xml
mockdataPath: ./webapp/localService/mainService/data
generateMockData: true
annotations:
- localPath: ./webapp/localService/mainService/Z_00_124_SS25_RES_SRV_VAN.xml
urlPath: /sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='Z_00_124_SS25_RES_SRV_VAN',Version='0001')/$value/

44
ui5-mock.yaml Normal file
View File

@ -0,0 +1,44 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "3.1"
metadata:
name: restaurant.z00124ss25restaurant
type: application
server:
customMiddleware:
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertError: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
ui5:
path:
- /resources
- /test-resources
url: https://ui5.sap.com
backend:
- path: /sap
url: https://s40lp1.ucc.cit.tum.de
client: '300'
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon
- name: sap-fe-mockserver
beforeMiddleware: csp
configuration:
mountPath: /
services:
- urlPath: /sap/opu/odata/sap/Z_00_124_SS25_RES_SRV
metadataPath: ./webapp/localService/mainService/metadata.xml
mockdataPath: ./webapp/localService/mainService/data
generateMockData: true
annotations:
- localPath: ./webapp/localService/mainService/Z_00_124_SS25_RES_SRV_VAN.xml
urlPath: /sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='Z_00_124_SS25_RES_SRV_VAN',Version='0001')/$value/

32
ui5.yaml Normal file
View File

@ -0,0 +1,32 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "3.1"
metadata:
name: restaurant.z00124ss25restaurant
type: application
server:
customMiddleware:
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertError: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
ui5:
path:
- /resources
- /test-resources
url: https://ui5.sap.com
backend:
- path: /sap
url: https://s40lp1.ucc.cit.tum.de
client: '300'
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon

35
webapp/Component.js Normal file
View File

@ -0,0 +1,35 @@
/**
* eslint-disable @sap/ui5-jsdocs/no-jsdoc
*/
sap.ui.define([
"sap/ui/core/UIComponent",
"sap/ui/Device",
"restaurant/z00124ss25restaurant/model/models"
],
function (UIComponent, Device, models) {
"use strict";
return UIComponent.extend("restaurant.z00124ss25restaurant.Component", {
metadata: {
manifest: "json"
},
/**
* The component is initialized by UI5 automatically during the startup of the app and calls the init method once.
* @public
* @override
*/
init: function () {
// call the base component's init function
UIComponent.prototype.init.apply(this, arguments);
// enable routing
this.getRouter().initialize();
// set the device model
this.setModel(models.createDeviceModel(), "device");
}
});
}
);

View File

@ -0,0 +1,14 @@
sap.ui.define(
[
"sap/ui/core/mvc/Controller"
],
function(BaseController) {
"use strict";
return BaseController.extend("restaurant.z00124ss25restaurant.controller.App", {
onInit: function() {
}
});
}
);

View File

@ -0,0 +1,392 @@
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageBox",
"sap/ui/model/Filter",
"sap/ui/model/FilterOperator"
], function (Controller, MessageBox, Filter, FilterOperator) {
"use strict";
return Controller.extend("restaurant.z00124ss25restaurant.controller.managerReservation", {
onInit: function () {
var oDataForChart = {
totalReservations: 0,
totalRevenue: "35,918.29",
monthlyData: [
{ Month: "Jan", Count: 20, Revenue: 5000 },
{ Month: "Feb", Count: 30, Revenue: 7000 },
{ Month: "Mar", Count: 25, Revenue: 6000 },
{ Month: "Apr", Count: 15, Revenue: 3500 },
{ Month: "May", Count: 10, Revenue: 2000 },
{ Month: "Jun", Count: 20, Revenue: 7500 }
]
};
var oDashboardModel = new sap.ui.model.json.JSONModel(oDataForChart);
this.getView().setModel(oDashboardModel, "dashboard");
this._loadReservationCount();
},
_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;
},
onModelRefresh: function () {
var oTable = this.byId("reservationTable");
oTable.getBinding().refresh(true);
},
formatDimensions: function (sWidth, sHeight, sDepth, sUnit) {
if (sWidth && sHeight && sDepth && sUnit) {
return sWidth + "x" + sHeight + "x" + sDepth + " " + (sUnit.toLowerCase());
}
return null;
},
initBindingEventHandler: function () {
const oBusyIndicator = this.oBusyIndicator;
const oTable = this.getTable();
const oBinding = oTable.getBinding();
oBinding.attachDataRequested(function () {
oTable.setNoData(oBusyIndicator);
});
oBinding.attachDataReceived(function () {
oTable.setNoData(null); //Use default again ("No Data" in case no data is available)
});
},
_resetForm: function () {
this.byId("decoration").setSelectedKey("");
this.byId("location").setSelectedKey("");
this.byId("numofseats").setValue(1);
},
onCreateTable: function () {
var iNumberOfSeats = this.byId("numofseats").getValue();
var sDecoration = this.byId("decoration").getSelectedKey();
var sLocation = this.byId("location").getSelectedKey();
if (!iNumberOfSeats) {
MessageBox.error("Please enter number of seats");
return;
}
if (!sDecoration) {
MessageBox.error("Please select a decoration for the table");
return;
}
if (!sLocation) {
MessageBox.error("Please select a location for the table");
return;
}
var oPayload = {
NumberOfSeats: iNumberOfSeats,
Location: sLocation,
Decoration: sDecoration
};
var oModel = this.getOwnerComponent().getModel();
// Show busy indicator
this.getView().setBusy(true);
var endPoint = "/tablePos";
oModel.create(endPoint, oPayload, {
success: function (oData, oResponse) {
this.getView().setBusy(false);
MessageBox.success("Table 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 Table";
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)
});
},
onEditTable: function (oEvent) {
const oContext = oEvent.getSource().getBindingContext();
if (!oContext) return;
const oData = oContext.getObject();
// Create dialog only once
if (!this._oEditDialog) {
this._oEditDialog = new sap.m.Dialog({
title: "Edit Table",
contentWidth: "400px",
content: new sap.ui.layout.form.SimpleForm({
editable: true,
content: [
new sap.m.Label({ text: "Table ID" }),
new sap.m.Input({ value: "{/TableId}", enabled: false }),
new sap.m.Label({ text: "Decoration" }),
new sap.m.Input({ value: "{/Decoration}" }),
new sap.m.Label({ text: "Location" }),
new sap.m.Input({ value: "{/Location}" }),
new sap.m.Label({ text: "Seats" }),
new sap.m.StepInput({ value: "{/NumberOfSeats}", min: 1, max: 12 })
]
}),
buttons: [
new sap.m.Button({
text: "Save",
type: "Emphasized",
press: function () {
var oDialogModel = this._oEditDialog.getModel();
var oUpdatedData = oDialogModel.getData();
var oModel = this.getView().getModel();
var endPoint = "/tablePos('" + this._padAndEncodeId(oUpdatedData.TableId.trim()) + "')";
var oPayload = {
Decoration: oUpdatedData.Decoration,
Location: oUpdatedData.Location,
NumberOfSeats: oUpdatedData.NumberOfSeats
};
this.getView().setBusy(true);
oModel.update(endPoint, oPayload, {
success: function () {
this.getView().setBusy(false);
sap.m.MessageToast.show("Table updated successfully!");
this._oEditDialog.close();
this._oEditDialog.destroy();
this._oEditDialog = null;
}.bind(this),
error: function (oError) {
this.getView().setBusy(false);
sap.m.MessageBox.error("Failed to update table.");
console.error(oError);
}.bind(this)
});
}.bind(this)
}),
new sap.m.Button({
text: "Delete",
type: "Reject",
press: function () {
sap.m.MessageBox.confirm("Are you sure you want to delete this table?", {
onClose: function (sAction) {
if (sAction === sap.m.MessageBox.Action.OK) {
this._deleteTable();
}
}.bind(this)
});
}.bind(this)
}),
new sap.m.Button({
text: "Cancel",
press: function () {
this._oEditDialog.close();
}.bind(this)
})
],
afterClose: function () {
if (this._oEditDialog) {
this._oEditDialog.destroy();
this._oEditDialog = null;
}
}.bind(this)
});
}
// Bind a JSON model copy to dialog to avoid direct changes before save
const oTableData = Object.assign({}, oData);
const oDialogModel = new sap.ui.model.json.JSONModel(oTableData);
this._oEditDialog.setModel(oDialogModel);
this._oEditDialog.bindElement("/");
this._oEditDialog.open();
},
_deleteTable: function () {
var oDialogModel = this._oEditDialog.getModel();
var oData = oDialogModel.getData();
var oModel = this.getView().getModel();
var sPath = "/tablePos('" + this._padAndEncodeId(oData.TableId.trim()) + "')";
this.getView().setBusy(true);
oModel.remove(sPath, {
success: function () {
this.getView().setBusy(false);
sap.m.MessageToast.show("Table deleted successfully!");
this._oEditDialog.close();
}.bind(this),
error: function (oError) {
this.getView().setBusy(false);
sap.m.MessageBox.error("Failed to delete table.");
console.error(oError);
}.bind(this)
});
},
onSearchLiveChange: function (oEvent) {
// Get the search query
var sQuery = oEvent.getParameter("newValue");
var oTable = this.byId("reservationTable");
var oBinding = oTable.getBinding("rows");
// Apply filters
if (sQuery && sQuery.length > 0) {
var aFilters = [
new Filter("ReservationName", FilterOperator.Contains, sQuery)
];
oBinding.filter(new Filter({
filters: aFilters,
and: false
}));
} else {
// Clear filters if search field is empty
oBinding.filter([]);
}
},
onModelRefresh: function () {
var oModel = this.getView().getModel();
oModel.refresh(true); // Hard refresh from the server
},
/**
* Formats a date to show only year, month, and day (YYYY-MM-DD)
* @param {object} oDate - Date object or date string
* @returns {string} Formatted date string
*/
formatDate: function (oDate) {
if (!oDate) {
return "";
}
// Convert string to date object if needed
var dateObj = (typeof oDate === "string") ? new Date(oDate) : oDate;
if (isNaN(dateObj.getTime())) {
return "";
}
// Format as YYYY-MM-DD
var year = dateObj.getFullYear();
var month = String(dateObj.getMonth() + 1).padStart(2, '0');
var day = String(dateObj.getDate()).padStart(2, '0');
return year + "-" + month + "-" + day;
},
/**
* Formats a time to show in HH:MM:SS format
* @param {object} oTime - Time object, date object, or time string
* @returns {string} Formatted time string
*/
formatTime: function (oTime) {
if (!oTime) {
return "";
}
// Handle OData Edm.Time object which contains ms property
if (oTime && typeof oTime === "object" && oTime.ms !== undefined && oTime.__edmType === "Edm.Time") {
// Calculate hours, minutes, seconds from milliseconds
var totalSeconds = Math.floor(oTime.ms / 1000);
var hours = Math.floor(totalSeconds / 3600);
var minutes = Math.floor((totalSeconds % 3600) / 60);
var seconds = totalSeconds % 60;
// Format as HH:MM:SS
return String(hours).padStart(2, '0') + ":" +
String(minutes).padStart(2, '0') + ":" +
String(seconds).padStart(2, '0');
}
var timeObj;
// Handle other input types
if (typeof oTime === "string") {
// Try parsing as time string (like "14:30:00")
if (oTime.indexOf(":") !== -1) {
var parts = oTime.split(":");
timeObj = new Date();
timeObj.setHours(parseInt(parts[0], 10));
timeObj.setMinutes(parts.length > 1 ? parseInt(parts[1], 10) : 0);
timeObj.setSeconds(parts.length > 2 ? parseInt(parts[2], 10) : 0);
} else {
// Try parsing as date string
timeObj = new Date(oTime);
}
} else if (oTime instanceof Date) {
timeObj = oTime;
} else {
return ""; // Unsupported format
}
if (isNaN(timeObj.getTime())) {
return "";
}
// Format as HH:MM:SS
var hours = String(timeObj.getHours()).padStart(2, '0');
var minutes = String(timeObj.getMinutes()).padStart(2, '0');
var seconds = String(timeObj.getSeconds()).padStart(2, '0');
return hours + ":" + minutes + ":" + seconds;
},
_loadReservationCount: function () {
var oODataModel = this.getOwnerComponent().getModel();
// Show busy indicator
var oDashboardModel = this.getView().getModel("dashboard");
// Read count directly from the $count endpoint
oODataModel.read("/reservationPos/$count", {
success: function (count) {
// count is a number (integer)
oDashboardModel.setProperty("/totalReservations", count);
},
error: function (oError) {
console.error("Failed to fetch reservation count", oError);
}
});
}
});
});

View File

@ -0,0 +1,266 @@
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
}
}
});
});

35
webapp/css/style.css Normal file
View File

@ -0,0 +1,35 @@
/* Enter your custom styles here */
.dashboardCardReservation,
.dashboardCardRevenue {
padding: 1.5rem !important;
}
.dashboardCardReservation {
background-color: #b5f488e1; /* blue background */
padding: 1rem;
border-radius: 8px;
color: white; /* text color */
box-shadow: 0 2px 4px #ffffff26;
width: 50%;
height: auto;
}
.dashboardCardRevenue {
background-color: #67befcce; /* blue background */
padding: 1rem;
border-radius: 8px;
color: white; /* text color */
box-shadow: 0 2px 4px #ffffff26;
width: 50%;
height: auto;
}
.dashboardCardFontLarge {
font-size: 1.4rem !important; /* or any size you want */
font-weight: bold; /* optional */
height:auto;
}
.dashboardCardFontSmall{
font-size: 0.7rem !important; /* or any size you want */
font-weight: bold; /* optional */
height: auto;
}

View File

@ -0,0 +1,11 @@
# This is the resource bundle for restaurant.z00124ss25restaurant
#Texts for manifest.json
#XTIT: Application name
appTitle=Restaurant Management
#YDES: Application description
appDescription=restaurant application
#XTIT: Main view title
title=Restaurant

35
webapp/index copy.html Normal file
View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>restaurant</title>
<style>
html, body, body > div, #container, #container-uiarea {
height: 100%;
}
</style>
<script
id="sap-ui-bootstrap"
src="resources/sap-ui-core.js"
data-sap-ui-theme="sap_horizon"
data-sap-ui-resourceroots='{
"restaurant.z00124ss25restaurant": "./"
}'
data-sap-ui-oninit="module:sap/ui/core/ComponentSupport"
data-sap-ui-compatVersion="edge"
data-sap-ui-async="true"
data-sap-ui-frameOptions="trusted"
></script>
</head>
<body class="sapUiBody sapUiSizeCompact" id="content">
<div
data-sap-ui-component
data-name="restaurant.z00124ss25restaurant"
data-id="container"
data-settings='{"id" : "restaurant.z00124ss25restaurant"}'
data-handle-validation="true"
></div>
</body>
</html>

35
webapp/index.html Normal file
View File

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>restaurant</title>
<style>
html, body, body > div, #container, #container-uiarea {
height: 100%;
}
</style>
<script
id="sap-ui-bootstrap"
src="resources/sap-ui-core.js"
data-sap-ui-theme="sap_horizon"
data-sap-ui-resourceroots='{
"restaurant.z00124ss25restaurant": "./"
}'
data-sap-ui-oninit="module:sap/ui/core/ComponentSupport"
data-sap-ui-compatVersion="edge"
data-sap-ui-async="true"
data-sap-ui-frameOptions="trusted"
></script>
</head>
<body class="sapUiBody sapUiSizeCompact" id="content">
<div
data-sap-ui-component
data-name="restaurant.z00124ss25restaurant"
data-id="container"
data-settings='{"id" : "restaurant.z00124ss25restaurant"}'
data-handle-validation="true"
></div>
</body>
</html>

View File

@ -0,0 +1,273 @@
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_COMMON',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_UI',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.UI.v1" Alias="UI"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_COMMUNICATION',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.Communication.v1" Alias="Communication"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_PERSONALDATA',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.PersonalData.v1" Alias="PersonalData"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_VALIDATION',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="Org.OData.Validation.V1" Alias="Validation"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_ANALYTICS',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.Analytics.v1" Alias="Analytics"/>
</edmx:Reference>
<edmx:Reference Uri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_HTML5',Version='0001',SAP__Origin='')/$value">
<edmx:Include Namespace="com.sap.vocabularies.HTML5.v1" Alias="HTML5"/>
</edmx:Reference>
<edmx:Reference Uri="../../../sap/z_00_124_ss25_res_srv/$metadata">
<edmx:Include Namespace="Z_00_124_SS25_RES_SRV" Alias="SAP"/>
</edmx:Reference>
<edmx:DataServices>
<Schema Namespace="z_00_124_ss25_res_srv_van.v1" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType">
<Annotation Term="UI.HeaderFacets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="HeaderFacet"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Fieldgroup:HeaderItems"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.Facets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="tableid"/>
<PropertyValue Property="Target" AnnotationPath="@UI.Identification"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.FieldGroup" Qualifier="Fieldgroup:HeaderItems">
<Record>
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Table Id"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Reservation Id"/>
<PropertyValue Property="Value" Path="ReservationId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="ReservationName"/>
<PropertyValue Property="Value" Path="ReservationName"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.HeaderInfo">
<Record>
<PropertyValue Property="TypeName" String="Reservation Document"/>
<PropertyValue Property="TypeNamePlural" String="Reservation Documents"/>
<PropertyValue Property="Title">
<Record Type="UI.DataFieldWithNavigationPath">
<PropertyValue Property="Label" String="Reservation Documents"/>
<PropertyValue Property="Value" Path="ReservationId"/>
<PropertyValue Property="Target" String="">
<Annotation Term="Core.Messages">
<Collection>
<Record>
<PropertyValue Property="message" String="ERROR: Invalid Path"/>
<PropertyValue Property="severity" String="error"/>
</Record>
</Collection>
</Annotation>
</PropertyValue>
</Record>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.Identification">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Table Id"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Reservation Id"/>
<PropertyValue Property="Value" Path="ReservationId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Number of Guests"/>
<PropertyValue Property="Value" Path="NumOfGuests"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="ReservationName"/>
<PropertyValue Property="Value" Path="ReservationName"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="CommentSection"/>
<PropertyValue Property="Value" Path="CommentSection"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedTime"/>
<PropertyValue Property="Value" Path="BookedTime"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedDate"/>
<PropertyValue Property="Value" Path="BookedDate"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedPeriod"/>
<PropertyValue Property="Value" Path="BookedPeriod"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.LineItem">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Table Id"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Reservation Id"/>
<PropertyValue Property="Value" Path="ReservationId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Number of Guests"/>
<PropertyValue Property="Value" Path="NumOfGuests"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="ReservationName"/>
<PropertyValue Property="Value" Path="ReservationName"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="CommentSection"/>
<PropertyValue Property="Value" Path="CommentSection"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedTime"/>
<PropertyValue Property="Value" Path="BookedTime"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedDate"/>
<PropertyValue Property="Value" Path="BookedDate"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="BookedPeriod"/>
<PropertyValue Property="Value" Path="BookedPeriod"/>
</Record>
</Collection>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.tablePosType">
<Annotation Term="UI.HeaderFacets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="HeaderFacet"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Fieldgroup:HeaderItems"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.Facets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="Label" String="Overview"/>
<PropertyValue Property="ID" String="TableID"/>
<PropertyValue Property="Target" AnnotationPath="@UI.Identification"/>
</Record>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="Label" String="Positions"/>
<PropertyValue Property="ID" String="positions"/>
<PropertyValue Property="Target" AnnotationPath="to_rese/@UI.LineItem"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.FieldGroup" Qualifier="Fieldgroup:HeaderItems">
<Record>
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Billing
Document"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Decoration"/>
<PropertyValue Property="Value" Path="Decoration"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.HeaderInfo">
<Record>
<PropertyValue Property="TypeName" String="Table Document"/>
<PropertyValue Property="TypeNamePlural" String="Table Documents"/>
<PropertyValue Property="Title">
<Record Type="UI.DataFieldWithNavigationPath">
<PropertyValue Property="Label" String="Table Document Details"/>
<PropertyValue Property="Value" Path="TableId"/>
<PropertyValue Property="Target" String="">
<Annotation Term="Core.Messages">
<Collection>
<Record>
<PropertyValue Property="message" String="ERROR: Invalid Path"/>
<PropertyValue Property="severity" String="error"/>
</Record>
</Collection>
</Annotation>
</PropertyValue>
</Record>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.Identification">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Table ID"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Decoration"/>
<PropertyValue Property="Value" Path="Decoration"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Location"/>
<PropertyValue Property="Value" Path="Location"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="NumberOfSeats"/>
<PropertyValue Property="Value" Path="NumberOfSeats"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.LineItem">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Table ID"/>
<PropertyValue Property="Value" Path="TableId"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Decoration"/>
<PropertyValue Property="Value" Path="Decoration"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="Location"/>
<PropertyValue Property="Value" Path="Location"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Label" String="NumberOfSeats"/>
<PropertyValue Property="Value" Path="NumberOfSeats"/>
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.SelectionFields">
<Collection>
<PropertyPath>TableId</PropertyPath>
<PropertyPath>Decoration</PropertyPath>
<PropertyPath>Location</PropertyPath>
</Collection>
</Annotation>
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

View File

@ -0,0 +1,562 @@
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData">
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_AGGREGATION',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="Org.OData.Aggregation.V1" Alias="Aggregation"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_ANALYTICS',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.Analytics.v1" Alias="Analytics"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_CAPABILITIES',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="Org.OData.Capabilities.V1" Alias="Capabilities"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_CODELIST',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.CodeList.v1" Alias="SAP__CodeList"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_COMMON',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common"/>
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="SAP__common"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_COMMUNICATION',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.Communication.v1" Alias="Communication"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_CORE',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="Org.OData.Core.V1" Alias="SAP__core"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_MEASURES',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="Org.OData.Measures.V1" Alias="Measures"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_PDF',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.PDF.v1" Alias="SAP__PDF"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_PERSONALDATA',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.PersonalData.v1" Alias="PersonalData"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_UI',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.UI.v1" Alias="UI"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_VALIDATION',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="Org.OData.Validation.V1" Alias="Validation"/>
</edmx:Reference>
<edmx:Reference Uri="./sap/opu/odata/iwfnd/catalogservice;v=2/Vocabularies(TechnicalName='SAP__SELF',Version='0001',SAP__Origin='')/$value" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Include Namespace="com.sap.vocabularies.PDF.v1" Alias="SAP__PDF"/>
</edmx:Reference>
<edmx:DataServices m:DataServiceVersion="2.0">
<Schema Namespace="cds_z00124ss25_restaurant" xml:lang="en" sap:schema-version="1" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
<Annotation Term="Core.SchemaVersion" String="1.0.0" xmlns="http://docs.oasis-open.org/odata/ns/edm"/>
<EntityType Name="reservationPosType" sap:label="Consumsion datadefiniton of Reservation" sap:content-version="1">
<Key>
<PropertyRef Name="ReservationId"/>
<PropertyRef Name="TableId"/>
</Key>
<Property Name="ReservationId" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:quickinfo="16 Byte UUID in 16 Bytes (Raw Format)" sap:creatable="false" sap:updatable="false"/>
<Property Name="TableId" Type="Edm.String" Nullable="false" MaxLength="10" sap:display-format="UpperCase" sap:label="Tablee ID" sap:quickinfo="Tablee data element" sap:creatable="false" sap:updatable="false" sap:value-list="standard"/>
<Property Name="NumOfGuests" Type="Edm.Int16"/>
<Property Name="ReservationName" Type="Edm.String" MaxLength="30"/>
<Property Name="CommentSection" Type="Edm.String" MaxLength="50"/>
<Property Name="BookedDate" Type="Edm.DateTime" Precision="0" sap:display-format="Date"/>
<Property Name="BookedTime" Type="Edm.Time" Precision="0"/>
<Property Name="BookedPeriod" Type="Edm.Int16"/>
<NavigationProperty Name="to_tabe" Relationship="cds_z00124ss25_restaurant.assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" FromRole="ToRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" ToRole="FromRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987"/>
</EntityType>
<EntityType Name="tablePosType" sap:label="Table Consumption Data Defitnion" sap:content-version="1">
<Key>
<PropertyRef Name="TableId"/>
</Key>
<Property Name="TableId" Type="Edm.String" Nullable="false" MaxLength="10" sap:display-format="UpperCase" sap:label="Tablee ID" sap:quickinfo="Tablee data element" sap:creatable="false" sap:updatable="false"/>
<Property Name="Decoration" Type="Edm.String" MaxLength="10" sap:display-format="UpperCase" sap:label="Decoration Value" sap:quickinfo="Deco Element" sap:value-list="fixed-values"/>
<Property Name="Location" Type="Edm.String" MaxLength="10" sap:display-format="UpperCase" sap:label="Location Domain" sap:quickinfo="Location Element" sap:value-list="fixed-values"/>
<Property Name="NumberOfSeats" Type="Edm.Int16"/>
<NavigationProperty Name="to_rese" Relationship="cds_z00124ss25_restaurant.assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" FromRole="FromRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" ToRole="ToRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987"/>
</EntityType>
<EntityType Name="Z_00_124_SS25_DECOType" sap:label="Decoration Datdefiinition" sap:value-list="true" sap:content-version="1">
<Key>
<PropertyRef Name="Decoration"/>
</Key>
<Property Name="Decoration" Type="Edm.String" Nullable="false" MaxLength="10" sap:display-format="UpperCase" sap:label="Decoration Value" sap:quickinfo="Deco Element"/>
</EntityType>
<EntityType Name="Z_00_124_SS25_LOCType" sap:label="Location Data Definition" sap:value-list="true" sap:content-version="1">
<Key>
<PropertyRef Name="Location"/>
</Key>
<Property Name="Location" Type="Edm.String" Nullable="false" MaxLength="10" sap:display-format="UpperCase" sap:label="Location Domain" sap:quickinfo="Location Element"/>
</EntityType>
<EntityType Name="SAP__Currency" sap:content-version="1">
<Key>
<PropertyRef Name="CurrencyCode"/>
</Key>
<Property Name="CurrencyCode" Type="Edm.String" Nullable="false" MaxLength="5" sap:label="Currency" sap:semantics="currency-code"/>
<Property Name="ISOCode" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="ISO code"/>
<Property Name="Text" Type="Edm.String" Nullable="false" MaxLength="15" sap:label="Short text"/>
<Property Name="DecimalPlaces" Type="Edm.Byte" Nullable="false" sap:label="Decimals"/>
</EntityType>
<EntityType Name="SAP__UnitOfMeasure" sap:content-version="1">
<Key>
<PropertyRef Name="UnitCode"/>
</Key>
<Property Name="UnitCode" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="Internal UoM" sap:semantics="unit-of-measure"/>
<Property Name="ISOCode" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="ISO Code"/>
<Property Name="ExternalCode" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="Commercial"/>
<Property Name="Text" Type="Edm.String" Nullable="false" MaxLength="30" sap:label="Measurement Unit Txt"/>
<Property Name="DecimalPlaces" Type="Edm.Int16" sap:label="Decimal Places"/>
</EntityType>
<EntityType Name="SAP__DocumentDescription" sap:content-version="1">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID"/>
<Property Name="CreatedBy" Type="Edm.String" Nullable="false" MaxLength="12"/>
<Property Name="CreatedAt" Type="Edm.DateTime" Nullable="false" Precision="0" sap:label="Time Stamp"/>
<Property Name="FileName" Type="Edm.String" Nullable="false" MaxLength="256"/>
<Property Name="Title" Type="Edm.String" Nullable="false" MaxLength="256"/>
<NavigationProperty Name="Format" Relationship="cds_z00124ss25_restaurant.to_format" FromRole="FromRole_to_format" ToRole="ToRole_to_format"/>
<NavigationProperty Name="TableColumns" Relationship="cds_z00124ss25_restaurant.to_tablecolumns" FromRole="FromRole_to_tablecolumns" ToRole="ToRole_to_tablecolumns"/>
<NavigationProperty Name="CoverPage" Relationship="cds_z00124ss25_restaurant.to_coverpage" FromRole="FromRole_to_coverpage" ToRole="ToRole_to_coverpage"/>
<NavigationProperty Name="Signature" Relationship="cds_z00124ss25_restaurant.to_signature" FromRole="FromRole_to_signature" ToRole="ToRole_to_signature"/>
<NavigationProperty Name="PDFStandard" Relationship="cds_z00124ss25_restaurant.to_pdfstandard" FromRole="FromRole_to_pdfstandard" ToRole="ToRole_to_pdfstandard"/>
</EntityType>
<EntityType Name="SAP__Format" sap:content-version="1">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="FitToPage" Type="cds_z00124ss25_restaurant.SAP__FitToPage" Nullable="false"/>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="FontSize" Type="Edm.Int32" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Orientation" Type="Edm.String" Nullable="false" MaxLength="10" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="PaperSize" Type="Edm.String" Nullable="false" MaxLength="10" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="BorderSize" Type="Edm.Int32" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="MarginSize" Type="Edm.Int32" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="FontName" Type="Edm.String" Nullable="false" MaxLength="255" sap:label="Font Name" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</EntityType>
<EntityType Name="SAP__PDFStandard" sap:content-version="1">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="UsePDFAConformance" Type="Edm.Boolean" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="DoEnableAccessibility" Type="Edm.Boolean" Nullable="false" sap:label="Indicator" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</EntityType>
<EntityType Name="SAP__TableColumns" sap:content-version="1">
<Key>
<PropertyRef Name="Id"/>
<PropertyRef Name="Name"/>
<PropertyRef Name="Header"/>
</Key>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Header" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="HorizontalAlignment" Type="Edm.String" Nullable="false" MaxLength="10" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</EntityType>
<EntityType Name="SAP__CoverPage" sap:content-version="1">
<Key>
<PropertyRef Name="Title"/>
<PropertyRef Name="Id"/>
<PropertyRef Name="Name"/>
</Key>
<Property Name="Title" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Value" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</EntityType>
<EntityType Name="SAP__Signature" sap:content-version="1">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Guid" Nullable="false" sap:label="UUID" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="DoSign" Type="Edm.Boolean" Nullable="false" sap:label="Indicator" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="Reason" Type="Edm.String" Nullable="false" MaxLength="256" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</EntityType>
<EntityType Name="SAP__ValueHelp" sap:content-version="1">
<Key>
<PropertyRef Name="VALUEHELP"/>
</Key>
<Property Name="VALUEHELP" Type="Edm.String" Nullable="false"/>
<Property Name="FIELD_VALUE" Type="Edm.String" Nullable="false" MaxLength="10"/>
<Property Name="DESCRIPTION" Type="Edm.String"/>
</EntityType>
<ComplexType Name="SAP__FitToPage">
<Property Name="ErrorRecoveryBehavior" Type="Edm.String" Nullable="false" MaxLength="8" sap:label="Error behavior" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="IsEnabled" Type="Edm.Boolean" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
<Property Name="MinimumFontSize" Type="Edm.Int32" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false"/>
</ComplexType>
<Association Name="assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.tablePosType" Multiplicity="1" Role="FromRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987">
<OnDelete Action="Cascade"/>
</End>
<End Type="cds_z00124ss25_restaurant.reservationPosType" Multiplicity="*" Role="ToRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987"/>
<ReferentialConstraint>
<Principal Role="FromRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987">
<PropertyRef Name="TableId"/>
</Principal>
<Dependent Role="ToRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987">
<PropertyRef Name="TableId"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="to_format" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.SAP__DocumentDescription" Multiplicity="1" Role="FromRole_to_format"/>
<End Type="cds_z00124ss25_restaurant.SAP__Format" Multiplicity="1" Role="ToRole_to_format"/>
<ReferentialConstraint>
<Principal Role="FromRole_to_format">
<PropertyRef Name="Id"/>
</Principal>
<Dependent Role="ToRole_to_format">
<PropertyRef Name="Id"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="to_tablecolumns" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.SAP__DocumentDescription" Multiplicity="1" Role="FromRole_to_tablecolumns"/>
<End Type="cds_z00124ss25_restaurant.SAP__TableColumns" Multiplicity="*" Role="ToRole_to_tablecolumns"/>
<ReferentialConstraint>
<Principal Role="FromRole_to_tablecolumns">
<PropertyRef Name="Id"/>
</Principal>
<Dependent Role="ToRole_to_tablecolumns">
<PropertyRef Name="Id"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="to_coverpage" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.SAP__DocumentDescription" Multiplicity="1" Role="FromRole_to_coverpage"/>
<End Type="cds_z00124ss25_restaurant.SAP__CoverPage" Multiplicity="*" Role="ToRole_to_coverpage"/>
<ReferentialConstraint>
<Principal Role="FromRole_to_coverpage">
<PropertyRef Name="Id"/>
</Principal>
<Dependent Role="ToRole_to_coverpage">
<PropertyRef Name="Id"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="to_signature" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.SAP__DocumentDescription" Multiplicity="1" Role="FromRole_to_signature"/>
<End Type="cds_z00124ss25_restaurant.SAP__Signature" Multiplicity="1" Role="ToRole_to_signature"/>
<ReferentialConstraint>
<Principal Role="FromRole_to_signature">
<PropertyRef Name="Id"/>
</Principal>
<Dependent Role="ToRole_to_signature">
<PropertyRef Name="Id"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="to_pdfstandard" sap:content-version="1">
<End Type="cds_z00124ss25_restaurant.SAP__DocumentDescription" Multiplicity="1" Role="FromRole_to_pdfstandard"/>
<End Type="cds_z00124ss25_restaurant.SAP__PDFStandard" Multiplicity="1" Role="ToRole_to_pdfstandard"/>
<ReferentialConstraint>
<Principal Role="FromRole_to_pdfstandard">
<PropertyRef Name="Id"/>
</Principal>
<Dependent Role="ToRole_to_pdfstandard">
<PropertyRef Name="Id"/>
</Dependent>
</ReferentialConstraint>
</Association>
<EntityContainer Name="cds_z00124ss25_restaurant_Entities" m:IsDefaultEntityContainer="true" sap:message-scope-supported="true" sap:supported-formats="atom json xlsx pdf">
<EntitySet Name="SAP__Currencies" EntityType="cds_z00124ss25_restaurant.SAP__Currency" sap:content-version="1"/>
<EntitySet Name="SAP__UnitsOfMeasure" EntityType="cds_z00124ss25_restaurant.SAP__UnitOfMeasure" sap:content-version="1"/>
<EntitySet Name="SAP__MyDocumentDescriptions" EntityType="cds_z00124ss25_restaurant.SAP__DocumentDescription" sap:content-version="1"/>
<EntitySet Name="SAP__FormatSet" EntityType="cds_z00124ss25_restaurant.SAP__Format" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1"/>
<EntitySet Name="SAP__PDFStandardSet" EntityType="cds_z00124ss25_restaurant.SAP__PDFStandard" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1"/>
<EntitySet Name="SAP__TableColumnsSet" EntityType="cds_z00124ss25_restaurant.SAP__TableColumns" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1"/>
<EntitySet Name="SAP__CoverPageSet" EntityType="cds_z00124ss25_restaurant.SAP__CoverPage" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1"/>
<EntitySet Name="SAP__SignatureSet" EntityType="cds_z00124ss25_restaurant.SAP__Signature" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:pageable="false" sap:addressable="false" sap:content-version="1"/>
<EntitySet Name="SAP__ValueHelpSet" EntityType="cds_z00124ss25_restaurant.SAP__ValueHelp" sap:content-version="1"/>
<EntitySet Name="reservationPos" EntityType="cds_z00124ss25_restaurant.reservationPosType" sap:content-version="1"/>
<EntitySet Name="tablePos" EntityType="cds_z00124ss25_restaurant.tablePosType" sap:content-version="1"/>
<EntitySet Name="Z_00_124_SS25_DECO" EntityType="cds_z00124ss25_restaurant.Z_00_124_SS25_DECOType" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1"/>
<EntitySet Name="Z_00_124_SS25_LOC" EntityType="cds_z00124ss25_restaurant.Z_00_124_SS25_LOCType" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1"/>
<AssociationSet Name="assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" Association="cds_z00124ss25_restaurant.assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="tablePos" Role="FromRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987"/>
<End EntitySet="reservationPos" Role="ToRole_assoc_C5BBE7D3C6BD80AD3FA4BAAEFF61E987"/>
</AssociationSet>
<AssociationSet Name="to_formatSet" Association="cds_z00124ss25_restaurant.to_format" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="SAP__MyDocumentDescriptions" Role="FromRole_to_format"/>
<End EntitySet="SAP__FormatSet" Role="ToRole_to_format"/>
</AssociationSet>
<AssociationSet Name="to_pdfstandardSet" Association="cds_z00124ss25_restaurant.to_pdfstandard" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="SAP__MyDocumentDescriptions" Role="FromRole_to_pdfstandard"/>
<End EntitySet="SAP__PDFStandardSet" Role="ToRole_to_pdfstandard"/>
</AssociationSet>
<AssociationSet Name="to_tablecolumnsSet" Association="cds_z00124ss25_restaurant.to_tablecolumns" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="SAP__MyDocumentDescriptions" Role="FromRole_to_tablecolumns"/>
<End EntitySet="SAP__TableColumnsSet" Role="ToRole_to_tablecolumns"/>
</AssociationSet>
<AssociationSet Name="to_signatureSet" Association="cds_z00124ss25_restaurant.to_signature" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="SAP__MyDocumentDescriptions" Role="FromRole_to_signature"/>
<End EntitySet="SAP__SignatureSet" Role="ToRole_to_signature"/>
</AssociationSet>
<AssociationSet Name="to_coverpageSet" Association="cds_z00124ss25_restaurant.to_coverpage" sap:creatable="false" sap:updatable="false" sap:deletable="false" sap:content-version="1">
<End EntitySet="SAP__MyDocumentDescriptions" Role="FromRole_to_coverpage"/>
<End EntitySet="SAP__CoverPageSet" Role="ToRole_to_coverpage"/>
</AssociationSet>
</EntityContainer>
<Annotations Target="cds_z00124ss25_restaurant.tablePosType/Decoration" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.ValueList">
<Record>
<PropertyValue Property="Label" String="Decoration Value"/>
<PropertyValue Property="CollectionPath" String="Z_00_124_SS25_DECO"/>
<PropertyValue Property="SearchSupported" Bool="false"/>
<PropertyValue Property="Parameters">
<Collection>
<Record Type="Common.ValueListParameterInOut">
<PropertyValue Property="LocalDataProperty" PropertyPath="Decoration"/>
<PropertyValue Property="ValueListProperty" String="Decoration"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="Common.ValueListWithFixedValues"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.tablePosType/Location" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.ValueList">
<Record>
<PropertyValue Property="Label" String="Location Domain"/>
<PropertyValue Property="CollectionPath" String="Z_00_124_SS25_LOC"/>
<PropertyValue Property="SearchSupported" Bool="false"/>
<PropertyValue Property="Parameters">
<Collection>
<Record Type="Common.ValueListParameterInOut">
<PropertyValue Property="LocalDataProperty" PropertyPath="Location"/>
<PropertyValue Property="ValueListProperty" String="Location"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="Common.ValueListWithFixedValues"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.cds_z00124ss25_restaurant_Entities" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.ApplyMultiUnitBehaviorForSortingAndFiltering" Bool="true"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.tablePosType/to_rese" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.Composition"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/BookedDate" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/BookedPeriod" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/BookedTime" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/CommentSection" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/NumOfGuests" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.reservationPosType/ReservationName" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.tablePosType/NumberOfSeats" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/Mandatory"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.cds_z00124ss25_restaurant_Entities/reservationPos" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Capabilities.NavigationRestrictions">
<Record>
<PropertyValue Property="RestrictedProperties">
<Collection>
<Record>
<PropertyValue Property="NavigationProperty" NavigationPropertyPath="to_tabe"/>
<PropertyValue Property="InsertRestrictions">
<Record>
<PropertyValue Property="Insertable" Bool="false"/>
</Record>
</PropertyValue>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="SAP__core.OptimisticConcurrency">
<Collection/>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.cds_z00124ss25_restaurant_Entities/tablePos" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Capabilities.NavigationRestrictions">
<Record>
<PropertyValue Property="RestrictedProperties">
<Collection>
<Record>
<PropertyValue Property="NavigationProperty" NavigationPropertyPath="to_rese"/>
<PropertyValue Property="InsertRestrictions">
<Record>
<PropertyValue Property="Insertable" Bool="true"/>
</Record>
</PropertyValue>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="SAP__core.OptimisticConcurrency">
<Collection/>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.cds_z00124ss25_restaurant_Entities" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="Org.OData.Capabilities.V1.BatchSupport">
<Record Type="Org.OData.Capabilities.V1.BatchSupportType">
<PropertyValue Property="ReferencesAcrossChangeSetsSupported" Bool="true"/>
</Record>
</Annotation>
<Annotation Term="SAP__CodeList.CurrencyCodes">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__Currencies"/>
</Record>
</Annotation>
<Annotation Term="SAP__CodeList.UnitsOfMeasure">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__UnitsOfMeasure"/>
</Record>
</Annotation>
<Annotation Term="SAP__PDF.Features">
<Record>
<PropertyValue Property="DocumentDescriptionReference" String="./$metadata"/>
<PropertyValue Property="DocumentDescriptionCollection" String="SAP__MyDocumentDescriptions"/>
<PropertyValue Property="ArchiveFormat" Bool="true"/>
<PropertyValue Property="CoverPage" Bool="true"/>
<PropertyValue Property="Signature" Bool="true"/>
<PropertyValue Property="FitToPage" Bool="true"/>
<PropertyValue Property="FontName" Bool="true"/>
<PropertyValue Property="FontSize" Bool="true"/>
<PropertyValue Property="Margin" Bool="true"/>
<PropertyValue Property="Border" Bool="true"/>
<PropertyValue Property="ResultSizeDefault" Int="20000"/>
<PropertyValue Property="ResultSizeMaximum" Int="20000"/>
</Record>
</Annotation>
<Annotation Term="SAP__CodeList.SAP__DocumentDescription">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__MyDocumentDescriptions"/>
</Record>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__Currency/CurrencyCode" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.Text" Path="Text"/>
<Annotation Term="SAP__common.UnitSpecificScale" Path="DecimalPlaces"/>
<Annotation Term="SAP__CodeList.StandardCode" Path="ISOCode"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__UnitOfMeasure/UnitCode" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.Text" Path="Text"/>
<Annotation Term="SAP__common.UnitSpecificScale" Path="DecimalPlaces"/>
<Annotation Term="SAP__CodeList.StandardCode" Path="ISOCode"/>
<Annotation Term="SAP__CodeList.ExternalCode" Path="ExternalCode"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__UnitOfMeasure" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__core.AlternateKeys">
<Collection>
<Record>
<PropertyValue Property="Key">
<Collection>
<Record>
<PropertyValue Property="Name" Path="ExternalCode"/>
<PropertyValue Property="Alias" String="ExternalCode"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Collection>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__DocumentDescription/CreatedBy" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__core.Computed"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__DocumentDescription/CreatedAt" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__core.Computed"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__DocumentDescription" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__capabilties.InsertRestrictions">
<Record>
<PropertyValue Property="Insertable" Bool="false"/>
</Record>
</Annotation>
<Annotation Term="SAP__capabilties.UpdateRestrictions">
<Record>
<PropertyValue Property="Updatable" Bool="false"/>
<PropertyValue Property="QueryOptions">
<Record>
<PropertyValue Property="SelectSupported" Bool="true"/>
</Record>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="SAP__capabilties.DeleteRestrictions">
<Record>
<PropertyValue Property="Deletable" Bool="false"/>
</Record>
</Annotation>
<Annotation Term="SAP__capabilties.FilterRestrictions">
<Record>
<PropertyValue Property="FilterExpressionRestrictions">
<Collection>
<Record>
<PropertyValue Property="Property" PropertyPath="Format/Orientation"/>
<PropertyValue Property="AllowedExpressions" String="Multivalue"/>
</Record>
<Record>
<PropertyValue Property="Property" PropertyPath="Format/PaperSize"/>
<PropertyValue Property="AllowedExpressions" String="Multivalue"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__Format/FitToPage/ErrorRecoveryBehavior" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.ValueListReferences">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="../../../../SAP__ValueHelpSet?$filter=VALUEHELP%20eq%20%27ErrorRecoveryBehaviour%27"/>
</Record>
</Annotation>
<Annotation Term="SAP__common.ValueListWithFixedValues"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__Format/FontName" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.ValueListReferences">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__ValueHelpSet?$filter=VALUEHELP%20eq%20%27FontName%27"/>
</Record>
</Annotation>
<Annotation Term="SAP__common.ValueListWithFixedValues"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__Format/PaperSize" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.ValueListReferences">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__ValueHelpSet?$filter=VALUEHELP%20eq%20%27PaperSize%27"/>
</Record>
</Annotation>
<Annotation Term="SAP__common.ValueListWithFixedValues"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__Format/Orientation" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.ValueListReferences">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__ValueHelpSet?$filter=VALUEHELP%20eq%20%27FontName%27"/>
</Record>
</Annotation>
<Annotation Term="SAP__common.ValueListWithFixedValues"/>
</Annotations>
<Annotations Target="cds_z00124ss25_restaurant.SAP__TableColumns/HorizontalAlignment" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__common.ValueListReferences">
<Record>
<PropertyValue Property="Url" String="./$metadata"/>
<PropertyValue Property="CollectionPath" String="SAP__ValueHelpSet?$filter=VALUEHELP%20eq%20%27HorizontalAlignment%27"/>
</Record>
</Annotation>
<Annotation Term="SAP__common.ValueListWithFixedValues"/>
</Annotations>
<atom:link rel="self" href="https://s40lp1.ucc.cit.tum.de/sap/opu/odata/sap/Z_00_124_SS25_RES_SRV/$metadata" xmlns:atom="http://www.w3.org/2005/Atom"/>
<atom:link rel="latest-version" href="https://s40lp1.ucc.cit.tum.de/sap/opu/odata/sap/Z_00_124_SS25_RES_SRV/$metadata" xmlns:atom="http://www.w3.org/2005/Atom"/>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

138
webapp/manifest.json Normal file
View File

@ -0,0 +1,138 @@
{
"_version": "1.48.0",
"sap.app": {
"id": "restaurant.z00124ss25restaurant",
"type": "application",
"i18n": "i18n/i18n.properties",
"applicationVersion": {
"version": "0.0.1"
},
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"resources": "resources.json",
"sourceTemplate": {
"id": "@sap/generator-fiori:basic",
"version": "1.17.5",
"toolsId": "22070856-1a55-41ca-a0d3-83e61f57c569"
},
"dataSources": {
"Z_00_124_SS25_RES_SRV_VAN": {
"uri": "/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='Z_00_124_SS25_RES_SRV_VAN',Version='0001')/$value/",
"type": "ODataAnnotation",
"settings": {
"localUri": "localService/mainService/Z_00_124_SS25_RES_SRV_VAN.xml"
}
},
"mainService": {
"uri": "/sap/opu/odata/sap/Z_00_124_SS25_RES_SRV/",
"type": "OData",
"settings": {
"annotations": [
"Z_00_124_SS25_RES_SRV_VAN"
],
"localUri": "localService/mainService/metadata.xml",
"odataVersion": "2.0"
}
}
}
},
"sap.ui": {
"technology": "UI5",
"icons": {
"icon": "",
"favIcon": "",
"phone": "",
"phone@2": "",
"tablet": "",
"tablet@2": ""
},
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
},
"sap.ui5": {
"flexEnabled": false,
"dependencies": {
"minUI5Version": "1.108.33",
"libs": {
"sap.m": {},
"sap.ui.core": {}
}
},
"contentDensities": {
"compact": true,
"cozy": true
},
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "restaurant.z00124ss25restaurant.i18n.i18n"
}
},
"": {
"dataSource": "mainService",
"preload": true,
"settings": {}
}
},
"resources": {
"css": [
{
"uri": "css/style.css"
}
]
},
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"async": true,
"viewPath": "restaurant.z00124ss25restaurant.view",
"controlAggregation": "pages",
"controlId": "app",
"clearControlAggregation": false
},
"routes": [
{
"name": "RoutetablePos",
"pattern": ":?query:",
"target": [
"TargettablePos"
]
},
{
"name": "RouteManagerReservation",
"pattern": "list",
"target": [
"TargetManagerReservation"
]
}
],
"targets": {
"TargettablePos": {
"viewType": "XML",
"transition": "slide",
"clearControlAggregation": false,
"viewId": "tablePos",
"viewName": "tablePos"
},
"TargetManagerReservation": {
"viewType": "XML",
"transition": "slide",
"clearControlAggregation": false,
"viewId": "manager",
"viewName": "manager"
}
}
},
"rootView": {
"viewName": "restaurant.z00124ss25restaurant.view.App",
"type": "XML",
"async": true,
"id": "App"
}
}
}

20
webapp/model/models.js Normal file
View File

@ -0,0 +1,20 @@
sap.ui.define([
"sap/ui/model/json/JSONModel",
"sap/ui/Device"
],
function (JSONModel, Device) {
"use strict";
return {
/**
* Provides runtime information for the device the UI5 app is running on as a JSONModel.
* @returns {sap.ui.model.json.JSONModel} The device model.
*/
createDeviceModel: function () {
var oModel = new JSONModel(Device);
oModel.setDefaultBindingMode("OneWay");
return oModel;
}
};
});

View File

@ -0,0 +1,13 @@
sap.ui.define([
"sap/ui/test/Opa5",
"./arrangements/Startup",
"./NavigationJourney"
], function (Opa5, Startup) {
"use strict";
Opa5.extendConfig({
arrangements: new Startup(),
viewNamespace: "restaurant.z00124ss25restaurant.view.",
autoWait: true
});
});

View File

@ -0,0 +1,23 @@
/*global QUnit*/
sap.ui.define([
"sap/ui/test/opaQunit",
"./pages/App",
"./pages/tablePos"
], function (opaTest) {
"use strict";
QUnit.module("Navigation Journey");
opaTest("Should see the initial page of the app", function (Given, When, Then) {
// Arrangements
Given.iStartMyApp();
// Assertions
Then.onTheAppPage.iShouldSeeTheApp();
Then.onTheViewPage.iShouldSeeThePageView();
//Cleanup
Then.iTeardownMyApp();
});
});

View File

@ -0,0 +1,25 @@
sap.ui.define([
"sap/ui/test/Opa5"
], function (Opa5) {
"use strict";
return Opa5.extend("integration.arrangements.Startup", {
iStartMyApp: function (oOptionsParameter) {
var oOptions = oOptionsParameter || {};
// start the app with a minimal delay to make tests fast but still async to discover basic timing issues
oOptions.delay = oOptions.delay || 50;
// start the app UI component
this.iStartMyUIComponent({
componentConfig: {
name: "restaurant.z00124ss25restaurant",
async: true
},
hash: oOptions.hash,
autoWait: oOptions.autoWait
});
}
});
});

View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Integration tests for Basic Template</title>
<script
id="sap-ui-bootstrap"
src="../../resources/sap-ui-core.js"
data-sap-ui-theme="sap_horizon"
data-sap-ui-resourceroots='{
"restaurant.z00124ss25restaurant": "../../",
"integration": "./"
}'
data-sap-ui-animation="false"
data-sap-ui-compatVersion="edge"
data-sap-ui-async="true"
data-sap-ui-preload="async"
data-sap-ui-oninit="module:integration/opaTests.qunit">
</script>
<link rel="stylesheet" type="text/css" href="../../resources/sap/ui/thirdparty/qunit-2.css">
<script src="../../resources/sap/ui/thirdparty/qunit-2.js"></script>
<script src="../../resources/sap/ui/qunit/qunit-junit.js"></script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View File

@ -0,0 +1,7 @@
/* global QUnit */
sap.ui.require(["restaurant/z00124ss25restaurant/test/integration/AllJourneys"
], function () {
QUnit.config.autostart = false;
QUnit.start();
});

View File

@ -0,0 +1,28 @@
sap.ui.define([
"sap/ui/test/Opa5"
], function (Opa5) {
"use strict";
var sViewName = "App";
Opa5.createPageObjects({
onTheAppPage: {
actions: {},
assertions: {
iShouldSeeTheApp: function () {
return this.waitFor({
id: "app",
viewName: sViewName,
success: function () {
Opa5.assert.ok(true, "The " + sViewName + " view is displayed");
},
errorMessage: "Did not find the " + sViewName + " view"
});
}
}
}
});
});

View File

@ -0,0 +1,28 @@
sap.ui.define([
"sap/ui/test/Opa5"
], function (Opa5) {
"use strict";
var sViewName = "tablePos";
Opa5.createPageObjects({
onTheViewPage: {
actions: {},
assertions: {
iShouldSeeThePageView: function () {
return this.waitFor({
id: "page",
viewName: sViewName,
success: function () {
Opa5.assert.ok(true, "The " + sViewName + " view is displayed");
},
errorMessage: "Did not find the " + sViewName + " view"
});
}
}
}
});
});

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>QUnit test suite</title>
<script src="../resources/sap/ui/qunit/qunit-redirect.js"></script>
<script src="testsuite.qunit.js" data-sap-ui-testsuite></script>
</head>
<body></body>
</html>

View File

@ -0,0 +1,16 @@
/* global window, parent, location */
// eslint-disable-next-line fiori-custom/sap-no-global-define
window.suite = function() {
"use strict";
// eslint-disable-next-line
var oSuite = new parent.jsUnitTestSuite(),
sContextPath = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);
oSuite.addTestPage(sContextPath + 'unit/unitTests.qunit.html');
oSuite.addTestPage(sContextPath + 'integration/opaTests.qunit.html');
return oSuite;
};

View File

@ -0,0 +1,5 @@
sap.ui.define([
"restaurant/z00124ss25restaurant/test/unit/controller/tablePos.controller"
], function () {
"use strict";
});

View File

@ -0,0 +1,16 @@
/*global QUnit*/
sap.ui.define([
"restaurant/z00124ss25restaurant/controller/tablePos.controller"
], function (Controller) {
"use strict";
QUnit.module("tablePos Controller");
QUnit.test("I should test the tablePos controller", function (assert) {
var oAppController = new Controller();
oAppController.onInit();
assert.ok(oAppController);
});
});

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Unit tests for restaurant.z00124ss25restaurant</title>
<script
id="sap-ui-bootstrap"
src="../../resources/sap-ui-core.js"
data-sap-ui-resourceroots='{
"restaurant/z00124ss25restaurant": "../../",
"unit": "."
}'
data-sap-ui-async="true"
data-sap-ui-oninit="module:unit/unitTests.qunit">
</script>
<link rel="stylesheet" type="text/css" href="../../resources/sap/ui/thirdparty/qunit-2.css">
<script src="../../resources/sap/ui/thirdparty/qunit-2.js"></script>
<script src="../../resources/sap/ui/qunit/qunit-junit.js"></script>
<script src="../../resources/sap/ui/qunit/qunit-coverage.js"></script>
<script src="../../resources/sap/ui/thirdparty/sinon.js"></script>
<script src="../../resources/sap/ui/thirdparty/sinon-qunit.js"></script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View File

@ -0,0 +1,12 @@
/* global QUnit */
QUnit.config.autostart = false;
sap.ui.getCore().attachInit(function () {
"use strict";
sap.ui.require([
"restaurant/z00124ss25restaurant/test/unit/AllTests"
], function () {
QUnit.start();
});
});

13
webapp/utils/Utils.js Normal file
View File

@ -0,0 +1,13 @@
sap.ui.define([], function () {
"use strict";
return {
padAndEncodeId: function (id) {
return encodeURIComponent(id.padStart(9, "%20"));
},
exampleUtility: function () {
return "Hello from utility!";
}
};
});

7
webapp/view/App.view.xml Normal file
View File

@ -0,0 +1,7 @@
<mvc:View controllerName="restaurant.z00124ss25restaurant.controller.App"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:mvc="sap.ui.core.mvc" displayBlock="true"
xmlns="sap.m">
<App id="app">
</App>
</mvc:View>

View File

@ -0,0 +1,149 @@
<core:FragmentDefinition
xmlns="sap.m"
xmlns:f="sap.ui.layout.form"
xmlns:core="sap.ui.core"
xmlns:gantt="sap.gantt"
xmlns:table="sap.ui.table"
>
<f:SimpleForm
id="tableForm"
editable="true"
layout="ResponsiveGridLayout"
labelSpanXL="4"
labelSpanL="4"
labelSpanM="4"
labelSpanS="12"
adjustLabelSpan="false"
emptySpanXL="0"
emptySpanL="0"
emptySpanM="0"
emptySpanS="0"
columnsXL="1"
columnsL="1"
columnsM="1"
singleContainerFullSize="false"
class="sapUiContentPadding"
>
<f:content>
<core:Title text="Table Management" />
<Label
text="Decoration"
design="Bold"
required="true"
/>
<Select
id="decoration"
items="{
path: '/Z_00_124_SS25_DECO'
}"
change=".onTableChange"
>
<core:Item
key="{Decoration}"
text="{Decoration}"
/>
</Select>
<Label
text="Location"
design="Bold"
required="true"
labelFor="location"
/>
<Select
id="location"
items="{
path: '/Z_00_124_SS25_LOC'
}"
change=".onTableChange"
>
<core:Item
key="{Location}"
text="{Location}"
/>
</Select>
<Label
text="Number of Seats"
design="Bold"
required="true"
/>
<StepInput
id="numofseats"
required="true"
min="1"
max="12"
step="1"
value="1"
/>
<!-- Buttons section -->
<HBox justifyContent="End">
<Button
text="Save"
type="Emphasized"
press=".onCreateTable"
/>
<Button
text="Cancel"
press=".onCancelPress"
class="sapUiSmallMarginBegin"
/>
</HBox>
</f:content>
</f:SimpleForm>
<Panel
headerText="Existing Tables"
expandable="true"
expanded="true"
class="sapUiMediumMarginTop"
>
<Table
id="tableList"
items="{ path: '/tablePos' }"
>
<columns>
<Column>
<Text text="Table ID" />
</Column>
<Column>
<Text text="Decoration" />
</Column>
<Column>
<Text text="Location" />
</Column>
<Column>
<Text text="Seats Count" />
</Column>
<Column>
<Text text="Actions" />
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{TableId}" />
<Text text="{Decoration}" />
<Text text="{Location}" />
<Text text="{NumberOfSeats}" />
<Button
icon="sap-icon://edit"
tooltip="Edit"
type="Transparent"
press=".onEditTable"
/>
</cells>
</ColumnListItem>
</items>
</Table>
</Panel>
<!-- <Panel
headerText="Existing Tables"
expandable="true"
expanded="true"
class="sapUiMediumMarginTop"
>
</Panel> -->
</core:FragmentDefinition>

View File

@ -0,0 +1,91 @@
<core:FragmentDefinition
xmlns="sap.m"
xmlns:core="sap.ui.core"
xmlns:viz="sap.viz.ui5.controls"
xmlns:viz.data="sap.viz.ui5.data"
xmlns:viz.feeds="sap.viz.ui5.controls.common.feeds"
>
<VBox
class="sapUiContentPadding"
width="100%"
spacing="Large"
height="auto"
>
<!-- Heading -->
<Title
text="Dashboard"
class="sapUiMediumMarginBottom"
/>
<!-- Summary Cards -->
<HBox
justifyContent="SpaceAround"
width="100%"
class="sapUiSmallMarginBottom"
height="auto"
>
<!-- Enhanced VBox with proper height and padding -->
<VBox alignItems="Center" class="dashboardCardReservation" height="200px" justifyContent="SpaceAround">
<ObjectStatus
text="Reservations"
state="Success"
icon="sap-icon://appointment"
class="dashboardCardFontSmall"
/>
<ObjectNumber
number="{dashboard>/totalReservations}"
unit="Total"
class="dashboardCardFontLarge"
emphasized="true"
/>
<HBox height="10px" /> <!-- Spacer -->
</VBox>
<!-- Enhanced VBox with proper height and padding -->
<VBox alignItems="Center" class="dashboardCardRevenue" height="200px" justifyContent="SpaceAround">
<ObjectStatus
text="Revenue"
state="Information"
icon="sap-icon://lead"
class="dashboardCardFontSmall"
/>
<ObjectNumber
number="{dashboard>/totalRevenue}"
unit="EUR"
class="dashboardCardFontLarge"
emphasized="true"
/>
<HBox height="10px" /> <!-- Spacer -->
</VBox>
</HBox>
<!-- Combined Column + Line Chart -->
<viz:VizFrame
id="idComboChart"
width="100%"
height="400px"
uiConfig="{applicationSet:'fiori'}"
vizType="dual_combination"
vizProperties="{ title: {text : 'Overall Status', visible : true}}"
>
<viz:dataset>
<viz.data:FlattenedDataset
data="{dashboard>/monthlyData}"
>
<viz.data:dimensions>
<viz.data:DimensionDefinition name="Month" value="{dashboard>Month}" />
</viz.data:dimensions>
<viz.data:measures>
<viz.data:MeasureDefinition name="Reservations" value="{dashboard>Count}" />
<viz.data:MeasureDefinition name="Revenue" value="{dashboard>Revenue}" />
</viz.data:measures>
</viz.data:FlattenedDataset>
</viz:dataset>
<viz:feeds>
<viz.feeds:FeedItem uid="valueAxis" type="Measure" values="Reservations" />
<viz.feeds:FeedItem uid="valueAxis2" type="Measure" values="Revenue" />
<viz.feeds:FeedItem uid="categoryAxis" type="Dimension" values="Month" />
</viz:feeds>
</viz:VizFrame>
</VBox>
</core:FragmentDefinition>

View File

@ -0,0 +1,125 @@
<core:FragmentDefinition
xmlns="sap.ui.table"
xmlns:m="sap.m"
xmlns:core="sap.ui.core"
>
<Table
id="reservationTable"
selectionMode="MultiToggle"
enableSelectAll="false"
rows="{
path: '/reservationPos',
parameters: {operationMode: 'Server'}
}"
threshold="15"
enableBusyIndicator="true"
ariaLabelledBy="title"
width="100%"
>
<noData>
<m:BusyIndicator class="sapUiMediumMargin" />
</noData>
<extension>
<m:OverflowToolbar style="Clear">
<!-- Left section with title -->
<m:Title
id="title"
text="Reservation Lists"
/>
<!-- Creates space that pushes the following items to the right -->
<m:ToolbarSpacer />
<!-- Right section with controls -->
<m:HBox alignItems="Center" justifyContent="End">
<m:items>
<m:Button
icon="sap-icon://refresh"
tooltip="Reinitialize Model"
press="onModelRefresh"
class="sapUiSmallMarginEnd"
/>
<m:SearchField
id="reservationSearchField"
width="15rem"
placeholder="Search"
liveChange="onSearchLiveChange"
search="onSearch"
showSearchButton="true"
/>
</m:items>
</m:HBox>
</m:OverflowToolbar>
</extension>
<columns>
<Column
sortProperty="ReservationId"
filterProperty="ReservationId"
autoResizable="true"
>
<m:Label text="Reservation Name" />
<template>
<m:Text
text="{ReservationName}"
wrapping="false"
/>
</template>
</Column>
<Column
sortProperty="NumOfGuests"
filterProperty="NumOfGuests"
autoResizable="true"
>
<m:Label text="Number of Guests" />
<template>
<m:Text
text="{NumOfGuests}"
wrapping="false"
/>
</template>
</Column>
<Column
sortProperty="BookedDate"
filterProperty="BookedDate"
autoResizable="true"
>
<m:Label text="Booked Date" />
<template>
<m:Text
text="{path: 'BookedDate', formatter: '.formatDate'}"
wrapping="false"
/>
</template>
</Column>
<Column
sortProperty="BookedTime"
filterProperty="BookedTime"
autoResizable="true"
>
<m:Label text="Booked Time" />
<template>
<m:Text
text="{path: 'BookedTime', formatter: '.formatTime'}"
/>
</template>
</Column>
<Column
sortProperty="BookedPeriod"
filterProperty="BookedPeriod"
autoResizable="true"
>
<m:Label text="Booked Period" />
<template>
<m:Text
text="{BookedPeriod}"
wrapping="false"
/>
</template>
</Column>
</columns>
</Table>
</core:FragmentDefinition>

View File

@ -0,0 +1,70 @@
<mvc:View
controllerName="restaurant.z00124ss25restaurant.controller.manager"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m"
xmlns:core="sap.ui.core"
displayBlock="true"
>
<Page
title="Restaurant Management"
enableScrolling="false"
class="sapUiContentPadding"
>
<content>
<IconTabBar
id="idIconTabBar"
expanded="{device>/isNoPhone}"
class="sapUiResponsiveContentPadding"
stretchContentHeight="true"
applyContentPadding="false"
backgroundDesign="Transparent"
headerBackgroundDesign="Transparent"
selectedKey="tabDashboard"
select="onTabSelect"
>
<items>
<!-- Dashboard Tab -->
<IconTabFilter
id="tabDashboard"
key="dashboard"
text="Dashboard"
icon="sap-icon://bbyd-dashboard"
>
<!-- Fragment placeholder - will be loaded in controller -->
<core:Fragment
fragmentName="restaurant.z00124ss25restaurant.view.fragments.ViewDashboard"
type="XML"
/>
</IconTabFilter>
<!-- View Reservation Tab -->
<IconTabFilter
id="tabViewReservation"
key="viewReservation"
text="View Reservation"
icon="sap-icon://list"
>
<!-- Fragment placeholder - will be loaded in controller -->
<core:Fragment
fragmentName="restaurant.z00124ss25restaurant.view.fragments.viewReservation"
type="XML"
/>
</IconTabFilter>
<!-- Create Table Tab -->
<IconTabFilter
id="tabCreateTable"
key="createTable"
text="Table Management"
icon="sap-icon://action-settings"
>
<!-- Fragment placeholder - will be loaded in controller -->
<core:Fragment
fragmentName="restaurant.z00124ss25restaurant.view.fragments.CreateTable"
type="XML"
/>
</IconTabFilter>
</items>
</IconTabBar>
</content>
</Page>
</mvc:View>

View File

@ -0,0 +1,164 @@
<mvc:View
controllerName="restaurant.z00124ss25restaurant.controller.tablePos"
xmlns:mvc="sap.ui.core.mvc"
displayBlock="true"
xmlns="sap.m"
xmlns:f="sap.ui.layout.form"
xmlns:core="sap.ui.core"
xmlns:l="sap.ui.layout"
>
<Page
id="page"
title="{i18n>title}"
>
<headerContent>
<Button
icon="sap-icon://employee"
text="Manager"
type="Transparent"
press="onManagerPress"
/>
</headerContent>
<content>
<f:SimpleForm
id="reservationForm"
editable="true"
layout="ResponsiveGridLayout"
labelSpanXL="4"
labelSpanL="4"
labelSpanM="4"
labelSpanS="12"
adjustLabelSpan="false"
emptySpanXL="0"
emptySpanL="0"
emptySpanM="0"
emptySpanS="0"
columnsXL="1"
columnsL="1"
columnsM="1"
singleContainerFullSize="false"
class="sapUiContentPadding"
>
<f:content>
<core:Title text="Reservation Details" />
<Label
text="Reservation Name"
design="Bold"
required="true"
/>
<Input
id="res-name"
required="true"
placeholder="Enter name for reservation"
maxLength="50"
/>
<Label
text="Number of Guests"
design="Bold"
required="true"
/>
<StepInput
id="num-guests"
required="true"
min="1"
max="12"
step="1"
value="1"
/>
<Label
text="Reservation Date"
labelFor="booked-date"
design="Bold"
/>
<DatePicker
id="booked-date"
class="sapUiSmallMarginBottom"
/>
<Label
text="Reservation Time"
labelFor="booked-time"
design="Bold"
required="true"
/>
<TimePicker
id="booked-time"
valueFormat="HH:mm"
displayFormat="HH:mm"
placeholder="Enter Time"
required="true"
minutesStep="15"
change="handleDateTimeChange"
/>
<Label
text="Available Tables"
design="Bold"
required="true"
/>
<Select
id="table-id"
items="{
path: '/tablePos'
}"
change=".onTableChange"
>
<core:Item
key="{TableId}"
text="{NumberOfSeats} - {Location} - {Decoration}"
/>
</Select>
<Label
text="Booked Period (minutes)"
design="Bold"
required="true"
/>
<StepInput
id="booked-period"
required="true"
min="30"
max="240"
step="15"
value="120"
/>
<Label text="Comments" />
<TextArea
id="comments"
rows="4"
width="100%"
growing="true"
growingMaxLines="10"
placeholder="Enter any special requests or additional information"
/>
</f:content>
</f:SimpleForm>
<l:Grid
defaultSpan="L12 M12 S12"
class="sapUiContentPadding"
>
<HBox
justifyContent="End"
width="100%"
>
<Button
text="Save Reservation"
type="Emphasized"
class="sapUiSmallMarginEnd"
press="onSaveReservation"
/>
<Button
text="Cancel"
type="Reject"
press="onCancelPress"
/>
</HBox>
</l:Grid>
</content>
</Page>
</mvc:View>