first commit
This commit is contained in:
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal 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
42
README.md
Normal 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
13724
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
30
package.json
Normal file
30
package.json
Normal 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
47
ui5-local.yaml
Normal 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
44
ui5-mock.yaml
Normal 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
32
ui5.yaml
Normal 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
35
webapp/Component.js
Normal 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");
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
14
webapp/controller/App.controller.js
Normal file
14
webapp/controller/App.controller.js
Normal 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() {
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
|
392
webapp/controller/manager.controller.js
Normal file
392
webapp/controller/manager.controller.js
Normal 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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
266
webapp/controller/tablePos.controller.js
Normal file
266
webapp/controller/tablePos.controller.js
Normal 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
35
webapp/css/style.css
Normal 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;
|
||||
}
|
11
webapp/i18n/i18n.properties
Normal file
11
webapp/i18n/i18n.properties
Normal 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
35
webapp/index copy.html
Normal 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
35
webapp/index.html
Normal 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>
|
273
webapp/localService/mainService/Z_00_124_SS25_RES_SRV_VAN.xml
Normal file
273
webapp/localService/mainService/Z_00_124_SS25_RES_SRV_VAN.xml
Normal 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>
|
562
webapp/localService/mainService/metadata.xml
Normal file
562
webapp/localService/mainService/metadata.xml
Normal 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
138
webapp/manifest.json
Normal 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
20
webapp/model/models.js
Normal 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;
|
||||
}
|
||||
};
|
||||
|
||||
});
|
13
webapp/test/integration/AllJourneys.js
Normal file
13
webapp/test/integration/AllJourneys.js
Normal 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
|
||||
});
|
||||
});
|
23
webapp/test/integration/NavigationJourney.js
Normal file
23
webapp/test/integration/NavigationJourney.js
Normal 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();
|
||||
});
|
||||
});
|
25
webapp/test/integration/arrangements/Startup.js
Normal file
25
webapp/test/integration/arrangements/Startup.js
Normal 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
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
29
webapp/test/integration/opaTests.qunit.html
Normal file
29
webapp/test/integration/opaTests.qunit.html
Normal 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>
|
7
webapp/test/integration/opaTests.qunit.js
Normal file
7
webapp/test/integration/opaTests.qunit.js
Normal file
@ -0,0 +1,7 @@
|
||||
/* global QUnit */
|
||||
|
||||
sap.ui.require(["restaurant/z00124ss25restaurant/test/integration/AllJourneys"
|
||||
], function () {
|
||||
QUnit.config.autostart = false;
|
||||
QUnit.start();
|
||||
});
|
28
webapp/test/integration/pages/App.js
Normal file
28
webapp/test/integration/pages/App.js
Normal 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"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
28
webapp/test/integration/pages/tablePos.js
Normal file
28
webapp/test/integration/pages/tablePos.js
Normal 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"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
9
webapp/test/testsuite.qunit.html
Normal file
9
webapp/test/testsuite.qunit.html
Normal 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>
|
16
webapp/test/testsuite.qunit.js
Normal file
16
webapp/test/testsuite.qunit.js
Normal 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;
|
||||
};
|
5
webapp/test/unit/AllTests.js
Normal file
5
webapp/test/unit/AllTests.js
Normal file
@ -0,0 +1,5 @@
|
||||
sap.ui.define([
|
||||
"restaurant/z00124ss25restaurant/test/unit/controller/tablePos.controller"
|
||||
], function () {
|
||||
"use strict";
|
||||
});
|
16
webapp/test/unit/controller/tablePos.controller.js
Normal file
16
webapp/test/unit/controller/tablePos.controller.js
Normal 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);
|
||||
});
|
||||
|
||||
});
|
27
webapp/test/unit/unitTests.qunit.html
Normal file
27
webapp/test/unit/unitTests.qunit.html
Normal 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>
|
12
webapp/test/unit/unitTests.qunit.js
Normal file
12
webapp/test/unit/unitTests.qunit.js
Normal 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
13
webapp/utils/Utils.js
Normal 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
7
webapp/view/App.view.xml
Normal 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>
|
149
webapp/view/fragments/CreateTable.fragment.xml
Normal file
149
webapp/view/fragments/CreateTable.fragment.xml
Normal 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>
|
91
webapp/view/fragments/ViewDashboard.fragment.xml
Normal file
91
webapp/view/fragments/ViewDashboard.fragment.xml
Normal 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>
|
125
webapp/view/fragments/viewReservation.fragment.xml
Normal file
125
webapp/view/fragments/viewReservation.fragment.xml
Normal 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>
|
70
webapp/view/manager.view.xml
Normal file
70
webapp/view/manager.view.xml
Normal 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>
|
164
webapp/view/tablePos.view.xml
Normal file
164
webapp/view/tablePos.view.xml
Normal 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>
|
Reference in New Issue
Block a user