From d72ff809b06e27f4a10e9a8ba1a56ae24fb06475 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 17 Feb 2021 13:24:17 +0100 Subject: [PATCH 001/100] Adding suppliers showing integration with S/4 --- fiori/package.json | 9 +- fiori/server.js | 1 + package.json | 3 +- samples.md | 12 +- suppliers/.gitignore | 29 + suppliers/.vscode/extensions.json | 20 + suppliers/.vscode/launch.json | 15 + suppliers/.vscode/settings.json | 7 + suppliers/.vscode/tasks.json | 25 + suppliers/index.cds | 1 + suppliers/package.json | 24 + suppliers/server.js | 3 + .../srv/external/API_BUSINESS_PARTNER.csn | 2425 ++++++++++++ .../srv/external/API_BUSINESS_PARTNER.edmx | 3261 +++++++++++++++++ ...API_BUSINESS_PARTNER-A_BusinessPartner.csv | 7 + .../data/API_BUSINESS_PARTNER-Suppliers.csv | 5 + suppliers/srv/mashup.cds | 47 + suppliers/srv/mashup.js | 52 + 18 files changed, 5941 insertions(+), 5 deletions(-) create mode 100644 suppliers/.gitignore create mode 100644 suppliers/.vscode/extensions.json create mode 100644 suppliers/.vscode/launch.json create mode 100644 suppliers/.vscode/settings.json create mode 100644 suppliers/.vscode/tasks.json create mode 100644 suppliers/index.cds create mode 100644 suppliers/package.json create mode 100644 suppliers/server.js create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.csn create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.edmx create mode 100644 suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv create mode 100644 suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv create mode 100644 suppliers/srv/mashup.cds create mode 100644 suppliers/srv/mashup.js diff --git a/fiori/package.json b/fiori/package.json index a4028d2e..60ba162d 100644 --- a/fiori/package.json +++ b/fiori/package.json @@ -3,9 +3,10 @@ "version": "1.0.0", "dependencies": { "@capire/bookshop": "*", - "@capire/reviews": "*", - "@capire/orders": "*", "@capire/common": "*", + "@capire/orders": "*", + "@capire/reviews": "*", + "@capire/suppliers": "*", "@sap/cds": "^4", "express": "^4.17.1", "passport": "0.4.1" @@ -16,6 +17,10 @@ }, "cds": { "requires": { + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "@capire/suppliers" + }, "ReviewsService": { "kind": "odata", "model": "@capire/reviews" }, diff --git a/fiori/server.js b/fiori/server.js index a8dc4298..41294b50 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -7,6 +7,7 @@ cds.once('bootstrap',(app)=>{ }) cds.once('served', require('./srv/mashup')) +cds.once('served', require('@capire/suppliers/srv/mashup')) module.exports = cds.server diff --git a/package.json b/package.json index 9c5c6c34..752312d2 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "@capire/hello": "./hello", "@capire/media": "./media", "@capire/orders": "./orders", - "@capire/reviews": "./reviews" + "@capire/reviews": "./reviews", + "@capire/suppliers": "./suppliers" }, "devDependencies": { "chai": "^4.2.0", diff --git a/samples.md b/samples.md index bc5f7f81..995a069e 100644 --- a/samples.md +++ b/samples.md @@ -49,14 +49,22 @@ Each sub directory essentially is an individual npm package arranged in an [all- - Late-cut Micro Services - As well as managed data, input validations, and authorization +## [@capire/suppliers](suppliers) + +- Shows how to integrate remote services, in this case the BusinessPartner service from S/4. +- Extending [@capire/bookshop](bookshop) with suppliers from S/4 +- Providing that as a pre-built integration & extension package +- Used in [@capire/fiori](fiori) + ## [@capire/fiori](fiori) - A [composite app, reusing and combining](https://cap.cloud.sap/docs/guides/verticalize) these packages: - [@capire/bookshop](bookshop) - - [@capire/reviews](reviews) - - [@capire/orders](orders) - [@capire/common](common) + - [@capire/orders](orders) + - [@capire/reviews](reviews) + - [@capire/suppliers](suppliers) - [Adds a SAP Fiori elements application](https://cap.cloud.sap/docs/guides/fiori/) to bookshop, thereby introducing to: - [OData Annotations](https://cap.cloud.sap/docs/guides/fiori#adding-odata-annotations) in `.cds` files - Support for [Fiori Draft](https://cap.cloud.sap/docs/guides/fiori#draft) diff --git a/suppliers/.gitignore b/suppliers/.gitignore new file mode 100644 index 00000000..b8e5bc14 --- /dev/null +++ b/suppliers/.gitignore @@ -0,0 +1,29 @@ +# CAP demo +_out +*.db +connection.properties +default-*.json +gen/ +node_modules/ +target/ + +# Web IDE, App Studio +.che/ +.gen/ + +# MTA +*_mta_build_tmp +*.mtar +mta_archives/ + +# Other +.DS_Store +*.orig +*.log + +*.iml +*.flattened-pom.xml + +# IDEs +# .vscode +# .idea diff --git a/suppliers/.vscode/extensions.json b/suppliers/.vscode/extensions.json new file mode 100644 index 00000000..1daacbd8 --- /dev/null +++ b/suppliers/.vscode/extensions.json @@ -0,0 +1,20 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + // >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!, + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "mechatroner.rainbow-csv", + "humao.rest-client", + "alexcvzz.vscode-sqlite", + "hbenl.vscode-mocha-test-adapter", + "sdras.night-owl" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + + ] +} diff --git a/suppliers/.vscode/launch.json b/suppliers/.vscode/launch.json new file mode 100644 index 00000000..3f308a6c --- /dev/null +++ b/suppliers/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "command": "cds run --with-mocks --in-memory?", + "name": "cds run", + "request": "launch", + "type": "node-terminal", + "skipFiles": [ "/**" ] + } + ] +} diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json new file mode 100644 index 00000000..9fefa082 --- /dev/null +++ b/suppliers/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.exclude": { + "**/.gitignore": true, + "**/.git": true, + "**/.vscode": true + } +} diff --git a/suppliers/.vscode/tasks.json b/suppliers/.vscode/tasks.json new file mode 100644 index 00000000..622da99a --- /dev/null +++ b/suppliers/.vscode/tasks.json @@ -0,0 +1,25 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "shell", + "label": "cds watch", + "command": "cds", + "args": ["watch"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "type": "shell", + "label": "cds run", + "command": "cds", + "args": ["run", "--with-mocks", "--in-memory?"], + "problemMatcher": [] + } + ] +} diff --git a/suppliers/index.cds b/suppliers/index.cds new file mode 100644 index 00000000..fe4a1f04 --- /dev/null +++ b/suppliers/index.cds @@ -0,0 +1 @@ +using from './srv/mashup'; \ No newline at end of file diff --git a/suppliers/package.json b/suppliers/package.json new file mode 100644 index 00000000..e1cfb4bc --- /dev/null +++ b/suppliers/package.json @@ -0,0 +1,24 @@ +{ + "name": "@capire/suppliers", + "version": "1.0.0", + "description": "Shows integration with S/4, in turn provided as a reusable extension package to bookshop.", + "private": true, + "dependencies": { + "@capire/common": "*", + "@sap/cds": "^4", + "express": "^4" + }, + "scripts": { + "start": "cds run --in-memory?", + "watch": "cds watch", + "mocked-s4": "cds mock API_BUSINESS_PARTNER" + }, + "cds": { + "requires": { + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "srv/external/API_BUSINESS_PARTNER" + } + } + } +} diff --git a/suppliers/server.js b/suppliers/server.js new file mode 100644 index 00000000..2e8cbb64 --- /dev/null +++ b/suppliers/server.js @@ -0,0 +1,3 @@ +const cds = require ('@sap/cds') +cds.once('served', require('./srv/mashup')) +module.exports = cds.server diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.csn b/suppliers/srv/external/API_BUSINESS_PARTNER.csn new file mode 100644 index 00000000..411e7c48 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.csn @@ -0,0 +1,2425 @@ +{ + "definitions": { + "API_BUSINESS_PARTNER": { + "kind": "service" + }, + "API_BUSINESS_PARTNER.A_AddressEmailAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultEmailAddress": { + "type": "cds.Boolean" + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "SearchEmailAddress": { + "type": "cds.String", + "length": 20 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressFaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultFaxNumber": { + "type": "cds.Boolean" + }, + "FaxCountry": { + "type": "cds.String", + "length": 3 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalFaxNumber": { + "type": "cds.String", + "length": 30 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressHomePageURL": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "key": true, + "type": "cds.Date" + }, + "IsDefaultURLAddress": { + "key": true, + "type": "cds.Boolean" + }, + "SearchURLAddress": { + "type": "cds.String", + "length": 50 + }, + "URLFieldLength": { + "type": "cds.Integer" + }, + "WebsiteURL": { + "type": "cds.String", + "length": 2048 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressPhoneNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DestinationLocationCountry": { + "type": "cds.String", + "length": 3 + }, + "IsDefaultPhoneNumber": { + "type": "cds.Boolean" + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberType": { + "type": "cds.String", + "length": 1 + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressNumber": { + "type": "cds.String", + "length": 10 + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ContactPersonFunction": { + "type": "cds.String", + "length": 4 + }, + "ContactPersonDepartment": { + "type": "cds.String", + "length": 4 + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaAddressUsage": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Timestamp" + }, + "AddressUsage": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "StandardUsage": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIdentification": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPIdentificationType": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "BPIdentificationNumber": { + "key": true, + "type": "cds.String", + "length": 60 + }, + "BPIdnNmbrIssuingInstitute": { + "type": "cds.String", + "length": 40 + }, + "BPIdentificationEntryDate": { + "type": "cds.Date" + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "ValidityEndDate": { + "type": "cds.Date" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIndustry": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "IndustrySector": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IndustrySystemType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IsStandardIndustry": { + "type": "cds.String", + "length": 1 + }, + "IndustryKeyDescription": { + "type": "cds.String", + "length": 100 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartner": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "AcademicTitle": { + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerCategory": { + "type": "cds.String", + "length": 1 + }, + "BusinessPartnerFullName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerGrouping": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerUUID": { + "type": "cds.UUID" + }, + "CorrespondenceLanguage": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreationTime": { + "type": "cds.Time" + }, + "FirstName": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "Industry": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "IsFemale": { + "type": "cds.Boolean" + }, + "IsMale": { + "type": "cds.Boolean" + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "IsSexUnknown": { + "type": "cds.Boolean" + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "LastChangeDate": { + "type": "cds.Date" + }, + "LastChangeTime": { + "type": "cds.Time" + }, + "LastChangedByUser": { + "type": "cds.String", + "length": 12 + }, + "LastName": { + "type": "cds.String", + "length": 40 + }, + "LegalForm": { + "type": "cds.String", + "length": 2 + }, + "OrganizationBPName1": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName2": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName3": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName4": { + "type": "cds.String", + "length": 40 + }, + "OrganizationFoundationDate": { + "type": "cds.Date" + }, + "OrganizationLiquidationDate": { + "type": "cds.Date" + }, + "SearchTerm1": { + "type": "cds.String", + "length": 20 + }, + "AdditionalLastName": { + "type": "cds.String", + "length": 40 + }, + "BirthDate": { + "type": "cds.Date" + }, + "BusinessPartnerIsBlocked": { + "type": "cds.Boolean" + }, + "BusinessPartnerType": { + "type": "cds.String", + "length": 4 + }, + "ETag": { + "type": "cds.String", + "length": 26 + }, + "GroupBusinessPartnerName1": { + "type": "cds.String", + "length": 40 + }, + "GroupBusinessPartnerName2": { + "type": "cds.String", + "length": 40 + }, + "IndependentAddressID": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "MiddleName": { + "type": "cds.String", + "length": 40 + }, + "NameCountry": { + "type": "cds.String", + "length": 3 + }, + "NameFormat": { + "type": "cds.String", + "length": 2 + }, + "PersonFullName": { + "type": "cds.String", + "length": 80 + }, + "PersonNumber": { + "type": "cds.String", + "length": 10 + }, + "IsMarkedForArchiving": { + "type": "cds.Boolean" + }, + "BusinessPartnerIDByExtSystem": { + "type": "cds.String", + "length": 20 + }, + "TradingPartner": { + "type": "cds.String", + "length": 6 + }, + "to_BuPaIdentification": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIdentification", + "cardinality": { + "max": "*" + } + }, + "to_BuPaIndustry": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIndustry", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerAddress", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerBank": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerBank", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerContact": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerContact", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerRole": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerRole", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_Customer": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Customer" + }, + "to_Supplier": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Supplier" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "AddressUUID": { + "type": "cds.UUID" + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "AddressIDByExternalSystem": { + "type": "cds.String", + "length": 20 + }, + "to_AddressUsage": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaAddressUsage", + "cardinality": { + "max": "*" + } + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerBank": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BankIdentification": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BankCountryKey": { + "type": "cds.String", + "length": 3 + }, + "BankName": { + "type": "cds.String", + "length": 60 + }, + "BankNumber": { + "type": "cds.String", + "length": 15 + }, + "SWIFTCode": { + "type": "cds.String", + "length": 11 + }, + "BankControlKey": { + "type": "cds.String", + "length": 2 + }, + "BankAccountHolderName": { + "type": "cds.String", + "length": 60 + }, + "BankAccountName": { + "type": "cds.String", + "length": 40 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "IBAN": { + "type": "cds.String", + "length": 34 + }, + "IBANValidityStartDate": { + "type": "cds.Date" + }, + "BankAccount": { + "type": "cds.String", + "length": 18 + }, + "BankAccountReferenceText": { + "type": "cds.String", + "length": 20 + }, + "CollectionAuthInd": { + "type": "cds.Boolean" + }, + "CityName": { + "type": "cds.String", + "length": 35 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerContact": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "IsStandardRelationship": { + "type": "cds.Boolean" + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + }, + "to_ContactAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToAddress", + "cardinality": { + "max": "*" + } + }, + "to_ContactRelationship": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerRole": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerRole": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "ValidFrom": { + "type": "cds.Timestamp" + }, + "ValidTo": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPTaxType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BPTaxNumber": { + "type": "cds.String", + "length": 20 + }, + "BPTaxLongNumber": { + "type": "cds.String", + "length": 60 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Customer": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerFullName": { + "type": "cds.String", + "length": 220 + }, + "CustomerName": { + "type": "cds.String", + "length": 80 + }, + "DeliveryIsBlocked": { + "type": "cds.String", + "length": 2 + }, + "NFPartnerIsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "CustomerCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "IndustryCode1": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode2": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode3": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode4": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode5": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "NielsenRegion": { + "type": "cds.String", + "length": 2 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "to_CustomerCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerCompany", + "cardinality": { + "max": "*" + } + }, + "to_CustomerSalesArea": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesArea", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkInternetAddress": { + "type": "cds.String", + "length": 130 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "AlternativePayerAccount": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CollectiveInvoiceVariant": { + "type": "cds.String", + "length": 1 + }, + "CustomerAccountNote": { + "type": "cds.String", + "length": 30 + }, + "CustomerHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "CustomerSupplierClearingIsUsed": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PaytAdviceIsSentbyEDI": { + "type": "cds.Boolean" + }, + "PhysicalInventoryBlockInd": { + "type": "cds.Boolean" + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "RecordPaymentHistoryIndicator": { + "type": "cds.Boolean" + }, + "UserAtCustomer": { + "type": "cds.String", + "length": 15 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_CustomerDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerDunning", + "cardinality": { + "max": "*" + } + }, + "to_WithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesArea": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CompleteDeliveryIsDefined": { + "type": "cds.Boolean" + }, + "Currency": { + "type": "cds.String", + "length": 5 + }, + "CustomerABCClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerAccountAssignmentGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "CustomerPriceGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPricingProcedure": { + "type": "cds.String", + "length": 2 + }, + "DeliveryIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "DeliveryPriority": { + "type": "cds.String", + "length": 2 + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "InvoiceDate": { + "type": "cds.String", + "length": 2 + }, + "ItemOrderProbabilityInPercent": { + "type": "cds.String", + "length": 3 + }, + "OrderCombinationIsAllowed": { + "type": "cds.Boolean" + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PartialDeliveryIsAllowed": { + "type": "cds.String", + "length": 1 + }, + "PriceListType": { + "type": "cds.String", + "length": 2 + }, + "SalesGroup": { + "type": "cds.String", + "length": 3 + }, + "SalesOffice": { + "type": "cds.String", + "length": 4 + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplyingPlant": { + "type": "cds.String", + "length": 4 + }, + "SalesDistrict": { + "type": "cds.String", + "length": 6 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc", + "cardinality": { + "max": "*" + } + }, + "to_SalesAreaTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DepartureCountry": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "CustomerTaxCategory": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CustomerTaxClassification": { + "type": "cds.String", + "length": 1 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxAgent": { + "type": "cds.Boolean" + }, + "ObligationDateBegin": { + "type": "cds.Date" + }, + "ObligationDateEnd": { + "type": "cds.Date" + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "BPCustomerNumber": { + "type": "cds.String", + "length": 10 + }, + "CustomerPartnerDescription": { + "type": "cds.String", + "length": 30 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Supplier": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AlternativePayeeAccountNumber": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "PaymentIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "PurchasingIsBlocked": { + "type": "cds.Boolean" + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierFullName": { + "type": "cds.String", + "length": 220 + }, + "SupplierName": { + "type": "cds.String", + "length": 80 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "BirthDate": { + "type": "cds.Date" + }, + "ConcatenatedInternationalLocNo": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "SuplrQltyInProcmtCertfnValidTo": { + "type": "cds.Date" + }, + "SuplrQualityManagementSystem": { + "type": "cds.String", + "length": 4 + }, + "SupplierCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "SupplierProcurementBlock": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberResponsible": { + "type": "cds.String", + "length": 18 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "to_SupplierCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierCompany", + "cardinality": { + "max": "*" + } + }, + "to_SupplierPurchasingOrg": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CompanyCodeName": { + "type": "cds.String", + "length": 25 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "SupplierIsBlockedForPosting": { + "type": "cds.Boolean" + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "SupplierClerk": { + "type": "cds.String", + "length": 15 + }, + "SupplierClerkURL": { + "type": "cds.String", + "length": 130 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "ClearCustomerSupplier": { + "type": "cds.Boolean" + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "PaymentIsToBeSentByEDI": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "CheckPaidDurationInDays": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "BillOfExchLmtAmtInCoCodeCrcy": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "SupplierClerkIDBySupplier": { + "type": "cds.String", + "length": 12 + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "SupplierHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "AlternativePayee": { + "type": "cds.String", + "length": 10 + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierCertificationDate": { + "type": "cds.Date" + }, + "SupplierAccountNote": { + "type": "cds.String", + "length": 30 + }, + "WithholdingTaxCountry": { + "type": "cds.String", + "length": 3 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CashPlanningGroup": { + "type": "cds.String", + "length": 10 + }, + "IsToBeCheckedForDuplicates": { + "type": "cds.Boolean" + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_SupplierDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierDunning", + "cardinality": { + "max": "*" + } + }, + "to_SupplierWithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "SupplierSubrange": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "Plant": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "ReferenceSupplier": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CalculationSchemaGroupCode": { + "type": "cds.String", + "length": 2 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "InvoiceIsGoodsReceiptBased": { + "type": "cds.Boolean" + }, + "MaterialPlannedDeliveryDurn": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "MinimumOrderAmount": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PricingDateControl": { + "type": "cds.String", + "length": 1 + }, + "PurOrdAutoGenerationIsAllowed": { + "type": "cds.Boolean" + }, + "PurchaseOrderCurrency": { + "type": "cds.String", + "length": 5 + }, + "PurchasingGroup": { + "type": "cds.String", + "length": 3 + }, + "PurchasingIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplierABCClassificationCode": { + "type": "cds.String", + "length": 1 + }, + "SupplierPhoneNumber": { + "type": "cds.String", + "length": 16 + }, + "SupplierRespSalesPersonName": { + "type": "cds.String", + "length": 30 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPartnerFunc", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "IsWithholdingTaxSubject": { + "type": "cds.Boolean" + }, + "RecipientType": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + } + } +} \ No newline at end of file diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.edmx b/suppliers/srv/external/API_BUSINESS_PARTNER.edmx new file mode 100644 index 00000000..4da33b26 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.edmx @@ -0,0 +1,3261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + This field is generated by the system from the complete Internet mail address and is stored in table ADR6. + It contains the first 20 characters of the Internet mail address in normalized form, that is, without comment characters and converted into uppercase.The field cannot be maintained by the user or from an interface.The table ADR6 contains an index for this field.Using an Internet mail address, the corresponding key of table ADR6 and the owner of the address are determined (for example, business partner or user). + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + The country for the telephone number or fax number is maintained here. + This specification is used to determine the correct country code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country from the user parameter LND is proposed (if it is maintained). If the user parameter LND is not maintained, the country of the company address assigned in the user master data is proposed.If the country of the address changes, the country of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country for this telephone number also has to be retained and must not be changed automatically to the new country of the address. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + The content of this field is automatically calculated by the system based on fax number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + The country for the telephone number or fax number is maintained here. + This specification is used to determine the correct country code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country from the user parameter LND is proposed (if it is maintained). If the user parameter LND is not maintained, the country of the company address assigned in the user master data is proposed.If the country of the address changes, the country of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country for this telephone number also has to be retained and must not be changed automatically to the new country of the address. + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + The content of this field is automatically calculated by the system based on the telephone number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + This field specifies whether the telephone number is a mobile telephone number. + ' ' : The telephone number is a fixed-line telephone'1' : The telephone number is the standard fixed-line telephone'2' : The telephone nubmer is a mobile telephone'3' : The telephone number is the standard mobile telephoneEither the standard fixed-line telephone number or the standard mobile telephone number is also the standard telephone number (FLGDEFAULT = 'X').In older data sets, this field may have also have the value ' ' for the standard fixed-line telephone. In this case, however, FLGDEFAULT is always 'X'.In Customizing, you can specify whether the SMS-compatible indicator is to be proposed for new mobile telephone numbers created in dialog by choosing General Settings -> Set countries -> Define Mobile Telephone Attributes for each country. + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country-code or a typical country key, for example, in Germany the Federal statistics office key.The country keys are determined at system installation in the global settings.The definition of the country key in the SAP system does not have to match political or government entities.Since the country key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country key cannot query the country key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Different PO Box country in address. + The PO Box country can be entered here, if it is different from the street address country.If the address only has a PO Box address, the country is in the normal country field.Use this field if the address has two different country values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Identifies the function that a person has within a company. + This is a contact person attribute that you can define in Customizing.Personnel managerSecretary + + + + + Name of the department of a business partner for your internal usage. + The name given by the business partner to this particular department may differ from the name that you use. You can enter the name given by the business partner in the field company department.This is a contact person attribute that you can define in Customizing.For your purposes, the department name is "Sales". The business partner names the same department "Sales South". + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Business partner attribute, which you can use to distinguish between various addresses by defining the address usage for communication with business partners. + Maintain the usage types for addresses (address types) in Customizing.You can create a short description and a name for the address type.When maintaining business partners you can use the function address usage to assign business partner addresses to address types.If necessary, you can set the indicator for multiple use in Customizing.Correspondence addressDelivery address + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + Establishes which is the standard address for an address usage. + Several addresses per period can be assigned to an address usage.If this is the case, then this indicator controls which of the assigned addresses should be the standard address of the relevant usage. This is determined automatically when the address usage is accessed. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + A document (such as an ID card or driver's license) or an entry in a system of records (such as a commercial register) whose key can be stored as an attribute for a business partner. + The identification type is for classifying identification numbers.You can define the identification types and their descriptions in Customizing.You can also specify for which business partner category an ID type should be valid.If necessary, assign the identification type to an Identification Category.You can only assign one identification type to an identification category. + + + + + Number that serves to identify a business partner, such as driver's license, or ID card number. + + + + + + Institution that adminsters or assigns an ID number. + + + + + + Date on which the ID number was registered or assigned by the appropriate authority. + + + + + + Country in which an ID number was assigned, or in which the number is valid. + + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + This date marks the start of validity of an ID number. + + + + + + This date marks the end of validity of an ID number. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Describes an industry. + An industry is a classification of companies according to their main business activity. For example, you can use Commerce, Banking, Services, Industry, Healthcare, Public Sector, Media, and so on, as industries.You can define industries along with their descriptions in Customizing.Assign the industry key to an industry key system. + + + + + Serves to combine and categorize several industries into a group. + You can create different industry systems, each with its own catalog of industries, whereby an industry can be assigned to several industry systems.You have to select one industry system as the standard industry system. This is then automatically displayed in the initial screen for the maintenance of industry data.You can define an industry system along with its description in Customizing. You can assign several industry systems to a business partner.If you choose the button All Industry Systems, you can access all the industry systems defined in the Customizing using the input help. + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Identifies the industry in an industry system that can be defined as the standard industry. + It is recommended that you define an industry within an industry system as the standard industry, because only the standard industries can be determined at the interfaces to BW or the APIs, for example.This means that even if only one industry exists within an industry system, it should be indicated as the standard industry as this this information cannot be determined otherwise. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Key for academic title. + You can define a key for an academic title in Customizing. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + Category under which a business partner is classified. + You can distinguish between the following business partner categories:OrganizationNatural personGroup of natural persons or organizationsThe processing screens for the business partner categories are set up differently.So, for example, the screen for an organization contains the field Legal form, but this is not needed in the screen for a natural person. + + + + + + Classification assigned when creating a business partner. + Assign each business partner to a grouping when you create the business partner. The grouping determines the number range. You cannot change the assignment afterwards.You can define the groupings, their descriptions, the associated number range and other attributes in Customizing.You can define standard groupings for the internal and the external number assignment.For each grouping create a number range.When you create a business partner, the entry in the grouping field determines whether and how an entry is made in the business partner number field. + + + + + + + Correspondence language (written) for business partners in the 'Person' category. Maintain the correspondence language for business partners in the 'Organization' and 'Group' category with the address (communication). + When transferring data (direct input), make sure that for a'Person', the field 'LANGU_CORR' and for an'Organization' or "Group" the field 'LANGU'has an entry. + + + + + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + An industry sector is the term used to classify a company according to its main business activity. + You can assign an industry sector to business partners in the category 'Organization'RetailBanksServicesIndustryHealth servicePublic sectorMedia + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + + + Indicator through which a distinction between natural and legal persons can be made during tax reporting. + Is used in Italy and Mexico ,among other countries.Brasil: If the indicator is not set, 'CGC' is relevant in tax number 1. If the indicator is set, 'CPF' is relevant in tax number 2.Colombia: In the case of some natural persons, the NIT number does not have a check digit. In this case you should set this indicator and the check is deactivated. + + + + + + Language for verbal communication with a business partner. + This language may differ from the language(s) defined for written correspondence. + + + + + + + + + Denotes certain legal norms that are of significance for the organization of a company. + For business partners in the category "Organization", you can state the legal form of the company. This is for information purposes only.Stock corporation (AG in Germany)Limited liability company (GmbH in Germany) + + + + + First name field for business partners in the Organization category. + + + + + + Second name field for business partners in the Organization category. + + + + + + Third name field for business partners in the Organization category. + + + + + + Fourth name field for business partners in the Organization category. + + + + + + Indicates the official registration of a company in the Commercial Register. + If a company is not officially registered in the Commercial Register, it has to use some type of text addition, such as foundation pending, when referring to the legal form. + + + + + Term for the end of bankruptcy proceedings. + This date also indicates that the company no longer exists. + + + + + Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. + + + + + + + + If the business partner is blocked centrally, certain activities cannot be executed. + + + + + + You can use the business partner type to group business partners according to your own criteria in Customizing (IMG). + In Customizing you can show or hide fields for data entry, depending on the requirements of the relevant business partner type.Select a business partner type. You can obtain help by pressing the F4 key. + + + + + + First name field for business partners in the Group category. + + + + + + Second name field for business partners in the Group category. + + + + + + Internal key for identifying the address for communication data that spans all addresses in Business Partner. + For more information on the significance and usage of the address number, see the documentation for Business Address Services (BAS). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + + The name format rule country and the name format rule key together uniquely identify a formatting rule. + A country can have several formats which correspond to different rules. Formatting rules describe the format of a person name. + + + + + See Name format. + + + + + + States the complete name of a person. + The complete name is generally generated and saved by the Business Address Services (BAS) according to country-specific rules from the individual name components (without the form of address).If, during the formatting of an address, you want to use an alternative name, you can manually format the alternative name here. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Establishes if the business partner is meant to be archived. + If the indicator is set, the relevant business partner can be archived from the view of the business partner administration.If the check of the data to be archived shows, for example, that there are still active business transactions the archiving of the business partner data is prevented even if the indicator is set.If the indicator is not set, the business partner will not be taken into consideration during archiving. + + + + + Business partner number from an external system or a legacy system. + If the current business partner is known under a different number in an external system, you can store this number here for information purposes.Direct input gives you the option of maintaining a business partner by specifying the external business partner number. If you maintain business partner data in your legacy system, you can transmit changes made to business partners to the SAP system without having to know the SAP business partner number in the legacy system. + + + + + Company ID standard for the whole group. + + + + + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country-code or a typical country key, for example, in Germany the Federal statistics office key.The country keys are determined at system installation in the global settings.The definition of the country key in the SAP system does not have to match political or government entities.Since the country key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country key cannot query the country key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Different PO Box country in address. + The PO Box country can be entered here, if it is different from the street address country.If the address only has a PO Box address, the country is in the normal country field.Use this field if the address has two different country values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + Address number from an external system or a legacy system + If the current address has a different number in an external system, you can save this number here for information purposes.In direct input you are able to maintain an address for a business partner by stating the external address number. If your business partner data is maintained in a legacy system, you can thus transmit changes to a BP address to the SAP system without having to know the SAP address number in the legacy system. + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner's bank details. + Enter a bank details ID for each separate set of bank details for a business partner.Business Partner: H. MillerBD-ID Fin.institution Acct no. 0001 Chemical Bank, NYC 56234560002 Chemical Bank, NYC 56231220003 First Bank of Pittsburgh ...Business partner: T.Wolsey and Co.BD-ID Fin.institution Acct no.GIR0 Citibank, Charleston ...GIR1 Chemical Bank, NYC ... + + + + + Identifies the country in which the bank is based. + The country key determines according to which rules the remaining bank data (for example, bank number and bank account number) is checked. + + + + + The name under which the bank operates. + + + + + + The bank key (under which the bank data is stored in the appropriate country) is specified in this field. + The country-specific meaning of this bank key is specified when defining country key.Normally banks have a bank number, which then also appears in the control data of the bank.In certain countries the bank account number assumes this function; in such a case there would be no bank numbers, the bank details are then under the account number.For data medium exchange it can be useful to be able create banks for foreign business partners without a bank number, even if the country in question has bank numbers. In such cases the bank key can be assigned internally.If the bank data is under another key, such as the SWIFT code for example, numbers can also be assigned externally. + + + + + Uniquely identifies a bank throughout the world. + SWIFT stands for Society for Worldwide Interbank Financial Telecommunication.BIC stands for Bank Identifier Code.This globally unique code can be used in international payment transactions to identify the bank without the need to specify an address or bank number. Specification of the SWIFT code/BIC is mainly relevant for automatic payment transactions. + + + + + Brazil, France, Spain, Portugal and Italy + The field contains a check key for the combination bank number and bank account number.USAIn USA this field is used to differentiate between a savings and a current account (if no value is entered, the default value 01 is used).01 Current account02 Savings account03 Loan account04 General ledgerJapanIn Japan this field specifies the type of account. This information is is copied from the payment medium print program into payment medium. The following is an example of the account types used:01 FUTSU (similar to a savings account)02 TOUZA (similar to a current account)04 CHOCHIKU (similar to an investment account)09 Other types of bank accountsSouth AfricaIn South Africa this field specifies the type of account. The information entered here is forwarded to the bank that carries out the payment order. The following account types are permitted in ABC format:01 Current (Cheque) Account02 Savings Account03 Transmission Account04 Bond Account06 Subscription Share AccountArgentinaIn Argentina this field specifies the type of account:CC Current Account (Cuenta corriente)CA Saving Account (Caja de ahorro)CE Special Saving Account (Caja de ahorro especial)CS Salary Account (Cuenta sueldos)VenezuelaIn Venezuela this field specifies the type of account:CC Checking Account (Cuenta corriente)CA Saving Account (Cuenta de ahorro)CE Special Saving Account (Cuenta de ahorro especial)CS Salary Account (Cuenta sueldos)MexicoIn Mexico this field contains a two-digit key for classifying the bank account (for example, as a savings or current account). This key have different definitions, depending on the bank.NoteFor countries that are not listed here, this field can be used for account-specific information. + + + + + Here you can enter another name that the payment program can use if the name of the account holder is not the same as the name of the Business Partner. + + + + + + + + + A uniform standardized ID number for representing bank details that is in accordance with the ECBS (European Committee for Banking Standards). An IBAN has a maximum of 34 alphanumeric characters and is a combination of the following elements: + Country key of the bank (ISO code)Two-digit check numberCountry-specific account number (in Germany this consists of the bank number and account number, in France the bank number, account number and check key).The IBAN not only makes international payments easier, in some countries it has advantages for domestic payments as well. Depending on the country, it can mean advantages for value and fees.The IBAN can be maintained in parallel with the bank details but does not replace them. It is stored under the master data of the business partner and can then be used when creating the payment medium.Since it is only the bank that has the account that may generate the IBAN corresponding to an account number, the SAP system only generates a proposal. You can confirm or change this proposal. If no proposal is generated, enter the IBAN manually.An IBAN in Belgium may look like this:Electronic Form:BE62510007547061Printed form, as it would appear on an invoice:IBAN BE62 5100 0754 7061 + + + + + + This field contains the number under which the account is managed at the bank. + + + + + + Additional details for the bank details of the business partner. + In some countries the data for the bank details of the business partner (bank number, bank account number, name of the account holder) have to supplemented by other details in order to be able to use certain payment processes. This supplementary details are defined here.If additional data is required for the bank details for payment transactions in your country (see the following examples), enter the reference information.If for an automatic debit the bank requires the reference number of the collection authorization in Norway or Great Britain, specify this number here.In Great Britain when making payments to an account in a 'Building Society' you must specify which number payment recipient has. These details must be defined in the reference field, whereas the fields Bank Key and Account Number are to be used for the bank details of the 'Building Society'.In Great Britain when entering a building society account number, the name of the building society should also be maintained in the system. + + + + + States that the bank has collection authorization from the business partner for the account. + Set this indicator if the bank has collection authorization.Note for Accounts Receivable (FI-AR)If this indicator is not set, there is no bank collection.Note for Contract Accounts Receivable and Payable (FI-CA)This indicator is not relevant. + + + + + Name of the city as a part of the address. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + + States whether the relationship is a standard relationship. + If several relationships of the BP relationship category contact person have been defined for, you can set the indicator standard relationship for one of these relationships.A relationship that is marked as a standard relationship can be used whenA certain scenario automatically selects a contact personThe contact person responsible is not knownYou can give this indicator to only one business partner relationship of a BP relationship category for a particular period. Another relationship of the same relationship category can be indicated as the standard relationship only if the periods for the relationship do not overlap or coincide. + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Function that a business partner takes on, depending on a business transaction. + You can define business partner roles along with their attributes in Customizing.You can create an alphanumeric, 6-digit key for the BP role. You can also choose a title as the short form and a description as the long form for the role text.Screen control in the dialog takes place by assigning a BP view.A program can access specific business partner roles for a business partner using thebusiness partner role category . The role categories are also in the TB003 table. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Specifies the tax number category. + + + + + + Specifies the tax number. + + + + + + Specifies the tax number. + You can enter up to 60 characters in this field. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicates if the processing of billing documents is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block the processing of all credit memos to a certain customer, pending manual approval. + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + Specifies a classification of the customer (for example, classifies the customer as a bulk purchaser). + The classifications are freely definable according to the needs of your organization. + + + + + + + Indicates if delivery processing is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all deliveries to a certain customer for credit reasons. + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Indicates if sales order processing is blocked for the customer in all sales areas (company-wide, for example). + If you block sales order processing, the block counts for the following partner functions of the customer:Sold-to partyShip-to partyPayerIf you want to process an order where the ship-to party differs from the sold-to party, and the ship-to party is blocked, you cannot process the order.You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all free of charge deliveries and credit memo requests for a certain customer, pending manual approval before further processing can take place. + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Account number of another master record in which the official address is stored. This address is used, for example, for tax reports to the tax authorities in Italy. + + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Specifies the code that uniquely identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. You can assign more than one industry code to a customer by choosing Create more. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Specifies a regional division according to the market categories created by the A. C. Nielsen company. + By allocating a Nielsen division, you can use the services of the Nielsen Institute to create a market analysis of your customers. + + + + + Classification of companies according to tax aspects. + + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + This field contains the account number the company is listed under at the customer. + + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + + + Account number of the customer for whom automatic payment transactions are to be carried out.The account number is only needed if bank collections are not to be made via the customer who owes the receivables. The same applies to refunds of payables.The specification in this field only applies to this company code. There is another field in which you can enter an alternative payee for all company codes. If both fields are filled, the specification for the company code has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicator which specifies at what intervals the collective invoices are to be created for the customer. + + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + This field contains the account number of the head office. + This account number is only specified for branch accounts. All postings for which the account number of the branch is specified, are automatically posted to the head office account. The account number of the branch affected is noted in the line items.No line items or balances are managed in the branch account. + + + + + Indicates that during automatic payment transactions clearing is made with the corresponding vendor account, and that during manual clearing procedures, the items of that vendor account are also selected. + To use this function in automatic payment transactions, you have toenter the vendor account number in the customer master record,enter the customer account number in the vendor master record, andselect the "Clearing with customer" indicator in the vendor master record.If you set this indicator, the system will also include items of the vendor account in customer dunning. + + + + + All bank data is determined using this key. + + + + + + Enter an interest calculation indicator here if the account is to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in message control accordingly. + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + Indicator that the payment history of the customer is to be recorded. + The amount and number of payments are then recorded per calendar month, as well as the average days in arrears.Information about cash discount payments and net payments is recorded separately.The indicator should not be set for one-time accounts and accounts which are paid automatically (bank collection or bank bill in Germany, bill of exchange payment request in France).You can only carry out evaluation of the payment history, for example, with the report for customer evaluation with OI listing, if you have selected this field. + + + + + Name or identification code of the accounting clerk at the customer. + + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the customer who is to be the recipient of the dunning letters. + The account number is only needed if dunning letters are not sent to the customer who owes the receivables. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + This field contains the account number your company is listed under at the customer or vendor. + + + + + + The authorization group enables you protect access to certain objects. + In order to carry out a specific activity, the user must have authorization for the combination of the activity and the authorization group. + + + + + Indicates if further billing activities are blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, billing that is already underway is continued. However, you cannot process the document further.Enter one of the values predefined for your system. If you want to block billing for a customer throughout an entire sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block billing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Indicates whether a sales order must be delivered completely in a single delivery or whether the order can be partially delivered and completed over a number of deliveries. + + + + + + Customer's currency for a sales area. This currency will be used to settle the customer's charges for the given sales organization. + + + + + + + The account assignment group to which the system automatically posts the sales document. + The system uses the account assignment group as one of the criteria during the automatic determination of revenue accounts.The system automatically proposes the account assignment group from the customer master record of the payer. You can change the default value in the sales document or the billing document. + + + + + Identifies a particular group of customers (for example, wholesale or retail) for the purpose of pricing or generating statistics. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + A grouping of customers who share the same pricing requirements. + You can define price groups according to the needs of your organization and create pricing records for each group. You can, for example, define a group of customers to whom you want to give the same kind of discount. You can assign a price group to an individual customer either in the customer master record or in the sales document.The system can propose the price group from the customer master record. You can change the proposed value manually in the sales document at both header and item level. + + + + + Determines which pricing procedure the system should apply when you create a sales document for the customer. + You can define different pricing procedures for your system. A pricing procedure determines the type and sequence of conditions that the system uses for pricing in, for example, a sales order. + + + + + Indicates if further delivery processing is blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, delivery processing that is already underway is continued. However, no new processing can take place.Enter one of the values predefined for your system. If you want to block delivery processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block delivery processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + The delivery priority assigned to an item. + You can assign delivery priority to either a particular material or to a combination of customer and material. When you process deliveries collectively, you can use delivery priority as one of the selection criteria. + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Indicates that all data in the master record will be deleted for the specified sales area. Before the deletion is made, the system checks for dependent data that would prevent the deletion. + + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + Identifies the calendar that determines the schedule of billing dates for the customer. + If, for example, a customer wants to consolidate the invoices you send out, you can predefine the billing schedule in a calendar in the system. During billing, the system automatically proposes the appropriate billing date from the calendar.The system proposes the billing schedule from the customer master record of the payer. You can change the value manually in the sales document. + + + + + The probability (expressed as a percentage) of the customer confirming the inquiry or quotation item as part of a sales order. + The system combines the probability factors from the sales document type and from the customer master record of the sold-to party.If probability is 80% for the sales document type and 50% in the customer master record, the system combines the two values. In this case, the system takes 50% of 80% and proposes 40% for the item.The system proposes the probability. You can change the value manually for the item.You can generate requirements from quotations. Accordingly, the probability of quotation items affects how requirements are passed on. For example, a quotation for 100 pieces and a probability of 50% will generate requirements for 50 pieces. + + + + + Indicates whether you are allowed to combine orders during delivery processing. + The system proposes the indicator from the customer master record. You can change the value manually in the sales document at both header and item level. + + + + + Indicates if further sales order processing is blocked for the customer. The block applies throughout the specified sales area. + You can define blocks according to the needs of your organization. If you enter a blocking indicator, sales order processing that is already underway is continued. However, no new processing can occur.Enter one of the values predefined for your system. If you want to block sales order processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sale organization is defined.You can block sales order processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Specifies whether the customer requires full or partial delivery for the item. + You use this field to control partial deliveries at the item level. If the customer allows partial delivery, you can choose from different partial delivery options. For example, you can specify whether the customer allows you to make one delivery attempt only on the requested delivery date or whether unlimited delivery attempts are possible.When partial delivery indicator 'D' is set, the order can never have status 'fully delivered'. You must complete each item by entering a reason for rejection. This could be applied to scheduling agreements, for example.You can enter a value in this field only if the customer allows partial deliveries for the entire sales document. + + + + + Identifies a price list or other condition type (for example, a surcharge or discount). + You can define price list types according to the needs of your own organization. Price list types can be grouped according to:the kind of price list (for example, wholesale or retail)the currency in which the price appearsthe number of the price list typeYou can use price list types to apply conditions during pricing or to generate statistics.In the customer master record, enter one of the values predefined for your system. The system proposes the value automatically during sales order processing. You can change the value manually in the sales document header. + + + + + A group of sales people who are responsible for processing sales of certain products or services. + By using sales groups you can designate different areas of responsibility within a sales office. When you generate sales statistics, you can use the sales group as one of the selection criteria.If sales office personnel service both retail and wholesale markets, you can assign a sales group to each market.You assign each salesperson to a sales group in his or her user master record. You assign each customer to a particular sales group in the customer's master record. + + + + + A physical location (for example, a branch office) that has responsibility for the sale of certain products or services within a given geographical area. + When you create sales statistics, you can use a sales office as one of the selection criteria. When you print out order confirmations, you can include the address of the sales office.You can assign each customer to a sales office in the customer master record.Within a sales office you can establish sales groups (for example, departments) with specific sales responsibilities. Each person who works in the sales office can be assigned to a sales group in his or her user master record. Each customer can also be assigned to a particular sales group in the customer master record. + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Plant from which the goods should be delivered to the customer. + This plant is automatically copied into the sales order item as the default value.If there is no default value when you process the sales order item, enter a delivering plant.The value proposed in the item is eitherfrom the customer master record of the goods recipient, orfrom the material master recordThe system checks whether it can propose a value (and for your own plants, whether the material has been created in the plant). If the system can propose a value, the plant is copied to the sales order item where you can change it as required. + + + + + A geographical sales district or region. + Each customer can be assigned to a sales district. You can use sales districts to apply pricing conditions. When you want to generate sales statistics, you can use sales districts as a selection criteria.The system can propose a value from the customer master record of the sold-to party. You can change the value manually in the document at the header or item level. + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + Specifies a distribution channel that you want to use as a reference for customer and material master data for other distribution channels. + You can specify one distribution channel as the source of customer and material master data for other distribution channels. You need then only to maintain the data in one place.Distrib.channel Ref.distrib.channel01 0102 0103 0104 04In this example, only distribution channels 01 and 04 have customer and material master data defined. Distribution channels 01, 02, and 03 share the master data that you defined for distribution channel 01. Distribution channel 04 has its own master data. When you create a sales order in distribution channel 03, the system checks the customer and material master data against the data defined for distribution channel 01. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + Identifies the country in which the delivery originates. + You can define the country key in a table. As a rule, it is a good idea to use the existing international standards for identifying vehicles from different countries (for example: USA = United States, I = Italy, and so on). The system uses the key tohelp determine the relevant taxes during pricingdetermine important country-specific standards (the length of postal codes and bank account numbers, for example) + + + + + Identifies the condition that the system uses to automatically determine country-specific taxes during pricing. + You can define one or more tax categories for each country. During sales order processing, the system applies the tax category according tothe geographical location of your delivering plant and the location of the customer receiving the goodstax classifications in the customer master record and the material master record.In the USA, for example, you can define tax categories for Federal Sales Tax and Federal Excise Tax. In the U.K., you can define a tax category for Value Added Tax (VAT). + + + + + Specifies the tax liability of the customer, based on the tax structure of the customer's country. + You can use the tax classification to specify, for example, whether a customer is liable for sales taxes, such as VAT or state sales taxes.During sales order processing, the system copies the tax classification from the tax information stored in thecustomer master record of the payer, if the payer is different from the sold-to party and the sales tax identification number is maintained for the payer.ship to party, if the sales tax identification number of the ship-to party is maintained.sold-to party, if none of the criteria for the payer or the ship-to party are met.During pricing, the system calculates any relevant taxes by taking the following factors into account:The tax classification of the customer and the materialThe country keys of the customer and the delivering plant + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + + Date from which: + The company code is obligated to withhold tax for the given withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obligated to withhold tax for the withholding tax type.This date must be defined in the customer master record. + + + + + Date to which: + The company code is obligated to withhold tax for the withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obigated to withhold tax for the withholding tax type. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + + Sold-to party number sent in by the customer in delivery schedules. + The system uses this number to automatically determine the ship-to party. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The account number of the vendor with whom automatic payment transactions are carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies to all company codes. There is a further field in which every company code can enter an alternative payee separately. If both fields are filled, the company code specification has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Indicates whether or not the supplier master record is blocked for all departments (that is, whether or not posting to this record is allowed at all). + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + Specifies an additional master record in which the official address is stored. + This address is used in Italy for business transactions with the tax office in Italy. + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Classification of companies according to tax aspects. + + + + + + Date up to which the certification of the QM-system is valid. + + + + + + If a QM system is maintained by the supplier, you can store a description of the QM system here. + If a material is activated for QM in procurement, the system initiates the following check whenever purchasing functions are carried out (for example, when a request for a quotation is made or if a purchase order is created):Whether the supplier's verified QM system, according to supplier master record or quality info-record (for a combination of supplier/material) meets the requirements for QM systems as specified in the material masterIn carrying out the check, the system relies on the defined assignments for target QM systems and actual QM systems in the Customizing application.If the check is unsuccessful, a warning message is issued when a request for quotation is initiated and an error message is issued for all other procurement activities. + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Key that determines which procurement functions (for example, request for quotation, purchase order, or goods receipt) should be blocked for quality reasons. + You can enter a block key in the:Supplier master recordIn this case, the supplier block applies to all materials and plants.Quality info record for QM in procurementIn this case, the supplier block applies to a single material and plant.A block for quality reasons applies only to those materials for which QM in procurement is active. + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + The tax number of the vendor at the responsible tax authority. + + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in message control accordingly. + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + Name or identification code of the accounting clerk at the vendor. + + + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Indicates that during automatic payment transactions, clearing is made with the corresponding customer account, and that during manual clearing procedures, the items of that customer account are also selected. + To use this function in automatic payment transactions, you have toenter the customer account number in the vendor master record,enter the vendor account number in the customer master record, andselect the "Clearing with vendor" indicator in the customer master record.If this indicator is set, items belonging to the customer account will be included in any dunning run. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + All bank data is determined using this key. + + + + + + Number of days which usually pass until the vendor has cashed your check. + During automatic payment transactions, the system calculates the value date for check payments using this information and stores the date in the line item. The date is calculated as follows:Value date = posting date + check cashing timeIn Cash Management, the value date is used as information about the expected cash outflow. + + + + + Maximum amount which may be issued on a bill of exchange if it is to be used in payment transactions with the business partner. + The amount limit is taken into consideration in automatic payment transactions for payments by bill of exchange and bill of exchange payment requests. Several bill of exchange forms are created if the amount to be settled is higher than the maximum amount given here. Each of these bills of exchange is issued for the maximum amount or for a smaller amount.Amount limits for bills of exchange are used in Spain, for example. + + + + + This field contains the account number the company is listed under at the vendor. + + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + Enter an interest calculation indicator here if the account is to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + This field contains the account number of the master record for the head office account. + You specify this account number only for branch accounts. Items that you post using the branch account number are automatically posted to the head office account. The system records the branch account number in the line items.Neither transactions nor balances are kept in the branch account. + + + + + The account number of the vendor with whom automatic payment transactions are to be carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies only to the company code. There is a further field in which you can enter an alternative payee for each company code. If both fields are filled, the company code specified has priority. + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + US government requirement. + Date field in which to enter certification date for small companies run by women or minorities. This certificate must be renewed every two years. + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + In some countries, an additional country is needed for calculating or reporting withholding tax. + The calculation can depend on the payee's country.A particular country key can be required by law for reporting which may possibly be different to the key used in the address.Examples: Japan, USA (1042), Argentina + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. + You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... + + + + + When incoming invoices are entered or when memos are entered in Financial Accounting (FI), the system checks whether an invoice or credit memo has already been entered for the same date. + Checking Logistics DocumentsThe system checks whether the invoice documents have already been entered in the Logistics invoice verification. For this, the system checks invoices that have been held or parked or that contain errors, or invoices that were entered for invoice verification in the background. The check is performed only if you specify the reference document number when you enter the invoices.When checking for duplicate invoices, the system compares the following specified characteristics:VendorCurrencyCompany CodeGross Invoice AmountReference Document NumberInvoice Document DateIf all of these characteristics are the same, the system issues a message for which you can change the message type in Customizing.When you enter credit memos or subsequent adjustments, the system does not check for duplicate invoices.Exception: The exception is the Argentina country version, where the system checks for duplicate invoices and credit memos.No message is issued if you enter a document that has previously been reversed.In Customizing for Logistics Invoice Verification under Incoming Invoice -> Set Check for Duplicate Invoices, you can specify that the following characteristics are not checked:Reference Document NumberInvoice Document DateCompany CodeHaving fewer attributes to check increases the likelihood that the system will find a duplicate invoice.Example:The following document has already been entered and posted:Reference Document Number 333Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: ChicagoYou have set up the check for duplicate invoices as follows in Customizing:The characteristics Reference Document Number and Company Code are not activated. Consequently, these characteristics are not checked.Now you enter the following invoice:Reference Document Number 334Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: FlagstaffResultBecause you entered a reference document when you entered the invoice, the system checks for duplicate invoices. Compared against the invoice entered earlier, the invoice just entered has different values in the characteristics Reference and Company Code. However, these characteristics are not checked due to the settings that you have made in Customizing. All other characteristics are the same. The system issues a message telling you that an invoice has been entered twice.If the characteristic "Reference Document Number" had been selected in Customizing, the system would have checked the reference document number and established that it was different from the invoice entered earlier, and it consequently would not have issued a message.Checking FI DocumentsThe system checks whether there are FI documents that were posted or parked with the Logistics invoice verification or with an FI invoice transaction. Depending on the entry in the Reference field, one of the following checks is performed:If a reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateReference NumberIf no reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateAmount in Document CurrencyIn Materials Management, the system applies the check for duplicate invoices for invoices only, not for credit memos. + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the vendor who is to receive the dunning notice. + Note:If an entry is not made in this field, the dunning notice is sent to the address of the vendor to be processed. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Denotes the purchasing organization. + + + + + + Subdivision of a supplier's overall product range according to various criteria. + For each supplier sub-range:The master data is kept on a common basisCertain conditions applyIn the supplier master, you can create different purchasing data and different partner functions for each supplier sub-range.You can also maintain and change the conditions for each supplier sub-range. You assign a material to a supplier sub-range in the info record.In the supplier master, you can maintain different data for particular supplier sub-ranges, such as ordering addresses or terms of payment, for example.When creating a purchase order with a known supplier, different data is only determined if the supplier sub-range is entered in the initial screen.Your supplier Smith in Houston has two sub-ranges: paint and glue.All materials from the "paint" sub-range are ordered in Houston.You have maintained an alternative ordering address in Detroit for the "glue" sub-range.If you order materials from the "glue" sub-range, the supplier sub-range finds the Detroit ordering address. + + + + + Key uniquely identifying a plant. + + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + Alphanumeric key uniquely identifying the document. + With the supplier number, information from the supplier master record (such as the supplier's address and bank details) is copied into a purchasing document (such as a request for quotation or a purchase order).You can use the supplier number to keep track of requests for quotation, purchase orders and outline agreements. + + + + + Denotes the purchasing organization. + + + + + + Determines which calculation schema (pricing procedure) is to be used in purchasing documents containing this supplier number. + You can use the schema group to specify the calculation schema per purchasing organization or supplier. The relevant calculation schema is determined by reference to the schema group.The effect of this is that the conditions to be maintained in a purchasing document can differ depending on the relevant purchasing organization or supplier.If a calculation schema is only to be valid for certain purchasing organizations or suppliers, proceed as follows:Define the schema group for the purchasing organization or the supplier using the relevant function in the menu "Calculation schema -> Schema groups".Assign the schema group to the calculation schema via "Calculation schema -> Determine schema".Enter the schema group for the supplier in the supplier master records to which the calculation schema is to be assigned. Assign the schema group of the purchasing organization to the relevant purchasing organization using "Calculation schema -> Schema group -> Assign to purch. org.". + + + + + Indicates whether or not the supplier master record is earmarked for deletion. + + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + Indicator specifying that provision has been made for goods-receipt-based invoice verification for a purchase order item or invoice item. + + + + + + Number of calendar days needed to obtain the material or service if it is procured externally. + If you have different vendors for a material, you must specify an average value. The same applies if you order the material from a fixed vendor that has varying delivery times.If you use the SAP Retail System, the planned delivery time can be suggested from the vendor sub-range in the vendor master record. + + + + + Minimum value specified for purchase orders issued to the relevant supplier. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Determines which date is to be used for price determination (pricing) purposes. + Enter the key for the desired date.If you choose the date of goods receipt, for example, a new price will be determined upon the arrival of the goods, causing the item to be revaluated at this time.NoteIf you have chosen the delivery date as the date for price determination and an item contains several delivery dates (i.e. has a delivery schedule), the first delivery date (the delivery date specified in the first schedule line) is taken. + + + + + Allows you to automatically generate purchase orders from purchase requisitions if the requisition has been assigned to a supplier (source of supply). + If you want to use automatic conversion, note the following additional conditions:In the case of purchase requisitions for materials, you should also select the indicator Autom.purch.ord. in the Purchasing view in the material master record.In the case of purchase requisitions for services, you should also select the indicator Automatic creation of POs for service PReqs in Customizing for Services by choosing:IMG -> MM -> External Services Management -> Source Determination and Default Values- for Client or- for Purchasing Organization + + + + + Key for the currency on which an order placed with a supplier is based. + + + + + + Key for a buyer or a group of buyers, who is/are responsible for certain purchasing activities. + Internally, the purchasing group is responsible for the procurement of a material or a class of materials.Externally, it is the medium through which contacts with the vendor are maintained. + + + + + Indicates whether or not the supplier master record is blocked for the purchasing organization for posting purposes. + + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Means of classifying suppliers according to their significance to your company. + The indicator serves to assign the supplier to one of the categories A, B or C, in accordance with ABC analysis.'A' category suppliers, for instance, are those accounting for the greatest share of the company's total annual spend (in value terms). + + + + + This telephone number is maintained in the supplier master record and adopted in the purchasing document. + + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + + The type of recipient can be defined in the vendor master record. + It is used to group vendors together according to particular characteristics such as occupations that may be subject to the same withholding tax type, but which are required to pay different percentage rates (as defined by the withholding tax code).Application in ThailandThis corresponds to the official Thai form number (Phaw.Ngor.Daw) and is used to determine the sequential numbering of a withholding tax certificate. The form number is defined in the vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + aggregate + groupby + filter + + + + + + + + + + + diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv b/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv new file mode 100644 index 00000000..a3ae063b --- /dev/null +++ b/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv @@ -0,0 +1,7 @@ +BusinessPartner;BusinessPartnerFullName +ACME;A Company Making Everything +B4U;Books for You +S&C;Shakespeare & Co. +WSL;Waterstones +TLD;Thalia +PNG;Penguin Books diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv b/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv new file mode 100644 index 00000000..cbb3ca2e --- /dev/null +++ b/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv @@ -0,0 +1,5 @@ +ID;name +ACME;A Company Making Everything +B4U;Books for You +S&C;Shakespeare & Co. +WSL;Waterstones diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds new file mode 100644 index 00000000..5e95d3fc --- /dev/null +++ b/suppliers/srv/mashup.cds @@ -0,0 +1,47 @@ +/* + Optionally add projections to external entities, to capture what + you actually want to use from there. + */ + +using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; +extend service S4 with { + entity Suppliers as projection on S4.A_BusinessPartner { + key BusinessPartner as ID, + BusinessPartnerFullName as name, + } +} + + +/* + You can mashup entities from external services, or projections + thereof, with your project's own entities + */ +using { sap.capire.bookshop.Books } from '@capire/bookshop'; +extend Books with { + supplier : Association to S4.Suppliers; +} + + +/* + You can also expose external entities through your own services + For this to work, you need to delegate the respective calls + addressed to your services into calls to the external service. + */ +extend service AdminService with { + entity Suppliers as projection on S4.Suppliers; +} + +/* + Optionally add a local persistence to keep replicas of external + entities to have data in fast access locally; much like a cache. + */ +annotate S4.Suppliers with @cds.persistence:{table,skip:false}; + +/** + Having locally cached replicas also allows us to display supplier + data in lists of books, which otherwise would generate unwanted + traffic on S4 backends. + */ +extend projection CatalogService.ListOfBooks with { + supplier +} diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js new file mode 100644 index 00000000..accf6d79 --- /dev/null +++ b/suppliers/srv/mashup.js @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Mashing up provided and required services... +// +module.exports = async()=>{ // called by server.js + + if (!cds.services.AdminService) return //> mocking S4 service only + + // Connect to services we want to mashup below... + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service + const admin = await cds.connect.to('AdminService') //> local domain service + const db = await cds.connect.to('db') //> our primary database + + // Reflect CDS definition of the Suppliers entity + const { Suppliers } = S4bupa.entities + + admin.prepend (()=>{ + + // Delegate Value Help reads for Suppliers to S4 backend + admin.on ('READ', 'Suppliers', async req => { + console.log ('>> delegating to S4 service...') + return await S4bupa.run(req.query) + }) + + + // Replicate Supplier data when Books are edited + admin.on (['CREATE','UPDATE'], 'Books', async (req,next) => { + let { supplier } = req.data + if (supplier) { + let cached = await db.exists (Suppliers, supplier) + if (!cached) await replicate (supplier,'initial') + } + return next() + }) + + }) + + // Subscribe to changes in the S4 origin of Suppliers data + S4bupa.on ('BusinessPartner/Changed', async msg => { + let cached = await SELECT('ID').from (Suppliers) + .where ('ID in', msg.businessPartner.KEYS) + for (let each of cached) replicate (each) + }) + + // Helper function to replicate Suppliers data + async function replicate (ID,_initial) { + let data = await S4bupa.read (Suppliers, ID) + if (_initial) return db.insert (data) .into (Suppliers) + else return db.update (Suppliers,ID) .with (data) + } + +} From a5c8b5101ede4440174772fa8b713c255f47466e Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Wed, 17 Feb 2021 16:00:10 +0100 Subject: [PATCH 002/100] Make the CatalogService usage more obvious --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 5e95d3fc..a4df66d0 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -16,7 +16,7 @@ extend service S4 with { You can mashup entities from external services, or projections thereof, with your project's own entities */ -using { sap.capire.bookshop.Books } from '@capire/bookshop'; +using { sap.capire.bookshop.Books, CatalogService } from '@capire/bookshop'; extend Books with { supplier : Association to S4.Suppliers; } From 5f176a0b8866dc449fb31ca190fb37a4c99298f0 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:06:51 +0100 Subject: [PATCH 003/100] Delete .gitignore --- suppliers/.gitignore | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 suppliers/.gitignore diff --git a/suppliers/.gitignore b/suppliers/.gitignore deleted file mode 100644 index b8e5bc14..00000000 --- a/suppliers/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# CAP demo -_out -*.db -connection.properties -default-*.json -gen/ -node_modules/ -target/ - -# Web IDE, App Studio -.che/ -.gen/ - -# MTA -*_mta_build_tmp -*.mtar -mta_archives/ - -# Other -.DS_Store -*.orig -*.log - -*.iml -*.flattened-pom.xml - -# IDEs -# .vscode -# .idea From 796bf62bdeb0c1063016e23b7cc377f4a7089378 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:02 +0100 Subject: [PATCH 004/100] Delete extensions.json --- suppliers/.vscode/extensions.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 suppliers/.vscode/extensions.json diff --git a/suppliers/.vscode/extensions.json b/suppliers/.vscode/extensions.json deleted file mode 100644 index 1daacbd8..00000000 --- a/suppliers/.vscode/extensions.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - // >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!, - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "mechatroner.rainbow-csv", - "humao.rest-client", - "alexcvzz.vscode-sqlite", - "hbenl.vscode-mocha-test-adapter", - "sdras.night-owl" - ], - // List of extensions recommended by VS Code that should not be recommended for users of this workspace. - "unwantedRecommendations": [ - - ] -} From f1d780d6d9726d7a0ed04a1f68be8d7b8a734751 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:23 +0100 Subject: [PATCH 005/100] Delete tasks.json --- suppliers/.vscode/tasks.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 suppliers/.vscode/tasks.json diff --git a/suppliers/.vscode/tasks.json b/suppliers/.vscode/tasks.json deleted file mode 100644 index 622da99a..00000000 --- a/suppliers/.vscode/tasks.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "type": "shell", - "label": "cds watch", - "command": "cds", - "args": ["watch"], - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "type": "shell", - "label": "cds run", - "command": "cds", - "args": ["run", "--with-mocks", "--in-memory?"], - "problemMatcher": [] - } - ] -} From f0fead2bc225701c9517de40191eb61c32151510 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:43 +0100 Subject: [PATCH 006/100] Delete launch.json --- suppliers/.vscode/launch.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 suppliers/.vscode/launch.json diff --git a/suppliers/.vscode/launch.json b/suppliers/.vscode/launch.json deleted file mode 100644 index 3f308a6c..00000000 --- a/suppliers/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "command": "cds run --with-mocks --in-memory?", - "name": "cds run", - "request": "launch", - "type": "node-terminal", - "skipFiles": [ "/**" ] - } - ] -} From 6d3f4c689f3cff49e5812136b320c723ab19a932 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:53 +0100 Subject: [PATCH 007/100] Delete settings.json --- suppliers/.vscode/settings.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 suppliers/.vscode/settings.json diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json deleted file mode 100644 index 9fefa082..00000000 --- a/suppliers/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files.exclude": { - "**/.gitignore": true, - "**/.git": true, - "**/.vscode": true - } -} From 5015eb8c52fed5e524f5bc2a9c1b78ea81e21dce Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:53:54 +0100 Subject: [PATCH 008/100] cosmetics --- suppliers/srv/mashup.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index accf6d79..7185251f 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -4,10 +4,10 @@ // module.exports = async()=>{ // called by server.js - if (!cds.services.AdminService) return //> mocking S4 service only + if (!cds.services.AdminService) return //> mocking SAP S4/HANA service only // Connect to services we want to mashup below... - const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external SAP S4/HANA service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database @@ -16,7 +16,7 @@ module.exports = async()=>{ // called by server.js admin.prepend (()=>{ - // Delegate Value Help reads for Suppliers to S4 backend + // Delegate Value Help reads for Suppliers to SAP S4/HANA backend admin.on ('READ', 'Suppliers', async req => { console.log ('>> delegating to S4 service...') return await S4bupa.run(req.query) @@ -35,7 +35,7 @@ module.exports = async()=>{ // called by server.js }) - // Subscribe to changes in the S4 origin of Suppliers data + // Subscribe to changes in the SAP S4/HANA origin of Suppliers data S4bupa.on ('BusinessPartner/Changed', async msg => { let cached = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartner.KEYS) From 0aa95a0a67ed6a79711df676112ebb85ed6a4e66 Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:54:47 +0100 Subject: [PATCH 009/100] cosmetics --- samples.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples.md b/samples.md index 995a069e..be1c164d 100644 --- a/samples.md +++ b/samples.md @@ -51,8 +51,8 @@ Each sub directory essentially is an individual npm package arranged in an [all- ## [@capire/suppliers](suppliers) -- Shows how to integrate remote services, in this case the BusinessPartner service from S/4. -- Extending [@capire/bookshop](bookshop) with suppliers from S/4 +- Shows how to integrate remote services, in this case the BusinessPartner service from SAP S/4HANA. +- Extending [@capire/bookshop](bookshop) with suppliers from SAP S/4HANA - Providing that as a pre-built integration & extension package - Used in [@capire/fiori](fiori) From e5bd8ec5a508d0321b20e42e9665030a07beeace Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:55:27 +0100 Subject: [PATCH 010/100] cosmetics --- suppliers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/package.json b/suppliers/package.json index e1cfb4bc..f500d495 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -1,7 +1,7 @@ { "name": "@capire/suppliers", "version": "1.0.0", - "description": "Shows integration with S/4, in turn provided as a reusable extension package to bookshop.", + "description": "Shows integration with SAP S/4HANA, in turn provided as a reusable extension package to bookshop.", "private": true, "dependencies": { "@capire/common": "*", From 3320c7e5a248738fe6b8579657214304f0cbb217 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 19 Feb 2021 12:15:35 +0100 Subject: [PATCH 011/100] some corrections and optimizations --- suppliers/srv/mashup.cds | 8 ++++++ suppliers/srv/mashup.js | 55 ++++++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index a4df66d0..33d607c9 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -8,6 +8,14 @@ extend service S4 with { entity Suppliers as projection on S4.A_BusinessPartner { key BusinessPartner as ID, BusinessPartnerFullName as name, + // REVISIT: following is not supported so far in cds compiler... + // to_BusinessPartnerAddress as city { + // CityCode as code, + // CityName as name + // } + // REVISIT: following is not supported so far in cqn2odata... + // to_BusinessPartnerAddress.CityCode as city, + // to_BusinessPartnerAddress.CityName as city_name, } } diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 7185251f..a77b238c 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -4,49 +4,54 @@ // module.exports = async()=>{ // called by server.js - if (!cds.services.AdminService) return //> mocking SAP S4/HANA service only + if (!cds.services.AdminService) return //> mocking S4 service only // Connect to services we want to mashup below... - const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external SAP S4/HANA service + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database // Reflect CDS definition of the Suppliers entity const { Suppliers } = S4bupa.entities - admin.prepend (()=>{ + admin.prepend (()=>{ //> to ensure our .on handlers below go before the default ones - // Delegate Value Help reads for Suppliers to SAP S4/HANA backend - admin.on ('READ', 'Suppliers', async req => { + // Delegate Value Help reads for Suppliers to S4 backend + admin.on ('READ', 'Suppliers', req => { console.log ('>> delegating to S4 service...') - return await S4bupa.run(req.query) + return S4bupa.run(req.query) }) - - // Replicate Supplier data when Books are edited - admin.on (['CREATE','UPDATE'], 'Books', async (req,next) => { - let { supplier } = req.data - if (supplier) { - let cached = await db.exists (Suppliers, supplier) - if (!cached) await replicate (supplier,'initial') - } - return next() + // Replicate Supplier data when edited Books have suppliers + admin.on (['CREATE','UPDATE'], 'Books', ({data:{supplier}}, next) => { + // Using Promise.all(...) to parallelize local write, i.e. next(), and replication + if (supplier) return Promise.all ([ next(), async()=>{ + let replicated = await db.exists (Suppliers, supplier) + if (!replicated) await replicate (supplier, 'initial') + }]) + else return next() //> don't forget to pass down the interceptor stack }) }) - // Subscribe to changes in the SAP S4/HANA origin of Suppliers data - S4bupa.on ('BusinessPartner/Changed', async msg => { - let cached = await SELECT('ID').from (Suppliers) - .where ('ID in', msg.businessPartner.KEYS) - for (let each of cached) replicate (each) + // Subscribe to changes in the S4 origin of Suppliers data + S4bupa.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 + let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartners) + return replicate (replicas.map(each => each.ID)) }) - // Helper function to replicate Suppliers data - async function replicate (ID,_initial) { - let data = await S4bupa.read (Suppliers, ID) - if (_initial) return db.insert (data) .into (Suppliers) - else return db.update (Suppliers,ID) .with (data) + /** + * Helper function to replicate Suppliers data. + * @param {string|string[]} IDs a single ID or an array of IDs + * @param {truthy|falsy} _initial indicates whether an insert or an update is required + */ + async function replicate (IDs,_initial) { + if (!Array.isArray(IDs)) IDs = [ IDs ] + let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) + if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert + else return Promise.all(suppliers.map ( //> parallelizing updates + each => db.update (Suppliers,each.ID) .with (each) + )) } } From 3e52a9a102ade7464f206cd8c85e7501f0d09839 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Mar 2021 19:19:29 +0100 Subject: [PATCH 012/100] Adding fix-antlr script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 752312d2..7f4917ac 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "sqlite3": "5.0.0" }, "scripts": { + "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From 0ddd70acbca10771ebaef12e7eba38e1482ad2c1 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 11 Mar 2021 14:14:59 +0100 Subject: [PATCH 013/100] Using event : projection on Reviews --- reviews/srv/reviews-service.cds | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reviews/srv/reviews-service.cds b/reviews/srv/reviews-service.cds index eb26d9ae..07262fa8 100644 --- a/reviews/srv/reviews-service.cds +++ b/reviews/srv/reviews-service.cds @@ -8,9 +8,9 @@ service ReviewsService { action unlike (review: type of Reviews:ID); // Async API - event reviewed : { - subject: type of Reviews:subject; - rating: Decimal(2,1) + event reviewed : projection on Reviews { + subject, + rating } // Input validation From 99dc8d31d76be9b0ffd4cc74da51e95c570eb157 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:27:29 +0100 Subject: [PATCH 014/100] . --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index dc61f6f7..c2b8455b 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "scripts": { "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", + "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules && cd test/_cap/samples", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From 2f96b9285447b0bbef1416214d59fb3d41c16d68 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:30:18 +0100 Subject: [PATCH 015/100] . --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c2b8455b..1318f133 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "scripts": { "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", - "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules && cd test/_cap/samples", + "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From 7d9303635e8b795559cc4775c9cb8d76729c28f2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:44:39 +0100 Subject: [PATCH 016/100] . --- suppliers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/package.json b/suppliers/package.json index f500d495..109d8caa 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -5,7 +5,7 @@ "private": true, "dependencies": { "@capire/common": "*", - "@sap/cds": "^4", + "@sap/cds": ">=4", "express": "^4" }, "scripts": { From 0d19e56509dcefece63e2c9028a580e556ec2f2a Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 13 May 2021 12:29:22 +0200 Subject: [PATCH 017/100] cosmetic changes --- bookshop/srv/cat-service.cds | 5 +++-- reviews/srv/reviews-service.cds | 4 ++-- suppliers/srv/mashup.cds | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bookshop/srv/cat-service.cds b/bookshop/srv/cat-service.cds index 4cc44dff..81777afb 100644 --- a/bookshop/srv/cat-service.cds +++ b/bookshop/srv/cat-service.cds @@ -2,8 +2,9 @@ using { sap.capire.bookshop as my } from '../db/schema'; service CatalogService @(path:'/browse') { /** For displaying lists of Books */ - @readonly entity ListOfBooks as projection on Books - excluding { descr }; + @readonly entity ListOfBooks as projection on Books { + ID, author, genre, price, currency + } /** For display in details pages */ @readonly entity Books as projection on my.Books { *, diff --git a/reviews/srv/reviews-service.cds b/reviews/srv/reviews-service.cds index a4505b3d..6fe6daa7 100644 --- a/reviews/srv/reviews-service.cds +++ b/reviews/srv/reviews-service.cds @@ -9,8 +9,8 @@ service ReviewsService { // Async API event reviewed : projection on Reviews { - subject, - rating + subject, //> recieved new reviews + rating //> new avg rating } // Input validation diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 33d607c9..11087d77 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -51,5 +51,5 @@ annotate S4.Suppliers with @cds.persistence:{table,skip:false}; traffic on S4 backends. */ extend projection CatalogService.ListOfBooks with { - supplier + supplier.name as supplier } From 6b08826af51651f6b31fce8454fbadd23c634b85 Mon Sep 17 00:00:00 2001 From: D065023 Date: Tue, 18 May 2021 09:03:18 +0200 Subject: [PATCH 018/100] Mocking events from SAP S/4HANA --- suppliers/srv/external/API_BUSINESS_PARTNER.js | 11 +++++++++++ suppliers/srv/mashup.cds | 9 +++++++++ suppliers/srv/mashup.js | 6 +++--- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.js diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js new file mode 100644 index 00000000..d092f316 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -0,0 +1,11 @@ +const cds = require("@sap/cds"); + +module.exports = cds.service.impl(function () { + const { A_BusinessPartner } = this.entities; + + this.after("UPDATE", A_BusinessPartner, (data, req) => + this.tx(req).emit("BusinessPartner.Changed", { + BusinessPartner: data.BusinessPartner + }) + ); +}); diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 11087d77..89cbaded 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -53,3 +53,12 @@ annotate S4.Suppliers with @cds.persistence:{table,skip:false}; extend projection CatalogService.ListOfBooks with { supplier.name as supplier } + +// Extend S4 service with modeled event +extend service S4 { + @type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1' + event BusinessPartner.Changed { + BusinessPartner: S4.A_BusinessPartner:BusinessPartner; + } +} + diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index a77b238c..a6ef1d5a 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -35,9 +35,9 @@ module.exports = async()=>{ // called by server.js }) // Subscribe to changes in the S4 origin of Suppliers data - S4bupa.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 - let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartners) - return replicate (replicas.map(each => each.ID)) + S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 + let replica = await SELECT.one('ID').from (Suppliers) .where ({ID: msg.data.BusinessPartner}) + return replicate (replica.ID) }) /** From adfe170e8d7ffb434932e7e687c9fcdcf075b350 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 21 May 2021 14:03:27 +0200 Subject: [PATCH 019/100] Convenience --- suppliers/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/suppliers/package.json b/suppliers/package.json index 109d8caa..10ce7031 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -15,6 +15,9 @@ }, "cds": { "requires": { + "db": { + "kind": "sql" + }, "API_BUSINESS_PARTNER": { "kind": "odata", "model": "srv/external/API_BUSINESS_PARTNER" From 624cea634393e98f42dba37fba8e36e7106ee65b Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 4 Jun 2021 11:34:08 +0200 Subject: [PATCH 020/100] running suppliers --- suppliers/.env | 2 ++ suppliers/requests.http | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 suppliers/.env create mode 100644 suppliers/requests.http diff --git a/suppliers/.env b/suppliers/.env new file mode 100644 index 00000000..616dd8d0 --- /dev/null +++ b/suppliers/.env @@ -0,0 +1,2 @@ +cds.requires.messaging.kind = file-based-messaging +PORT = 4006 \ No newline at end of file diff --git a/suppliers/requests.http b/suppliers/requests.http new file mode 100644 index 00000000..eb4ff156 --- /dev/null +++ b/suppliers/requests.http @@ -0,0 +1,14 @@ + +@S4bupa = http://localhost:4006/api-business-partner + +################################################# +# +# Suppliers Service (-> S/4) +# + +PATCH {{S4bupa}}/A_BusinessPartner('ACME') +Content-Type: application/json + +{ "FirstName":"ACME" } + +### From 593228a51e333f008b9852cef337eb82551a18ae Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 4 Jun 2021 11:34:52 +0200 Subject: [PATCH 021/100] cds.events test --- test/cds.events.test.js | 22 ++++++++++++++++++++++ test/events.cds | 6 ++++++ 2 files changed, 28 insertions(+) create mode 100644 test/cds.events.test.js create mode 100644 test/events.cds diff --git a/test/cds.events.test.js b/test/cds.events.test.js new file mode 100644 index 00000000..1ebe576c --- /dev/null +++ b/test/cds.events.test.js @@ -0,0 +1,22 @@ +const cds = require ('@sap/cds/lib') +const { expect } = cds.test.in (__dirname) + +describe('cds.events tests', ()=>{ + + let m; before (async ()=> m = await cds.load('events.cds')) + + it ('should have the model loaded', ()=>{ + expect(m.definitions).to.have.property('Sue.Foo') + }) + + it ('should compile the model to edmx', ()=>{ + const edmx = cds.compile(m).to.edmx({service:'Sue'}) + expect(edmx).to.match(//) + }) + + it ('should compile the model to sql', ()=>{ + const sql = cds.compile(m).to.sql().join(';\n') + expect(sql).not.to.match(/CREATE TABLE Sue_Foo/) + expect(sql).to.match(/CREATE TABLE Sue_Bar/) + }) +}) diff --git a/test/events.cds b/test/events.cds new file mode 100644 index 00000000..2eae34aa --- /dev/null +++ b/test/events.cds @@ -0,0 +1,6 @@ +service Sue { + @cds.persistence.skip + entity Foo { key ID:Integer; title:String; status:String(1); } + entity Bar { key ID:Integer; foo: Association to Foo } + event Foo.changed : projection on Foo { ID, status } +} From 92a83f71a164a2b3bcbd910b37bb2b1080e02f6d Mon Sep 17 00:00:00 2001 From: "Dr. David A. Kunz" Date: Mon, 7 Jun 2021 14:25:53 +0200 Subject: [PATCH 022/100] Update mashup.cds --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 89cbaded..cb5751b5 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -58,7 +58,7 @@ extend projection CatalogService.ListOfBooks with { extend service S4 { @type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1' event BusinessPartner.Changed { - BusinessPartner: S4.A_BusinessPartner:BusinessPartner; + BusinessPartner: String(10); } } From 944afe3bc81567679e3eeb8e1ad4cefd1f612d35 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 13:17:50 +0200 Subject: [PATCH 023/100] Using package-lock --- package-lock.json | 2521 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2521 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..46540a8f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2521 @@ +{ + "name": "@capire/samples", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@capire/bookshop": { + "version": "file:bookshop", + "requires": { + "@capire/common": "*", + "@sap/cds": "^5.0.4", + "express": "^4.17.1", + "passport": "0.4.1" + } + }, + "@capire/common": { + "version": "file:common", + "requires": { + "@sap/cds": "*" + } + }, + "@capire/fiori": { + "version": "file:fiori", + "requires": { + "@capire/bookshop": "*", + "@capire/common": "*", + "@capire/orders": "*", + "@capire/reviews": "*", + "@capire/suppliers": "*", + "@sap/cds": "^5", + "express": "^4.17.1", + "passport": "^0.4.1" + } + }, + "@capire/hello": { + "version": "file:hello" + }, + "@capire/media": { + "version": "file:media", + "requires": { + "lokijs": "^1.5.6" + } + }, + "@capire/orders": { + "version": "file:orders", + "requires": { + "@sap/cds": "^5" + } + }, + "@capire/reviews": { + "version": "file:reviews", + "requires": { + "@sap/cds": "^5", + "express": "^4.17.1" + } + }, + "@capire/suppliers": { + "version": "file:suppliers", + "requires": { + "@capire/common": "*", + "@sap/cds": ">=4", + "express": "^4" + } + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@sap-cloud-sdk/analytics": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/analytics/-/analytics-1.44.0.tgz", + "integrity": "sha512-SdPZRBtg0muieECMs0Ger/tQb2J+MG1gPcaqcbTRZi6sPcCC6P4CMI7GoEZcV+yQ/6mvMpxaI+iWmFNsjnAFXA==", + "requires": { + "@sap-cloud-sdk/util": "^1.44.0", + "axios": "^0.21.1" + } + }, + "@sap-cloud-sdk/core": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/core/-/core-1.44.0.tgz", + "integrity": "sha512-mLN7EUn4z7N1rnsBIYyAkbv31ONcdlF7pDpV42TRO0NtUugvXAUzvno0t/dx/c7XulIlj5kvqz2LEG8FSNaVdA==", + "requires": { + "@sap-cloud-sdk/analytics": "^1.44.0", + "@sap-cloud-sdk/util": "^1.44.0", + "@sap/xsenv": "^3.0.0", + "axios": "^0.21.1", + "bignumber.js": "^9.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jsonwebtoken": "^8.5.1", + "moment": "^2.29.0", + "opossum": "^6.0.0", + "uuid": "^8.2.0", + "voca": "^1.4.0" + } + }, + "@sap-cloud-sdk/util": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/util/-/util-1.44.0.tgz", + "integrity": "sha512-MNi/1aOH78BmnXDxXFh1vgkZdsvkEFzusrefAJcrsRDhNV/SGYzXzu5XY+VbjZsrub/hQgpzUcIY+koAvR9amg==", + "requires": { + "axios": "^0.21.1", + "chalk": "^4.1.0", + "logform": "^2.2.0", + "promise.allsettled": "^1.0.4", + "voca": "^1.4.0", + "winston": "^3.3.3" + } + }, + "@sap/cds": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-5.1.5.tgz", + "integrity": "sha512-nm5LjXLqUAXivO73eyzTfsvdVanZAVVhqEM86p3hV4sveRsWF56WS+6Rlbz5eFGMtH0LaXzEAd0gzJ4G8/spow==", + "requires": { + "@sap/cds-compiler": "^2.1.6", + "@sap/cds-foss": "^2.3.1", + "@sap/cds-runtime": "~3.1.0" + } + }, + "@sap/cds-compiler": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-2.2.8.tgz", + "integrity": "sha512-PEjLKGXSKqowFjyVsL3sAV0szIXTvULup0Sxv+PoKg44twXbHqiuKHsnu16peknMa5xuDN+r9YDvZvUjCFnsEw==", + "requires": { + "antlr4": "4.8.0" + } + }, + "@sap/cds-foss": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@sap/cds-foss/-/cds-foss-2.3.1.tgz", + "integrity": "sha512-Scfvem8T7YFBJE2Ruphrl/YVBUah8kYtaSyhiCh7N3+Vop4vx09WWysa1geOT1hholbZL3UCZ87w5R+0wKMEoA==", + "requires": { + "big.js": "6.0.3", + "fs-extra": "9.1.0", + "generic-pool": "3.7.2", + "uuid": "8.3.2", + "xmlbuilder": "15.1.1", + "yaml": "1.10.2" + }, + "dependencies": { + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "big.js": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", + "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "generic-pool": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.7.2.tgz", + "integrity": "sha512-Ec7D4KySmEtIdJBNRVS8jus84ejNAvYG7KaLsXMhIs4AVQ2RuXSjMtmpskTKDT0y6TFSPjo4H+cCmLKUb+vDzg==" + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, + "@sap/cds-runtime": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@sap/cds-runtime/-/cds-runtime-3.1.2.tgz", + "integrity": "sha512-Y7qdgieWqvnFICZ2pCpnwc4U36O8rmOYTNrUWVduM1wwcVeOzlGPnwFwDckG63zVxL7vJlkqHNsgFN5myXHTGw==", + "requires": { + "@sap-cloud-sdk/core": "^1.41", + "@sap-cloud-sdk/util": "^1.41", + "@sap/cds-foss": "^2.2.0" + } + }, + "@sap/xsenv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sap/xsenv/-/xsenv-3.1.0.tgz", + "integrity": "sha512-Z+fwO13tcad+eoe8iTrbR471OacU754puabhRn8OI1MU2pPebDQu8rcHN7sR9JQinh4dSs953WkbDneOmvCWuA==", + "requires": { + "debug": "3.1.0", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "extsprintf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", + "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "antlr4": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.8.0.tgz", + "integrity": "sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg==" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array.prototype.map": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.3.tgz", + "integrity": "sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.5" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "optional": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-subset": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", + "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k=", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "optional": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "optional": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "lokijs": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz", + "integrity": "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "opossum": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/opossum/-/opossum-6.1.0.tgz", + "integrity": "sha512-vzZxPqjfJQisLhavf68PMPCTuGMBp6Ar38LjKD/uVrAF+htVMJ8FXtp/wJMBG5NZ9B+VRMDpVymvDP31FjFFDg==" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise.allsettled": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.4.tgz", + "integrity": "sha512-o73CbvQh/OnPFShxHcHxk0baXR2a1m4ozb85ha0H14VEoi/EJJLa9mnPfEWJx9RjA9MLfhdjZ8I6HhWtBa64Ag==", + "requires": { + "array.prototype.map": "^1.0.3", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.0.2", + "iterate-value": "^1.0.2" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sqlite3": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz", + "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==", + "dev": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp": "3.x", + "node-pre-gyp": "^0.11.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "optional": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "voca": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/voca/-/voca-1.4.0.tgz", + "integrity": "sha512-8Xz4H3vhYRGbFupLtl6dHwMx0ojUcjt0HYkqZ9oBCfipd/5mD7Md58m2/dq7uPuZU/0T3Gb1m66KS9jn+I+14Q==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} From a54b0124ea8143c152114105a2036cec7213066d Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 13:18:21 +0200 Subject: [PATCH 024/100] Using file-based-messaging in fiori --- fiori/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiori/.env b/fiori/.env index 36644fa6..8c601148 100644 --- a/fiori/.env +++ b/fiori/.env @@ -1,2 +1,2 @@ -# cds.requires.messaging.kind = file-based-messaging +cds.requires.messaging.kind = file-based-messaging PORT = 4004 \ No newline at end of file From 4bd44469759bb4517d2d28bc7b6f0ed390f7bf5b Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 13:18:39 +0200 Subject: [PATCH 025/100] Async 'served' event --- fiori/server.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fiori/server.js b/fiori/server.js index 41294b50..a2d911a2 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -1,5 +1,13 @@ const cds = require ('@sap/cds') +cds.emit = function (event,...args) { + switch (event) { + case 'served': return this.served = Promise.all (this.listeners(event).map (each => each.call(this,...args))) + case 'listening': return this.served.then (()=> this.__proto__.emit.call (this, event, ...args)) + default: return this.__proto__.emit.call (this, event, ...args) + } +} + cds.once('bootstrap',(app)=>{ app.use ('/orders/webapp', _from('@capire/orders/app/orders/webapp/manifest.json')) app.use ('/bookshop', _from('@capire/bookshop/app/vue/index.html')) From 4877386e8624bf89b8662c292cfab9ce5954e01b Mon Sep 17 00:00:00 2001 From: D065023 Date: Tue, 8 Jun 2021 14:48:12 +0200 Subject: [PATCH 026/100] A bit more fault tolerant (e.g. when only one service is mocked) --- suppliers/srv/mashup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index a6ef1d5a..f2079922 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -37,7 +37,7 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 let replica = await SELECT.one('ID').from (Suppliers) .where ({ID: msg.data.BusinessPartner}) - return replicate (replica.ID) + if (replica) return replicate (replica.ID) }) /** From 05cdb673299639ab638a2862dc1ed78fce70ce83 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 16:01:45 +0200 Subject: [PATCH 027/100] Fixed: books title was missing --- bookshop/srv/cat-service.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookshop/srv/cat-service.cds b/bookshop/srv/cat-service.cds index 81777afb..e1eb8ad5 100644 --- a/bookshop/srv/cat-service.cds +++ b/bookshop/srv/cat-service.cds @@ -3,7 +3,7 @@ service CatalogService @(path:'/browse') { /** For displaying lists of Books */ @readonly entity ListOfBooks as projection on Books { - ID, author, genre, price, currency + ID, title, author, genre, price, currency } /** For display in details pages */ From 02f19e295dd720ce440b8ca54f41cc9d4b520f64 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 18:20:44 +0200 Subject: [PATCH 028/100] Simplifying samples --- fiori/app/bookshop.html | 3 --- fiori/app/reviews.html | 3 --- fiori/server.js | 13 +++---------- fiori/srv/mashup.cds | 6 +++--- reviews/test/bookshop/.env | 2 ++ reviews/test/bookshop/package.json | 19 +++++++++++++++++++ reviews/test/bookshop/server.js | 20 ++++++++++++++++++++ reviews/test/bookshop/services.cds | 11 +++++++++++ 8 files changed, 58 insertions(+), 19 deletions(-) delete mode 100644 fiori/app/bookshop.html delete mode 100644 fiori/app/reviews.html create mode 100644 reviews/test/bookshop/.env create mode 100644 reviews/test/bookshop/package.json create mode 100644 reviews/test/bookshop/server.js create mode 100644 reviews/test/bookshop/services.cds diff --git a/fiori/app/bookshop.html b/fiori/app/bookshop.html deleted file mode 100644 index e7c07e25..00000000 --- a/fiori/app/bookshop.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/fiori/app/reviews.html b/fiori/app/reviews.html deleted file mode 100644 index 75af8860..00000000 --- a/fiori/app/reviews.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/fiori/server.js b/fiori/server.js index a2d911a2..cdb091a5 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -9,19 +9,12 @@ cds.emit = function (event,...args) { } cds.once('bootstrap',(app)=>{ - app.use ('/orders/webapp', _from('@capire/orders/app/orders/webapp/manifest.json')) - app.use ('/bookshop', _from('@capire/bookshop/app/vue/index.html')) - app.use ('/reviews', _from('@capire/reviews/app/vue/index.html')) + app.serve ('/orders/webapp').from('@capire/orders','app/orders/webapp') + app.serve ('/bookshop').from('@capire/bookshop','app/vue') + app.serve ('/reviews').from('@capire/reviews','app/vue') }) cds.once('served', require('./srv/mashup')) cds.once('served', require('@capire/suppliers/srv/mashup')) module.exports = cds.server - - -// ----------------------------------------------------------------------- -// Helper for serving static content from npm-installed packages -const {static} = require('express') -const {dirname} = require('path') -const _from = target => static (dirname (require.resolve(target))) diff --git a/fiori/srv/mashup.cds b/fiori/srv/mashup.cds index 97f21771..c62c37bd 100644 --- a/fiori/srv/mashup.cds +++ b/fiori/srv/mashup.cds @@ -3,17 +3,17 @@ // Mashing up imported models... // -using { sap.capire.bookshop.Books } from '@capire/bookshop'; - // // Extend Books with access to Reviews and average ratings // +using { CatalogService.ListOfBooks, sap.capire.bookshop.Books } from '@capire/bookshop'; using { ReviewsService.Reviews } from '@capire/reviews'; extend Books with { reviews : Composition of many Reviews on reviews.subject = $self.ID; - rating : Decimal; + rating : Reviews:rating; } +extend projection ListOfBooks with { rating } // // Extend Orders with Books as Products diff --git a/reviews/test/bookshop/.env b/reviews/test/bookshop/.env new file mode 100644 index 00000000..8c601148 --- /dev/null +++ b/reviews/test/bookshop/.env @@ -0,0 +1,2 @@ +cds.requires.messaging.kind = file-based-messaging +PORT = 4004 \ No newline at end of file diff --git a/reviews/test/bookshop/package.json b/reviews/test/bookshop/package.json new file mode 100644 index 00000000..f2b47008 --- /dev/null +++ b/reviews/test/bookshop/package.json @@ -0,0 +1,19 @@ +{ + "name": "@capire/fiori", + "version": "1.0.0", + "dependencies": { + "@capire/bookshop": "*", + "@capire/reviews": "*", + "@sap/cds": "^5", + "express": "^4.17.1" + }, + "cds": { + "requires": { + "auth": { "strategy": "dummy" }, + "ReviewsService": { + "kind": "odata", + "model": "@capire/reviews" + } + } + } +} diff --git a/reviews/test/bookshop/server.js b/reviews/test/bookshop/server.js new file mode 100644 index 00000000..70193950 --- /dev/null +++ b/reviews/test/bookshop/server.js @@ -0,0 +1,20 @@ +const cds = require ('@sap/cds') + +cds.once('bootstrap',(app)=>{ + // Delegate to imported apps (reviews only when mocked) + app.serve ('/bookshop').from ('@capire/bookshop','app/vue') + app.serve ('/reviews',).from ('@capire/reviews','app/vue') +}) + +cds.once('served', async ()=>{ + // Update Books' average ratings when ReviewsService signals updated reviews + const ReviewsService = await cds.connect.to ('ReviewsService') + ReviewsService.on ('reviewed', (msg) => { + console.debug ('> received:', msg.event, msg.data) + const { subject, rating } = msg.data + return UPDATE('Books',subject).with({rating}) + }) + +}) + +module.exports = cds.server diff --git a/reviews/test/bookshop/services.cds b/reviews/test/bookshop/services.cds new file mode 100644 index 00000000..9470f6cd --- /dev/null +++ b/reviews/test/bookshop/services.cds @@ -0,0 +1,11 @@ +namespace sap.capire.bookshop; //> allows UPDATE('Books')... +// +// Extend Books with access to Reviews and average ratings +// +using { CatalogService.ListOfBooks, sap.capire.bookshop.Books } from '@capire/bookshop'; +using { ReviewsService.Reviews } from '@capire/reviews'; +extend Books with { + reviews : Composition of many Reviews on reviews.subject = $self.ID; + rating : Reviews:rating; +} +extend projection ListOfBooks with { rating } From edbca44a4349038427e04ff8fec33ea0c20982c6 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 18:23:52 +0200 Subject: [PATCH 029/100] removed obsolete cds.emit monky patch --- fiori/server.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fiori/server.js b/fiori/server.js index cdb091a5..5974d6c2 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -1,13 +1,5 @@ const cds = require ('@sap/cds') -cds.emit = function (event,...args) { - switch (event) { - case 'served': return this.served = Promise.all (this.listeners(event).map (each => each.call(this,...args))) - case 'listening': return this.served.then (()=> this.__proto__.emit.call (this, event, ...args)) - default: return this.__proto__.emit.call (this, event, ...args) - } -} - cds.once('bootstrap',(app)=>{ app.serve ('/orders/webapp').from('@capire/orders','app/orders/webapp') app.serve ('/bookshop').from('@capire/bookshop','app/vue') From 5ae31f7c6700ab73aa8a3ce0caa29ccf6b5179dd Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 16 Apr 2021 11:28:55 +0200 Subject: [PATCH 030/100] Adding suppliers showing integration with S/4 --- fiori/package.json | 11 +- fiori/server.js | 1 + package.json | 3 +- samples.md | 10 +- suppliers/.gitignore | 29 + suppliers/.vscode/extensions.json | 20 + suppliers/.vscode/launch.json | 15 + suppliers/.vscode/settings.json | 7 + suppliers/.vscode/tasks.json | 25 + suppliers/index.cds | 1 + suppliers/package.json | 24 + suppliers/server.js | 3 + .../srv/external/API_BUSINESS_PARTNER.csn | 2425 ++++++++++++ .../srv/external/API_BUSINESS_PARTNER.edmx | 3261 +++++++++++++++++ ...API_BUSINESS_PARTNER-A_BusinessPartner.csv | 7 + .../data/API_BUSINESS_PARTNER-Suppliers.csv | 5 + suppliers/srv/mashup.cds | 47 + suppliers/srv/mashup.js | 52 + 18 files changed, 5940 insertions(+), 6 deletions(-) create mode 100644 suppliers/.gitignore create mode 100644 suppliers/.vscode/extensions.json create mode 100644 suppliers/.vscode/launch.json create mode 100644 suppliers/.vscode/settings.json create mode 100644 suppliers/.vscode/tasks.json create mode 100644 suppliers/index.cds create mode 100644 suppliers/package.json create mode 100644 suppliers/server.js create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.csn create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.edmx create mode 100644 suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv create mode 100644 suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv create mode 100644 suppliers/srv/mashup.cds create mode 100644 suppliers/srv/mashup.js diff --git a/fiori/package.json b/fiori/package.json index 2e4e62cf..43a41485 100644 --- a/fiori/package.json +++ b/fiori/package.json @@ -3,10 +3,11 @@ "version": "1.0.0", "dependencies": { "@capire/bookshop": "*", - "@capire/reviews": "*", - "@capire/orders": "*", "@capire/common": "*", - "@sap/cds": "^5", + "@capire/orders": "*", + "@capire/reviews": "*", + "@capire/suppliers": "*", + "@sap/cds": ">=5", "express": "^4.17.1", "passport": "^0.4.1" }, @@ -22,6 +23,10 @@ "auth": { "strategy": "dummy" }, + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "@capire/suppliers" + }, "ReviewsService": { "kind": "odata", "model": "@capire/reviews" diff --git a/fiori/server.js b/fiori/server.js index a8dc4298..41294b50 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -7,6 +7,7 @@ cds.once('bootstrap',(app)=>{ }) cds.once('served', require('./srv/mashup')) +cds.once('served', require('@capire/suppliers/srv/mashup')) module.exports = cds.server diff --git a/package.json b/package.json index 1eae7227..6a8fdc91 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "@capire/hello": "./hello", "@capire/media": "./media", "@capire/orders": "./orders", - "@capire/reviews": "./reviews" + "@capire/reviews": "./reviews", + "@capire/suppliers": "./suppliers" }, "devDependencies": { "chai": "^4.2.0", diff --git a/samples.md b/samples.md index cf9a60b4..7efbb068 100644 --- a/samples.md +++ b/samples.md @@ -49,14 +49,20 @@ Each sub directory essentially is an individual npm package arranged in an [all- - Late-cut Micro Services - As well as managed data, input validations, and authorization +## [@capire/suppliers](suppliers) + +- Shows how to integrate remote services, in this case the BusinessPartner service from S/4. +- Extending [@capire/bookshop](bookshop) with suppliers from S/4 +- Providing that as a pre-built integration & extension package +- Used in [@capire/fiori](fiori) + ## [@capire/fiori](fiori) - A [composite app, reusing and combining](https://cap.cloud.sap/docs/guides/verticalize) these packages: - [@capire/bookshop](bookshop) - - [@capire/reviews](reviews) - - [@capire/orders](orders) - [@capire/common](common) + - [@capire/suppliers](suppliers) - [Adds an SAP Fiori elements application](https://cap.cloud.sap/docs/guides/fiori/) to bookshop, thereby introducing to: - [OData Annotations](https://cap.cloud.sap/docs/guides/fiori#adding-odata-annotations) in `.cds` files - Support for [Fiori Draft](https://cap.cloud.sap/docs/guides/fiori#draft) diff --git a/suppliers/.gitignore b/suppliers/.gitignore new file mode 100644 index 00000000..b8e5bc14 --- /dev/null +++ b/suppliers/.gitignore @@ -0,0 +1,29 @@ +# CAP demo +_out +*.db +connection.properties +default-*.json +gen/ +node_modules/ +target/ + +# Web IDE, App Studio +.che/ +.gen/ + +# MTA +*_mta_build_tmp +*.mtar +mta_archives/ + +# Other +.DS_Store +*.orig +*.log + +*.iml +*.flattened-pom.xml + +# IDEs +# .vscode +# .idea diff --git a/suppliers/.vscode/extensions.json b/suppliers/.vscode/extensions.json new file mode 100644 index 00000000..1daacbd8 --- /dev/null +++ b/suppliers/.vscode/extensions.json @@ -0,0 +1,20 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + // >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!, + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "mechatroner.rainbow-csv", + "humao.rest-client", + "alexcvzz.vscode-sqlite", + "hbenl.vscode-mocha-test-adapter", + "sdras.night-owl" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [ + + ] +} diff --git a/suppliers/.vscode/launch.json b/suppliers/.vscode/launch.json new file mode 100644 index 00000000..3f308a6c --- /dev/null +++ b/suppliers/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "command": "cds run --with-mocks --in-memory?", + "name": "cds run", + "request": "launch", + "type": "node-terminal", + "skipFiles": [ "/**" ] + } + ] +} diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json new file mode 100644 index 00000000..9fefa082 --- /dev/null +++ b/suppliers/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.exclude": { + "**/.gitignore": true, + "**/.git": true, + "**/.vscode": true + } +} diff --git a/suppliers/.vscode/tasks.json b/suppliers/.vscode/tasks.json new file mode 100644 index 00000000..622da99a --- /dev/null +++ b/suppliers/.vscode/tasks.json @@ -0,0 +1,25 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "shell", + "label": "cds watch", + "command": "cds", + "args": ["watch"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "type": "shell", + "label": "cds run", + "command": "cds", + "args": ["run", "--with-mocks", "--in-memory?"], + "problemMatcher": [] + } + ] +} diff --git a/suppliers/index.cds b/suppliers/index.cds new file mode 100644 index 00000000..fe4a1f04 --- /dev/null +++ b/suppliers/index.cds @@ -0,0 +1 @@ +using from './srv/mashup'; \ No newline at end of file diff --git a/suppliers/package.json b/suppliers/package.json new file mode 100644 index 00000000..e1cfb4bc --- /dev/null +++ b/suppliers/package.json @@ -0,0 +1,24 @@ +{ + "name": "@capire/suppliers", + "version": "1.0.0", + "description": "Shows integration with S/4, in turn provided as a reusable extension package to bookshop.", + "private": true, + "dependencies": { + "@capire/common": "*", + "@sap/cds": "^4", + "express": "^4" + }, + "scripts": { + "start": "cds run --in-memory?", + "watch": "cds watch", + "mocked-s4": "cds mock API_BUSINESS_PARTNER" + }, + "cds": { + "requires": { + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "srv/external/API_BUSINESS_PARTNER" + } + } + } +} diff --git a/suppliers/server.js b/suppliers/server.js new file mode 100644 index 00000000..2e8cbb64 --- /dev/null +++ b/suppliers/server.js @@ -0,0 +1,3 @@ +const cds = require ('@sap/cds') +cds.once('served', require('./srv/mashup')) +module.exports = cds.server diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.csn b/suppliers/srv/external/API_BUSINESS_PARTNER.csn new file mode 100644 index 00000000..411e7c48 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.csn @@ -0,0 +1,2425 @@ +{ + "definitions": { + "API_BUSINESS_PARTNER": { + "kind": "service" + }, + "API_BUSINESS_PARTNER.A_AddressEmailAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultEmailAddress": { + "type": "cds.Boolean" + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "SearchEmailAddress": { + "type": "cds.String", + "length": 20 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressFaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultFaxNumber": { + "type": "cds.Boolean" + }, + "FaxCountry": { + "type": "cds.String", + "length": 3 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalFaxNumber": { + "type": "cds.String", + "length": 30 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressHomePageURL": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "key": true, + "type": "cds.Date" + }, + "IsDefaultURLAddress": { + "key": true, + "type": "cds.Boolean" + }, + "SearchURLAddress": { + "type": "cds.String", + "length": 50 + }, + "URLFieldLength": { + "type": "cds.Integer" + }, + "WebsiteURL": { + "type": "cds.String", + "length": 2048 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressPhoneNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DestinationLocationCountry": { + "type": "cds.String", + "length": 3 + }, + "IsDefaultPhoneNumber": { + "type": "cds.Boolean" + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberType": { + "type": "cds.String", + "length": 1 + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressNumber": { + "type": "cds.String", + "length": 10 + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ContactPersonFunction": { + "type": "cds.String", + "length": 4 + }, + "ContactPersonDepartment": { + "type": "cds.String", + "length": 4 + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaAddressUsage": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Timestamp" + }, + "AddressUsage": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "StandardUsage": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIdentification": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPIdentificationType": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "BPIdentificationNumber": { + "key": true, + "type": "cds.String", + "length": 60 + }, + "BPIdnNmbrIssuingInstitute": { + "type": "cds.String", + "length": 40 + }, + "BPIdentificationEntryDate": { + "type": "cds.Date" + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "ValidityEndDate": { + "type": "cds.Date" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIndustry": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "IndustrySector": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IndustrySystemType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IsStandardIndustry": { + "type": "cds.String", + "length": 1 + }, + "IndustryKeyDescription": { + "type": "cds.String", + "length": 100 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartner": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "AcademicTitle": { + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerCategory": { + "type": "cds.String", + "length": 1 + }, + "BusinessPartnerFullName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerGrouping": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerUUID": { + "type": "cds.UUID" + }, + "CorrespondenceLanguage": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreationTime": { + "type": "cds.Time" + }, + "FirstName": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "Industry": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "IsFemale": { + "type": "cds.Boolean" + }, + "IsMale": { + "type": "cds.Boolean" + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "IsSexUnknown": { + "type": "cds.Boolean" + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "LastChangeDate": { + "type": "cds.Date" + }, + "LastChangeTime": { + "type": "cds.Time" + }, + "LastChangedByUser": { + "type": "cds.String", + "length": 12 + }, + "LastName": { + "type": "cds.String", + "length": 40 + }, + "LegalForm": { + "type": "cds.String", + "length": 2 + }, + "OrganizationBPName1": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName2": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName3": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName4": { + "type": "cds.String", + "length": 40 + }, + "OrganizationFoundationDate": { + "type": "cds.Date" + }, + "OrganizationLiquidationDate": { + "type": "cds.Date" + }, + "SearchTerm1": { + "type": "cds.String", + "length": 20 + }, + "AdditionalLastName": { + "type": "cds.String", + "length": 40 + }, + "BirthDate": { + "type": "cds.Date" + }, + "BusinessPartnerIsBlocked": { + "type": "cds.Boolean" + }, + "BusinessPartnerType": { + "type": "cds.String", + "length": 4 + }, + "ETag": { + "type": "cds.String", + "length": 26 + }, + "GroupBusinessPartnerName1": { + "type": "cds.String", + "length": 40 + }, + "GroupBusinessPartnerName2": { + "type": "cds.String", + "length": 40 + }, + "IndependentAddressID": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "MiddleName": { + "type": "cds.String", + "length": 40 + }, + "NameCountry": { + "type": "cds.String", + "length": 3 + }, + "NameFormat": { + "type": "cds.String", + "length": 2 + }, + "PersonFullName": { + "type": "cds.String", + "length": 80 + }, + "PersonNumber": { + "type": "cds.String", + "length": 10 + }, + "IsMarkedForArchiving": { + "type": "cds.Boolean" + }, + "BusinessPartnerIDByExtSystem": { + "type": "cds.String", + "length": 20 + }, + "TradingPartner": { + "type": "cds.String", + "length": 6 + }, + "to_BuPaIdentification": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIdentification", + "cardinality": { + "max": "*" + } + }, + "to_BuPaIndustry": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIndustry", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerAddress", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerBank": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerBank", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerContact": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerContact", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerRole": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerRole", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_Customer": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Customer" + }, + "to_Supplier": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Supplier" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "AddressUUID": { + "type": "cds.UUID" + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "AddressIDByExternalSystem": { + "type": "cds.String", + "length": 20 + }, + "to_AddressUsage": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaAddressUsage", + "cardinality": { + "max": "*" + } + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerBank": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BankIdentification": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BankCountryKey": { + "type": "cds.String", + "length": 3 + }, + "BankName": { + "type": "cds.String", + "length": 60 + }, + "BankNumber": { + "type": "cds.String", + "length": 15 + }, + "SWIFTCode": { + "type": "cds.String", + "length": 11 + }, + "BankControlKey": { + "type": "cds.String", + "length": 2 + }, + "BankAccountHolderName": { + "type": "cds.String", + "length": 60 + }, + "BankAccountName": { + "type": "cds.String", + "length": 40 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "IBAN": { + "type": "cds.String", + "length": 34 + }, + "IBANValidityStartDate": { + "type": "cds.Date" + }, + "BankAccount": { + "type": "cds.String", + "length": 18 + }, + "BankAccountReferenceText": { + "type": "cds.String", + "length": 20 + }, + "CollectionAuthInd": { + "type": "cds.Boolean" + }, + "CityName": { + "type": "cds.String", + "length": 35 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerContact": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "IsStandardRelationship": { + "type": "cds.Boolean" + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + }, + "to_ContactAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToAddress", + "cardinality": { + "max": "*" + } + }, + "to_ContactRelationship": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerRole": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerRole": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "ValidFrom": { + "type": "cds.Timestamp" + }, + "ValidTo": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPTaxType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BPTaxNumber": { + "type": "cds.String", + "length": 20 + }, + "BPTaxLongNumber": { + "type": "cds.String", + "length": 60 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Customer": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerFullName": { + "type": "cds.String", + "length": 220 + }, + "CustomerName": { + "type": "cds.String", + "length": 80 + }, + "DeliveryIsBlocked": { + "type": "cds.String", + "length": 2 + }, + "NFPartnerIsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "CustomerCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "IndustryCode1": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode2": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode3": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode4": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode5": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "NielsenRegion": { + "type": "cds.String", + "length": 2 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "to_CustomerCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerCompany", + "cardinality": { + "max": "*" + } + }, + "to_CustomerSalesArea": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesArea", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkInternetAddress": { + "type": "cds.String", + "length": 130 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "AlternativePayerAccount": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CollectiveInvoiceVariant": { + "type": "cds.String", + "length": 1 + }, + "CustomerAccountNote": { + "type": "cds.String", + "length": 30 + }, + "CustomerHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "CustomerSupplierClearingIsUsed": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PaytAdviceIsSentbyEDI": { + "type": "cds.Boolean" + }, + "PhysicalInventoryBlockInd": { + "type": "cds.Boolean" + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "RecordPaymentHistoryIndicator": { + "type": "cds.Boolean" + }, + "UserAtCustomer": { + "type": "cds.String", + "length": 15 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_CustomerDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerDunning", + "cardinality": { + "max": "*" + } + }, + "to_WithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesArea": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CompleteDeliveryIsDefined": { + "type": "cds.Boolean" + }, + "Currency": { + "type": "cds.String", + "length": 5 + }, + "CustomerABCClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerAccountAssignmentGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "CustomerPriceGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPricingProcedure": { + "type": "cds.String", + "length": 2 + }, + "DeliveryIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "DeliveryPriority": { + "type": "cds.String", + "length": 2 + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "InvoiceDate": { + "type": "cds.String", + "length": 2 + }, + "ItemOrderProbabilityInPercent": { + "type": "cds.String", + "length": 3 + }, + "OrderCombinationIsAllowed": { + "type": "cds.Boolean" + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PartialDeliveryIsAllowed": { + "type": "cds.String", + "length": 1 + }, + "PriceListType": { + "type": "cds.String", + "length": 2 + }, + "SalesGroup": { + "type": "cds.String", + "length": 3 + }, + "SalesOffice": { + "type": "cds.String", + "length": 4 + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplyingPlant": { + "type": "cds.String", + "length": 4 + }, + "SalesDistrict": { + "type": "cds.String", + "length": 6 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc", + "cardinality": { + "max": "*" + } + }, + "to_SalesAreaTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DepartureCountry": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "CustomerTaxCategory": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CustomerTaxClassification": { + "type": "cds.String", + "length": 1 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxAgent": { + "type": "cds.Boolean" + }, + "ObligationDateBegin": { + "type": "cds.Date" + }, + "ObligationDateEnd": { + "type": "cds.Date" + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "BPCustomerNumber": { + "type": "cds.String", + "length": 10 + }, + "CustomerPartnerDescription": { + "type": "cds.String", + "length": 30 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Supplier": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AlternativePayeeAccountNumber": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "PaymentIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "PurchasingIsBlocked": { + "type": "cds.Boolean" + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierFullName": { + "type": "cds.String", + "length": 220 + }, + "SupplierName": { + "type": "cds.String", + "length": 80 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "BirthDate": { + "type": "cds.Date" + }, + "ConcatenatedInternationalLocNo": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "SuplrQltyInProcmtCertfnValidTo": { + "type": "cds.Date" + }, + "SuplrQualityManagementSystem": { + "type": "cds.String", + "length": 4 + }, + "SupplierCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "SupplierProcurementBlock": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberResponsible": { + "type": "cds.String", + "length": 18 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "to_SupplierCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierCompany", + "cardinality": { + "max": "*" + } + }, + "to_SupplierPurchasingOrg": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CompanyCodeName": { + "type": "cds.String", + "length": 25 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "SupplierIsBlockedForPosting": { + "type": "cds.Boolean" + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "SupplierClerk": { + "type": "cds.String", + "length": 15 + }, + "SupplierClerkURL": { + "type": "cds.String", + "length": 130 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "ClearCustomerSupplier": { + "type": "cds.Boolean" + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "PaymentIsToBeSentByEDI": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "CheckPaidDurationInDays": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "BillOfExchLmtAmtInCoCodeCrcy": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "SupplierClerkIDBySupplier": { + "type": "cds.String", + "length": 12 + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "SupplierHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "AlternativePayee": { + "type": "cds.String", + "length": 10 + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierCertificationDate": { + "type": "cds.Date" + }, + "SupplierAccountNote": { + "type": "cds.String", + "length": 30 + }, + "WithholdingTaxCountry": { + "type": "cds.String", + "length": 3 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CashPlanningGroup": { + "type": "cds.String", + "length": 10 + }, + "IsToBeCheckedForDuplicates": { + "type": "cds.Boolean" + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_SupplierDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierDunning", + "cardinality": { + "max": "*" + } + }, + "to_SupplierWithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "SupplierSubrange": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "Plant": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "ReferenceSupplier": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CalculationSchemaGroupCode": { + "type": "cds.String", + "length": 2 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "InvoiceIsGoodsReceiptBased": { + "type": "cds.Boolean" + }, + "MaterialPlannedDeliveryDurn": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "MinimumOrderAmount": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PricingDateControl": { + "type": "cds.String", + "length": 1 + }, + "PurOrdAutoGenerationIsAllowed": { + "type": "cds.Boolean" + }, + "PurchaseOrderCurrency": { + "type": "cds.String", + "length": 5 + }, + "PurchasingGroup": { + "type": "cds.String", + "length": 3 + }, + "PurchasingIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplierABCClassificationCode": { + "type": "cds.String", + "length": 1 + }, + "SupplierPhoneNumber": { + "type": "cds.String", + "length": 16 + }, + "SupplierRespSalesPersonName": { + "type": "cds.String", + "length": 30 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPartnerFunc", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "IsWithholdingTaxSubject": { + "type": "cds.Boolean" + }, + "RecipientType": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + } + } +} \ No newline at end of file diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.edmx b/suppliers/srv/external/API_BUSINESS_PARTNER.edmx new file mode 100644 index 00000000..4da33b26 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.edmx @@ -0,0 +1,3261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + This field is generated by the system from the complete Internet mail address and is stored in table ADR6. + It contains the first 20 characters of the Internet mail address in normalized form, that is, without comment characters and converted into uppercase.The field cannot be maintained by the user or from an interface.The table ADR6 contains an index for this field.Using an Internet mail address, the corresponding key of table ADR6 and the owner of the address are determined (for example, business partner or user). + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + The country for the telephone number or fax number is maintained here. + This specification is used to determine the correct country code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country from the user parameter LND is proposed (if it is maintained). If the user parameter LND is not maintained, the country of the company address assigned in the user master data is proposed.If the country of the address changes, the country of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country for this telephone number also has to be retained and must not be changed automatically to the new country of the address. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + The content of this field is automatically calculated by the system based on fax number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + The country for the telephone number or fax number is maintained here. + This specification is used to determine the correct country code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country from the user parameter LND is proposed (if it is maintained). If the user parameter LND is not maintained, the country of the company address assigned in the user master data is proposed.If the country of the address changes, the country of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country for this telephone number also has to be retained and must not be changed automatically to the new country of the address. + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + The content of this field is automatically calculated by the system based on the telephone number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + This field specifies whether the telephone number is a mobile telephone number. + ' ' : The telephone number is a fixed-line telephone'1' : The telephone number is the standard fixed-line telephone'2' : The telephone nubmer is a mobile telephone'3' : The telephone number is the standard mobile telephoneEither the standard fixed-line telephone number or the standard mobile telephone number is also the standard telephone number (FLGDEFAULT = 'X').In older data sets, this field may have also have the value ' ' for the standard fixed-line telephone. In this case, however, FLGDEFAULT is always 'X'.In Customizing, you can specify whether the SMS-compatible indicator is to be proposed for new mobile telephone numbers created in dialog by choosing General Settings -> Set countries -> Define Mobile Telephone Attributes for each country. + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country-code or a typical country key, for example, in Germany the Federal statistics office key.The country keys are determined at system installation in the global settings.The definition of the country key in the SAP system does not have to match political or government entities.Since the country key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country key cannot query the country key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Different PO Box country in address. + The PO Box country can be entered here, if it is different from the street address country.If the address only has a PO Box address, the country is in the normal country field.Use this field if the address has two different country values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Identifies the function that a person has within a company. + This is a contact person attribute that you can define in Customizing.Personnel managerSecretary + + + + + Name of the department of a business partner for your internal usage. + The name given by the business partner to this particular department may differ from the name that you use. You can enter the name given by the business partner in the field company department.This is a contact person attribute that you can define in Customizing.For your purposes, the department name is "Sales". The business partner names the same department "Sales South". + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Business partner attribute, which you can use to distinguish between various addresses by defining the address usage for communication with business partners. + Maintain the usage types for addresses (address types) in Customizing.You can create a short description and a name for the address type.When maintaining business partners you can use the function address usage to assign business partner addresses to address types.If necessary, you can set the indicator for multiple use in Customizing.Correspondence addressDelivery address + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + Establishes which is the standard address for an address usage. + Several addresses per period can be assigned to an address usage.If this is the case, then this indicator controls which of the assigned addresses should be the standard address of the relevant usage. This is determined automatically when the address usage is accessed. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + A document (such as an ID card or driver's license) or an entry in a system of records (such as a commercial register) whose key can be stored as an attribute for a business partner. + The identification type is for classifying identification numbers.You can define the identification types and their descriptions in Customizing.You can also specify for which business partner category an ID type should be valid.If necessary, assign the identification type to an Identification Category.You can only assign one identification type to an identification category. + + + + + Number that serves to identify a business partner, such as driver's license, or ID card number. + + + + + + Institution that adminsters or assigns an ID number. + + + + + + Date on which the ID number was registered or assigned by the appropriate authority. + + + + + + Country in which an ID number was assigned, or in which the number is valid. + + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + This date marks the start of validity of an ID number. + + + + + + This date marks the end of validity of an ID number. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Describes an industry. + An industry is a classification of companies according to their main business activity. For example, you can use Commerce, Banking, Services, Industry, Healthcare, Public Sector, Media, and so on, as industries.You can define industries along with their descriptions in Customizing.Assign the industry key to an industry key system. + + + + + Serves to combine and categorize several industries into a group. + You can create different industry systems, each with its own catalog of industries, whereby an industry can be assigned to several industry systems.You have to select one industry system as the standard industry system. This is then automatically displayed in the initial screen for the maintenance of industry data.You can define an industry system along with its description in Customizing. You can assign several industry systems to a business partner.If you choose the button All Industry Systems, you can access all the industry systems defined in the Customizing using the input help. + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Identifies the industry in an industry system that can be defined as the standard industry. + It is recommended that you define an industry within an industry system as the standard industry, because only the standard industries can be determined at the interfaces to BW or the APIs, for example.This means that even if only one industry exists within an industry system, it should be indicated as the standard industry as this this information cannot be determined otherwise. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Key for academic title. + You can define a key for an academic title in Customizing. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + Category under which a business partner is classified. + You can distinguish between the following business partner categories:OrganizationNatural personGroup of natural persons or organizationsThe processing screens for the business partner categories are set up differently.So, for example, the screen for an organization contains the field Legal form, but this is not needed in the screen for a natural person. + + + + + + Classification assigned when creating a business partner. + Assign each business partner to a grouping when you create the business partner. The grouping determines the number range. You cannot change the assignment afterwards.You can define the groupings, their descriptions, the associated number range and other attributes in Customizing.You can define standard groupings for the internal and the external number assignment.For each grouping create a number range.When you create a business partner, the entry in the grouping field determines whether and how an entry is made in the business partner number field. + + + + + + + Correspondence language (written) for business partners in the 'Person' category. Maintain the correspondence language for business partners in the 'Organization' and 'Group' category with the address (communication). + When transferring data (direct input), make sure that for a'Person', the field 'LANGU_CORR' and for an'Organization' or "Group" the field 'LANGU'has an entry. + + + + + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + An industry sector is the term used to classify a company according to its main business activity. + You can assign an industry sector to business partners in the category 'Organization'RetailBanksServicesIndustryHealth servicePublic sectorMedia + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + + + Indicator through which a distinction between natural and legal persons can be made during tax reporting. + Is used in Italy and Mexico ,among other countries.Brasil: If the indicator is not set, 'CGC' is relevant in tax number 1. If the indicator is set, 'CPF' is relevant in tax number 2.Colombia: In the case of some natural persons, the NIT number does not have a check digit. In this case you should set this indicator and the check is deactivated. + + + + + + Language for verbal communication with a business partner. + This language may differ from the language(s) defined for written correspondence. + + + + + + + + + Denotes certain legal norms that are of significance for the organization of a company. + For business partners in the category "Organization", you can state the legal form of the company. This is for information purposes only.Stock corporation (AG in Germany)Limited liability company (GmbH in Germany) + + + + + First name field for business partners in the Organization category. + + + + + + Second name field for business partners in the Organization category. + + + + + + Third name field for business partners in the Organization category. + + + + + + Fourth name field for business partners in the Organization category. + + + + + + Indicates the official registration of a company in the Commercial Register. + If a company is not officially registered in the Commercial Register, it has to use some type of text addition, such as foundation pending, when referring to the legal form. + + + + + Term for the end of bankruptcy proceedings. + This date also indicates that the company no longer exists. + + + + + Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. + + + + + + + + If the business partner is blocked centrally, certain activities cannot be executed. + + + + + + You can use the business partner type to group business partners according to your own criteria in Customizing (IMG). + In Customizing you can show or hide fields for data entry, depending on the requirements of the relevant business partner type.Select a business partner type. You can obtain help by pressing the F4 key. + + + + + + First name field for business partners in the Group category. + + + + + + Second name field for business partners in the Group category. + + + + + + Internal key for identifying the address for communication data that spans all addresses in Business Partner. + For more information on the significance and usage of the address number, see the documentation for Business Address Services (BAS). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + + The name format rule country and the name format rule key together uniquely identify a formatting rule. + A country can have several formats which correspond to different rules. Formatting rules describe the format of a person name. + + + + + See Name format. + + + + + + States the complete name of a person. + The complete name is generally generated and saved by the Business Address Services (BAS) according to country-specific rules from the individual name components (without the form of address).If, during the formatting of an address, you want to use an alternative name, you can manually format the alternative name here. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Establishes if the business partner is meant to be archived. + If the indicator is set, the relevant business partner can be archived from the view of the business partner administration.If the check of the data to be archived shows, for example, that there are still active business transactions the archiving of the business partner data is prevented even if the indicator is set.If the indicator is not set, the business partner will not be taken into consideration during archiving. + + + + + Business partner number from an external system or a legacy system. + If the current business partner is known under a different number in an external system, you can store this number here for information purposes.Direct input gives you the option of maintaining a business partner by specifying the external business partner number. If you maintain business partner data in your legacy system, you can transmit changes made to business partners to the SAP system without having to know the SAP business partner number in the legacy system. + + + + + Company ID standard for the whole group. + + + + + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country-code or a typical country key, for example, in Germany the Federal statistics office key.The country keys are determined at system installation in the global settings.The definition of the country key in the SAP system does not have to match political or government entities.Since the country key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country key cannot query the country key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Different PO Box country in address. + The PO Box country can be entered here, if it is different from the street address country.If the address only has a PO Box address, the country is in the normal country field.Use this field if the address has two different country values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + Address number from an external system or a legacy system + If the current address has a different number in an external system, you can save this number here for information purposes.In direct input you are able to maintain an address for a business partner by stating the external address number. If your business partner data is maintained in a legacy system, you can thus transmit changes to a BP address to the SAP system without having to know the SAP address number in the legacy system. + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner's bank details. + Enter a bank details ID for each separate set of bank details for a business partner.Business Partner: H. MillerBD-ID Fin.institution Acct no. 0001 Chemical Bank, NYC 56234560002 Chemical Bank, NYC 56231220003 First Bank of Pittsburgh ...Business partner: T.Wolsey and Co.BD-ID Fin.institution Acct no.GIR0 Citibank, Charleston ...GIR1 Chemical Bank, NYC ... + + + + + Identifies the country in which the bank is based. + The country key determines according to which rules the remaining bank data (for example, bank number and bank account number) is checked. + + + + + The name under which the bank operates. + + + + + + The bank key (under which the bank data is stored in the appropriate country) is specified in this field. + The country-specific meaning of this bank key is specified when defining country key.Normally banks have a bank number, which then also appears in the control data of the bank.In certain countries the bank account number assumes this function; in such a case there would be no bank numbers, the bank details are then under the account number.For data medium exchange it can be useful to be able create banks for foreign business partners without a bank number, even if the country in question has bank numbers. In such cases the bank key can be assigned internally.If the bank data is under another key, such as the SWIFT code for example, numbers can also be assigned externally. + + + + + Uniquely identifies a bank throughout the world. + SWIFT stands for Society for Worldwide Interbank Financial Telecommunication.BIC stands for Bank Identifier Code.This globally unique code can be used in international payment transactions to identify the bank without the need to specify an address or bank number. Specification of the SWIFT code/BIC is mainly relevant for automatic payment transactions. + + + + + Brazil, France, Spain, Portugal and Italy + The field contains a check key for the combination bank number and bank account number.USAIn USA this field is used to differentiate between a savings and a current account (if no value is entered, the default value 01 is used).01 Current account02 Savings account03 Loan account04 General ledgerJapanIn Japan this field specifies the type of account. This information is is copied from the payment medium print program into payment medium. The following is an example of the account types used:01 FUTSU (similar to a savings account)02 TOUZA (similar to a current account)04 CHOCHIKU (similar to an investment account)09 Other types of bank accountsSouth AfricaIn South Africa this field specifies the type of account. The information entered here is forwarded to the bank that carries out the payment order. The following account types are permitted in ABC format:01 Current (Cheque) Account02 Savings Account03 Transmission Account04 Bond Account06 Subscription Share AccountArgentinaIn Argentina this field specifies the type of account:CC Current Account (Cuenta corriente)CA Saving Account (Caja de ahorro)CE Special Saving Account (Caja de ahorro especial)CS Salary Account (Cuenta sueldos)VenezuelaIn Venezuela this field specifies the type of account:CC Checking Account (Cuenta corriente)CA Saving Account (Cuenta de ahorro)CE Special Saving Account (Cuenta de ahorro especial)CS Salary Account (Cuenta sueldos)MexicoIn Mexico this field contains a two-digit key for classifying the bank account (for example, as a savings or current account). This key have different definitions, depending on the bank.NoteFor countries that are not listed here, this field can be used for account-specific information. + + + + + Here you can enter another name that the payment program can use if the name of the account holder is not the same as the name of the Business Partner. + + + + + + + + + A uniform standardized ID number for representing bank details that is in accordance with the ECBS (European Committee for Banking Standards). An IBAN has a maximum of 34 alphanumeric characters and is a combination of the following elements: + Country key of the bank (ISO code)Two-digit check numberCountry-specific account number (in Germany this consists of the bank number and account number, in France the bank number, account number and check key).The IBAN not only makes international payments easier, in some countries it has advantages for domestic payments as well. Depending on the country, it can mean advantages for value and fees.The IBAN can be maintained in parallel with the bank details but does not replace them. It is stored under the master data of the business partner and can then be used when creating the payment medium.Since it is only the bank that has the account that may generate the IBAN corresponding to an account number, the SAP system only generates a proposal. You can confirm or change this proposal. If no proposal is generated, enter the IBAN manually.An IBAN in Belgium may look like this:Electronic Form:BE62510007547061Printed form, as it would appear on an invoice:IBAN BE62 5100 0754 7061 + + + + + + This field contains the number under which the account is managed at the bank. + + + + + + Additional details for the bank details of the business partner. + In some countries the data for the bank details of the business partner (bank number, bank account number, name of the account holder) have to supplemented by other details in order to be able to use certain payment processes. This supplementary details are defined here.If additional data is required for the bank details for payment transactions in your country (see the following examples), enter the reference information.If for an automatic debit the bank requires the reference number of the collection authorization in Norway or Great Britain, specify this number here.In Great Britain when making payments to an account in a 'Building Society' you must specify which number payment recipient has. These details must be defined in the reference field, whereas the fields Bank Key and Account Number are to be used for the bank details of the 'Building Society'.In Great Britain when entering a building society account number, the name of the building society should also be maintained in the system. + + + + + States that the bank has collection authorization from the business partner for the account. + Set this indicator if the bank has collection authorization.Note for Accounts Receivable (FI-AR)If this indicator is not set, there is no bank collection.Note for Contract Accounts Receivable and Payable (FI-CA)This indicator is not relevant. + + + + + Name of the city as a part of the address. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + + States whether the relationship is a standard relationship. + If several relationships of the BP relationship category contact person have been defined for, you can set the indicator standard relationship for one of these relationships.A relationship that is marked as a standard relationship can be used whenA certain scenario automatically selects a contact personThe contact person responsible is not knownYou can give this indicator to only one business partner relationship of a BP relationship category for a particular period. Another relationship of the same relationship category can be indicated as the standard relationship only if the periods for the relationship do not overlap or coincide. + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Function that a business partner takes on, depending on a business transaction. + You can define business partner roles along with their attributes in Customizing.You can create an alphanumeric, 6-digit key for the BP role. You can also choose a title as the short form and a description as the long form for the role text.Screen control in the dialog takes place by assigning a BP view.A program can access specific business partner roles for a business partner using thebusiness partner role category . The role categories are also in the TB003 table. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Specifies the tax number category. + + + + + + Specifies the tax number. + + + + + + Specifies the tax number. + You can enter up to 60 characters in this field. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicates if the processing of billing documents is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block the processing of all credit memos to a certain customer, pending manual approval. + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + Specifies a classification of the customer (for example, classifies the customer as a bulk purchaser). + The classifications are freely definable according to the needs of your organization. + + + + + + + Indicates if delivery processing is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all deliveries to a certain customer for credit reasons. + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Indicates if sales order processing is blocked for the customer in all sales areas (company-wide, for example). + If you block sales order processing, the block counts for the following partner functions of the customer:Sold-to partyShip-to partyPayerIf you want to process an order where the ship-to party differs from the sold-to party, and the ship-to party is blocked, you cannot process the order.You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all free of charge deliveries and credit memo requests for a certain customer, pending manual approval before further processing can take place. + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Account number of another master record in which the official address is stored. This address is used, for example, for tax reports to the tax authorities in Italy. + + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Specifies the code that uniquely identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. You can assign more than one industry code to a customer by choosing Create more. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Specifies a regional division according to the market categories created by the A. C. Nielsen company. + By allocating a Nielsen division, you can use the services of the Nielsen Institute to create a market analysis of your customers. + + + + + Classification of companies according to tax aspects. + + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + This field contains the account number the company is listed under at the customer. + + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + + + Account number of the customer for whom automatic payment transactions are to be carried out.The account number is only needed if bank collections are not to be made via the customer who owes the receivables. The same applies to refunds of payables.The specification in this field only applies to this company code. There is another field in which you can enter an alternative payee for all company codes. If both fields are filled, the specification for the company code has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicator which specifies at what intervals the collective invoices are to be created for the customer. + + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + This field contains the account number of the head office. + This account number is only specified for branch accounts. All postings for which the account number of the branch is specified, are automatically posted to the head office account. The account number of the branch affected is noted in the line items.No line items or balances are managed in the branch account. + + + + + Indicates that during automatic payment transactions clearing is made with the corresponding vendor account, and that during manual clearing procedures, the items of that vendor account are also selected. + To use this function in automatic payment transactions, you have toenter the vendor account number in the customer master record,enter the customer account number in the vendor master record, andselect the "Clearing with customer" indicator in the vendor master record.If you set this indicator, the system will also include items of the vendor account in customer dunning. + + + + + All bank data is determined using this key. + + + + + + Enter an interest calculation indicator here if the account is to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in message control accordingly. + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + Indicator that the payment history of the customer is to be recorded. + The amount and number of payments are then recorded per calendar month, as well as the average days in arrears.Information about cash discount payments and net payments is recorded separately.The indicator should not be set for one-time accounts and accounts which are paid automatically (bank collection or bank bill in Germany, bill of exchange payment request in France).You can only carry out evaluation of the payment history, for example, with the report for customer evaluation with OI listing, if you have selected this field. + + + + + Name or identification code of the accounting clerk at the customer. + + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the customer who is to be the recipient of the dunning letters. + The account number is only needed if dunning letters are not sent to the customer who owes the receivables. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + This field contains the account number your company is listed under at the customer or vendor. + + + + + + The authorization group enables you protect access to certain objects. + In order to carry out a specific activity, the user must have authorization for the combination of the activity and the authorization group. + + + + + Indicates if further billing activities are blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, billing that is already underway is continued. However, you cannot process the document further.Enter one of the values predefined for your system. If you want to block billing for a customer throughout an entire sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block billing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Indicates whether a sales order must be delivered completely in a single delivery or whether the order can be partially delivered and completed over a number of deliveries. + + + + + + Customer's currency for a sales area. This currency will be used to settle the customer's charges for the given sales organization. + + + + + + + The account assignment group to which the system automatically posts the sales document. + The system uses the account assignment group as one of the criteria during the automatic determination of revenue accounts.The system automatically proposes the account assignment group from the customer master record of the payer. You can change the default value in the sales document or the billing document. + + + + + Identifies a particular group of customers (for example, wholesale or retail) for the purpose of pricing or generating statistics. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + A grouping of customers who share the same pricing requirements. + You can define price groups according to the needs of your organization and create pricing records for each group. You can, for example, define a group of customers to whom you want to give the same kind of discount. You can assign a price group to an individual customer either in the customer master record or in the sales document.The system can propose the price group from the customer master record. You can change the proposed value manually in the sales document at both header and item level. + + + + + Determines which pricing procedure the system should apply when you create a sales document for the customer. + You can define different pricing procedures for your system. A pricing procedure determines the type and sequence of conditions that the system uses for pricing in, for example, a sales order. + + + + + Indicates if further delivery processing is blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, delivery processing that is already underway is continued. However, no new processing can take place.Enter one of the values predefined for your system. If you want to block delivery processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block delivery processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + The delivery priority assigned to an item. + You can assign delivery priority to either a particular material or to a combination of customer and material. When you process deliveries collectively, you can use delivery priority as one of the selection criteria. + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Indicates that all data in the master record will be deleted for the specified sales area. Before the deletion is made, the system checks for dependent data that would prevent the deletion. + + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + Identifies the calendar that determines the schedule of billing dates for the customer. + If, for example, a customer wants to consolidate the invoices you send out, you can predefine the billing schedule in a calendar in the system. During billing, the system automatically proposes the appropriate billing date from the calendar.The system proposes the billing schedule from the customer master record of the payer. You can change the value manually in the sales document. + + + + + The probability (expressed as a percentage) of the customer confirming the inquiry or quotation item as part of a sales order. + The system combines the probability factors from the sales document type and from the customer master record of the sold-to party.If probability is 80% for the sales document type and 50% in the customer master record, the system combines the two values. In this case, the system takes 50% of 80% and proposes 40% for the item.The system proposes the probability. You can change the value manually for the item.You can generate requirements from quotations. Accordingly, the probability of quotation items affects how requirements are passed on. For example, a quotation for 100 pieces and a probability of 50% will generate requirements for 50 pieces. + + + + + Indicates whether you are allowed to combine orders during delivery processing. + The system proposes the indicator from the customer master record. You can change the value manually in the sales document at both header and item level. + + + + + Indicates if further sales order processing is blocked for the customer. The block applies throughout the specified sales area. + You can define blocks according to the needs of your organization. If you enter a blocking indicator, sales order processing that is already underway is continued. However, no new processing can occur.Enter one of the values predefined for your system. If you want to block sales order processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sale organization is defined.You can block sales order processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Specifies whether the customer requires full or partial delivery for the item. + You use this field to control partial deliveries at the item level. If the customer allows partial delivery, you can choose from different partial delivery options. For example, you can specify whether the customer allows you to make one delivery attempt only on the requested delivery date or whether unlimited delivery attempts are possible.When partial delivery indicator 'D' is set, the order can never have status 'fully delivered'. You must complete each item by entering a reason for rejection. This could be applied to scheduling agreements, for example.You can enter a value in this field only if the customer allows partial deliveries for the entire sales document. + + + + + Identifies a price list or other condition type (for example, a surcharge or discount). + You can define price list types according to the needs of your own organization. Price list types can be grouped according to:the kind of price list (for example, wholesale or retail)the currency in which the price appearsthe number of the price list typeYou can use price list types to apply conditions during pricing or to generate statistics.In the customer master record, enter one of the values predefined for your system. The system proposes the value automatically during sales order processing. You can change the value manually in the sales document header. + + + + + A group of sales people who are responsible for processing sales of certain products or services. + By using sales groups you can designate different areas of responsibility within a sales office. When you generate sales statistics, you can use the sales group as one of the selection criteria.If sales office personnel service both retail and wholesale markets, you can assign a sales group to each market.You assign each salesperson to a sales group in his or her user master record. You assign each customer to a particular sales group in the customer's master record. + + + + + A physical location (for example, a branch office) that has responsibility for the sale of certain products or services within a given geographical area. + When you create sales statistics, you can use a sales office as one of the selection criteria. When you print out order confirmations, you can include the address of the sales office.You can assign each customer to a sales office in the customer master record.Within a sales office you can establish sales groups (for example, departments) with specific sales responsibilities. Each person who works in the sales office can be assigned to a sales group in his or her user master record. Each customer can also be assigned to a particular sales group in the customer master record. + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Plant from which the goods should be delivered to the customer. + This plant is automatically copied into the sales order item as the default value.If there is no default value when you process the sales order item, enter a delivering plant.The value proposed in the item is eitherfrom the customer master record of the goods recipient, orfrom the material master recordThe system checks whether it can propose a value (and for your own plants, whether the material has been created in the plant). If the system can propose a value, the plant is copied to the sales order item where you can change it as required. + + + + + A geographical sales district or region. + Each customer can be assigned to a sales district. You can use sales districts to apply pricing conditions. When you want to generate sales statistics, you can use sales districts as a selection criteria.The system can propose a value from the customer master record of the sold-to party. You can change the value manually in the document at the header or item level. + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + Specifies a distribution channel that you want to use as a reference for customer and material master data for other distribution channels. + You can specify one distribution channel as the source of customer and material master data for other distribution channels. You need then only to maintain the data in one place.Distrib.channel Ref.distrib.channel01 0102 0103 0104 04In this example, only distribution channels 01 and 04 have customer and material master data defined. Distribution channels 01, 02, and 03 share the master data that you defined for distribution channel 01. Distribution channel 04 has its own master data. When you create a sales order in distribution channel 03, the system checks the customer and material master data against the data defined for distribution channel 01. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + Identifies the country in which the delivery originates. + You can define the country key in a table. As a rule, it is a good idea to use the existing international standards for identifying vehicles from different countries (for example: USA = United States, I = Italy, and so on). The system uses the key tohelp determine the relevant taxes during pricingdetermine important country-specific standards (the length of postal codes and bank account numbers, for example) + + + + + Identifies the condition that the system uses to automatically determine country-specific taxes during pricing. + You can define one or more tax categories for each country. During sales order processing, the system applies the tax category according tothe geographical location of your delivering plant and the location of the customer receiving the goodstax classifications in the customer master record and the material master record.In the USA, for example, you can define tax categories for Federal Sales Tax and Federal Excise Tax. In the U.K., you can define a tax category for Value Added Tax (VAT). + + + + + Specifies the tax liability of the customer, based on the tax structure of the customer's country. + You can use the tax classification to specify, for example, whether a customer is liable for sales taxes, such as VAT or state sales taxes.During sales order processing, the system copies the tax classification from the tax information stored in thecustomer master record of the payer, if the payer is different from the sold-to party and the sales tax identification number is maintained for the payer.ship to party, if the sales tax identification number of the ship-to party is maintained.sold-to party, if none of the criteria for the payer or the ship-to party are met.During pricing, the system calculates any relevant taxes by taking the following factors into account:The tax classification of the customer and the materialThe country keys of the customer and the delivering plant + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + + Date from which: + The company code is obligated to withhold tax for the given withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obligated to withhold tax for the withholding tax type.This date must be defined in the customer master record. + + + + + Date to which: + The company code is obligated to withhold tax for the withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obigated to withhold tax for the withholding tax type. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + + Sold-to party number sent in by the customer in delivery schedules. + The system uses this number to automatically determine the ship-to party. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The account number of the vendor with whom automatic payment transactions are carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies to all company codes. There is a further field in which every company code can enter an alternative payee separately. If both fields are filled, the company code specification has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Indicates whether or not the supplier master record is blocked for all departments (that is, whether or not posting to this record is allowed at all). + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + Specifies an additional master record in which the official address is stored. + This address is used in Italy for business transactions with the tax office in Italy. + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Classification of companies according to tax aspects. + + + + + + Date up to which the certification of the QM-system is valid. + + + + + + If a QM system is maintained by the supplier, you can store a description of the QM system here. + If a material is activated for QM in procurement, the system initiates the following check whenever purchasing functions are carried out (for example, when a request for a quotation is made or if a purchase order is created):Whether the supplier's verified QM system, according to supplier master record or quality info-record (for a combination of supplier/material) meets the requirements for QM systems as specified in the material masterIn carrying out the check, the system relies on the defined assignments for target QM systems and actual QM systems in the Customizing application.If the check is unsuccessful, a warning message is issued when a request for quotation is initiated and an error message is issued for all other procurement activities. + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Key that determines which procurement functions (for example, request for quotation, purchase order, or goods receipt) should be blocked for quality reasons. + You can enter a block key in the:Supplier master recordIn this case, the supplier block applies to all materials and plants.Quality info record for QM in procurementIn this case, the supplier block applies to a single material and plant.A block for quality reasons applies only to those materials for which QM in procurement is active. + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + The tax number of the vendor at the responsible tax authority. + + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in message control accordingly. + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + Name or identification code of the accounting clerk at the vendor. + + + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Indicates that during automatic payment transactions, clearing is made with the corresponding customer account, and that during manual clearing procedures, the items of that customer account are also selected. + To use this function in automatic payment transactions, you have toenter the customer account number in the vendor master record,enter the vendor account number in the customer master record, andselect the "Clearing with vendor" indicator in the customer master record.If this indicator is set, items belonging to the customer account will be included in any dunning run. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + All bank data is determined using this key. + + + + + + Number of days which usually pass until the vendor has cashed your check. + During automatic payment transactions, the system calculates the value date for check payments using this information and stores the date in the line item. The date is calculated as follows:Value date = posting date + check cashing timeIn Cash Management, the value date is used as information about the expected cash outflow. + + + + + Maximum amount which may be issued on a bill of exchange if it is to be used in payment transactions with the business partner. + The amount limit is taken into consideration in automatic payment transactions for payments by bill of exchange and bill of exchange payment requests. Several bill of exchange forms are created if the amount to be settled is higher than the maximum amount given here. Each of these bills of exchange is issued for the maximum amount or for a smaller amount.Amount limits for bills of exchange are used in Spain, for example. + + + + + This field contains the account number the company is listed under at the vendor. + + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + Enter an interest calculation indicator here if the account is to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + This field contains the account number of the master record for the head office account. + You specify this account number only for branch accounts. Items that you post using the branch account number are automatically posted to the head office account. The system records the branch account number in the line items.Neither transactions nor balances are kept in the branch account. + + + + + The account number of the vendor with whom automatic payment transactions are to be carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies only to the company code. There is a further field in which you can enter an alternative payee for each company code. If both fields are filled, the company code specified has priority. + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + US government requirement. + Date field in which to enter certification date for small companies run by women or minorities. This certificate must be renewed every two years. + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + In some countries, an additional country is needed for calculating or reporting withholding tax. + The calculation can depend on the payee's country.A particular country key can be required by law for reporting which may possibly be different to the key used in the address.Examples: Japan, USA (1042), Argentina + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. + You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... + + + + + When incoming invoices are entered or when memos are entered in Financial Accounting (FI), the system checks whether an invoice or credit memo has already been entered for the same date. + Checking Logistics DocumentsThe system checks whether the invoice documents have already been entered in the Logistics invoice verification. For this, the system checks invoices that have been held or parked or that contain errors, or invoices that were entered for invoice verification in the background. The check is performed only if you specify the reference document number when you enter the invoices.When checking for duplicate invoices, the system compares the following specified characteristics:VendorCurrencyCompany CodeGross Invoice AmountReference Document NumberInvoice Document DateIf all of these characteristics are the same, the system issues a message for which you can change the message type in Customizing.When you enter credit memos or subsequent adjustments, the system does not check for duplicate invoices.Exception: The exception is the Argentina country version, where the system checks for duplicate invoices and credit memos.No message is issued if you enter a document that has previously been reversed.In Customizing for Logistics Invoice Verification under Incoming Invoice -> Set Check for Duplicate Invoices, you can specify that the following characteristics are not checked:Reference Document NumberInvoice Document DateCompany CodeHaving fewer attributes to check increases the likelihood that the system will find a duplicate invoice.Example:The following document has already been entered and posted:Reference Document Number 333Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: ChicagoYou have set up the check for duplicate invoices as follows in Customizing:The characteristics Reference Document Number and Company Code are not activated. Consequently, these characteristics are not checked.Now you enter the following invoice:Reference Document Number 334Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: FlagstaffResultBecause you entered a reference document when you entered the invoice, the system checks for duplicate invoices. Compared against the invoice entered earlier, the invoice just entered has different values in the characteristics Reference and Company Code. However, these characteristics are not checked due to the settings that you have made in Customizing. All other characteristics are the same. The system issues a message telling you that an invoice has been entered twice.If the characteristic "Reference Document Number" had been selected in Customizing, the system would have checked the reference document number and established that it was different from the invoice entered earlier, and it consequently would not have issued a message.Checking FI DocumentsThe system checks whether there are FI documents that were posted or parked with the Logistics invoice verification or with an FI invoice transaction. Depending on the entry in the Reference field, one of the following checks is performed:If a reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateReference NumberIf no reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateAmount in Document CurrencyIn Materials Management, the system applies the check for duplicate invoices for invoices only, not for credit memos. + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the vendor who is to receive the dunning notice. + Note:If an entry is not made in this field, the dunning notice is sent to the address of the vendor to be processed. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Denotes the purchasing organization. + + + + + + Subdivision of a supplier's overall product range according to various criteria. + For each supplier sub-range:The master data is kept on a common basisCertain conditions applyIn the supplier master, you can create different purchasing data and different partner functions for each supplier sub-range.You can also maintain and change the conditions for each supplier sub-range. You assign a material to a supplier sub-range in the info record.In the supplier master, you can maintain different data for particular supplier sub-ranges, such as ordering addresses or terms of payment, for example.When creating a purchase order with a known supplier, different data is only determined if the supplier sub-range is entered in the initial screen.Your supplier Smith in Houston has two sub-ranges: paint and glue.All materials from the "paint" sub-range are ordered in Houston.You have maintained an alternative ordering address in Detroit for the "glue" sub-range.If you order materials from the "glue" sub-range, the supplier sub-range finds the Detroit ordering address. + + + + + Key uniquely identifying a plant. + + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + Alphanumeric key uniquely identifying the document. + With the supplier number, information from the supplier master record (such as the supplier's address and bank details) is copied into a purchasing document (such as a request for quotation or a purchase order).You can use the supplier number to keep track of requests for quotation, purchase orders and outline agreements. + + + + + Denotes the purchasing organization. + + + + + + Determines which calculation schema (pricing procedure) is to be used in purchasing documents containing this supplier number. + You can use the schema group to specify the calculation schema per purchasing organization or supplier. The relevant calculation schema is determined by reference to the schema group.The effect of this is that the conditions to be maintained in a purchasing document can differ depending on the relevant purchasing organization or supplier.If a calculation schema is only to be valid for certain purchasing organizations or suppliers, proceed as follows:Define the schema group for the purchasing organization or the supplier using the relevant function in the menu "Calculation schema -> Schema groups".Assign the schema group to the calculation schema via "Calculation schema -> Determine schema".Enter the schema group for the supplier in the supplier master records to which the calculation schema is to be assigned. Assign the schema group of the purchasing organization to the relevant purchasing organization using "Calculation schema -> Schema group -> Assign to purch. org.". + + + + + Indicates whether or not the supplier master record is earmarked for deletion. + + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + Indicator specifying that provision has been made for goods-receipt-based invoice verification for a purchase order item or invoice item. + + + + + + Number of calendar days needed to obtain the material or service if it is procured externally. + If you have different vendors for a material, you must specify an average value. The same applies if you order the material from a fixed vendor that has varying delivery times.If you use the SAP Retail System, the planned delivery time can be suggested from the vendor sub-range in the vendor master record. + + + + + Minimum value specified for purchase orders issued to the relevant supplier. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Determines which date is to be used for price determination (pricing) purposes. + Enter the key for the desired date.If you choose the date of goods receipt, for example, a new price will be determined upon the arrival of the goods, causing the item to be revaluated at this time.NoteIf you have chosen the delivery date as the date for price determination and an item contains several delivery dates (i.e. has a delivery schedule), the first delivery date (the delivery date specified in the first schedule line) is taken. + + + + + Allows you to automatically generate purchase orders from purchase requisitions if the requisition has been assigned to a supplier (source of supply). + If you want to use automatic conversion, note the following additional conditions:In the case of purchase requisitions for materials, you should also select the indicator Autom.purch.ord. in the Purchasing view in the material master record.In the case of purchase requisitions for services, you should also select the indicator Automatic creation of POs for service PReqs in Customizing for Services by choosing:IMG -> MM -> External Services Management -> Source Determination and Default Values- for Client or- for Purchasing Organization + + + + + Key for the currency on which an order placed with a supplier is based. + + + + + + Key for a buyer or a group of buyers, who is/are responsible for certain purchasing activities. + Internally, the purchasing group is responsible for the procurement of a material or a class of materials.Externally, it is the medium through which contacts with the vendor are maintained. + + + + + Indicates whether or not the supplier master record is blocked for the purchasing organization for posting purposes. + + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Means of classifying suppliers according to their significance to your company. + The indicator serves to assign the supplier to one of the categories A, B or C, in accordance with ABC analysis.'A' category suppliers, for instance, are those accounting for the greatest share of the company's total annual spend (in value terms). + + + + + This telephone number is maintained in the supplier master record and adopted in the purchasing document. + + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + + The type of recipient can be defined in the vendor master record. + It is used to group vendors together according to particular characteristics such as occupations that may be subject to the same withholding tax type, but which are required to pay different percentage rates (as defined by the withholding tax code).Application in ThailandThis corresponds to the official Thai form number (Phaw.Ngor.Daw) and is used to determine the sequential numbering of a withholding tax certificate. The form number is defined in the vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + aggregate + groupby + filter + + + + + + + + + + + diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv b/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv new file mode 100644 index 00000000..a3ae063b --- /dev/null +++ b/suppliers/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv @@ -0,0 +1,7 @@ +BusinessPartner;BusinessPartnerFullName +ACME;A Company Making Everything +B4U;Books for You +S&C;Shakespeare & Co. +WSL;Waterstones +TLD;Thalia +PNG;Penguin Books diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv b/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv new file mode 100644 index 00000000..cbb3ca2e --- /dev/null +++ b/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv @@ -0,0 +1,5 @@ +ID;name +ACME;A Company Making Everything +B4U;Books for You +S&C;Shakespeare & Co. +WSL;Waterstones diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds new file mode 100644 index 00000000..5e95d3fc --- /dev/null +++ b/suppliers/srv/mashup.cds @@ -0,0 +1,47 @@ +/* + Optionally add projections to external entities, to capture what + you actually want to use from there. + */ + +using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; +extend service S4 with { + entity Suppliers as projection on S4.A_BusinessPartner { + key BusinessPartner as ID, + BusinessPartnerFullName as name, + } +} + + +/* + You can mashup entities from external services, or projections + thereof, with your project's own entities + */ +using { sap.capire.bookshop.Books } from '@capire/bookshop'; +extend Books with { + supplier : Association to S4.Suppliers; +} + + +/* + You can also expose external entities through your own services + For this to work, you need to delegate the respective calls + addressed to your services into calls to the external service. + */ +extend service AdminService with { + entity Suppliers as projection on S4.Suppliers; +} + +/* + Optionally add a local persistence to keep replicas of external + entities to have data in fast access locally; much like a cache. + */ +annotate S4.Suppliers with @cds.persistence:{table,skip:false}; + +/** + Having locally cached replicas also allows us to display supplier + data in lists of books, which otherwise would generate unwanted + traffic on S4 backends. + */ +extend projection CatalogService.ListOfBooks with { + supplier +} diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js new file mode 100644 index 00000000..accf6d79 --- /dev/null +++ b/suppliers/srv/mashup.js @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Mashing up provided and required services... +// +module.exports = async()=>{ // called by server.js + + if (!cds.services.AdminService) return //> mocking S4 service only + + // Connect to services we want to mashup below... + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service + const admin = await cds.connect.to('AdminService') //> local domain service + const db = await cds.connect.to('db') //> our primary database + + // Reflect CDS definition of the Suppliers entity + const { Suppliers } = S4bupa.entities + + admin.prepend (()=>{ + + // Delegate Value Help reads for Suppliers to S4 backend + admin.on ('READ', 'Suppliers', async req => { + console.log ('>> delegating to S4 service...') + return await S4bupa.run(req.query) + }) + + + // Replicate Supplier data when Books are edited + admin.on (['CREATE','UPDATE'], 'Books', async (req,next) => { + let { supplier } = req.data + if (supplier) { + let cached = await db.exists (Suppliers, supplier) + if (!cached) await replicate (supplier,'initial') + } + return next() + }) + + }) + + // Subscribe to changes in the S4 origin of Suppliers data + S4bupa.on ('BusinessPartner/Changed', async msg => { + let cached = await SELECT('ID').from (Suppliers) + .where ('ID in', msg.businessPartner.KEYS) + for (let each of cached) replicate (each) + }) + + // Helper function to replicate Suppliers data + async function replicate (ID,_initial) { + let data = await S4bupa.read (Suppliers, ID) + if (_initial) return db.insert (data) .into (Suppliers) + else return db.update (Suppliers,ID) .with (data) + } + +} From 476724792e4106bdfecf1123229bb1ee6055ec9a Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Wed, 17 Feb 2021 16:00:10 +0100 Subject: [PATCH 031/100] Make the CatalogService usage more obvious --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 5e95d3fc..a4df66d0 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -16,7 +16,7 @@ extend service S4 with { You can mashup entities from external services, or projections thereof, with your project's own entities */ -using { sap.capire.bookshop.Books } from '@capire/bookshop'; +using { sap.capire.bookshop.Books, CatalogService } from '@capire/bookshop'; extend Books with { supplier : Association to S4.Suppliers; } From e04e9d231d7f73636bb11c2650be9f80f9c73e6d Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:06:51 +0100 Subject: [PATCH 032/100] Delete .gitignore --- suppliers/.gitignore | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 suppliers/.gitignore diff --git a/suppliers/.gitignore b/suppliers/.gitignore deleted file mode 100644 index b8e5bc14..00000000 --- a/suppliers/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# CAP demo -_out -*.db -connection.properties -default-*.json -gen/ -node_modules/ -target/ - -# Web IDE, App Studio -.che/ -.gen/ - -# MTA -*_mta_build_tmp -*.mtar -mta_archives/ - -# Other -.DS_Store -*.orig -*.log - -*.iml -*.flattened-pom.xml - -# IDEs -# .vscode -# .idea From 2650db4ee98b2052c34e505aec7169c8dbabb65a Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:02 +0100 Subject: [PATCH 033/100] Delete extensions.json --- suppliers/.vscode/extensions.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 suppliers/.vscode/extensions.json diff --git a/suppliers/.vscode/extensions.json b/suppliers/.vscode/extensions.json deleted file mode 100644 index 1daacbd8..00000000 --- a/suppliers/.vscode/extensions.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - // >>>>>>>> Add CDS Editor here as soon it is available of vscode marketplace!, - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "mechatroner.rainbow-csv", - "humao.rest-client", - "alexcvzz.vscode-sqlite", - "hbenl.vscode-mocha-test-adapter", - "sdras.night-owl" - ], - // List of extensions recommended by VS Code that should not be recommended for users of this workspace. - "unwantedRecommendations": [ - - ] -} From ad385cbc6c88a34499fc24220b47030b65cd772b Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:23 +0100 Subject: [PATCH 034/100] Delete tasks.json --- suppliers/.vscode/tasks.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 suppliers/.vscode/tasks.json diff --git a/suppliers/.vscode/tasks.json b/suppliers/.vscode/tasks.json deleted file mode 100644 index 622da99a..00000000 --- a/suppliers/.vscode/tasks.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "type": "shell", - "label": "cds watch", - "command": "cds", - "args": ["watch"], - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "type": "shell", - "label": "cds run", - "command": "cds", - "args": ["run", "--with-mocks", "--in-memory?"], - "problemMatcher": [] - } - ] -} From 5031779be8f8070c5ac0a4ffdaa1a1089767c2fd Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:43 +0100 Subject: [PATCH 035/100] Delete launch.json --- suppliers/.vscode/launch.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 suppliers/.vscode/launch.json diff --git a/suppliers/.vscode/launch.json b/suppliers/.vscode/launch.json deleted file mode 100644 index 3f308a6c..00000000 --- a/suppliers/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "command": "cds run --with-mocks --in-memory?", - "name": "cds run", - "request": "launch", - "type": "node-terminal", - "skipFiles": [ "/**" ] - } - ] -} From 3f20f4b9a2e88a3e5e8c0d2278a62a17d444e1a5 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 17 Feb 2021 16:07:53 +0100 Subject: [PATCH 036/100] Delete settings.json --- suppliers/.vscode/settings.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 suppliers/.vscode/settings.json diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json deleted file mode 100644 index 9fefa082..00000000 --- a/suppliers/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files.exclude": { - "**/.gitignore": true, - "**/.git": true, - "**/.vscode": true - } -} From 50fd83fd190c984e5c9523757db2d0ec20398b8c Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:53:54 +0100 Subject: [PATCH 037/100] cosmetics --- suppliers/srv/mashup.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index accf6d79..7185251f 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -4,10 +4,10 @@ // module.exports = async()=>{ // called by server.js - if (!cds.services.AdminService) return //> mocking S4 service only + if (!cds.services.AdminService) return //> mocking SAP S4/HANA service only // Connect to services we want to mashup below... - const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external SAP S4/HANA service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database @@ -16,7 +16,7 @@ module.exports = async()=>{ // called by server.js admin.prepend (()=>{ - // Delegate Value Help reads for Suppliers to S4 backend + // Delegate Value Help reads for Suppliers to SAP S4/HANA backend admin.on ('READ', 'Suppliers', async req => { console.log ('>> delegating to S4 service...') return await S4bupa.run(req.query) @@ -35,7 +35,7 @@ module.exports = async()=>{ // called by server.js }) - // Subscribe to changes in the S4 origin of Suppliers data + // Subscribe to changes in the SAP S4/HANA origin of Suppliers data S4bupa.on ('BusinessPartner/Changed', async msg => { let cached = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartner.KEYS) From d21a0e08ca2d1d83befeec7abf649f543fbc2072 Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:54:47 +0100 Subject: [PATCH 038/100] cosmetics --- samples.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples.md b/samples.md index 7efbb068..b5af7c96 100644 --- a/samples.md +++ b/samples.md @@ -51,8 +51,8 @@ Each sub directory essentially is an individual npm package arranged in an [all- ## [@capire/suppliers](suppliers) -- Shows how to integrate remote services, in this case the BusinessPartner service from S/4. -- Extending [@capire/bookshop](bookshop) with suppliers from S/4 +- Shows how to integrate remote services, in this case the BusinessPartner service from SAP S/4HANA. +- Extending [@capire/bookshop](bookshop) with suppliers from SAP S/4HANA - Providing that as a pre-built integration & extension package - Used in [@capire/fiori](fiori) From 4b48d68ba6c45a6aac21603798cc86dc30453830 Mon Sep 17 00:00:00 2001 From: Iwona Hahn Date: Wed, 17 Feb 2021 17:55:27 +0100 Subject: [PATCH 039/100] cosmetics --- suppliers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/package.json b/suppliers/package.json index e1cfb4bc..f500d495 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -1,7 +1,7 @@ { "name": "@capire/suppliers", "version": "1.0.0", - "description": "Shows integration with S/4, in turn provided as a reusable extension package to bookshop.", + "description": "Shows integration with SAP S/4HANA, in turn provided as a reusable extension package to bookshop.", "private": true, "dependencies": { "@capire/common": "*", From 1b5cc62d1cc53f4da0d647add5e50bec7b43eac9 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 19 Feb 2021 12:15:35 +0100 Subject: [PATCH 040/100] some corrections and optimizations --- suppliers/srv/mashup.cds | 8 ++++++ suppliers/srv/mashup.js | 55 ++++++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index a4df66d0..33d607c9 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -8,6 +8,14 @@ extend service S4 with { entity Suppliers as projection on S4.A_BusinessPartner { key BusinessPartner as ID, BusinessPartnerFullName as name, + // REVISIT: following is not supported so far in cds compiler... + // to_BusinessPartnerAddress as city { + // CityCode as code, + // CityName as name + // } + // REVISIT: following is not supported so far in cqn2odata... + // to_BusinessPartnerAddress.CityCode as city, + // to_BusinessPartnerAddress.CityName as city_name, } } diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 7185251f..a77b238c 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -4,49 +4,54 @@ // module.exports = async()=>{ // called by server.js - if (!cds.services.AdminService) return //> mocking SAP S4/HANA service only + if (!cds.services.AdminService) return //> mocking S4 service only // Connect to services we want to mashup below... - const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external SAP S4/HANA service + const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database // Reflect CDS definition of the Suppliers entity const { Suppliers } = S4bupa.entities - admin.prepend (()=>{ + admin.prepend (()=>{ //> to ensure our .on handlers below go before the default ones - // Delegate Value Help reads for Suppliers to SAP S4/HANA backend - admin.on ('READ', 'Suppliers', async req => { + // Delegate Value Help reads for Suppliers to S4 backend + admin.on ('READ', 'Suppliers', req => { console.log ('>> delegating to S4 service...') - return await S4bupa.run(req.query) + return S4bupa.run(req.query) }) - - // Replicate Supplier data when Books are edited - admin.on (['CREATE','UPDATE'], 'Books', async (req,next) => { - let { supplier } = req.data - if (supplier) { - let cached = await db.exists (Suppliers, supplier) - if (!cached) await replicate (supplier,'initial') - } - return next() + // Replicate Supplier data when edited Books have suppliers + admin.on (['CREATE','UPDATE'], 'Books', ({data:{supplier}}, next) => { + // Using Promise.all(...) to parallelize local write, i.e. next(), and replication + if (supplier) return Promise.all ([ next(), async()=>{ + let replicated = await db.exists (Suppliers, supplier) + if (!replicated) await replicate (supplier, 'initial') + }]) + else return next() //> don't forget to pass down the interceptor stack }) }) - // Subscribe to changes in the SAP S4/HANA origin of Suppliers data - S4bupa.on ('BusinessPartner/Changed', async msg => { - let cached = await SELECT('ID').from (Suppliers) - .where ('ID in', msg.businessPartner.KEYS) - for (let each of cached) replicate (each) + // Subscribe to changes in the S4 origin of Suppliers data + S4bupa.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 + let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartners) + return replicate (replicas.map(each => each.ID)) }) - // Helper function to replicate Suppliers data - async function replicate (ID,_initial) { - let data = await S4bupa.read (Suppliers, ID) - if (_initial) return db.insert (data) .into (Suppliers) - else return db.update (Suppliers,ID) .with (data) + /** + * Helper function to replicate Suppliers data. + * @param {string|string[]} IDs a single ID or an array of IDs + * @param {truthy|falsy} _initial indicates whether an insert or an update is required + */ + async function replicate (IDs,_initial) { + if (!Array.isArray(IDs)) IDs = [ IDs ] + let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) + if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert + else return Promise.all(suppliers.map ( //> parallelizing updates + each => db.update (Suppliers,each.ID) .with (each) + )) } } From 43e5f6faef17fb743a9545b2fd9dd08adc60fbcd Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Mar 2021 19:19:29 +0100 Subject: [PATCH 041/100] Adding fix-antlr script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 6a8fdc91..2d034090 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", + "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From c89984331928d2bc8d968bb49db99bbe4bce83dc Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 11 Mar 2021 14:14:59 +0100 Subject: [PATCH 042/100] Using event : projection on Reviews --- reviews/srv/reviews-service.cds | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reviews/srv/reviews-service.cds b/reviews/srv/reviews-service.cds index 6e026b99..a4505b3d 100644 --- a/reviews/srv/reviews-service.cds +++ b/reviews/srv/reviews-service.cds @@ -8,9 +8,9 @@ service ReviewsService { action unlike (review: type of Reviews:ID); // Async API - event reviewed : { - subject: type of Reviews:subject; - rating: Decimal(2,1) + event reviewed : projection on Reviews { + subject, + rating } // Input validation From a4810c3a7b7e9af4dd9a3922f69bab1fe0867c24 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:27:29 +0100 Subject: [PATCH 043/100] . --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 2d034090..a1125d32 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", + "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules && cd test/_cap/samples", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From 0bdf4bb93e19ff44208635308e0499b9c5acccbb Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:30:18 +0100 Subject: [PATCH 044/100] . --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1125d32..4869d8e2 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", - "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules && cd test/_cap/samples", + "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", From 87dbb4552a3fd050c75cbe84da8431f8a95ae708 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 27 Mar 2021 19:44:39 +0100 Subject: [PATCH 045/100] . --- package.json | 1 - suppliers/package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 4869d8e2..2d034090 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", - "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", diff --git a/suppliers/package.json b/suppliers/package.json index f500d495..109d8caa 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -5,7 +5,7 @@ "private": true, "dependencies": { "@capire/common": "*", - "@sap/cds": "^4", + "@sap/cds": ">=4", "express": "^4" }, "scripts": { From 2999c8df83a40f237dd8b0771e2e31de58cd1693 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 16 Apr 2021 11:43:02 +0200 Subject: [PATCH 046/100] Add todo --- suppliers/srv/mashup.cds | 3 +++ 1 file changed, 3 insertions(+) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 33d607c9..3d80f0f6 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -6,13 +6,16 @@ using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; extend service S4 with { entity Suppliers as projection on S4.A_BusinessPartner { + // TODO: Aliases not supported in Java, yet? key BusinessPartner as ID, BusinessPartnerFullName as name, + // REVISIT: following is not supported so far in cds compiler... // to_BusinessPartnerAddress as city { // CityCode as code, // CityName as name // } + // REVISIT: following is not supported so far in cqn2odata... // to_BusinessPartnerAddress.CityCode as city, // to_BusinessPartnerAddress.CityName as city_name, From de806a1e3868d45d3274f65f7630819c3a594e34 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Mon, 26 Apr 2021 07:31:29 +0200 Subject: [PATCH 047/100] Add example with supplier_ID --- suppliers/srv/external/data/sap.capire.bookshop-Books.csv | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 suppliers/srv/external/data/sap.capire.bookshop-Books.csv diff --git a/suppliers/srv/external/data/sap.capire.bookshop-Books.csv b/suppliers/srv/external/data/sap.capire.bookshop-Books.csv new file mode 100644 index 00000000..d4e1fc64 --- /dev/null +++ b/suppliers/srv/external/data/sap.capire.bookshop-Books.csv @@ -0,0 +1,2 @@ +ID;title;descr;author_ID;stock;price;currency_code;genre_ID;supplier_ID; +299;Mobby Dick;"""Moby-Dick""" or """The Whale""" is an 1851 novel by American writer Herman Melville. The book is the sailor Ishmael's narrative of the obsessive quest of Ahab, captain of the whaling ship Pequod, for revenge on Moby Dick, the giant white sperm whale that on the ship's previous voyage bit off Ahab's leg at the knee. A contribution to the literature of the American Renaissance, Moby-Dick was published to mixed reviews, was a commercial failure, and was out of print at the time of the author's death in 1891.;105;99;15.20;GBP;11;ACME \ No newline at end of file From eb4bc703dd29f19e384c8b991d4edfc909e8b59a Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Mon, 3 May 2021 12:52:11 +0200 Subject: [PATCH 048/100] Improvements for Supplier replication --- suppliers/monkey-patch.js | 38 +++++++++++++++++++ suppliers/requests.http | 27 +++++++++++++ suppliers/server.js | 3 ++ .../srv/external/API_BUSINESS_PARTNER.js | 10 +++++ suppliers/srv/mashup.cds | 12 ++++++ suppliers/srv/mashup.js | 21 +++++++--- 6 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 suppliers/monkey-patch.js create mode 100644 suppliers/requests.http create mode 100644 suppliers/srv/external/API_BUSINESS_PARTNER.js diff --git a/suppliers/monkey-patch.js b/suppliers/monkey-patch.js new file mode 100644 index 00000000..5b24936a --- /dev/null +++ b/suppliers/monkey-patch.js @@ -0,0 +1,38 @@ +const deploy = require("@sap/cds/lib/deploy"); + +const DEBUG = (...args) => console.log(...args); + +deploy.exclude_external_entities_in = function (csn, _bound) { + // NOSONAR + for (let [each, { service = each, model, credentials }] of Object.entries( + cds.requires + )) { + if (!model) continue; //> not for internal services like cds.requires.odata + if (_bound && !credentials) continue; + DEBUG && DEBUG("excluding external entities for", service, "..."); + const prefix = service + "."; + for (let each in csn.definitions) { + const def = csn.definitions[each]; + if (def["@cds.persistence.table"] === true) continue; + if (each.startsWith(prefix)) { + DEBUG && DEBUG("excluding external entity", each); + _exclude(each); + } + } + } + return csn; + + function _exclude(each) { + const def = csn.definitions[each]; + if (def.kind !== "entity") return; + def["@cds.persistence.skip"] = true; + // propagate to all views... + for (let other in csn.definitions) { + const d = csn.definitions[other]; + // do not exclude replica table + if (d["@cds.persistence.table"] === true) continue; + const p = (d.query && d.query.SELECT) || d.projection; + if (p && p.from.ref && p.from.ref[0] === each) _exclude(other); + } + } +}; diff --git a/suppliers/requests.http b/suppliers/requests.http new file mode 100644 index 00000000..2572f89d --- /dev/null +++ b/suppliers/requests.http @@ -0,0 +1,27 @@ + +@server = http://localhost:4004 +@authAlice = Authorization: Basic alice: + +PUT {{server}}/api-business-partner/A_BusinessPartner('ACME') +Content-Type: application/json + +{ + "BusinessPartnerFullName": "Alice Changed" +} + +### + +PATCH {{server}}/admin/Books(201) +{{authAlice}} +Content-Type: application/json + +{ + "supplier_ID": "PNG" +} + + + +### + +GET {{server}}/admin/Books?$top=11&$expand=supplier +{{authAlice}} diff --git a/suppliers/server.js b/suppliers/server.js index 2e8cbb64..69bcb13c 100644 --- a/suppliers/server.js +++ b/suppliers/server.js @@ -1,3 +1,6 @@ const cds = require ('@sap/cds') + +require('./monkey-patch'); + cds.once('served', require('./srv/mashup')) module.exports = cds.server diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js new file mode 100644 index 00000000..d3f696d4 --- /dev/null +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -0,0 +1,10 @@ +const cds = require('@sap/cds'); + +module.exports = cds.service.impl(function (srv) { + const { A_BusinessPartner } = this.entities; + + srv.after('UPDATE', A_BusinessPartner, data => { + console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); + srv.emit("BusinessPartners/Changed", { businessPartners: [ data.BusinessPartner ] }); + }); +}); diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 3d80f0f6..6a445aba 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -16,10 +16,22 @@ extend service S4 with { // CityName as name // } + // to_BusinessPartnerAddress + // REVISIT: following is not supported so far in cqn2odata... // to_BusinessPartnerAddress.CityCode as city, // to_BusinessPartnerAddress.CityName as city_name, } + + + // REVISIT: Alternative idea to use a specific replication view, but request data from + // a different view and manual map values. + // entity ReplicatedSuppliers as projection on Suppliers { + // ID, + // name, + // to_BusinessPartnerAddress.CityCode as city, + // to_BusinessPartnerAddress.CityName as city_name + // } } diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index a77b238c..98ac7773 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -23,13 +23,21 @@ module.exports = async()=>{ // called by server.js }) // Replicate Supplier data when edited Books have suppliers - admin.on (['CREATE','UPDATE'], 'Books', ({data:{supplier}}, next) => { + admin.on (['CREATE','UPDATE'], 'Books', async ({data:{supplier_ID: supplierId}}, next) => { // Using Promise.all(...) to parallelize local write, i.e. next(), and replication - if (supplier) return Promise.all ([ next(), async()=>{ - let replicated = await db.exists (Suppliers, supplier) - if (!replicated) await replicate (supplier, 'initial') + + /* + // ERROR: Reference integrity is violated for association "supplier" + if (supplierId) return Promise.all ([ next(), async()=>{ + let replicated = await db.exists (Suppliers, supplierId) + if (!replicated) await replicate (supplierId, 'initial') }]) else return next() //> don't forget to pass down the interceptor stack + */ + + let replicated = await db.exists (Suppliers, supplierId); + if (!replicated) await replicate (supplierId, 'initial'); + return next(); }) }) @@ -47,7 +55,10 @@ module.exports = async()=>{ // called by server.js */ async function replicate (IDs,_initial) { if (!Array.isArray(IDs)) IDs = [ IDs ] - let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) + // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER + + let suppliers = await S4bupa.read (Suppliers).where(...([[]].concat(IDs).reduce( (where, id, index ) => { where.push(`${index>1 ? "OR ":""}ID = `, id); return where }))); + //let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert else return Promise.all(suppliers.map ( //> parallelizing updates each => db.update (Suppliers,each.ID) .with (each) From 98113c46fd9e1a1386f84f18cdcf660491952198 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Mon, 3 May 2021 16:37:16 +0200 Subject: [PATCH 049/100] Own transaction when raising an event --- README.md | 6 ++++++ suppliers/requests.http | 3 ++- suppliers/srv/mashup.js | 40 +++++++++++++++++++++++++++------------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 16ee56f1..9c94df18 100644 --- a/README.md +++ b/README.md @@ -84,3 +84,9 @@ In case you've a question, find a bug, or otherwise need support, use our [commu ## License Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE.txt) file. + +## TODOs + +1. Move `Suppliers` out of `API_BUSINESS_PARTNER` - remove additional lines in monkey patch --> Uwe +2. Fix problem with `await S4bupa.read (Suppliers).where('ID in',IDs)` --> Johannes +3. \ No newline at end of file diff --git a/suppliers/requests.http b/suppliers/requests.http index 2572f89d..8877829c 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -1,8 +1,9 @@ @server = http://localhost:4004 +@bpServer = http://localhost:59847 @authAlice = Authorization: Basic alice: -PUT {{server}}/api-business-partner/A_BusinessPartner('ACME') +PATCH {{server}}/api-business-partner/A_BusinessPartner('ACME') Content-Type: application/json { diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 98ac7773..2fdb1ac6 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -26,26 +26,26 @@ module.exports = async()=>{ // called by server.js admin.on (['CREATE','UPDATE'], 'Books', async ({data:{supplier_ID: supplierId}}, next) => { // Using Promise.all(...) to parallelize local write, i.e. next(), and replication - /* - // ERROR: Reference integrity is violated for association "supplier" - if (supplierId) return Promise.all ([ next(), async()=>{ - let replicated = await db.exists (Suppliers, supplierId) - if (!replicated) await replicate (supplierId, 'initial') - }]) - else return next() //> don't forget to pass down the interceptor stack - */ + const replicateIfNotExists = async()=>{ + let replicated = await db.exists (Suppliers, supplierId); + if (!replicated) await replicate (supplierId, 'initial'); + }; - let replicated = await db.exists (Suppliers, supplierId); - if (!replicated) await replicate (supplierId, 'initial'); - return next(); + if (supplierId) return Promise.all ([ next(), replicateIfNotExists() ]) + else return next() //> don't forget to pass down the interceptor stack }) }) // Subscribe to changes in the S4 origin of Suppliers data + // REVISIT: cds context is still from the UPDAT method when running in same programm, but should + // be a separate S4bupa.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 - let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.businessPartners) - return replicate (replicas.map(each => each.ID)) + await new Promise( resolve => setTimeout( resolve, 1000 )); + const tx = cds.db.tx(msg); + let replicas = await tx.run(SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners)); + await replicateTx(replicas.map(each => each.ID), undefined, tx, msg); + await tx.commit(); }) /** @@ -57,6 +57,7 @@ module.exports = async()=>{ // called by server.js if (!Array.isArray(IDs)) IDs = [ IDs ] // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER + // TODO: Issue let suppliers = await S4bupa.read (Suppliers).where(...([[]].concat(IDs).reduce( (where, id, index ) => { where.push(`${index>1 ? "OR ":""}ID = `, id); return where }))); //let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert @@ -65,4 +66,17 @@ module.exports = async()=>{ // called by server.js )) } + async function replicateTx (IDs,_initial, tx, msg) { + if (!Array.isArray(IDs)) IDs = [ IDs ] + // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER + + // TODO: Issue + let suppliers = await S4bupa.tx(msg).read (Suppliers).where(...([[]].concat(IDs).reduce( (where, id, index ) => { where.push(`${index>1 ? "OR ":""}ID = `, id); return where }))); + //let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) + if (_initial) return tx.insert (suppliers) .into (Suppliers) //> using bulk insert + else return Promise.all(suppliers.map ( //> parallelizing updates + each => tx.update (Suppliers,each.ID) .with (each) + )) + } + } From 8601bd8a46a90c975046b0208b48811da5d1d4b9 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Tue, 4 May 2021 08:56:20 +0200 Subject: [PATCH 050/100] Suppliers moved to bookshop namespace --- README.md | 15 ++++++-- suppliers/package.json | 5 +++ suppliers/requests.http | 4 +- .../srv/external/API_BUSINESS_PARTNER.js | 5 ++- ....csv => sap.capire.bookshop-Suppliers.csv} | 2 +- suppliers/srv/mashup.cds | 38 +++++++++---------- suppliers/srv/mashup.js | 28 ++++++++++++-- 7 files changed, 66 insertions(+), 31 deletions(-) rename suppliers/srv/external/data/{API_BUSINESS_PARTNER-Suppliers.csv => sap.capire.bookshop-Suppliers.csv} (63%) diff --git a/README.md b/README.md index 9c94df18..dce6bb91 100644 --- a/README.md +++ b/README.md @@ -85,8 +85,17 @@ In case you've a question, find a bug, or otherwise need support, use our [commu Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE.txt) file. +# Suppliers - in progress for Service Consumption - + ## TODOs -1. Move `Suppliers` out of `API_BUSINESS_PARTNER` - remove additional lines in monkey patch --> Uwe -2. Fix problem with `await S4bupa.read (Suppliers).where('ID in',IDs)` --> Johannes -3. \ No newline at end of file +1. Fix problem with `await S4bupa.read (Suppliers).where('ID in',IDs)` --> Johannes +2. Fix issues when running in same process +3. Automated tests + +## Usage + +1. Run: `PORT=5001 cds mock API_BUSINESS_PARTNER` +2. Wait until startup is completed +3. Run in a 2nd terminal: `cds serve all --with-mocks --in-memory` +4. Now, you can issues the requests listed in `suppliers/requests.http` \ No newline at end of file diff --git a/suppliers/package.json b/suppliers/package.json index 109d8caa..1193c73b 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -18,6 +18,11 @@ "API_BUSINESS_PARTNER": { "kind": "odata", "model": "srv/external/API_BUSINESS_PARTNER" + }, + "[development]": { + "messaging": { + "kind": "file-based-messaging" + } } } } diff --git a/suppliers/requests.http b/suppliers/requests.http index 8877829c..5a28c19d 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -1,9 +1,9 @@ @server = http://localhost:4004 -@bpServer = http://localhost:59847 +@bpServer = http://localhost:5001 @authAlice = Authorization: Basic alice: -PATCH {{server}}/api-business-partner/A_BusinessPartner('ACME') +PATCH {{bpServer}}/api-business-partner/A_BusinessPartner('ACME') Content-Type: application/json { diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js index d3f696d4..dcb2e7b6 100644 --- a/suppliers/srv/external/API_BUSINESS_PARTNER.js +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -1,10 +1,11 @@ const cds = require('@sap/cds'); -module.exports = cds.service.impl(function (srv) { +module.exports = cds.service.impl(async function (srv) { + const messaging = await cds.connect.to('messaging') const { A_BusinessPartner } = this.entities; srv.after('UPDATE', A_BusinessPartner, data => { console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); - srv.emit("BusinessPartners/Changed", { businessPartners: [ data.BusinessPartner ] }); + messaging.emit("BusinessPartners/Changed", { businessPartners: [ data.BusinessPartner ] }); }); }); diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv similarity index 63% rename from suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv rename to suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv index cbb3ca2e..9648db87 100644 --- a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv +++ b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv @@ -1,5 +1,5 @@ ID;name -ACME;A Company Making Everything +ACME;A Company Making Everything (X) B4U;Books for You S&C;Shakespeare & Co. WSL;Waterstones diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 6a445aba..173f5ab4 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -3,9 +3,12 @@ you actually want to use from there. */ +using { sap.capire.bookshop as bookshop } from '@capire/bookshop'; using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; -extend service S4 with { - entity Suppliers as projection on S4.A_BusinessPartner { + +@cds.autoexpose // or expose explicitly in Catalog and AdminService +@cds.persistence: {table,skip:false} // add persistency +entity sap.capire.bookshop.Suppliers as projection on S4.A_BusinessPartner { // TODO: Aliases not supported in Java, yet? key BusinessPartner as ID, BusinessPartnerFullName as name, @@ -21,18 +24,19 @@ extend service S4 with { // REVISIT: following is not supported so far in cqn2odata... // to_BusinessPartnerAddress.CityCode as city, // to_BusinessPartnerAddress.CityName as city_name, - } +} + + +// REVISIT: Alternative idea to use a specific replication view, but request data from +// a different view and manual map values. +// entity ReplicatedSuppliers as projection on Suppliers { +// ID, +// name, +// to_BusinessPartnerAddress.CityCode as city, +// to_BusinessPartnerAddress.CityName as city_name +// } - // REVISIT: Alternative idea to use a specific replication view, but request data from - // a different view and manual map values. - // entity ReplicatedSuppliers as projection on Suppliers { - // ID, - // name, - // to_BusinessPartnerAddress.CityCode as city, - // to_BusinessPartnerAddress.CityName as city_name - // } -} /* @@ -41,7 +45,7 @@ extend service S4 with { */ using { sap.capire.bookshop.Books, CatalogService } from '@capire/bookshop'; extend Books with { - supplier : Association to S4.Suppliers; + supplier : Association to bookshop.Suppliers; } @@ -51,15 +55,9 @@ extend Books with { addressed to your services into calls to the external service. */ extend service AdminService with { - entity Suppliers as projection on S4.Suppliers; + entity Suppliers as projection on bookshop.Suppliers; } -/* - Optionally add a local persistence to keep replicas of external - entities to have data in fast access locally; much like a cache. - */ -annotate S4.Suppliers with @cds.persistence:{table,skip:false}; - /** Having locally cached replicas also allows us to display supplier data in lists of books, which otherwise would generate unwanted diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 2fdb1ac6..5c70556e 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -10,9 +10,10 @@ module.exports = async()=>{ // called by server.js const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database + const messaging = await cds.connect.to('messaging'); // Reflect CDS definition of the Suppliers entity - const { Suppliers } = S4bupa.entities + const Suppliers = db.entities["sap.capire.bookshop.Suppliers"]; admin.prepend (()=>{ //> to ensure our .on handlers below go before the default ones @@ -38,9 +39,9 @@ module.exports = async()=>{ // called by server.js }) // Subscribe to changes in the S4 origin of Suppliers data - // REVISIT: cds context is still from the UPDAT method when running in same programm, but should + // REVISIT: cds context is still from the UPDATE method when running in same programm, but should // be a separate - S4bupa.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 + messaging.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 await new Promise( resolve => setTimeout( resolve, 1000 )); const tx = cds.db.tx(msg); let replicas = await tx.run(SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners)); @@ -79,4 +80,25 @@ module.exports = async()=>{ // called by server.js )) } + + { + // one server: returns AdminSuppliers + // two servers: returns A_BusinessPartner + const tx = S4bupa.tx({}); + let result = await tx.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); + tx.commit(); + console.log(result); + } + + { + // one server: returns AdminSuppliers + // two servers: returns AdminSuppliers + const tx = db.tx({}); + let result = await db.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); + tx.commit(); + console.log(result); + } + + //process.exit(0); + } From 278258c4361afe03d0ddc801794a72517482d7ce Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 5 May 2021 08:07:48 +0200 Subject: [PATCH 051/100] Implement eventing --- suppliers/monkey-patch.js | 4 ++-- suppliers/requests.http | 7 +++++++ suppliers/srv/external/API_BUSINESS_PARTNER.js | 3 +-- suppliers/srv/mashup.cds | 8 ++++++++ suppliers/srv/mashup.js | 16 ++++++++-------- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/suppliers/monkey-patch.js b/suppliers/monkey-patch.js index 5b24936a..139502ad 100644 --- a/suppliers/monkey-patch.js +++ b/suppliers/monkey-patch.js @@ -1,5 +1,7 @@ const deploy = require("@sap/cds/lib/deploy"); +// TODO: https://github.wdf.sap.corp/cdx/cds/pull/1949 + const DEBUG = (...args) => console.log(...args); deploy.exclude_external_entities_in = function (csn, _bound) { @@ -12,8 +14,6 @@ deploy.exclude_external_entities_in = function (csn, _bound) { DEBUG && DEBUG("excluding external entities for", service, "..."); const prefix = service + "."; for (let each in csn.definitions) { - const def = csn.definitions[each]; - if (def["@cds.persistence.table"] === true) continue; if (each.startsWith(prefix)) { DEBUG && DEBUG("excluding external entity", each); _exclude(each); diff --git a/suppliers/requests.http b/suppliers/requests.http index 5a28c19d..b6678750 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -20,7 +20,14 @@ Content-Type: application/json "supplier_ID": "PNG" } +### + +PATCH {{bpServer}}/api-business-partner/A_BusinessPartner('PNG') +Content-Type: application/json +{ + "BusinessPartnerFullName": "Penguin Books (Changed)" +} ### diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js index dcb2e7b6..325e75cc 100644 --- a/suppliers/srv/external/API_BUSINESS_PARTNER.js +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -1,11 +1,10 @@ const cds = require('@sap/cds'); module.exports = cds.service.impl(async function (srv) { - const messaging = await cds.connect.to('messaging') const { A_BusinessPartner } = this.entities; srv.after('UPDATE', A_BusinessPartner, data => { console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); - messaging.emit("BusinessPartners/Changed", { businessPartners: [ data.BusinessPartner ] }); + srv.emit("A_BusinessPartner.Changed", { businessPartners: [ data.BusinessPartner ] }); }); }); diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 173f5ab4..d1648bc7 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -66,3 +66,11 @@ extend service AdminService with { extend projection CatalogService.ListOfBooks with { supplier } + +// Extend S4 service with not modelled event +extend service S4 { + @topic: 'BusinessPartners/Changed' + event A_BusinessPartner.Changed { + BusinessPartners: array of S4.A_BusinessPartner:BusinessPartner; + } +} \ No newline at end of file diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 5c70556e..84d4ea9a 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -10,7 +10,6 @@ module.exports = async()=>{ // called by server.js const S4bupa = await cds.connect.to('API_BUSINESS_PARTNER') //> external S4 service const admin = await cds.connect.to('AdminService') //> local domain service const db = await cds.connect.to('db') //> our primary database - const messaging = await cds.connect.to('messaging'); // Reflect CDS definition of the Suppliers entity const Suppliers = db.entities["sap.capire.bookshop.Suppliers"]; @@ -41,7 +40,8 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data // REVISIT: cds context is still from the UPDATE method when running in same programm, but should // be a separate - messaging.on ('BusinessPartners/Changed', async msg => { //> would be great if we had batch events from S/4 + // https://github.wdf.sap.corp/cap/matters/projects/44#card-196556 + S4bupa.on ('A_BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 await new Promise( resolve => setTimeout( resolve, 1000 )); const tx = cds.db.tx(msg); let replicas = await tx.run(SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners)); @@ -81,24 +81,24 @@ module.exports = async()=>{ // called by server.js } + // TODO: remove test code { - // one server: returns AdminSuppliers - // two servers: returns A_BusinessPartner + // one server: returns AdminService.Suppliers + // two servers: returns API_BUSINESS_PARTNER.A_BusinessPartner const tx = S4bupa.tx({}); let result = await tx.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); tx.commit(); console.log(result); } + // TODO: remove test code { - // one server: returns AdminSuppliers - // two servers: returns AdminSuppliers + // one server: returns AdminService.Suppliers + // two servers: returns AdminService.Suppliers const tx = db.tx({}); let result = await db.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); tx.commit(); console.log(result); } - //process.exit(0); - } From c4bee1f09af978a57af7e5ef6fc89b3613e6b384 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 5 May 2021 11:14:02 +0200 Subject: [PATCH 052/100] Fixes and improvements --- .../srv/external/API_BUSINESS_PARTNER.js | 7 ++++--- suppliers/srv/mashup.js | 19 ++----------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js index 325e75cc..b879e841 100644 --- a/suppliers/srv/external/API_BUSINESS_PARTNER.js +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -1,10 +1,11 @@ const cds = require('@sap/cds'); -module.exports = cds.service.impl(async function (srv) { +module.exports = cds.service.impl(function () { const { A_BusinessPartner } = this.entities; - srv.after('UPDATE', A_BusinessPartner, data => { + // TODO: Take over the original S/4 event definition + this.after('UPDATE', A_BusinessPartner, async data => { console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); - srv.emit("A_BusinessPartner.Changed", { businessPartners: [ data.BusinessPartner ] }); + await this.emit("A_BusinessPartner.Changed", { businessPartners: [ data.BusinessPartner ] }); }); }); diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 84d4ea9a..3b528ad3 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -43,10 +43,8 @@ module.exports = async()=>{ // called by server.js // https://github.wdf.sap.corp/cap/matters/projects/44#card-196556 S4bupa.on ('A_BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 await new Promise( resolve => setTimeout( resolve, 1000 )); - const tx = cds.db.tx(msg); - let replicas = await tx.run(SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners)); - await replicateTx(replicas.map(each => each.ID), undefined, tx, msg); - await tx.commit(); + let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners); + await replicate(replicas.map(each => each.ID)); }) /** @@ -67,19 +65,6 @@ module.exports = async()=>{ // called by server.js )) } - async function replicateTx (IDs,_initial, tx, msg) { - if (!Array.isArray(IDs)) IDs = [ IDs ] - // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER - - // TODO: Issue - let suppliers = await S4bupa.tx(msg).read (Suppliers).where(...([[]].concat(IDs).reduce( (where, id, index ) => { where.push(`${index>1 ? "OR ":""}ID = `, id); return where }))); - //let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) - if (_initial) return tx.insert (suppliers) .into (Suppliers) //> using bulk insert - else return Promise.all(suppliers.map ( //> parallelizing updates - each => tx.update (Suppliers,each.ID) .with (each) - )) - } - // TODO: remove test code { From 902afd8a760e4ea6b88fd57b40fafa706b2de705 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 5 May 2021 11:36:36 +0200 Subject: [PATCH 053/100] Change event to reflect the real event definition --- README.md | 24 ++++++++++++++--- .../srv/external/API_BUSINESS_PARTNER.js | 4 +-- suppliers/srv/mashup.cds | 6 ++--- suppliers/srv/mashup.js | 26 ++++++++----------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index dce6bb91..42461ee1 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,25 @@ Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This ## Usage -1. Run: `PORT=5001 cds mock API_BUSINESS_PARTNER` +1. Run: + + ``` + cds mock API_BUSINESS_PARTNER -p 5001 + ``` + 2. Wait until startup is completed -3. Run in a 2nd terminal: `cds serve all --with-mocks --in-memory` -4. Now, you can issues the requests listed in `suppliers/requests.http` \ No newline at end of file +3. Run in a 2nd terminal: + + ``` + cds serve all --with-mocks --in-memory + ``` + +4. Now, you can issues the requests listed in `suppliers/requests.http` + +## Request Sequence + +* TODO +## URLs + +* Get books with their replicated supplier: http://localhost:4004/browse/Books?$expand=supplier +* Get remote suppliers: http://localhost:4004/admin/Suppliers?$top=11 \ No newline at end of file diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js index b879e841..d770c612 100644 --- a/suppliers/srv/external/API_BUSINESS_PARTNER.js +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -3,9 +3,9 @@ const cds = require('@sap/cds'); module.exports = cds.service.impl(function () { const { A_BusinessPartner } = this.entities; - // TODO: Take over the original S/4 event definition + // https://api.sap.com/event/SAPS4HANACloudBusinessEvents_BusinessPartner/resource this.after('UPDATE', A_BusinessPartner, async data => { console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); - await this.emit("A_BusinessPartner.Changed", { businessPartners: [ data.BusinessPartner ] }); + await this.emit("BusinessPartner.Changed", { BusinessPartner: data.BusinessPartner }); }); }); diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index d1648bc7..c0bf86fe 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -69,8 +69,8 @@ extend projection CatalogService.ListOfBooks with { // Extend S4 service with not modelled event extend service S4 { - @topic: 'BusinessPartners/Changed' - event A_BusinessPartner.Changed { - BusinessPartners: array of S4.A_BusinessPartner:BusinessPartner; + @topic: 'BusinessPartner/Changed' + event BusinessPartner.Changed { + BusinessPartner: S4.A_BusinessPartner:BusinessPartner; } } \ No newline at end of file diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 3b528ad3..3de8f285 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -38,31 +38,27 @@ module.exports = async()=>{ // called by server.js }) // Subscribe to changes in the S4 origin of Suppliers data - // REVISIT: cds context is still from the UPDATE method when running in same programm, but should - // be a separate - // https://github.wdf.sap.corp/cap/matters/projects/44#card-196556 - S4bupa.on ('A_BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 + S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 await new Promise( resolve => setTimeout( resolve, 1000 )); - let replicas = await SELECT('ID').from (Suppliers) .where ('ID in', msg.data.businessPartners); - await replicate(replicas.map(each => each.ID)); + const id = msg.data.BusinessPartner; + let replica = await SELECT.one('ID').from (Suppliers) .where ('ID =', id); + if (replica) await replicate(id); }) /** * Helper function to replicate Suppliers data. - * @param {string|string[]} IDs a single ID or an array of IDs + * @param {string} a single ID * @param {truthy|falsy} _initial indicates whether an insert or an update is required */ - async function replicate (IDs,_initial) { - if (!Array.isArray(IDs)) IDs = [ IDs ] + async function replicate (id,_initial) { // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER - // TODO: Issue - let suppliers = await S4bupa.read (Suppliers).where(...([[]].concat(IDs).reduce( (where, id, index ) => { where.push(`${index>1 ? "OR ":""}ID = `, id); return where }))); - //let suppliers = await S4bupa.read (Suppliers).where('ID in',IDs) + // TODO: Doesn't work because fields are not mapped back! + //let supplier = await S4bupa.run(SELECT.one('*').from(Suppliers).where('ID =',id)); + + let suppliers = await S4bupa.read(Suppliers).where('ID =',id); if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert - else return Promise.all(suppliers.map ( //> parallelizing updates - each => db.update (Suppliers,each.ID) .with (each) - )) + else return db.update(Suppliers,id) .with (suppliers[0]); } From d04cb801c454acf870db03e5466e25881fd9533b Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 7 May 2021 14:12:01 +0200 Subject: [PATCH 054/100] Updated --- suppliers/.vscode/settings.json | 3 +++ suppliers/package.json | 6 +++++- suppliers/requests.http | 2 +- suppliers/server.js | 3 +++ .../external/data/sap.capire.bookshop-Suppliers.csv | 3 ++- suppliers/srv/mashup.cds | 10 ++++++++++ 6 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 suppliers/.vscode/settings.json diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json new file mode 100644 index 00000000..fc7d5517 --- /dev/null +++ b/suppliers/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "sbas.lcnc.isCockpitVisibile": true +} \ No newline at end of file diff --git a/suppliers/package.json b/suppliers/package.json index 1193c73b..d523c66d 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -17,7 +17,11 @@ "requires": { "API_BUSINESS_PARTNER": { "kind": "odata", - "model": "srv/external/API_BUSINESS_PARTNER" + "model": "srv/external/API_BUSINESS_PARTNER", + "credentials": { + "destination": "blub", + "url": "http://localhost:3333" + } }, "[development]": { "messaging": { diff --git a/suppliers/requests.http b/suppliers/requests.http index b6678750..423e1d7c 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -3,7 +3,7 @@ @bpServer = http://localhost:5001 @authAlice = Authorization: Basic alice: -PATCH {{bpServer}}/api-business-partner/A_BusinessPartner('ACME') +PATCH {{server}}/api-business-partner/A_BusinessPartner('ACME') Content-Type: application/json { diff --git a/suppliers/server.js b/suppliers/server.js index 69bcb13c..ed3ff51e 100644 --- a/suppliers/server.js +++ b/suppliers/server.js @@ -1,6 +1,9 @@ const cds = require ('@sap/cds') +console.log("serverjs") + require('./monkey-patch'); cds.once('served', require('./srv/mashup')) + module.exports = cds.server diff --git a/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv index 9648db87..1096eb4a 100644 --- a/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv +++ b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv @@ -1,5 +1,6 @@ ID;name -ACME;A Company Making Everything (X) +ACME;A Company Making Everything (local) B4U;Books for You S&C;Shakespeare & Co. WSL;Waterstones + diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index c0bf86fe..3b7894f7 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -24,6 +24,16 @@ entity sap.capire.bookshop.Suppliers as projection on S4.A_BusinessPartner { // REVISIT: following is not supported so far in cqn2odata... // to_BusinessPartnerAddress.CityCode as city, // to_BusinessPartnerAddress.CityName as city_name, + + //// REVISIT: Should this be here or in the service, when it is only used for Fiori? + //// Compositions should work as well + //// The version with "virtual" is prefered, as this makes clear that the association is "added" here + // virtual books: Association to Books on book.supplier = $self, + // books2: Association to Books on book.supplier = $self, + //// Add virtual field, that does'nt exisits in the persistence or the underlying service + // virtual saveEnabled: Boolean +} excluding { + OrganizationBPName1, OrganizationBPName2,OrganizationBPName3, OrganizationBPName4, to_BuPaIdentification, to_BuPaIndustry, to_BusinessPartnerAddress, to_BusinessPartnerBank, to_BusinessPartnerContact, to_BusinessPartnerRole, to_BusinessPartnerTax, to_Customer, to_Supplier } From 016587094f324b0885132331f1c3f72c653a0b8c Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Tue, 11 May 2021 09:52:54 +0200 Subject: [PATCH 055/100] Add suppliers notes app --- notes/.cdsrc.json | 1 + notes/.eslintrc | 24 + notes/.gitignore | 29 + notes/README.md | 29 + notes/assets/NotesService.drawio | 81 + notes/assets/NotesService.png | Bin 0 -> 215240 bytes notes/db/data-model.cds | 8 + notes/db/data/sap.capire.notes-Notes.csv | 4 + notes/db/mashup.cds | 33 + notes/db/src/.hdiconfig | 136 + notes/mta.yaml | 58 + notes/package.json | 33 + notes/requests.http | 16 + notes/srv/external/API_BUSINESS_PARTNER.csn | 2847 +++++++ notes/srv/external/API_BUSINESS_PARTNER.edmx | 6614 +++++++++++++++++ ...API_BUSINESS_PARTNER-A_BusinessPartner.csv | 3 + notes/srv/notes-service.cds | 13 + notes/srv/notes-service.js | 61 + package.json | 3 +- test/notes.test.js | 176 + 20 files changed, 10168 insertions(+), 1 deletion(-) create mode 100644 notes/.cdsrc.json create mode 100644 notes/.eslintrc create mode 100644 notes/.gitignore create mode 100644 notes/README.md create mode 100644 notes/assets/NotesService.drawio create mode 100644 notes/assets/NotesService.png create mode 100644 notes/db/data-model.cds create mode 100644 notes/db/data/sap.capire.notes-Notes.csv create mode 100644 notes/db/mashup.cds create mode 100644 notes/db/src/.hdiconfig create mode 100644 notes/mta.yaml create mode 100644 notes/package.json create mode 100644 notes/requests.http create mode 100644 notes/srv/external/API_BUSINESS_PARTNER.csn create mode 100644 notes/srv/external/API_BUSINESS_PARTNER.edmx create mode 100644 notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv create mode 100644 notes/srv/notes-service.cds create mode 100644 notes/srv/notes-service.js create mode 100644 test/notes.test.js diff --git a/notes/.cdsrc.json b/notes/.cdsrc.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/notes/.cdsrc.json @@ -0,0 +1 @@ +{} diff --git a/notes/.eslintrc b/notes/.eslintrc new file mode 100644 index 00000000..639d13a0 --- /dev/null +++ b/notes/.eslintrc @@ -0,0 +1,24 @@ +{ + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true, + "jest": true + }, + "parserOptions": { + "ecmaVersion": 2017 + }, + "globals": { + "SELECT": true, + "INSERT": true, + "UPDATE": true, + "DELETE": true, + "CREATE": true, + "DROP": true, + "cds": true + }, + "rules": { + "no-console": "off", + "require-atomic-updates": "off" + } +} diff --git a/notes/.gitignore b/notes/.gitignore new file mode 100644 index 00000000..92467f6d --- /dev/null +++ b/notes/.gitignore @@ -0,0 +1,29 @@ +# CAP s4-cap-ext +_out +*.db +connection.properties +default-*.json +gen/ +node_modules/ +target/ + +# Web IDE, App Studio +.che/ +.gen/ + +# MTA +*_mta_build_tmp +*.mtar +mta_archives/ + +# Other +.DS_Store +*.orig +*.log + +*.iml +*.flattened-pom.xml + +# IDEs +# .vscode +# .idea diff --git a/notes/README.md b/notes/README.md new file mode 100644 index 00000000..8dc1f472 --- /dev/null +++ b/notes/README.md @@ -0,0 +1,29 @@ +# S4 Extension with CAP + +## Scenario + +This sample applications shows how to extend an existing oData service on BTP using CAP. + +In our scenario, we want to extend the entity `A_BusinessPartner` of an external service ([BusinessPartner API](https://api.sap.com/api/API_BUSINESS_PARTNER/resource)) with a `note` field so that our end-users of the applictions can maintain notes for each business partner +## Diagramm + +![](assets/NotesService.png) + +## Usage + +### Business Partner Local Mock + +Start a CAP process for the local mock server for Business Partner and a second one for the CustomerService: + +1. Run: `cds mock API_BUSINESS_PARTNER -p 5001` +2. Wait until startup is completed +3. Run in a 2nd terminal: `cds serve all --with-mocks --in-memory` +4. Now, you can issues the requests listed in `requests.http` + +### Business Partner from Sandbox Server + +1. Goto https://api.sap.com/api/API_BUSINESS_PARTNER/resource +2. Get service key +3. Export env var `S4_APIKEY` with the service key (`export S4_APIKEY=""`) +4. Run: `CDS_ENV=sandbox cds watch` +5. Now, you can issues the requests listed in `requests.http` diff --git a/notes/assets/NotesService.drawio b/notes/assets/NotesService.drawio new file mode 100644 index 00000000..69e2a5f0 --- /dev/null +++ b/notes/assets/NotesService.drawio @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/notes/assets/NotesService.png b/notes/assets/NotesService.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc761ecb8f023c6d64d5bb24cdae19650fe73da GIT binary patch literal 215240 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

DCFHtnVm)9|=1DHI zdPpu2l?`=C5xR6@du4r&oUk<(OYOvNM4D$G)1uT&)6J%~Aj@_d_a&pF?ZX!@rdw4* zSPOLx1?Tzg)7;KkqtLlEwH;mIJ!Utuv)_{6Aw7~jY7Zb5CE=PwE2uvwObDVDKpL4m zwBasmr;nr|14p!4^@^?{&s1O7um84o1z`dcVUpj3or5xr7GT|R_7NT|lq;No4-fxpbRgXt*kiS%U%iZkaaMEGRW7waE z!og-XMwB&z;r<&FRdA1-^3+Y@pSmwO8hw3A$qndCJP&CRL0@tZmQgKp7HLU!cjGBN zMqc$IiZyQd%IGQ}aNHHHcw(HUzH6rRf~{#|_zi7oyluZ}1xh1R1y4w+dD7Uf=-;Rw zD2!K?POGX%x+cvYBK_&8Of)}c>QK6yC1wTbj8c9P4ZT&STghOrRR>{n-mk08=amWUAs2Pl@ud4)msKx=U?o z0O(-5t?&1)O!_q?IUz%6vT=dKYJhhM%!ISP-n4Ul?2|F<3JChQW|c42(+8%1*@90p zyZhpt-m;GuoP;QVfg%Pg+%{H}%xAq15xH{n$2RB8cJ^uAa*39B%%4+BNak2QCvcAA z?^}59v|fPBL3ZN1F~wa|zj!&$CInwR93XHth>0+U{CMY(*TF-l`BF#|bW68`WXuTB zHmUg4{-Nz6b>FUCn?D$fa^>Mk=W;5g!14P&>6(g(V#7u;H*f#*H_EdU*pF(l(>FQ% z&v~`;Ft+BSG422JEAf{g1NWcP_#dzEpCJ63kO7Q7C7Aj@=jx`!0lcqx&Ds5*G{HaS zNsyd^!IjpRpI!J^_jcUTjt6mKzNAL!$)PvFc2ziy&Ed+rd5PZqn<4z!l8}=$MsU<2 z&{E-Ux*b8h5k~1qSzCEl?mJ?msgCrgTTuev!E!~2Q>ec;ApfEb8LshoHTn=gnf!az z<;o~-^^u5wO9^<19~x=_p1I$E-=g>j{X;MwrZ*oXVZYnrnZ25&aY`ct{0RfIm{dv1QVZvzs< zi>Lwj9@D93I)Scj6MECWV>9-r;n(?+?V|ycR@O_3R&;KgoI2?Y{@5a`p8RJ@DW)OP zw9~}+UtLcZS7v4(o_@qSI6bga6CxbT2^%kU1Yb&-G|93f_PUXgdG}sWqzs3+naOGB z-la2tVrJD*GZ5g_d;T~kaQ}3}K)DIZ<+Dzx{^A{L4@^cz=(L_(&hr39)|Zuwc20?lT&4?P<&_;VU$wS(pl(L=JZRHFo~jFtbJJkT6>p zx$P`}i9*`Qc6-%%hLufjk@8f|(7+9Le3F6~X~&sjqqA}i5<|UZ=@j!fiZt!DWz`lv z6^lL;y4{#N_M{O*sU47;z6MI#srpkcJCB-18fwDfdkp^{PQo)b2KK0X`5wZr>^Oc zm`>+|3l{}_hiWWJM?(h_(uR9x8!D!H<4WroodS5LgWd1i#ELOj2$$t}_y@0Y7Jm}! zomju-Ak%)we=Cdec4?I^i4=>XzKE7FMw6rV_lm zD1o*j8Ks}hPru5*O}2uG)W1?H2h3ZR#g}BI*VtVcsiTNCA`K$c?6L$y~?QCJjMAXloNPrK_?j2`P)q&-=_YLJ}lK7m~dqT}lkG&KAcQyl8> zPADh3S-Q06<|k>-5&b0tbiU__OlFj--|H~jJj0-{&5wg)>8gebev4x?yXP|GSjRf8 z?z~X7X2#P(f;J=%2;c~5HaGXh3h0kajy7+8l56~Wj3y_@quurDqXy1qeD6(3W|5Ha z9!txZ8TYOn8=Ce;ecJlkP)XXwhv>cEbp+R*&K(VM)Up|xmI|q8l1sNVD-Cc}>~~d^ z>>W$bmX}Lou$i`cp!IBH``jvxLchv}@X&(NbABVeQfx`?sg)wjeyXiki|h;FzC?o5 za08_bQ`j_eH?v?m6jRK*vtQdC%L44bT_#4bxBvDIUD2Scc>zRzVLd)7M+-^4p}0AM z7qVR0-0Z8gI9*(JjKRxJ5Bb%HZX%(1i;9^<{%JQm*UVKI-Ytp>F{ysi7gAvJA*;t^ z0h7oXpXAIOdhsM{T=u&`=iw7W#wWI_=K71Rm+#Yexo@wH?^+C23Q!m-07r#lECO;N z_J_?}L;_sz=4m+wQgL15yjTIDTsSliYhRup5+VN;MRl0{BHH+@R>3^Q1Ruf923B8~MxOo$@KCBR%h?C=z3;(36Gmr&RktJQD7lWLICx6jc!L}lh%EqW0Z|Bf%k!E{rKZm+3s&Ur}6Kf zZ|KxaJ$pT4CIYnT9-$gkjx2+a^@sJn|#yc^dPKZg;kfRFJ?ydTB zGEp=ugQ2VQ{ZbOi!`giP7%6WAP@9-X0A(bHDfZj(8-A=s4^p}_bQI+xIn!VIf>$3d z?6H1!tRS+r$!}jUAX-6koQAg*dLVJ9Kyc3*@UDo!iKB9*&%7I2sn796+>OJK^xQ~F z#LlRaOhO~H{^^J;jK(96ecoM16cR%)f4`RF1c1sIlGQ};QzZ7u6qH(Wa)V4}6VlB5 zoi}*HLP(CDa(4rEU48_4uL$sA&tt+b?V16|S2mpd0k5cFbCP&*?(@x?Gb4)CH$5sJ zwZqxb$J$SRV|xgc^o+BuWKF&&sEsVtOUOCW1VOzCcaN@5U+f!>OJ1ULhtIyOgfrX(KAQH_n5TsIcSX`y8H&0^UWv(UBbE3ZnYls{p#0e_a4lMFfnZiZROU!;hTDTbU+& zB*>SU!Gq0p=ftj7CazNc$+jzWKZtAZjW7X&itahGU@9aIMb*xPwO9n``0?>WCZtp8Vp) z3u@12|A2=g2mn(q2dqpEWi??7S5^#Ss#eVVe0SRZ@2>iLbc75cIR5-WmEUV9R z);pBsxRB=d9vjinL7V`PAswxNUcYEgHXvw|r!x#t3~=jM7sK5(iPqVmc^j-7mI zWk^^*x)<=AJjpv(GTeyd6qXN(M=krvZhct0m5F0$o(A{2+-}lEv3f!m3uqpR-?IAc zSZM%NLf+jJxPg?FjUOu;sGK5-<7Ucr1VP9qZ-9yKC1%>iwR4hg^+jM|S0?ag0lf3!D{?2B{`Z zhfWpxrDQ9N6A0pb6nkA??3tI%j(Zn`6;^x6m!%@vv*H+0d$1oMt;6hglultdW(qs!WiO6@>JS=ejZDawy~tEn0fNT5<;*jcb_IY07Rnz zzOChUpQuQL>|qi?p$X&)an{#(!^m26dzkxra0QEsk(FY@7^HZbw3NeDyMNciQDl@o z@?eVpzTMHZ-Wo4fq59?Ng~yStYaMM-9j=Fu-YbsDACcO#U1@hkTV|?_-A`mD(uPGw zacVnUkISU9)P}fr@Ox)sJD}l~b5%Q@IjbpO);i2vLF!21K^EPYsq-2wRa1OS;hZx5 zTje%y4-)-QHLvo_@IN zRrR8;a%LA|@v2j8$j^%5{5agv}|ZHVKMUH>x>ukg_b}Wa$1^zhW5XKcIHnx>PT! z^S(F9YXkAaj4Raq>1k(#HMP!PTc}*DXQnJtQCr9$p_0(dnd|XkFJE}FO86DhY+5}r z&q5jETr<1YCEX_n7PDh$kW-45jw?mq(+E4Frj+g#lMeZZX?)u7T;}*&$gmIHt^Q&b zkjOq0_Z+OHzoWSw8 z=~kSk$V<``S?=EV6TZy|AM6qNUP;cMuC{2}0oD{T^#|v!LOn`L!Uw7imhdO~M`FP` zRsuC{1GI|UsV_HcZG#71R-huAN$3;RA@$3-*N)xOBt5z$(^3Q$Qvq@~ld@Z;t3Qw^ z;Sdq2J*5l!nGdT!`NRoF4BA85<5oF%aT@`d5zu6@yVwFMcEr(<#eHVXL)>#OYL5zn z>xC27Ha|V|B-ZHcb+R!v{jt(prcQJo3Ta(SX6kc@+WMzxLoDI3*4tP@atigm{TO$b zVEvV8uEZrF4INlzm2pv#i(A01aNn3NZ95^gp}NhPNT-5GUR8crS4eVoF}vTkWVOJj z&6_)%kr0s0ow)_{d+_{ZN&FPfF3#6s&+WJ z!E_IJ_!H~X1Rj0%k#>4QBoSOVIBVOV-QoKHLy`L!41T2+`5N@*QX9gqEsbxCWkx8p z4vgK(fhF?jt+|8wjj?Q4j#?8Kn}$3BD?R#tMK)!pJL;K~QhqF=y^8z$$|nwpu$uH2 zp%wfLc+xejc+#im;j%iG9E6J41g~lt<(i2pM!A+q8eX7jaqUP`xSHiqQ5IXj0S=A> zWyI%132KLmduDtDhm$n!tG`m(^Jnu)1^JKt&dQVY=}tjD;n6Fem`9)AohIqHU83n# z_tLdXP*D|vd9n~Dh(YiSTY}&b~EICtAtoWe{2MnAr{4`bT(xay&(7dM9R)V%+!m z)9CPzcjBN#Bh#=0VzepzIo-1UEWG&i&hMTq`j2Pg>7Gom`z5)ThztO@h~0)9O+7Vf zJOr-lkDLKg^mh%7i#eAQFp?fq;xLNPQ##0H$*4HfuE%!WS=hM_NFM(W&!A9|I<)n{ zty~p-=}Z!Hp2;20WY*Bf;2$J(wN=x}V#gn)I#g}WT0fq~TN#8Axw+&w43}SXrkPP^ z>d|uUuvvBytr;xY$Q;EZsm9r$S`Ig5?FRu~9ssp`CV^rX4_k^_F+C`9u_p>oS%*g%f+mxz!EuEE=YRy}PK{-sS~& z`KXKD_(l5|BW_oJr>vqd2J#No1NV13-gKc1p%k$=u6v-iHf%3}z( z2V)oGt6ES74NR{r);hEpx3}10DoI8?&Y01^A zDHm}lE&)`jVAxJ2fwJ($_B&qAJ1 z@W;f$%o9J3*99tM^b@~JmnVe4be5ue9@*F^z-pf7aDyb6Ge9|Y}CpOH8J zNK&L=gS7cL!9j1}>@}JHqBX_wX0G>m#aSZ%wf@w`5Fd)`T<3gdmjl_AJhDWq&jZS4f|i5{ctS54 zptI?8NWBOC`=ru+z7K*x5{);E@A_8sp#*WgP`FrTU9?SnO&c^anAgav2|vlF^z@+u!lIAy15>eueI!dmU6XX^+Do4(%BD;; ziqiz9N7J6>{^n~_r>06GBb1oA@r9S^hfF!tY<%cN=gOwuk0x$+ye+1PP^+42Jx{Dq zopr1G{Y2Hyw%br-Qf#jWk?|34FE3&0shxHJZoZP-0sEmoR6x*c^p{P9N)vS)x>78k z>)O0>IZ#m1er-L7Dg16At>qC?nsb^o{8is;sol`F|qD4uP3^N6#v^XI8#c(#|J-pTXs~n6P?mRQ#%XfEbV7 zyTggA@n1H=r^ChyX-4!k)<7=;v!p8bnpr~)A)PD%J|LEfCgMZh`|kn_sBP z#&CF&+uE@W8>66>8F9*Hg2OZix8yB;EPORu_)lGNHBX^o zq4xy+n7rgT$;)ex5Fgt4R+EaFRws3h86@=C4?A_pI=6XG-tsxJR{0}8V#swG-K45v zY1n}qBo=X~M!WZrb(xi(3VmE=4P+*-53*40^WBnarc2&?D>tsN)2Mdg zxIG%)89fm?`_zAlrYKg6!u^O^_h6A4MVah?nuq7ntNsyMmWT}>$(9r>kf41-ew3GB zT}BXiRXN>kTP9b|#l;A@6%}hY1oDlYvx5!|ur)=aq%3zs*h}aX-^2LHXi7>mrCjg3xSWQ zE!w9wcV8_k5V)5;LNcEwb$KF~bIS9rHy|unALB|C#UtKI;eb{gJ8_2O`tAGGu3OQ7 z3n6#1w)qso=+cDVMwMb_$4xPXMJ~sV1mO=IA#9PvgBUW_vp$mf567~UAj+~Rf)Dy) zBa5uU+u_GvIpKdx>%qwzr`(M^0U5YdbX-Reu(_emb4fN=RQLpL3oQf-E%2$L~lk3@!UWrRoY+C2QMJ;kq#PLfXMMRUDdQF|+3wccH| zJ=))4>5#?V*kRT$+pTFQ`^(80Hm6js=IAH2$!#N_f-BgRIxRD{6N=P|f4`>TPoHJ; zfv6%k=}#>H@>ZwdTC!qE^bjtI{b(oJY9L8TVGh<8?y5YPn5XJM7J5 z^s~!Q}R)HeTd#vg5Qs8aq&@@10t!NvVw|JK5Vs!3`fa9b z_o#|I-WU?6VI_4u3CkKCyZa{r1#i5sx}5RW_0d3C?je9&NXGEpI;&{K)oyOY>^SBx zV1cbdk&<||<9Vqj6_=TEykQ|qB9nT|))eT*EK_|0P5M1yw%~ZEmDadUlQ#|lK;q%@ z@Wtc<`_jSR4>)A|`8MtWUN1{U!`QTBa>J6<3ydNlB+oM#d=e{E2pvVR9nAn{{^C0@ zBJ5MvFf3zkVRk}gB*k{ExZe{T@WEEWqPj~JNZ!N|sOAwBj~-n;nRff_ku-ebv)lui z?VTwihQn!@Zw)E;!PQd;JamD=bwIi+>?#!a#T_eJ=-fuc5I*aH%79K`R(yQCNko}0 z1Yv_e3g_~#q&R5ugqY`{Ey=G}j>otS;I2gixpS$(O61}DqeEcVXOMK0UPSF6Nebi> z2`Sgc@D0mf!rUrPZ1WTVJhDz90tcmXEiFPfx5pBl-)ELdj&W8fo&}0YApe_U%~88= z&luK=6ezzW*LE*iHp|d6peVhEUz(pKX#u}SQdXA<@!Ud?+mc&u1-y5}gdCwf>6!SXZz_HNt zmnw8(*e)bzWlY?49oq3gXO2Y5BuIG8EQWR4CGDpmMnWr>rBe7;RJYup-7v)uvzr3uc6W{0h&$dij0;e!Mn z=p32SOM9yxbW*F^V@l=|c;dH|8CC84W5RuVZ@He%3|CG1T_#K<&wXwdF9_^3>vBDR>)Djptr_FFEFL7Q=5}xh zA)78FE9WMAb9a<{Lb#p^y2_H??XXFkr!!oE$g>#wbPK_x-G;C3tXA!u(3sV5?9ua$ z(Ain2ZVpnzkbqMtx6}&USY35GJ+(enaTR8?i@6B$uP{XEODK$ zSao;F<*4_;K16ae<>Kp~MHl?Cg;siMXaLyN*2WzuM@b@{lo8}X8O_$>*S}uX(#UOa zB%A~ey4!r+fg-;p_R1gc1cA3~1Wnvn@>{nd#}VfCAVnkMz`-e1)i_Pky$#=Vb^`hX zD!eTj_yxZy2t}boM)1xAb+AnpbedBVMN;brXWHdNEYErgkG@uN?}tLXg>#NR^q~*l z-KWs*bodTj*m3+NE+|ZVXX{}_e55|sW$gUC3ryMkN^N7;66QC7wnxHHf1#tmY)5GsCezRJ~jw6LjoNh}iy%R#X~lGjMIvxz9HK0;ii83#pJjff%aM-u7m zQ#YhsdZA{biCBbi*j_MNT8Na;?S7kgp-im*!0R!NGB?_kQ}?7UT6v*%MDSwA2|6S{ z+0pE~+)*i_Hp*Fs+C-)I6-3cSomA>N1e1O-is?@CgLj8BRf0NZ3$RH6!JJ2I2H0ZR zOGkoQMIAd_&MvE}dDzrGC#4m;HTH$lpxSc4#o^Ul0PAeFl9MMfv0BhsP6%W+8s-ux z+Sk2rDJynQOg$H1nIz#OT&W2n80};KA+Ft1GfB4 zA^`l^-@G|?Sn(tyWt{5#!SyWk{PAYUR1kD9y*}u>Ptqig9tudTjwLG_(srVX+LA=$ zpZJ;C#92*Wl?ngi;8P4Yd!6uWlrZBxDsEDY+so~(4L6;U36e|EYFZ;7B+W*1Azv4U zQ?7FdXu9#01g*NQhGlAA4D^aS(GG?&2iT^e)Mg4Zu!ng)H-F@>^&#c56g8t*G?JI} z!Bp<13Jdjuv=LJFuVANnvIfsIURp`EfV3rcD^KNT&}vS1TL zP|+f?Q~sIkVM8)PTt5zQ(}2-aycX8}1{jUZQiu^r8l+^?sK3MA({KJ%%d8BJwsdr` z!_h0hoMaG14<0`o*R`XEl4po-zVQbthdAOUd<2%BRK`xX(r3&xS^Phk*Tt%IKb$IB zg#d|dCgp~8115>pqVW#ysENCYKT{UPiS>5pIx1>lVB!jP>$CP(D_pb+;mCY6{ zVapv`zC#Ms?Uw4OhJ*H6S5Li7e-B%7GDw4e`>dN*?Im>5dgk{YJYh}{wz_-g!j?#f4#lSmvMKG<)$pvvo7RJZiEi18ke8;@n|Hz3 zx`Ne{1&jucwu4%vxNXDT@zfa3(A$Gk&uk5+>*IZCr||a^45y4%Av4}?knzm*bTf4p zgRAxDrPs3Hokj3L!ghuw=je#)7XXk~Jasd^K19?f5?js?znF|rZD|yk$@Te6#>gy- za8Fk?(cd#5O+f2uU#{4a+owA3lCAGJhiKFJe2m z#jD(clQR4M7%XwJqc^c28L&fMP;u2$?+7_3AcPsbava^SzxprH4hT=WY`h5iu*A~B z_%->w``u6L9D%kGhC-j$mK4<;J7FzFKPdOy zVIcoAs#3y~vwlw_3R1zLZgRnX(fJOBKt&h}tJ+M~n)zT)!oeh4Vwk9;yy)3BmU=+* z)7wJQv@<1=-lk40dH}DJwj-Q^=~G9Kq#z}>1)uLyCwqFY-&R|VgrKgDL}vO|*B>9R z^={~fx;)AeVqbHC=%Wc~*0H5q+oZ#qiUt9$P(y>IAVbG>14)40I$TRRrY>G1d0Oq&; zwpN|>QxexFY3-qiHA+8#FD2!m*~W_mItAlbGafxL0uAGbKnP<=_rh{y>ZXB~oF=!bt!Nr$!qrZ@?<+8bal%`$O6E}#6|^P8o+#+|0`(F$64rZK1{Omcm~o)%PnR5_XT zRVl=Z&hzycyNd8)5T%wZ?P8FxUlHvY4o-L${|^6g~UO#D9|M~tfLZEd8Fsfm*tba&01kp;*)KVUCnT*liS534KJWTV9j2Dus(f-da8ArI8i6b4DAU?{znbAUe<3TW-Qn zwwAZ{@g}>=%{&*$w#&|0U&`w*hFb_13O27)Z?%W33FkLT$H-V{=P&0PS}Y~33Bvk5 zlunu45+)lBDt3K1ZQgp7cPJ@hMj1nU!lpJrrQ5Tp%u4I!Ix)kpo$ZJf1$o>L`T=U0 zXUkV72Gp16_Rn91frE5r1C8JVU;eY(b_*vRkRM{I>MV9b7*96Us z>=HaC)WO&FbWY4!>kp@QXRnK`6=SVFW7^T14Xz1GS{K&v6)_r`YlDb$A9!b%kuYZ}=mO6L~rU43{C-Lwk9=ecto z#PUeK6VY)oYK^-!hUm6X1@eD--HF_PpOepJF{pcP=a)8S#7u0uq%*s77h!%`4{_aV zR4}%51ypU>X5vIl(eMmUP;9t37k*{K+;A-&hy>< z54iT9`V>^OXz2kwB47lJB3UnNXNVx>e~|{ER0ddc$w{U6_qmmSX6*=%zCR%!NGDQB zsChztpX+ttAhW1$pVY!Xsm8se_EtPN1XLS2q zk&pK-vWR-ro;NmlO?`i_&Tp3-bbz1}NFLd$0bBcC{GSgnyQ+H#43F$h0Q20Mnj4<& zf6>MBkd^(!YkT(Z4|l+u>ZtwvV8s#RuV?p<@MR&8!;-}Lc5A%<`2PKW-?va+P;6fq z=<~mkHB5pG8v|?o_x*$W`%>-x)g2bZgXSlg>mNsOg%xzx{-r==-!PGf_yQ32?6B_t zMiAK)rcBb$R`4IDY=80#8EY(vtRz;V^pGTF#o|6qt5@`i~bljATRC0 zqzG~L=b8C=@`6B*Il7RsZXZ+j-`=wT1!*fb*M0szGe6JU|83R(Z?-C@O!)QqZ~FHm zZYF>8=-Cz1h#Mtw2Zp23XK_l)HOhD7SFT<+?_yDED!B9T{1;JHh!YG!O77{VStM5J z%SZQzkSK~6_ddS6VjbFFfarnV*tpSBfXQ)U{r;jOIP`%TrUkl+YT2zWjQ~ejV`j_G zHONZHlvN@%rZ6-}W`|!{O?Y!bZ0OnIwueRyLOgAF^vJ0C2_ZsdzMCTjwPZK^Sn}^Z z;uzayT1<(G-U0!7|10O-?Fs6BYbB?v89WrifIEcmF0$ml5KzJf%@tm{E+~{5;PnYX z`1aK?{CiN1EgBq)2QC95rMu)A6uTPivNV>Sc5n9pI9zS5^w@|T2>dW5TsAuUhh(m> zV1tymYg^iv9UgXv51zI1p84A%Gm!?-lo}{^;iA(iC#COUvrA$bsHv#x2dh95*6?Af z<{8%E!FI-B?8w*Mt`qw0ZX%}qVw>sZP@*81kv#$}f`1E9MWrW|=Z=Gp!c3ToYx_LV zWm-hGkKt zazdHlm!I#vpX?g^Si=I%E3bF6_5b!i-k9f3#_9Em(w`*wAI-q^MgmS5GP~LQzs$+s zzZ_=l|AzVxvl@E%>eZ_(PsLdFZ>c}0PwXPB*h%F}QGfp8pI)^0y9X4oVz#payj&+56@@NkoJv4hs!vNePY zSCOOpw)N=pG)KINP@b?~)`uXulm~3W0hj1@w0m(04t0yU6w-sjq0;9h6po7zzjJZ@ zY>l>B?0-Wy_kp`O|HXr8OM32S`V145TG#qCYjNxmz2oB3{-b)V zp{?j+yKX&DbSUUK5WMqM}Uvby}tBI0Y-}?B&-66~eR* zlq?Uv)YjG}y#JR~?<65bxDi=T2E(n)@1#k4v=i!3>yh^&tz7Q*}xc*N;v^ zSJV#w%?iJk-aeH6t{40^mt=w?PN&Xxt%a7PEbI2u(T%%p{pvY zc4hj|;KMwcDDj+|`uUoaq58}P_gUEbZM7JS+)E+Vu#|XiFZPZzCI}UwbSrvwDF0%E zgC1Ye!SunHr>3QBEOlK4#OLA&)zM^`HYemeS2&d$@bLE-)prM28f~>61T?vJ2C%cq z>MKuUMVLf@OTy!_IMOHx@UN#)_^t)_{(81`yDFr`U)#cCyFemV9)) z449GaY-ZP4zkTObNC*Q)1LywYgQnhN#dMy0z$GhTH9j%!|PX$d`?#C#5WR1WXGmCEB6{R>Scd_=nM+t@| zQJFJ~CYCW$f%op(M+xC?R#jV$JW#s@l={r4OzOo$@0@4}jc=%(4XZpJ>{q)vc=0`|H62b_&E}9+5W}tUv|H2^OE_5nR56kd^ zr|vJSM1Z(n++_%q?yK0xjMN3=G&#qKI0bI&r4N- zEEP`x%TN0KZ_`AbG0S$b8v~7-(^&IBD>E%MKej z{&W<|2)=fEDH^Zs_y7k}2d0Bnk0#1;S zzf4Q073SBL$nBw>EuHL0EAoKJpSPt6L@4%$Xa@I#?C^Q#1b0;sp0AeDH-fHLt-%nq3oFq+Q9hA@RU$z)GGZj&C z?ko&V9#>KN>180AW(P|rP^|wmO0Q2KC%k4b*4u_%TmvaROM&{;%GC-hG^R^xyj`XJ zAErkWrl)x}{HKm9Z^ON^L%ZzaJtBa%`~O&b%djZd?tOUMiA4$`7J|}^v;k}ZK@{mm zT2gW-*$POjNJ>dJ49$?6ln?}@gaK)Wp}Tq4t=q?k+0XC8|2W%U)Nga zI?r>>niTUtA8WFT1iIi0{RfGZOTXXCpFe#mgQq|Jf$hlNY5(H3E26;-)t58_qsSTT ztg~(1+l%nFnL?KY$?@?N-21=&wGMxS6c1yOP6Ad=R|Yk?G7eo%rvSQW=?*)(i>%nw8P|l8D{8p%qp@g-`9%P$U}7My}4~1dK5Z z*ydaff8|W@f&tCqHVix2n-GGPyCS3F?rFjIMan2x1fIiiYqso{uUdk>5bv4I07Ens z{vU5%7>s@TEjChuv6tN^sDc7~(9o*XF5e21RU-&dR=q0McAfA}s}o*j;5gk!n*SP< zpVt_6)Q3emH)-%1F)^_;3n{izYWwq;VPOSx|4E(sZ8n`_JhTat6dnTFVV`c(>Se6; zJ-kpRoZvY$=O&Qc=_#c>=Gi&Bcy-GEErZup#*zE^rk?_gY!sVFg=}vw>*%_~7%+}` z4n4|vg-$M~+3d?Q?T$*iev>xsgfC9PY0Gxmnt$qXc9g4-%jSIfBe@$d-_f~j_71Sa zlLF5S(*dW|>2;woaG;RtT!jB$Q^gpefVwTHAtS3s;=8#1an-ThO;wf=J#;jpJ4%kz z(NwXKn5Kn(Ttblt!i!yp(Q{-gH#(e3RJF$>LUPK4J9k;_&+P=uZ8$|#Hxs7|`_!zi zUQwt-DY)e5y0>o@hJB93H86W!mcLLYl|ye zYh#>iVicxg6tz432b^m@j`*LIROH$4xFqA4E>}Eqzot?mWXi;jO{bGhnl4BV%^H zU)oOox!d-!y6oiz-X^7Ge^kb&3i9RWK95@A^5o@;p$GF)%1B^maG#`P|)(-6bliSm`a%p%wk%cD9T7BWX&EmPr@jS}0y;MylAGsMV({yAy7cUK}0 zV~4++q8tku9QAv#lY|E*6|U&G^zU;P?B85+kH?@%yxlhD+15-mAKhs*?!sVk4y4A; zw<4+|HN-OANhLG!kf%DHEbFajN8R#wQ+?~^#ygUt$oSRQ|8H9drSS;H#z)&DI`yY* zvz?}!+odCY@Z_eSB@|oJr3RkaN0epq<~lRX8}K_yMS!8^c!10l-$E}5!zm5A5zkD| zZ_M_O*w8@?LXqDny*b(;R-T|PoV9t(ge`>VTl$;Kw;nXiUYQaN9CsxujBeB?Fh{zV0j0;e4it2 zPN49y&2F)zQ_M3^juOA-3kq zX|otR63OzLy=E@53T(NL5=9qRw8Pz0FUy2=U4uc&e#bB+Ca>d&rfz_)NFgk;PutzxKf zvP$;v0E=<|iN#>w(tUoeSQIlnnZ?;F?A~tEK7iYKYT@WhmGESK=aSOC+AWVc{-ZT< zyvpl;Odif_ExBBn@R)JE!Hm;IX|{$F{SF??;?xzHn_}{oZrk@wnw5K^=-DCfS42)g z+;P(Wk*vX%0-S+IW5Zgiey7@7znE;5&g+d6Ecrj=$u;9PdTYrT=vTl;iYtm!3HeCFM#4{m>?3)*2p9*fB zu^*yMQDZ35UVbkA$Z-XFT*`@;E#WtV0Q_QNQ24ejRKIgAEl{F75FW-21{tFQ%sPd4 z(NOs!r+?Y%<2Q6Q31o}+-jX>T<~Cks>aSd>wF#iJV0JP!+YBLWKkO>^9eU-M1N#ES zSJE!cUj)4~xTu+n$3foN!ui)YRehtnaN~cQMI!sE<{1d`E>BJNnVFtJ= zHVC5G!}sC#Zl^G5|I}6?!5$L(i79?Z_98vJjvCYSOGWS+tv4|68##@vU2ty&l$T|;xQJt+Wpjp?>QML|euo6^Ek6F4sXE1!RJ z{0nQuBf`{D^T~H$X}7#0+cYwyX#$Uj>HfvY)wSEJIZ@k;_VHII{vGGvd*N<)j-cdL zkz0XCSZx13L>|WmeEc#~kc&xs=&UvY{zklC;ekFc1wrsDatYGMuzLi*Wo6P_HZt@F zPd|JS&{fy|9=X+y>gOa#F=1p<;7KVkO%MPKtk=y!MN~|)_5FyUoSEY=6?W`{S>!1d z+@MmsywP901dk~V#>6B~@AZkjF=NGOW{?n=+DN4!UBqTU!0tfV3(4nD26X@UA6d1S z8a!>;mOt|M#-6M<&4Ef*NV7d5ZfJ!V<@9R4Bx=(#7F6XjNf&!f5RO;8gP1qS=%pgT zH9m6P>SzNs(8G<$nn=X|dKzf!h6acMbTQalwf`G%pg?Lr;zcVxdz0Xbqza@ziZfVy zC$xSJVXI09KXF`EN95L%cG%z0ls7F1i$z});7FSdpBo6SN%<@y_hAqC@pfsY9>}z- zVdzuoUkKtXLArBogO}igf2W9=a>(M*5vE_fcR7gNkGKYHuD7^EimmpqmUWem(6Ze3 zNM9Yv3_}_mq*GnIU_{Rj2)Wv;MijXlmE3ocJT7Muz3Sh(w_mUXJZ(esFfj z0_yfZpoa>2m;!=cdClB=p$D-;%$SKQwxE2AYem9IQ&=^mJ&weCq$V7RPk2p`T1IOi z2#;jgGQlduNlLMl8ozzGZ1PE_B{BnOtiXQwIij86llm8)5_=tLhDjZ~y?cmZM=3~o zL7E2Hw_30m4=^$cz=Aii>Sbp@xe*e?z05yWz4r^iA8vtVW9B^V34(=eLhMqBGV0m0 zCZcaS@r%7>&`__Cr(}=_H-U(QkW>5*9K;8in6Yxb&lvV(W14c`!=E=>fGAgoGJ-N* zLCw0u%I=}Vg2IC+XcqSpbEBG&^e3VKqhwoC*F^9zOV1q53{uzjq&>W2WN4NRo6)UO zN2I^S{{b(uvcqxwrJm$`+;gB85B`Ji5lJgZA}n~^T=eRMQjgYP3hv=cf{fKw_ACWW zAdxQr-pP3I*>S+sWB{O617%YElUgLG8pH$CYKsX&WJ5SRL2thBg!Uczpjbo4R#a_W z9TrUOj5;-P83oNYps|I7UKGErsio-JWNPLNxj6aW#pMszkFaH-CQ?I)_NLua$B|wx zGl1VXQGO4Q5yEA_9az~ZI#_iqh2MJaZoSyeOt?Q79V`sAB|3JM;Qid71&9`#X|1g2 zPniIn(e|DAc;>*Krw2%@)7kG{xH8rp0wlq;q#`*nauNWj0|l_Y6pMP3b(BD*n|&Az z;Ls!aJ(vjF)}?8m6I5>S+Tuon`oe_Eo6SQ}nZcq8QZ6`2jmgm~N@Rp*(>qiPDPlJ( z?{0jbOx&Q};+mlYwgXc|ypQkp8HS)O6sfn{xnk!#9*XEUbe}ocAiO%*Az+o zSh%2ZAW1g$r@t{pkCNi3?vCPSjop9Ceq<+-9*%1>mC_V4_esO;_U zLN>Qseh$BOuWcQ3bT=6Fgm@O!RUEFKPKI4@KwO-R)6in6IV94nU?4-=lDuMe5gfs0 z0AgBxXm@{%+ply+0$K*=w%Io!t;|QK zsUBO*B*i;LJ7cSGlvXa%D`d3{->`yD>k1TSuvRwPF|G4hCgxD6 z-#pqGgi5N`~Z2$)prbZld1OA=Zc*s%<9vQJjWtaU&@v<$rKV*{bkiX_OmD zSLiyVj^f>0B2&C)uPWR;H{#jydI%CSYY4QpE&yVIuUlOnqNrg>4KP&{u3GCMHq|KZ z3=5tW2uwRp?ZGC)w?1%e96mffW>-j5IzcBx$)H?MESjtey@zjK|1Mpwp-0wMDUxW< zezCc`67}vrUua^7ZUJ9}8%3pJdUY&sTJ@EvZgjP}OUP9+0Y`xm&)_5*rctjzMZj&G z*MyKF>cxfXF0njGD3eu|l}I-A)z_V??a6dL!S<@xh&D3B{w!*3r<)nwHB0T-B_UAy zi8$ib32(|^er%ca_=&ColX5qTEpA0mQ49Ewn@k&h=4A^p!*!uk4BTWxS!WK|pF2*n zT9=X7jc-X+^b|)vB}S%wgTvh>7(27HE`aaI8p=A?NI!C)Zdvc6Gd!KJoQEu0a`Hnr zykZShDIAox(=%*K0yS(sP8jQMWOGY2E~BgcuKI{>lMT&VRQuF)`TL7vDQfD@wpW@J z_={Hk^Xqq>{>31-|fv7^?Dk;0c}gFgm*Kx@mM9Go7|t{Zx=RFb239kM%t z`JRX6@YJ6%jvn8{T;=Baw~pw9@omHMmB3B_kA^s1RUy0p$v41h^+}$**KllZ$_m&5FiOk1^di}5hxWjb4tyE zP0vj9%Tq=r3pKOw`X4fa$}agP@xnd(hjMFE^(k4x^{BPW3)PYcY*#Zh?)Qv0D1F2W z<`AduXaiWd1#nB1uhp>Fd@j?-7EYcKcO0M}@f_&1!E{>2D-76wV>_BiD|5%!s60?@R9-8-oPZ#E=}FUJf=cnL{Q$`iMi0yP|Bn(Zy(nZ=j}(>Y z_g>SBC;Ku&@|8KN-S#dG|0kW13!=rYH>~>!!>~5w`9y?}5{!l7Ik<;MCTD)xL;v&V ziln1(4>!3!+YsEtH8_00(LIqUT-cHZT>Q?59I?F-o9pZS>+U!-8vVL8%V_VP03Ems z-)T+K&);hyBl5i*`O^J>H6tlYf{VTMF#nH%vPLq!b%F~>fCt3=g!&*ssg?B#5<34W zniER!c~W@L^#=*BXoCf^tliH_SNA>wk$bM5o}NwLiUMujUlI)KzJn4-S(rqgj6gY~ z`Q!ydLVD*(!X)!#4$QqO)#7Ia{6`UA_&wJ(9|C|tB-#otRgzARu<2e9+;P4fRW-qm z!Fm(9V~Gbj5d?SaDN?2dsnE%POIzrb;5oc=RT9{H*Dsh{9jlh&?mKejKe>C4aA1A* zJ8oXARo4ALunJ5fZ+oyi55cd`&_95av>7O|5}ZU7?vAPRI2%DKezF)DCH1OjdzdVc z>4|A-YhU4LN-y~zkk3Oe_)>gU_Ctc_nz~<=?SH@?njy$aHug=om*8TJU}!TgYk@)k z-su+)ueBN<8w0^3%DM(CS^T$4WP48w2^Xwnaz#RcwpKT@SAH%U`x^&Vbyj&fB!W~ z&qavoKfK@A#02}9Ls$VTd*oVCjj>Bus1n1NKpW=^Xx+F=OjOqZ@p4D_kuDXZ8ZT3OoF zfitTp)zNExs9syMYu73G@@o4&t??aVU(Y<@R!n09F;g-297gdIsh@5t*PjsldTl_> zaLpyQ`&&%6yKqL~z;7k_T$ zgC06QA*R5ON)*HCSu4vwLjo*A)vBMP0anCJI^5lr5s>S-OH0LU%DwHuWT6KBw>|j#V`7D%C)8`&~)Ki^JuN%lQx1^`Gttfp(R>AMs(&JkZ^D_PJ1ag6lcDBn4YXq-^#jg7x+GnNK`Y{=U9M zce<;8Hp>0|7%N1OIrXJOe2(B~)5k}s66hWbrCJobOA(Cy3z1^j)l3z9a0D~uurgeM zYlhHY1TiedL)g8Jt(C&Zta%csoB|M3$e@&YDvzb1SE<&f7SFiejSdOQb*zyJRb zgk>QC45Rk7w0{-%T9K{RYBG$8AaPY>1isl@KB=(kt|5|_1gQpuZY1BS>^ut@36570 zDPmW{Nz}eF>G7K27Tq7iOc+d4$UnX}4vhALNo}o3@h=S66B(-4jWGl>Y6=;uOzGE0 z_Z~)b?NDu%zA>puMt_S;01b0krjJFZcD&-fo=23Z>4Af=IZgAMgEh1?m%>u?PII?H(rlJ&LKh8ePS{veM$ z#f6psXdxz9l+74V|5P@-vLHF{HXGcdkvl_iU4H0|b?XYbFGG&HSCHCMIZm}$3kc5T z3sMcR>CL_Lk<$G+WRitMXsHFZYOg9~>0p<()k`Po1$6DTr}>z>vr`scbkG;;gp1%F_MtQlLC z0KzJ+4Gx%J7DRFM(JwOu&AqzgFW=s#ovTjcj{$Ca15+b#vHaV|E+&ZWP=M; zl%R9wV_f#0pBsk58!jY>(DZ@7FIwQF@O zr4WxKVaS%L$5;i>4R8GQRl2p|TSQ{SXaR@Gn%385M_nmn+Mfan2J6_8oO9lRn75ws zifLc{19=%ce1HDrX-8M_|}I5@ydiQ_~mc-HO4Nt(QcI5=~DInwV^hv&_R>LrFg+ka@)K@{K3C4 zDONRSQx~c_U23AcfQ9lwIY`iT$RJ+2(W~kXaBw~w2MZ)qDAhweSOdGQOUx$-^ZaWD z@~Rv3PlL8*2Vg-DF&7;~X!9*>FekC|o(?0T2pGZ~t6M?2#LNaxJ9=clp`n zM+>7P={7VjE`yBW+zggs`$Fv3FasYqRrFR-)lS?y9LBCL zL7%=k$#5~yM&{BIJB90}m?e_}9Xq4r$44j8@Su@9*Mx z_2}dLfFdFjC{$;hks&cm6KKVxj~tKUPw}mdC$~Qr+5K$%$BcT@fe1GuwmnA$WS_-G z!q?v)%0nVv;-AzI?btHmx2_0UsyixCTxSM{r|Mxp4y2eNgcKve0>N(na^B;&ba~e) zf7D0PRB_j34lhRPwj~hkn3uk|0=Bgg|n2=)gtgfH?o9mRcN&jvy9 z0Io$mr@w~)OmQuQZKiHnf12RvP6!dV<$D@o16kJ^_K6G zAbgJ?o@5P&OFOM!n*D^}E7mZs83(Ei_C|roCJy&_PnC>d>(!KjK-$6j&OL&|RI#uM zZGHGeMi4XQGDNGW`ui)Cvnv;lE<;swGDuO|(}pKrZ{y`DzE411k*{BSBCixbwvD<9 zLcKnC)gub#u&DOnTk7Z}=dHzTo!UoZHrYQ6i{POdFtZ-7qxZOoN`jso*mFJr(dOLn z^7D0HR?NrMa_oZ;Pg5}(74*0Hn^y!f=Pw%j2IhJO^0?J|fj0cr?k}$PEn6qrY=I%4t_q;lXK9Yq>VMg=r{SOo3wB`zqbz|@^e-o zq7ZkS+>dZn(+-J^BQZ}Uf1muvPwpa`Kt8uYs1w<=pmGT>hHeP%nyKCYiI+7C!AkuT z0vTaH0hz7CX}wWH`X3gGxu3gXHsLebcXz+h`<-E$T?6_ncYZ$>gX?om94$}%2Guv( zg1JAqt-?~|`WAV7BProTdvjg)$C_<%_f3KKhT}*8tF)@YzK6dsF=RB-Mqt;$}o(kJ%?oI`^h^OS0dAnQ7y)Rz=gsl>rlHR1U#(9 zbZ9Z*w%9?1h(d}$e8}A6H?TFvGXr|6Vh898INPaatG4a$OR#OCCHCE^gxo@Nq^U9+23Sl8GF=_oMZtX+U1^=@=xaz40pN>{poLj#B)0eq@P z$?@!sy1ypTVae~{xT}CFi67oio%#TJ(c;!-{yM>I&NovCdZoS?QSUx5&>uv4uO_NI zMc63TJaTn{z>|4m$(ZEH4eez|c>mlM-e~oIw`w(&r0WR!g|>;Xm|?MWl{yQAGTLtO z(Ju<=ZGTOy=F60Q<6yqwp)hCYS~iwk zoD5EMruN5$$n}1l(eW1yVw9U}?_*|JU3#9%*S>kBD5ywr_2yAWimp7a)(F6hzfVb4FXcfLi7eFsDK zydTU+zuhsOavV4$@~^@Vw+scO2Ne6B11&G{WzU>&yR>)JwV)w<3SqE_QDub1v)p~P!_(A z4x@nz*JJgY!*N2($udQ!ohI&@LZb|+THL)^AT;B)p4HD$_0PFmZ2{F=|0lN0cYbs5 zv`e=d3Kx f)-|(y$s*Mssbtx<*AZ{{v5S6Z1mnNi194g@D5eVp7}m(+G92jWw(c zT{sR0He^p4&PG^?GY`yAkJoIzWzy8)C>n#|CYWvowX%H?C082}=VwYx(%SH1$UvB# zwqtfJEpar>>+B9IQzL8oNQ<#pb~Wl@oML;h#?C^pDeR`pFS)Q{_>StRtr5BannTX8 zTs+Toz~YU@TKvCQ#QC)dZT7T`4K!>eEncNrf4vF%rP&pDg{?5K^tQS6P7ZvrNE7yR z7(Agdu>;Qf8wKw&oX^}0o)eFC-ml?8*=ex=Pj`8wE^fyOQKnZ!ANRp`J@)l-=E@BA za#oAm(OcwHR_B>@L$B?GpkMW#Yp3Z_bk@#M9SgsU1wXo zhhJSkyHfXwwB{@b*;RN(?sM@2*E)(H5-0$SIf2A%QPU9kkCFy~&^s~$RgVqNZI=oN zweGsAYqff^ay^^8=`SYgn}7)$gVy#k89OGN>HV9)9}Et^XUvU7cvP!?wk5H1PxYMD z)huGfl(-U7|1SOzL+oZGf-L*pR&0F7(!{Wc19$xsVNs3=quA5Vb1$XogjH_vC8wpL zp#Ni>{B@RaF`^AjnBcQDmT>d=KTR?-x;y<3ZTTN?^y~PL*fFo{$1*vq+q^NF-|M?v z6w7;8LC7J6i+s$}mU0xz+9^e6SKiWn6pJ4~q%Uhbin~>@z`m$66MAgr7~|e1CR%rl zZw%?Z*@rB*VX01wi#xCs-=}<>2~BFYR6@15Mx4huqLMeOFiq9oM-aJS+{aC5Ir|`E zthsz((wraPVG)@Tj=a@ag|dafuwl(|X{?|)(dR*b_HBptnSq@Z9;C`&2yWUjb9JxR zad@J}K@&3vmC^!^Ve74Jpe1t`Wq;GKpV>XlLCk&r==dN-yqB&;R3-XZymMvv@;30% zpDQ?_LA&6gZD8xdF66S~_*tRg)$aSrE-~&8i8GZL$E)QZPmnYFthn(2Qw3@T-JOS8cEgx9B0=G?(G&HQs`KeNW0x4IV|WiI32Wh@%@K~tD1IOf zxz}QW)xW$EdUc*YCWxK6F1++q}p2bieo1q(us9YWDvj5lD(U6I!&!kOCeUW*X_|o5p?uShB;0~1otrmhJP$}QN65nX261Mi6XQ=_7MR+X zfd;t%j(HV!m(FH6!b ztGF0Wm)?yead5kp>g=b>FC1h7GO4oTceb`1wlA#gUMTBru_jNK)VRb*Vz1~$YqPz! zylFbcmo3KwSjj_SkU;r{GW?^MLX=3zl9K;WI6Lc%2T+dOFrYlj(DqjPp;r17F!U_< zA&-~TGB{;)@75v8C{>4P-;VofC{en8E7}Fv^CP5V#t%6!#nL=5jhYsplrV_6W^83F zDx8ktyU%CbnKoiyXXMzCvmp2NQi=+>yC~hvQaIkRDpQ&yMV42fel5ecl)>KbdFx_O zl`h%xcvq_ab!VtQg7h!zF5fyxs{;k7khsT|PZ}=_lx8d<-S>O!FJ00c%0b5=tw3x1 zZ7zQp)tO7#VLh71g0WO4Y6pV^hj+oX_=Ec0yiVZOv0mSvVQQ8%m8+2ZL=Zpf1s0FGeSC+%Q0rCJKETq7*HNQ( zo-^peWjx4;lz*8Y`F5%iL}ME5^y!Dkk-T70)xdsYhIjBZ+46x~SkG~9jjb3B)kZZF z$(^%|eDduU54yjk_XgmVz95ug%rk6)iobciu$fBTi*+$Wr3TKWuN=9{FB|5L1Q<;z z#1{B{d}75D4(s4Lj?Y>kskmdL5!C6y=i?bL){a5K866gA%GhnTtRYbNxlBMuLI239 z;3eT_gS*`@BhH5(J)pZqQ&4;!nG{3vAgx0t%5>NY3Izr#mxF8;o|Xij&d-Wb2`%d) zoeEC;p(vwgrU~$8vr!O2<3CXWe%p1-e#kf`A66`>v{5hr#QfSJpUX1O#yn%P-!qIH zvww8fUM|gmr1UB)kr#>#s6P*7lTjj9B8AvC5WJ=uA0#i;>ST zITf`#ySu~k{Mz0sK=|(0(K^5VAg$CF=UlgQK@-51A z9A#)vHMNSFUuu_;k!Ib%DdUXztK79B!b_mdZvexy%JpDnqZ^5}W@;bPdbu`YtS9Z; zp`yGT+XvFv`CJXbZ)AcmEg;bU>=XQQtcw&^mb6b<;c;qfSwu{#Zsj}S^V0(=5Wv5q zAzSMeGAfZyOIg}*X&yJrp8Mp2Dm9rll`h})z}Jl9t0e@y+Uw+4#+?2ALmA{JLCY3s z2MosD{U@yNMt<#-be2-uBxWj*l^tGGDBtJ^dtM3C2&=3<@1+nY47b^+u~td`PX8K@ zazcMQo422vm&97QacQQzK9|HemArLYQt#`Q4?HaPr}8y|X1Zfl^b4M^QgM|`P;fG$ zI&&y{7e(uoQDQl!!_?f;_(D0~in0lh*Ra~=(nw(teeq{>ME{rJ$0VyN0~?)I8xS4} zOq(UrIocGAwcCtLbMEA2I+-lIJh1(um3*63mZ<&aXUnP<;vd?w)0^+J@d()T{nnCJYp52u0D26pzeJ=?I)jEX)53Pe5urDs zThR43)$si(x-a)1M|3asW)frg>Jh7j>jAj)SWMe>M&Y%;Pa9FjZ*L+*Y0Cxqmg7sJ z3cC|=Cj6oWwkN$az9cIwRUKf`Aey_0`5Z5ixienrbbP>8q+shL-X zEFF-fF8`q&5eI*WgRyIU$(nEIZa?~pgWV@$ zMuu#*n36{-b!b^@R1D=CjmL%R~ay86s57I`C+qVgvs1NXZ z8;Dr#e8`bsq4R12$^w};!h7Jl8!1OZx$7GUK(80RW(cI1wGG7Sy%HJKYkjT98lhwN zgOk?Y8Dm)J9j3OHRtZaD3lUX<^&vCa*j)LT@v(Jc6s7!0M4E=83fkgC^*`qy1^0c4 zOo}!~zV!*J5Gp2dy2nmcxe4t|=eHf#4{Hl5v<_sH^t1c(P12J`zWLh0H%(S^kxY=~ zQNOZ_>@lj!?ahs-_SD{UGmmox%BY@SjHgem6lmQ9G+G{clx$Fo>5sV+`87qc9=N>u zrVBc`8pbvmg2FNdRYtkbY`RDVPth_Oy>@~IZdgbu&-*nm;bobZ8xR?eeQF>D=gSPv zQ&b7w7oWUSGB^DmW}H#))0&g@!5%+Pk9p}|9#Q1{&uF{uDav@7Qxj|Kj&Xib;zUzO*9aP^;)vXK z#hxgGtKErlPn5cebzFuHAS{&pMmCAg*bf4@9V!EEGIs*F>F}T5mor_QBz*%|9C{kr zRjdJg(sN%t;2U|Hn!CYBNYJ)NWBaX!G;bR5b5u|^3kJ0g{Z^J=J}6!fDS#$T35y1Q zfmn-|BSP9>DhZ@ z-F<3nUa3^q1YJWGT2MLsP|$;)k&oF_en|>H$1CmIG#x~3+sDS?9Z8+8l8ING0hG(? zn>^PBVmIWf1*kEK!Z^@mZ!KJz#9;ZU@|uq}6Q9c?_Hw=m)l`KA-=g(Y7yReM`StN9 zJl9->ih`T^^|FsV@ft#sPNELADc^hR>8*(8*! zH?0r(neI|VzDf`EJo^tG&H83Pm1&`tq{TRu1r;^_yh?!bnfNT+#^>6>8^^`U=542g&sz%g|qXO zZ^nyep0TnCQI-bA;?@diTOVbwQZR0sm(-e1K8kpblLu%dxHv!OyM12}V?A18zZh;h zh)tSU_l0JIik7_#fOa;In!W5XQ1AaGS?t}vJ`8L57}f2n+MX=|U%x?4lQJ#7-Ppgk z7AgnH%jVn$qX8kQW3O61Y^5JE$HuyxV63|ZO058?gx*k(mf+4$Vg>W2x;^RAvEy>7 zXZc)?gqu5?WSTl<&|I0cQ?u=^-!0?_k3@t|nhz0N^?lftz3wW}2VJ29b8ha}EH-(L zkxZ1K;pN>3dY6v6N0Lk(3sdU>@0KHV)N(~4zD|iAi#irz7Hy`lg7FpgZKsQJw6t8_ zfJv|R{6q8BLT2fTaw0=IVn(#3a`GRlOvN9^b5R$@sdTolbEC>~qY~7429mJN*$YH} z1B9zu+VQj&iH1W5O%HD|WiQsnwkOKW>Y+_qHcQ5#wZ-4xSzOj7d30(|c0Jo3SZ}uN z0}OE*K`8P|ne`B~nemv9%5ir>$>avZ8<%|b(mZIx=XtXDck<)J1mbi+7MV+ol!?X>OS%nbVN|Xfw5w2E zXiL9k{nsKWx@-_ji4&R3-yj-|$l&ZcCi_d2d@|!jMzqOj;njhVp3fHHGcm*$H<2c{ z8G(n#9Pegbq>EKCDR|`Nr(|`qcWQDbMi+0S8@Ls#ymUZp`%F%NE?IhFhXp8k)7$Z| zH$O*pF8$EdA{tU?#aO6!man-F(A0POs$C`ZN0Emrf;`kWURR{{)PSN-x^69QOr~FT zxs%hO|CpSKWp@h)W?AJ1*d`RqVN+ z@7OmhOQ-50KsvN(`F!DsQNO9*u+{i^?9kR}m$kc;wFgcMd=J~6koB#@5EZaMhp(vi z#pq%tkeb*a`0+xUKb>{pCX4g@30r^;ixEHvH)MS>QEZ1)Uhy)uI3l%V{d0d`gTosm zZ^d88`VR=x_2LOt7=#DGg$AuxY@r{CUPAk#7eCWFLooF6ndNs;sS#`3g5JJi_WZkj z_@)ns4q!017{9H^ccwB}e*J>ifT&p>6XJL>z3=)af?($8eU{KbR(ec{JjzP<9SC*2 znK4P`+!56s$C?AA`Rbh}A4fGv5p&P!_iO$KPZksLjr;87%$b;K?$m0bxTDmvQ!0;H z*NKAmZMlIxeTT?Z--I%|2!z<@XkHpv!%oh(Lyy9mCX2^w2EoB)OYxyxZbZ$YJb$@@ z&*ljnTe#o&MX2L^$Bva^QXkk|um!IQvgSDcrIH!z%;%64_+yRL7sHx3(|58sIfxG+ zMY6L{`SO)JsP((biTuQN(8_WKDu70XMiJ&G&3cj;{1LUM`ywamvBHwOs6tAv<&`-A za*ydhM<7eR!XA;G;}jg{ zXb=>!C&Y_>Y)yU7L=@K66u%0Bx;X6fJMbO~r+1XL;r+3M{g_f0_EE>;<}dg*fFhFJ ztbCBj?9<5t{x{`q>!}*sMwW-nVn-*s@7tOmlVngpd9>pv$Fh?CE>bE&s!bm7<}MZ9 z7rq35xia5}jLK7u2v}yGm9Ps?e((u@@s5fpGuF(|8$5T2dIl}}kbLvQ75=2*GT4cQ zINl8xo;(8M#Hxu@WEI`c{=$8K4%ZiBSH!moAdU?4{*5BcdWz-Vp9qgJU{`kc4kFz<`JSi9RfM)B>^Z2D(6U&#)ubE1mg=0fCZ z30;nqnrntm9!j+LY!ED@3>VUHEPO(}&{K?~J^7=GEnSMj2>C^RBR=d|k014f6sVuR zRDMn%6<+#NgpSKvdm6#O5$~^Txrl@9^->W6Co+RNkNpiDPi;!apszjO^D7Svg5Tcvadm1F8qsYI(x*`5C|I{bw5}dqK(6VE`UaJKQE0IxRf>#1T7#ro)pShSTcF z;Yt-l`vh-Z8|dDK2opOEVLO*_Lc2fSswrW$YQa;+@ydl~$-994MDjy_EcW)Y<#aP^ z#B-*7dc|zArxz*3ouD}otJA$@5ggf$tWDoqf~)}lTjj%M@Na2F`$1x~zkGmI5=?sn1=B#WYLfWU# zbeIDYkz&E?;`aJ_XGbLx2=Qs~3u2Tvq3@b>2J^xqPJYO_6lEGCJvMnyyKLfV2Bqhs z?hltRC<1ME7L)~+#Rt4W8LC(Afbz*bqz zF>NZ=gZK&PUHyQv+gegWkVUpYxr?c0S+&xG#<`n?4>y@IZ)#c-sYHP+b_h52jGBn= z7gVyARp1l(`mLldM-o@9p2g^s+o}L4Ts$J~ORi=mi=kh}#}EHW%`n;1$yeJzj!jN% zPtEVha)dWP-!D~Y;jKS!sa1G>^*PBxBnKPo7H4yWr*C6K(oD{EFUqpv#(9qIXc-n0 zZ;7?54}{Aps~3fr+D$60r^qilB>$~0+SqoQwXU}I-7?~K;w*c=D#vd&AJV=NUQ_6^ zZ3|hD#+d1C=b=oeY2&hBWYvLSS(Q!jO^4W*f9~WT>ap3uue@R9n7ecXjxY5K$s(eA zomR0`vTDnC`Mz}qQwZdmiorgB!#BrSl+V)^g0MoQ*y?XoTnt5`Yjkvr97d%^M_G*C zcLp+HBog}TRn?Bg1;nh!=#p_s;78)5FL@LMEG=F%uh>^skbpM}NUog$FV4=AOd1M< zB21e&(deM3?1MDo$OzSVxtuFv|7;~9R{I7fa0goFRb;QG^b4={JwHLEw_P%A)A1#h zW^B~EGm{|@uy*Ul*%Qo#mxLu7t5E$5uzwII4tF`W&VTS5UZ@ialeSGiMpJXHIaR!L z3!*?~)r9=`PmgETdtYtpj%7Bi3~#G>a&BR|N}Ed;BW9P(;?-(0-EFbH;=)%xky9HR zsUznCLSwwyl85C8bJG{S_Be-Syq3aI6k=aPSKUFo2A0LDXCpAcKPv_jG=AcWl* z)YK|BJ(S%07rrxKkcsF7ow~q6EX{TjQW%_wTnr!o`XO#~9wMV?1V(x1{!NSnLZ^re zCAfqSltL$z=_ITV6=sk$@GN;Wb~#|QH(`>c7E>cn)i~0Pnz?EfzcQwvZm&CL-@a4o zsDKy5#Rc?1nPF5p`NP)Mub}#cpewXhj#rTA@|L!(E&?SbzQ2;+MfKsVxZV0FOHLE} z44A{{W$$b`h*lZB>3mYlr#G1};bl&JnrvHyrCe1oWeh2E(`Vq-gz6yYp7Dh}tAy`nilw9oVt&gTmTLp`&m;(0UrC2fQ4|$K4UW#$8;1vUYtl$_C z+o=67%a*J6k_;|==k9qLFp}?qs?DYJw8o2K^&S?qcQR#YET<@Rls@WS#8t-ue+PSf z6ROry>Zt3{(vg#sBwX@{f1xSl$W}<4*gk#MK`D33IHTygVRYw{ZX~R-4Ezk)Nnjtd z!}fBQOyqj7uvRbqVKv{_@uU3+Eg=xAoRQ(xIbGBRZdBE|JvN_q5HGj|DKVvq<5Uq_ zYS5b4i1MQ~gA`X5UcxZKu47|Kpb~5jXbW1ua!|<+WB6R ziYT5}y5O%)i@rwn750J}G8N7~P3kBqDJjnIgw_wr<$f+!ClhJw{%2KM}u#dHa2-nW!NW8ik zcqndOkDKm%9>0uQ{4mg$vz!6673oZ92^>4D%UsZBDcxfJOx|kYQ44RA@OV~_W67`Q zUUfN|rgV96?M7w-&6gTpvQ~5(gT{KpNT7dmyB1e;s;ow)sn-l9Rv{-w3?EYW{qxYU z6C?`JT@aQRcf~LgbU3=?RRNhUv2JM^$$zK@(fs@ThB1perbzDdzZ2R&T;2C$oNN@W zmQVd=-B*-VKnLaz$9@HHh`GKw!|cao3GTgSl@x-mfFpm6u|trmZ@Gr1;A&#n z2QazgH{sWUkW@)msT-%~^VyveEWxc~C2d zGO77@#>XtX5e+jj#fcLqtAldQAjKJ#YsmOZsXlphVxCsipS9J(RoJFI?WLuUCA45G zgr1nC@j8W%rEk@|N6Rh!@&drZmg(69)@8H(%Ne#EvMD|*7d!oRsZ0<4(3RY!2kzDx z`I{ep4>z)jSTRHg*ddWQl~AHoXxsFa;>cZuJz^R7u$y(7{F_m1Zay9s*X$^!qAQ6V z?uMV^YBfvcz&$3GM+zU8>dYIhsLb`}U*o@QfldZiL|=@}MQvGvsa7FFW(j+84j6vL z8-j?4y7AN#_G~uTzC;eVb~;P>l(8^*p%sL6^pJ!x&`}=y0Q01Z-hsafNlluRm%Kc2} zTY;F1%ANd>PH@jzS6R!<2P@rMVZAP#^DcJ(@VVXGRjnl18b9hi9~?KZ_WT z&GxHPXl<}a)K^c#$Uapr00s)0{-TEVH24y(Q6|~c2c(F0gVj7p4~_mjMFwbot#%}R z20~X@_~Ajba1H|_&YYS(7(_a6sM}U;c!q*k%gB8bfLNXo8~-4! zn`#4T{cWDWJX<~O3c}PM3Lni$oE+LjB&5PkJJnr(=7Eb$XXR@um1rq+Dm>4H}N>A@m|*6}ReVHIbzTeJH_%pyCj+(60zc0(Oo zb58Q$zlzwS_!@ycLHU(akY&vsYNgkgHG~Jv)0`#kue|JDCUMwa7sxs%Q(zxMY_4^l ziVB~S!BnXD`tJ|Qp7Ff`^S$k<8HdQ>gpu+?==Tg{QjFCik+1gGY@_ivRyG!ILV@^# zy!P9-Zi=Y$cb%2i2OZT%JbEL9gk8WB)gw?b_W@!hb62sPY)JMb+0Yy_^3Rv655a=Q ztLhQsN7>RH3#Vgd@|C_ux*K|p_%SCM$tm7kA|bM6mDhE3U;zXkG=3puDW^$kyf>Jt zhlgLE_ogMLk(4^!;pt!1<&QyoOKD>i+2_&KOLObrby~CBU?4O&I(BtVENe5#IF{9B zqeljHJauJ1cN;ZtY#bZ#?r0H;zakUK*<4||SiQNCClx7Bl-}~ye5ZT2Q7EX};#1or zMz6$PfmU|RjsClhuhoQq{I;@A`)^UUr0OP8$%{f{3vutr*UO=tiC)`~b!p;T01unn zhj0GAaLMaJP~I5{4y2K%9`W|SJFF54!*agL>#81Okdz}Mo1i20rXuIF%l{vH?;X`t z*1wOAy#n=j{r=%vcyi7@d!OAt<$0csDEFv2dfPuYenk#w>C}~s zcMC?tDR%nr99I|i2^k%jrn11II-#aFecRT;#eGk_VwAX*CV@XI@183VyH7DkSHJu& zauE@u@tt3IGx#SbCE{=9#y^}CTINO+G6@Rp5az~BguE@d$=nF2g?|4?seAo(O$&y% z0Eh(_#Q-ZM+X4t38~E$1E0Y-#FuK)&U&0WQ`1L52Ry0HiWln7 zx@V8CG2}d*I^dpQQ3NNg1`%4PoD(_<%QldMMM6N^B|_98wGGA6;?39MF!7*zW}!W2 zEcSi43CQVs)~u2FvUPKLeZMi?%{8CpUi}Ss6G&Qh42k;}5zXaVO~^0Tk7OdUp>HC1 z0*U%azB%i!d@~~Svbtzy>z#DjoQ&|-b(Z@yY{iB8M*^r`6P>Ni&W8N1NnKeZklUS_ zL<@`tm>oyRHc0}!LLgge^lCV;y@kyxWOd`>PK4?WT$?YVhMA5V)b3Jdmx*!d8=ogo zc-}|cH?Lf#@TQ%*bw@4r)RP!r=R-$^v`=2L6MlYDbEjyntlfhzH?KSl)7eL8`eae^ zEaJ-W*}W%^xFrzhmwJibi698$p6J=!?VdyJUR$GjH0O2N<}4ZvQfKtm=6bCKiQ!+v z2$K6<&lVNY9d8iSiCm4gyx~4b$VZJW@P?8jdFTza2yY@#RwMU@u;^pliuZrnvUU6J zLnk)>FhA@stlB6jUuXT}(w~1+ecj=)m7_dY@UI*HysF5(b#Ghry@w)yKfig|bbLEw zT6%Wll*msdZ%@-vyy51yHju#Z=d1oIArDG;zuGJF^R2ssHBL-Fx^5>#HtG;jqp9Hb zOFYj+mizwL~d<) zG$#6>mzAcG;?R=*xN^at%Yai(>3G%9&eUG_e>w$DNqu_%?ZP$3qWIH4cb88vd}p!o zea~t7r0Vt##x&&#>nWNlC_cmAe|t}urESm8H=B~ScjTB1=Ax%X`~SG{kmlp<4pxIk zTI6ffb^u|Il(|e1JN-eLwx|U`1@jm3*H6(@@WKuK!#}_8{x3eapw6+FqU%35@6c^U z#TzAC?#0qPy=AL2bc^aXnmeP8`P{kTcI(!yJ4^kv-TI3UH#9u`agfQz;# zO)a2wuH*tU+H%yZSlS4S{w}mrQ6FhcYWfrpP4SF-+n&&l=-uL6FdBnPvuLJ@;x>5I z{%5_XXr4Y){Hx*({bMv8TlH!8HM%x2F)^*Y8K(%EZ?s#S4~kByu>JWf->=ez*)n#7 z-$Q`idRNy`nir^L-A8}c>Roh-`?;VtWafK%+J({#;S&d8ZlPAsGtzt{k)6nlJJGwH zrrbj>=zojKJ}(;ZbFtgGwP2i|U28X{=`O_$X!;5zY&Xr@OfPSp=**eX4R=>_zI*iK z&!cI}RxXC$qS#roj?lDI(Qa#VRCAVc^{+G^yp2=D0Wu;^8-^bGOMPBHzIyQW&yZH< zm{_t2hDthar7oIKua`mS+qT6GhzpuF6)PiCvt;>i0I4r6r|Y%JQ+MzByE&%Pba7s* zV>OWT@9ud7*?pEh!S+CLs{;bQ0l?KI`W=^L+HkjU4RK@_eru12__job_qD)1@4 z&H?jYI%DNPF0%kBQcgx=_EV!6-0Aa3rrB=s{iWl!5!@k*xi*K7+nv!FR-xMAc^u>k z!&g?QxS@I*YJ|Gk6)j?Tmy?j|;oJx#Y~2yqi=K9Kqn}({H*a`46sk~xD7a2ApMCmw zg@5`aKBxEeX;6$>=XbecSKP;Sy-p4e=JbHyy=KRyU2*Guj9Gt)V-{IEOaJ;SG{BvGfcW&xGl`Ysm*zA)rIRMFb8mQO_}E%ZubE34vy3X?=btWv_ljGpV+ z(Qwslsf4CQm17NLm&3EePk886?Fb~7!{ujthgF`u@Kz(VehM8OPyTOJtg_e>oP4P` zVrHh_-0jWW`vIB>@E=V&A?tJN>bYjzdBqw2Wo%0yX`fFO>kbIKw_4Ma(BEOCQoXpjYZ-Yt4YUo|k4vc)BDi zWW=m9)`e{pY)i>i@Kr9Zj^2Kw_0y3Kvo*fRd#>eaW_+V6_xug{dOR7}KMJcasyBqY z*vK%swvPXv?cGWp;$BluxaX)!d>Ci!9@7-wwe$i@ekAO10|P9O{5}ed5fW&E+U}>U z5@%D4x&4MzE=s;cWeiSiXgM@O?-GEd?7-ysE7_3Go9UH-WV+SfHt9uQ-M^P0ty8ao zKy&ruKo2bUSo&hnQI)*_FcHr{caYa+Yl|GJgJg9O?zMA|Rk|4@W9FtVAt(OS23qei zg&epb50d95UaW z#Z~ibgu}HNHKBV)-4lmgp5%|PJ4h#7yqMe&PAF&d;4L!5prR*aUC&x-oQuGwuCf%_ zb;qR8ByQWh>j(*~~Sp zR+NzSQ5ySX%hqIMZHUj3pj{ho!5S0o=zsU`54Jf{Oz$9Tc3S2XFU{h`tJX;K|3fD} z1jCjtHeGmyrVji6T8Q^wyb=Cmh?K6VzF(_&x2q z=m2$o-`#tbrZQ?pu>aqqRF?Dnv?Nwt+XFk^b?06^n(tb78Fswn=0kgFN(k15RXD$* zgSHCW-Jl4{6H#RS`lm76S2uUZwPE%)Hr7itAMbuu9eh3IOV&02+zvN9j=e9I<}g7& zOEYJy^1;ABtD<|+KNY_F5HDle=`BCMZ}*|wU`dv+I2+K~Upu!qJhH;i+CAH5^Ms~? zX-H%Ki(%35Xe>H9I$%pNoDax-%Vcsl&0Eycs$SOj3A!u&=mpdKt=65{f)y+8?U`WT zvA5?9G=z|!ySvB9Z3ts75TIhu*CW&=yHmO#3fMEW^AguxNCz+@*y2D)7o-(Knkxum znq|eLK>k3WVU~1(`gtJW0J6JaaSeiiaOrZM!dl+P?YY67Zomj*D(ZJKa6bq?7MU%M zw@=No?t*Ho$e6DpOT#XT+%zT>hxwOH^2`e6Lz;Wl(vRITGPQ~@nqa^R>3yTzM2IBU zAZKVvcvkE|cxgeM6-xzEH3wwAJ|ls|zKwfd)!iK+qSZk{C}FcNb;@5l)gTC?pk>*a zviY9*WU2Kx`0`g$fFlZ0Idi+v`L544Kvn1H*R0L8k#;eG%K3FyO{aI^x=~*Bs>Ygz za3+B51QIr_fe+Kce(tAniF6hA&~H)A&zY-#Tow`CN@RDp!2mmm(Yds@KeAswHLt4C zhsg3eQ(L`*=*zpz0f#8m0Gd&EpxxCEIWFdiA1n4UhPpObDFp=IKtM-$4UFoZQ1DUV zSEH^~Qr&0aWW3z{Y?jN!P$6-eF@}stceT+DF47MpLbqe9#v}@IU6Ew@YL?f4c~d41 zBH{6y1mW`Ek>e5cEm6Yxyhg?*hU2nvq_Z78a}2yDUfzeBJ#viS$_BQ=X!tTWag?5B zk*TUiJPHry-t&J~zz0JYhpA<$0h*oo^!uIx)Yi)NDf=KExiJ+Z)tdD(wCq$q31YO^ zS)ghZEyEFS-6fq1Jn|61i+%ygc=Jw&BvbDuQ6l3+N7h7)<%NN*;rD9uRb58ot&?ai z?5jTYCEO;X6)gW;{t#6KJw8bSj8I&0qv^SwG7t9?JI4qdo{) zk_{d7cD@wi-)6}nlH*avYym46rtjIM)B30hy_WGPHp}a1>l<$5hNm^4*E;Yem-P~N zs)$kfLkdufrwCHou!X@`1ao7;ei&HTCqS-&b=4Ca9`xd z%tO{gQ~e!rqH?p`UF~l|MD+e_i*%x-- zGHQ(A`TosML4edW%v(3;G5=nPaSNo%8qLz2C$%6H zLB<6EN7FdVGbk^?ygxU@YYH${XGj$v$V`%SRv6!J3_zD9JX6Svv%b2n% z-wCHOYIy+1lfPnPF^74!>~(-wKt&H?T_E{^PA%CqD&UEP;7E|dj{N20b?dE~8tIlT-s6+=4;-++L;Em+;ed4Iw(@*Kz z9xU`K9_JXk;E4Yw52RhyR_gx1%0hJi>$HN>ug(Iu(-Ts zNcd19KrsTf_!xpx>0^TgmK_7dD9VMNckD~AaWzF^>#rPVHb(3>(#)3-WdsuZv!C$W)$V?U70k%%8K@<56)o=-7OT(7MXUzVXek#UKLLULBo+z&$gomH{1M zmLMVQ;lx-Axx3H`r7>OWqt%{8LpEIq*3a`CV@)4q&x-sTEs5PV^9A1Po!){@z~D|` z-&{V=BCcl6oCH3s z@Y5+F-aa3OrKV3>;-`=)%RTpCJX*CI&uXN%y zE0|LFUxfq0{$4pvyLVT!yu{d#VT0b@$q@@_Y}_yN9ogfS2dQh`2TNSs2^3gcvN*L@ zfQh|T8GvT>H8@=$o z%77vw0sM~-Ih`ev=b)_=smnU2JPya)?;e-=g!W{rI$^L_&IyyM|ME-SMSLyB^-vEC@Gl6hU(-2!@ZGMSZCzT|; zk%U;6GLa#wImAIQ^E8lyQnT_tFgth;;ht{XI5mCFxY;L)bppr1_q{&xyGo;k(3;nm zN6dxIr-T!)b5K6vRK1B6O`Sr;pMTF*S_14Erx3mZ()mS&M?5v{5Qt9TgM;$Ls0{1k z>4C2w57OCci03dBbETUNCVlgOGyU=$6UT}vPJQ9!9_Wd0uIm#fgXGtr`c&6m$Nf3H z<))B9cwPys$r_{)HLe47y+PWj2}I zR#swVHBijHE5P$w?kDKvaOmWibL1za7xOCfm)3QQrqWQ@pwv5q5vtO-lB45kPZPz0 zzoag_e_5QOU#V^6YB+AkDtnz-%e7RLH8-MV>4kgqi?kXiE!6B$N~OVgH}^Y#2~tcB z+AlZ0#PQ*;X9HH$$ycO(k4EzJm!C%8QpeVVZ$8Z$Qo%<-LqNv=6|3?-*|d90_@Vk& zeyFjgppx9V+-$pz6!oAa14ixS4|;Z(kvohhlaH2lFYUNox=ehNvt#r3Lw*`lsoxEpnyB20SH%CD1cBh1_z$mwA-131WODK5F@ecq$8 zgWY6SiphpIkVB7PZaEexJ(t`_s*xjv8^q1B*7QGO5<%8NX3U5Kp{6{3aH+7UfNot> zSV)J>GF1772b?xA@io0TZc&9N{#x~E(k?4Z<%AR+YVWspmmzFR;_9dLp3DHVS=oVE zoY{l@lDE;B2d)VZt%IRZaeXpdsM8+Ryo%fENqA%*ms<{;(jp$^gld!FtHahS@>3s) z?OWGHu)>nYj(2uNbSw6sF5^IgGlS{F3+y$PL*0~6GG*sLWAldJnM&r}iB>I7MIQ6? z?=o<0wSA(R9WgKA>nS-s&7T-*seb7xfBRxHg{^o<#Tn;&qx++KgkCbML(Qy3K6Dax7RnuN zJr|ZqsD7e4_)z64{7->U9i}xn%&01~9^NQ=I=!NvkID5gOHX%_H_1LmpD~0q**bSR z5;43<)bEK@t?HXEncI?dnUy-R?htEiy&fUd5}GtWDo-Jh(9{KVZ}?DCAL6)Wy|r*B zZQVs;|Ja^qn*3N#=n7tkMTsmGv;y{k{gLRlvM6mqHD!&Wz9cDQ_;Ix6E@OEn{t6W= zl}?T2U^2<8Q6mcXyXT_XNK~SJT<-DadYQn_^uNZ1d4ai5K(}hOGH&i+{L;8tPH2{W zt!F}c528pB1gC0MI_6C0SNMyr3Sq4(nDBg|qeQ({N5Mc6`R%=7#ki;Ib;|N@>}EU2 zABHAZu|bXk`AQY|mixF-Vkkp{(%78LyHzl0bY?&J$>+;SH)BKdRsc;m-;sZVZ2Zbb znlUXC{|(0>R;@SO-WfCQa{O-7Hu#QhYrn^t)u(!M3OWRw#&5vdAGgY#u8SQ{G&HLx zQ(vR@_)JHtCS0^gu6tTDImk=;8ky+bU}l!+ofTxj2{(=*BbsVTcpE-zXTkh|wFtg3a37kep?Ptu*;woBAyImt*+V ztKQ|!+i}0&W;A5hvwkwotx!JLU#6wZ-s))Xp|IxgGHX>vPAwH|K}x4z-8 zj7ox)U8-3#XW$@8NHwwNHCDKzQ#hw}DaPwn0^5e~xw7Y7pq-RgY^D<*(it!FbR>=3 z$01GZFbtK*Bgd_Aj&{Y2WsMZZIG7Bx8aT*x^hG*Mg&Gds$xe^y$2PCSw|u|Uvs{#b z{NB6le&>ck*-&ZNiZIvF_Qe-Y%0VU(=N2>PuC0U;zb^PEXEY1zP`P}UC!CpxZ%b~@ zsw%TSSQsM}eV|554+o;g29-s15}J;YpYY>&7Nuj~&7R_HJdM^A7-P04lr2Gkc_arF z?f8{q-_Y&Vs75N2`t{tjARGR*P!YpbspnD?uksqgcOI(%FG4mlXly}_lc2t=U}R_|1$K6$ z9aNXMMF6SCjVd*f*C(R%SXNA^6W#^WuJPQ;vr;(GS??D*Yx4@!`3^Fi^cXs(Q5P&9 zxYg+nhGU^P-=%-l&wB;$trAqgp172s-Y(Rc``gV^LPJJ!2CKrFABS$XM@?iMY{)upKkK3i^sE=8EMtQ_*IE&X3N>2C4V0M z>a#+h?_Au%KAWP;iMunZlPHFp^?#lL6I^Gw{(Cex`c}xFyJ_5eNEn2Xk%R#bNf^j+ zp>G{or5-1|iQ0ObS|AikAhJ5B(NpdVG3yT**CuW(q>swID=zUvgszAw#jh5g*|x}0 zCiNFUhyXL;)nFtx5)CYt@6W6Qip#zs`e+j6b{G2c2!@cAvBMkmajgLR4GuSr&tH{Oc;#HmnI|oxr#n0256$<4qZ2NA2cOY_ zxZ-(Z12%NhIhokbgsY+Ak>=UriyNoZhE*DZn~ALRr#OQR11hnqi7bt6zH(&|sA%fF zu^Yp;H8Ks9QfpvWetJOi5SVR4-uXmTTpFzT&Vo&SDaW`+g8k;skxi^2j!PPld85I z6krGYbE(W8<7QV$C8#}O&))75JsO1-;_02>QtKO6l7d&Lm<$pxAd{}po_I-gP^9Wq| z#nl+YD{ddO;0o}Q%H;$D%dU?uH7Om~ zH!oj@_8>9HCi&}9VS&t(6PylZvkb)df|l0u+}Emi?Huw*ns%E)QRnZ_m&UzTST`^g zhit4u{&uAQj0p-jZ^6$QPs{Oo{oT1fH&5P8m+jAR0W;cQ)9Rj;A7W|w%Dd00Ng$+e z!kBU<yRhgiXKuXmpBMaK| z36(Fjl0Y5IKK_sI_S7YNxkLubWjh%ES*oeT3z(MS@zAZL;6<6X1pf7R!J9sM%eP_< z$2%H_(1O#LVjx#A=Wcw$$&9}+%dP3xRX(~eQ^`k8=p;2&*fXQNp*YUj@GVMz@$3Lb zVFsi#^UEhM>@0-PAFieme`qEu_kP%o;ekQw`XKXI>*Ry)pKomWvj3(A{u}$=#2M^^R;3h+*De}21wkP5QZ z1%}z%$vluaT_S(%xZCIF5}{O4tV4nG8b7YO|3PQ`TQ$pPI4|}F{f=>|yb`xaETeAn zFUPZ{pNwL-m(2FIw^Mg9;!^I3BsWUg20@2ge$d*XmFWwfJ@_fq>2T%)9O#eBShB`Gr9 z$YZvK{ITL4;>yU35cSF*48#@>1vm#+ch|KSK6a-<++a|k0*?GDq&6t^A!?3OW4TR0 zpSj+D%^GDEn%4p>&rW7U)g+L272oUqo#>sfJcGrTGC~B?)*ZF80z53|U}1|>9XfWH zgR|I7oQc;8ncVH^XHOtU;?}7Uglu(QscAw1gkLtnX(;4eVc>VXAy#F=xX0?&_YbDv z2G2IAM5udL6=jX!pGKHR~cvagoo52mS+Q z5_}z!Xs`Mtf23GNrnX|1CK1=|fUi_91vXDpVtz@O6hl!T=}9%@$Ar-@*^G54C<_r1gq$U|0YWc|x|H?KbD zvN9@>!`mZ9BA@uptwAfHHMas;Ae7E*q_H6JsK8?J6*GhH%g=idB>iksdg=?kafH<(4p^W{aYqd7+BtPy2Tr_eSJfht>l-cQDf-HBUkvRuKFfc; zzpW?yWeufxcmc6M5(ce5!$x34e1(J+*@iGI->^X(+fZNjpuZLy-gEWJ`2sqrnae$$ z6&<4PU{g#TMN_PW(7_j$Jp_f`Z#a8XoY{f|$(lWE{4ay6S?bA4z@DviJh(8oX=ji> z?l_oZNO&U!>?65a}>h z3-L}pR`k}>9t{XVy?KvwaLqvh=(~!|v?(k+KX?SgH*?3} z&UEUcgi(~!o|#V!w4cHB*!CEz>#{g+ukzo9&X%nbTQMEurI3$^kuK+{Ar~ruI4jcw zrldw|8Q4|~9u3dskAIs7I{kP`!jJ|lF7G*YHHTUYtmQZVB5YDy(&@CSt^g=F{q?&=rTtl>W*R3D6S&)PAexMP+!Elvmjg5}Y9QIEwNR4cnltKa z&Zr6@dyb;%r*ermU-9hCMEp_=Fxn{kw(f4jZ+FRm^XcgRw!U|?z0W$wlzy8dem*;a z+;3el`!4Xjf#H>PkVz7_D!2H_)j@JPfZbB3av@cCs&utx#CT=yt2$Gf(c4mcN(?Pf znt@kj`P?3c;(4ckAeU8UJ0QYAkz&6T9N8w z^;uKI_1_T$Mk#_hGr-tDo;0gbl*p0?2E;SLLS{<~VtE#VA1T~O;$@{|;Vz6Gke&RX zKLg-_$__6fi+%`ayGs#0lZWJq7^^W}Z4+1W)2uc5L9&oDpIP~hqZAdKyW$Lhakj}u zQZT?Ex9Q)u20om%5x1NNNm!pz<((yBw<767d}4=#)bvv$=gP?h^j9&irON4nZqJ0) zgd>;eRum3dt`TpRn=B+T7X)*eaG^;FUtwr_PRI{@VWm7azHD%Nx~9Bb%lf6r)Zu}Q zT_~D-Rh2k`vC^{d)%km7`2;Zd=cOlqWA%P#gOMEPVxRTjk%a{tO$Z4E7HlvrRLj#T zf4K|RzxBG@sC3I%-Z1Hw(iVk{OZ`c_$0=8EmAs$P4nguE97n1L5ufJyZvv+%F+ysk z4=KNu^j-O9Awz%$EPIP1C}$_dPtt-;NZbE>fVBE^UK@E}1>h*cRQdc}|M>7wqR2Bv zf(V=Co6tPMLyA;^Z4k|z!UB5kKQXji47|)~MAuL&@FVo_`m}g$0R})M-E7r(`(qX& zU~HdMI`Qks5|v7cm!NSxs^$RgW<0RY&hI zw_mVXn1F&02AOZ}D`Y=^n*GM~9%3Wr72Kj}L!FwbAyR(xtD#4=6ohnZs>L;j<%K-KG;o6e*HwIfsd+7XGYWyn|;%TZxaIK z_7saL_2gCD916mPkPPDLKrc)x{(O>9#${zjvl;ZuW^agcUa3@RIG?PrU^PBq+E&v(M!` z?}o0~*Fa7&!=ObZ?WwuSJM~)4fpl)82Fyd{aPBXMvg!?02=thgFWl;!xKG3NhKUbV z!d(ydqE|H7?KpKfaoBL4cuy|$$Qv%A;cSUmuL6M;%^3s1EK;ChMlDktl4TDzc=p}P zKI+lf`0274Fu9MUCwi^c$tRLmdl)cJLx}yAR_+7IO;?6vcZw!wFuI-1 z2>d8>4wuH<>bup4z155SQ|mWW);KWYPx;9e0n|ftrxqLfl2OqGb*FV2Fx9VzR7Uai zfIgl*bvCt60mtV+3=?ORZ`&y0LTgGccneTX#w$|@Fm8@!DX#pwDnf^V4iJ6HnwQrz zFD=RF$!Cv163tz2=BE4lL7`EbeQ5XWhv)BzPKvd>@-Wl(2-4n_a zCP)}o2|QgR)?}zMq1GEUQ|hlPFUP}9uD>^|GEBT+fFm3heUBfa>u))aM^o+1R*o*g zClMl|R6O&Yrh2+hP`}McVJ-Pw&(5&4vAH`CFSAt2*vAc7rMC@96&V#}&EerI5+wvt z*ud1W4V7MW=+L;Iac_NwJvQ*P--e243enh83O6Rbs1EtI59j!N7o>0=UyDLmS9t`m z{#2df9Uk~wmUxr9UZ_o|aAP|ztC%tJDvbG;( zX>qxP0g<8LDT%Y?BPm3u6Z`iKFO-C92}m!f2cDFZe9X=k+mzvr^*_CO+OGns1MaG| z=_$X8fc^uaab{K}-mOb*=G!tp=GOm}ZAxVP)ot=?@#)~|Ri-=TAISJa#)IiX+)EYw zhHsnvZ+3a+McvihH--_NI6C5ht$X^q?j-JRh%WYPEIi11D^d8Cku(L(kSll!tzDB7 zIbu!5v0JRHbQE>1&@0<0;9blVG}VIo({CsUd&Ep9=cCnY!d5RPq$GUxir~rPCXlZL zrk4_9qB+rXP2v7$(hb9S<}9>LH@q_mhw)|ofD;?_PCAY30T+Bg=j@%*_x*XcAb+D2 zC&)%D*C<@@I>D}Wd{MH^$xSXT%I!VJ=)(9!vs4jVZ$qkyX5#Q+^cyP~oyL_97TLqC z!gDEc^o#G*M^sk5!#SaGLt*d*^_QRr}1z}ksyyrrpEAeTKcIxP&M{uKI%3gQFahoW->;&Os3`=e}z3Lq# ze=QLC?J_q#y86wb<@|&1yn>JJ9BaE_e=bYd51N>9&P|~qTrbuTTQi#?uj2r@3JVyp z)lbZUfpD>uZbR|*VI6F| z6ro-LZtGl%!85Nb2MA9lCa(IsPDQ_uWt}_4$#OlrdRC_31-c3H$(`{j?JH7auC0Wk z2O;Dre)S54Jrb_1@v_n*Di>J@hjSi~B?o77%O*8_nPYjJt2--2*o04QNzf0cp422N ztI-or2rKeU-{@sO_U>;j0ENgu%=_t83+DaG-=FV*Gl7K&oam7jM%S~}5eTE=-l&Zb z01X82r~qAT6TSuK^=opF__wvG@KOR(66epGq|Y8^f0Fkd zb)$k4wu4+Ww#cC>1spXw2_su&8jIkB7}TIi=AsnMyF_H*>c?(t7Ml zC7Ot$xfsO@_Xdn#m8G?g8iAE*yk%>na#i{_a+?k(O-J~g-uud=vZ8$FqcO=xv<)~R zf`!V4G4#^BV)roT=io6zw+pN^H4?Ff`m}Wn(ORKe0`M7Y;_W+W+VxBW%DuE=OT)R_ zUJKkkxvRFlG~;2*R)hrNz~oEo3cLmWB~RIdDR!C~Tkr#M(zbIqE&SS75X!aDnD_@5 zzS-3eU}hW~vEZZa9ymFA)4trgR3}7ZwEyBm23lr0YE>nIw%yy2Cu;U`1o$c5IYRT3 zqUnh(iEnqAy*WfvO95w}#feVlS$xdfdr!XojM;|UE(t?r-OLSW&E$RC8!T0or665# zFYplUm-w#?o-_j(P9wiZB<H?rWnUikPl67|8RG(u4#LTw@~6X4V*5g@2N}}i6g3x zr8koqO&CJeDd_I!8M;V%zw_GQMT^`i*g|U#&!%*I60Mm%wOEB%wRyY;Ve7>4rY9A=f8n0WO+B8yOWlQ(Wm>1#-lEM-40;D^Srml-}j5sW%;(o}R~|YJl3<<+MUo zZOg4*(mLKTdn(KRBy1ik)h1IpQQ9FAY5PmB7nMFnZJPM5LwwF2lfOyxje5>KX67Xx z#)z}1_7rTF$2DK=om@Q1{$Rl>XH?kHjo=;A^c2fFmr|-ju8&he_>r1}=hWHJoJoD~ zr5J_OD*@y3Y4lZRf;3*7k(*3a6-8xJ1jth|2`TK+?)ws1aXj>4<_$KL5e^-*7D760 zA2jENk;H<&`UFOln1rQDrQN$*c!?Fjio+_-b`j|hLk-8i$9-|pY<^6jD$iLobMBFd z<|muSQg}0zN7(Um>^JQMgE-Dm(BNvhgRX-vLDOjTf;_s`fen4jA#+kH!1c{C^}K^T z0Ca}x4bhPfPP#x)ED*NiEdo5qt}Z%hd7-POOM2uAy*fbAtpq&S`8sNJU&-`&eB()9 z>?=Yw17`TJ>asYSYFn@H=;Z_KeC)1IP62zc;i;in7>~nBm@jrLHjadtb|c_r#3{MH z7;m+hzGluxl+OObYQ{TbEi@}0&3rRdye}ULK_3_s#k)j4;hDWb=mUan)yYQ@L zm$M1gAi$uqcD9MgYKZlJZWE)5k|tj{z%5;U0^P6`tXGOwTW`)wuxzWtR0VEC{3?(f zeB=3q@z=R_)bS1%R;IQVb8QYvRt}UB*c-VzqIe*WNv_bH46zC^6@$ zj%3~3e3m`myq17Ek$&y5S-=-ok_yuCLfm{fZowplq*PrqDL)rYR`uE^;VOZtDxqJ) z8I{KqU2IAose}tjN2lniJCudoardy6|aEyKsCXiK(DsW=X*tyGKdl9H0w2v84 zaxJxzT0{q*>sE%s&FkKustI4cl`B~Z<>1(RF;$vY;ay5sCq^rY8x6eez!F6@L6xIMDqw09#Tv?j$yHu4}Lp7+aehMq{ z=2K5Psqvo_l3_k{#FHNLw8io`xDR*(%QN6RV1m|W+DW4$!(nDttz0T;x@IUp7q=SG z>@KE>+&jQ+tIr=bkK4(fUPo-M9t1bkO-Qx@%zJX%A494SkML^;W5eY-+1Tk-t0UBE z+q>l+l$c+t7P*|bWI)s$A%g*EvB3^5&LskjITg?5k-MmXI&6Ko|7jwSOal_ac=GnH zQ$qm3@~Jjj7RRIFIW0;A4(++-vZ%JG;|(Wu%BGtZm2;k_4y$%G*FB@OOBf!$y1sPqObH$Lk zYj^5C;U$+hFIWF4J9hD&hs;;vT>*tbhnEvaJ6y(>0cx303;r;-}@(3}Z<;P0GrQ%Yz$vp_wEJzbt2e44m8P(PdETsiE7 z3b@Rs#fo;boa~E(Mz2UQS{r^HH6TV1yj~ngHE$@!&9qPH5b;lV+8qV&873?+sk$Ck zRddg-V{mOXc;;|bh(OB2SXO=t0pI63xIGbr#Qm$sNRH`ZS_sSc8nAqu<=8z0Hd($? z!1DDzpqyQ8LI^>K+e0dr`Q*C&G~4elK6^m&M6w}kbxQ@RhKTfkV zS)2ij#)`O`b`MGeMw#20lJ2WC@!9_-HUc)zIZOLSnq6Jw61+*&te27IO^05cFm%-;;{60YwrokojgEmS0V4Tnsi+I*&g@d zV+7Ov?bRaM`aKQ-(_PZ&PlK%!O#$qUQgnoQl{<_gm*^ z%!d2_gVw_Ct?fvFQ2y{ipY}7fPgE&xm49@w+TtWlb#$i@W2Jo8zin(i=ox8BLKls_ zYibIu_sJ0Wm#ycE#47J;^3#TmS;4e*m^?y@QTp%nVKo90Zj{~rzrFMSV(%a-HuRCI zuKz`p;|O?{d^t~PX1$^iBFd469lrU=~H@h7Cmkrvuno*SOg#X>I7w`SKIbYJvZAH9c2E0EH``qMx4H0bIi-T~mUI*s6c@q6r(AuDG ztTEfWHX78vA+~oWxU5@^%f{!w80?%_z$$(iA*H6jp z*WtA0{h}}FL0AcaJ5G6)fBu~=5RnCtv%6m zQceJq$$-*dLM>G3whdy=3DUby9-c9g982a%RB@H^3KcyM_-j`5$m*&6WGpJcWz(iY zw)6nwXxq6{DxVb647;J)y>!*zqz3Y&67uV1cfKTsN4bJnvXg-ML#THj2pF`zj$I0a zpdWDdT?BH7^oolGmOYiqv+Swzf@GB<)f~gwfvnz!h%tJ9^GDQeZEb@~_q0uc7Id_6 zt8nrunqzcyW(xBxPz_8B~jZVT}%XYNq`XFgVa z*p3{n^*pOF5ZTO52>YPnh~*lYpBfTudGuO&p58V_!mSC%#`n&MW&25`Na*km)W zrP}p7UUF;8FY3Xe|z@UK4k&GiO;OnD!h!&?Po-zvW-d$qoSi(+DCR8+gD4N zBpxVxvqR|Uf%;RR;g}s^?tjCzwLfgmqT>`EHlMNPk6&Z4RB=b}@{x?U`4vlV>4YY? zy71<*7svTICd@X9u{^73kp1S#E7zJ1y=Rj-ajp$n>rLP6AW4`S4xYSb;-0qd&Ima# zs(pR99X<}5Dl4P4d5huJA-BQEwu!6NPxSY#8B1C<$d|{K0 z$1TCJI;E4n9%gO0F2Lhzyve}}k7ICLi`?Ys#gk8=H%W}PPaNJ>z#B|sc9bm*x2;K2 zl$vuTx*r(E{H5f06tCEv<19^-%-+zObkgqsIO1t{t+P#dR{NE%Mzslp;Ps6mQ5iYX z?U(ahz6+TT{7-IZXB&2JS0zev;m)t-52^gh3RV`xd)dzXP3KyTd;jH6Iu~DLpRqf{ zA?Jb6C$q2y5sMAY38xkb#FEYg0%0@BVXD8qcE!z*(jzuCnCueTx~`y}a4)tx z;!gG_;hSfWy+Q3wmDFI-bra`L+hudUAM>R5CY0f`YDKe;eL*N_mQQ6D)YFROP`lV3_b}C>}TlOD0En15JnRQ^>cp$dT z7+u(Zm??k${#TVvIg#Yn8-uBT1!(@=hB?G7Oc%aL>lXgIrvLll{^M)^?}tNX>rcb! z|5qc<=lbT(JlzGMv!LZ5Nl;xrmhcxAjjY>xH#|4O`83JuOeB_-{#PwbihO{}W|GRP zSS1`wtqV_b+_%Rs4KO2#bIGW_i`l0_{kdXLW0SGmp*$H1njEQdR-8c4o{iE!Ksd~# z?v_#!#>2;di%M+@Av>z6tRI;T;rBL|wJM#n5E6T$5~In6Zrc=wsj{G}p7l1IA-~L# z80vGXGzO50&7}9)S@xUResJU2Dc8dX90^Z6HetC{3%i3SByy)6Ee&UwGt2dGr}v*@ zQI)R1EGoOkI==ftpBvFD1qVJ?J29^sJGIA1SU1c%?Z-Rwo`-a0_S1b<7aWzrTsc>G z@V9m&NYTBcSN$&0&l$GxR@5PMijj{E%n6rZF+#Y z=Xfk6@+`EI}GD?7dn;h;xUpj-h}f*Gq@f$KzoM!a_Ka*-Qrph-rV&bR7n{JHROnjPRcdd+(1;jTTwt?}FR%?qTshIVc8pMqgmlb$r1XVm z_Ow#_4M}^}7~6_h%~;oM5d`3g*CIZc%AF~l36GSdOHwBWl7sE6 z7y#*-QTf}{_%v#B;D3O0Evwqb5kOk?(o}a|E7VMzdLw-v3R;5{rkW(zIn{C zYZQ<)d3iY@(Ur3SL35eBe;Sqcmnj)MU+`kJB$+#k;vVq=9obua=V8$Ma91EjKl1Q! zxojI(pI8{p-sTtO&qwm7?i<>A6>yGcUDSefU&bd!vW=RDZziFl6^4fEUui&62-IKm z5SZ;7!?{yt^`b~j?fk_pZBU{&FaXb9VOG z``O>}dF;Tqe%(L|7?GH!x5!?)Q>bu)JRi8>L@f@1x0Xj|uhRe|tAMsOxA4YV%@FAJ z>zMqF7rm6s$0{>$`vOA_vQ)(bo?0PsFHp!w{E^ks+1@j;<8yk@tg-iOpMghGALqp7CDBJB#s$=DCTmHxSC_vBsBjG3e03##-*p1{4k2@ofOpjJT#y3e5@&`iVznXUB) z^W1rRzRnI*r7o9#QD(I%JIrps*j5KM-jD!)ENd_oGTjZR=?nu^X`hI0fHlGn+!t-) zrjg42P#ZR2pegieIRnFO9;JW~PN=V9lfhS|y@#-0sHE>!c9{JpruEv?mS(dE?GpK&!_-)|uTwLATB=*ezWnjTgiL%k~u$nuz&B~(BzeJOsV3ZR=8J+2hMXMc3 z%nq#Tl!dO+Sfsv*YI{%BtQ(Kfv#FxWsm)FFs1eY9X5MOMUvH_#wp$>6AhKOUNW37! z?p3Iy4aqTX;R|B(x6j1hg+r_THOzhzXfGWJ-{M^-YM}?g_$=Gc!9HaG{t9P)?d4A` zvgD9$xNTC`e{%ogLh$yN+vBlzY)ESOEqMrB>e?cgUb@t-6$}vv>L7*|2|{?x11wGn z3OH_>n^&G)FD|KS7T3LHqYY)C{Kt-t@OCskjV64Zrt-HrcEB>l0`>lPP&}>ZB9ZKL zX!8sLrs)=cFwd$`0G~EgG!FH^)j%LVNkJYT zEkoT+TQVO7MM_I$8Pf&9rp{GGRpC&3*39*-&?ugQ{W#3Br?oxq8<8@y&mWo|DA1B* zk#PIvPS}_4>Wkk7aedaV{<{RhDr!*sm5dXYHz)ZrM3t5w{&>lI8CWjrnE@N+I?&2B zjJ3TszXep)itPi|nRR)!lAFi;YoI}%H>UBouRq75r!s1HTYUJ91iY#E?jW1KoEDD5 zLF8IuvNsQkM#}FAoNc{#?MdG$tvbj$*lMP)sBRIshIKQVq?8ou ziv@;B({$9O%IMG)+&orxNM210g4hJhUN8eERAqgTUDIjk|0dmh9AH6?1~~2HJjB_X6xEhD&6n-3Q%z#8L5jlLNpk+H~97rO}Fk zF$w$U%vC(b_ZbT6Bj<(q5{sKCUhm4DS}Mqok-(ni>b(qcK}Zmf8MNzf)*ss?Al1B0 z4ktkqrer9a;2l-Iasz++aJ>@nWjze6!YvtPUH*Ex73DeQ^Q-5t)3ELH$#tvOt@7CF zmLL#N9bik8V;Q`yzOOIv!Ycs+;3OD^=N8$wbd*3}s_9&O$FER=C>TOV%L0(;CdS_0 zg*yNC!u}Z%Z3v#>Sj87=N?CH)?=!MB80r+C^B(bQmBD~DUW+wjyc&MIJT9zgR_DBc;!pQ0VT<`njNBrw1oxP8w-78xl^QjBYMD>km$qB4P+T&KT&b-b%py(fAG9ne`FWCgptW#$~Z2KDwXZ>QJ(?(CyDEEkh!&K&pQp3vd>SFg^S zig88zrjeQB{kS#7UXgw|(Au5e}*!hR_c`U#+x`1>023Opvv$ZJKrL?_q?iohQBD zHL)!ft}dKuISQG}I^ftXe^P(sS$$G2TX($#%_t!Olh)N*%T+_1^XC!~j?mf*eDt@u zti;$ikb*HOVNS-CX&+a)4$F;_ycxW5S5KKICDdi`u4B#c8NJ9M0OT}@ZkjDIbF(=7 zTe7mkBxV~)fmX9ltuZv}ILqsM!0uU3(ZX1F_G0p7Ub|k9emcMb;o(c`5YSBc_ve2| z>_c2nWg6AuKGOd6`IeCwjNq)1x%gx~yVD$sC~rdDY>(O8Dxv&i_t^1lYOv(P8URBt z79ujYl0#AfAu?|jAcqIA*q>Vz8PnaBF;H`_oQ{)1{i2m+_6$V$rOF|3Q&8`)2mrvW zKb8GZyEQwwNW%B3hb0wSM(QBzU%b!ZTJoExckUY;W(cH}8eJ=^TO`3_KR4bz#3+C4 zJ}R8G`ePpiStuWNu52N)TC_8N?>N&mb$WUPD|4nZ^AML%_4Nw>%n<6wD4zfT@F~`q~Wi$PE?LW7xBQe?K`!ypOVkxN0o#=uT#7zd5uDF>c!FIieNKK&6xiZPRj3bb5SL7VmP|?43 zLZj^uMtjHQoNt))9U=!Tf&FLI+)N+S4o2qGIu|cfEfvg=jW%_p0yNA?(zCchkKw9- zra%bhTnBtV%?N_U)D}{pRxnW^OFy{D0kS);69B#YQkhJSmGm&r`4R|`m`+rtRRi$<~k1%kpCX zAc@&D-!iEVBOUAlX1Dni;KiQd1j+`w=OU%g9FZZ<&dF}b0lBb!&L&JgXm}}2rfB_| zQ(HxvwY*W;v<)}ecd%Lg8V>A0R}vx=Xqmb>q{;<=73P%UCGO`ZSG6|RPeI$H>8(9s z9(RbM)}*zwyc4_=K@fxf=lAMlH>R*WJ{O|u-YpN{yQT(Ixb@Ey_(w*~My)CWUa(tc zphZ&|x8+D0qqF!MNYwNX{zTaL>ANeFT{359WBdSQ+la3yb-lEdlf9K9D6y=1cd3wN zZY=md$t!R-3gWl;c1AJCJZ;Upy^%yWvxf*#@8xOEN;Cto$J%>G$K}h&zgfGM*rVSFSOzndMet_ z{sXEWr9y_tVCQg;KCO4k7XAQ-aqTuc61MEw#*#M`;F?t$aqdVKS+6&^IvLgG=4e+P zUA>gr1!5<*5+q=@`+~5f+EQm&HXZmcHjaa#4b4U!mGAdDXS63abg&&%O7Z~`;f%DL z-|e!CfjwQ2`qsCr0=sj4T3zx>GLllzm~BDJYF@0D^%&4pY%$5T2e)Eu0Bl>6;N#y! z_Wgg~2301!sOuPK$AT?DTD_SkZ1?l#id1&Qzd|dt;xKJa)vr9AekkHhnlJU#%lE|N zr5VO^;MA2TGQ==CNs~_@>jgJg7?b$jE0aIeb2&dlBMOvemTznOpIjBb3?;khVBg5d;oKi$lB1x%n_ZZK;uBL^C+LhNA4 zL9{_Y%+JDt9n*;2(gz7Vu4tC_Z04V|!N`t7rO>HO0bqwREEs(~`z+??A^4mZI7XQ( zfI&?_@o4lFqI6wn(^ItNEj3PeSIp;5dwm2HUkkp3Nw9_p85WNO0EYo5#}?Ui)1|eO zErW4m;7H-)+Sz*>W^ZQ^SkXpCk`RJNsv$UgRS=(Rz4b`)QwG!!NP{>=u5;Z^rdT8x zh)GT5S9grUqrNRyIkW}&;P&E6`%1fWyga2h?WMJyY33-8(pNmk4c&k{f=-C(4MMsi zEmPIj6ooyB{@7%_=tna`yRl+coGP}aDO$r?Bqai{U}w1NvA*OM zOF{veayIZX6lIKkIZEK>&5F?BJ(OF#h#JBt&!(4$;|!51jmc@{VQBtKt1n>~Q<3Do`@ zj~n0LKCXHI!wloY)tTou^NrW>;32)Q=zMUu&ZcyJ>qCnT1MExs$eZvWiEA4le76Y=K1p0mz_7<9nJb{d%!%wggSY* zF81yT_2+V~L^^82`WWs2D$`r4y1j4cU}=|!ZBLIIa1iO-PNcU2)R~CleD6GT80vz0 zE;qG9ZaF0j|BDScAK&rSRxLF)x#f#qf4s6>r{%$+99!vkEEF>I;n@ifH5 zuT#BSzMOxwb`u!M)G-hz%GvLfxdH4)Y6)u~B>Rd`YNIArkdOoGEB~1M(laza+idxa z;(Q`X_fFOIbADnUVu&!?cXc^S-jJUfE3Pzx{^9+ryFFEFA8{L=G{~ER4xJ8)XF<%$ z_|;NO02p^e@e#eDY_?*buOIjT$Bs2h-a18P>ns#$x;0eyc05_s`Z{nT5n?l}0`5)q z;|K>c-uUbF$_0;Lwu6n{>13zzQg1m(88QTg zqGwTqP0$u*1o6nSA)dE&f$9ZXzMNd~Q7E`)d>M#>-!9vJD+*?I5)uWQiAMDdIt5ee zX!;6}@nEOR{U&GxLSMkmS^&0DGUL*}0#;>a{r!?N2QV6r)$B-%HT#b;AntW-aB6m9 zvR*(|KT!QncRKS0-`e>&sUql(OT5Mr6U3;{=QN^#@mkpo^tt7n+oQ$3+ zf;a;v)PZYtW_W!D-`19~7MTvSaU3w*9*04Ms4dVFTRWmWfQ5aCPLMIhW6vP)z2S@J zWrwi~&+nsn*;l-(R5bs*4!p%E_v@SZjobOzemEDFqw)dTvAa&Ly*#Pylj=#lvnVVw z|NB+U{u&_mvLI8JLrvy)2+nKu&TkTFJ$^Gi_2YqyIEd(EP44>{2*_euGuH~w@I23< zf=U3di{t3wJ~-Fo_pZr8TKe3OZq*=*(rUbLuYkAJBoDqE0u>yQ`*%*1R6A$K!uh&ya|T=V^@(hTnh z@&nghv7Lu7a*k0bn3bu$#kEjR>{5!*6{Px7;R3)kF}k4gRD1&j1I$LD?}!X9h!2N* zZ6AcPDRihe9*=B>7F~RhO^?>V>EzFH?c+AmzVY!6EB-7#`cu9v3qVt7t$KBKJT$!q zM$yA$#f63`t-Vq*tK)f2YhR9x1>7*tE3l_&S4j^LkOa*}uTP+zE}5WYTM&?FDr!NG z)cRBG(93q&N*^PXIOBPhE)Vqfa&YxXKX0@t$#EVkg#yH0Ev{He>3(Nsx3f;dgD$%O z`9>%x)2+Uj-U`AHfyky1kPVQmuV$MlTjU)cg6*#XfBI_OA^*c*QY{Id@*AZ%ah;HSDjxGJYM0+8ApXN*-~xeFj_urZRGGywuz*1@6j zcjB5ZN)7-urC9}zIvZ}4#E$?Zl1-UASV=XXGdauENIv+u?YR%|8r{cBMXi2#Pl4QP zSTT7a!PU(bh2*fb(xc`lk=LKUlV#pjTD{w)yFRLG*!BZYleVD5@ftvyeny&293Sih zgc`3nozFO<*J2+aA$Lm=A^58o6l$x(G?0AAq~MdhQZVBFS>WS>F+eY=qorhfR{i-_ z{Y8clK3!LgbR1P-yyaI(nZnIRQG~MBP;!E@*BNzz_F})^^C0!#)X6t0_Z@37EjHx^ zYt{ZEj%0-{bXoB-b0@+UapR>|sX*n~<#_ZJT7G2|<<8ieAsCMRPzKPur<8|fOpYS!l8XocqjKeYf~Itn-ktQ?h3ax!!XQ1IWYdF65+JBJ&pYd<;Av*PiN8!IPY3wK^T7+2j&{ z=)LkLLX*Jap)3v`0x?!2%M~|E8EFStK1||>(&YL5N4WSr$OIuxDKqutB}fzEJ=>Kl zOBPZhE@|E^|8#50w*DxQCa&StdJ(^W87e&pd`?n#Z?#lN$Il8I`w~FNnR|;iIY3pARM6z@kz7kwOLw2HlHo3PZG0Pxf1sn1mc3uK0{U zegN`CT_@K`CtKnX@28L}o(bD~(AN%3Btt@GdsBe=9imWuUHVmiA@Z8Zr=Y}a%&dNY z`PYXE(0+dab2}us&{S9mU{{}eC(u8zy0J$B$c{(UX--%mE~QciwRebr)bgBLPFl%>#Vq0AcWzy@{#JY^22!x6|V$ zr(lFAnY3>T(l@4k%f{=Fl%YV*bF4}#)A=fQQT-Kl);w(-JQLZ7(DwObPgnh40na*y z#4EfQc)8!O_R69@jJ$~@>0O^+4K%Pq4SBRzntNCe($u3>&C0Cob4#2$Y3|N8o@LbZ z*@vQRo@bP-UAlBs*r*b}fEty9x*}!E!plOLKdYI0p2^Qxc^o6UEcEKgt_Lj3LI-sM zJz0=vL+Oo)#u)OY&RUf4S>5_%DTDl42*=1~Vb*JsM&N0jm#Boo4e#@a=6v%P3DLkb z<;p-EEKlWv^T4}>oMC#-qHPZF1W2F&nPt98avV5&h@FExpU|xCR+1yeE5M7n9HQ>h zB7&UI95~Cfw>fyA3fLm90aq?t*0}-09geC`^2kVn0R^9~d)I4FRz1@pgg(~rnx9rQ zrWu#!ePfef+y!mp`&zb<+FIv< z?9a6AScBGH`=ytI+d)q43hWY;rSf9MJj5E3xW$fCgFy9zOYt^VKG98p)t)RAHO!5F zEuTjn4wQdPZtKO*L|giK`nIc}6XxnGiplCbn_VaAZwk`7CLEU46)ZrL&|P9+4P>W$ z$%!XSXrmGs>}JgZs&vUEnS5>k>Xxg0Ve-vnSIb{PI1}FB##HPcmddbn(3~Hel%{5j zcV8iNnK|!~2~ErKu-;f_cBCP~@{D}MWQ9-)Q2_#WVmnXxpA5oQmjpSX#Ng@K#vWn? z7D{risk{$hvCj~mXU+(V8%^u>QIAioALADh*M)1p4`=jRqua3sVG07#o$SYHHK~(x z)P&S(3r2*2K(f>7=umV>QkzH04rog|!iXQbG%%k#KF)}n5I-rwThE9kTRBudIL%w* z3+VQHh9=nAdr2*nn`@!>`#>y5agnV=P9cf`LhZI6F1{)?=AO$Qs_>W_c@$A_B!b+M zf>N@Sx@8ICTwM^|T4czR2T7=VSy~}1L3bJ>SxUJ>L65sOb@Bz|*$kAOb!Ek=C~xrI zB$op;tKy`ZFE_BojPHN?pf+hsS<6^EKK&k9SK@Alz{H6H$t&0ppSUtOA8&K&+{J^? z!D{=QCpgcL%?X=X4BXAhN*}WyhEIj@F>%A11WO}+9lFzo0*Ry;05h#i6B+- z^9u6jtp)HEDSYtXKj3&m0aP^9FKYyw)XTL1w`)1sjldO6;>T7<+n%pP?gQl9^u4p; zVZ>PHqB}*?sOaU&n%GhY)DR4?ednPaQV{@q_P3~#xlbwTfzu>%-==cw0wJfiwOiEN zYd3#UY>HgP->6Jq1JQB5N({{J!~vx5``wltYY%@(l(|1u;@e-cw}mhIDrRn!HGtcV zM>YPMtwCgh|rwb+t$>mk1a8p+qVi5E)R#mNrAGOfr36R#BgsWja&GI zK%IbYI3dFno*T&$4C5SAr--IHX$GldQ~EgE!0VJW)DtCI_RJ-xWJ-^(Wzh0B4X3SC zr8C)KXB#}p^RMh*Cd;z<;6HEdoakF0im**n>X2gG) zQ4#0VxCQIlL-OX{!^PU&qgiw{Ji{IDU>yBRsd88f3+_rZ6cV z>SSZ$c!N0~Jl~W*SmEJpb1<=)>k}P-o;7`y>)>hd$`?f86YT{-hkUH%-Gv)B4K#Cm zafK6(I~l--D-z(bG~ci?A~FCT%OHm7JgVsfpOW;L)(xj;^cO2}>U3@Pi^;1V&COhL z+xv8;S6@lywaw6koQ5k`VzQKKDLO01-=6|>n)_`S0b2@Y+pPn7%>F{;hvFzFZh zt$J~^j-HRqe9!!Yp%n$1w@{&;NlN3mmBgz}{Vjz{xR}C_)eCP}wFsBd?C@FRaE-O} zGtnBtp!y3gtv%Nm@l;2n%nE%5o0mGR%byj#aE!FMWF;AnHe9~GT=Phjw)>`UqWn9Y zc3$-O`VD$Q8YISR%Xclg!7lkVTkGah*@dx_jKmXw+X)r^M!5a?f^Yq6)wVZ1|BqL@rn8L~z^V;PhPQ_+{85_sYw7Rd1@YxP;uGnaSS0X=6nD_cBK10 zwa9#m_x;Dmz4qgedpmX?js5+P3;yNLMzMnkZe^nLH>7|+|4!`|FnH|BXLkSPMg9G^MCo-Yo1_?oBBT<|EpX2>Q=;# zfL31N+rSt*PsD$9Cx3MZ z&;JDmW!u9yf8Tikh-16K82>Zzz8&=c@rl>lTjD&tr66|f;=$GS=xT$^4uRC-g*su~ zg?D@!4pBntaKu>f73^q%QhPUdnG3{^zR$yKxhgG}zrrnh`>6MxO(?Jb`Zg%r%!7ux zEB2#@cmf^7#C0J@V}VC{Z=ebBe6K%r$QhiUK=hB8_UF~hHA2VUV&7Ct=YHAsRWfml z(>`uRpVD)8CNHxNo~Ur2$y%O%*O8DD{r<2zfdxshTbYH)`1Y6sP4YqD$7Clc$}W}F z<1~28FhLZwO-^5L0o< zkys(FbgUQUO%1ko2t=*M>#{;aLq*of;mHKm;Q+yMy?LPGT_Q_S?D%`S1eW8p;2b%t zAj|UvblP~=RF;(}{d>eg=<2xaC)GBpVLnphRF)UhC@MrY%502yi<(kaXL zm>X*5Osc`SvN0lb7VucG_cgrr7>aV!)oidab{jr?uyxS9hYX z2=Vtz!3nUi-1+hG(VzZ)0eV&d77Vvs^ZsvP&EH?!e+yXS*)Q+>_0P-t*I)VP=KeI= z|BT$%6J&Fb`)AI5^*(>v_5W|Zt&U(LC#Ux3ceFFGgl(V6HYfF2ChNjEX5#GIuaCCJrh~0M``8M;a)l65yJHD!EZCTEcFJjtkboHJOnt z>KbnPaIw@*U13IKI3+E`cvR!YBr1>|s9WVogB7k1+Azj6D$F$G`gxz?Ht%De8fHMOlG^G5+o^N20~nj1fGUe ztj}X^)3USWaj!LVgTt*&br6wNop5S$XK7<@bC)WB(?xRkQ*Nca5sWrt7bF_mB620N z!m0dL4pFT>I%63}>`Pk+AUkltgFW95nfPZXI)zYt-wHFWFgR;>ULEQF8 zZd0T6Y?GFHqs9Rnb*k5`14C8b9;`TSL8|~u6%`o~1yX=h7|ZDtOCFUy^Y04mbi*#! zcXJ}aY24b9a{I|WfZu8ookHdw8quPPm5qh=uSm?rotANH$ z5PGcWN?bpdi77`Av2C4MUZ4j+X0?+zB?R7Ef7+qRMbv=%^t-7Zy@X`#b)AL?jR=m8 zH;?INkR@UE>WR&P9opiHEjf#k@B4{}TRY-*5C?CuiAOGVsg*in9ieEMLYs@{|-%U<^VxWZO@F-WF7D^SMu zp!&iTkbVyCByoXrJC&IL)oC=S86zO$9LpX%vf7@!ZN*>OX^ z|2N{~S!(Ut1S)ULw*Tv#DP;>}*GIiuwE{&DyTE6boyY9UoADjA|9$&DZVs5Rz9=3*v_7sK(Wa6RBgGpquKHDO2m38#uoi**P@)@yua6 z{84W@ATN|>_}TuFymLTUX9LHwvs&E9_hJ@Yhxg+3l8`wVqUBi`X^9{e?zYg~HxH^W z;?0`pp52laYtN44kNWT$sfVxjUAU2=cPp10`135JJY;Iz&;l)YjTW1a0&dMzgK=o$ zLGr-!^wX)4ZsX}A`gzz|J>Zyy62yf`_szt&z$>uf^5E^ z|J!eCuPl%Q_(!9cbFMYz-ZhTA0X*{nMrIl05SDznihVLW?aJYbY`Y}>N ztSC(uj=mJ(#e5xc>-qkj4+cD0sKBjeuJw^oZ6nfAqy>ZxB*CY?dX`^;V!Cg{Vo4F)5-#MNEz=gg_G>0fFas z2o3COx*9V?b?>vKj%q@xPKi_Lmpu_?jEL8fUd-O~kY$0)lRoZrBuG6t#ti0chzk}d zx(Id0YcBQU_MD~A4l=_O#<;yHZsgL4buVJY^-kitwNFlRO`?<{>A5av***2cj0hL7 zG4m}8KRs133Wl#HHb863K)-1xrD)6@afosWuatW$Ht*k z$Z6;bk#HA5(sLzYJ9M~9av@9u$pa!oUNTyIWf5XlsckinnGFN-X)-0F8!Loe6j8@Z za}Kg~56gW)S%lY?s(UQFf_32)eqan`Ja`@($N;7ID>H=yE@PJ)`RV@#H~$YyDA&rs zJwNeF*oOdP%?x1sLQ!*+(`uka2uORjV?*UAN#fxdxNxfmrbj|It{h?O8z!0w(p0JU z=)i!+3Fp~nX0$0k1v`O9ja$51&&q8Ln*Oh1dM7`9h0zi`P6t;G5Qb?633@P7Xz5M` zLv&t=udXs&re|sS)m5mpsN|Y^^qs*hq#YXpsrSmEKNU8RkynsHx36#K&Lvi5t>=t3 zsI9$3SY#S4@h`TT4&`?Ugc+lS=Lzm9F;RnQxi##HWz-W0{ajgi;_C>5LlGdQE(P)# za9G6ID7z4tuq2e@*z|yTTDykscM+_o>1oOdT|`%;5)Lg3rzujdKXNM^Yv3QI-omm_ zj(2J7#2@Q9tbe3s@G(frU!?IH^-02kh0OAs818sUBh8PDBB0KK$72#8X$F~u#Ii=b z0+}GV3BUv#cMxmk@Pyj}RI%V#5bTlA1^xjRnekKsbAC*&^j+iXxg7Qt~c{1X8kiyNBPV*RRc$)^v zL;Kb)s94~y9Mm2ky7&o2`h3-hGH76A>yfaW*KRt{uNyq zQpu6PfGXaMQ<1J{Zt7Aco}ct)V^PHnQq7OHF9yLlcRhBQo=0PsL)^m7Ou?-{vMUk< z2XATuryo%l!Io@lYM%5+x$N-fs1ke@3zaoxWjcVp(MhW$HQ| zYVbj3l(TwNZotv&$4(v)|bFBPqpc_%>ae%0i zSTn6V6z(He{zp;S;{QQWnVfDMK2*KB{3*!$d@Kp4t{qE>chlQ2H8IzDW9eeaz!YDE zG+9n3*m%}kJC;ihk*D?RZKieW71|$y<9V`^a2cF}6iVUt=Jr-YpH5a}L_AWZh}xi8 z=6lmqOzh|G>qp)qT`tV{It6kBGBJw$|CNeO#%ntkE;n`I$=IEQpUI28IZwP8;QVO9RFfTp< zY#bRtHJyG8;38m4yh_AA(xU8+pbx{BR@_?PmU&E#tVen>KAOEa6_sV-S6-PD&zKD- zjP!9(fB~D_i_>1`kzWpRk*3KlzmAC9T~H1V?@&cXnQkWWJ-3a4Qf8~1X84IY?z;7q zDkqm&U4DK>q+XR2V_H{@f8oZBwr=(^7Z7d4Ye2EH3?qv1sN~O}ASk3x{A}hu4vIf0 z!y)KtioK7Jj~bxnOzBhj0~Gm%N%xxF+nNx-kBp-cEevfeVe%a4V=jNfnzi%`q2sS!v-$RnyYbLwWk6Pylu*mo$ST0*IYsPiW4qYMh?)qh*v@HoKFEC6Ff*GNFZIc zQ$6zVzl(naft84hmr7!aES#w#1M+(b5}&@5;&Tz0Ozs4CZXlUlLuR3*f)DLuU!naz zj8w%8IHJ_G_Y}8=YvWVsv1gqvJ6;N=>j(q;k_5KQ7JadWV}T*dD}pg8bP!h63=r(n zX)%TmrWmVncA_nV1k=^~D2KInN(iUjZm`i0R}T`5R?WgprWu1epijj|b)f91gP$S* zgehGM02m)hMuls`#pD!{F2T7$y-<9`J&jAzpS}cFOxdhj8r8^(Z5u}Jq`^(FDL#lk zsR!zDgUjMnJhD?yy*c!l(^gFXiw?e5_4V}wbI+{q_r9i+1wq z#^2w48>tio)2>``(JJLMMHJA)J=AEYb9AwLY&4r$H)MFbb)nLululS+jddA(FK-10 zaTM4VzS=`svGhDM+>a-&-|&l)jn+|1oz`E&33a_j^~g1rs_y}1r(yE1yhLo!@LO0F zGsMJ0-=c#O6-w^{>Ibh1iYQ8pX)Y1h7ON#4Jo{s#+z;4u9yH1YP9ZmAE(v;w35VUx zXtjZZ09Hig-VT6OyQvQc`YL3?0n&3>DS+y&*#uQWfw1PMN~m+`A##j!9{EbK7AI3@ zbot>7aDbZPl#kZl;O~F^yWjDj0%9(`Kjyzx zbnt*k-|P=<{NMfh_cw8^96ZF7^k%u%_Ye40R_cGezUu#_p%Xjt94uYiCZxV~beUEG zVM}>@H{v_D!0$gGFQ^$tp!mw)2TQLB?YbE=6jk<9^lkQl8&L!%O+22^l{pqjP zUV=J@4>=4fH@>ZSa!&#yl4wjV{?=>bPZL`K4Djs1{;WTJ z32}&kX^kS)Gh=%X|CK!p6)Bk?kliseFO3tRzU(lCy)xfJ+SfBREaWcjUh{V zd-Tt4t^neerdQ=oJ&q@tfr3(7qY4=3$H;I|S`7~);ySZa$4Wbwsqw4=Duks-fS|+I z6*h3C2O&RGIxh~ci(CKIi_;raTj@TWBj(UoNuze2ZZ*suc1{2W(j8Iq9DKWnYtU#n zP-OJtLw&s($g!z6ueD?yuivZ#!av%q0|I;QOChVB5%jul?$a|MjT59c<>^+Q)w`Ko ztGExeV>%Q);q21*q*OPz5_@PXDLMm$hDM=>e(v;OMTzgve|>|+%6y1>{bhc*33oE0 zz~pZh+0Acp3vcmsl2L@;A^f{8@@;G_C})57E}zZ(t-IfgvdMF7iLHsWf>crq9W`LU zS2K+WPKgAf8&M>AL)tPeTVV<7#VJCqz@G#jCjUry;l}F9nHftW z_Gt(#HtLsG^9wgd^)+)NmpjW2gbR(0LEGVGhKVI+Fk0ToR$az7Oa7l7=iATipUwKu zE5<)M=i7Y?jL`ol60x=(@Ke%tnT?S#Lka0}FxMY>E{Tapji-&dWD?tK4RF&0#p zr-TK=o;z(806mK?wkhE(YAy*vf@&Wi`Na_Z!_rQyw9^i;2*rZ&ITw@ua@W{MHmwf1 zXsw{+W+5F@w-Ur)8B8-c)&AcFK3VksPgOs0<7H+PWFco)dR~4FVo*+76If967uO&L zM5w8VcL+7aVvd#B=SvRCM{7vlH$z4m%IG{8zdeX}%tTNTTqTVheNjB8M+1@(RdS>q z5$#s?-TD&IUfc*Z+En(mv#H0v2smj6wRpxE{H&L~se8O$zfU$tPw}kT@l-;4F%v;H z)Z;6NdN(fVur85almq?_D33~XElZK@^Jy=<;?WO^oj{FJ-15KgHme3v73{U9G.vcap.plan' +# ------------------------------------------------------------ + - name: s4-cap-ext-db +# ------------------------------------------------------------ + type: com.sap.xs.hdi-container + parameters: + service: hana # or 'hanatrial' on trial landscapes + service-plan: hdi-shared + properties: + hdi-service-name: ${service-name} + + diff --git a/notes/package.json b/notes/package.json new file mode 100644 index 00000000..3c2518ea --- /dev/null +++ b/notes/package.json @@ -0,0 +1,33 @@ +{ + "name": "@capire/notes", + "version": "1.0.0", + "description": "Maintain notes for a Supplier", + "repository": "", + "license": "UNLICENSED", + "private": true, + "dependencies": { + "@sap/cds": ">=5", + "@sap/cds-compiler": "^2", + "@sap/hana-client": "^2.6.61", + "express": "^4" + }, + "devDependencies": { + "sqlite3": "5.0.0" + }, + "scripts": { + "start": "cds run" + }, + "cds": { + "requires": { + "[sandbox]": { + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "srv/external/API_BUSINESS_PARTNER", + "credentials": { + "url": "https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_BUSINESS_PARTNER/" + } + } + } + } + } +} diff --git a/notes/requests.http b/notes/requests.http new file mode 100644 index 00000000..88f3193c --- /dev/null +++ b/notes/requests.http @@ -0,0 +1,16 @@ +### Get remote suppliers + +GET http://localhost:4004/notes/Suppliers?$top=11 + +### Get remote suppliers with expanded notes + +GET http://localhost:4004/notes/Suppliers?$top=11&$expand=notes + +### Suppliers set to readonly --> fails with 405 + +PATCH http://localhost:4004/notes/Suppliers('11') +Content-Type: application/json + +{ + "BusinessPartnerFullName": "Can't change!" +} diff --git a/notes/srv/external/API_BUSINESS_PARTNER.csn b/notes/srv/external/API_BUSINESS_PARTNER.csn new file mode 100644 index 00000000..a227137e --- /dev/null +++ b/notes/srv/external/API_BUSINESS_PARTNER.csn @@ -0,0 +1,2847 @@ +{ + "definitions": { + "API_BUSINESS_PARTNER": { + "kind": "service" + }, + "API_BUSINESS_PARTNER.A_AddressEmailAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultEmailAddress": { + "type": "cds.Boolean" + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "SearchEmailAddress": { + "type": "cds.String", + "length": 20 + }, + "AddressCommunicationRemarkText": { + "type": "cds.String", + "length": 50 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressFaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "IsDefaultFaxNumber": { + "type": "cds.Boolean" + }, + "FaxCountry": { + "type": "cds.String", + "length": 3 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalFaxNumber": { + "type": "cds.String", + "length": 30 + }, + "AddressCommunicationRemarkText": { + "type": "cds.String", + "length": 50 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressHomePageURL": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "key": true, + "type": "cds.Date" + }, + "IsDefaultURLAddress": { + "key": true, + "type": "cds.Boolean" + }, + "SearchURLAddress": { + "type": "cds.String", + "length": 50 + }, + "AddressCommunicationRemarkText": { + "type": "cds.String", + "length": 50 + }, + "URLFieldLength": { + "type": "cds.Integer" + }, + "WebsiteURL": { + "type": "cds.String", + "length": 2048 + } + } + }, + "API_BUSINESS_PARTNER.A_AddressPhoneNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Person": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "OrdinalNumber": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DestinationLocationCountry": { + "type": "cds.String", + "length": 3 + }, + "IsDefaultPhoneNumber": { + "type": "cds.Boolean" + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "InternationalPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberType": { + "type": "cds.String", + "length": 1 + }, + "AddressCommunicationRemarkText": { + "type": "cds.String", + "length": 50 + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressNumber": { + "type": "cds.String", + "length": 10 + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "AddressRepresentationCode": { + "type": "cds.String", + "length": 1 + }, + "ContactRelationshipFunction": { + "type": "cds.String", + "length": 40 + }, + "ContactRelationshipDepartment": { + "type": "cds.String", + "length": 40 + }, + "Floor": { + "type": "cds.String", + "length": 10 + }, + "ContactPersonBuilding": { + "type": "cds.String", + "length": 10 + }, + "RoomNumber": { + "type": "cds.String", + "length": 10 + }, + "ContactPersonPrfrdCommMedium": { + "type": "cds.String", + "length": 3 + }, + "CorrespondenceShortName": { + "type": "cds.String", + "length": 10 + }, + "InhouseMail": { + "type": "cds.String", + "length": 10 + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ContactPersonFunction": { + "type": "cds.String", + "length": 4 + }, + "ContactPersonDepartment": { + "type": "cds.String", + "length": 4 + }, + "PhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "PhoneNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "FaxNumber": { + "type": "cds.String", + "length": 30 + }, + "FaxNumberExtension": { + "type": "cds.String", + "length": 10 + }, + "EmailAddress": { + "type": "cds.String", + "length": 241 + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaAddressUsage": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Timestamp" + }, + "AddressUsage": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "StandardUsage": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIdentification": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPIdentificationType": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "BPIdentificationNumber": { + "key": true, + "type": "cds.String", + "length": 60 + }, + "BPIdnNmbrIssuingInstitute": { + "type": "cds.String", + "length": 40 + }, + "BPIdentificationEntryDate": { + "type": "cds.Date" + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "ValidityEndDate": { + "type": "cds.Date" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BuPaIndustry": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "IndustrySector": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IndustrySystemType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "IsStandardIndustry": { + "type": "cds.String", + "length": 1 + }, + "IndustryKeyDescription": { + "type": "cds.String", + "length": 100 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartner": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "AcademicTitle": { + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerCategory": { + "type": "cds.String", + "length": 1 + }, + "BusinessPartnerFullName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerGrouping": { + "type": "cds.String", + "length": 4 + }, + "BusinessPartnerName": { + "type": "cds.String", + "length": 81 + }, + "BusinessPartnerUUID": { + "type": "cds.UUID" + }, + "CorrespondenceLanguage": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreationTime": { + "type": "cds.Time" + }, + "FirstName": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "Industry": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "IsFemale": { + "type": "cds.Boolean" + }, + "IsMale": { + "type": "cds.Boolean" + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "IsSexUnknown": { + "type": "cds.Boolean" + }, + "GenderCodeName": { + "type": "cds.String", + "length": 1 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "LastChangeDate": { + "type": "cds.Date" + }, + "LastChangeTime": { + "type": "cds.Time" + }, + "LastChangedByUser": { + "type": "cds.String", + "length": 12 + }, + "LastName": { + "type": "cds.String", + "length": 40 + }, + "LegalForm": { + "type": "cds.String", + "length": 2 + }, + "OrganizationBPName1": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName2": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName3": { + "type": "cds.String", + "length": 40 + }, + "OrganizationBPName4": { + "type": "cds.String", + "length": 40 + }, + "OrganizationFoundationDate": { + "type": "cds.Date" + }, + "OrganizationLiquidationDate": { + "type": "cds.Date" + }, + "SearchTerm1": { + "type": "cds.String", + "length": 20 + }, + "SearchTerm2": { + "type": "cds.String", + "length": 20 + }, + "AdditionalLastName": { + "type": "cds.String", + "length": 40 + }, + "BirthDate": { + "type": "cds.Date" + }, + "BusinessPartnerBirthDateStatus": { + "type": "cds.String", + "length": 1 + }, + "BusinessPartnerBirthplaceName": { + "type": "cds.String", + "length": 40 + }, + "BusinessPartnerIsBlocked": { + "type": "cds.Boolean" + }, + "BusinessPartnerType": { + "type": "cds.String", + "length": 4 + }, + "ETag": { + "type": "cds.String", + "length": 26 + }, + "GroupBusinessPartnerName1": { + "type": "cds.String", + "length": 40 + }, + "GroupBusinessPartnerName2": { + "type": "cds.String", + "length": 40 + }, + "IndependentAddressID": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "MiddleName": { + "type": "cds.String", + "length": 40 + }, + "NameCountry": { + "type": "cds.String", + "length": 3 + }, + "NameFormat": { + "type": "cds.String", + "length": 2 + }, + "PersonFullName": { + "type": "cds.String", + "length": 80 + }, + "PersonNumber": { + "type": "cds.String", + "length": 10 + }, + "IsMarkedForArchiving": { + "type": "cds.Boolean" + }, + "BusinessPartnerIDByExtSystem": { + "type": "cds.String", + "length": 20 + }, + "TradingPartner": { + "type": "cds.String", + "length": 6 + }, + "to_BuPaIdentification": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIdentification", + "cardinality": { + "max": "*" + } + }, + "to_BuPaIndustry": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaIndustry", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerAddress", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerBank": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerBank", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerContact": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerContact", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerRole": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerRole", + "cardinality": { + "max": "*" + } + }, + "to_BusinessPartnerTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_Customer": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Customer" + }, + "to_Supplier": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Supplier" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerAddress": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AddressID": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "AddressUUID": { + "type": "cds.UUID" + }, + "AdditionalStreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "AdditionalStreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "AddressTimeZone": { + "type": "cds.String", + "length": 6 + }, + "CareOfName": { + "type": "cds.String", + "length": 40 + }, + "CityCode": { + "type": "cds.String", + "length": 12 + }, + "CityName": { + "type": "cds.String", + "length": 40 + }, + "CompanyPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Country": { + "type": "cds.String", + "length": 3 + }, + "County": { + "type": "cds.String", + "length": 40 + }, + "DeliveryServiceNumber": { + "type": "cds.String", + "length": 10 + }, + "DeliveryServiceTypeCode": { + "type": "cds.String", + "length": 4 + }, + "District": { + "type": "cds.String", + "length": 40 + }, + "FormOfAddress": { + "type": "cds.String", + "length": 4 + }, + "FullName": { + "type": "cds.String", + "length": 80 + }, + "HomeCityName": { + "type": "cds.String", + "length": 40 + }, + "HouseNumber": { + "type": "cds.String", + "length": 10 + }, + "HouseNumberSupplementText": { + "type": "cds.String", + "length": 10 + }, + "Language": { + "type": "cds.String", + "length": 2 + }, + "POBox": { + "type": "cds.String", + "length": 10 + }, + "POBoxDeviatingCityName": { + "type": "cds.String", + "length": 40 + }, + "POBoxDeviatingCountry": { + "type": "cds.String", + "length": 3 + }, + "POBoxDeviatingRegion": { + "type": "cds.String", + "length": 3 + }, + "POBoxIsWithoutNumber": { + "type": "cds.Boolean" + }, + "POBoxLobbyName": { + "type": "cds.String", + "length": 40 + }, + "POBoxPostalCode": { + "type": "cds.String", + "length": 10 + }, + "Person": { + "type": "cds.String", + "length": 10 + }, + "PostalCode": { + "type": "cds.String", + "length": 10 + }, + "PrfrdCommMediumType": { + "type": "cds.String", + "length": 3 + }, + "Region": { + "type": "cds.String", + "length": 3 + }, + "StreetName": { + "type": "cds.String", + "length": 60 + }, + "StreetPrefixName": { + "type": "cds.String", + "length": 40 + }, + "StreetSuffixName": { + "type": "cds.String", + "length": 40 + }, + "TaxJurisdiction": { + "type": "cds.String", + "length": 15 + }, + "TransportZone": { + "type": "cds.String", + "length": 10 + }, + "AddressIDByExternalSystem": { + "type": "cds.String", + "length": 20 + }, + "CountyCode": { + "type": "cds.String", + "length": 8 + }, + "TownshipCode": { + "type": "cds.String", + "length": 8 + }, + "TownshipName": { + "type": "cds.String", + "length": 40 + }, + "to_AddressUsage": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BuPaAddressUsage", + "cardinality": { + "max": "*" + } + }, + "to_EmailAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", + "cardinality": { + "max": "*" + } + }, + "to_FaxNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", + "cardinality": { + "max": "*" + } + }, + "to_MobilePhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_PhoneNumber": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", + "cardinality": { + "max": "*" + } + }, + "to_URLAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerBank": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BankIdentification": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BankCountryKey": { + "type": "cds.String", + "length": 3 + }, + "BankName": { + "type": "cds.String", + "length": 60 + }, + "BankNumber": { + "type": "cds.String", + "length": 15 + }, + "SWIFTCode": { + "type": "cds.String", + "length": 11 + }, + "BankControlKey": { + "type": "cds.String", + "length": 2 + }, + "BankAccountHolderName": { + "type": "cds.String", + "length": 60 + }, + "BankAccountName": { + "type": "cds.String", + "length": 40 + }, + "ValidityStartDate": { + "type": "cds.Timestamp" + }, + "ValidityEndDate": { + "type": "cds.Timestamp" + }, + "IBAN": { + "type": "cds.String", + "length": 34 + }, + "IBANValidityStartDate": { + "type": "cds.Date" + }, + "BankAccount": { + "type": "cds.String", + "length": 18 + }, + "BankAccountReferenceText": { + "type": "cds.String", + "length": 20 + }, + "CollectionAuthInd": { + "type": "cds.Boolean" + }, + "CityName": { + "type": "cds.String", + "length": 35 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerContact": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "RelationshipNumber": { + "key": true, + "type": "cds.String", + "length": 12 + }, + "BusinessPartnerCompany": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerPerson": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "ValidityEndDate": { + "key": true, + "type": "cds.Date" + }, + "ValidityStartDate": { + "type": "cds.Date" + }, + "IsStandardRelationship": { + "type": "cds.Boolean" + }, + "RelationshipCategory": { + "type": "cds.String", + "length": 6 + }, + "to_ContactAddress": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToAddress", + "cardinality": { + "max": "*" + } + }, + "to_ContactRelationship": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept" + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerRole": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BusinessPartnerRole": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "ValidFrom": { + "type": "cds.Timestamp" + }, + "ValidTo": { + "type": "cds.Timestamp" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "BusinessPartner": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "BPTaxType": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "BPTaxNumber": { + "type": "cds.String", + "length": 20 + }, + "BPTaxLongNumber": { + "type": "cds.String", + "length": 60 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Customer": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerFullName": { + "type": "cds.String", + "length": 220 + }, + "CustomerName": { + "type": "cds.String", + "length": 80 + }, + "DeliveryIsBlocked": { + "type": "cds.String", + "length": 2 + }, + "NFPartnerIsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "CustomerCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "IndustryCode1": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode2": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode3": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode4": { + "type": "cds.String", + "length": 10 + }, + "IndustryCode5": { + "type": "cds.String", + "length": 10 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "NielsenRegion": { + "type": "cds.String", + "length": 2 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "to_CustomerCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerCompany", + "cardinality": { + "max": "*" + } + }, + "to_CustomerSalesArea": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesArea", + "cardinality": { + "max": "*" + } + }, + "to_CustomerTaxGrouping": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerTaxGrouping", + "cardinality": { + "max": "*" + } + }, + "to_CustomerText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerText", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkInternetAddress": { + "type": "cds.String", + "length": 130 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "AlternativePayerAccount": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CollectiveInvoiceVariant": { + "type": "cds.String", + "length": 1 + }, + "CustomerAccountNote": { + "type": "cds.String", + "length": 30 + }, + "CustomerHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "CustomerSupplierClearingIsUsed": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PaytAdviceIsSentbyEDI": { + "type": "cds.Boolean" + }, + "PhysicalInventoryBlockInd": { + "type": "cds.Boolean" + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "RecordPaymentHistoryIndicator": { + "type": "cds.Boolean" + }, + "UserAtCustomer": { + "type": "cds.String", + "length": 15 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CashPlanningGroup": { + "type": "cds.String", + "length": 10 + }, + "KnownOrNegotiatedLeave": { + "type": "cds.String", + "length": 4 + }, + "ValueAdjustmentKey": { + "type": "cds.String", + "length": 2 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_CompanyText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerCompanyText", + "cardinality": { + "max": "*" + } + }, + "to_CustomerDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerDunning", + "cardinality": { + "max": "*" + } + }, + "to_WithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerCompanyText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesArea": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "AccountByCustomer": { + "type": "cds.String", + "length": 12 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "BillingIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "CompleteDeliveryIsDefined": { + "type": "cds.Boolean" + }, + "Currency": { + "type": "cds.String", + "length": 5 + }, + "CustomerABCClassification": { + "type": "cds.String", + "length": 2 + }, + "CustomerAccountAssignmentGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "CustomerPriceGroup": { + "type": "cds.String", + "length": 2 + }, + "CustomerPricingProcedure": { + "type": "cds.String", + "length": 2 + }, + "DeliveryIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "DeliveryPriority": { + "type": "cds.String", + "length": 2 + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "InvoiceDate": { + "type": "cds.String", + "length": 2 + }, + "ItemOrderProbabilityInPercent": { + "type": "cds.String", + "length": 3 + }, + "OrderCombinationIsAllowed": { + "type": "cds.Boolean" + }, + "OrderIsBlockedForCustomer": { + "type": "cds.String", + "length": 2 + }, + "PartialDeliveryIsAllowed": { + "type": "cds.String", + "length": 1 + }, + "PriceListType": { + "type": "cds.String", + "length": 2 + }, + "SalesGroup": { + "type": "cds.String", + "length": 3 + }, + "SalesOffice": { + "type": "cds.String", + "length": 4 + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplyingPlant": { + "type": "cds.String", + "length": 4 + }, + "SalesDistrict": { + "type": "cds.String", + "length": 6 + }, + "InvoiceListSchedule": { + "type": "cds.String", + "length": 2 + }, + "ExchangeRateType": { + "type": "cds.String", + "length": 4 + }, + "AdditionalCustomerGroup1": { + "type": "cds.String", + "length": 3 + }, + "AdditionalCustomerGroup2": { + "type": "cds.String", + "length": 3 + }, + "AdditionalCustomerGroup3": { + "type": "cds.String", + "length": 3 + }, + "AdditionalCustomerGroup4": { + "type": "cds.String", + "length": 3 + }, + "AdditionalCustomerGroup5": { + "type": "cds.String", + "length": 3 + }, + "PaymentGuaranteeProcedure": { + "type": "cds.String", + "length": 4 + }, + "CustomerAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc", + "cardinality": { + "max": "*" + } + }, + "to_SalesAreaTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax", + "cardinality": { + "max": "*" + } + }, + "to_SalesAreaText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaText", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DepartureCountry": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "CustomerTaxCategory": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CustomerTaxClassification": { + "type": "cds.String", + "length": 1 + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerSalesAreaText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerTaxGrouping": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CustomerTaxGroupingCode": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "CustTaxGrpExemptionCertificate": { + "type": "cds.String", + "length": 15 + }, + "CustTaxGroupExemptionRate": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "CustTaxGroupExemptionStartDate": { + "type": "cds.Date" + }, + "CustTaxGroupExemptionEndDate": { + "type": "cds.Date" + }, + "CustTaxGroupSubjectedStartDate": { + "type": "cds.Date" + }, + "CustTaxGroupSubjectedEndDate": { + "type": "cds.Date" + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxAgent": { + "type": "cds.Boolean" + }, + "ObligationDateBegin": { + "type": "cds.Date" + }, + "ObligationDateEnd": { + "type": "cds.Date" + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Customer": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "SalesOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DistributionChannel": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "Division": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "BPCustomerNumber": { + "type": "cds.String", + "length": 10 + }, + "CustomerPartnerDescription": { + "type": "cds.String", + "length": 30 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "Supplier": { + "type": "cds.String", + "length": 10 + }, + "PersonnelNumber": { + "type": "cds.String", + "length": 8 + }, + "ContactPerson": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_Supplier": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "AlternativePayeeAccountNumber": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "CreationDate": { + "type": "cds.Date" + }, + "Customer": { + "type": "cds.String", + "length": 10 + }, + "PaymentIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "PostingIsBlocked": { + "type": "cds.Boolean" + }, + "PurchasingIsBlocked": { + "type": "cds.Boolean" + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierFullName": { + "type": "cds.String", + "length": 220 + }, + "SupplierName": { + "type": "cds.String", + "length": 80 + }, + "VATRegistration": { + "type": "cds.String", + "length": 20 + }, + "BirthDate": { + "type": "cds.Date" + }, + "ConcatenatedInternationalLocNo": { + "type": "cds.String", + "length": 20 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "FiscalAddress": { + "type": "cds.String", + "length": 10 + }, + "Industry": { + "type": "cds.String", + "length": 4 + }, + "InternationalLocationNumber1": { + "type": "cds.String", + "length": 7 + }, + "InternationalLocationNumber2": { + "type": "cds.String", + "length": 5 + }, + "InternationalLocationNumber3": { + "type": "cds.String", + "length": 1 + }, + "IsNaturalPerson": { + "type": "cds.String", + "length": 1 + }, + "ResponsibleType": { + "type": "cds.String", + "length": 2 + }, + "SuplrQltyInProcmtCertfnValidTo": { + "type": "cds.Date" + }, + "SuplrQualityManagementSystem": { + "type": "cds.String", + "length": 4 + }, + "SupplierCorporateGroup": { + "type": "cds.String", + "length": 10 + }, + "SupplierProcurementBlock": { + "type": "cds.String", + "length": 2 + }, + "TaxNumber1": { + "type": "cds.String", + "length": 16 + }, + "TaxNumber2": { + "type": "cds.String", + "length": 11 + }, + "TaxNumber3": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber4": { + "type": "cds.String", + "length": 18 + }, + "TaxNumber5": { + "type": "cds.String", + "length": 60 + }, + "TaxNumberResponsible": { + "type": "cds.String", + "length": 18 + }, + "TaxNumberType": { + "type": "cds.String", + "length": 2 + }, + "SuplrProofOfDelivRlvtCode": { + "type": "cds.String", + "length": 1 + }, + "BR_TaxIsSplit": { + "type": "cds.Boolean" + }, + "to_SupplierCompany": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierCompany", + "cardinality": { + "max": "*" + } + }, + "to_SupplierPurchasingOrg": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg", + "cardinality": { + "max": "*" + } + }, + "to_SupplierText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierText", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierCompany": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "CompanyCodeName": { + "type": "cds.String", + "length": 25 + }, + "PaymentBlockingReason": { + "type": "cds.String", + "length": 1 + }, + "SupplierIsBlockedForPosting": { + "type": "cds.Boolean" + }, + "AccountingClerk": { + "type": "cds.String", + "length": 2 + }, + "AccountingClerkFaxNumber": { + "type": "cds.String", + "length": 31 + }, + "AccountingClerkPhoneNumber": { + "type": "cds.String", + "length": 30 + }, + "SupplierClerk": { + "type": "cds.String", + "length": 15 + }, + "SupplierClerkURL": { + "type": "cds.String", + "length": 130 + }, + "PaymentMethodsList": { + "type": "cds.String", + "length": 10 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "ClearCustomerSupplier": { + "type": "cds.Boolean" + }, + "IsToBeLocallyProcessed": { + "type": "cds.Boolean" + }, + "ItemIsToBePaidSeparately": { + "type": "cds.Boolean" + }, + "PaymentIsToBeSentByEDI": { + "type": "cds.Boolean" + }, + "HouseBank": { + "type": "cds.String", + "length": 5 + }, + "CheckPaidDurationInDays": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "Currency": { + "type": "cds.String", + "length": 5 + }, + "BillOfExchLmtAmtInCoCodeCrcy": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "SupplierClerkIDBySupplier": { + "type": "cds.String", + "length": 12 + }, + "ReconciliationAccount": { + "type": "cds.String", + "length": 10 + }, + "InterestCalculationCode": { + "type": "cds.String", + "length": 2 + }, + "InterestCalculationDate": { + "type": "cds.Date" + }, + "IntrstCalcFrequencyInMonths": { + "type": "cds.String", + "length": 2 + }, + "SupplierHeadOffice": { + "type": "cds.String", + "length": 10 + }, + "AlternativePayee": { + "type": "cds.String", + "length": 10 + }, + "LayoutSortingRule": { + "type": "cds.String", + "length": 3 + }, + "APARToleranceGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierCertificationDate": { + "type": "cds.Date" + }, + "SupplierAccountNote": { + "type": "cds.String", + "length": 30 + }, + "WithholdingTaxCountry": { + "type": "cds.String", + "length": 3 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "CashPlanningGroup": { + "type": "cds.String", + "length": 10 + }, + "IsToBeCheckedForDuplicates": { + "type": "cds.Boolean" + }, + "MinorityGroup": { + "type": "cds.String", + "length": 3 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_CompanyText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierCompanyText", + "cardinality": { + "max": "*" + } + }, + "to_Supplier": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_Supplier" + }, + "to_SupplierDunning": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierDunning", + "cardinality": { + "max": "*" + } + }, + "to_SupplierWithHoldingTax": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierCompanyText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierDunning": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "DunningArea": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "DunningBlock": { + "type": "cds.String", + "length": 1 + }, + "DunningLevel": { + "type": "cds.String", + "length": 1 + }, + "DunningProcedure": { + "type": "cds.String", + "length": 4 + }, + "DunningRecipient": { + "type": "cds.String", + "length": 10 + }, + "LastDunnedOn": { + "type": "cds.Date" + }, + "LegDunningProcedureOn": { + "type": "cds.Date" + }, + "DunningClerk": { + "type": "cds.String", + "length": 2 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPartnerFunc": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "SupplierSubrange": { + "key": true, + "type": "cds.String", + "length": 6 + }, + "Plant": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "PartnerFunction": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "PartnerCounter": { + "key": true, + "type": "cds.String", + "length": 3 + }, + "DefaultPartner": { + "type": "cds.Boolean" + }, + "CreationDate": { + "type": "cds.Date" + }, + "CreatedByUser": { + "type": "cds.String", + "length": 12 + }, + "ReferenceSupplier": { + "type": "cds.String", + "length": 10 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "CalculationSchemaGroupCode": { + "type": "cds.String", + "length": 2 + }, + "DeletionIndicator": { + "type": "cds.Boolean" + }, + "IncotermsClassification": { + "type": "cds.String", + "length": 3 + }, + "IncotermsTransferLocation": { + "type": "cds.String", + "length": 28 + }, + "IncotermsVersion": { + "type": "cds.String", + "length": 4 + }, + "IncotermsLocation1": { + "type": "cds.String", + "length": 70 + }, + "IncotermsLocation2": { + "type": "cds.String", + "length": 70 + }, + "InvoiceIsGoodsReceiptBased": { + "type": "cds.Boolean" + }, + "MaterialPlannedDeliveryDurn": { + "type": "cds.Decimal", + "precision": 3, + "scale": 0 + }, + "MinimumOrderAmount": { + "type": "cds.Decimal", + "precision": 14, + "scale": 3 + }, + "PaymentTerms": { + "type": "cds.String", + "length": 4 + }, + "PricingDateControl": { + "type": "cds.String", + "length": 1 + }, + "PurOrdAutoGenerationIsAllowed": { + "type": "cds.Boolean" + }, + "PurchaseOrderCurrency": { + "type": "cds.String", + "length": 5 + }, + "PurchasingGroup": { + "type": "cds.String", + "length": 3 + }, + "PurchasingIsBlockedForSupplier": { + "type": "cds.Boolean" + }, + "ShippingCondition": { + "type": "cds.String", + "length": 2 + }, + "SupplierABCClassificationCode": { + "type": "cds.String", + "length": 1 + }, + "SupplierPhoneNumber": { + "type": "cds.String", + "length": 16 + }, + "SupplierRespSalesPersonName": { + "type": "cds.String", + "length": 30 + }, + "SupplierConfirmationControlKey": { + "type": "cds.String", + "length": 4 + }, + "IsOrderAcknRqd": { + "type": "cds.Boolean" + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + }, + "SupplierAccountGroup": { + "type": "cds.String", + "length": 4 + }, + "to_PartnerFunction": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPartnerFunc", + "cardinality": { + "max": "*" + } + }, + "to_PurchasingOrgText": { + "type": "cds.Association", + "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrgText", + "cardinality": { + "max": "*" + } + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierPurchasingOrgText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "PurchasingOrganization": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierText": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "Language": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "LongTextID": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "LongText": { + "type": "cds.LargeString" + } + } + }, + "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax": { + "kind": "entity", + "@cds.persistence.skip": true, + "elements": { + "Supplier": { + "key": true, + "type": "cds.String", + "length": 10 + }, + "CompanyCode": { + "key": true, + "type": "cds.String", + "length": 4 + }, + "WithholdingTaxType": { + "key": true, + "type": "cds.String", + "length": 2 + }, + "ExemptionDateBegin": { + "type": "cds.Date" + }, + "ExemptionDateEnd": { + "type": "cds.Date" + }, + "ExemptionReason": { + "type": "cds.String", + "length": 2 + }, + "IsWithholdingTaxSubject": { + "type": "cds.Boolean" + }, + "RecipientType": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxCertificate": { + "type": "cds.String", + "length": 25 + }, + "WithholdingTaxCode": { + "type": "cds.String", + "length": 2 + }, + "WithholdingTaxExmptPercent": { + "type": "cds.Decimal", + "precision": 5, + "scale": 2 + }, + "WithholdingTaxNumber": { + "type": "cds.String", + "length": 16 + }, + "AuthorizationGroup": { + "type": "cds.String", + "length": 4 + } + } + } + } +} \ No newline at end of file diff --git a/notes/srv/external/API_BUSINESS_PARTNER.edmx b/notes/srv/external/API_BUSINESS_PARTNER.edmx new file mode 100644 index 00000000..a6aa7986 --- /dev/null +++ b/notes/srv/external/API_BUSINESS_PARTNER.edmx @@ -0,0 +1,6614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + This field is generated by the system from the complete Internet mail address and is stored in table ADR6. + It contains the first 20 characters of the Internet mail address in normalized form, that is, without comment characters and converted into uppercase.The field cannot be maintained by the user or from an interface.The table ADR6 contains an index for this field.Using an Internet mail address, the corresponding key of table ADR6 and the owner of the address are determined (for example, business partner or user). + + + + + Additional information about the communication connection + You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + The country/region for the telephone number or fax number is maintained here. + This specification is used to determine the correct country/region code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country/region of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country/region from the user parameter LND is proposed (if it is maintained).If the user parameter LND is not maintained, the country/region of the company address assigned in the user master data is proposed.If the country/region of the address changes, the country/region of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country/region for this telephone number also has to be retained and must not be changed automatically to the new country/region of the address. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + The content of this field is automatically calculated by the system based on fax number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + Additional information about the communication connection + You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + + + Additional information about the communication connection + You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. + + + + + + + + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + + The country/region for the telephone number or fax number is maintained here. + This specification is used to determine the correct country/region code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country/region of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country/region from the user parameter LND is proposed (if it is maintained).If the user parameter LND is not maintained, the country/region of the company address assigned in the user master data is proposed.If the country/region of the address changes, the country/region of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country/region for this telephone number also has to be retained and must not be changed automatically to the new country/region of the address. + + + + + If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. + The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + The content of this field is automatically calculated by the system based on the telephone number and country code components. + This field is therefore not to be filled when Business Address Services function modules are called. + + + + + This field specifies whether the telephone number is a mobile telephone number. + ' ' : The telephone number is a fixed-line telephone'1' : The telephone number is the standard fixed-line telephone'2' : The telephone nubmer is a mobile telephone'3' : The telephone number is the standard mobile telephoneEither the standard fixed-line telephone number or the standard mobile telephone number is also the standard telephone number (FLGDEFAULT = 'X').In older data sets, this field may have also have the value ' ' for the standard fixed-line telephone. In this case, however, FLGDEFAULT is always 'X'.In Customizing, you can specify whether the SMS-compatible indicator is to be proposed for new mobile telephone numbers created in dialog by choosing General Settings -> Set countries -> Define Mobile Telephone Attributes for each country. + + + + + Additional information about the communication connection + You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country/region key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country/region code or a typical country/region key, for example, in Germany the Federal statistics office key.The country/region keys are determined at system installation in the global settings.The definition of the country/region keys in the SAP system does not necessarily have to match political or state units.Since the country/region key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country/region key cannot query the country/region key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Other country/region for PO box in an address. + Here you can enter the country/region for the PO box if this country/region is different to the country/region of the street address.If the address only has a PO box address, you enter the country/region in in the normal field for country/region.If the street address and the PO box belong to two different countries/regions, you fill this field.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + Version indicator of an address. + You can maintain addresses in multiple versions. In this way, addresses can be stored in the system in different international display formats (such as Kanji or Latin letters).The version indicator is a part of the address key.You can use the standard version keys or enter your own version keys in the view V_SAPTSADV.For more information, see the section 'Print Formatting for Addresses' in the BAS documentation (see SAP note 383362). + + + + + Function of a person, e.g. as contact person in a company. + In anglo-saxon countries this is often part of the formatted address (e.g. in an address window). + + + + + This field contains the department in a company as part of the company address. + It is the department name used at the customer for a customer contact person.It is usually the same as the department name used on business cards.The department is printed, e.g.:SAP AGBasis Technology <<<<Herr Peter LarssonNeurottstr. 16D-69190 Walldorf + + + + + Floor of the building as more exact specification of an address. + This field is not printed in the address.Floors which should be printed must be in the field house number supplement or in one of the fields Street2, Street3, Street4 or Street5 depending on the desired position. See Print the Street address. + + + + + Number or ID for the building in a contact person address. + This field is not printed.This is not the same as the building name which is part of an address. + + + + + Appartment or room number in an a ddress. + This field is not printed.Entries which are to be printed must in the house number supplement field or in one of the Street2, Street3, Street4 or Street5 fields, depending on the desired position. See Print the Street address. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + + + + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Identifies the function that a person has within a company. + This is a contact person attribute that you can define in Customizing.Personnel managerSecretary + + + + + Name of the department of a business partner for your internal usage. + The name given by the business partner to this particular department may differ from the name that you use. You can enter the name given by the business partner in the field company department.This is a contact person attribute that you can define in Customizing.For your purposes, the department name is "Sales". The business partner names the same department "Sales South". + + + + + Telephone number, consisting of dialling code and number, but without country dialling code. + If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Telephone extension number + If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. + + + + + Fax number, consisting of dialling code and number, but without country dialling code. + If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Fax extension number + If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. + + + + + Internet mail address, also called e-mail address. + Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + Business partner attribute, which you can use to distinguish between various addresses by defining the address usage for communication with business partners. + Maintain the usage types for addresses (address types) in Customizing.You can create a short description and a name for the address type.When maintaining business partners you can use the function address usage to assign business partner addresses to address types.If necessary, you can set the indicator for multiple use in Customizing.Correspondence addressDelivery address + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + Establishes which is the standard address for an address usage. + Several addresses per period can be assigned to an address usage.If this is the case, then this indicator controls which of the assigned addresses should be the standard address of the relevant usage. This is determined automatically when the address usage is accessed. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + A document (such as an ID card or driver's license) or an entry in a system of records (such as a commercial register) whose key can be stored as an attribute for a business partner. + The identification type is for classifying identification numbers.You can define the identification types and their descriptions in Customizing.You can also specify for which business partner category an ID type should be valid.If necessary, assign the identification type to an Identification Category.You can only assign one identification type to an identification category. + + + + + Number that serves to identify a business partner, such as driver's license, or ID card number. + + + + + + Institution that adminsters or assigns an ID number. + + + + + + Date on which the ID number was registered or assigned by the appropriate authority. + + + + + + Country/region in which an ID number was assigned, or in which the number is valid. + + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + This date marks the start of validity of an ID number. + + + + + + This date marks the end of validity of an ID number. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + Describes an industry. + An industry is a classification of companies according to their main business activity. For example, you can use Commerce, Banking, Services, Industry, Healthcare, Public Sector, Media, and so on, as industries.You can define industries along with their descriptions in Customizing.Assign the industry key to an industry key system. + + + + + Serves to combine and categorize several industries into a group. + You can create different industry systems, each with its own catalog of industries, whereby an industry can be assigned to several industry systems.You have to select one industry system as the standard industry system. This is then automatically displayed in the initial screen for the maintenance of industry data.You can define an industry system along with its description in Customizing. You can assign several industry systems to a business partner.If you choose the button All Industry Systems, you can access all the industry systems defined in the Customizing using the input help. + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Identifies the industry in an industry system that can be defined as the standard industry. + It is recommended that you define an industry within an industry system as the standard industry, because only the standard industries can be determined at the interfaces to BW or the APIs, for example.This means that even if only one industry exists within an industry system, it should be indicated as the standard industry as this this information cannot be determined otherwise. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Key for academic title. + You can define a key for an academic title in Customizing. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + Category under which a business partner is classified. + You can distinguish between the following business partner categories:OrganizationNatural personGroup of natural persons or organizationsThe processing screens for the business partner categories are set up differently.So, for example, the screen for an organization contains the field Legal form, but this is not needed in the screen for a natural person. + + + + + + Classification assigned when creating a business partner. + Assign each business partner to a grouping when you create the business partner. The grouping determines the number range. You cannot change the assignment afterwards.You can define the groupings, their descriptions, the associated number range and other attributes in Customizing.You can define standard groupings for the internal and the external number assignment.For each grouping create a number range.When you create a business partner, the entry in the grouping field determines whether and how an entry is made in the business partner number field. + + + + + + + Correspondence language (written) for business partners in the 'Person' category. Maintain the correspondence language for business partners in the 'Organization' and 'Group' category with the address (communication). + When transferring data (direct input), make sure that for a'Person', the field 'LANGU_CORR' and for an'Organization' or "Group" the field 'LANGU'has an entry. + + + + + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + An industry sector is the term used to classify a company according to its main business activity. + You can assign an industry sector to business partners in the category 'Organization'RetailBanksServicesIndustryHealth servicePublic sectorMedia + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + + + Indicator through which a distinction between natural and legal persons can be made during tax reporting. + Is used in Italy and Mexico ,among other countries.Brasil: If the indicator is not set, 'CGC' is relevant in tax number 1. If the indicator is set, 'CPF' is relevant in tax number 2.Colombia: In the case of some natural persons, the NIT number does not have a check digit. In this case you should set this indicator and the check is deactivated. + + + + + + + Language for verbal communication with a business partner. + This language may differ from the language(s) defined for written correspondence. + + + + + + + + + Denotes certain legal norms that are of significance for the organization of a company. + For business partners in the category "Organization", you can state the legal form of the company. This is for information purposes only.Stock corporation (AG in Germany)Limited liability company (GmbH in Germany) + + + + + First name field for business partners in the Organization category. + + + + + + Second name field for business partners in the Organization category. + + + + + + Third name field for business partners in the Organization category. + + + + + + Fourth name field for business partners in the Organization category. + + + + + + Indicates the official registration of a company in the Commercial Register. + If a company is not officially registered in the Commercial Register, it has to use some type of text addition, such as foundation pending, when referring to the legal form. + + + + + Term for the end of bankruptcy proceedings. + This date also indicates that the company no longer exists. + + + + + Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. + + + + + + Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. + + + + + + + + If the Business partner's actual birthdate is unknown, a partial entry can be made or read. This field then indicates which part of the birthdate is unknown. Below are some examples (Dates are specified in format MM/DD/YYYY): + 01/01/0000 => 01/01/1880 Year unknown00/01/1911 => 01/01/1911 Month unknown05/00/1911 => 05/01/1911 Day unknown05/05/1911 => 05/05/1911 Fully known00/00/1911 => 05/05/1911 Day & Month unknown00/05/0000 => 05/05/1911 Month & Year unknown05/00/0000 => 05/05/1911 Day & Year unknown00/00/0000=> 05/05/1911 Fully unknown'Date of Birth: Status' field determines the unknown parts of birthdate.Enter a valid date under Birthdate. Future dates are not accepted. If any part/s of the date is/are unknown, select the nearest date.If year is unknown, select any random valid year. + + + + + + If the business partner is blocked centrally, certain activities cannot be executed. + + + + + + You can use the business partner type to group business partners according to your own criteria in Customizing (IMG). + In Customizing you can show or hide fields for data entry, depending on the requirements of the relevant business partner type.Select a business partner type. You can obtain help by pressing the F4 key. + + + + + + First name field for business partners in the Group category. + + + + + + Second name field for business partners in the Group category. + + + + + + Internal key for identifying the address for communication data that spans all addresses in Business Partner. + For more information on the significance and usage of the address number, see the documentation for Business Address Services (BAS). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + + The country/region for the name format rule and the name format rule key together uniquely identify a formatting rule. + A country/region can have several formats which correspond to different rules. You need formatting rules to describe the composition of a person's name. + + + + + See Name format. + + + + + + States the complete name of a person. + The complete name is generally generated and saved by the Business Address Services (BAS) according to country-specific rules from the individual name components (without the form of address).If, during the formatting of an address, you want to use an alternative name, you can manually format the alternative name here. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Establishes if the business partner is meant to be archived. + If the indicator is set, the relevant business partner can be archived from the view of the business partner administration.If the check of the data to be archived shows, for example, that there are still active business transactions the archiving of the business partner data is prevented even if the indicator is set.If the indicator is not set, the business partner will not be taken into consideration during archiving. + + + + + Business partner number from an external system or a legacy system. + If the current business partner is known under a different number in an external system, you can store this number here for information purposes.Direct input gives you the option of maintaining a business partner by specifying the external business partner number. If you maintain business partner data in your legacy system, you can transmit changes made to business partners to the SAP system without having to know the SAP business partner number in the legacy system. + + + + + Company ID standard for the whole group. + + + + + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Internal key for identifying a Business Address Services address. + For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Additional address field which is printed under the Street line. + The Street address has two lines above the street and two lines below the steet.See Print the Street address. + + + + + Time zone as part of an address. + The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. + + + + + Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). + Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + + City name as part of the address. + The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. + + + + + Postal code that is assigned directly to one company (= company postal code = major customer postal code). + This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. + + + + + The country/region key contains information which the system uses to check entries such as the length of the postal code or bank account number. + The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country/region code or a typical country/region key, for example, in Germany the Federal statistics office key.The country/region keys are determined at system installation in the global settings.The definition of the country/region keys in the SAP system does not necessarily have to match political or state units.Since the country/region key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country/region key cannot query the country/region key T005-LAND1, but have to program based on the ISO code T005 INTCA. + + + + + Specifies the county’s name + This field is used to store the county’s name. You can enter the name of the county in this field. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + The delivery service is part of the PO box address. + Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. + + + + + City or District supplement + In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. + + + + + Key for form of address text. + You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. + + + + + This field contains the full name or formatted name of a party. + For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. + + + + + City of residence which is different from the postal city + In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + House number as part of an address. + It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. + + + + + House number supplement as part of an address, e.g. + App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. + + + + + The language key indicates + - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. + + + + + PO Box number as part of an address. + Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. + + + + + Different city for the PO Box as an address component. + The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. + + + + + Other country/region for PO box in an address. + Here you can enter the country/region for the PO box if this country/region is different to the country/region of the street address.If the address only has a PO box address, you enter the country/region in in the normal field for country/region.If the street address and the PO box belong to two different countries/regions, you fill this field.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Different Region for PO Box in an address. + Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + PO Box address without PO Box number flag. + Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + The PO box lobby is part of the PO box address. + In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. + + + + + Postal code that is required for a unique assignment of the PO box. + This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. + + + + + Internal key for identifying a person in Business Address Services. + For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. + + + + + Postal code as part of the address + If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. + + + + + Communication method with which you can exchange documents and messages with a business partner. + In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. + + + + + In some countries, the region forms part of the address. The meaning depends on the country. + The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State + + + + + Street name as part of the address. + The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. + + + + + Additional address field which is printed above the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. + + + + + Additional address field which is printed below the Street line. + The Street address contains two lines above the street and two lines below the street.See Print the Street address. + + + + + Specifies the tax jurisdiction. + + + + + + Sales and distribution: + Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. + + + + + Address number from an external system or a legacy system + If the current address has a different number in an external system, you can save this number here for information purposes.In direct input you are able to maintain an address for a business partner by stating the external address number. If your business partner data is maintained in a legacy system, you can thus transmit changes to a BP address to the SAP system without having to know the SAP address number in the legacy system. + + + + + Specifies the county’s code + This field stores the county’s code. You cannot enter any data in this field. The system fetches this data from the ADRCOUNTY table and updates it in this field. + + + + + Specifies the township’s code + This field stores the township’s code. You cannot enter any data in this field. The system fetches this data from the ADRTOWNSHIP table and updates it in this field. + + + + + Specifies the township’s name + This field is used to store the township’s name. You can enter the name of the township in this field. + + + + + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner's bank details. + Enter a bank details ID for each separate set of bank details for a business partner.Business Partner: H. MillerBD-ID Fin.institution Acct no. 0001 Chemical Bank, NYC 56234560002 Chemical Bank, NYC 56231220003 First Bank of Pittsburgh ...Business partner: T.Wolsey and Co.BD-ID Fin.institution Acct no.GIR0 Citibank, Charleston ...GIR1 Chemical Bank, NYC ... + + + + + Specifies the country/region where the bank is based. + The country/region key determines according to which rules the remaining bank data (for example, bank number and bank account number) is checked. + + + + + The name under which the bank operates. + + + + + + The bank key (under which the bank data is stored in the appropriate country) is specified in this field. + The country-specific meaning of this bank key is specified when defining country key.Normally banks have a bank number, which then also appears in the control data of the bank.In certain countries the bank account number assumes this function; in such a case there would be no bank numbers, the bank details are then under the account number.For data medium exchange it can be useful to be able create banks for foreign business partners without a bank number, even if the country in question has bank numbers. In such cases the bank key can be assigned internally.If the bank data is under another key, such as the SWIFT code for example, numbers can also be assigned externally. + + + + + Uniquely identifies a bank throughout the world. + SWIFT stands for Society for Worldwide Interbank Financial Telecommunication.BIC stands for Bank Identifier Code.This globally unique code can be used in international payment transactions to identify the bank without the need to specify an address or bank number. Specification of the SWIFT code/BIC is mainly relevant for automatic payment transactions. + + + + + Brazil, France, Spain, Portugal and Italy + The field contains a check key for the combination bank number and bank account number.USAIn USA this field is used to differentiate between a savings and a current account (if no value is entered, the default value 01 is used).01 Current account02 Savings account03 Loan account04 General ledgerJapanIn Japan this field specifies the type of account. This information is is copied from the payment medium print program into payment medium. The following is an example of the account types used:01 FUTSU (similar to a savings account)02 TOUZA (similar to a current account)04 CHOCHIKU (similar to an investment account)09 Other types of bank accountsSouth AfricaIn South Africa this field specifies the type of account. The information entered here is forwarded to the bank that carries out the payment order. The following account types are permitted in ABC format:01 Current (Cheque) Account02 Savings Account03 Transmission Account04 Bond Account06 Subscription Share AccountArgentinaIn Argentina this field specifies the type of account:CC Current Account (Cuenta corriente)CA Saving Account (Caja de ahorro)CE Special Saving Account (Caja de ahorro especial)CS Salary Account (Cuenta sueldos)VenezuelaIn Venezuela this field specifies the type of account:CC Checking Account (Cuenta corriente)CA Saving Account (Cuenta de ahorro)CE Special Saving Account (Cuenta de ahorro especial)CS Salary Account (Cuenta sueldos)MexicoIn Mexico this field contains a two-digit key for classifying the bank account (for example, as a savings or current account). This key have different definitions, depending on the bank.NoteFor countries that are not listed here, this field can be used for account-specific information. + + + + + Here you can enter another name that the payment program can use if the name of the account holder is not the same as the name of the Business Partner. + + + + + + + + + A uniform standardized ID number for representing bank details that is in accordance with the ECBS (European Committee for Banking Standards). An IBAN has a maximum of 34 alphanumeric characters and is a combination of the following elements: + Country key of the bank (ISO code)Two-digit check numberCountry-specific account number (in Germany this consists of the bank number and account number, in France the bank number, account number and check key).The IBAN not only makes international payments easier, in some countries it has advantages for domestic payments as well. Depending on the country, it can mean advantages for value and fees.The IBAN can be maintained in parallel with the bank details but does not replace them. It is stored under the master data of the business partner and can then be used when creating the payment medium.Since it is only the bank that has the account that may generate the IBAN corresponding to an account number, the SAP system only generates a proposal. You can confirm or change this proposal. If no proposal is generated, enter the IBAN manually.An IBAN in Belgium may look like this:Electronic Form:BE62510007547061Printed form, as it would appear on an invoice:IBAN BE62 5100 0754 7061 + + + + + + This field contains the number under which the account is managed at the bank. + + + + + + Additional details for the bank details of the business partner. + In some countries the data for the bank details of the business partner (bank number, bank account number, name of the account holder) have to supplemented by other details in order to be able to use certain payment processes. This supplementary details are defined here.If additional data is required for the bank details for payment transactions in your country (see the following examples), enter the reference information.If for an automatic debit the bank requires the reference number of the collection authorization in Norway or Great Britain, specify this number here.In Great Britain when making payments to an account in a 'Building Society' you must specify which number payment recipient has. These details must be defined in the reference field, whereas the fields Bank Key and Account Number are to be used for the bank details of the 'Building Society'.In Great Britain when entering a building society account number, the name of the building society should also be maintained in the system. + + + + + States that the bank has collection authorization from the business partner for the account. + Set this indicator if the bank has collection authorization.Note for Accounts Receivable (FI-AR)If this indicator is not set, there is no bank collection.Note for Contract Accounts Receivable and Payable (FI-CA)This indicator is not relevant. + + + + + Name of the city as a part of the address. + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + + + The business partner relationship number is an internal number that identifies the business partner relationship set. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + + + States whether the relationship is a standard relationship. + If several relationships of the BP relationship category contact person have been defined for, you can set the indicator standard relationship for one of these relationships.A relationship that is marked as a standard relationship can be used whenA certain scenario automatically selects a contact personThe contact person responsible is not knownYou can give this indicator to only one business partner relationship of a BP relationship category for a particular period. Another relationship of the same relationship category can be indicated as the standard relationship only if the periods for the relationship do not overlap or coincide. + + + + + A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. + A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) + + + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Function that a business partner takes on, depending on a business transaction. + You can define business partner roles along with their attributes in Customizing.You can create an alphanumeric, 6-digit key for the BP role. You can also choose a title as the short form and a description as the long form for the role text.Screen control in the dialog takes place by assigning a BP view.A program can access specific business partner roles for a business partner using thebusiness partner role category . The role categories are also in the TB003 table. + + + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + + Key identifying a business partner in the SAP system. The key is unique within a client. + + + + + + Specifies the tax number category. + + + + + + Specifies the tax number. + + + + + + Specifies the tax number. + You can enter up to 60 characters in this field. + + + + + You can use authorization groups to stipulate which business partners a user is allowed to process. + Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicates if the processing of billing documents is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block the processing of all credit memos to a certain customer, pending manual approval. + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + Specifies a classification of the customer (for example, classifies the customer as a bulk purchaser). + The classifications are freely definable according to the needs of your organization. + + + + + + + Indicates if delivery processing is blocked for the customer in all sales areas (company-wide, for example). + You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all deliveries to a certain customer for credit reasons. + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Indicates if sales order processing is blocked for the customer in all sales areas (company-wide, for example). + If you block sales order processing, the block counts for the following partner functions of the customer:Sold-to partyShip-to partyPayerIf you want to process an order where the ship-to party differs from the sold-to party, and the ship-to party is blocked, you cannot process the order.You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all free of charge deliveries and credit memo requests for a certain customer, pending manual approval before further processing can take place. + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Account number of another master record in which the official address is stored. This address is used, for example, for tax reports to the tax authorities in Italy. + + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Specifies the code that uniquely identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. You can assign more than one industry code to a customer by choosing Create more. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Specifies an additional code that identifies the industry (or industries) of the customer. + Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Specifies a regional division according to the market categories created by the A. C. Nielsen company. + By allocating a Nielsen division, you can use the services of the Nielsen Institute to create a market analysis of your customers. + + + + + Classification of companies according to tax aspects. + + + + + + Specifies the tax number. + Enter the appropriate tax number:Country/Region Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country/Region Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberNorway Organization registration numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + This field contains the account number the company is listed under at the customer. + + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + +
+ Account number of the customer for whom automatic payment transactions are to be carried out.The account number is only needed if bank collections are not to be made via the customer who owes the receivables. The same applies to refunds of payables.The specification in this field only applies to this company code. There is another field in which you can enter an alternative payee for all company codes. If both fields are filled, the specification for the company code has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Indicator which specifies at what intervals the collective invoices are to be created for the customer. + + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + This field contains the account number of the head office. + This account number is only specified for branch accounts. All postings for which the account number of the branch is specified, are automatically posted to the head office account. The account number of the branch affected is noted in the line items.No line items or balances are managed in the branch account. + + + + + Indicates that during automatic payment transactions clearing is made with the corresponding vendor account, and that during manual clearing procedures, the items of that vendor account are also selected. + To use this function in automatic payment transactions, you have toenter the vendor account number in the customer master record,enter the customer account number in the vendor master record, andselect the "Clearing with customer" indicator in the vendor master record.If you set this indicator, the system will also include items of the vendor account in customer dunning. + + + + + All bank data is determined using this key. + + + + + + You enter an interest indicator here if you want the business partner to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in the configuration step Change Message Control, udter Finance -> Localization -> General Settings.Release for PaymentIf you want to use a block key for payment release in accounting, then you have to set the attribute Not Changeable for the block key. You make this setting in the configuration step Control Payment Block Reasons, under Finance -> Accounts Payable -> General Payment Settings. + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + Indicator that the payment history of the customer is to be recorded. + The amount and number of payments are then recorded per calendar month, as well as the average days in arrears.Information about cash discount payments and net payments is recorded separately.The indicator should not be set for one-time accounts and accounts which are paid automatically (bank collection or bank bill in Germany, bill of exchange payment request in France).You can only carry out evaluation of the payment history, for example, with the report for customer evaluation with OI listing, if you have selected this field. + + + + + Name or identification code of the accounting clerk at the customer. + + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. + You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... + + + + + With the key specified here, you can refer to known/negotiated leave. + + + + + + The value adjustment key controls the way the open items are processed during individual value adjustment. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the customer who is to be the recipient of the dunning letters. + The account number is only needed if dunning letters are not sent to the customer who owes the receivables. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + This field contains the account number your company is listed under at the customer or vendor. + + + + + + The authorization group enables you protect access to certain objects. + In order to carry out a specific activity, the user must have authorization for the combination of the activity and the authorization group. + + + + + Indicates if further billing activities are blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, billing that is already underway is continued. However, you cannot process the document further.Enter one of the values predefined for your system. If you want to block billing for a customer throughout an entire sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block billing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Indicates whether a sales order must be delivered completely in a single delivery or whether the order can be partially delivered and completed over a number of deliveries. + + + + + + Customer's currency for a sales area. This currency will be used to settle the customer's charges for the given sales organization. + + + + + + + The account assignment group to which the system automatically posts the sales document. + The system uses the account assignment group as one of the criteria during the automatic determination of revenue accounts.The system automatically proposes the account assignment group from the customer master record of the payer. You can change the default value in the sales document or the billing document. + + + + + Identifies a particular group of customers (for example, wholesale or retail) for the purpose of pricing or generating statistics. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + A grouping of customers who share the same pricing requirements. + You can define price groups according to the needs of your organization and create pricing records for each group. You can, for example, define a group of customers to whom you want to give the same kind of discount. You can assign a price group to an individual customer either in the customer master record or in the sales document.The system can propose the price group from the customer master record. You can change the proposed value manually in the sales document at both header and item level. + + + + + Determines which pricing procedure the system should apply when you create a sales document for the customer. + You can define different pricing procedures for your system. A pricing procedure determines the type and sequence of conditions that the system uses for pricing in, for example, a sales order. + + + + + Indicates if further delivery processing is blocked for the customer. The block applies throughout the specified sales area. + If you enter a blocking indicator, delivery processing that is already underway is continued. However, no new processing can take place.Enter one of the values predefined for your system. If you want to block delivery processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block delivery processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + The delivery priority assigned to an item. + You can assign delivery priority to either a particular material or to a combination of customer and material. When you process deliveries collectively, you can use delivery priority as one of the selection criteria. + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Indicates that all data in the master record will be deleted for the specified sales area. Before the deletion is made, the system checks for dependent data that would prevent the deletion. + + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + Identifies the calendar that determines the schedule of billing dates for the customer. + If, for example, a customer wants to consolidate the invoices you send out, you can predefine the billing schedule in a calendar in the system. During billing, the system automatically proposes the appropriate billing date from the calendar.The system proposes the billing schedule from the customer master record of the payer. You can change the value manually in the sales document. + + + + + The probability (expressed as a percentage) of the customer confirming the inquiry or quotation item as part of a sales order. + The system combines the probability factors from the sales document type and from the customer master record of the sold-to party.If probability is 80% for the sales document type and 50% in the customer master record, the system combines the two values. In this case, the system takes 50% of 80% and proposes 40% for the item.The system proposes the probability. You can change the value manually for the item.You can generate requirements from quotations. Accordingly, the probability of quotation items affects how requirements are passed on. For example, a quotation for 100 pieces and a probability of 50% will generate requirements for 50 pieces. + + + + + Indicates whether you are allowed to combine orders during delivery processing. + The system proposes the indicator from the customer master record. You can change the value manually in the sales document at both header and item level. + + + + + Indicates if further sales order processing is blocked for the customer. The block applies throughout the specified sales area. + You can define blocks according to the needs of your organization. If you enter a blocking indicator, sales order processing that is already underway is continued. However, no new processing can occur.Enter one of the values predefined for your system. If you want to block sales order processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sale organization is defined.You can block sales order processing for a customer if, for example, there are credit-related or legal problems to be resolved. + + + + + Specifies whether the customer requires full or partial delivery for the item. + You use this field to control partial deliveries at the item level. If the customer allows partial delivery, you can choose from different partial delivery options. For example, you can specify whether the customer allows you to make one delivery attempt only on the requested delivery date or whether unlimited delivery attempts are possible.When partial delivery indicator 'D' is set, the order can never have status 'fully delivered'. You must complete each item by entering a reason for rejection. This could be applied to scheduling agreements, for example.You can enter a value in this field only if the customer allows partial deliveries for the entire sales document. + + + + + Identifies a price list or other condition type (for example, a surcharge or discount). + You can define price list types according to the needs of your own organization. Price list types can be grouped according to:the kind of price list (for example, wholesale or retail)the currency in which the price appearsthe number of the price list typeYou can use price list types to apply conditions during pricing or to generate statistics.In the customer master record, enter one of the values predefined for your system. The system proposes the value automatically during sales order processing. You can change the value manually in the sales document header. + + + + + A group of sales people who are responsible for processing sales of certain products or services. + By using sales groups you can designate different areas of responsibility within a sales office. When you generate sales statistics, you can use the sales group as one of the selection criteria.If sales office personnel service both retail and wholesale markets, you can assign a sales group to each market.You assign each salesperson to a sales group in his or her user master record. You assign each customer to a particular sales group in the customer's master record. + + + + + A physical location (for example, a branch office) that has responsibility for the sale of certain products or services within a given geographical area. + When you create sales statistics, you can use a sales office as one of the selection criteria. When you print out order confirmations, you can include the address of the sales office.You can assign each customer to a sales office in the customer master record.Within a sales office you can establish sales groups (for example, departments) with specific sales responsibilities. Each person who works in the sales office can be assigned to a sales group in his or her user master record. Each customer can also be assigned to a particular sales group in the customer master record. + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Plant from which the goods should be delivered to the customer. + This plant is automatically copied into the sales order item as the default value.If there is no default value when you process the sales order item, enter a delivering plant.The value proposed in the item is eitherfrom the customer master record of the goods recipient, orfrom the material master recordThe system checks whether it can propose a value (and for your own plants, whether the material has been created in the plant). If the system can propose a value, the plant is copied to the sales order item where you can change it as required. + + + + + A geographical sales district or region. + Each customer can be assigned to a sales district. You can use sales districts to apply pricing conditions. When you want to generate sales statistics, you can use sales districts as a selection criteria.The system can propose a value from the customer master record of the sold-to party. You can change the value manually in the document at the header or item level. + + + + + Identifies the customer's factory calendar that is used during the processing of invoice lists. + An invoice list is a list of invoices (single or collective) that you create for the customer either periodically or on predefined dates. The periods and dates are defined in the customer's factory calendar. Typically, the recipient of an invoice list takes on the responsibility for collecting payments from numerous individual customers and receives a factoring or del credere discount for the service.If you want to create invoice lists for the customer, you must enter an identifier for a predefined factory calendar. + + + + + Key representing a type of exchange rate in the system. + You enter the exchange rate type to store different exchange rates.You can use the exchange rate type to define a buying rate, selling rate, or average rate for translating foreign currency amounts. You can use the average rate for the currency translation, and the bank buying and selling rates for valuation of foreign currency amounts. + + + + + Specifies a customer-defined group of customers. + You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. + + + + + Specifies a customer-defined group of customers. + You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. + + + + + Specifies a customer-defined group of customers. + You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. + + + + + Specifies a customer-defined group of customers. + You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. + + + + + Specifies a customer-defined group of customers. + You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. + + + + + This key identifies the customer payment guarantee procedure. + The customer payment guarantee procedure determines which payment guarantee procedure the system automatically uses when you create a sales document for the customer.In receivables risk management, the system determines the payment guarantee procedure taking into account:the key for the document payment guarantee procedure in the header for the sales document type.the customer payment guarantee procedure key in the customer master.You can define different payment guarantee procedures for your system. The payment guarantee procedure defines the type and sequence of forms of payment guarantee that the system assigns to the sales document items. + + + + + The account group is a classifying feature within customer master records. The account group determines: + in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. + + + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + Specifies a distribution channel that you want to use as a reference for customer and material master data for other distribution channels. + You can specify one distribution channel as the source of customer and material master data for other distribution channels. You need then only to maintain the data in one place.Distrib.channel Ref.distrib.channel01 0102 0103 0104 04In this example, only distribution channels 01 and 04 have customer and material master data defined. Distribution channels 01, 02, and 03 share the master data that you defined for distribution channel 01. Distribution channel 04 has its own master data. When you create a sales order in distribution channel 03, the system checks the customer and material master data against the data defined for distribution channel 01. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + Identifies the country or region in which the delivery originates. + You can define the country/region key in a table. As a rule, it is a good idea to use the existing international standards for identifying vehicles from different countries or regions (for example: USA = United States, I = Italy, and so on). The system uses the key to do the following:Help determine the relevant taxes during pricingDetermine important country or region-specific standards (the length of postal codes and bank account numbers, for example) + + + + + Identifies the condition that the system uses to automatically determine country-specific taxes during pricing. + You can define one or more tax categories for each country. During sales order processing, the system applies the tax category according tothe geographical location of your delivering plant and the location of the customer receiving the goodstax classifications in the customer master record and the material master record.In the USA, for example, you can define tax categories for Federal Sales Tax and Federal Excise Tax. In the U.K., you can define a tax category for Value Added Tax (VAT). + + + + + Specifies the tax liability of the customer, based on the tax structure of the customer's country. + You can use the tax classification to specify, for example, whether a customer is liable for sales taxes, such as VAT or state sales taxes.During sales order processing, the system copies the tax classification from the tax information stored in thecustomer master record of the payer, if the payer is different from the sold-to party and the sales tax identification number is maintained for the payer.ship to party, if the sales tax identification number of the ship-to party is maintained.sold-to party, if none of the criteria for the payer or the ship-to party are met.During pricing, the system calculates any relevant taxes by taking the following factors into account:The tax classification of the customer and the materialThe country keys of the customer and the delivering plant + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + This indicator is used to allocate customers and vendors to different tax categories. The system evaluates this information during document entry to assist users in selecting the tax code. + + + + + + The exemption information are displayed while posting a document to help the user find the correct tax code. If the posting date lies within an exemption interval the corresponding tax category will be highlighted. + + + + + + Tax categories + The exemption information is used by the system to help the user find the correct tax code while posting a document.The system will not apply the exemption rate to a tax amount previously calculated. This has to be done by defining a special tax code with a reduced percentage rate.Withholding taxThe exemption percentage is applied to the calculated withholding tax amount. + + + + + + + This field gives the start date of the status of being subjected. + + + + + + This field gives the end date of the status of being subjected. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + + Date from which: + The company code is obligated to withhold tax for the given withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obligated to withhold tax for the withholding tax type.This date must be defined in the customer master record. + + + + + Date to which: + The company code is obligated to withhold tax for the withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obigated to withhold tax for the withholding tax type. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. + You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. + You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. + + + + + A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. + A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + + Sold-to party number sent in by the customer in delivery schedules. + The system uses this number to automatically determine the ship-to party. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The personnel number is the only feature within a client which is unique to an employee. You have to enter a personnel number before you can display and maintain an employee's master data and time data. + + + + + + The number that uniquely identifies the contact person. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The account number of the vendor with whom automatic payment transactions are carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies to all company codes. There is a further field in which every company code can enter an alternative payee separately. If both fields are filled, the company code specification has priority. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + Name with which the user who entered the master record was logged on in the R/3 System. + + + + + + Date on which the master record, or the part of the master record being viewed, was created. + + + + + + Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. + + + + + + + Indicates that the account is blocked for posting for all company codes. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Indicates whether or not the supplier master record is blocked for all departments (that is, whether or not posting to this record is allowed at all). + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + VAT registration number (VAT reg.no.) of the customer, vendor or your company code. + The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. + + + + + + + Indicates that all data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. + + + + + Specifies an additional master record in which the official address is stored. + This address is used in Italy for business transactions with the tax office in Italy. + + + + + An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. + The industry field belongs to the general data area of customer and vendor master records. + + + + + Here you enter the first 7 digits of the international location number. + The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). + + + + + Here, you enter digits 8-12 of the 13-digit international location number. + The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). + + + + + The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. + + + + + + Denotes a natural person. + In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. + + + + + Classification of companies according to tax aspects. + + + + + + Date up to which the certification of the QM-system is valid. + + + + + + If a QM system is maintained by the supplier, you can store a description of the QM system here. + If a material is activated for QM in procurement, the system initiates the following check whenever purchasing functions are carried out (for example, when a request for a quotation is made or if a purchase order is created):Whether the supplier's verified QM system, according to supplier master record or quality info record (for a combination of supplier/material) meets the requirements for QM systems as specified in the material master.When carrying out the check, the system relies on the defined assignments for target QM systems and actual QM systems in the Customizing application. When carrying out the check, the system relies on the assignments for target QM systems and actual QM systems defined in the configuration.If the check is unsuccessful, a warning message is issued when a request for quotation is initiated and an error message is issued for all other procurement activities. + + + + + If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. + If you create a matchcode using this group key, group evaluations are possible. + + + + + Key that determines which procurement functions (for example, request for quotation, purchase order, or goods receipt) should be blocked for quality reasons. + You can enter a block key in the:Supplier master recordIn this case, the supplier block applies to all materials and plants.Quality info record for QM in procurementIn this case, the supplier block applies to a single material and plant.A block for quality reasons applies only to those materials for which QM in procurement is active. + + + + + Specifies the tax number. + Enter the appropriate tax number:Country/Region Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N + + + + + Specifies the tax number. + Enter the appropriate tax number:Country/Region Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberNorway Organization registration numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number + + + + + Specifies the tax number. + Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number + + + + + Specifies the tax number. + Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) + + + + + Kazakhstan + Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. + + + + + The tax number of the vendor at the responsible tax authority. + + + + + + Taxes in Argentina: + The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. + + + + + This indicator controls the process of proof of delivery during the incoming goods process for inbound deliveries. Processing is activating by switching on this indicator in the supplier master and by switching on the corresponding indicator in the delivery item category. + There are the following different characteristics:' ': not relevant for POD'A': generally relevant for POD'B': only relevant for POD if differences(Difference between notified quantity and actual quantity received) + + + + + Tax calculation for Brazil: + The IPI tax value is split up for this vendor. 50% of the calculated IPI tax value is posted as deductible input tax, 50% is deducted from the inventory posting or posting to expense account. + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + Block key (enqueue key) that is used to block an open item or an account to payment transactions. + You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in the configuration step Change Message Control, udter Finance -> Localization -> General Settings.Release for PaymentIf you want to use a block key for payment release in accounting, then you have to set the attribute Not Changeable for the block key. You make this setting in the configuration step Control Payment Block Reasons, under Finance -> Accounts Payable -> General Payment Settings. + + + + + Indicates that the account is blocked for posting in the specified company code. + If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. + + + + + Identification code for the accounting clerk. + The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). + + + + + + + Name or identification code of the accounting clerk at the vendor. + + + + + + + List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. + If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Indicates that during automatic payment transactions, clearing is made with the corresponding customer account, and that during manual clearing procedures, the items of that customer account are also selected. + To use this function in automatic payment transactions, you have toenter the customer account number in the vendor master record,enter the vendor account number in the customer master record, andselect the "Clearing with vendor" indicator in the customer master record.If this indicator is set, items belonging to the customer account will be included in any dunning run. + + + + + Indicates that payment transactions and dunning notices are created for the branch. + Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. + + + + + If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. + + + + + + This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. + + + + + + All bank data is determined using this key. + + + + + + Number of days which usually pass until the vendor has cashed your check. + During automatic payment transactions, the system calculates the value date for check payments using this information and stores the date in the line item. The date is calculated as follows:Value date = posting date + check cashing timeIn Cash Management, the value date is used as information about the expected cash outflow. + + + + + Currency key for amounts in the system. + + + + + + Maximum amount which may be issued on a bill of exchange if it is to be used in payment transactions with the business partner. + The amount limit is taken into consideration in automatic payment transactions for payments by bill of exchange and bill of exchange payment requests. Several bill of exchange forms are created if the amount to be settled is higher than the maximum amount given here. Each of these bills of exchange is issued for the maximum amount or for a smaller amount.Amount limits for bills of exchange are used in Spain, for example. + + + + + This field contains the account number the company is listed under at the vendor. + + + + + + The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). + For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. + + + + + You enter an interest indicator here if you want the business partner to be included in automatic interest calculation. + + + + + + The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. + Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. + + + + + An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. + Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. + + + + + This field contains the account number of the master record for the head office account. + You specify this account number only for branch accounts. Items that you post using the branch account number are automatically posted to the head office account. The system records the branch account number in the line items.Neither transactions nor balances are kept in the branch account. + + + + + The account number of the vendor with whom automatic payment transactions are to be carried out. + The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies only to the company code. There is a further field in which you can enter an alternative payee for each company code. If both fields are filled, the company code specified has priority. + + + + + Indicates the layout rule for the Allocation field in the document line item. + The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. + + + + + Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. + + + + + + US government requirement. + Date field in which to enter certification date for small companies run by women or minorities. This certificate must be renewed every two years. + + + + + Internal memo of the accounting department. + The memo serves only as information on special features of the customer/vendor. + + + + + In some countries, an additional country is needed for calculating or reporting withholding tax. + The calculation can depend on the payee's country.A particular country key can be required by law for reporting which may possibly be different to the key used in the address.Examples: Japan, USA (1042), Argentina + + + + + Indicates that the company code data in this master record is to be deleted. + To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. + + + + + In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. + You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... + + + + + When incoming invoices are entered or when memos are entered in Financial Accounting (FI), the system checks whether an invoice or credit memo has already been entered for the same date. + Checking Logistics DocumentsThe system checks whether the invoice documents have already been entered in the Logistics invoice verification. For this, the system checks invoices that have been held or parked or that contain errors, or invoices that were entered for invoice verification in the background. The check is performed only if you specify the reference document number when you enter the invoices.When checking for duplicate invoices, the system compares the following specified characteristics:VendorCurrencyCompany CodeGross Invoice AmountReference Document NumberInvoice Document DateIf all of these characteristics are the same, the system issues a message for which you can change the message type in Customizing.When you enter credit memos or subsequent adjustments, the system does not check for duplicate invoices.Exception: For Argentina, invoices and credit memos are checked for duplicates.No message is issued if you enter a document that has previously been reversed.In Customizing for Logistics Invoice Verification under Incoming Invoice -> Set Check for Duplicate Invoices, you can specify that the following characteristics are not checked:Reference Document NumberInvoice Document DateCompany CodeHaving fewer attributes to check increases the likelihood that the system will find a duplicate invoice.Example:The following document has already been entered and posted:Reference Document Number 333Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: ChicagoYou have set up the check for duplicate invoices as follows in Customizing:The characteristics Reference Document Number and Company Code are not activated. Consequently, these characteristics are not checked.Now you enter the following invoice:Reference Document Number 334Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: FlagstaffResultBecause you entered a reference document when you entered the invoice, the system checks for duplicate invoices. Compared against the invoice entered earlier, the invoice just entered has different values in the characteristics Reference and Company Code. However, these characteristics are not checked due to the settings that you have made in Customizing. All other characteristics are the same. The system issues a message telling you that an invoice has been entered twice.If the characteristic "Reference Document Number" had been selected in Customizing, the system would have checked the reference document number and established that it was different from the invoice entered earlier, and it consequently would not have issued a message.Checking FI DocumentsThe system checks whether there are FI documents that were posted or parked with the Logistics invoice verification or with an FI invoice transaction. Depending on the entry in the Reference field, one of the following checks is performed:If a reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateReference NumberIf no reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateAmount in Document CurrencyIn Materials Management, the system applies the check for duplicate invoices for invoices only, not for credit memos. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. + If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. + + + + + Key which reflects the reason for a dunning block indicator. + + + + + + Number that specifies how often an item or account has been dunned. + The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. + + + + + This field contains the key for the dunning procedure to be used. + + + + + + Account number of the vendor who is to receive the dunning notice. + Note:If an entry is not made in this field, the dunning notice is sent to the address of the vendor to be processed. + + + + + Date on which the last dunning notice was made. + + + + + + Date on which a legal dunning procedure was initiated. + The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. + + + + + Identification code for the accounting clerk dealing with dunning letters. + Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + Denotes the purchasing organization. + + + + + + Subdivision of a supplier's overall product range according to various criteria. + For each supplier sub-range:The master data is kept on a common basisCertain conditions applyIn the supplier master, you can create different purchasing data and different partner functions for each supplier sub-range.You can also maintain and change the conditions for each supplier sub-range. You assign a material to a supplier sub-range in the info record.In the supplier master, you can maintain different data for particular supplier sub-ranges, such as ordering addresses or terms of payment, for example.When creating a purchase order with a known supplier, different data is only determined if the supplier sub-range is entered in the initial screen.Your supplier Smith in Houston has two sub-ranges: paint and glue.All materials from the "paint" sub-range are ordered in Houston.You have maintained an alternative ordering address in Detroit for the "glue" sub-range.If you order materials from the "glue" sub-range, the supplier sub-range finds the Detroit ordering address. + + + + + Key uniquely identifying a plant. + + + + + + The abbreviated form of the name that identifies the partner function. + + + + + + The sequential number that the system applies when there is more than one partner for a particular partner function. + When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. + + + + + Specifies a partner as the default for a particular partner function. + When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. + + + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + Alphanumeric key uniquely identifying the document. + With the supplier number, information from the supplier master record (such as the supplier's address and bank details) is copied into a purchasing document (such as a request for quotation or a purchase order).You can use the supplier number to keep track of requests for quotation, purchase orders and outline agreements. + + + + + Denotes the purchasing organization. + + + + + + Determines which calculation schema (pricing procedure) is to be used in purchasing documents containing this supplier number. + You can use the schema group to specify the calculation schema per purchasing organization or supplier. The relevant calculation schema is determined by reference to the schema group.The effect of this is that the conditions to be maintained in a purchasing document can differ depending on the relevant purchasing organization or supplier.If a calculation schema is only to be valid for certain purchasing organizations or suppliers, proceed as follows:Define the schema group for the purchasing organization or the supplier using the relevant function in the menu "Calculation schema -> Schema groups".Assign the schema group to the calculation schema via "Calculation schema -> Determine schema".Enter the schema group for the supplier in the supplier master records to which the calculation schema is to be assigned. Assign the schema group of the purchasing organization to the relevant purchasing organization using "Calculation schema -> Schema group -> Assign to purch. org.". + + + + + Indicates whether or not the supplier master record is earmarked for deletion. + + + + + + Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). + Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. + + + + + Additional information for the primary Incoterm. + If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). + + + + + An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). + + + + + + Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: + 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. + + + + + Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: + No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination + + + + + Indicator specifying that provision has been made for goods-receipt-based invoice verification for a purchase order item or invoice item. + + + + + + Number of calendar days needed to obtain the material or service if it is procured externally. + If you have different vendors for a material, you must specify an average value. The same applies if you order the material from a fixed vendor that has varying delivery times.If you use the SAP Retail System, the planned delivery time can be suggested from the vendor sub-range in the vendor master record. + + + + + Minimum value specified for purchase orders issued to the relevant supplier. + + + + + + Key for defining payment terms composed of cash discount percentages and payment periods. + It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. + + + + + Determines which date is to be used for price determination (pricing) purposes. + Enter the key for the desired date.If you choose the date of goods receipt, for example, a new price will be determined upon the arrival of the goods, causing the item to be revaluated at this time.NoteIf you have chosen the delivery date as the date for price determination and an item contains several delivery dates (i.e. has a delivery schedule), the first delivery date (the delivery date specified in the first schedule line) is taken. + + + + + Allows you to automatically generate purchase orders from purchase requisitions if the requisition has been assigned to a supplier (source of supply). + If you want to use automatic conversion, note the following additional conditions:In the case of purchase requisitions for materials, you should also select the indicator Autom.purch.ord. in the Purchasing view in the material master record.In the case of purchase requisitions for services, you should also select the indicator Automatic creation of POs for service PReqs in Customizing for Services by choosing:IMG -> MM -> External Services Management -> Source Determination and Default Values- for Client or- for Purchasing Organization + + + + + Key for the currency on which an order placed with a supplier is based. + + + + + + Key for a buyer or a group of buyers, who is/are responsible for certain purchasing activities. + Internally, the purchasing group is responsible for the procurement of a material or a class of materials.Externally, it is the medium through which contacts with the vendor are maintained. + + + + + Indicates whether or not the supplier master record is blocked for the purchasing organization for posting purposes. + + + + + + General shipping strategy for the delivery of goods from the vendor to the customer. + You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. + + + + + Means of classifying suppliers according to their significance to your company. + The indicator serves to assign the supplier to one of the categories A, B or C, in accordance with ABC analysis.'A' category suppliers, for instance, are those accounting for the greatest share of the company's total annual spend (in value terms). + + + + + This telephone number is maintained in the supplier master record and adopted in the purchasing document. + + + + + + The name of a contact on the supplier side can be freely maintained. + There is no relation to any other data in the system, for examplebusiness partner. + + + + + Determines which confirmation categories are expected for a PO item (e.g. order acknowledgment, shipping notification). + + + + + + Determines whether the purchasing document (purchase order, outline purchase agreement, etc.) is to be acknowledged by the supplier. + + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + The account group is a classifying feature within vendor master records. The account group determines: + the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. + + + + + + + + + + + + + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). + + + + + + The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: + ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. + + + + + + + + + + + + + Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. + + + + + + The company code is an organizational unit within financial accounting. + + + + + + This indicator is used to classify the different types of withholding tax. + Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. + + + + + Date from which withholding tax exemption applies. + + + + + + Date on which withholding tax exemption expires. + + + + + + Indicator used to classify different types of exemption from liability to a particular withholding tax. + These indicators can be defined per withholding tax type in the vendor master record. + + + + + + The type of recipient can be defined in the vendor master record. + It is used to group vendors together according to particular characteristics such as occupations that may be subject to the same withholding tax type, but which are required to pay different percentage rates (as defined by the withholding tax code).Application in ThailandThis corresponds to the official Thai form number (Phaw.Ngor.Daw) and is used to determine the sequential numbering of a withholding tax certificate. The form number is defined in the vendor master record. + + + + + Numbered assigned by the relevant authorities for exemption from withholding tax. + This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. + + + + + One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. + Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. + + + + + Rate of exemption from withholding tax. + Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. + + + + + This is a number issued by the tax authorities per withholding tax type. + This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. + + + + + The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + aggregate + groupby + filter + + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + LongText + + + + + + + + + LongText + LongText + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv b/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv new file mode 100644 index 00000000..8a0e4b4a --- /dev/null +++ b/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv @@ -0,0 +1,3 @@ +BusinessPartner;BusinessPartnerFullName;BusinessPartnerType +11;Alice Wonder;CUSTOMER; +9980000082;Hugo Hollandaise;CUSTOMER \ No newline at end of file diff --git a/notes/srv/notes-service.cds b/notes/srv/notes-service.cds new file mode 100644 index 00000000..80e1a14b --- /dev/null +++ b/notes/srv/notes-service.cds @@ -0,0 +1,13 @@ +using sap.capire.notes from '../db/data-model'; +using { Suppliers as MashupSuppliers } from '../db/mashup'; +using { API_BUSINESS_PARTNER as BusinessPartner } from './external/API_BUSINESS_PARTNER.csn'; + +/** + * Notes Service + * + * Maintain notes for suppliers + */ +service NotesService { + entity Notes as projection on notes.Notes; + entity Suppliers as projection on MashupSuppliers; +} \ No newline at end of file diff --git a/notes/srv/notes-service.js b/notes/srv/notes-service.js new file mode 100644 index 00000000..edb29787 --- /dev/null +++ b/notes/srv/notes-service.js @@ -0,0 +1,61 @@ +const cds = require("@sap/cds"); + +const s4apiKey = process.env.S4_APIKEY; +if (!s4apiKey && cds.env.profiles.indexOf("sandbox") >= 0) { + console.error( + "[ERROR] Provide API Key in env var S4_APIKEY for S/4 Sandbox: https://api.sap.com/api/API_BUSINESS_PARTNER/resource -> Show API Key" + ); + process.exit(1); +} + +module.exports = cds.service.impl(async function () { + const { Notes, Suppliers } = this.entities; + + const bpService = await cds.connect.to("API_BUSINESS_PARTNER"); + + // REVISIT: This is a workaround for the missing capability to add headers to the service + const bpServiceDelegate = { + run: query => bpService.send({ query, headers: { APIKey: s4apiKey } }) + }; + + // Suppliers?$expand=notes + this.on("READ", Suppliers, async (req, next) => { + const expandIndex = req.query.SELECT.columns.findIndex( + ({ expand, ref }) => expand && ref[0] === "notes" + ); + if (expandIndex < 0) return next(); + + req.query.SELECT.columns.splice(expandIndex, 1); + if (!req.query.SELECT.columns.find( + column => column.ref.find((ref) => ref == "ID")) + ) + req.query.SELECT.columns.push({ ref: ["ID"] }); + + const suppliers = await next(); + + // Request all associated notes + const supplierIds = suppliers.map((supplier) => supplier.ID); + const notes = await this.run(SELECT.from(Notes).where({ supplier_ID: supplierIds })); + + // Convert in a map for easier lookup + const notesForSuppliers = {}; + for (const note of notes) { + if (!notesForSuppliers[note.supplier_ID]) notesForSuppliers[note.supplier_ID] = []; + notesForSuppliers[note.supplier_ID].push(note); + } + + // Add notes to result + for (const supplier of suppliers) { + const notesForSupplier = notesForSuppliers[supplier.ID]; + if (notesForSupplier) supplier.notes = notesForSupplier; + } + + return suppliers; + }); + + + this.on("READ", Suppliers, async req => { + return bpServiceDelegate.run(req.query); + }); + +}); diff --git a/package.json b/package.json index 2d034090..f97ae344 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "@capire/media": "./media", "@capire/orders": "./orders", "@capire/reviews": "./reviews", - "@capire/suppliers": "./suppliers" + "@capire/suppliers": "./suppliers", + "@capire/notes": "./notes" }, "devDependencies": { "chai": "^4.2.0", diff --git a/test/notes.test.js b/test/notes.test.js new file mode 100644 index 00000000..799edcc6 --- /dev/null +++ b/test/notes.test.js @@ -0,0 +1,176 @@ +const cds = require("@sap/cds/lib"); +const express = require("express"); +if (cds.User.default) cds.User.default = cds.User.Privileged; +// hard core monkey patch +else cds.User = cds.User.Privileged; // hard core monkey patch for older cds releases + +process.env.S4_APIKEY = "-"; + + +const BPs = { + "@odata.context": "$metadata#Suppliers", + value: [ + { + BusinessPartner: "11", + BusinessPartnerFullName: "Alice Wonder", + BusinessPartnerType: "CUSTOMER", + }, + { + BusinessPartner: "9980000082", + BusinessPartnerFullName: "Hugo Hollandaise", + BusinessPartnerType: "CUSTOMER", + }, + ], +}; + +const Suppliers = { + "@odata.context": "$metadata#Suppliers", + value: [ + { + ID: "11", + fullName: "Alice Wonder", + customerType: "CUSTOMER", + }, + { + ID: "9980000082", + fullName: "Hugo Hollandaise", + customerType: "CUSTOMER", + }, + ], +}; + +const SuppliersExpandNotes = { + "@odata.context": "$metadata#Suppliers", + value: [ + { + ID: "11", + fullName: "Alice Wonder", + customerType: "CUSTOMER", + notes: [ + { + ID: "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", + note: "note2 for 11", + supplier_ID: "11", + }, + { + ID: "D632D4EE-E772-454A-913E-26A7B8DAA7FB", + note: "note1 for 11", + supplier_ID: "11", + }, + ], + }, + { + ID: "9980000082", + fullName: "Hugo Hollandaise", + customerType: "CUSTOMER", + notes: [ + { + ID: "24B58115-E394-423B-BEAB-53419A32B927", + note: "note3", + supplier_ID: "9980000082", + }, + ], + }, + ], +}; + +class MockServer { + async start() { + const http = require('http'); + + this.app = express(); + this.server = http.createServer(this.app).listen(); + this.app.set('port', this.server.address().port); + + this.app.get("*", (req, res) => { + res.writeHead(200); + res.end(JSON.stringify(BPs)); + }); + } + + url() { + return `http://localhost:${this.server.address().port}`; + } + + close() { + this.server.close(); + } +} + +describe("Notes", () => { + const mockServer = new MockServer(); + + before( async () => { + mockServer.start(); + + cds.env.add({ + requires: { + API_BUSINESS_PARTNER: { + kind: "odata", + model: "srv/external/API_BUSINESS_PARTNER", + credentials: { + url: mockServer.url() + }, + }, + }, + }); + + }); + + const { expect, GET, PATCH } = require(".").run( + "serve", + "--project", + "notes", + "--with-mocks", + "--in-memory" + ); + + + it("get notes", async () => { + const { status, data } = await GET("/notes/Notes"); + + expect({ status, data }).to.containSubset({ + status: 200, + data: { + "@odata.context": "$metadata#Notes", + value: [ + { + ID: "24B58115-E394-423B-BEAB-53419A32B927", + note: "note3", + supplier_ID: "9980000082", + }, + { + ID: "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", + note: "note2 for 11", + supplier_ID: "11", + }, + { + ID: "D632D4EE-E772-454A-913E-26A7B8DAA7FB", + note: "note1 for 11", + supplier_ID: "11", + }, + ], + }, + }); + }); + + it("get remote suppliers", async () => { + const { status, data } = await GET("/notes/Suppliers"); + + expect({ status, data }).to.containSubset({ + status: 200, + data: Suppliers, + }); + }); + + it("get remote suppliers with notes", async () => { + const { status, data } = await GET("/notes/Suppliers?$expand=notes"); + + expect({ status, data }).to.containSubset({ + status: 200, + data: SuppliersExpandNotes, + }); + }); + + after(() => mockServer.close()); +}); From 7ae992c5bb3f1362c3063e72948b213e2fd9af97 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Tue, 11 May 2021 12:10:25 +0200 Subject: [PATCH 056/100] Implement generic expand and navigation feature --- notes/srv/RemoteHandler.js | 252 +++++++++++++++++++++++++++++++++++++ notes/srv/notes-service.js | 14 +++ test/notes.test.js | 10 ++ 3 files changed, 276 insertions(+) create mode 100644 notes/srv/RemoteHandler.js diff --git a/notes/srv/RemoteHandler.js b/notes/srv/RemoteHandler.js new file mode 100644 index 00000000..f231f077 --- /dev/null +++ b/notes/srv/RemoteHandler.js @@ -0,0 +1,252 @@ +function getEntity(absoluteName) { + const [serviceName, entityName] = absoluteName.split("."); + return cds.services[serviceName].entities[entityName]; +} + +function fixColumnName(entity, name) { + const fullName = `${entity.name}.${name}`; + return RemoteHandler.columnNameFixes[fullName] || name; +} + +function associationLink(entity, associationName) { + const association = entity.associations[associationName]; + const cardinalityMax = association.cardinality && association.cardinality.max; + if (!association) + throw new Error( + `Association "${associationName}" does not exists for entity "${entity.name}".` + ); + if (association.keys) { + return associationKey(entity, association); + } + + if (association.on && association.on.length === 3 && association.on[0].ref[0] === associationName && association.on[1] === "=" ) { + const keyFieldName = fixColumnName(entity, association.on[2].ref[0]); + const targetKeyFieldName = association.on[0].ref.slice(1).join("_"); + return [keyFieldName, targetKeyFieldName, association.target, cardinalityMax]; + } + + if (association.on) { + const { reverseAssociationName } = associationOn(entity, association); + const targetEntity = getEntity(association.target); + const reverseAssociation = + targetEntity.associations[reverseAssociationName]; + const [targetKeyFieldName, keyFieldName] = associationKey( + targetEntity, + reverseAssociation + ); + return [keyFieldName, targetKeyFieldName, association.target, cardinalityMax]; + } + + throw new Error( + `Association "${associationName}" of entity "${entity.name}" has no "on" and no "keys".` + ); +} + +function associationOn(entity, association) { + if ( + !association.on.length === 3 || + association.on[1] !== "=" || + association.on[2].ref[0] !== "$self" + ) + throw new Error( + `Association "${association.name}" for "${entity.name}" has not the expected form.` + ); + + const reverseAssociationName = association.on[0].ref[1]; + const [targetServiceName, targetEntityName] = association.target.split("."); + return { targetServiceName, targetEntityName, reverseAssociationName }; +} + +function associationKey(entity, association) { + const key = association.keys && association.keys[0]; + if (!key) + throw new Error( + `Association "${association.name}" for entity "${entity.name}" has no keys.` + ); + return [key["$generatedFieldName"], key.ref[0], association.target, association.cardinality.max]; +} + +class RemoteHandler { + constructor(service, remoteEntities) { + + this.service = service; + this.remoteEntities = remoteEntities; + } + + serviceFor(entityName) { + return this.remoteEntities[entityName] || this.service; + } + + /** + * Expand "to one" associations with a single key field + * + * @param {*} req + * @param {*} next + * @param {*} associationName + * @param {*} targetService + * @param {*} headers + * @returns + */ + async mixinExpand(req, result, expand) { + const associationName = expand.ref[0]; + + // Get association target + const [keyFieldName, targetKeyFieldName, targetEntityName, cardinalityMax] = + associationLink(req.target, associationName); + + // Request all associated entities + // REVISIT: Still needed? + //const mock = !cds.env.requires.API_BUSINESS_PARTNER.credentials; + //const tx = mock ? BupaService.tx(req) : BupaService; + let ids = []; + if (Array.isArray(result)) { + ids = result.map((entry) => entry[keyFieldName]); + } else { + ids = [result[keyFieldName]]; + } + + // Take over columns from original query + const expandColumns = expand.expand.map((entry) => entry.ref[0]); + if (expandColumns.indexOf(targetKeyFieldName) < 0) + expandColumns.push(targetKeyFieldName); + + const targetService = this.serviceFor(targetEntityName); + + // Select target + const targetQuery = SELECT.from(targetEntityName) + .where({ [targetKeyFieldName]: ids }) + .columns(expandColumns); + const targetResult = await targetService.run(targetQuery); + + let targetResultMap; + + switch (cardinalityMax) { + case '1': + targetResultMap = this.mixinExpand_to_1(targetResult, targetKeyFieldName); + break; + case '*': + targetResultMap = this.mixinExpand_to_many(targetResult, targetKeyFieldName); + break; + default: + throw new Error(`Association with cardinality may ${cardinalityMax} is not supported.`); + } + + const resultArray = Array.isArray(result) ? result : [ result ]; + for (const entry of resultArray) { + const id = entry[keyFieldName]; + const targetEntry = targetResultMap[id]; + if (targetEntry) entry[associationName] = targetEntry; + } + } + + mixinExpand_to_1(targetResult, targetKeyFieldName) { + const targetResultMap = {}; + for (const targetEntry of targetResult) { + const id = targetEntry[targetKeyFieldName]; + targetResultMap[id] = targetEntry; + } + + return targetResultMap; + } + + mixinExpand_to_many(targetResult, targetKeyFieldName) { + const targetResultMap = {}; + for (const targetEntry of targetResult) { + const id = targetEntry[targetKeyFieldName]; + if (!targetResultMap[id]) targetResultMap[id] = []; + targetResultMap[id].push(targetEntry); + } + + return targetResultMap; + } + + async resolveNavigation(req, next) { + const select = req.query.SELECT; + if (select.from.ref.length !== 2) { + throw new Error( + `Unsupported navigation query with different than 2 entities in FROM clause.` + ); + } + + // Get target + const entityName = select.from.ref[0].id; + const entity = getEntity(entityName); + + const [keyFieldName, targetKeyFieldName, targetEntityName] = + associationLink(entity, select.from.ref[1]); + + const sourceService = this.serviceFor(entityName); + const targetService = this.serviceFor(targetEntityName); + + const selectOne = SELECT.one([keyFieldName]) + .from(entityName) + .where(select.from.ref[0].where); + const entry = await sourceService.run(selectOne); + + const selectTarget = SELECT(req.query.SELECT.columns) + .from(targetEntityName) + .where({ [targetKeyFieldName]: entry[keyFieldName] }); + return await targetService.run(selectTarget); + } + + async handle(req, next) { + let doRequest; + + if ( + req.query.SELECT.from.ref.length > 1 && + req.target.name !== req.query.SELECT.from.ref[0] + ) { + doRequest = () => this.resolveNavigation(req, next) + } else { + const targetService = this.serviceFor(req.target.name); + doRequest = targetService === this.service ? + next : () => targetService.run(req.query) + } + + return this.resolveExpands(req, doRequest); + } + + async resolveExpands(req, next) { + const select = req.query.SELECT; + const expandFilter = (column) => { + if (!column.expand) return false; + const associationName = column.ref[0]; + const associationTargetName = + req.target.associations[associationName].target; + return ( + this.remoteEntities[associationTargetName] !== + this.remoteEntities[req.target.name] + ); + }; + + const expands = select.columns.filter(expandFilter); + select.columns = select.columns.filter((column) => !expandFilter(column)); + + if (expands.length === 0) return next(); + + for (const expand of expands) { + const associationName = expand.ref[0]; + const [keyFieldName] = associationLink(req.target, associationName); + + // Make sure id property is contained in select + if ( + !select.columns.find((column) => + column.ref.find((ref) => ref == keyFieldName) + ) + ) + select.columns.push({ ref: keyFieldName }); + } + + // Call service implementation + const result = await next(); + + await Promise.all( + expands.map((expand) => this.mixinExpand(req, result, expand)) + ); + + return result; + } +} + +RemoteHandler.columnNameFixes = {}; +module.exports = RemoteHandler; diff --git a/notes/srv/notes-service.js b/notes/srv/notes-service.js index edb29787..3930af7c 100644 --- a/notes/srv/notes-service.js +++ b/notes/srv/notes-service.js @@ -1,5 +1,7 @@ const cds = require("@sap/cds"); +const RemoteHandler = require('./RemoteHandler'); + const s4apiKey = process.env.S4_APIKEY; if (!s4apiKey && cds.env.profiles.indexOf("sandbox") >= 0) { console.error( @@ -13,11 +15,21 @@ module.exports = cds.service.impl(async function () { const bpService = await cds.connect.to("API_BUSINESS_PARTNER"); + // TODO: This seems to be a bug in the compiler + RemoteHandler.columnNameFixes = { ["NotesService.Suppliers.BusinessPartner"]: "ID" }; + // REVISIT: This is a workaround for the missing capability to add headers to the service const bpServiceDelegate = { run: query => bpService.send({ query, headers: { APIKey: s4apiKey } }) }; + const remoteHandler = new RemoteHandler(this, { [Suppliers.name]: bpServiceDelegate }); + + this.on("READ", Suppliers, (req, next) => remoteHandler.handle(req, next) ); + this.on("READ", Notes, (req, next) => remoteHandler.handle(req, next) ); + + + /* // Suppliers?$expand=notes this.on("READ", Suppliers, async (req, next) => { const expandIndex = req.query.SELECT.columns.findIndex( @@ -58,4 +70,6 @@ module.exports = cds.service.impl(async function () { return bpServiceDelegate.run(req.query); }); + */ + }); diff --git a/test/notes.test.js b/test/notes.test.js index 799edcc6..2b7b4c66 100644 --- a/test/notes.test.js +++ b/test/notes.test.js @@ -172,5 +172,15 @@ describe("Notes", () => { }); }); + it("get notes via navigation", async () => { + const { status, data } = await GET("/notes/Suppliers('11')/notes"); + + expect({ status, data }).to.containSubset({ + status: 200, + data: {value: SuppliersExpandNotes.value[0].notes }, + }); + }); + + after(() => mockServer.close()); }); From fb5d00bbe0449d4f9000c5f8afa9f6e84136096f Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 14 May 2021 08:55:17 +0200 Subject: [PATCH 057/100] Improved generic handler remote services --- notes/.eslintrc | 2 +- notes/srv/RemoteHandler.js | 301 ++++++++++++++++++++++++++----------- test/notes.test.js | 95 +++++++++--- 3 files changed, 289 insertions(+), 109 deletions(-) diff --git a/notes/.eslintrc b/notes/.eslintrc index 639d13a0..e80e8f52 100644 --- a/notes/.eslintrc +++ b/notes/.eslintrc @@ -6,7 +6,7 @@ "jest": true }, "parserOptions": { - "ecmaVersion": 2017 + "ecmaVersion": 2020 }, "globals": { "SELECT": true, diff --git a/notes/srv/RemoteHandler.js b/notes/srv/RemoteHandler.js index f231f077..8b1cceee 100644 --- a/notes/srv/RemoteHandler.js +++ b/notes/srv/RemoteHandler.js @@ -1,71 +1,33 @@ -function getEntity(absoluteName) { - const [serviceName, entityName] = absoluteName.split("."); - return cds.services[serviceName].entities[entityName]; -} - function fixColumnName(entity, name) { const fullName = `${entity.name}.${name}`; return RemoteHandler.columnNameFixes[fullName] || name; } -function associationLink(entity, associationName) { - const association = entity.associations[associationName]; - const cardinalityMax = association.cardinality && association.cardinality.max; - if (!association) - throw new Error( - `Association "${associationName}" does not exists for entity "${entity.name}".` - ); - if (association.keys) { - return associationKey(entity, association); - } - - if (association.on && association.on.length === 3 && association.on[0].ref[0] === associationName && association.on[1] === "=" ) { - const keyFieldName = fixColumnName(entity, association.on[2].ref[0]); - const targetKeyFieldName = association.on[0].ref.slice(1).join("_"); - return [keyFieldName, targetKeyFieldName, association.target, cardinalityMax]; - } - - if (association.on) { - const { reverseAssociationName } = associationOn(entity, association); - const targetEntity = getEntity(association.target); - const reverseAssociation = - targetEntity.associations[reverseAssociationName]; - const [targetKeyFieldName, keyFieldName] = associationKey( - targetEntity, - reverseAssociation - ); - return [keyFieldName, targetKeyFieldName, association.target, cardinalityMax]; - } - - throw new Error( - `Association "${associationName}" of entity "${entity.name}" has no "on" and no "keys".` - ); +/** + * + * @param {string} msg + * @returns {never} + */ +function throwError(msg) { + throw new Error(msg); } -function associationOn(entity, association) { - if ( - !association.on.length === 3 || - association.on[1] !== "=" || - association.on[2].ref[0] !== "$self" - ) - throw new Error( - `Association "${association.name}" for "${entity.name}" has not the expected form.` - ); - - const reverseAssociationName = association.on[0].ref[1]; - const [targetServiceName, targetEntityName] = association.target.split("."); - return { targetServiceName, targetEntityName, reverseAssociationName }; +/** + * @param {{name: string}|string} entity + * @param {{name: string}|string} association + * @param {string} msg + * @returns {never} + */ +function throwAssocError(entity, association, msg) { + throw new Error(`Error with association "${association.name || association}" of entity "${entity.name || entity}": ${msg}`); } -function associationKey(entity, association) { - const key = association.keys && association.keys[0]; - if (!key) - throw new Error( - `Association "${association.name}" for entity "${entity.name}" has no keys.` - ); - return [key["$generatedFieldName"], key.ref[0], association.target, association.cardinality.max]; +function getEntity(absoluteName) { + const [serviceName, entityName] = absoluteName.split("."); + return cds.services[serviceName]?.entities[entityName] || throwError(`Unknown entity "${absoluteName}"`); } + class RemoteHandler { constructor(service, remoteEntities) { @@ -91,8 +53,8 @@ class RemoteHandler { const associationName = expand.ref[0]; // Get association target - const [keyFieldName, targetKeyFieldName, targetEntityName, cardinalityMax] = - associationLink(req.target, associationName); + const {keyFieldName, targetKeyFieldName, target, is2many, is2one} = + this.association(req.target, associationName); // Request all associated entities // REVISIT: Still needed? @@ -110,25 +72,22 @@ class RemoteHandler { if (expandColumns.indexOf(targetKeyFieldName) < 0) expandColumns.push(targetKeyFieldName); - const targetService = this.serviceFor(targetEntityName); + const targetService = this.serviceFor(target.name); // Select target - const targetQuery = SELECT.from(targetEntityName) + const targetQuery = SELECT.from(target.name) .where({ [targetKeyFieldName]: ids }) .columns(expandColumns); const targetResult = await targetService.run(targetQuery); let targetResultMap; - switch (cardinalityMax) { - case '1': + if (is2one) { targetResultMap = this.mixinExpand_to_1(targetResult, targetKeyFieldName); - break; - case '*': + } else if (is2many) { targetResultMap = this.mixinExpand_to_many(targetResult, targetKeyFieldName); - break; - default: - throw new Error(`Association with cardinality may ${cardinalityMax} is not supported.`); + } else { + throwAssocError(req.target, associationName, `Unsupported cardinality.`); } const resultArray = Array.isArray(result) ? result : [ result ]; @@ -160,6 +119,27 @@ class RemoteHandler { return targetResultMap; } + /** + * @example + * Notes(24B58115-E394-423B-BEAB-53419A32B927)/supplier + * + * --> + * { SELECT: { from: { ref: {[ + * [ id: 'NotesService.Notes', + * where: [ + * ref: [ 'ID' ], + * '=', + * val: ''545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE' + * ], + * ], + * [ 'supplier' ] + * ]}}} + * + * + * @param {*} req + * @param {*} next + * @returns + */ async resolveNavigation(req, next) { const select = req.query.SELECT; if (select.from.ref.length !== 2) { @@ -168,26 +148,37 @@ class RemoteHandler { ); } - // Get target - const entityName = select.from.ref[0].id; + const entityName = select.from.ref[0].id || throwError(`Missing source entity name for navigation`); const entity = getEntity(entityName); + const associationName = select.from.ref[1] || throwError(`Missing association name for navigation`); - const [keyFieldName, targetKeyFieldName, targetEntityName] = - associationLink(entity, select.from.ref[1]); + const {keyFieldName, targetKeyFieldName, target, is2many, is2one} = this.association(entity, associationName); const sourceService = this.serviceFor(entityName); - const targetService = this.serviceFor(targetEntityName); + const targetService = this.serviceFor(target.name); - const selectOne = SELECT.one([keyFieldName]) + if (sourceService === targetService) return await next(); + + // REVISIT: How to call service datasource w/o handlers + const selectEntry = SELECT.one([keyFieldName]) .from(entityName) .where(select.from.ref[0].where); - const entry = await sourceService.run(selectOne); + const entry = await sourceService.run(selectEntry); + // REVISIT: How to call service datasource w/o handlers + // TODO: Seems not to respect filter for targetkeyFieldName const selectTarget = SELECT(req.query.SELECT.columns) - .from(targetEntityName) + .from(target) .where({ [targetKeyFieldName]: entry[keyFieldName] }); - return await targetService.run(selectTarget); - } + const result = await targetService.run(selectTarget); + if (is2many) { + return result; + } else if (is2one) { + return result?.[0]; + } else { + throw new Error('Unsupported association cardinality'); + } +} async handle(req, next) { let doRequest; @@ -198,25 +189,28 @@ class RemoteHandler { ) { doRequest = () => this.resolveNavigation(req, next) } else { - const targetService = this.serviceFor(req.target.name); - doRequest = targetService === this.service ? - next : () => targetService.run(req.query) + doRequest = this.isRemote(req.target.name) ? + () => this.serviceFor(req.target.name).run(req.query) : next; } return this.resolveExpands(req, doRequest); } + isRemote(entityName) { + return this.serviceFor(entityName) !== this.service; + } + + isSeparated(entityNameA, entityNameB) { + return this.serviceFor(entityNameA) !== this.serviceFor(entityNameB); + } + async resolveExpands(req, next) { const select = req.query.SELECT; const expandFilter = (column) => { if (!column.expand) return false; const associationName = column.ref[0]; - const associationTargetName = - req.target.associations[associationName].target; - return ( - this.remoteEntities[associationTargetName] !== - this.remoteEntities[req.target.name] - ); + + return this.isSeparated(req.target.name, req.target.associations[associationName].target); }; const expands = select.columns.filter(expandFilter); @@ -224,17 +218,20 @@ class RemoteHandler { if (expands.length === 0) return next(); + const temporaryKeyFieldNames = []; for (const expand of expands) { const associationName = expand.ref[0]; - const [keyFieldName] = associationLink(req.target, associationName); + const {keyFieldName} = this.association(req.target, associationName); // Make sure id property is contained in select if ( !select.columns.find((column) => column.ref.find((ref) => ref == keyFieldName) ) - ) + ) { select.columns.push({ ref: keyFieldName }); + temporaryKeyFieldNames.push(keyFieldName); + } } // Call service implementation @@ -244,8 +241,134 @@ class RemoteHandler { expands.map((expand) => this.mixinExpand(req, result, expand)) ); + if (temporaryKeyFieldNames.length > 0) { + for (const entry of result) { + for (const name of temporaryKeyFieldNames) + delete entry[name]; + } + } + return result; } + + association(entity, associationName, recursion = 0) { + let associationMetaData; + + if (++recursion > 2) throwAssocError(entity, association, "Association has recursive definition."); + + const association = entity.associations[associationName] || throwAssocError(entity, associationName, `Association does not exists`); + + associationMetaData = this.associationKey(entity, association); + if (!associationMetaData) { + associationMetaData = this.associationOn(entity, association); + } + if (!associationMetaData) { + associationMetaData = this.associationOnSelf(entity, association, recursion); + } + + if (!association) throwAssocError(entity, association, "Only associations with one key field or on conidition with one field are supported."); + + associationMetaData.is2many = association.is2many; + associationMetaData.is2one = association.is2one; + associationMetaData.entity = entity; + associationMetaData.target = getEntity(association.target); + return associationMetaData; + } + + /** + * Association with "on" condition + * + * @example + * entity Notes { + * supplier_ID : Suppliers:ID; + * supplier: Association to Suppliers on supplier.ID = supplier_ID; + * } + * + * --> + * + * { association: { on: { [ + * ref: [ 'supplier', 'ID' ], // . + * '=', + * ref: [ 'supplier_ID' ] // + * ] }}} + * + * @param {*} entity + * @param {*} association + * @returns + */ + associationOn(entity, association) { + const onLength = association.on?.length ?? 0; + if (onLength === 0) return; + + const on = association.on; + if (!(onLength === 3 && on[0]?.ref?.[0] === association.name && on[1] === "=" && on[2]?.ref[0] !== "$self")) return; //throwAssocError(entity, association, "Association on condition must compare to $self"); + + return { + keyFieldName: fixColumnName(entity, association.on[2].ref[0]), + targetKeyFieldName: association.on[0].ref.slice(1).join("_") + } + } + + /** + * + * @example + * extend entity BusinessPartner { + * notes: Composition of many Notes on notes = $self; + * } + * + * @param {*} entity + * @param {*} association + * @returns + */ + + associationOnSelf(entity, association, recursion) { + const onLength = association.on?.length ?? 0; + if (onLength === 0) return; + + const on = association.on; + if (!(onLength === 3 && on[0]?.ref && on[1] === "=" && on[2]?.ref[0] === "$self")) return; //throwAssocError(entity, association, "Association on condition must compare to $self"); + + const reverseAssociationName = association.on[0].ref[1]; + const reverseAssociationMetaData = this.association(targetEntity, reverseAssociationName, false); + + return { + keyFieldName: reverseAssociationMetaData.targetKeyFieldName, + targetKeyFieldName: reverseAssociationMetaData.keyFieldName + } + } + + /** + * Association with keys + * + * @example + * entity Notes { + * supplier: Association to Suppliers; + * } + * + * --> + * + * { association: keys: [ { + * $generatedFieldName: 'supplier_ID', + * ref: [ 'ID' ] + * } ] + * } + * + * @param {*} entity + * @param {*} association + * @returns + */ + associationKey(entity, association) { + const keyLength = association.keys?.length ?? 0; + if (keyLength === 0) return; + if (keyLength > 1) throwAssocError(entity, association, `Association has ${keyLength} key fields, but only 1 is supported.`); + const key = association.keys[0]; + + return { + keyFieldName: key["$generatedFieldName"] || throwError(entity, association, "Missing $generatedFieldName"), + targetKeyFieldName: key.ref[0] || throwError(entity, association, "Missing key ref") + } + } + } RemoteHandler.columnNameFixes = {}; diff --git a/test/notes.test.js b/test/notes.test.js index 2b7b4c66..14b2c30f 100644 --- a/test/notes.test.js +++ b/test/notes.test.js @@ -4,12 +4,21 @@ if (cds.User.default) cds.User.default = cds.User.Privileged; // hard core monkey patch else cds.User = cds.User.Privileged; // hard core monkey patch for older cds releases +// TODO: remove hack process.env.S4_APIKEY = "-"; +const envelope = (entity, value) => { + const result = {"@odata.context": entity.match(/\$metadata/) ? entity : `$metadata#${entity}`}; -const BPs = { - "@odata.context": "$metadata#Suppliers", - value: [ + if (Array.isArray(value)) { + result.value = value; + } else { + Object.assign(result, value); + } + return result; +} + +const BPs = [ { BusinessPartner: "11", BusinessPartnerFullName: "Alice Wonder", @@ -20,12 +29,9 @@ const BPs = { BusinessPartnerFullName: "Hugo Hollandaise", BusinessPartnerType: "CUSTOMER", }, - ], -}; +]; -const Suppliers = { - "@odata.context": "$metadata#Suppliers", - value: [ +const Suppliers = [ { ID: "11", fullName: "Alice Wonder", @@ -36,12 +42,9 @@ const Suppliers = { fullName: "Hugo Hollandaise", customerType: "CUSTOMER", }, - ], -}; + ]; -const SuppliersExpandNotes = { - "@odata.context": "$metadata#Suppliers", - value: [ +const SuppliersExpandNotes = [ { ID: "11", fullName: "Alice Wonder", @@ -71,8 +74,40 @@ const SuppliersExpandNotes = { }, ], }, - ], -}; + ]; + +const NotesExpandSuppliers = [ + { + "ID": "24B58115-E394-423B-BEAB-53419A32B927", + "note": "note3", + "supplier_ID": "9980000082", + "supplier": { + "ID": "9980000082", + "fullName": "Hugo Hollandaise", + "customerType": "CUSTOMER" + } + }, + { + "ID": "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", + "note": "note2 for 11", + "supplier_ID": "11", + "supplier": { + "ID": "11", + "fullName": "Alice Wonder", + "customerType": "CUSTOMER" + } + }, + { + "ID": "D632D4EE-E772-454A-913E-26A7B8DAA7FB", + "note": "note1 for 11", + "supplier_ID": "11", + "supplier": { + "ID": "11", + "fullName": "Alice Wonder", + "customerType": "CUSTOMER" + } + } + ]; class MockServer { async start() { @@ -97,12 +132,15 @@ class MockServer { } } +if (!global.beforeAll) global.beforeAll = global.before; + describe("Notes", () => { const mockServer = new MockServer(); - before( async () => { + beforeAll( async () => { mockServer.start(); + // TODO: Need better solution. Does it conflict with other tests? cds.env.add({ requires: { API_BUSINESS_PARTNER: { @@ -159,7 +197,7 @@ describe("Notes", () => { expect({ status, data }).to.containSubset({ status: 200, - data: Suppliers, + data: envelope("Suppliers", Suppliers) }); }); @@ -168,7 +206,7 @@ describe("Notes", () => { expect({ status, data }).to.containSubset({ status: 200, - data: SuppliersExpandNotes, + data: envelope('Suppliers(notes())', SuppliersExpandNotes), }); }); @@ -177,10 +215,29 @@ describe("Notes", () => { expect({ status, data }).to.containSubset({ status: 200, - data: {value: SuppliersExpandNotes.value[0].notes }, + data: envelope('../$metadata#Notes', SuppliersExpandNotes[0].notes) }); }); + it("get notes with suppliers", async () => { + const { status, data } = await GET("/notes/Notes?$expand=supplier"); + + expect({ status, data }).to.containSubset({ + status: 200, + data: envelope('Notes(supplier())', NotesExpandSuppliers) + }); + }); + + // TODO: Seems not to respect filter for targetkeyFieldName +/* + it.only("get supplier via navigation", async () => { + const { status, data } = await GET("/notes/Notes(545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE)/supplier"); + expect({ status, data }).to.containSubset({ + status: 200, + data: envelope("Suppliers", NotesExpandSuppliers[0].supplier ) + }); + }); +*/ after(() => mockServer.close()); }); From 254bb40e38d26614ac4c82a3c55cf8ad9fa205d2 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 19 May 2021 10:22:52 +0200 Subject: [PATCH 058/100] Remove monkey patch and profile destination --- suppliers/monkey-patch.js | 3 +++ suppliers/package.json | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/suppliers/monkey-patch.js b/suppliers/monkey-patch.js index 139502ad..0696705d 100644 --- a/suppliers/monkey-patch.js +++ b/suppliers/monkey-patch.js @@ -2,6 +2,7 @@ const deploy = require("@sap/cds/lib/deploy"); // TODO: https://github.wdf.sap.corp/cdx/cds/pull/1949 +/* const DEBUG = (...args) => console.log(...args); deploy.exclude_external_entities_in = function (csn, _bound) { @@ -36,3 +37,5 @@ deploy.exclude_external_entities_in = function (csn, _bound) { } } }; + +*/ \ No newline at end of file diff --git a/suppliers/package.json b/suppliers/package.json index d523c66d..5bcec8ef 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -15,12 +15,13 @@ }, "cds": { "requires": { - "API_BUSINESS_PARTNER": { - "kind": "odata", - "model": "srv/external/API_BUSINESS_PARTNER", - "credentials": { - "destination": "blub", - "url": "http://localhost:3333" + "[with-destination]": { + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "srv/external/API_BUSINESS_PARTNER", + "credentials": { + "destination": "" + } } }, "[development]": { From 48ee934b00fad43cc5192d382220fbe341d144f1 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 19 May 2021 10:24:55 +0200 Subject: [PATCH 059/100] Only profile credentials --- suppliers/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/suppliers/package.json b/suppliers/package.json index 5bcec8ef..9be35291 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -15,10 +15,10 @@ }, "cds": { "requires": { - "[with-destination]": { - "API_BUSINESS_PARTNER": { - "kind": "odata", - "model": "srv/external/API_BUSINESS_PARTNER", + "API_BUSINESS_PARTNER": { + "kind": "odata", + "model": "srv/external/API_BUSINESS_PARTNER", + "[with-destination]": { "credentials": { "destination": "" } From 5b4210bb38655f10174558ae93f287a4a6775c5e Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 19 May 2021 11:37:04 +0200 Subject: [PATCH 060/100] Use "db" service to avoid double call of service handlers --- notes/srv/RemoteHandler.js | 6 ++++-- test/notes.test.js | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/notes/srv/RemoteHandler.js b/notes/srv/RemoteHandler.js index 8b1cceee..190b524f 100644 --- a/notes/srv/RemoteHandler.js +++ b/notes/srv/RemoteHandler.js @@ -36,7 +36,7 @@ class RemoteHandler { } serviceFor(entityName) { - return this.remoteEntities[entityName] || this.service; + return this.remoteEntities[entityName] || cds.db; } /** @@ -75,6 +75,7 @@ class RemoteHandler { const targetService = this.serviceFor(target.name); // Select target + // REVISIT: const targetResult = await targetService.read(target.name).where({ [targetKeyFieldName]: ids }).columns(expandColumns); const targetQuery = SELECT.from(target.name) .where({ [targetKeyFieldName]: ids }) .columns(expandColumns); @@ -166,6 +167,7 @@ class RemoteHandler { const entry = await sourceService.run(selectEntry); // REVISIT: How to call service datasource w/o handlers + // REVISIT: const result = await targetService.read(target).columns(req.query.SELECT.columns).where({ [targetKeyFieldName]: entry[keyFieldName] }); // TODO: Seems not to respect filter for targetkeyFieldName const selectTarget = SELECT(req.query.SELECT.columns) .from(target) @@ -197,7 +199,7 @@ class RemoteHandler { } isRemote(entityName) { - return this.serviceFor(entityName) !== this.service; + return this.serviceFor(entityName) !== cds.db; } isSeparated(entityNameA, entityNameB) { diff --git a/test/notes.test.js b/test/notes.test.js index 14b2c30f..8fa932a8 100644 --- a/test/notes.test.js +++ b/test/notes.test.js @@ -228,8 +228,9 @@ describe("Notes", () => { }); }); - // TODO: Seems not to respect filter for targetkeyFieldName -/* + // TODO: Seems not to respect filter for targetKeyFieldName + /* + it.only("get supplier via navigation", async () => { const { status, data } = await GET("/notes/Notes(545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE)/supplier"); expect({ status, data }).to.containSubset({ @@ -237,7 +238,8 @@ describe("Notes", () => { data: envelope("Suppliers", NotesExpandSuppliers[0].supplier ) }); }); -*/ + */ + after(() => mockServer.close()); }); From 9dfe62c5c762fcf3458d056765c7222fe9dfc238 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Thu, 20 May 2021 09:40:02 +0200 Subject: [PATCH 061/100] Fixed mocking for last test --- notes/srv/RemoteHandler.js | 1 - test/notes.test.js | 50 ++++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/notes/srv/RemoteHandler.js b/notes/srv/RemoteHandler.js index 190b524f..258a2e04 100644 --- a/notes/srv/RemoteHandler.js +++ b/notes/srv/RemoteHandler.js @@ -168,7 +168,6 @@ class RemoteHandler { // REVISIT: How to call service datasource w/o handlers // REVISIT: const result = await targetService.read(target).columns(req.query.SELECT.columns).where({ [targetKeyFieldName]: entry[keyFieldName] }); - // TODO: Seems not to respect filter for targetkeyFieldName const selectTarget = SELECT(req.query.SELECT.columns) .from(target) .where({ [targetKeyFieldName]: entry[keyFieldName] }); diff --git a/test/notes.test.js b/test/notes.test.js index 8fa932a8..e522fd73 100644 --- a/test/notes.test.js +++ b/test/notes.test.js @@ -109,6 +109,16 @@ const NotesExpandSuppliers = [ } ]; +const BPMock = { + url: /.*/, + data: BPs +}; + +const BP11Mock = { + url: /\/A_BusinessPartner\?.*\$filter=BusinessPartner%20eq%20%2711%27/, + data: [ BPs[0] ] +}; + class MockServer { async start() { const http = require('http'); @@ -116,13 +126,29 @@ class MockServer { this.app = express(); this.server = http.createServer(this.app).listen(); this.app.set('port', this.server.address().port); + this.mocks = []; this.app.get("*", (req, res) => { + const mock = this.mocks.shift(); + if (!mock || !req.url.match(mock.url)) { + res.writeHead(404); + res.end(); + return; + } + res.writeHead(200); - res.end(JSON.stringify(BPs)); + res.end(JSON.stringify(mock.data)); }); } + reset() { + this.mocks = []; + } + + add(mock) { + this.mocks.push(mock); + } + url() { return `http://localhost:${this.server.address().port}`; } @@ -155,6 +181,10 @@ describe("Notes", () => { }); + beforeEach( () => { + mockServer.reset(); + }); + const { expect, GET, PATCH } = require(".").run( "serve", "--project", @@ -193,6 +223,7 @@ describe("Notes", () => { }); it("get remote suppliers", async () => { + mockServer.add(BPMock); const { status, data } = await GET("/notes/Suppliers"); expect({ status, data }).to.containSubset({ @@ -202,6 +233,7 @@ describe("Notes", () => { }); it("get remote suppliers with notes", async () => { + mockServer.add(BPMock); const { status, data } = await GET("/notes/Suppliers?$expand=notes"); expect({ status, data }).to.containSubset({ @@ -211,6 +243,7 @@ describe("Notes", () => { }); it("get notes via navigation", async () => { + mockServer.add(BPMock); const { status, data } = await GET("/notes/Suppliers('11')/notes"); expect({ status, data }).to.containSubset({ @@ -220,6 +253,7 @@ describe("Notes", () => { }); it("get notes with suppliers", async () => { + mockServer.add(BPMock); const { status, data } = await GET("/notes/Notes?$expand=supplier"); expect({ status, data }).to.containSubset({ @@ -228,18 +262,14 @@ describe("Notes", () => { }); }); - // TODO: Seems not to respect filter for targetKeyFieldName - /* - - it.only("get supplier via navigation", async () => { - const { status, data } = await GET("/notes/Notes(545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE)/supplier"); + it("get supplier via navigation", async () => { + mockServer.add(BP11Mock); + const { status, data } = await GET(`/notes/Notes(${ NotesExpandSuppliers[1].ID })/supplier`); expect({ status, data }).to.containSubset({ status: 200, - data: envelope("Suppliers", NotesExpandSuppliers[0].supplier ) + data: envelope("../$metadata#Suppliers/$entity", NotesExpandSuppliers[1].supplier ) }); }); - */ - - after(() => mockServer.close()); + afterAll(() => mockServer.close()); }); From c854717359214789943569160312631a6279c345 Mon Sep 17 00:00:00 2001 From: "Dr. David A. Kunz" Date: Mon, 7 Jun 2021 14:25:53 +0200 Subject: [PATCH 062/100] Update mashup.cds --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 3b7894f7..5bf85ed9 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -81,6 +81,6 @@ extend projection CatalogService.ListOfBooks with { extend service S4 { @topic: 'BusinessPartner/Changed' event BusinessPartner.Changed { - BusinessPartner: S4.A_BusinessPartner:BusinessPartner; + BusinessPartner: String(10); } } \ No newline at end of file From 6b74c23aa0de2a5ed97225cba0aa6f4abb8b7f14 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 13:18:39 +0200 Subject: [PATCH 063/100] Async 'served' event --- fiori/server.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fiori/server.js b/fiori/server.js index 41294b50..a2d911a2 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -1,5 +1,13 @@ const cds = require ('@sap/cds') +cds.emit = function (event,...args) { + switch (event) { + case 'served': return this.served = Promise.all (this.listeners(event).map (each => each.call(this,...args))) + case 'listening': return this.served.then (()=> this.__proto__.emit.call (this, event, ...args)) + default: return this.__proto__.emit.call (this, event, ...args) + } +} + cds.once('bootstrap',(app)=>{ app.use ('/orders/webapp', _from('@capire/orders/app/orders/webapp/manifest.json')) app.use ('/bookshop', _from('@capire/bookshop/app/vue/index.html')) From 0b2182afcb3efa037dcc9e14e9e45721f68ebec4 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 16:01:45 +0200 Subject: [PATCH 064/100] Fixed: books title was missing --- bookshop/srv/cat-service.cds | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bookshop/srv/cat-service.cds b/bookshop/srv/cat-service.cds index 4cc44dff..e1eb8ad5 100644 --- a/bookshop/srv/cat-service.cds +++ b/bookshop/srv/cat-service.cds @@ -2,8 +2,9 @@ using { sap.capire.bookshop as my } from '../db/schema'; service CatalogService @(path:'/browse') { /** For displaying lists of Books */ - @readonly entity ListOfBooks as projection on Books - excluding { descr }; + @readonly entity ListOfBooks as projection on Books { + ID, title, author, genre, price, currency + } /** For display in details pages */ @readonly entity Books as projection on my.Books { *, From d41a9e10ab28e96f07fb16800d8e02875251042a Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 18:20:44 +0200 Subject: [PATCH 065/100] Simplifying samples --- fiori/app/bookshop.html | 3 --- fiori/app/reviews.html | 3 --- fiori/server.js | 13 +++---------- fiori/srv/mashup.cds | 6 +++--- reviews/test/bookshop/.env | 2 ++ reviews/test/bookshop/package.json | 19 +++++++++++++++++++ reviews/test/bookshop/server.js | 20 ++++++++++++++++++++ reviews/test/bookshop/services.cds | 11 +++++++++++ 8 files changed, 58 insertions(+), 19 deletions(-) delete mode 100644 fiori/app/bookshop.html delete mode 100644 fiori/app/reviews.html create mode 100644 reviews/test/bookshop/.env create mode 100644 reviews/test/bookshop/package.json create mode 100644 reviews/test/bookshop/server.js create mode 100644 reviews/test/bookshop/services.cds diff --git a/fiori/app/bookshop.html b/fiori/app/bookshop.html deleted file mode 100644 index e7c07e25..00000000 --- a/fiori/app/bookshop.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/fiori/app/reviews.html b/fiori/app/reviews.html deleted file mode 100644 index 75af8860..00000000 --- a/fiori/app/reviews.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/fiori/server.js b/fiori/server.js index a2d911a2..cdb091a5 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -9,19 +9,12 @@ cds.emit = function (event,...args) { } cds.once('bootstrap',(app)=>{ - app.use ('/orders/webapp', _from('@capire/orders/app/orders/webapp/manifest.json')) - app.use ('/bookshop', _from('@capire/bookshop/app/vue/index.html')) - app.use ('/reviews', _from('@capire/reviews/app/vue/index.html')) + app.serve ('/orders/webapp').from('@capire/orders','app/orders/webapp') + app.serve ('/bookshop').from('@capire/bookshop','app/vue') + app.serve ('/reviews').from('@capire/reviews','app/vue') }) cds.once('served', require('./srv/mashup')) cds.once('served', require('@capire/suppliers/srv/mashup')) module.exports = cds.server - - -// ----------------------------------------------------------------------- -// Helper for serving static content from npm-installed packages -const {static} = require('express') -const {dirname} = require('path') -const _from = target => static (dirname (require.resolve(target))) diff --git a/fiori/srv/mashup.cds b/fiori/srv/mashup.cds index 97f21771..c62c37bd 100644 --- a/fiori/srv/mashup.cds +++ b/fiori/srv/mashup.cds @@ -3,17 +3,17 @@ // Mashing up imported models... // -using { sap.capire.bookshop.Books } from '@capire/bookshop'; - // // Extend Books with access to Reviews and average ratings // +using { CatalogService.ListOfBooks, sap.capire.bookshop.Books } from '@capire/bookshop'; using { ReviewsService.Reviews } from '@capire/reviews'; extend Books with { reviews : Composition of many Reviews on reviews.subject = $self.ID; - rating : Decimal; + rating : Reviews:rating; } +extend projection ListOfBooks with { rating } // // Extend Orders with Books as Products diff --git a/reviews/test/bookshop/.env b/reviews/test/bookshop/.env new file mode 100644 index 00000000..8c601148 --- /dev/null +++ b/reviews/test/bookshop/.env @@ -0,0 +1,2 @@ +cds.requires.messaging.kind = file-based-messaging +PORT = 4004 \ No newline at end of file diff --git a/reviews/test/bookshop/package.json b/reviews/test/bookshop/package.json new file mode 100644 index 00000000..f2b47008 --- /dev/null +++ b/reviews/test/bookshop/package.json @@ -0,0 +1,19 @@ +{ + "name": "@capire/fiori", + "version": "1.0.0", + "dependencies": { + "@capire/bookshop": "*", + "@capire/reviews": "*", + "@sap/cds": "^5", + "express": "^4.17.1" + }, + "cds": { + "requires": { + "auth": { "strategy": "dummy" }, + "ReviewsService": { + "kind": "odata", + "model": "@capire/reviews" + } + } + } +} diff --git a/reviews/test/bookshop/server.js b/reviews/test/bookshop/server.js new file mode 100644 index 00000000..70193950 --- /dev/null +++ b/reviews/test/bookshop/server.js @@ -0,0 +1,20 @@ +const cds = require ('@sap/cds') + +cds.once('bootstrap',(app)=>{ + // Delegate to imported apps (reviews only when mocked) + app.serve ('/bookshop').from ('@capire/bookshop','app/vue') + app.serve ('/reviews',).from ('@capire/reviews','app/vue') +}) + +cds.once('served', async ()=>{ + // Update Books' average ratings when ReviewsService signals updated reviews + const ReviewsService = await cds.connect.to ('ReviewsService') + ReviewsService.on ('reviewed', (msg) => { + console.debug ('> received:', msg.event, msg.data) + const { subject, rating } = msg.data + return UPDATE('Books',subject).with({rating}) + }) + +}) + +module.exports = cds.server diff --git a/reviews/test/bookshop/services.cds b/reviews/test/bookshop/services.cds new file mode 100644 index 00000000..9470f6cd --- /dev/null +++ b/reviews/test/bookshop/services.cds @@ -0,0 +1,11 @@ +namespace sap.capire.bookshop; //> allows UPDATE('Books')... +// +// Extend Books with access to Reviews and average ratings +// +using { CatalogService.ListOfBooks, sap.capire.bookshop.Books } from '@capire/bookshop'; +using { ReviewsService.Reviews } from '@capire/reviews'; +extend Books with { + reviews : Composition of many Reviews on reviews.subject = $self.ID; + rating : Reviews:rating; +} +extend projection ListOfBooks with { rating } From 9277aa12daffc8b81575cde434aee976a60adf24 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 8 Jun 2021 18:23:52 +0200 Subject: [PATCH 066/100] removed obsolete cds.emit monky patch --- fiori/server.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fiori/server.js b/fiori/server.js index cdb091a5..5974d6c2 100644 --- a/fiori/server.js +++ b/fiori/server.js @@ -1,13 +1,5 @@ const cds = require ('@sap/cds') -cds.emit = function (event,...args) { - switch (event) { - case 'served': return this.served = Promise.all (this.listeners(event).map (each => each.call(this,...args))) - case 'listening': return this.served.then (()=> this.__proto__.emit.call (this, event, ...args)) - default: return this.__proto__.emit.call (this, event, ...args) - } -} - cds.once('bootstrap',(app)=>{ app.serve ('/orders/webapp').from('@capire/orders','app/orders/webapp') app.serve ('/bookshop').from('@capire/bookshop','app/vue') From 6412df75dd21437fa5c2947e2617a668b8cf23ca Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 13 May 2021 12:29:22 +0200 Subject: [PATCH 067/100] cosmetic changes --- reviews/srv/reviews-service.cds | 4 ++-- suppliers/srv/mashup.cds | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reviews/srv/reviews-service.cds b/reviews/srv/reviews-service.cds index a4505b3d..6fe6daa7 100644 --- a/reviews/srv/reviews-service.cds +++ b/reviews/srv/reviews-service.cds @@ -9,8 +9,8 @@ service ReviewsService { // Async API event reviewed : projection on Reviews { - subject, - rating + subject, //> recieved new reviews + rating //> new avg rating } // Input validation diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 5bf85ed9..89729536 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -74,7 +74,7 @@ extend service AdminService with { traffic on S4 backends. */ extend projection CatalogService.ListOfBooks with { - supplier + supplier.name as supplier } // Extend S4 service with not modelled event From f57ae79e3765092683e5e2d137755c52ef78d5aa Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 4 Jun 2021 11:34:08 +0200 Subject: [PATCH 068/100] running suppliers --- suppliers/.env | 2 ++ suppliers/requests.http | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 suppliers/.env diff --git a/suppliers/.env b/suppliers/.env new file mode 100644 index 00000000..616dd8d0 --- /dev/null +++ b/suppliers/.env @@ -0,0 +1,2 @@ +cds.requires.messaging.kind = file-based-messaging +PORT = 4006 \ No newline at end of file diff --git a/suppliers/requests.http b/suppliers/requests.http index 423e1d7c..8913944c 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -33,3 +33,17 @@ Content-Type: application/json GET {{server}}/admin/Books?$top=11&$expand=supplier {{authAlice}} + +@S4bupa = http://localhost:4006/api-business-partner + +################################################# +# +# Suppliers Service (-> S/4) +# + +PATCH {{S4bupa}}/A_BusinessPartner('ACME') +Content-Type: application/json + +{ "FirstName":"ACME" } + +### From 5397df5e8182e1bfdf884f9f5923d6efcbc9245f Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:34:38 +0200 Subject: [PATCH 069/100] Remove unwanted file --- suppliers/.vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 suppliers/.vscode/settings.json diff --git a/suppliers/.vscode/settings.json b/suppliers/.vscode/settings.json deleted file mode 100644 index fc7d5517..00000000 --- a/suppliers/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sbas.lcnc.isCockpitVisibile": true -} \ No newline at end of file From dd28bd04f68de4e3416bb9f5e81478d8424ace7c Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:44:18 +0200 Subject: [PATCH 070/100] Minor cleanups --- suppliers/monkey-patch.js | 41 ------------------- suppliers/server.js | 6 --- .../srv/external/API_BUSINESS_PARTNER.js | 1 - suppliers/srv/mashup.cds | 4 +- 4 files changed, 2 insertions(+), 50 deletions(-) delete mode 100644 suppliers/monkey-patch.js diff --git a/suppliers/monkey-patch.js b/suppliers/monkey-patch.js deleted file mode 100644 index 0696705d..00000000 --- a/suppliers/monkey-patch.js +++ /dev/null @@ -1,41 +0,0 @@ -const deploy = require("@sap/cds/lib/deploy"); - -// TODO: https://github.wdf.sap.corp/cdx/cds/pull/1949 - -/* -const DEBUG = (...args) => console.log(...args); - -deploy.exclude_external_entities_in = function (csn, _bound) { - // NOSONAR - for (let [each, { service = each, model, credentials }] of Object.entries( - cds.requires - )) { - if (!model) continue; //> not for internal services like cds.requires.odata - if (_bound && !credentials) continue; - DEBUG && DEBUG("excluding external entities for", service, "..."); - const prefix = service + "."; - for (let each in csn.definitions) { - if (each.startsWith(prefix)) { - DEBUG && DEBUG("excluding external entity", each); - _exclude(each); - } - } - } - return csn; - - function _exclude(each) { - const def = csn.definitions[each]; - if (def.kind !== "entity") return; - def["@cds.persistence.skip"] = true; - // propagate to all views... - for (let other in csn.definitions) { - const d = csn.definitions[other]; - // do not exclude replica table - if (d["@cds.persistence.table"] === true) continue; - const p = (d.query && d.query.SELECT) || d.projection; - if (p && p.from.ref && p.from.ref[0] === each) _exclude(other); - } - } -}; - -*/ \ No newline at end of file diff --git a/suppliers/server.js b/suppliers/server.js index ed3ff51e..2e8cbb64 100644 --- a/suppliers/server.js +++ b/suppliers/server.js @@ -1,9 +1,3 @@ const cds = require ('@sap/cds') - -console.log("serverjs") - -require('./monkey-patch'); - cds.once('served', require('./srv/mashup')) - module.exports = cds.server diff --git a/suppliers/srv/external/API_BUSINESS_PARTNER.js b/suppliers/srv/external/API_BUSINESS_PARTNER.js index d770c612..0121884d 100644 --- a/suppliers/srv/external/API_BUSINESS_PARTNER.js +++ b/suppliers/srv/external/API_BUSINESS_PARTNER.js @@ -5,7 +5,6 @@ module.exports = cds.service.impl(function () { // https://api.sap.com/event/SAPS4HANACloudBusinessEvents_BusinessPartner/resource this.after('UPDATE', A_BusinessPartner, async data => { - console.log(`>>> BusinessPartner updated ${data.BusinessPartner}`); await this.emit("BusinessPartner.Changed", { BusinessPartner: data.BusinessPartner }); }); }); diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 89729536..b31ce5c9 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -77,9 +77,9 @@ extend projection CatalogService.ListOfBooks with { supplier.name as supplier } -// Extend S4 service with not modelled event +// Extend S4 service with an event (events are not included in EDMX files) extend service S4 { - @topic: 'BusinessPartner/Changed' + @type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1' event BusinessPartner.Changed { BusinessPartner: String(10); } From 4a8379e9534d7b03f78a5f9b1fd3365f31250fb1 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:47:16 +0200 Subject: [PATCH 071/100] Remove notes app --- notes/.cdsrc.json | 1 - notes/.eslintrc | 24 - notes/.gitignore | 29 - notes/README.md | 29 - notes/assets/NotesService.drawio | 81 - notes/assets/NotesService.png | Bin 215240 -> 0 bytes notes/db/data-model.cds | 8 - notes/db/data/sap.capire.notes-Notes.csv | 4 - notes/db/mashup.cds | 33 - notes/db/src/.hdiconfig | 136 - notes/mta.yaml | 58 - notes/package.json | 33 - notes/requests.http | 16 - notes/srv/RemoteHandler.js | 376 - notes/srv/external/API_BUSINESS_PARTNER.csn | 2847 ------- notes/srv/external/API_BUSINESS_PARTNER.edmx | 6614 ----------------- ...API_BUSINESS_PARTNER-A_BusinessPartner.csv | 3 - notes/srv/notes-service.cds | 13 - notes/srv/notes-service.js | 75 - package.json | 3 +- 20 files changed, 1 insertion(+), 10382 deletions(-) delete mode 100644 notes/.cdsrc.json delete mode 100644 notes/.eslintrc delete mode 100644 notes/.gitignore delete mode 100644 notes/README.md delete mode 100644 notes/assets/NotesService.drawio delete mode 100644 notes/assets/NotesService.png delete mode 100644 notes/db/data-model.cds delete mode 100644 notes/db/data/sap.capire.notes-Notes.csv delete mode 100644 notes/db/mashup.cds delete mode 100644 notes/db/src/.hdiconfig delete mode 100644 notes/mta.yaml delete mode 100644 notes/package.json delete mode 100644 notes/requests.http delete mode 100644 notes/srv/RemoteHandler.js delete mode 100644 notes/srv/external/API_BUSINESS_PARTNER.csn delete mode 100644 notes/srv/external/API_BUSINESS_PARTNER.edmx delete mode 100644 notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv delete mode 100644 notes/srv/notes-service.cds delete mode 100644 notes/srv/notes-service.js diff --git a/notes/.cdsrc.json b/notes/.cdsrc.json deleted file mode 100644 index 0967ef42..00000000 --- a/notes/.cdsrc.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/notes/.eslintrc b/notes/.eslintrc deleted file mode 100644 index e80e8f52..00000000 --- a/notes/.eslintrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true, - "jest": true - }, - "parserOptions": { - "ecmaVersion": 2020 - }, - "globals": { - "SELECT": true, - "INSERT": true, - "UPDATE": true, - "DELETE": true, - "CREATE": true, - "DROP": true, - "cds": true - }, - "rules": { - "no-console": "off", - "require-atomic-updates": "off" - } -} diff --git a/notes/.gitignore b/notes/.gitignore deleted file mode 100644 index 92467f6d..00000000 --- a/notes/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# CAP s4-cap-ext -_out -*.db -connection.properties -default-*.json -gen/ -node_modules/ -target/ - -# Web IDE, App Studio -.che/ -.gen/ - -# MTA -*_mta_build_tmp -*.mtar -mta_archives/ - -# Other -.DS_Store -*.orig -*.log - -*.iml -*.flattened-pom.xml - -# IDEs -# .vscode -# .idea diff --git a/notes/README.md b/notes/README.md deleted file mode 100644 index 8dc1f472..00000000 --- a/notes/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# S4 Extension with CAP - -## Scenario - -This sample applications shows how to extend an existing oData service on BTP using CAP. - -In our scenario, we want to extend the entity `A_BusinessPartner` of an external service ([BusinessPartner API](https://api.sap.com/api/API_BUSINESS_PARTNER/resource)) with a `note` field so that our end-users of the applictions can maintain notes for each business partner -## Diagramm - -![](assets/NotesService.png) - -## Usage - -### Business Partner Local Mock - -Start a CAP process for the local mock server for Business Partner and a second one for the CustomerService: - -1. Run: `cds mock API_BUSINESS_PARTNER -p 5001` -2. Wait until startup is completed -3. Run in a 2nd terminal: `cds serve all --with-mocks --in-memory` -4. Now, you can issues the requests listed in `requests.http` - -### Business Partner from Sandbox Server - -1. Goto https://api.sap.com/api/API_BUSINESS_PARTNER/resource -2. Get service key -3. Export env var `S4_APIKEY` with the service key (`export S4_APIKEY=""`) -4. Run: `CDS_ENV=sandbox cds watch` -5. Now, you can issues the requests listed in `requests.http` diff --git a/notes/assets/NotesService.drawio b/notes/assets/NotesService.drawio deleted file mode 100644 index 69e2a5f0..00000000 --- a/notes/assets/NotesService.drawio +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/notes/assets/NotesService.png b/notes/assets/NotesService.png deleted file mode 100644 index 8cc761ecb8f023c6d64d5bb24cdae19650fe73da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215240 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

DCFHtnVm)9|=1DHI zdPpu2l?`=C5xR6@du4r&oUk<(OYOvNM4D$G)1uT&)6J%~Aj@_d_a&pF?ZX!@rdw4* zSPOLx1?Tzg)7;KkqtLlEwH;mIJ!Utuv)_{6Aw7~jY7Zb5CE=PwE2uvwObDVDKpL4m zwBasmr;nr|14p!4^@^?{&s1O7um84o1z`dcVUpj3or5xr7GT|R_7NT|lq;No4-fxpbRgXt*kiS%U%iZkaaMEGRW7waE z!og-XMwB&z;r<&FRdA1-^3+Y@pSmwO8hw3A$qndCJP&CRL0@tZmQgKp7HLU!cjGBN zMqc$IiZyQd%IGQ}aNHHHcw(HUzH6rRf~{#|_zi7oyluZ}1xh1R1y4w+dD7Uf=-;Rw zD2!K?POGX%x+cvYBK_&8Of)}c>QK6yC1wTbj8c9P4ZT&STghOrRR>{n-mk08=amWUAs2Pl@ud4)msKx=U?o z0O(-5t?&1)O!_q?IUz%6vT=dKYJhhM%!ISP-n4Ul?2|F<3JChQW|c42(+8%1*@90p zyZhpt-m;GuoP;QVfg%Pg+%{H}%xAq15xH{n$2RB8cJ^uAa*39B%%4+BNak2QCvcAA z?^}59v|fPBL3ZN1F~wa|zj!&$CInwR93XHth>0+U{CMY(*TF-l`BF#|bW68`WXuTB zHmUg4{-Nz6b>FUCn?D$fa^>Mk=W;5g!14P&>6(g(V#7u;H*f#*H_EdU*pF(l(>FQ% z&v~`;Ft+BSG422JEAf{g1NWcP_#dzEpCJ63kO7Q7C7Aj@=jx`!0lcqx&Ds5*G{HaS zNsyd^!IjpRpI!J^_jcUTjt6mKzNAL!$)PvFc2ziy&Ed+rd5PZqn<4z!l8}=$MsU<2 z&{E-Ux*b8h5k~1qSzCEl?mJ?msgCrgTTuev!E!~2Q>ec;ApfEb8LshoHTn=gnf!az z<;o~-^^u5wO9^<19~x=_p1I$E-=g>j{X;MwrZ*oXVZYnrnZ25&aY`ct{0RfIm{dv1QVZvzs< zi>Lwj9@D93I)Scj6MECWV>9-r;n(?+?V|ycR@O_3R&;KgoI2?Y{@5a`p8RJ@DW)OP zw9~}+UtLcZS7v4(o_@qSI6bga6CxbT2^%kU1Yb&-G|93f_PUXgdG}sWqzs3+naOGB z-la2tVrJD*GZ5g_d;T~kaQ}3}K)DIZ<+Dzx{^A{L4@^cz=(L_(&hr39)|Zuwc20?lT&4?P<&_;VU$wS(pl(L=JZRHFo~jFtbJJkT6>p zx$P`}i9*`Qc6-%%hLufjk@8f|(7+9Le3F6~X~&sjqqA}i5<|UZ=@j!fiZt!DWz`lv z6^lL;y4{#N_M{O*sU47;z6MI#srpkcJCB-18fwDfdkp^{PQo)b2KK0X`5wZr>^Oc zm`>+|3l{}_hiWWJM?(h_(uR9x8!D!H<4WroodS5LgWd1i#ELOj2$$t}_y@0Y7Jm}! zomju-Ak%)we=Cdec4?I^i4=>XzKE7FMw6rV_lm zD1o*j8Ks}hPru5*O}2uG)W1?H2h3ZR#g}BI*VtVcsiTNCA`K$c?6L$y~?QCJjMAXloNPrK_?j2`P)q&-=_YLJ}lK7m~dqT}lkG&KAcQyl8> zPADh3S-Q06<|k>-5&b0tbiU__OlFj--|H~jJj0-{&5wg)>8gebev4x?yXP|GSjRf8 z?z~X7X2#P(f;J=%2;c~5HaGXh3h0kajy7+8l56~Wj3y_@quurDqXy1qeD6(3W|5Ha z9!txZ8TYOn8=Ce;ecJlkP)XXwhv>cEbp+R*&K(VM)Up|xmI|q8l1sNVD-Cc}>~~d^ z>>W$bmX}Lou$i`cp!IBH``jvxLchv}@X&(NbABVeQfx`?sg)wjeyXiki|h;FzC?o5 za08_bQ`j_eH?v?m6jRK*vtQdC%L44bT_#4bxBvDIUD2Scc>zRzVLd)7M+-^4p}0AM z7qVR0-0Z8gI9*(JjKRxJ5Bb%HZX%(1i;9^<{%JQm*UVKI-Ytp>F{ysi7gAvJA*;t^ z0h7oXpXAIOdhsM{T=u&`=iw7W#wWI_=K71Rm+#Yexo@wH?^+C23Q!m-07r#lECO;N z_J_?}L;_sz=4m+wQgL15yjTIDTsSliYhRup5+VN;MRl0{BHH+@R>3^Q1Ruf923B8~MxOo$@KCBR%h?C=z3;(36Gmr&RktJQD7lWLICx6jc!L}lh%EqW0Z|Bf%k!E{rKZm+3s&Ur}6Kf zZ|KxaJ$pT4CIYnT9-$gkjx2+a^@sJn|#yc^dPKZg;kfRFJ?ydTB zGEp=ugQ2VQ{ZbOi!`giP7%6WAP@9-X0A(bHDfZj(8-A=s4^p}_bQI+xIn!VIf>$3d z?6H1!tRS+r$!}jUAX-6koQAg*dLVJ9Kyc3*@UDo!iKB9*&%7I2sn796+>OJK^xQ~F z#LlRaOhO~H{^^J;jK(96ecoM16cR%)f4`RF1c1sIlGQ};QzZ7u6qH(Wa)V4}6VlB5 zoi}*HLP(CDa(4rEU48_4uL$sA&tt+b?V16|S2mpd0k5cFbCP&*?(@x?Gb4)CH$5sJ zwZqxb$J$SRV|xgc^o+BuWKF&&sEsVtOUOCW1VOzCcaN@5U+f!>OJ1ULhtIyOgfrX(KAQH_n5TsIcSX`y8H&0^UWv(UBbE3ZnYls{p#0e_a4lMFfnZiZROU!;hTDTbU+& zB*>SU!Gq0p=ftj7CazNc$+jzWKZtAZjW7X&itahGU@9aIMb*xPwO9n``0?>WCZtp8Vp) z3u@12|A2=g2mn(q2dqpEWi??7S5^#Ss#eVVe0SRZ@2>iLbc75cIR5-WmEUV9R z);pBsxRB=d9vjinL7V`PAswxNUcYEgHXvw|r!x#t3~=jM7sK5(iPqVmc^j-7mI zWk^^*x)<=AJjpv(GTeyd6qXN(M=krvZhct0m5F0$o(A{2+-}lEv3f!m3uqpR-?IAc zSZM%NLf+jJxPg?FjUOu;sGK5-<7Ucr1VP9qZ-9yKC1%>iwR4hg^+jM|S0?ag0lf3!D{?2B{`Z zhfWpxrDQ9N6A0pb6nkA??3tI%j(Zn`6;^x6m!%@vv*H+0d$1oMt;6hglultdW(qs!WiO6@>JS=ejZDawy~tEn0fNT5<;*jcb_IY07Rnz zzOChUpQuQL>|qi?p$X&)an{#(!^m26dzkxra0QEsk(FY@7^HZbw3NeDyMNciQDl@o z@?eVpzTMHZ-Wo4fq59?Ng~yStYaMM-9j=Fu-YbsDACcO#U1@hkTV|?_-A`mD(uPGw zacVnUkISU9)P}fr@Ox)sJD}l~b5%Q@IjbpO);i2vLF!21K^EPYsq-2wRa1OS;hZx5 zTje%y4-)-QHLvo_@IN zRrR8;a%LA|@v2j8$j^%5{5agv}|ZHVKMUH>x>ukg_b}Wa$1^zhW5XKcIHnx>PT! z^S(F9YXkAaj4Raq>1k(#HMP!PTc}*DXQnJtQCr9$p_0(dnd|XkFJE}FO86DhY+5}r z&q5jETr<1YCEX_n7PDh$kW-45jw?mq(+E4Frj+g#lMeZZX?)u7T;}*&$gmIHt^Q&b zkjOq0_Z+OHzoWSw8 z=~kSk$V<``S?=EV6TZy|AM6qNUP;cMuC{2}0oD{T^#|v!LOn`L!Uw7imhdO~M`FP` zRsuC{1GI|UsV_HcZG#71R-huAN$3;RA@$3-*N)xOBt5z$(^3Q$Qvq@~ld@Z;t3Qw^ z;Sdq2J*5l!nGdT!`NRoF4BA85<5oF%aT@`d5zu6@yVwFMcEr(<#eHVXL)>#OYL5zn z>xC27Ha|V|B-ZHcb+R!v{jt(prcQJo3Ta(SX6kc@+WMzxLoDI3*4tP@atigm{TO$b zVEvV8uEZrF4INlzm2pv#i(A01aNn3NZ95^gp}NhPNT-5GUR8crS4eVoF}vTkWVOJj z&6_)%kr0s0ow)_{d+_{ZN&FPfF3#6s&+WJ z!E_IJ_!H~X1Rj0%k#>4QBoSOVIBVOV-QoKHLy`L!41T2+`5N@*QX9gqEsbxCWkx8p z4vgK(fhF?jt+|8wjj?Q4j#?8Kn}$3BD?R#tMK)!pJL;K~QhqF=y^8z$$|nwpu$uH2 zp%wfLc+xejc+#im;j%iG9E6J41g~lt<(i2pM!A+q8eX7jaqUP`xSHiqQ5IXj0S=A> zWyI%132KLmduDtDhm$n!tG`m(^Jnu)1^JKt&dQVY=}tjD;n6Fem`9)AohIqHU83n# z_tLdXP*D|vd9n~Dh(YiSTY}&b~EICtAtoWe{2MnAr{4`bT(xay&(7dM9R)V%+!m z)9CPzcjBN#Bh#=0VzepzIo-1UEWG&i&hMTq`j2Pg>7Gom`z5)ThztO@h~0)9O+7Vf zJOr-lkDLKg^mh%7i#eAQFp?fq;xLNPQ##0H$*4HfuE%!WS=hM_NFM(W&!A9|I<)n{ zty~p-=}Z!Hp2;20WY*Bf;2$J(wN=x}V#gn)I#g}WT0fq~TN#8Axw+&w43}SXrkPP^ z>d|uUuvvBytr;xY$Q;EZsm9r$S`Ig5?FRu~9ssp`CV^rX4_k^_F+C`9u_p>oS%*g%f+mxz!EuEE=YRy}PK{-sS~& z`KXKD_(l5|BW_oJr>vqd2J#No1NV13-gKc1p%k$=u6v-iHf%3}z( z2V)oGt6ES74NR{r);hEpx3}10DoI8?&Y01^A zDHm}lE&)`jVAxJ2fwJ($_B&qAJ1 z@W;f$%o9J3*99tM^b@~JmnVe4be5ue9@*F^z-pf7aDyb6Ge9|Y}CpOH8J zNK&L=gS7cL!9j1}>@}JHqBX_wX0G>m#aSZ%wf@w`5Fd)`T<3gdmjl_AJhDWq&jZS4f|i5{ctS54 zptI?8NWBOC`=ru+z7K*x5{);E@A_8sp#*WgP`FrTU9?SnO&c^anAgav2|vlF^z@+u!lIAy15>eueI!dmU6XX^+Do4(%BD;; ziqiz9N7J6>{^n~_r>06GBb1oA@r9S^hfF!tY<%cN=gOwuk0x$+ye+1PP^+42Jx{Dq zopr1G{Y2Hyw%br-Qf#jWk?|34FE3&0shxHJZoZP-0sEmoR6x*c^p{P9N)vS)x>78k z>)O0>IZ#m1er-L7Dg16At>qC?nsb^o{8is;sol`F|qD4uP3^N6#v^XI8#c(#|J-pTXs~n6P?mRQ#%XfEbV7 zyTggA@n1H=r^ChyX-4!k)<7=;v!p8bnpr~)A)PD%J|LEfCgMZh`|kn_sBP z#&CF&+uE@W8>66>8F9*Hg2OZix8yB;EPORu_)lGNHBX^o zq4xy+n7rgT$;)ex5Fgt4R+EaFRws3h86@=C4?A_pI=6XG-tsxJR{0}8V#swG-K45v zY1n}qBo=X~M!WZrb(xi(3VmE=4P+*-53*40^WBnarc2&?D>tsN)2Mdg zxIG%)89fm?`_zAlrYKg6!u^O^_h6A4MVah?nuq7ntNsyMmWT}>$(9r>kf41-ew3GB zT}BXiRXN>kTP9b|#l;A@6%}hY1oDlYvx5!|ur)=aq%3zs*h}aX-^2LHXi7>mrCjg3xSWQ zE!w9wcV8_k5V)5;LNcEwb$KF~bIS9rHy|unALB|C#UtKI;eb{gJ8_2O`tAGGu3OQ7 z3n6#1w)qso=+cDVMwMb_$4xPXMJ~sV1mO=IA#9PvgBUW_vp$mf567~UAj+~Rf)Dy) zBa5uU+u_GvIpKdx>%qwzr`(M^0U5YdbX-Reu(_emb4fN=RQLpL3oQf-E%2$L~lk3@!UWrRoY+C2QMJ;kq#PLfXMMRUDdQF|+3wccH| zJ=))4>5#?V*kRT$+pTFQ`^(80Hm6js=IAH2$!#N_f-BgRIxRD{6N=P|f4`>TPoHJ; zfv6%k=}#>H@>ZwdTC!qE^bjtI{b(oJY9L8TVGh<8?y5YPn5XJM7J5 z^s~!Q}R)HeTd#vg5Qs8aq&@@10t!NvVw|JK5Vs!3`fa9b z_o#|I-WU?6VI_4u3CkKCyZa{r1#i5sx}5RW_0d3C?je9&NXGEpI;&{K)oyOY>^SBx zV1cbdk&<||<9Vqj6_=TEykQ|qB9nT|))eT*EK_|0P5M1yw%~ZEmDadUlQ#|lK;q%@ z@Wtc<`_jSR4>)A|`8MtWUN1{U!`QTBa>J6<3ydNlB+oM#d=e{E2pvVR9nAn{{^C0@ zBJ5MvFf3zkVRk}gB*k{ExZe{T@WEEWqPj~JNZ!N|sOAwBj~-n;nRff_ku-ebv)lui z?VTwihQn!@Zw)E;!PQd;JamD=bwIi+>?#!a#T_eJ=-fuc5I*aH%79K`R(yQCNko}0 z1Yv_e3g_~#q&R5ugqY`{Ey=G}j>otS;I2gixpS$(O61}DqeEcVXOMK0UPSF6Nebi> z2`Sgc@D0mf!rUrPZ1WTVJhDz90tcmXEiFPfx5pBl-)ELdj&W8fo&}0YApe_U%~88= z&luK=6ezzW*LE*iHp|d6peVhEUz(pKX#u}SQdXA<@!Ud?+mc&u1-y5}gdCwf>6!SXZz_HNt zmnw8(*e)bzWlY?49oq3gXO2Y5BuIG8EQWR4CGDpmMnWr>rBe7;RJYup-7v)uvzr3uc6W{0h&$dij0;e!Mn z=p32SOM9yxbW*F^V@l=|c;dH|8CC84W5RuVZ@He%3|CG1T_#K<&wXwdF9_^3>vBDR>)Djptr_FFEFL7Q=5}xh zA)78FE9WMAb9a<{Lb#p^y2_H??XXFkr!!oE$g>#wbPK_x-G;C3tXA!u(3sV5?9ua$ z(Ain2ZVpnzkbqMtx6}&USY35GJ+(enaTR8?i@6B$uP{XEODK$ zSao;F<*4_;K16ae<>Kp~MHl?Cg;siMXaLyN*2WzuM@b@{lo8}X8O_$>*S}uX(#UOa zB%A~ey4!r+fg-;p_R1gc1cA3~1Wnvn@>{nd#}VfCAVnkMz`-e1)i_Pky$#=Vb^`hX zD!eTj_yxZy2t}boM)1xAb+AnpbedBVMN;brXWHdNEYErgkG@uN?}tLXg>#NR^q~*l z-KWs*bodTj*m3+NE+|ZVXX{}_e55|sW$gUC3ryMkN^N7;66QC7wnxHHf1#tmY)5GsCezRJ~jw6LjoNh}iy%R#X~lGjMIvxz9HK0;ii83#pJjff%aM-u7m zQ#YhsdZA{biCBbi*j_MNT8Na;?S7kgp-im*!0R!NGB?_kQ}?7UT6v*%MDSwA2|6S{ z+0pE~+)*i_Hp*Fs+C-)I6-3cSomA>N1e1O-is?@CgLj8BRf0NZ3$RH6!JJ2I2H0ZR zOGkoQMIAd_&MvE}dDzrGC#4m;HTH$lpxSc4#o^Ul0PAeFl9MMfv0BhsP6%W+8s-ux z+Sk2rDJynQOg$H1nIz#OT&W2n80};KA+Ft1GfB4 zA^`l^-@G|?Sn(tyWt{5#!SyWk{PAYUR1kD9y*}u>Ptqig9tudTjwLG_(srVX+LA=$ zpZJ;C#92*Wl?ngi;8P4Yd!6uWlrZBxDsEDY+so~(4L6;U36e|EYFZ;7B+W*1Azv4U zQ?7FdXu9#01g*NQhGlAA4D^aS(GG?&2iT^e)Mg4Zu!ng)H-F@>^&#c56g8t*G?JI} z!Bp<13Jdjuv=LJFuVANnvIfsIURp`EfV3rcD^KNT&}vS1TL zP|+f?Q~sIkVM8)PTt5zQ(}2-aycX8}1{jUZQiu^r8l+^?sK3MA({KJ%%d8BJwsdr` z!_h0hoMaG14<0`o*R`XEl4po-zVQbthdAOUd<2%BRK`xX(r3&xS^Phk*Tt%IKb$IB zg#d|dCgp~8115>pqVW#ysENCYKT{UPiS>5pIx1>lVB!jP>$CP(D_pb+;mCY6{ zVapv`zC#Ms?Uw4OhJ*H6S5Li7e-B%7GDw4e`>dN*?Im>5dgk{YJYh}{wz_-g!j?#f4#lSmvMKG<)$pvvo7RJZiEi18ke8;@n|Hz3 zx`Ne{1&jucwu4%vxNXDT@zfa3(A$Gk&uk5+>*IZCr||a^45y4%Av4}?knzm*bTf4p zgRAxDrPs3Hokj3L!ghuw=je#)7XXk~Jasd^K19?f5?js?znF|rZD|yk$@Te6#>gy- za8Fk?(cd#5O+f2uU#{4a+owA3lCAGJhiKFJe2m z#jD(clQR4M7%XwJqc^c28L&fMP;u2$?+7_3AcPsbava^SzxprH4hT=WY`h5iu*A~B z_%->w``u6L9D%kGhC-j$mK4<;J7FzFKPdOy zVIcoAs#3y~vwlw_3R1zLZgRnX(fJOBKt&h}tJ+M~n)zT)!oeh4Vwk9;yy)3BmU=+* z)7wJQv@<1=-lk40dH}DJwj-Q^=~G9Kq#z}>1)uLyCwqFY-&R|VgrKgDL}vO|*B>9R z^={~fx;)AeVqbHC=%Wc~*0H5q+oZ#qiUt9$P(y>IAVbG>14)40I$TRRrY>G1d0Oq&; zwpN|>QxexFY3-qiHA+8#FD2!m*~W_mItAlbGafxL0uAGbKnP<=_rh{y>ZXB~oF=!bt!Nr$!qrZ@?<+8bal%`$O6E}#6|^P8o+#+|0`(F$64rZK1{Omcm~o)%PnR5_XT zRVl=Z&hzycyNd8)5T%wZ?P8FxUlHvY4o-L${|^6g~UO#D9|M~tfLZEd8Fsfm*tba&01kp;*)KVUCnT*liS534KJWTV9j2Dus(f-da8ArI8i6b4DAU?{znbAUe<3TW-Qn zwwAZ{@g}>=%{&*$w#&|0U&`w*hFb_13O27)Z?%W33FkLT$H-V{=P&0PS}Y~33Bvk5 zlunu45+)lBDt3K1ZQgp7cPJ@hMj1nU!lpJrrQ5Tp%u4I!Ix)kpo$ZJf1$o>L`T=U0 zXUkV72Gp16_Rn91frE5r1C8JVU;eY(b_*vRkRM{I>MV9b7*96Us z>=HaC)WO&FbWY4!>kp@QXRnK`6=SVFW7^T14Xz1GS{K&v6)_r`YlDb$A9!b%kuYZ}=mO6L~rU43{C-Lwk9=ecto z#PUeK6VY)oYK^-!hUm6X1@eD--HF_PpOepJF{pcP=a)8S#7u0uq%*s77h!%`4{_aV zR4}%51ypU>X5vIl(eMmUP;9t37k*{K+;A-&hy>< z54iT9`V>^OXz2kwB47lJB3UnNXNVx>e~|{ER0ddc$w{U6_qmmSX6*=%zCR%!NGDQB zsChztpX+ttAhW1$pVY!Xsm8se_EtPN1XLS2q zk&pK-vWR-ro;NmlO?`i_&Tp3-bbz1}NFLd$0bBcC{GSgnyQ+H#43F$h0Q20Mnj4<& zf6>MBkd^(!YkT(Z4|l+u>ZtwvV8s#RuV?p<@MR&8!;-}Lc5A%<`2PKW-?va+P;6fq z=<~mkHB5pG8v|?o_x*$W`%>-x)g2bZgXSlg>mNsOg%xzx{-r==-!PGf_yQ32?6B_t zMiAK)rcBb$R`4IDY=80#8EY(vtRz;V^pGTF#o|6qt5@`i~bljATRC0 zqzG~L=b8C=@`6B*Il7RsZXZ+j-`=wT1!*fb*M0szGe6JU|83R(Z?-C@O!)QqZ~FHm zZYF>8=-Cz1h#Mtw2Zp23XK_l)HOhD7SFT<+?_yDED!B9T{1;JHh!YG!O77{VStM5J z%SZQzkSK~6_ddS6VjbFFfarnV*tpSBfXQ)U{r;jOIP`%TrUkl+YT2zWjQ~ejV`j_G zHONZHlvN@%rZ6-}W`|!{O?Y!bZ0OnIwueRyLOgAF^vJ0C2_ZsdzMCTjwPZK^Sn}^Z z;uzayT1<(G-U0!7|10O-?Fs6BYbB?v89WrifIEcmF0$ml5KzJf%@tm{E+~{5;PnYX z`1aK?{CiN1EgBq)2QC95rMu)A6uTPivNV>Sc5n9pI9zS5^w@|T2>dW5TsAuUhh(m> zV1tymYg^iv9UgXv51zI1p84A%Gm!?-lo}{^;iA(iC#COUvrA$bsHv#x2dh95*6?Af z<{8%E!FI-B?8w*Mt`qw0ZX%}qVw>sZP@*81kv#$}f`1E9MWrW|=Z=Gp!c3ToYx_LV zWm-hGkKt zazdHlm!I#vpX?g^Si=I%E3bF6_5b!i-k9f3#_9Em(w`*wAI-q^MgmS5GP~LQzs$+s zzZ_=l|AzVxvl@E%>eZ_(PsLdFZ>c}0PwXPB*h%F}QGfp8pI)^0y9X4oVz#payj&+56@@NkoJv4hs!vNePY zSCOOpw)N=pG)KINP@b?~)`uXulm~3W0hj1@w0m(04t0yU6w-sjq0;9h6po7zzjJZ@ zY>l>B?0-Wy_kp`O|HXr8OM32S`V145TG#qCYjNxmz2oB3{-b)V zp{?j+yKX&DbSUUK5WMqM}Uvby}tBI0Y-}?B&-66~eR* zlq?Uv)YjG}y#JR~?<65bxDi=T2E(n)@1#k4v=i!3>yh^&tz7Q*}xc*N;v^ zSJV#w%?iJk-aeH6t{40^mt=w?PN&Xxt%a7PEbI2u(T%%p{pvY zc4hj|;KMwcDDj+|`uUoaq58}P_gUEbZM7JS+)E+Vu#|XiFZPZzCI}UwbSrvwDF0%E zgC1Ye!SunHr>3QBEOlK4#OLA&)zM^`HYemeS2&d$@bLE-)prM28f~>61T?vJ2C%cq z>MKuUMVLf@OTy!_IMOHx@UN#)_^t)_{(81`yDFr`U)#cCyFemV9)) z449GaY-ZP4zkTObNC*Q)1LywYgQnhN#dMy0z$GhTH9j%!|PX$d`?#C#5WR1WXGmCEB6{R>Scd_=nM+t@| zQJFJ~CYCW$f%op(M+xC?R#jV$JW#s@l={r4OzOo$@0@4}jc=%(4XZpJ>{q)vc=0`|H62b_&E}9+5W}tUv|H2^OE_5nR56kd^ zr|vJSM1Z(n++_%q?yK0xjMN3=G&#qKI0bI&r4N- zEEP`x%TN0KZ_`AbG0S$b8v~7-(^&IBD>E%MKej z{&W<|2)=fEDH^Zs_y7k}2d0Bnk0#1;S zzf4Q073SBL$nBw>EuHL0EAoKJpSPt6L@4%$Xa@I#?C^Q#1b0;sp0AeDH-fHLt-%nq3oFq+Q9hA@RU$z)GGZj&C z?ko&V9#>KN>180AW(P|rP^|wmO0Q2KC%k4b*4u_%TmvaROM&{;%GC-hG^R^xyj`XJ zAErkWrl)x}{HKm9Z^ON^L%ZzaJtBa%`~O&b%djZd?tOUMiA4$`7J|}^v;k}ZK@{mm zT2gW-*$POjNJ>dJ49$?6ln?}@gaK)Wp}Tq4t=q?k+0XC8|2W%U)Nga zI?r>>niTUtA8WFT1iIi0{RfGZOTXXCpFe#mgQq|Jf$hlNY5(H3E26;-)t58_qsSTT ztg~(1+l%nFnL?KY$?@?N-21=&wGMxS6c1yOP6Ad=R|Yk?G7eo%rvSQW=?*)(i>%nw8P|l8D{8p%qp@g-`9%P$U}7My}4~1dK5Z z*ydaff8|W@f&tCqHVix2n-GGPyCS3F?rFjIMan2x1fIiiYqso{uUdk>5bv4I07Ens z{vU5%7>s@TEjChuv6tN^sDc7~(9o*XF5e21RU-&dR=q0McAfA}s}o*j;5gk!n*SP< zpVt_6)Q3emH)-%1F)^_;3n{izYWwq;VPOSx|4E(sZ8n`_JhTat6dnTFVV`c(>Se6; zJ-kpRoZvY$=O&Qc=_#c>=Gi&Bcy-GEErZup#*zE^rk?_gY!sVFg=}vw>*%_~7%+}` z4n4|vg-$M~+3d?Q?T$*iev>xsgfC9PY0Gxmnt$qXc9g4-%jSIfBe@$d-_f~j_71Sa zlLF5S(*dW|>2;woaG;RtT!jB$Q^gpefVwTHAtS3s;=8#1an-ThO;wf=J#;jpJ4%kz z(NwXKn5Kn(Ttblt!i!yp(Q{-gH#(e3RJF$>LUPK4J9k;_&+P=uZ8$|#Hxs7|`_!zi zUQwt-DY)e5y0>o@hJB93H86W!mcLLYl|ye zYh#>iVicxg6tz432b^m@j`*LIROH$4xFqA4E>}Eqzot?mWXi;jO{bGhnl4BV%^H zU)oOox!d-!y6oiz-X^7Ge^kb&3i9RWK95@A^5o@;p$GF)%1B^maG#`P|)(-6bliSm`a%p%wk%cD9T7BWX&EmPr@jS}0y;MylAGsMV({yAy7cUK}0 zV~4++q8tku9QAv#lY|E*6|U&G^zU;P?B85+kH?@%yxlhD+15-mAKhs*?!sVk4y4A; zw<4+|HN-OANhLG!kf%DHEbFajN8R#wQ+?~^#ygUt$oSRQ|8H9drSS;H#z)&DI`yY* zvz?}!+odCY@Z_eSB@|oJr3RkaN0epq<~lRX8}K_yMS!8^c!10l-$E}5!zm5A5zkD| zZ_M_O*w8@?LXqDny*b(;R-T|PoV9t(ge`>VTl$;Kw;nXiUYQaN9CsxujBeB?Fh{zV0j0;e4it2 zPN49y&2F)zQ_M3^juOA-3kq zX|otR63OzLy=E@53T(NL5=9qRw8Pz0FUy2=U4uc&e#bB+Ca>d&rfz_)NFgk;PutzxKf zvP$;v0E=<|iN#>w(tUoeSQIlnnZ?;F?A~tEK7iYKYT@WhmGESK=aSOC+AWVc{-ZT< zyvpl;Odif_ExBBn@R)JE!Hm;IX|{$F{SF??;?xzHn_}{oZrk@wnw5K^=-DCfS42)g z+;P(Wk*vX%0-S+IW5Zgiey7@7znE;5&g+d6Ecrj=$u;9PdTYrT=vTl;iYtm!3HeCFM#4{m>?3)*2p9*fB zu^*yMQDZ35UVbkA$Z-XFT*`@;E#WtV0Q_QNQ24ejRKIgAEl{F75FW-21{tFQ%sPd4 z(NOs!r+?Y%<2Q6Q31o}+-jX>T<~Cks>aSd>wF#iJV0JP!+YBLWKkO>^9eU-M1N#ES zSJE!cUj)4~xTu+n$3foN!ui)YRehtnaN~cQMI!sE<{1d`E>BJNnVFtJ= zHVC5G!}sC#Zl^G5|I}6?!5$L(i79?Z_98vJjvCYSOGWS+tv4|68##@vU2ty&l$T|;xQJt+Wpjp?>QML|euo6^Ek6F4sXE1!RJ z{0nQuBf`{D^T~H$X}7#0+cYwyX#$Uj>HfvY)wSEJIZ@k;_VHII{vGGvd*N<)j-cdL zkz0XCSZx13L>|WmeEc#~kc&xs=&UvY{zklC;ekFc1wrsDatYGMuzLi*Wo6P_HZt@F zPd|JS&{fy|9=X+y>gOa#F=1p<;7KVkO%MPKtk=y!MN~|)_5FyUoSEY=6?W`{S>!1d z+@MmsywP901dk~V#>6B~@AZkjF=NGOW{?n=+DN4!UBqTU!0tfV3(4nD26X@UA6d1S z8a!>;mOt|M#-6M<&4Ef*NV7d5ZfJ!V<@9R4Bx=(#7F6XjNf&!f5RO;8gP1qS=%pgT zH9m6P>SzNs(8G<$nn=X|dKzf!h6acMbTQalwf`G%pg?Lr;zcVxdz0Xbqza@ziZfVy zC$xSJVXI09KXF`EN95L%cG%z0ls7F1i$z});7FSdpBo6SN%<@y_hAqC@pfsY9>}z- zVdzuoUkKtXLArBogO}igf2W9=a>(M*5vE_fcR7gNkGKYHuD7^EimmpqmUWem(6Ze3 zNM9Yv3_}_mq*GnIU_{Rj2)Wv;MijXlmE3ocJT7Muz3Sh(w_mUXJZ(esFfj z0_yfZpoa>2m;!=cdClB=p$D-;%$SKQwxE2AYem9IQ&=^mJ&weCq$V7RPk2p`T1IOi z2#;jgGQlduNlLMl8ozzGZ1PE_B{BnOtiXQwIij86llm8)5_=tLhDjZ~y?cmZM=3~o zL7E2Hw_30m4=^$cz=Aii>Sbp@xe*e?z05yWz4r^iA8vtVW9B^V34(=eLhMqBGV0m0 zCZcaS@r%7>&`__Cr(}=_H-U(QkW>5*9K;8in6Yxb&lvV(W14c`!=E=>fGAgoGJ-N* zLCw0u%I=}Vg2IC+XcqSpbEBG&^e3VKqhwoC*F^9zOV1q53{uzjq&>W2WN4NRo6)UO zN2I^S{{b(uvcqxwrJm$`+;gB85B`Ji5lJgZA}n~^T=eRMQjgYP3hv=cf{fKw_ACWW zAdxQr-pP3I*>S+sWB{O617%YElUgLG8pH$CYKsX&WJ5SRL2thBg!Uczpjbo4R#a_W z9TrUOj5;-P83oNYps|I7UKGErsio-JWNPLNxj6aW#pMszkFaH-CQ?I)_NLua$B|wx zGl1VXQGO4Q5yEA_9az~ZI#_iqh2MJaZoSyeOt?Q79V`sAB|3JM;Qid71&9`#X|1g2 zPniIn(e|DAc;>*Krw2%@)7kG{xH8rp0wlq;q#`*nauNWj0|l_Y6pMP3b(BD*n|&Az z;Ls!aJ(vjF)}?8m6I5>S+Tuon`oe_Eo6SQ}nZcq8QZ6`2jmgm~N@Rp*(>qiPDPlJ( z?{0jbOx&Q};+mlYwgXc|ypQkp8HS)O6sfn{xnk!#9*XEUbe}ocAiO%*Az+o zSh%2ZAW1g$r@t{pkCNi3?vCPSjop9Ceq<+-9*%1>mC_V4_esO;_U zLN>Qseh$BOuWcQ3bT=6Fgm@O!RUEFKPKI4@KwO-R)6in6IV94nU?4-=lDuMe5gfs0 z0AgBxXm@{%+ply+0$K*=w%Io!t;|QK zsUBO*B*i;LJ7cSGlvXa%D`d3{->`yD>k1TSuvRwPF|G4hCgxD6 z-#pqGgi5N`~Z2$)prbZld1OA=Zc*s%<9vQJjWtaU&@v<$rKV*{bkiX_OmD zSLiyVj^f>0B2&C)uPWR;H{#jydI%CSYY4QpE&yVIuUlOnqNrg>4KP&{u3GCMHq|KZ z3=5tW2uwRp?ZGC)w?1%e96mffW>-j5IzcBx$)H?MESjtey@zjK|1Mpwp-0wMDUxW< zezCc`67}vrUua^7ZUJ9}8%3pJdUY&sTJ@EvZgjP}OUP9+0Y`xm&)_5*rctjzMZj&G z*MyKF>cxfXF0njGD3eu|l}I-A)z_V??a6dL!S<@xh&D3B{w!*3r<)nwHB0T-B_UAy zi8$ib32(|^er%ca_=&ColX5qTEpA0mQ49Ewn@k&h=4A^p!*!uk4BTWxS!WK|pF2*n zT9=X7jc-X+^b|)vB}S%wgTvh>7(27HE`aaI8p=A?NI!C)Zdvc6Gd!KJoQEu0a`Hnr zykZShDIAox(=%*K0yS(sP8jQMWOGY2E~BgcuKI{>lMT&VRQuF)`TL7vDQfD@wpW@J z_={Hk^Xqq>{>31-|fv7^?Dk;0c}gFgm*Kx@mM9Go7|t{Zx=RFb239kM%t z`JRX6@YJ6%jvn8{T;=Baw~pw9@omHMmB3B_kA^s1RUy0p$v41h^+}$**KllZ$_m&5FiOk1^di}5hxWjb4tyE zP0vj9%Tq=r3pKOw`X4fa$}agP@xnd(hjMFE^(k4x^{BPW3)PYcY*#Zh?)Qv0D1F2W z<`AduXaiWd1#nB1uhp>Fd@j?-7EYcKcO0M}@f_&1!E{>2D-76wV>_BiD|5%!s60?@R9-8-oPZ#E=}FUJf=cnL{Q$`iMi0yP|Bn(Zy(nZ=j}(>Y z_g>SBC;Ku&@|8KN-S#dG|0kW13!=rYH>~>!!>~5w`9y?}5{!l7Ik<;MCTD)xL;v&V ziln1(4>!3!+YsEtH8_00(LIqUT-cHZT>Q?59I?F-o9pZS>+U!-8vVL8%V_VP03Ems z-)T+K&);hyBl5i*`O^J>H6tlYf{VTMF#nH%vPLq!b%F~>fCt3=g!&*ssg?B#5<34W zniER!c~W@L^#=*BXoCf^tliH_SNA>wk$bM5o}NwLiUMujUlI)KzJn4-S(rqgj6gY~ z`Q!ydLVD*(!X)!#4$QqO)#7Ia{6`UA_&wJ(9|C|tB-#otRgzARu<2e9+;P4fRW-qm z!Fm(9V~Gbj5d?SaDN?2dsnE%POIzrb;5oc=RT9{H*Dsh{9jlh&?mKejKe>C4aA1A* zJ8oXARo4ALunJ5fZ+oyi55cd`&_95av>7O|5}ZU7?vAPRI2%DKezF)DCH1OjdzdVc z>4|A-YhU4LN-y~zkk3Oe_)>gU_Ctc_nz~<=?SH@?njy$aHug=om*8TJU}!TgYk@)k z-su+)ueBN<8w0^3%DM(CS^T$4WP48w2^Xwnaz#RcwpKT@SAH%U`x^&Vbyj&fB!W~ z&qavoKfK@A#02}9Ls$VTd*oVCjj>Bus1n1NKpW=^Xx+F=OjOqZ@p4D_kuDXZ8ZT3OoF zfitTp)zNExs9syMYu73G@@o4&t??aVU(Y<@R!n09F;g-297gdIsh@5t*PjsldTl_> zaLpyQ`&&%6yKqL~z;7k_T$ zgC06QA*R5ON)*HCSu4vwLjo*A)vBMP0anCJI^5lr5s>S-OH0LU%DwHuWT6KBw>|j#V`7D%C)8`&~)Ki^JuN%lQx1^`Gttfp(R>AMs(&JkZ^D_PJ1ag6lcDBn4YXq-^#jg7x+GnNK`Y{=U9M zce<;8Hp>0|7%N1OIrXJOe2(B~)5k}s66hWbrCJobOA(Cy3z1^j)l3z9a0D~uurgeM zYlhHY1TiedL)g8Jt(C&Zta%csoB|M3$e@&YDvzb1SE<&f7SFiejSdOQb*zyJRb zgk>QC45Rk7w0{-%T9K{RYBG$8AaPY>1isl@KB=(kt|5|_1gQpuZY1BS>^ut@36570 zDPmW{Nz}eF>G7K27Tq7iOc+d4$UnX}4vhALNo}o3@h=S66B(-4jWGl>Y6=;uOzGE0 z_Z~)b?NDu%zA>puMt_S;01b0krjJFZcD&-fo=23Z>4Af=IZgAMgEh1?m%>u?PII?H(rlJ&LKh8ePS{veM$ z#f6psXdxz9l+74V|5P@-vLHF{HXGcdkvl_iU4H0|b?XYbFGG&HSCHCMIZm}$3kc5T z3sMcR>CL_Lk<$G+WRitMXsHFZYOg9~>0p<()k`Po1$6DTr}>z>vr`scbkG;;gp1%F_MtQlLC z0KzJ+4Gx%J7DRFM(JwOu&AqzgFW=s#ovTjcj{$Ca15+b#vHaV|E+&ZWP=M; zl%R9wV_f#0pBsk58!jY>(DZ@7FIwQF@O zr4WxKVaS%L$5;i>4R8GQRl2p|TSQ{SXaR@Gn%385M_nmn+Mfan2J6_8oO9lRn75ws zifLc{19=%ce1HDrX-8M_|}I5@ydiQ_~mc-HO4Nt(QcI5=~DInwV^hv&_R>LrFg+ka@)K@{K3C4 zDONRSQx~c_U23AcfQ9lwIY`iT$RJ+2(W~kXaBw~w2MZ)qDAhweSOdGQOUx$-^ZaWD z@~Rv3PlL8*2Vg-DF&7;~X!9*>FekC|o(?0T2pGZ~t6M?2#LNaxJ9=clp`n zM+>7P={7VjE`yBW+zggs`$Fv3FasYqRrFR-)lS?y9LBCL zL7%=k$#5~yM&{BIJB90}m?e_}9Xq4r$44j8@Su@9*Mx z_2}dLfFdFjC{$;hks&cm6KKVxj~tKUPw}mdC$~Qr+5K$%$BcT@fe1GuwmnA$WS_-G z!q?v)%0nVv;-AzI?btHmx2_0UsyixCTxSM{r|Mxp4y2eNgcKve0>N(na^B;&ba~e) zf7D0PRB_j34lhRPwj~hkn3uk|0=Bgg|n2=)gtgfH?o9mRcN&jvy9 z0Io$mr@w~)OmQuQZKiHnf12RvP6!dV<$D@o16kJ^_K6G zAbgJ?o@5P&OFOM!n*D^}E7mZs83(Ei_C|roCJy&_PnC>d>(!KjK-$6j&OL&|RI#uM zZGHGeMi4XQGDNGW`ui)Cvnv;lE<;swGDuO|(}pKrZ{y`DzE411k*{BSBCixbwvD<9 zLcKnC)gub#u&DOnTk7Z}=dHzTo!UoZHrYQ6i{POdFtZ-7qxZOoN`jso*mFJr(dOLn z^7D0HR?NrMa_oZ;Pg5}(74*0Hn^y!f=Pw%j2IhJO^0?J|fj0cr?k}$PEn6qrY=I%4t_q;lXK9Yq>VMg=r{SOo3wB`zqbz|@^e-o zq7ZkS+>dZn(+-J^BQZ}Uf1muvPwpa`Kt8uYs1w<=pmGT>hHeP%nyKCYiI+7C!AkuT z0vTaH0hz7CX}wWH`X3gGxu3gXHsLebcXz+h`<-E$T?6_ncYZ$>gX?om94$}%2Guv( zg1JAqt-?~|`WAV7BProTdvjg)$C_<%_f3KKhT}*8tF)@YzK6dsF=RB-Mqt;$}o(kJ%?oI`^h^OS0dAnQ7y)Rz=gsl>rlHR1U#(9 zbZ9Z*w%9?1h(d}$e8}A6H?TFvGXr|6Vh898INPaatG4a$OR#OCCHCE^gxo@Nq^U9+23Sl8GF=_oMZtX+U1^=@=xaz40pN>{poLj#B)0eq@P z$?@!sy1ypTVae~{xT}CFi67oio%#TJ(c;!-{yM>I&NovCdZoS?QSUx5&>uv4uO_NI zMc63TJaTn{z>|4m$(ZEH4eez|c>mlM-e~oIw`w(&r0WR!g|>;Xm|?MWl{yQAGTLtO z(Ju<=ZGTOy=F60Q<6yqwp)hCYS~iwk zoD5EMruN5$$n}1l(eW1yVw9U}?_*|JU3#9%*S>kBD5ywr_2yAWimp7a)(F6hzfVb4FXcfLi7eFsDK zydTU+zuhsOavV4$@~^@Vw+scO2Ne6B11&G{WzU>&yR>)JwV)w<3SqE_QDub1v)p~P!_(A z4x@nz*JJgY!*N2($udQ!ohI&@LZb|+THL)^AT;B)p4HD$_0PFmZ2{F=|0lN0cYbs5 zv`e=d3Kx f)-|(y$s*Mssbtx<*AZ{{v5S6Z1mnNi194g@D5eVp7}m(+G92jWw(c zT{sR0He^p4&PG^?GY`yAkJoIzWzy8)C>n#|CYWvowX%H?C082}=VwYx(%SH1$UvB# zwqtfJEpar>>+B9IQzL8oNQ<#pb~Wl@oML;h#?C^pDeR`pFS)Q{_>StRtr5BannTX8 zTs+Toz~YU@TKvCQ#QC)dZT7T`4K!>eEncNrf4vF%rP&pDg{?5K^tQS6P7ZvrNE7yR z7(Agdu>;Qf8wKw&oX^}0o)eFC-ml?8*=ex=Pj`8wE^fyOQKnZ!ANRp`J@)l-=E@BA za#oAm(OcwHR_B>@L$B?GpkMW#Yp3Z_bk@#M9SgsU1wXo zhhJSkyHfXwwB{@b*;RN(?sM@2*E)(H5-0$SIf2A%QPU9kkCFy~&^s~$RgVqNZI=oN zweGsAYqff^ay^^8=`SYgn}7)$gVy#k89OGN>HV9)9}Et^XUvU7cvP!?wk5H1PxYMD z)huGfl(-U7|1SOzL+oZGf-L*pR&0F7(!{Wc19$xsVNs3=quA5Vb1$XogjH_vC8wpL zp#Ni>{B@RaF`^AjnBcQDmT>d=KTR?-x;y<3ZTTN?^y~PL*fFo{$1*vq+q^NF-|M?v z6w7;8LC7J6i+s$}mU0xz+9^e6SKiWn6pJ4~q%Uhbin~>@z`m$66MAgr7~|e1CR%rl zZw%?Z*@rB*VX01wi#xCs-=}<>2~BFYR6@15Mx4huqLMeOFiq9oM-aJS+{aC5Ir|`E zthsz((wraPVG)@Tj=a@ag|dafuwl(|X{?|)(dR*b_HBptnSq@Z9;C`&2yWUjb9JxR zad@J}K@&3vmC^!^Ve74Jpe1t`Wq;GKpV>XlLCk&r==dN-yqB&;R3-XZymMvv@;30% zpDQ?_LA&6gZD8xdF66S~_*tRg)$aSrE-~&8i8GZL$E)QZPmnYFthn(2Qw3@T-JOS8cEgx9B0=G?(G&HQs`KeNW0x4IV|WiI32Wh@%@K~tD1IOf zxz}QW)xW$EdUc*YCWxK6F1++q}p2bieo1q(us9YWDvj5lD(U6I!&!kOCeUW*X_|o5p?uShB;0~1otrmhJP$}QN65nX261Mi6XQ=_7MR+X zfd;t%j(HV!m(FH6!b ztGF0Wm)?yead5kp>g=b>FC1h7GO4oTceb`1wlA#gUMTBru_jNK)VRb*Vz1~$YqPz! zylFbcmo3KwSjj_SkU;r{GW?^MLX=3zl9K;WI6Lc%2T+dOFrYlj(DqjPp;r17F!U_< zA&-~TGB{;)@75v8C{>4P-;VofC{en8E7}Fv^CP5V#t%6!#nL=5jhYsplrV_6W^83F zDx8ktyU%CbnKoiyXXMzCvmp2NQi=+>yC~hvQaIkRDpQ&yMV42fel5ecl)>KbdFx_O zl`h%xcvq_ab!VtQg7h!zF5fyxs{;k7khsT|PZ}=_lx8d<-S>O!FJ00c%0b5=tw3x1 zZ7zQp)tO7#VLh71g0WO4Y6pV^hj+oX_=Ec0yiVZOv0mSvVQQ8%m8+2ZL=Zpf1s0FGeSC+%Q0rCJKETq7*HNQ( zo-^peWjx4;lz*8Y`F5%iL}ME5^y!Dkk-T70)xdsYhIjBZ+46x~SkG~9jjb3B)kZZF z$(^%|eDduU54yjk_XgmVz95ug%rk6)iobciu$fBTi*+$Wr3TKWuN=9{FB|5L1Q<;z z#1{B{d}75D4(s4Lj?Y>kskmdL5!C6y=i?bL){a5K866gA%GhnTtRYbNxlBMuLI239 z;3eT_gS*`@BhH5(J)pZqQ&4;!nG{3vAgx0t%5>NY3Izr#mxF8;o|Xij&d-Wb2`%d) zoeEC;p(vwgrU~$8vr!O2<3CXWe%p1-e#kf`A66`>v{5hr#QfSJpUX1O#yn%P-!qIH zvww8fUM|gmr1UB)kr#>#s6P*7lTjj9B8AvC5WJ=uA0#i;>ST zITf`#ySu~k{Mz0sK=|(0(K^5VAg$CF=UlgQK@-51A z9A#)vHMNSFUuu_;k!Ib%DdUXztK79B!b_mdZvexy%JpDnqZ^5}W@;bPdbu`YtS9Z; zp`yGT+XvFv`CJXbZ)AcmEg;bU>=XQQtcw&^mb6b<;c;qfSwu{#Zsj}S^V0(=5Wv5q zAzSMeGAfZyOIg}*X&yJrp8Mp2Dm9rll`h})z}Jl9t0e@y+Uw+4#+?2ALmA{JLCY3s z2MosD{U@yNMt<#-be2-uBxWj*l^tGGDBtJ^dtM3C2&=3<@1+nY47b^+u~td`PX8K@ zazcMQo422vm&97QacQQzK9|HemArLYQt#`Q4?HaPr}8y|X1Zfl^b4M^QgM|`P;fG$ zI&&y{7e(uoQDQl!!_?f;_(D0~in0lh*Ra~=(nw(teeq{>ME{rJ$0VyN0~?)I8xS4} zOq(UrIocGAwcCtLbMEA2I+-lIJh1(um3*63mZ<&aXUnP<;vd?w)0^+J@d()T{nnCJYp52u0D26pzeJ=?I)jEX)53Pe5urDs zThR43)$si(x-a)1M|3asW)frg>Jh7j>jAj)SWMe>M&Y%;Pa9FjZ*L+*Y0Cxqmg7sJ z3cC|=Cj6oWwkN$az9cIwRUKf`Aey_0`5Z5ixienrbbP>8q+shL-X zEFF-fF8`q&5eI*WgRyIU$(nEIZa?~pgWV@$ zMuu#*n36{-b!b^@R1D=CjmL%R~ay86s57I`C+qVgvs1NXZ z8;Dr#e8`bsq4R12$^w};!h7Jl8!1OZx$7GUK(80RW(cI1wGG7Sy%HJKYkjT98lhwN zgOk?Y8Dm)J9j3OHRtZaD3lUX<^&vCa*j)LT@v(Jc6s7!0M4E=83fkgC^*`qy1^0c4 zOo}!~zV!*J5Gp2dy2nmcxe4t|=eHf#4{Hl5v<_sH^t1c(P12J`zWLh0H%(S^kxY=~ zQNOZ_>@lj!?ahs-_SD{UGmmox%BY@SjHgem6lmQ9G+G{clx$Fo>5sV+`87qc9=N>u zrVBc`8pbvmg2FNdRYtkbY`RDVPth_Oy>@~IZdgbu&-*nm;bobZ8xR?eeQF>D=gSPv zQ&b7w7oWUSGB^DmW}H#))0&g@!5%+Pk9p}|9#Q1{&uF{uDav@7Qxj|Kj&Xib;zUzO*9aP^;)vXK z#hxgGtKErlPn5cebzFuHAS{&pMmCAg*bf4@9V!EEGIs*F>F}T5mor_QBz*%|9C{kr zRjdJg(sN%t;2U|Hn!CYBNYJ)NWBaX!G;bR5b5u|^3kJ0g{Z^J=J}6!fDS#$T35y1Q zfmn-|BSP9>DhZ@ z-F<3nUa3^q1YJWGT2MLsP|$;)k&oF_en|>H$1CmIG#x~3+sDS?9Z8+8l8ING0hG(? zn>^PBVmIWf1*kEK!Z^@mZ!KJz#9;ZU@|uq}6Q9c?_Hw=m)l`KA-=g(Y7yReM`StN9 zJl9->ih`T^^|FsV@ft#sPNELADc^hR>8*(8*! zH?0r(neI|VzDf`EJo^tG&H83Pm1&`tq{TRu1r;^_yh?!bnfNT+#^>6>8^^`U=542g&sz%g|qXO zZ^nyep0TnCQI-bA;?@diTOVbwQZR0sm(-e1K8kpblLu%dxHv!OyM12}V?A18zZh;h zh)tSU_l0JIik7_#fOa;In!W5XQ1AaGS?t}vJ`8L57}f2n+MX=|U%x?4lQJ#7-Ppgk z7AgnH%jVn$qX8kQW3O61Y^5JE$HuyxV63|ZO058?gx*k(mf+4$Vg>W2x;^RAvEy>7 zXZc)?gqu5?WSTl<&|I0cQ?u=^-!0?_k3@t|nhz0N^?lftz3wW}2VJ29b8ha}EH-(L zkxZ1K;pN>3dY6v6N0Lk(3sdU>@0KHV)N(~4zD|iAi#irz7Hy`lg7FpgZKsQJw6t8_ zfJv|R{6q8BLT2fTaw0=IVn(#3a`GRlOvN9^b5R$@sdTolbEC>~qY~7429mJN*$YH} z1B9zu+VQj&iH1W5O%HD|WiQsnwkOKW>Y+_qHcQ5#wZ-4xSzOj7d30(|c0Jo3SZ}uN z0}OE*K`8P|ne`B~nemv9%5ir>$>avZ8<%|b(mZIx=XtXDck<)J1mbi+7MV+ol!?X>OS%nbVN|Xfw5w2E zXiL9k{nsKWx@-_ji4&R3-yj-|$l&ZcCi_d2d@|!jMzqOj;njhVp3fHHGcm*$H<2c{ z8G(n#9Pegbq>EKCDR|`Nr(|`qcWQDbMi+0S8@Ls#ymUZp`%F%NE?IhFhXp8k)7$Z| zH$O*pF8$EdA{tU?#aO6!man-F(A0POs$C`ZN0Emrf;`kWURR{{)PSN-x^69QOr~FT zxs%hO|CpSKWp@h)W?AJ1*d`RqVN+ z@7OmhOQ-50KsvN(`F!DsQNO9*u+{i^?9kR}m$kc;wFgcMd=J~6koB#@5EZaMhp(vi z#pq%tkeb*a`0+xUKb>{pCX4g@30r^;ixEHvH)MS>QEZ1)Uhy)uI3l%V{d0d`gTosm zZ^d88`VR=x_2LOt7=#DGg$AuxY@r{CUPAk#7eCWFLooF6ndNs;sS#`3g5JJi_WZkj z_@)ns4q!017{9H^ccwB}e*J>ifT&p>6XJL>z3=)af?($8eU{KbR(ec{JjzP<9SC*2 znK4P`+!56s$C?AA`Rbh}A4fGv5p&P!_iO$KPZksLjr;87%$b;K?$m0bxTDmvQ!0;H z*NKAmZMlIxeTT?Z--I%|2!z<@XkHpv!%oh(Lyy9mCX2^w2EoB)OYxyxZbZ$YJb$@@ z&*ljnTe#o&MX2L^$Bva^QXkk|um!IQvgSDcrIH!z%;%64_+yRL7sHx3(|58sIfxG+ zMY6L{`SO)JsP((biTuQN(8_WKDu70XMiJ&G&3cj;{1LUM`ywamvBHwOs6tAv<&`-A za*ydhM<7eR!XA;G;}jg{ zXb=>!C&Y_>Y)yU7L=@K66u%0Bx;X6fJMbO~r+1XL;r+3M{g_f0_EE>;<}dg*fFhFJ ztbCBj?9<5t{x{`q>!}*sMwW-nVn-*s@7tOmlVngpd9>pv$Fh?CE>bE&s!bm7<}MZ9 z7rq35xia5}jLK7u2v}yGm9Ps?e((u@@s5fpGuF(|8$5T2dIl}}kbLvQ75=2*GT4cQ zINl8xo;(8M#Hxu@WEI`c{=$8K4%ZiBSH!moAdU?4{*5BcdWz-Vp9qgJU{`kc4kFz<`JSi9RfM)B>^Z2D(6U&#)ubE1mg=0fCZ z30;nqnrntm9!j+LY!ED@3>VUHEPO(}&{K?~J^7=GEnSMj2>C^RBR=d|k014f6sVuR zRDMn%6<+#NgpSKvdm6#O5$~^Txrl@9^->W6Co+RNkNpiDPi;!apszjO^D7Svg5Tcvadm1F8qsYI(x*`5C|I{bw5}dqK(6VE`UaJKQE0IxRf>#1T7#ro)pShSTcF z;Yt-l`vh-Z8|dDK2opOEVLO*_Lc2fSswrW$YQa;+@ydl~$-994MDjy_EcW)Y<#aP^ z#B-*7dc|zArxz*3ouD}otJA$@5ggf$tWDoqf~)}lTjj%M@Na2F`$1x~zkGmI5=?sn1=B#WYLfWU# zbeIDYkz&E?;`aJ_XGbLx2=Qs~3u2Tvq3@b>2J^xqPJYO_6lEGCJvMnyyKLfV2Bqhs z?hltRC<1ME7L)~+#Rt4W8LC(Afbz*bqz zF>NZ=gZK&PUHyQv+gegWkVUpYxr?c0S+&xG#<`n?4>y@IZ)#c-sYHP+b_h52jGBn= z7gVyARp1l(`mLldM-o@9p2g^s+o}L4Ts$J~ORi=mi=kh}#}EHW%`n;1$yeJzj!jN% zPtEVha)dWP-!D~Y;jKS!sa1G>^*PBxBnKPo7H4yWr*C6K(oD{EFUqpv#(9qIXc-n0 zZ;7?54}{Aps~3fr+D$60r^qilB>$~0+SqoQwXU}I-7?~K;w*c=D#vd&AJV=NUQ_6^ zZ3|hD#+d1C=b=oeY2&hBWYvLSS(Q!jO^4W*f9~WT>ap3uue@R9n7ecXjxY5K$s(eA zomR0`vTDnC`Mz}qQwZdmiorgB!#BrSl+V)^g0MoQ*y?XoTnt5`Yjkvr97d%^M_G*C zcLp+HBog}TRn?Bg1;nh!=#p_s;78)5FL@LMEG=F%uh>^skbpM}NUog$FV4=AOd1M< zB21e&(deM3?1MDo$OzSVxtuFv|7;~9R{I7fa0goFRb;QG^b4={JwHLEw_P%A)A1#h zW^B~EGm{|@uy*Ul*%Qo#mxLu7t5E$5uzwII4tF`W&VTS5UZ@ialeSGiMpJXHIaR!L z3!*?~)r9=`PmgETdtYtpj%7Bi3~#G>a&BR|N}Ed;BW9P(;?-(0-EFbH;=)%xky9HR zsUznCLSwwyl85C8bJG{S_Be-Syq3aI6k=aPSKUFo2A0LDXCpAcKPv_jG=AcWl* z)YK|BJ(S%07rrxKkcsF7ow~q6EX{TjQW%_wTnr!o`XO#~9wMV?1V(x1{!NSnLZ^re zCAfqSltL$z=_ITV6=sk$@GN;Wb~#|QH(`>c7E>cn)i~0Pnz?EfzcQwvZm&CL-@a4o zsDKy5#Rc?1nPF5p`NP)Mub}#cpewXhj#rTA@|L!(E&?SbzQ2;+MfKsVxZV0FOHLE} z44A{{W$$b`h*lZB>3mYlr#G1};bl&JnrvHyrCe1oWeh2E(`Vq-gz6yYp7Dh}tAy`nilw9oVt&gTmTLp`&m;(0UrC2fQ4|$K4UW#$8;1vUYtl$_C z+o=67%a*J6k_;|==k9qLFp}?qs?DYJw8o2K^&S?qcQR#YET<@Rls@WS#8t-ue+PSf z6ROry>Zt3{(vg#sBwX@{f1xSl$W}<4*gk#MK`D33IHTygVRYw{ZX~R-4Ezk)Nnjtd z!}fBQOyqj7uvRbqVKv{_@uU3+Eg=xAoRQ(xIbGBRZdBE|JvN_q5HGj|DKVvq<5Uq_ zYS5b4i1MQ~gA`X5UcxZKu47|Kpb~5jXbW1ua!|<+WB6R ziYT5}y5O%)i@rwn750J}G8N7~P3kBqDJjnIgw_wr<$f+!ClhJw{%2KM}u#dHa2-nW!NW8ik zcqndOkDKm%9>0uQ{4mg$vz!6673oZ92^>4D%UsZBDcxfJOx|kYQ44RA@OV~_W67`Q zUUfN|rgV96?M7w-&6gTpvQ~5(gT{KpNT7dmyB1e;s;ow)sn-l9Rv{-w3?EYW{qxYU z6C?`JT@aQRcf~LgbU3=?RRNhUv2JM^$$zK@(fs@ThB1perbzDdzZ2R&T;2C$oNN@W zmQVd=-B*-VKnLaz$9@HHh`GKw!|cao3GTgSl@x-mfFpm6u|trmZ@Gr1;A&#n z2QazgH{sWUkW@)msT-%~^VyveEWxc~C2d zGO77@#>XtX5e+jj#fcLqtAldQAjKJ#YsmOZsXlphVxCsipS9J(RoJFI?WLuUCA45G zgr1nC@j8W%rEk@|N6Rh!@&drZmg(69)@8H(%Ne#EvMD|*7d!oRsZ0<4(3RY!2kzDx z`I{ep4>z)jSTRHg*ddWQl~AHoXxsFa;>cZuJz^R7u$y(7{F_m1Zay9s*X$^!qAQ6V z?uMV^YBfvcz&$3GM+zU8>dYIhsLb`}U*o@QfldZiL|=@}MQvGvsa7FFW(j+84j6vL z8-j?4y7AN#_G~uTzC;eVb~;P>l(8^*p%sL6^pJ!x&`}=y0Q01Z-hsafNlluRm%Kc2} zTY;F1%ANd>PH@jzS6R!<2P@rMVZAP#^DcJ(@VVXGRjnl18b9hi9~?KZ_WT z&GxHPXl<}a)K^c#$Uapr00s)0{-TEVH24y(Q6|~c2c(F0gVj7p4~_mjMFwbot#%}R z20~X@_~Ajba1H|_&YYS(7(_a6sM}U;c!q*k%gB8bfLNXo8~-4! zn`#4T{cWDWJX<~O3c}PM3Lni$oE+LjB&5PkJJnr(=7Eb$XXR@um1rq+Dm>4H}N>A@m|*6}ReVHIbzTeJH_%pyCj+(60zc0(Oo zb58Q$zlzwS_!@ycLHU(akY&vsYNgkgHG~Jv)0`#kue|JDCUMwa7sxs%Q(zxMY_4^l ziVB~S!BnXD`tJ|Qp7Ff`^S$k<8HdQ>gpu+?==Tg{QjFCik+1gGY@_ivRyG!ILV@^# zy!P9-Zi=Y$cb%2i2OZT%JbEL9gk8WB)gw?b_W@!hb62sPY)JMb+0Yy_^3Rv655a=Q ztLhQsN7>RH3#Vgd@|C_ux*K|p_%SCM$tm7kA|bM6mDhE3U;zXkG=3puDW^$kyf>Jt zhlgLE_ogMLk(4^!;pt!1<&QyoOKD>i+2_&KOLObrby~CBU?4O&I(BtVENe5#IF{9B zqeljHJauJ1cN;ZtY#bZ#?r0H;zakUK*<4||SiQNCClx7Bl-}~ye5ZT2Q7EX};#1or zMz6$PfmU|RjsClhuhoQq{I;@A`)^UUr0OP8$%{f{3vutr*UO=tiC)`~b!p;T01unn zhj0GAaLMaJP~I5{4y2K%9`W|SJFF54!*agL>#81Okdz}Mo1i20rXuIF%l{vH?;X`t z*1wOAy#n=j{r=%vcyi7@d!OAt<$0csDEFv2dfPuYenk#w>C}~s zcMC?tDR%nr99I|i2^k%jrn11II-#aFecRT;#eGk_VwAX*CV@XI@183VyH7DkSHJu& zauE@u@tt3IGx#SbCE{=9#y^}CTINO+G6@Rp5az~BguE@d$=nF2g?|4?seAo(O$&y% z0Eh(_#Q-ZM+X4t38~E$1E0Y-#FuK)&U&0WQ`1L52Ry0HiWln7 zx@V8CG2}d*I^dpQQ3NNg1`%4PoD(_<%QldMMM6N^B|_98wGGA6;?39MF!7*zW}!W2 zEcSi43CQVs)~u2FvUPKLeZMi?%{8CpUi}Ss6G&Qh42k;}5zXaVO~^0Tk7OdUp>HC1 z0*U%azB%i!d@~~Svbtzy>z#DjoQ&|-b(Z@yY{iB8M*^r`6P>Ni&W8N1NnKeZklUS_ zL<@`tm>oyRHc0}!LLgge^lCV;y@kyxWOd`>PK4?WT$?YVhMA5V)b3Jdmx*!d8=ogo zc-}|cH?Lf#@TQ%*bw@4r)RP!r=R-$^v`=2L6MlYDbEjyntlfhzH?KSl)7eL8`eae^ zEaJ-W*}W%^xFrzhmwJibi698$p6J=!?VdyJUR$GjH0O2N<}4ZvQfKtm=6bCKiQ!+v z2$K6<&lVNY9d8iSiCm4gyx~4b$VZJW@P?8jdFTza2yY@#RwMU@u;^pliuZrnvUU6J zLnk)>FhA@stlB6jUuXT}(w~1+ecj=)m7_dY@UI*HysF5(b#Ghry@w)yKfig|bbLEw zT6%Wll*msdZ%@-vyy51yHju#Z=d1oIArDG;zuGJF^R2ssHBL-Fx^5>#HtG;jqp9Hb zOFYj+mizwL~d<) zG$#6>mzAcG;?R=*xN^at%Yai(>3G%9&eUG_e>w$DNqu_%?ZP$3qWIH4cb88vd}p!o zea~t7r0Vt##x&&#>nWNlC_cmAe|t}urESm8H=B~ScjTB1=Ax%X`~SG{kmlp<4pxIk zTI6ffb^u|Il(|e1JN-eLwx|U`1@jm3*H6(@@WKuK!#}_8{x3eapw6+FqU%35@6c^U z#TzAC?#0qPy=AL2bc^aXnmeP8`P{kTcI(!yJ4^kv-TI3UH#9u`agfQz;# zO)a2wuH*tU+H%yZSlS4S{w}mrQ6FhcYWfrpP4SF-+n&&l=-uL6FdBnPvuLJ@;x>5I z{%5_XXr4Y){Hx*({bMv8TlH!8HM%x2F)^*Y8K(%EZ?s#S4~kByu>JWf->=ez*)n#7 z-$Q`idRNy`nir^L-A8}c>Roh-`?;VtWafK%+J({#;S&d8ZlPAsGtzt{k)6nlJJGwH zrrbj>=zojKJ}(;ZbFtgGwP2i|U28X{=`O_$X!;5zY&Xr@OfPSp=**eX4R=>_zI*iK z&!cI}RxXC$qS#roj?lDI(Qa#VRCAVc^{+G^yp2=D0Wu;^8-^bGOMPBHzIyQW&yZH< zm{_t2hDthar7oIKua`mS+qT6GhzpuF6)PiCvt;>i0I4r6r|Y%JQ+MzByE&%Pba7s* zV>OWT@9ud7*?pEh!S+CLs{;bQ0l?KI`W=^L+HkjU4RK@_eru12__job_qD)1@4 z&H?jYI%DNPF0%kBQcgx=_EV!6-0Aa3rrB=s{iWl!5!@k*xi*K7+nv!FR-xMAc^u>k z!&g?QxS@I*YJ|Gk6)j?Tmy?j|;oJx#Y~2yqi=K9Kqn}({H*a`46sk~xD7a2ApMCmw zg@5`aKBxEeX;6$>=XbecSKP;Sy-p4e=JbHyy=KRyU2*Guj9Gt)V-{IEOaJ;SG{BvGfcW&xGl`Ysm*zA)rIRMFb8mQO_}E%ZubE34vy3X?=btWv_ljGpV+ z(Qwslsf4CQm17NLm&3EePk886?Fb~7!{ujthgF`u@Kz(VehM8OPyTOJtg_e>oP4P` zVrHh_-0jWW`vIB>@E=V&A?tJN>bYjzdBqw2Wo%0yX`fFO>kbIKw_4Ma(BEOCQoXpjYZ-Yt4YUo|k4vc)BDi zWW=m9)`e{pY)i>i@Kr9Zj^2Kw_0y3Kvo*fRd#>eaW_+V6_xug{dOR7}KMJcasyBqY z*vK%swvPXv?cGWp;$BluxaX)!d>Ci!9@7-wwe$i@ekAO10|P9O{5}ed5fW&E+U}>U z5@%D4x&4MzE=s;cWeiSiXgM@O?-GEd?7-ysE7_3Go9UH-WV+SfHt9uQ-M^P0ty8ao zKy&ruKo2bUSo&hnQI)*_FcHr{caYa+Yl|GJgJg9O?zMA|Rk|4@W9FtVAt(OS23qei zg&epb50d95UaW z#Z~ibgu}HNHKBV)-4lmgp5%|PJ4h#7yqMe&PAF&d;4L!5prR*aUC&x-oQuGwuCf%_ zb;qR8ByQWh>j(*~~Sp zR+NzSQ5ySX%hqIMZHUj3pj{ho!5S0o=zsU`54Jf{Oz$9Tc3S2XFU{h`tJX;K|3fD} z1jCjtHeGmyrVji6T8Q^wyb=Cmh?K6VzF(_&x2q z=m2$o-`#tbrZQ?pu>aqqRF?Dnv?Nwt+XFk^b?06^n(tb78Fswn=0kgFN(k15RXD$* zgSHCW-Jl4{6H#RS`lm76S2uUZwPE%)Hr7itAMbuu9eh3IOV&02+zvN9j=e9I<}g7& zOEYJy^1;ABtD<|+KNY_F5HDle=`BCMZ}*|wU`dv+I2+K~Upu!qJhH;i+CAH5^Ms~? zX-H%Ki(%35Xe>H9I$%pNoDax-%Vcsl&0Eycs$SOj3A!u&=mpdKt=65{f)y+8?U`WT zvA5?9G=z|!ySvB9Z3ts75TIhu*CW&=yHmO#3fMEW^AguxNCz+@*y2D)7o-(Knkxum znq|eLK>k3WVU~1(`gtJW0J6JaaSeiiaOrZM!dl+P?YY67Zomj*D(ZJKa6bq?7MU%M zw@=No?t*Ho$e6DpOT#XT+%zT>hxwOH^2`e6Lz;Wl(vRITGPQ~@nqa^R>3yTzM2IBU zAZKVvcvkE|cxgeM6-xzEH3wwAJ|ls|zKwfd)!iK+qSZk{C}FcNb;@5l)gTC?pk>*a zviY9*WU2Kx`0`g$fFlZ0Idi+v`L544Kvn1H*R0L8k#;eG%K3FyO{aI^x=~*Bs>Ygz za3+B51QIr_fe+Kce(tAniF6hA&~H)A&zY-#Tow`CN@RDp!2mmm(Yds@KeAswHLt4C zhsg3eQ(L`*=*zpz0f#8m0Gd&EpxxCEIWFdiA1n4UhPpObDFp=IKtM-$4UFoZQ1DUV zSEH^~Qr&0aWW3z{Y?jN!P$6-eF@}stceT+DF47MpLbqe9#v}@IU6Ew@YL?f4c~d41 zBH{6y1mW`Ek>e5cEm6Yxyhg?*hU2nvq_Z78a}2yDUfzeBJ#viS$_BQ=X!tTWag?5B zk*TUiJPHry-t&J~zz0JYhpA<$0h*oo^!uIx)Yi)NDf=KExiJ+Z)tdD(wCq$q31YO^ zS)ghZEyEFS-6fq1Jn|61i+%ygc=Jw&BvbDuQ6l3+N7h7)<%NN*;rD9uRb58ot&?ai z?5jTYCEO;X6)gW;{t#6KJw8bSj8I&0qv^SwG7t9?JI4qdo{) zk_{d7cD@wi-)6}nlH*avYym46rtjIM)B30hy_WGPHp}a1>l<$5hNm^4*E;Yem-P~N zs)$kfLkdufrwCHou!X@`1ao7;ei&HTCqS-&b=4Ca9`xd z%tO{gQ~e!rqH?p`UF~l|MD+e_i*%x-- zGHQ(A`TosML4edW%v(3;G5=nPaSNo%8qLz2C$%6H zLB<6EN7FdVGbk^?ygxU@YYH${XGj$v$V`%SRv6!J3_zD9JX6Svv%b2n% z-wCHOYIy+1lfPnPF^74!>~(-wKt&H?T_E{^PA%CqD&UEP;7E|dj{N20b?dE~8tIlT-s6+=4;-++L;Em+;ed4Iw(@*Kz z9xU`K9_JXk;E4Yw52RhyR_gx1%0hJi>$HN>ug(Iu(-Ts zNcd19KrsTf_!xpx>0^TgmK_7dD9VMNckD~AaWzF^>#rPVHb(3>(#)3-WdsuZv!C$W)$V?U70k%%8K@<56)o=-7OT(7MXUzVXek#UKLLULBo+z&$gomH{1M zmLMVQ;lx-Axx3H`r7>OWqt%{8LpEIq*3a`CV@)4q&x-sTEs5PV^9A1Po!){@z~D|` z-&{V=BCcl6oCH3s z@Y5+F-aa3OrKV3>;-`=)%RTpCJX*CI&uXN%y zE0|LFUxfq0{$4pvyLVT!yu{d#VT0b@$q@@_Y}_yN9ogfS2dQh`2TNSs2^3gcvN*L@ zfQh|T8GvT>H8@=$o z%77vw0sM~-Ih`ev=b)_=smnU2JPya)?;e-=g!W{rI$^L_&IyyM|ME-SMSLyB^-vEC@Gl6hU(-2!@ZGMSZCzT|; zk%U;6GLa#wImAIQ^E8lyQnT_tFgth;;ht{XI5mCFxY;L)bppr1_q{&xyGo;k(3;nm zN6dxIr-T!)b5K6vRK1B6O`Sr;pMTF*S_14Erx3mZ()mS&M?5v{5Qt9TgM;$Ls0{1k z>4C2w57OCci03dBbETUNCVlgOGyU=$6UT}vPJQ9!9_Wd0uIm#fgXGtr`c&6m$Nf3H z<))B9cwPys$r_{)HLe47y+PWj2}I zR#swVHBijHE5P$w?kDKvaOmWibL1za7xOCfm)3QQrqWQ@pwv5q5vtO-lB45kPZPz0 zzoag_e_5QOU#V^6YB+AkDtnz-%e7RLH8-MV>4kgqi?kXiE!6B$N~OVgH}^Y#2~tcB z+AlZ0#PQ*;X9HH$$ycO(k4EzJm!C%8QpeVVZ$8Z$Qo%<-LqNv=6|3?-*|d90_@Vk& zeyFjgppx9V+-$pz6!oAa14ixS4|;Z(kvohhlaH2lFYUNox=ehNvt#r3Lw*`lsoxEpnyB20SH%CD1cBh1_z$mwA-131WODK5F@ecq$8 zgWY6SiphpIkVB7PZaEexJ(t`_s*xjv8^q1B*7QGO5<%8NX3U5Kp{6{3aH+7UfNot> zSV)J>GF1772b?xA@io0TZc&9N{#x~E(k?4Z<%AR+YVWspmmzFR;_9dLp3DHVS=oVE zoY{l@lDE;B2d)VZt%IRZaeXpdsM8+Ryo%fENqA%*ms<{;(jp$^gld!FtHahS@>3s) z?OWGHu)>nYj(2uNbSw6sF5^IgGlS{F3+y$PL*0~6GG*sLWAldJnM&r}iB>I7MIQ6? z?=o<0wSA(R9WgKA>nS-s&7T-*seb7xfBRxHg{^o<#Tn;&qx++KgkCbML(Qy3K6Dax7RnuN zJr|ZqsD7e4_)z64{7->U9i}xn%&01~9^NQ=I=!NvkID5gOHX%_H_1LmpD~0q**bSR z5;43<)bEK@t?HXEncI?dnUy-R?htEiy&fUd5}GtWDo-Jh(9{KVZ}?DCAL6)Wy|r*B zZQVs;|Ja^qn*3N#=n7tkMTsmGv;y{k{gLRlvM6mqHD!&Wz9cDQ_;Ix6E@OEn{t6W= zl}?T2U^2<8Q6mcXyXT_XNK~SJT<-DadYQn_^uNZ1d4ai5K(}hOGH&i+{L;8tPH2{W zt!F}c528pB1gC0MI_6C0SNMyr3Sq4(nDBg|qeQ({N5Mc6`R%=7#ki;Ib;|N@>}EU2 zABHAZu|bXk`AQY|mixF-Vkkp{(%78LyHzl0bY?&J$>+;SH)BKdRsc;m-;sZVZ2Zbb znlUXC{|(0>R;@SO-WfCQa{O-7Hu#QhYrn^t)u(!M3OWRw#&5vdAGgY#u8SQ{G&HLx zQ(vR@_)JHtCS0^gu6tTDImk=;8ky+bU}l!+ofTxj2{(=*BbsVTcpE-zXTkh|wFtg3a37kep?Ptu*;woBAyImt*+V ztKQ|!+i}0&W;A5hvwkwotx!JLU#6wZ-s))Xp|IxgGHX>vPAwH|K}x4z-8 zj7ox)U8-3#XW$@8NHwwNHCDKzQ#hw}DaPwn0^5e~xw7Y7pq-RgY^D<*(it!FbR>=3 z$01GZFbtK*Bgd_Aj&{Y2WsMZZIG7Bx8aT*x^hG*Mg&Gds$xe^y$2PCSw|u|Uvs{#b z{NB6le&>ck*-&ZNiZIvF_Qe-Y%0VU(=N2>PuC0U;zb^PEXEY1zP`P}UC!CpxZ%b~@ zsw%TSSQsM}eV|554+o;g29-s15}J;YpYY>&7Nuj~&7R_HJdM^A7-P04lr2Gkc_arF z?f8{q-_Y&Vs75N2`t{tjARGR*P!YpbspnD?uksqgcOI(%FG4mlXly}_lc2t=U}R_|1$K6$ z9aNXMMF6SCjVd*f*C(R%SXNA^6W#^WuJPQ;vr;(GS??D*Yx4@!`3^Fi^cXs(Q5P&9 zxYg+nhGU^P-=%-l&wB;$trAqgp172s-Y(Rc``gV^LPJJ!2CKrFABS$XM@?iMY{)upKkK3i^sE=8EMtQ_*IE&X3N>2C4V0M z>a#+h?_Au%KAWP;iMunZlPHFp^?#lL6I^Gw{(Cex`c}xFyJ_5eNEn2Xk%R#bNf^j+ zp>G{or5-1|iQ0ObS|AikAhJ5B(NpdVG3yT**CuW(q>swID=zUvgszAw#jh5g*|x}0 zCiNFUhyXL;)nFtx5)CYt@6W6Qip#zs`e+j6b{G2c2!@cAvBMkmajgLR4GuSr&tH{Oc;#HmnI|oxr#n0256$<4qZ2NA2cOY_ zxZ-(Z12%NhIhokbgsY+Ak>=UriyNoZhE*DZn~ALRr#OQR11hnqi7bt6zH(&|sA%fF zu^Yp;H8Ks9QfpvWetJOi5SVR4-uXmTTpFzT&Vo&SDaW`+g8k;skxi^2j!PPld85I z6krGYbE(W8<7QV$C8#}O&))75JsO1-;_02>QtKO6l7d&Lm<$pxAd{}po_I-gP^9Wq| z#nl+YD{ddO;0o}Q%H;$D%dU?uH7Om~ zH!oj@_8>9HCi&}9VS&t(6PylZvkb)df|l0u+}Emi?Huw*ns%E)QRnZ_m&UzTST`^g zhit4u{&uAQj0p-jZ^6$QPs{Oo{oT1fH&5P8m+jAR0W;cQ)9Rj;A7W|w%Dd00Ng$+e z!kBU<yRhgiXKuXmpBMaK| z36(Fjl0Y5IKK_sI_S7YNxkLubWjh%ES*oeT3z(MS@zAZL;6<6X1pf7R!J9sM%eP_< z$2%H_(1O#LVjx#A=Wcw$$&9}+%dP3xRX(~eQ^`k8=p;2&*fXQNp*YUj@GVMz@$3Lb zVFsi#^UEhM>@0-PAFieme`qEu_kP%o;ekQw`XKXI>*Ry)pKomWvj3(A{u}$=#2M^^R;3h+*De}21wkP5QZ z1%}z%$vluaT_S(%xZCIF5}{O4tV4nG8b7YO|3PQ`TQ$pPI4|}F{f=>|yb`xaETeAn zFUPZ{pNwL-m(2FIw^Mg9;!^I3BsWUg20@2ge$d*XmFWwfJ@_fq>2T%)9O#eBShB`Gr9 z$YZvK{ITL4;>yU35cSF*48#@>1vm#+ch|KSK6a-<++a|k0*?GDq&6t^A!?3OW4TR0 zpSj+D%^GDEn%4p>&rW7U)g+L272oUqo#>sfJcGrTGC~B?)*ZF80z53|U}1|>9XfWH zgR|I7oQc;8ncVH^XHOtU;?}7Uglu(QscAw1gkLtnX(;4eVc>VXAy#F=xX0?&_YbDv z2G2IAM5udL6=jX!pGKHR~cvagoo52mS+Q z5_}z!Xs`Mtf23GNrnX|1CK1=|fUi_91vXDpVtz@O6hl!T=}9%@$Ar-@*^G54C<_r1gq$U|0YWc|x|H?KbD zvN9@>!`mZ9BA@uptwAfHHMas;Ae7E*q_H6JsK8?J6*GhH%g=idB>iksdg=?kafH<(4p^W{aYqd7+BtPy2Tr_eSJfht>l-cQDf-HBUkvRuKFfc; zzpW?yWeufxcmc6M5(ce5!$x34e1(J+*@iGI->^X(+fZNjpuZLy-gEWJ`2sqrnae$$ z6&<4PU{g#TMN_PW(7_j$Jp_f`Z#a8XoY{f|$(lWE{4ay6S?bA4z@DviJh(8oX=ji> z?l_oZNO&U!>?65a}>h z3-L}pR`k}>9t{XVy?KvwaLqvh=(~!|v?(k+KX?SgH*?3} z&UEUcgi(~!o|#V!w4cHB*!CEz>#{g+ukzo9&X%nbTQMEurI3$^kuK+{Ar~ruI4jcw zrldw|8Q4|~9u3dskAIs7I{kP`!jJ|lF7G*YHHTUYtmQZVB5YDy(&@CSt^g=F{q?&=rTtl>W*R3D6S&)PAexMP+!Elvmjg5}Y9QIEwNR4cnltKa z&Zr6@dyb;%r*ermU-9hCMEp_=Fxn{kw(f4jZ+FRm^XcgRw!U|?z0W$wlzy8dem*;a z+;3el`!4Xjf#H>PkVz7_D!2H_)j@JPfZbB3av@cCs&utx#CT=yt2$Gf(c4mcN(?Pf znt@kj`P?3c;(4ckAeU8UJ0QYAkz&6T9N8w z^;uKI_1_T$Mk#_hGr-tDo;0gbl*p0?2E;SLLS{<~VtE#VA1T~O;$@{|;Vz6Gke&RX zKLg-_$__6fi+%`ayGs#0lZWJq7^^W}Z4+1W)2uc5L9&oDpIP~hqZAdKyW$Lhakj}u zQZT?Ex9Q)u20om%5x1NNNm!pz<((yBw<767d}4=#)bvv$=gP?h^j9&irON4nZqJ0) zgd>;eRum3dt`TpRn=B+T7X)*eaG^;FUtwr_PRI{@VWm7azHD%Nx~9Bb%lf6r)Zu}Q zT_~D-Rh2k`vC^{d)%km7`2;Zd=cOlqWA%P#gOMEPVxRTjk%a{tO$Z4E7HlvrRLj#T zf4K|RzxBG@sC3I%-Z1Hw(iVk{OZ`c_$0=8EmAs$P4nguE97n1L5ufJyZvv+%F+ysk z4=KNu^j-O9Awz%$EPIP1C}$_dPtt-;NZbE>fVBE^UK@E}1>h*cRQdc}|M>7wqR2Bv zf(V=Co6tPMLyA;^Z4k|z!UB5kKQXji47|)~MAuL&@FVo_`m}g$0R})M-E7r(`(qX& zU~HdMI`Qks5|v7cm!NSxs^$RgW<0RY&hI zw_mVXn1F&02AOZ}D`Y=^n*GM~9%3Wr72Kj}L!FwbAyR(xtD#4=6ohnZs>L;j<%K-KG;o6e*HwIfsd+7XGYWyn|;%TZxaIK z_7saL_2gCD916mPkPPDLKrc)x{(O>9#${zjvl;ZuW^agcUa3@RIG?PrU^PBq+E&v(M!` z?}o0~*Fa7&!=ObZ?WwuSJM~)4fpl)82Fyd{aPBXMvg!?02=thgFWl;!xKG3NhKUbV z!d(ydqE|H7?KpKfaoBL4cuy|$$Qv%A;cSUmuL6M;%^3s1EK;ChMlDktl4TDzc=p}P zKI+lf`0274Fu9MUCwi^c$tRLmdl)cJLx}yAR_+7IO;?6vcZw!wFuI-1 z2>d8>4wuH<>bup4z155SQ|mWW);KWYPx;9e0n|ftrxqLfl2OqGb*FV2Fx9VzR7Uai zfIgl*bvCt60mtV+3=?ORZ`&y0LTgGccneTX#w$|@Fm8@!DX#pwDnf^V4iJ6HnwQrz zFD=RF$!Cv163tz2=BE4lL7`EbeQ5XWhv)BzPKvd>@-Wl(2-4n_a zCP)}o2|QgR)?}zMq1GEUQ|hlPFUP}9uD>^|GEBT+fFm3heUBfa>u))aM^o+1R*o*g zClMl|R6O&Yrh2+hP`}McVJ-Pw&(5&4vAH`CFSAt2*vAc7rMC@96&V#}&EerI5+wvt z*ud1W4V7MW=+L;Iac_NwJvQ*P--e243enh83O6Rbs1EtI59j!N7o>0=UyDLmS9t`m z{#2df9Uk~wmUxr9UZ_o|aAP|ztC%tJDvbG;( zX>qxP0g<8LDT%Y?BPm3u6Z`iKFO-C92}m!f2cDFZe9X=k+mzvr^*_CO+OGns1MaG| z=_$X8fc^uaab{K}-mOb*=G!tp=GOm}ZAxVP)ot=?@#)~|Ri-=TAISJa#)IiX+)EYw zhHsnvZ+3a+McvihH--_NI6C5ht$X^q?j-JRh%WYPEIi11D^d8Cku(L(kSll!tzDB7 zIbu!5v0JRHbQE>1&@0<0;9blVG}VIo({CsUd&Ep9=cCnY!d5RPq$GUxir~rPCXlZL zrk4_9qB+rXP2v7$(hb9S<}9>LH@q_mhw)|ofD;?_PCAY30T+Bg=j@%*_x*XcAb+D2 zC&)%D*C<@@I>D}Wd{MH^$xSXT%I!VJ=)(9!vs4jVZ$qkyX5#Q+^cyP~oyL_97TLqC z!gDEc^o#G*M^sk5!#SaGLt*d*^_QRr}1z}ksyyrrpEAeTKcIxP&M{uKI%3gQFahoW->;&Os3`=e}z3Lq# ze=QLC?J_q#y86wb<@|&1yn>JJ9BaE_e=bYd51N>9&P|~qTrbuTTQi#?uj2r@3JVyp z)lbZUfpD>uZbR|*VI6F| z6ro-LZtGl%!85Nb2MA9lCa(IsPDQ_uWt}_4$#OlrdRC_31-c3H$(`{j?JH7auC0Wk z2O;Dre)S54Jrb_1@v_n*Di>J@hjSi~B?o77%O*8_nPYjJt2--2*o04QNzf0cp422N ztI-or2rKeU-{@sO_U>;j0ENgu%=_t83+DaG-=FV*Gl7K&oam7jM%S~}5eTE=-l&Zb z01X82r~qAT6TSuK^=opF__wvG@KOR(66epGq|Y8^f0Fkd zb)$k4wu4+Ww#cC>1spXw2_su&8jIkB7}TIi=AsnMyF_H*>c?(t7Ml zC7Ot$xfsO@_Xdn#m8G?g8iAE*yk%>na#i{_a+?k(O-J~g-uud=vZ8$FqcO=xv<)~R zf`!V4G4#^BV)roT=io6zw+pN^H4?Ff`m}Wn(ORKe0`M7Y;_W+W+VxBW%DuE=OT)R_ zUJKkkxvRFlG~;2*R)hrNz~oEo3cLmWB~RIdDR!C~Tkr#M(zbIqE&SS75X!aDnD_@5 zzS-3eU}hW~vEZZa9ymFA)4trgR3}7ZwEyBm23lr0YE>nIw%yy2Cu;U`1o$c5IYRT3 zqUnh(iEnqAy*WfvO95w}#feVlS$xdfdr!XojM;|UE(t?r-OLSW&E$RC8!T0or665# zFYplUm-w#?o-_j(P9wiZB<H?rWnUikPl67|8RG(u4#LTw@~6X4V*5g@2N}}i6g3x zr8koqO&CJeDd_I!8M;V%zw_GQMT^`i*g|U#&!%*I60Mm%wOEB%wRyY;Ve7>4rY9A=f8n0WO+B8yOWlQ(Wm>1#-lEM-40;D^Srml-}j5sW%;(o}R~|YJl3<<+MUo zZOg4*(mLKTdn(KRBy1ik)h1IpQQ9FAY5PmB7nMFnZJPM5LwwF2lfOyxje5>KX67Xx z#)z}1_7rTF$2DK=om@Q1{$Rl>XH?kHjo=;A^c2fFmr|-ju8&he_>r1}=hWHJoJoD~ zr5J_OD*@y3Y4lZRf;3*7k(*3a6-8xJ1jth|2`TK+?)ws1aXj>4<_$KL5e^-*7D760 zA2jENk;H<&`UFOln1rQDrQN$*c!?Fjio+_-b`j|hLk-8i$9-|pY<^6jD$iLobMBFd z<|muSQg}0zN7(Um>^JQMgE-Dm(BNvhgRX-vLDOjTf;_s`fen4jA#+kH!1c{C^}K^T z0Ca}x4bhPfPP#x)ED*NiEdo5qt}Z%hd7-POOM2uAy*fbAtpq&S`8sNJU&-`&eB()9 z>?=Yw17`TJ>asYSYFn@H=;Z_KeC)1IP62zc;i;in7>~nBm@jrLHjadtb|c_r#3{MH z7;m+hzGluxl+OObYQ{TbEi@}0&3rRdye}ULK_3_s#k)j4;hDWb=mUan)yYQ@L zm$M1gAi$uqcD9MgYKZlJZWE)5k|tj{z%5;U0^P6`tXGOwTW`)wuxzWtR0VEC{3?(f zeB=3q@z=R_)bS1%R;IQVb8QYvRt}UB*c-VzqIe*WNv_bH46zC^6@$ zj%3~3e3m`myq17Ek$&y5S-=-ok_yuCLfm{fZowplq*PrqDL)rYR`uE^;VOZtDxqJ) z8I{KqU2IAose}tjN2lniJCudoardy6|aEyKsCXiK(DsW=X*tyGKdl9H0w2v84 zaxJxzT0{q*>sE%s&FkKustI4cl`B~Z<>1(RF;$vY;ay5sCq^rY8x6eez!F6@L6xIMDqw09#Tv?j$yHu4}Lp7+aehMq{ z=2K5Psqvo_l3_k{#FHNLw8io`xDR*(%QN6RV1m|W+DW4$!(nDttz0T;x@IUp7q=SG z>@KE>+&jQ+tIr=bkK4(fUPo-M9t1bkO-Qx@%zJX%A494SkML^;W5eY-+1Tk-t0UBE z+q>l+l$c+t7P*|bWI)s$A%g*EvB3^5&LskjITg?5k-MmXI&6Ko|7jwSOal_ac=GnH zQ$qm3@~Jjj7RRIFIW0;A4(++-vZ%JG;|(Wu%BGtZm2;k_4y$%G*FB@OOBf!$y1sPqObH$Lk zYj^5C;U$+hFIWF4J9hD&hs;;vT>*tbhnEvaJ6y(>0cx303;r;-}@(3}Z<;P0GrQ%Yz$vp_wEJzbt2e44m8P(PdETsiE7 z3b@Rs#fo;boa~E(Mz2UQS{r^HH6TV1yj~ngHE$@!&9qPH5b;lV+8qV&873?+sk$Ck zRddg-V{mOXc;;|bh(OB2SXO=t0pI63xIGbr#Qm$sNRH`ZS_sSc8nAqu<=8z0Hd($? z!1DDzpqyQ8LI^>K+e0dr`Q*C&G~4elK6^m&M6w}kbxQ@RhKTfkV zS)2ij#)`O`b`MGeMw#20lJ2WC@!9_-HUc)zIZOLSnq6Jw61+*&te27IO^05cFm%-;;{60YwrokojgEmS0V4Tnsi+I*&g@d zV+7Ov?bRaM`aKQ-(_PZ&PlK%!O#$qUQgnoQl{<_gm*^ z%!d2_gVw_Ct?fvFQ2y{ipY}7fPgE&xm49@w+TtWlb#$i@W2Jo8zin(i=ox8BLKls_ zYibIu_sJ0Wm#ycE#47J;^3#TmS;4e*m^?y@QTp%nVKo90Zj{~rzrFMSV(%a-HuRCI zuKz`p;|O?{d^t~PX1$^iBFd469lrU=~H@h7Cmkrvuno*SOg#X>I7w`SKIbYJvZAH9c2E0EH``qMx4H0bIi-T~mUI*s6c@q6r(AuDG ztTEfWHX78vA+~oWxU5@^%f{!w80?%_z$$(iA*H6jp z*WtA0{h}}FL0AcaJ5G6)fBu~=5RnCtv%6m zQceJq$$-*dLM>G3whdy=3DUby9-c9g982a%RB@H^3KcyM_-j`5$m*&6WGpJcWz(iY zw)6nwXxq6{DxVb647;J)y>!*zqz3Y&67uV1cfKTsN4bJnvXg-ML#THj2pF`zj$I0a zpdWDdT?BH7^oolGmOYiqv+Swzf@GB<)f~gwfvnz!h%tJ9^GDQeZEb@~_q0uc7Id_6 zt8nrunqzcyW(xBxPz_8B~jZVT}%XYNq`XFgVa z*p3{n^*pOF5ZTO52>YPnh~*lYpBfTudGuO&p58V_!mSC%#`n&MW&25`Na*km)W zrP}p7UUF;8FY3Xe|z@UK4k&GiO;OnD!h!&?Po-zvW-d$qoSi(+DCR8+gD4N zBpxVxvqR|Uf%;RR;g}s^?tjCzwLfgmqT>`EHlMNPk6&Z4RB=b}@{x?U`4vlV>4YY? zy71<*7svTICd@X9u{^73kp1S#E7zJ1y=Rj-ajp$n>rLP6AW4`S4xYSb;-0qd&Ima# zs(pR99X<}5Dl4P4d5huJA-BQEwu!6NPxSY#8B1C<$d|{K0 z$1TCJI;E4n9%gO0F2Lhzyve}}k7ICLi`?Ys#gk8=H%W}PPaNJ>z#B|sc9bm*x2;K2 zl$vuTx*r(E{H5f06tCEv<19^-%-+zObkgqsIO1t{t+P#dR{NE%Mzslp;Ps6mQ5iYX z?U(ahz6+TT{7-IZXB&2JS0zev;m)t-52^gh3RV`xd)dzXP3KyTd;jH6Iu~DLpRqf{ zA?Jb6C$q2y5sMAY38xkb#FEYg0%0@BVXD8qcE!z*(jzuCnCueTx~`y}a4)tx z;!gG_;hSfWy+Q3wmDFI-bra`L+hudUAM>R5CY0f`YDKe;eL*N_mQQ6D)YFROP`lV3_b}C>}TlOD0En15JnRQ^>cp$dT z7+u(Zm??k${#TVvIg#Yn8-uBT1!(@=hB?G7Oc%aL>lXgIrvLll{^M)^?}tNX>rcb! z|5qc<=lbT(JlzGMv!LZ5Nl;xrmhcxAjjY>xH#|4O`83JuOeB_-{#PwbihO{}W|GRP zSS1`wtqV_b+_%Rs4KO2#bIGW_i`l0_{kdXLW0SGmp*$H1njEQdR-8c4o{iE!Ksd~# z?v_#!#>2;di%M+@Av>z6tRI;T;rBL|wJM#n5E6T$5~In6Zrc=wsj{G}p7l1IA-~L# z80vGXGzO50&7}9)S@xUResJU2Dc8dX90^Z6HetC{3%i3SByy)6Ee&UwGt2dGr}v*@ zQI)R1EGoOkI==ftpBvFD1qVJ?J29^sJGIA1SU1c%?Z-Rwo`-a0_S1b<7aWzrTsc>G z@V9m&NYTBcSN$&0&l$GxR@5PMijj{E%n6rZF+#Y z=Xfk6@+`EI}GD?7dn;h;xUpj-h}f*Gq@f$KzoM!a_Ka*-Qrph-rV&bR7n{JHROnjPRcdd+(1;jTTwt?}FR%?qTshIVc8pMqgmlb$r1XVm z_Ow#_4M}^}7~6_h%~;oM5d`3g*CIZc%AF~l36GSdOHwBWl7sE6 z7y#*-QTf}{_%v#B;D3O0Evwqb5kOk?(o}a|E7VMzdLw-v3R;5{rkW(zIn{C zYZQ<)d3iY@(Ur3SL35eBe;Sqcmnj)MU+`kJB$+#k;vVq=9obua=V8$Ma91EjKl1Q! zxojI(pI8{p-sTtO&qwm7?i<>A6>yGcUDSefU&bd!vW=RDZziFl6^4fEUui&62-IKm z5SZ;7!?{yt^`b~j?fk_pZBU{&FaXb9VOG z``O>}dF;Tqe%(L|7?GH!x5!?)Q>bu)JRi8>L@f@1x0Xj|uhRe|tAMsOxA4YV%@FAJ z>zMqF7rm6s$0{>$`vOA_vQ)(bo?0PsFHp!w{E^ks+1@j;<8yk@tg-iOpMghGALqp7CDBJB#s$=DCTmHxSC_vBsBjG3e03##-*p1{4k2@ofOpjJT#y3e5@&`iVznXUB) z^W1rRzRnI*r7o9#QD(I%JIrps*j5KM-jD!)ENd_oGTjZR=?nu^X`hI0fHlGn+!t-) zrjg42P#ZR2pegieIRnFO9;JW~PN=V9lfhS|y@#-0sHE>!c9{JpruEv?mS(dE?GpK&!_-)|uTwLATB=*ezWnjTgiL%k~u$nuz&B~(BzeJOsV3ZR=8J+2hMXMc3 z%nq#Tl!dO+Sfsv*YI{%BtQ(Kfv#FxWsm)FFs1eY9X5MOMUvH_#wp$>6AhKOUNW37! z?p3Iy4aqTX;R|B(x6j1hg+r_THOzhzXfGWJ-{M^-YM}?g_$=Gc!9HaG{t9P)?d4A` zvgD9$xNTC`e{%ogLh$yN+vBlzY)ESOEqMrB>e?cgUb@t-6$}vv>L7*|2|{?x11wGn z3OH_>n^&G)FD|KS7T3LHqYY)C{Kt-t@OCskjV64Zrt-HrcEB>l0`>lPP&}>ZB9ZKL zX!8sLrs)=cFwd$`0G~EgG!FH^)j%LVNkJYT zEkoT+TQVO7MM_I$8Pf&9rp{GGRpC&3*39*-&?ugQ{W#3Br?oxq8<8@y&mWo|DA1B* zk#PIvPS}_4>Wkk7aedaV{<{RhDr!*sm5dXYHz)ZrM3t5w{&>lI8CWjrnE@N+I?&2B zjJ3TszXep)itPi|nRR)!lAFi;YoI}%H>UBouRq75r!s1HTYUJ91iY#E?jW1KoEDD5 zLF8IuvNsQkM#}FAoNc{#?MdG$tvbj$*lMP)sBRIshIKQVq?8ou ziv@;B({$9O%IMG)+&orxNM210g4hJhUN8eERAqgTUDIjk|0dmh9AH6?1~~2HJjB_X6xEhD&6n-3Q%z#8L5jlLNpk+H~97rO}Fk zF$w$U%vC(b_ZbT6Bj<(q5{sKCUhm4DS}Mqok-(ni>b(qcK}Zmf8MNzf)*ss?Al1B0 z4ktkqrer9a;2l-Iasz++aJ>@nWjze6!YvtPUH*Ex73DeQ^Q-5t)3ELH$#tvOt@7CF zmLL#N9bik8V;Q`yzOOIv!Ycs+;3OD^=N8$wbd*3}s_9&O$FER=C>TOV%L0(;CdS_0 zg*yNC!u}Z%Z3v#>Sj87=N?CH)?=!MB80r+C^B(bQmBD~DUW+wjyc&MIJT9zgR_DBc;!pQ0VT<`njNBrw1oxP8w-78xl^QjBYMD>km$qB4P+T&KT&b-b%py(fAG9ne`FWCgptW#$~Z2KDwXZ>QJ(?(CyDEEkh!&K&pQp3vd>SFg^S zig88zrjeQB{kS#7UXgw|(Au5e}*!hR_c`U#+x`1>023Opvv$ZJKrL?_q?iohQBD zHL)!ft}dKuISQG}I^ftXe^P(sS$$G2TX($#%_t!Olh)N*%T+_1^XC!~j?mf*eDt@u zti;$ikb*HOVNS-CX&+a)4$F;_ycxW5S5KKICDdi`u4B#c8NJ9M0OT}@ZkjDIbF(=7 zTe7mkBxV~)fmX9ltuZv}ILqsM!0uU3(ZX1F_G0p7Ub|k9emcMb;o(c`5YSBc_ve2| z>_c2nWg6AuKGOd6`IeCwjNq)1x%gx~yVD$sC~rdDY>(O8Dxv&i_t^1lYOv(P8URBt z79ujYl0#AfAu?|jAcqIA*q>Vz8PnaBF;H`_oQ{)1{i2m+_6$V$rOF|3Q&8`)2mrvW zKb8GZyEQwwNW%B3hb0wSM(QBzU%b!ZTJoExckUY;W(cH}8eJ=^TO`3_KR4bz#3+C4 zJ}R8G`ePpiStuWNu52N)TC_8N?>N&mb$WUPD|4nZ^AML%_4Nw>%n<6wD4zfT@F~`q~Wi$PE?LW7xBQe?K`!ypOVkxN0o#=uT#7zd5uDF>c!FIieNKK&6xiZPRj3bb5SL7VmP|?43 zLZj^uMtjHQoNt))9U=!Tf&FLI+)N+S4o2qGIu|cfEfvg=jW%_p0yNA?(zCchkKw9- zra%bhTnBtV%?N_U)D}{pRxnW^OFy{D0kS);69B#YQkhJSmGm&r`4R|`m`+rtRRi$<~k1%kpCX zAc@&D-!iEVBOUAlX1Dni;KiQd1j+`w=OU%g9FZZ<&dF}b0lBb!&L&JgXm}}2rfB_| zQ(HxvwY*W;v<)}ecd%Lg8V>A0R}vx=Xqmb>q{;<=73P%UCGO`ZSG6|RPeI$H>8(9s z9(RbM)}*zwyc4_=K@fxf=lAMlH>R*WJ{O|u-YpN{yQT(Ixb@Ey_(w*~My)CWUa(tc zphZ&|x8+D0qqF!MNYwNX{zTaL>ANeFT{359WBdSQ+la3yb-lEdlf9K9D6y=1cd3wN zZY=md$t!R-3gWl;c1AJCJZ;Upy^%yWvxf*#@8xOEN;Cto$J%>G$K}h&zgfGM*rVSFSOzndMet_ z{sXEWr9y_tVCQg;KCO4k7XAQ-aqTuc61MEw#*#M`;F?t$aqdVKS+6&^IvLgG=4e+P zUA>gr1!5<*5+q=@`+~5f+EQm&HXZmcHjaa#4b4U!mGAdDXS63abg&&%O7Z~`;f%DL z-|e!CfjwQ2`qsCr0=sj4T3zx>GLllzm~BDJYF@0D^%&4pY%$5T2e)Eu0Bl>6;N#y! z_Wgg~2301!sOuPK$AT?DTD_SkZ1?l#id1&Qzd|dt;xKJa)vr9AekkHhnlJU#%lE|N zr5VO^;MA2TGQ==CNs~_@>jgJg7?b$jE0aIeb2&dlBMOvemTznOpIjBb3?;khVBg5d;oKi$lB1x%n_ZZK;uBL^C+LhNA4 zL9{_Y%+JDt9n*;2(gz7Vu4tC_Z04V|!N`t7rO>HO0bqwREEs(~`z+??A^4mZI7XQ( zfI&?_@o4lFqI6wn(^ItNEj3PeSIp;5dwm2HUkkp3Nw9_p85WNO0EYo5#}?Ui)1|eO zErW4m;7H-)+Sz*>W^ZQ^SkXpCk`RJNsv$UgRS=(Rz4b`)QwG!!NP{>=u5;Z^rdT8x zh)GT5S9grUqrNRyIkW}&;P&E6`%1fWyga2h?WMJyY33-8(pNmk4c&k{f=-C(4MMsi zEmPIj6ooyB{@7%_=tna`yRl+coGP}aDO$r?Bqai{U}w1NvA*OM zOF{veayIZX6lIKkIZEK>&5F?BJ(OF#h#JBt&!(4$;|!51jmc@{VQBtKt1n>~Q<3Do`@ zj~n0LKCXHI!wloY)tTou^NrW>;32)Q=zMUu&ZcyJ>qCnT1MExs$eZvWiEA4le76Y=K1p0mz_7<9nJb{d%!%wggSY* zF81yT_2+V~L^^82`WWs2D$`r4y1j4cU}=|!ZBLIIa1iO-PNcU2)R~CleD6GT80vz0 zE;qG9ZaF0j|BDScAK&rSRxLF)x#f#qf4s6>r{%$+99!vkEEF>I;n@ifH5 zuT#BSzMOxwb`u!M)G-hz%GvLfxdH4)Y6)u~B>Rd`YNIArkdOoGEB~1M(laza+idxa z;(Q`X_fFOIbADnUVu&!?cXc^S-jJUfE3Pzx{^9+ryFFEFA8{L=G{~ER4xJ8)XF<%$ z_|;NO02p^e@e#eDY_?*buOIjT$Bs2h-a18P>ns#$x;0eyc05_s`Z{nT5n?l}0`5)q z;|K>c-uUbF$_0;Lwu6n{>13zzQg1m(88QTg zqGwTqP0$u*1o6nSA)dE&f$9ZXzMNd~Q7E`)d>M#>-!9vJD+*?I5)uWQiAMDdIt5ee zX!;6}@nEOR{U&GxLSMkmS^&0DGUL*}0#;>a{r!?N2QV6r)$B-%HT#b;AntW-aB6m9 zvR*(|KT!QncRKS0-`e>&sUql(OT5Mr6U3;{=QN^#@mkpo^tt7n+oQ$3+ zf;a;v)PZYtW_W!D-`19~7MTvSaU3w*9*04Ms4dVFTRWmWfQ5aCPLMIhW6vP)z2S@J zWrwi~&+nsn*;l-(R5bs*4!p%E_v@SZjobOzemEDFqw)dTvAa&Ly*#Pylj=#lvnVVw z|NB+U{u&_mvLI8JLrvy)2+nKu&TkTFJ$^Gi_2YqyIEd(EP44>{2*_euGuH~w@I23< zf=U3di{t3wJ~-Fo_pZr8TKe3OZq*=*(rUbLuYkAJBoDqE0u>yQ`*%*1R6A$K!uh&ya|T=V^@(hTnh z@&nghv7Lu7a*k0bn3bu$#kEjR>{5!*6{Px7;R3)kF}k4gRD1&j1I$LD?}!X9h!2N* zZ6AcPDRihe9*=B>7F~RhO^?>V>EzFH?c+AmzVY!6EB-7#`cu9v3qVt7t$KBKJT$!q zM$yA$#f63`t-Vq*tK)f2YhR9x1>7*tE3l_&S4j^LkOa*}uTP+zE}5WYTM&?FDr!NG z)cRBG(93q&N*^PXIOBPhE)Vqfa&YxXKX0@t$#EVkg#yH0Ev{He>3(Nsx3f;dgD$%O z`9>%x)2+Uj-U`AHfyky1kPVQmuV$MlTjU)cg6*#XfBI_OA^*c*QY{Id@*AZ%ah;HSDjxGJYM0+8ApXN*-~xeFj_urZRGGywuz*1@6j zcjB5ZN)7-urC9}zIvZ}4#E$?Zl1-UASV=XXGdauENIv+u?YR%|8r{cBMXi2#Pl4QP zSTT7a!PU(bh2*fb(xc`lk=LKUlV#pjTD{w)yFRLG*!BZYleVD5@ftvyeny&293Sih zgc`3nozFO<*J2+aA$Lm=A^58o6l$x(G?0AAq~MdhQZVBFS>WS>F+eY=qorhfR{i-_ z{Y8clK3!LgbR1P-yyaI(nZnIRQG~MBP;!E@*BNzz_F})^^C0!#)X6t0_Z@37EjHx^ zYt{ZEj%0-{bXoB-b0@+UapR>|sX*n~<#_ZJT7G2|<<8ieAsCMRPzKPur<8|fOpYS!l8XocqjKeYf~Itn-ktQ?h3ax!!XQ1IWYdF65+JBJ&pYd<;Av*PiN8!IPY3wK^T7+2j&{ z=)LkLLX*Jap)3v`0x?!2%M~|E8EFStK1||>(&YL5N4WSr$OIuxDKqutB}fzEJ=>Kl zOBPZhE@|E^|8#50w*DxQCa&StdJ(^W87e&pd`?n#Z?#lN$Il8I`w~FNnR|;iIY3pARM6z@kz7kwOLw2HlHo3PZG0Pxf1sn1mc3uK0{U zegN`CT_@K`CtKnX@28L}o(bD~(AN%3Btt@GdsBe=9imWuUHVmiA@Z8Zr=Y}a%&dNY z`PYXE(0+dab2}us&{S9mU{{}eC(u8zy0J$B$c{(UX--%mE~QciwRebr)bgBLPFl%>#Vq0AcWzy@{#JY^22!x6|V$ zr(lFAnY3>T(l@4k%f{=Fl%YV*bF4}#)A=fQQT-Kl);w(-JQLZ7(DwObPgnh40na*y z#4EfQc)8!O_R69@jJ$~@>0O^+4K%Pq4SBRzntNCe($u3>&C0Cob4#2$Y3|N8o@LbZ z*@vQRo@bP-UAlBs*r*b}fEty9x*}!E!plOLKdYI0p2^Qxc^o6UEcEKgt_Lj3LI-sM zJz0=vL+Oo)#u)OY&RUf4S>5_%DTDl42*=1~Vb*JsM&N0jm#Boo4e#@a=6v%P3DLkb z<;p-EEKlWv^T4}>oMC#-qHPZF1W2F&nPt98avV5&h@FExpU|xCR+1yeE5M7n9HQ>h zB7&UI95~Cfw>fyA3fLm90aq?t*0}-09geC`^2kVn0R^9~d)I4FRz1@pgg(~rnx9rQ zrWu#!ePfef+y!mp`&zb<+FIv< z?9a6AScBGH`=ytI+d)q43hWY;rSf9MJj5E3xW$fCgFy9zOYt^VKG98p)t)RAHO!5F zEuTjn4wQdPZtKO*L|giK`nIc}6XxnGiplCbn_VaAZwk`7CLEU46)ZrL&|P9+4P>W$ z$%!XSXrmGs>}JgZs&vUEnS5>k>Xxg0Ve-vnSIb{PI1}FB##HPcmddbn(3~Hel%{5j zcV8iNnK|!~2~ErKu-;f_cBCP~@{D}MWQ9-)Q2_#WVmnXxpA5oQmjpSX#Ng@K#vWn? z7D{risk{$hvCj~mXU+(V8%^u>QIAioALADh*M)1p4`=jRqua3sVG07#o$SYHHK~(x z)P&S(3r2*2K(f>7=umV>QkzH04rog|!iXQbG%%k#KF)}n5I-rwThE9kTRBudIL%w* z3+VQHh9=nAdr2*nn`@!>`#>y5agnV=P9cf`LhZI6F1{)?=AO$Qs_>W_c@$A_B!b+M zf>N@Sx@8ICTwM^|T4czR2T7=VSy~}1L3bJ>SxUJ>L65sOb@Bz|*$kAOb!Ek=C~xrI zB$op;tKy`ZFE_BojPHN?pf+hsS<6^EKK&k9SK@Alz{H6H$t&0ppSUtOA8&K&+{J^? z!D{=QCpgcL%?X=X4BXAhN*}WyhEIj@F>%A11WO}+9lFzo0*Ry;05h#i6B+- z^9u6jtp)HEDSYtXKj3&m0aP^9FKYyw)XTL1w`)1sjldO6;>T7<+n%pP?gQl9^u4p; zVZ>PHqB}*?sOaU&n%GhY)DR4?ednPaQV{@q_P3~#xlbwTfzu>%-==cw0wJfiwOiEN zYd3#UY>HgP->6Jq1JQB5N({{J!~vx5``wltYY%@(l(|1u;@e-cw}mhIDrRn!HGtcV zM>YPMtwCgh|rwb+t$>mk1a8p+qVi5E)R#mNrAGOfr36R#BgsWja&GI zK%IbYI3dFno*T&$4C5SAr--IHX$GldQ~EgE!0VJW)DtCI_RJ-xWJ-^(Wzh0B4X3SC zr8C)KXB#}p^RMh*Cd;z<;6HEdoakF0im**n>X2gG) zQ4#0VxCQIlL-OX{!^PU&qgiw{Ji{IDU>yBRsd88f3+_rZ6cV z>SSZ$c!N0~Jl~W*SmEJpb1<=)>k}P-o;7`y>)>hd$`?f86YT{-hkUH%-Gv)B4K#Cm zafK6(I~l--D-z(bG~ci?A~FCT%OHm7JgVsfpOW;L)(xj;^cO2}>U3@Pi^;1V&COhL z+xv8;S6@lywaw6koQ5k`VzQKKDLO01-=6|>n)_`S0b2@Y+pPn7%>F{;hvFzFZh zt$J~^j-HRqe9!!Yp%n$1w@{&;NlN3mmBgz}{Vjz{xR}C_)eCP}wFsBd?C@FRaE-O} zGtnBtp!y3gtv%Nm@l;2n%nE%5o0mGR%byj#aE!FMWF;AnHe9~GT=Phjw)>`UqWn9Y zc3$-O`VD$Q8YISR%Xclg!7lkVTkGah*@dx_jKmXw+X)r^M!5a?f^Yq6)wVZ1|BqL@rn8L~z^V;PhPQ_+{85_sYw7Rd1@YxP;uGnaSS0X=6nD_cBK10 zwa9#m_x;Dmz4qgedpmX?js5+P3;yNLMzMnkZe^nLH>7|+|4!`|FnH|BXLkSPMg9G^MCo-Yo1_?oBBT<|EpX2>Q=;# zfL31N+rSt*PsD$9Cx3MZ z&;JDmW!u9yf8Tikh-16K82>Zzz8&=c@rl>lTjD&tr66|f;=$GS=xT$^4uRC-g*su~ zg?D@!4pBntaKu>f73^q%QhPUdnG3{^zR$yKxhgG}zrrnh`>6MxO(?Jb`Zg%r%!7ux zEB2#@cmf^7#C0J@V}VC{Z=ebBe6K%r$QhiUK=hB8_UF~hHA2VUV&7Ct=YHAsRWfml z(>`uRpVD)8CNHxNo~Ur2$y%O%*O8DD{r<2zfdxshTbYH)`1Y6sP4YqD$7Clc$}W}F z<1~28FhLZwO-^5L0o< zkys(FbgUQUO%1ko2t=*M>#{;aLq*of;mHKm;Q+yMy?LPGT_Q_S?D%`S1eW8p;2b%t zAj|UvblP~=RF;(}{d>eg=<2xaC)GBpVLnphRF)UhC@MrY%502yi<(kaXL zm>X*5Osc`SvN0lb7VucG_cgrr7>aV!)oidab{jr?uyxS9hYX z2=Vtz!3nUi-1+hG(VzZ)0eV&d77Vvs^ZsvP&EH?!e+yXS*)Q+>_0P-t*I)VP=KeI= z|BT$%6J&Fb`)AI5^*(>v_5W|Zt&U(LC#Ux3ceFFGgl(V6HYfF2ChNjEX5#GIuaCCJrh~0M``8M;a)l65yJHD!EZCTEcFJjtkboHJOnt z>KbnPaIw@*U13IKI3+E`cvR!YBr1>|s9WVogB7k1+Azj6D$F$G`gxz?Ht%De8fHMOlG^G5+o^N20~nj1fGUe ztj}X^)3USWaj!LVgTt*&br6wNop5S$XK7<@bC)WB(?xRkQ*Nca5sWrt7bF_mB620N z!m0dL4pFT>I%63}>`Pk+AUkltgFW95nfPZXI)zYt-wHFWFgR;>ULEQF8 zZd0T6Y?GFHqs9Rnb*k5`14C8b9;`TSL8|~u6%`o~1yX=h7|ZDtOCFUy^Y04mbi*#! zcXJ}aY24b9a{I|WfZu8ookHdw8quPPm5qh=uSm?rotANH$ z5PGcWN?bpdi77`Av2C4MUZ4j+X0?+zB?R7Ef7+qRMbv=%^t-7Zy@X`#b)AL?jR=m8 zH;?INkR@UE>WR&P9opiHEjf#k@B4{}TRY-*5C?CuiAOGVsg*in9ieEMLYs@{|-%U<^VxWZO@F-WF7D^SMu zp!&iTkbVyCByoXrJC&IL)oC=S86zO$9LpX%vf7@!ZN*>OX^ z|2N{~S!(Ut1S)ULw*Tv#DP;>}*GIiuwE{&DyTE6boyY9UoADjA|9$&DZVs5Rz9=3*v_7sK(Wa6RBgGpquKHDO2m38#uoi**P@)@yua6 z{84W@ATN|>_}TuFymLTUX9LHwvs&E9_hJ@Yhxg+3l8`wVqUBi`X^9{e?zYg~HxH^W z;?0`pp52laYtN44kNWT$sfVxjUAU2=cPp10`135JJY;Iz&;l)YjTW1a0&dMzgK=o$ zLGr-!^wX)4ZsX}A`gzz|J>Zyy62yf`_szt&z$>uf^5E^ z|J!eCuPl%Q_(!9cbFMYz-ZhTA0X*{nMrIl05SDznihVLW?aJYbY`Y}>N ztSC(uj=mJ(#e5xc>-qkj4+cD0sKBjeuJw^oZ6nfAqy>ZxB*CY?dX`^;V!Cg{Vo4F)5-#MNEz=gg_G>0fFas z2o3COx*9V?b?>vKj%q@xPKi_Lmpu_?jEL8fUd-O~kY$0)lRoZrBuG6t#ti0chzk}d zx(Id0YcBQU_MD~A4l=_O#<;yHZsgL4buVJY^-kitwNFlRO`?<{>A5av***2cj0hL7 zG4m}8KRs133Wl#HHb863K)-1xrD)6@afosWuatW$Ht*k z$Z6;bk#HA5(sLzYJ9M~9av@9u$pa!oUNTyIWf5XlsckinnGFN-X)-0F8!Loe6j8@Z za}Kg~56gW)S%lY?s(UQFf_32)eqan`Ja`@($N;7ID>H=yE@PJ)`RV@#H~$YyDA&rs zJwNeF*oOdP%?x1sLQ!*+(`uka2uORjV?*UAN#fxdxNxfmrbj|It{h?O8z!0w(p0JU z=)i!+3Fp~nX0$0k1v`O9ja$51&&q8Ln*Oh1dM7`9h0zi`P6t;G5Qb?633@P7Xz5M` zLv&t=udXs&re|sS)m5mpsN|Y^^qs*hq#YXpsrSmEKNU8RkynsHx36#K&Lvi5t>=t3 zsI9$3SY#S4@h`TT4&`?Ugc+lS=Lzm9F;RnQxi##HWz-W0{ajgi;_C>5LlGdQE(P)# za9G6ID7z4tuq2e@*z|yTTDykscM+_o>1oOdT|`%;5)Lg3rzujdKXNM^Yv3QI-omm_ zj(2J7#2@Q9tbe3s@G(frU!?IH^-02kh0OAs818sUBh8PDBB0KK$72#8X$F~u#Ii=b z0+}GV3BUv#cMxmk@Pyj}RI%V#5bTlA1^xjRnekKsbAC*&^j+iXxg7Qt~c{1X8kiyNBPV*RRc$)^v zL;Kb)s94~y9Mm2ky7&o2`h3-hGH76A>yfaW*KRt{uNyq zQpu6PfGXaMQ<1J{Zt7Aco}ct)V^PHnQq7OHF9yLlcRhBQo=0PsL)^m7Ou?-{vMUk< z2XATuryo%l!Io@lYM%5+x$N-fs1ke@3zaoxWjcVp(MhW$HQ| zYVbj3l(TwNZotv&$4(v)|bFBPqpc_%>ae%0i zSTn6V6z(He{zp;S;{QQWnVfDMK2*KB{3*!$d@Kp4t{qE>chlQ2H8IzDW9eeaz!YDE zG+9n3*m%}kJC;ihk*D?RZKieW71|$y<9V`^a2cF}6iVUt=Jr-YpH5a}L_AWZh}xi8 z=6lmqOzh|G>qp)qT`tV{It6kBGBJw$|CNeO#%ntkE;n`I$=IEQpUI28IZwP8;QVO9RFfTp< zY#bRtHJyG8;38m4yh_AA(xU8+pbx{BR@_?PmU&E#tVen>KAOEa6_sV-S6-PD&zKD- zjP!9(fB~D_i_>1`kzWpRk*3KlzmAC9T~H1V?@&cXnQkWWJ-3a4Qf8~1X84IY?z;7q zDkqm&U4DK>q+XR2V_H{@f8oZBwr=(^7Z7d4Ye2EH3?qv1sN~O}ASk3x{A}hu4vIf0 z!y)KtioK7Jj~bxnOzBhj0~Gm%N%xxF+nNx-kBp-cEevfeVe%a4V=jNfnzi%`q2sS!v-$RnyYbLwWk6Pylu*mo$ST0*IYsPiW4qYMh?)qh*v@HoKFEC6Ff*GNFZIc zQ$6zVzl(naft84hmr7!aES#w#1M+(b5}&@5;&Tz0Ozs4CZXlUlLuR3*f)DLuU!naz zj8w%8IHJ_G_Y}8=YvWVsv1gqvJ6;N=>j(q;k_5KQ7JadWV}T*dD}pg8bP!h63=r(n zX)%TmrWmVncA_nV1k=^~D2KInN(iUjZm`i0R}T`5R?WgprWu1epijj|b)f91gP$S* zgehGM02m)hMuls`#pD!{F2T7$y-<9`J&jAzpS}cFOxdhj8r8^(Z5u}Jq`^(FDL#lk zsR!zDgUjMnJhD?yy*c!l(^gFXiw?e5_4V}wbI+{q_r9i+1wq z#^2w48>tio)2>``(JJLMMHJA)J=AEYb9AwLY&4r$H)MFbb)nLululS+jddA(FK-10 zaTM4VzS=`svGhDM+>a-&-|&l)jn+|1oz`E&33a_j^~g1rs_y}1r(yE1yhLo!@LO0F zGsMJ0-=c#O6-w^{>Ibh1iYQ8pX)Y1h7ON#4Jo{s#+z;4u9yH1YP9ZmAE(v;w35VUx zXtjZZ09Hig-VT6OyQvQc`YL3?0n&3>DS+y&*#uQWfw1PMN~m+`A##j!9{EbK7AI3@ zbot>7aDbZPl#kZl;O~F^yWjDj0%9(`Kjyzx zbnt*k-|P=<{NMfh_cw8^96ZF7^k%u%_Ye40R_cGezUu#_p%Xjt94uYiCZxV~beUEG zVM}>@H{v_D!0$gGFQ^$tp!mw)2TQLB?YbE=6jk<9^lkQl8&L!%O+22^l{pqjP zUV=J@4>=4fH@>ZSa!&#yl4wjV{?=>bPZL`K4Djs1{;WTJ z32}&kX^kS)Gh=%X|CK!p6)Bk?kliseFO3tRzU(lCy)xfJ+SfBREaWcjUh{V zd-Tt4t^neerdQ=oJ&q@tfr3(7qY4=3$H;I|S`7~);ySZa$4Wbwsqw4=Duks-fS|+I z6*h3C2O&RGIxh~ci(CKIi_;raTj@TWBj(UoNuze2ZZ*suc1{2W(j8Iq9DKWnYtU#n zP-OJtLw&s($g!z6ueD?yuivZ#!av%q0|I;QOChVB5%jul?$a|MjT59c<>^+Q)w`Ko ztGExeV>%Q);q21*q*OPz5_@PXDLMm$hDM=>e(v;OMTzgve|>|+%6y1>{bhc*33oE0 zz~pZh+0Acp3vcmsl2L@;A^f{8@@;G_C})57E}zZ(t-IfgvdMF7iLHsWf>crq9W`LU zS2K+WPKgAf8&M>AL)tPeTVV<7#VJCqz@G#jCjUry;l}F9nHftW z_Gt(#HtLsG^9wgd^)+)NmpjW2gbR(0LEGVGhKVI+Fk0ToR$az7Oa7l7=iATipUwKu zE5<)M=i7Y?jL`ol60x=(@Ke%tnT?S#Lka0}FxMY>E{Tapji-&dWD?tK4RF&0#p zr-TK=o;z(806mK?wkhE(YAy*vf@&Wi`Na_Z!_rQyw9^i;2*rZ&ITw@ua@W{MHmwf1 zXsw{+W+5F@w-Ur)8B8-c)&AcFK3VksPgOs0<7H+PWFco)dR~4FVo*+76If967uO&L zM5w8VcL+7aVvd#B=SvRCM{7vlH$z4m%IG{8zdeX}%tTNTTqTVheNjB8M+1@(RdS>q z5$#s?-TD&IUfc*Z+En(mv#H0v2smj6wRpxE{H&L~se8O$zfU$tPw}kT@l-;4F%v;H z)Z;6NdN(fVur85almq?_D33~XElZK@^Jy=<;?WO^oj{FJ-15KgHme3v73{U9G.vcap.plan' -# ------------------------------------------------------------ - - name: s4-cap-ext-db -# ------------------------------------------------------------ - type: com.sap.xs.hdi-container - parameters: - service: hana # or 'hanatrial' on trial landscapes - service-plan: hdi-shared - properties: - hdi-service-name: ${service-name} - - diff --git a/notes/package.json b/notes/package.json deleted file mode 100644 index 3c2518ea..00000000 --- a/notes/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "@capire/notes", - "version": "1.0.0", - "description": "Maintain notes for a Supplier", - "repository": "", - "license": "UNLICENSED", - "private": true, - "dependencies": { - "@sap/cds": ">=5", - "@sap/cds-compiler": "^2", - "@sap/hana-client": "^2.6.61", - "express": "^4" - }, - "devDependencies": { - "sqlite3": "5.0.0" - }, - "scripts": { - "start": "cds run" - }, - "cds": { - "requires": { - "[sandbox]": { - "API_BUSINESS_PARTNER": { - "kind": "odata", - "model": "srv/external/API_BUSINESS_PARTNER", - "credentials": { - "url": "https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_BUSINESS_PARTNER/" - } - } - } - } - } -} diff --git a/notes/requests.http b/notes/requests.http deleted file mode 100644 index 88f3193c..00000000 --- a/notes/requests.http +++ /dev/null @@ -1,16 +0,0 @@ -### Get remote suppliers - -GET http://localhost:4004/notes/Suppliers?$top=11 - -### Get remote suppliers with expanded notes - -GET http://localhost:4004/notes/Suppliers?$top=11&$expand=notes - -### Suppliers set to readonly --> fails with 405 - -PATCH http://localhost:4004/notes/Suppliers('11') -Content-Type: application/json - -{ - "BusinessPartnerFullName": "Can't change!" -} diff --git a/notes/srv/RemoteHandler.js b/notes/srv/RemoteHandler.js deleted file mode 100644 index 258a2e04..00000000 --- a/notes/srv/RemoteHandler.js +++ /dev/null @@ -1,376 +0,0 @@ -function fixColumnName(entity, name) { - const fullName = `${entity.name}.${name}`; - return RemoteHandler.columnNameFixes[fullName] || name; -} - -/** - * - * @param {string} msg - * @returns {never} - */ -function throwError(msg) { - throw new Error(msg); -} - -/** - * @param {{name: string}|string} entity - * @param {{name: string}|string} association - * @param {string} msg - * @returns {never} - */ -function throwAssocError(entity, association, msg) { - throw new Error(`Error with association "${association.name || association}" of entity "${entity.name || entity}": ${msg}`); -} - -function getEntity(absoluteName) { - const [serviceName, entityName] = absoluteName.split("."); - return cds.services[serviceName]?.entities[entityName] || throwError(`Unknown entity "${absoluteName}"`); -} - - -class RemoteHandler { - constructor(service, remoteEntities) { - - this.service = service; - this.remoteEntities = remoteEntities; - } - - serviceFor(entityName) { - return this.remoteEntities[entityName] || cds.db; - } - - /** - * Expand "to one" associations with a single key field - * - * @param {*} req - * @param {*} next - * @param {*} associationName - * @param {*} targetService - * @param {*} headers - * @returns - */ - async mixinExpand(req, result, expand) { - const associationName = expand.ref[0]; - - // Get association target - const {keyFieldName, targetKeyFieldName, target, is2many, is2one} = - this.association(req.target, associationName); - - // Request all associated entities - // REVISIT: Still needed? - //const mock = !cds.env.requires.API_BUSINESS_PARTNER.credentials; - //const tx = mock ? BupaService.tx(req) : BupaService; - let ids = []; - if (Array.isArray(result)) { - ids = result.map((entry) => entry[keyFieldName]); - } else { - ids = [result[keyFieldName]]; - } - - // Take over columns from original query - const expandColumns = expand.expand.map((entry) => entry.ref[0]); - if (expandColumns.indexOf(targetKeyFieldName) < 0) - expandColumns.push(targetKeyFieldName); - - const targetService = this.serviceFor(target.name); - - // Select target - // REVISIT: const targetResult = await targetService.read(target.name).where({ [targetKeyFieldName]: ids }).columns(expandColumns); - const targetQuery = SELECT.from(target.name) - .where({ [targetKeyFieldName]: ids }) - .columns(expandColumns); - const targetResult = await targetService.run(targetQuery); - - let targetResultMap; - - if (is2one) { - targetResultMap = this.mixinExpand_to_1(targetResult, targetKeyFieldName); - } else if (is2many) { - targetResultMap = this.mixinExpand_to_many(targetResult, targetKeyFieldName); - } else { - throwAssocError(req.target, associationName, `Unsupported cardinality.`); - } - - const resultArray = Array.isArray(result) ? result : [ result ]; - for (const entry of resultArray) { - const id = entry[keyFieldName]; - const targetEntry = targetResultMap[id]; - if (targetEntry) entry[associationName] = targetEntry; - } - } - - mixinExpand_to_1(targetResult, targetKeyFieldName) { - const targetResultMap = {}; - for (const targetEntry of targetResult) { - const id = targetEntry[targetKeyFieldName]; - targetResultMap[id] = targetEntry; - } - - return targetResultMap; - } - - mixinExpand_to_many(targetResult, targetKeyFieldName) { - const targetResultMap = {}; - for (const targetEntry of targetResult) { - const id = targetEntry[targetKeyFieldName]; - if (!targetResultMap[id]) targetResultMap[id] = []; - targetResultMap[id].push(targetEntry); - } - - return targetResultMap; - } - - /** - * @example - * Notes(24B58115-E394-423B-BEAB-53419A32B927)/supplier - * - * --> - * { SELECT: { from: { ref: {[ - * [ id: 'NotesService.Notes', - * where: [ - * ref: [ 'ID' ], - * '=', - * val: ''545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE' - * ], - * ], - * [ 'supplier' ] - * ]}}} - * - * - * @param {*} req - * @param {*} next - * @returns - */ - async resolveNavigation(req, next) { - const select = req.query.SELECT; - if (select.from.ref.length !== 2) { - throw new Error( - `Unsupported navigation query with different than 2 entities in FROM clause.` - ); - } - - const entityName = select.from.ref[0].id || throwError(`Missing source entity name for navigation`); - const entity = getEntity(entityName); - const associationName = select.from.ref[1] || throwError(`Missing association name for navigation`); - - const {keyFieldName, targetKeyFieldName, target, is2many, is2one} = this.association(entity, associationName); - - const sourceService = this.serviceFor(entityName); - const targetService = this.serviceFor(target.name); - - if (sourceService === targetService) return await next(); - - // REVISIT: How to call service datasource w/o handlers - const selectEntry = SELECT.one([keyFieldName]) - .from(entityName) - .where(select.from.ref[0].where); - const entry = await sourceService.run(selectEntry); - - // REVISIT: How to call service datasource w/o handlers - // REVISIT: const result = await targetService.read(target).columns(req.query.SELECT.columns).where({ [targetKeyFieldName]: entry[keyFieldName] }); - const selectTarget = SELECT(req.query.SELECT.columns) - .from(target) - .where({ [targetKeyFieldName]: entry[keyFieldName] }); - const result = await targetService.run(selectTarget); - if (is2many) { - return result; - } else if (is2one) { - return result?.[0]; - } else { - throw new Error('Unsupported association cardinality'); - } -} - - async handle(req, next) { - let doRequest; - - if ( - req.query.SELECT.from.ref.length > 1 && - req.target.name !== req.query.SELECT.from.ref[0] - ) { - doRequest = () => this.resolveNavigation(req, next) - } else { - doRequest = this.isRemote(req.target.name) ? - () => this.serviceFor(req.target.name).run(req.query) : next; - } - - return this.resolveExpands(req, doRequest); - } - - isRemote(entityName) { - return this.serviceFor(entityName) !== cds.db; - } - - isSeparated(entityNameA, entityNameB) { - return this.serviceFor(entityNameA) !== this.serviceFor(entityNameB); - } - - async resolveExpands(req, next) { - const select = req.query.SELECT; - const expandFilter = (column) => { - if (!column.expand) return false; - const associationName = column.ref[0]; - - return this.isSeparated(req.target.name, req.target.associations[associationName].target); - }; - - const expands = select.columns.filter(expandFilter); - select.columns = select.columns.filter((column) => !expandFilter(column)); - - if (expands.length === 0) return next(); - - const temporaryKeyFieldNames = []; - for (const expand of expands) { - const associationName = expand.ref[0]; - const {keyFieldName} = this.association(req.target, associationName); - - // Make sure id property is contained in select - if ( - !select.columns.find((column) => - column.ref.find((ref) => ref == keyFieldName) - ) - ) { - select.columns.push({ ref: keyFieldName }); - temporaryKeyFieldNames.push(keyFieldName); - } - } - - // Call service implementation - const result = await next(); - - await Promise.all( - expands.map((expand) => this.mixinExpand(req, result, expand)) - ); - - if (temporaryKeyFieldNames.length > 0) { - for (const entry of result) { - for (const name of temporaryKeyFieldNames) - delete entry[name]; - } - } - - return result; - } - - association(entity, associationName, recursion = 0) { - let associationMetaData; - - if (++recursion > 2) throwAssocError(entity, association, "Association has recursive definition."); - - const association = entity.associations[associationName] || throwAssocError(entity, associationName, `Association does not exists`); - - associationMetaData = this.associationKey(entity, association); - if (!associationMetaData) { - associationMetaData = this.associationOn(entity, association); - } - if (!associationMetaData) { - associationMetaData = this.associationOnSelf(entity, association, recursion); - } - - if (!association) throwAssocError(entity, association, "Only associations with one key field or on conidition with one field are supported."); - - associationMetaData.is2many = association.is2many; - associationMetaData.is2one = association.is2one; - associationMetaData.entity = entity; - associationMetaData.target = getEntity(association.target); - return associationMetaData; - } - - /** - * Association with "on" condition - * - * @example - * entity Notes { - * supplier_ID : Suppliers:ID; - * supplier: Association to Suppliers on supplier.ID = supplier_ID; - * } - * - * --> - * - * { association: { on: { [ - * ref: [ 'supplier', 'ID' ], // . - * '=', - * ref: [ 'supplier_ID' ] // - * ] }}} - * - * @param {*} entity - * @param {*} association - * @returns - */ - associationOn(entity, association) { - const onLength = association.on?.length ?? 0; - if (onLength === 0) return; - - const on = association.on; - if (!(onLength === 3 && on[0]?.ref?.[0] === association.name && on[1] === "=" && on[2]?.ref[0] !== "$self")) return; //throwAssocError(entity, association, "Association on condition must compare to $self"); - - return { - keyFieldName: fixColumnName(entity, association.on[2].ref[0]), - targetKeyFieldName: association.on[0].ref.slice(1).join("_") - } - } - - /** - * - * @example - * extend entity BusinessPartner { - * notes: Composition of many Notes on notes = $self; - * } - * - * @param {*} entity - * @param {*} association - * @returns - */ - - associationOnSelf(entity, association, recursion) { - const onLength = association.on?.length ?? 0; - if (onLength === 0) return; - - const on = association.on; - if (!(onLength === 3 && on[0]?.ref && on[1] === "=" && on[2]?.ref[0] === "$self")) return; //throwAssocError(entity, association, "Association on condition must compare to $self"); - - const reverseAssociationName = association.on[0].ref[1]; - const reverseAssociationMetaData = this.association(targetEntity, reverseAssociationName, false); - - return { - keyFieldName: reverseAssociationMetaData.targetKeyFieldName, - targetKeyFieldName: reverseAssociationMetaData.keyFieldName - } - } - - /** - * Association with keys - * - * @example - * entity Notes { - * supplier: Association to Suppliers; - * } - * - * --> - * - * { association: keys: [ { - * $generatedFieldName: 'supplier_ID', - * ref: [ 'ID' ] - * } ] - * } - * - * @param {*} entity - * @param {*} association - * @returns - */ - associationKey(entity, association) { - const keyLength = association.keys?.length ?? 0; - if (keyLength === 0) return; - if (keyLength > 1) throwAssocError(entity, association, `Association has ${keyLength} key fields, but only 1 is supported.`); - const key = association.keys[0]; - - return { - keyFieldName: key["$generatedFieldName"] || throwError(entity, association, "Missing $generatedFieldName"), - targetKeyFieldName: key.ref[0] || throwError(entity, association, "Missing key ref") - } - } - -} - -RemoteHandler.columnNameFixes = {}; -module.exports = RemoteHandler; diff --git a/notes/srv/external/API_BUSINESS_PARTNER.csn b/notes/srv/external/API_BUSINESS_PARTNER.csn deleted file mode 100644 index a227137e..00000000 --- a/notes/srv/external/API_BUSINESS_PARTNER.csn +++ /dev/null @@ -1,2847 +0,0 @@ -{ - "definitions": { - "API_BUSINESS_PARTNER": { - "kind": "service" - }, - "API_BUSINESS_PARTNER.A_AddressEmailAddress": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Person": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "OrdinalNumber": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "IsDefaultEmailAddress": { - "type": "cds.Boolean" - }, - "EmailAddress": { - "type": "cds.String", - "length": 241 - }, - "SearchEmailAddress": { - "type": "cds.String", - "length": 20 - }, - "AddressCommunicationRemarkText": { - "type": "cds.String", - "length": 50 - } - } - }, - "API_BUSINESS_PARTNER.A_AddressFaxNumber": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Person": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "OrdinalNumber": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "IsDefaultFaxNumber": { - "type": "cds.Boolean" - }, - "FaxCountry": { - "type": "cds.String", - "length": 3 - }, - "FaxNumber": { - "type": "cds.String", - "length": 30 - }, - "FaxNumberExtension": { - "type": "cds.String", - "length": 10 - }, - "InternationalFaxNumber": { - "type": "cds.String", - "length": 30 - }, - "AddressCommunicationRemarkText": { - "type": "cds.String", - "length": 50 - } - } - }, - "API_BUSINESS_PARTNER.A_AddressHomePageURL": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Person": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "OrdinalNumber": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "ValidityStartDate": { - "key": true, - "type": "cds.Date" - }, - "IsDefaultURLAddress": { - "key": true, - "type": "cds.Boolean" - }, - "SearchURLAddress": { - "type": "cds.String", - "length": 50 - }, - "AddressCommunicationRemarkText": { - "type": "cds.String", - "length": 50 - }, - "URLFieldLength": { - "type": "cds.Integer" - }, - "WebsiteURL": { - "type": "cds.String", - "length": 2048 - } - } - }, - "API_BUSINESS_PARTNER.A_AddressPhoneNumber": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Person": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "OrdinalNumber": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "DestinationLocationCountry": { - "type": "cds.String", - "length": 3 - }, - "IsDefaultPhoneNumber": { - "type": "cds.Boolean" - }, - "PhoneNumber": { - "type": "cds.String", - "length": 30 - }, - "PhoneNumberExtension": { - "type": "cds.String", - "length": 10 - }, - "InternationalPhoneNumber": { - "type": "cds.String", - "length": 30 - }, - "PhoneNumberType": { - "type": "cds.String", - "length": 1 - }, - "AddressCommunicationRemarkText": { - "type": "cds.String", - "length": 50 - } - } - }, - "API_BUSINESS_PARTNER.A_BPContactToAddress": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "RelationshipNumber": { - "key": true, - "type": "cds.String", - "length": 12 - }, - "BusinessPartnerCompany": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BusinessPartnerPerson": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityEndDate": { - "key": true, - "type": "cds.Date" - }, - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "AddressNumber": { - "type": "cds.String", - "length": 10 - }, - "AdditionalStreetPrefixName": { - "type": "cds.String", - "length": 40 - }, - "AdditionalStreetSuffixName": { - "type": "cds.String", - "length": 40 - }, - "AddressTimeZone": { - "type": "cds.String", - "length": 6 - }, - "CareOfName": { - "type": "cds.String", - "length": 40 - }, - "CityCode": { - "type": "cds.String", - "length": 12 - }, - "CityName": { - "type": "cds.String", - "length": 40 - }, - "CompanyPostalCode": { - "type": "cds.String", - "length": 10 - }, - "Country": { - "type": "cds.String", - "length": 3 - }, - "County": { - "type": "cds.String", - "length": 40 - }, - "DeliveryServiceNumber": { - "type": "cds.String", - "length": 10 - }, - "DeliveryServiceTypeCode": { - "type": "cds.String", - "length": 4 - }, - "District": { - "type": "cds.String", - "length": 40 - }, - "FormOfAddress": { - "type": "cds.String", - "length": 4 - }, - "FullName": { - "type": "cds.String", - "length": 80 - }, - "HomeCityName": { - "type": "cds.String", - "length": 40 - }, - "HouseNumber": { - "type": "cds.String", - "length": 10 - }, - "HouseNumberSupplementText": { - "type": "cds.String", - "length": 10 - }, - "Language": { - "type": "cds.String", - "length": 2 - }, - "POBox": { - "type": "cds.String", - "length": 10 - }, - "POBoxDeviatingCityName": { - "type": "cds.String", - "length": 40 - }, - "POBoxDeviatingCountry": { - "type": "cds.String", - "length": 3 - }, - "POBoxDeviatingRegion": { - "type": "cds.String", - "length": 3 - }, - "POBoxIsWithoutNumber": { - "type": "cds.Boolean" - }, - "POBoxLobbyName": { - "type": "cds.String", - "length": 40 - }, - "POBoxPostalCode": { - "type": "cds.String", - "length": 10 - }, - "Person": { - "type": "cds.String", - "length": 10 - }, - "PostalCode": { - "type": "cds.String", - "length": 10 - }, - "PrfrdCommMediumType": { - "type": "cds.String", - "length": 3 - }, - "Region": { - "type": "cds.String", - "length": 3 - }, - "StreetName": { - "type": "cds.String", - "length": 60 - }, - "StreetPrefixName": { - "type": "cds.String", - "length": 40 - }, - "StreetSuffixName": { - "type": "cds.String", - "length": 40 - }, - "TaxJurisdiction": { - "type": "cds.String", - "length": 15 - }, - "TransportZone": { - "type": "cds.String", - "length": 10 - }, - "AddressRepresentationCode": { - "type": "cds.String", - "length": 1 - }, - "ContactRelationshipFunction": { - "type": "cds.String", - "length": 40 - }, - "ContactRelationshipDepartment": { - "type": "cds.String", - "length": 40 - }, - "Floor": { - "type": "cds.String", - "length": 10 - }, - "ContactPersonBuilding": { - "type": "cds.String", - "length": 10 - }, - "RoomNumber": { - "type": "cds.String", - "length": 10 - }, - "ContactPersonPrfrdCommMedium": { - "type": "cds.String", - "length": 3 - }, - "CorrespondenceShortName": { - "type": "cds.String", - "length": 10 - }, - "InhouseMail": { - "type": "cds.String", - "length": 10 - }, - "to_EmailAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", - "cardinality": { - "max": "*" - } - }, - "to_FaxNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", - "cardinality": { - "max": "*" - } - }, - "to_MobilePhoneNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", - "cardinality": { - "max": "*" - } - }, - "to_PhoneNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", - "cardinality": { - "max": "*" - } - }, - "to_URLAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "RelationshipNumber": { - "key": true, - "type": "cds.String", - "length": 12 - }, - "BusinessPartnerCompany": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BusinessPartnerPerson": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityEndDate": { - "key": true, - "type": "cds.Date" - }, - "ContactPersonFunction": { - "type": "cds.String", - "length": 4 - }, - "ContactPersonDepartment": { - "type": "cds.String", - "length": 4 - }, - "PhoneNumber": { - "type": "cds.String", - "length": 30 - }, - "PhoneNumberExtension": { - "type": "cds.String", - "length": 10 - }, - "FaxNumber": { - "type": "cds.String", - "length": 30 - }, - "FaxNumberExtension": { - "type": "cds.String", - "length": 10 - }, - "EmailAddress": { - "type": "cds.String", - "length": 241 - }, - "RelationshipCategory": { - "type": "cds.String", - "length": 6 - } - } - }, - "API_BUSINESS_PARTNER.A_BuPaAddressUsage": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityEndDate": { - "key": true, - "type": "cds.Timestamp" - }, - "AddressUsage": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityStartDate": { - "type": "cds.Timestamp" - }, - "StandardUsage": { - "type": "cds.Boolean" - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_BuPaIdentification": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BPIdentificationType": { - "key": true, - "type": "cds.String", - "length": 6 - }, - "BPIdentificationNumber": { - "key": true, - "type": "cds.String", - "length": 60 - }, - "BPIdnNmbrIssuingInstitute": { - "type": "cds.String", - "length": 40 - }, - "BPIdentificationEntryDate": { - "type": "cds.Date" - }, - "Country": { - "type": "cds.String", - "length": 3 - }, - "Region": { - "type": "cds.String", - "length": 3 - }, - "ValidityStartDate": { - "type": "cds.Date" - }, - "ValidityEndDate": { - "type": "cds.Date" - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_BuPaIndustry": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "IndustrySector": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "IndustrySystemType": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "IsStandardIndustry": { - "type": "cds.String", - "length": 1 - }, - "IndustryKeyDescription": { - "type": "cds.String", - "length": 100 - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartner": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Customer": { - "type": "cds.String", - "length": 10 - }, - "Supplier": { - "type": "cds.String", - "length": 10 - }, - "AcademicTitle": { - "type": "cds.String", - "length": 4 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "BusinessPartnerCategory": { - "type": "cds.String", - "length": 1 - }, - "BusinessPartnerFullName": { - "type": "cds.String", - "length": 81 - }, - "BusinessPartnerGrouping": { - "type": "cds.String", - "length": 4 - }, - "BusinessPartnerName": { - "type": "cds.String", - "length": 81 - }, - "BusinessPartnerUUID": { - "type": "cds.UUID" - }, - "CorrespondenceLanguage": { - "type": "cds.String", - "length": 2 - }, - "CreatedByUser": { - "type": "cds.String", - "length": 12 - }, - "CreationDate": { - "type": "cds.Date" - }, - "CreationTime": { - "type": "cds.Time" - }, - "FirstName": { - "type": "cds.String", - "length": 40 - }, - "FormOfAddress": { - "type": "cds.String", - "length": 4 - }, - "Industry": { - "type": "cds.String", - "length": 10 - }, - "InternationalLocationNumber1": { - "type": "cds.String", - "length": 7 - }, - "InternationalLocationNumber2": { - "type": "cds.String", - "length": 5 - }, - "IsFemale": { - "type": "cds.Boolean" - }, - "IsMale": { - "type": "cds.Boolean" - }, - "IsNaturalPerson": { - "type": "cds.String", - "length": 1 - }, - "IsSexUnknown": { - "type": "cds.Boolean" - }, - "GenderCodeName": { - "type": "cds.String", - "length": 1 - }, - "Language": { - "type": "cds.String", - "length": 2 - }, - "LastChangeDate": { - "type": "cds.Date" - }, - "LastChangeTime": { - "type": "cds.Time" - }, - "LastChangedByUser": { - "type": "cds.String", - "length": 12 - }, - "LastName": { - "type": "cds.String", - "length": 40 - }, - "LegalForm": { - "type": "cds.String", - "length": 2 - }, - "OrganizationBPName1": { - "type": "cds.String", - "length": 40 - }, - "OrganizationBPName2": { - "type": "cds.String", - "length": 40 - }, - "OrganizationBPName3": { - "type": "cds.String", - "length": 40 - }, - "OrganizationBPName4": { - "type": "cds.String", - "length": 40 - }, - "OrganizationFoundationDate": { - "type": "cds.Date" - }, - "OrganizationLiquidationDate": { - "type": "cds.Date" - }, - "SearchTerm1": { - "type": "cds.String", - "length": 20 - }, - "SearchTerm2": { - "type": "cds.String", - "length": 20 - }, - "AdditionalLastName": { - "type": "cds.String", - "length": 40 - }, - "BirthDate": { - "type": "cds.Date" - }, - "BusinessPartnerBirthDateStatus": { - "type": "cds.String", - "length": 1 - }, - "BusinessPartnerBirthplaceName": { - "type": "cds.String", - "length": 40 - }, - "BusinessPartnerIsBlocked": { - "type": "cds.Boolean" - }, - "BusinessPartnerType": { - "type": "cds.String", - "length": 4 - }, - "ETag": { - "type": "cds.String", - "length": 26 - }, - "GroupBusinessPartnerName1": { - "type": "cds.String", - "length": 40 - }, - "GroupBusinessPartnerName2": { - "type": "cds.String", - "length": 40 - }, - "IndependentAddressID": { - "type": "cds.String", - "length": 10 - }, - "InternationalLocationNumber3": { - "type": "cds.String", - "length": 1 - }, - "MiddleName": { - "type": "cds.String", - "length": 40 - }, - "NameCountry": { - "type": "cds.String", - "length": 3 - }, - "NameFormat": { - "type": "cds.String", - "length": 2 - }, - "PersonFullName": { - "type": "cds.String", - "length": 80 - }, - "PersonNumber": { - "type": "cds.String", - "length": 10 - }, - "IsMarkedForArchiving": { - "type": "cds.Boolean" - }, - "BusinessPartnerIDByExtSystem": { - "type": "cds.String", - "length": 20 - }, - "TradingPartner": { - "type": "cds.String", - "length": 6 - }, - "to_BuPaIdentification": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BuPaIdentification", - "cardinality": { - "max": "*" - } - }, - "to_BuPaIndustry": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BuPaIndustry", - "cardinality": { - "max": "*" - } - }, - "to_BusinessPartnerAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BusinessPartnerAddress", - "cardinality": { - "max": "*" - } - }, - "to_BusinessPartnerBank": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BusinessPartnerBank", - "cardinality": { - "max": "*" - } - }, - "to_BusinessPartnerContact": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BusinessPartnerContact", - "cardinality": { - "max": "*" - } - }, - "to_BusinessPartnerRole": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BusinessPartnerRole", - "cardinality": { - "max": "*" - } - }, - "to_BusinessPartnerTax": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber", - "cardinality": { - "max": "*" - } - }, - "to_Customer": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_Customer" - }, - "to_Supplier": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_Supplier" - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartnerAddress": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "AddressID": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityStartDate": { - "type": "cds.Timestamp" - }, - "ValidityEndDate": { - "type": "cds.Timestamp" - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "AddressUUID": { - "type": "cds.UUID" - }, - "AdditionalStreetPrefixName": { - "type": "cds.String", - "length": 40 - }, - "AdditionalStreetSuffixName": { - "type": "cds.String", - "length": 40 - }, - "AddressTimeZone": { - "type": "cds.String", - "length": 6 - }, - "CareOfName": { - "type": "cds.String", - "length": 40 - }, - "CityCode": { - "type": "cds.String", - "length": 12 - }, - "CityName": { - "type": "cds.String", - "length": 40 - }, - "CompanyPostalCode": { - "type": "cds.String", - "length": 10 - }, - "Country": { - "type": "cds.String", - "length": 3 - }, - "County": { - "type": "cds.String", - "length": 40 - }, - "DeliveryServiceNumber": { - "type": "cds.String", - "length": 10 - }, - "DeliveryServiceTypeCode": { - "type": "cds.String", - "length": 4 - }, - "District": { - "type": "cds.String", - "length": 40 - }, - "FormOfAddress": { - "type": "cds.String", - "length": 4 - }, - "FullName": { - "type": "cds.String", - "length": 80 - }, - "HomeCityName": { - "type": "cds.String", - "length": 40 - }, - "HouseNumber": { - "type": "cds.String", - "length": 10 - }, - "HouseNumberSupplementText": { - "type": "cds.String", - "length": 10 - }, - "Language": { - "type": "cds.String", - "length": 2 - }, - "POBox": { - "type": "cds.String", - "length": 10 - }, - "POBoxDeviatingCityName": { - "type": "cds.String", - "length": 40 - }, - "POBoxDeviatingCountry": { - "type": "cds.String", - "length": 3 - }, - "POBoxDeviatingRegion": { - "type": "cds.String", - "length": 3 - }, - "POBoxIsWithoutNumber": { - "type": "cds.Boolean" - }, - "POBoxLobbyName": { - "type": "cds.String", - "length": 40 - }, - "POBoxPostalCode": { - "type": "cds.String", - "length": 10 - }, - "Person": { - "type": "cds.String", - "length": 10 - }, - "PostalCode": { - "type": "cds.String", - "length": 10 - }, - "PrfrdCommMediumType": { - "type": "cds.String", - "length": 3 - }, - "Region": { - "type": "cds.String", - "length": 3 - }, - "StreetName": { - "type": "cds.String", - "length": 60 - }, - "StreetPrefixName": { - "type": "cds.String", - "length": 40 - }, - "StreetSuffixName": { - "type": "cds.String", - "length": 40 - }, - "TaxJurisdiction": { - "type": "cds.String", - "length": 15 - }, - "TransportZone": { - "type": "cds.String", - "length": 10 - }, - "AddressIDByExternalSystem": { - "type": "cds.String", - "length": 20 - }, - "CountyCode": { - "type": "cds.String", - "length": 8 - }, - "TownshipCode": { - "type": "cds.String", - "length": 8 - }, - "TownshipName": { - "type": "cds.String", - "length": 40 - }, - "to_AddressUsage": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BuPaAddressUsage", - "cardinality": { - "max": "*" - } - }, - "to_EmailAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressEmailAddress", - "cardinality": { - "max": "*" - } - }, - "to_FaxNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressFaxNumber", - "cardinality": { - "max": "*" - } - }, - "to_MobilePhoneNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", - "cardinality": { - "max": "*" - } - }, - "to_PhoneNumber": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressPhoneNumber", - "cardinality": { - "max": "*" - } - }, - "to_URLAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_AddressHomePageURL", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartnerBank": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BankIdentification": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "BankCountryKey": { - "type": "cds.String", - "length": 3 - }, - "BankName": { - "type": "cds.String", - "length": 60 - }, - "BankNumber": { - "type": "cds.String", - "length": 15 - }, - "SWIFTCode": { - "type": "cds.String", - "length": 11 - }, - "BankControlKey": { - "type": "cds.String", - "length": 2 - }, - "BankAccountHolderName": { - "type": "cds.String", - "length": 60 - }, - "BankAccountName": { - "type": "cds.String", - "length": 40 - }, - "ValidityStartDate": { - "type": "cds.Timestamp" - }, - "ValidityEndDate": { - "type": "cds.Timestamp" - }, - "IBAN": { - "type": "cds.String", - "length": 34 - }, - "IBANValidityStartDate": { - "type": "cds.Date" - }, - "BankAccount": { - "type": "cds.String", - "length": 18 - }, - "BankAccountReferenceText": { - "type": "cds.String", - "length": 20 - }, - "CollectionAuthInd": { - "type": "cds.Boolean" - }, - "CityName": { - "type": "cds.String", - "length": 35 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartnerContact": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "RelationshipNumber": { - "key": true, - "type": "cds.String", - "length": 12 - }, - "BusinessPartnerCompany": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BusinessPartnerPerson": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "ValidityEndDate": { - "key": true, - "type": "cds.Date" - }, - "ValidityStartDate": { - "type": "cds.Date" - }, - "IsStandardRelationship": { - "type": "cds.Boolean" - }, - "RelationshipCategory": { - "type": "cds.String", - "length": 6 - }, - "to_ContactAddress": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BPContactToAddress", - "cardinality": { - "max": "*" - } - }, - "to_ContactRelationship": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_BPContactToFuncAndDept" - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartnerRole": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BusinessPartnerRole": { - "key": true, - "type": "cds.String", - "length": 6 - }, - "ValidFrom": { - "type": "cds.Timestamp" - }, - "ValidTo": { - "type": "cds.Timestamp" - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_BusinessPartnerTaxNumber": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "BusinessPartner": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "BPTaxType": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "BPTaxNumber": { - "type": "cds.String", - "length": 20 - }, - "BPTaxLongNumber": { - "type": "cds.String", - "length": 60 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_Customer": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "BillingIsBlockedForCustomer": { - "type": "cds.String", - "length": 2 - }, - "CreatedByUser": { - "type": "cds.String", - "length": 12 - }, - "CreationDate": { - "type": "cds.Date" - }, - "CustomerAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "CustomerClassification": { - "type": "cds.String", - "length": 2 - }, - "CustomerFullName": { - "type": "cds.String", - "length": 220 - }, - "CustomerName": { - "type": "cds.String", - "length": 80 - }, - "DeliveryIsBlocked": { - "type": "cds.String", - "length": 2 - }, - "NFPartnerIsNaturalPerson": { - "type": "cds.String", - "length": 1 - }, - "OrderIsBlockedForCustomer": { - "type": "cds.String", - "length": 2 - }, - "PostingIsBlocked": { - "type": "cds.Boolean" - }, - "Supplier": { - "type": "cds.String", - "length": 10 - }, - "CustomerCorporateGroup": { - "type": "cds.String", - "length": 10 - }, - "FiscalAddress": { - "type": "cds.String", - "length": 10 - }, - "Industry": { - "type": "cds.String", - "length": 4 - }, - "IndustryCode1": { - "type": "cds.String", - "length": 10 - }, - "IndustryCode2": { - "type": "cds.String", - "length": 10 - }, - "IndustryCode3": { - "type": "cds.String", - "length": 10 - }, - "IndustryCode4": { - "type": "cds.String", - "length": 10 - }, - "IndustryCode5": { - "type": "cds.String", - "length": 10 - }, - "InternationalLocationNumber1": { - "type": "cds.String", - "length": 7 - }, - "NielsenRegion": { - "type": "cds.String", - "length": 2 - }, - "ResponsibleType": { - "type": "cds.String", - "length": 2 - }, - "TaxNumber1": { - "type": "cds.String", - "length": 16 - }, - "TaxNumber2": { - "type": "cds.String", - "length": 11 - }, - "TaxNumber3": { - "type": "cds.String", - "length": 18 - }, - "TaxNumber4": { - "type": "cds.String", - "length": 18 - }, - "TaxNumber5": { - "type": "cds.String", - "length": 60 - }, - "TaxNumberType": { - "type": "cds.String", - "length": 2 - }, - "VATRegistration": { - "type": "cds.String", - "length": 20 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "to_CustomerCompany": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerCompany", - "cardinality": { - "max": "*" - } - }, - "to_CustomerSalesArea": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerSalesArea", - "cardinality": { - "max": "*" - } - }, - "to_CustomerTaxGrouping": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerTaxGrouping", - "cardinality": { - "max": "*" - } - }, - "to_CustomerText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerText", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerCompany": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "APARToleranceGroup": { - "type": "cds.String", - "length": 4 - }, - "AccountByCustomer": { - "type": "cds.String", - "length": 12 - }, - "AccountingClerk": { - "type": "cds.String", - "length": 2 - }, - "AccountingClerkFaxNumber": { - "type": "cds.String", - "length": 31 - }, - "AccountingClerkInternetAddress": { - "type": "cds.String", - "length": 130 - }, - "AccountingClerkPhoneNumber": { - "type": "cds.String", - "length": 30 - }, - "AlternativePayerAccount": { - "type": "cds.String", - "length": 10 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "CollectiveInvoiceVariant": { - "type": "cds.String", - "length": 1 - }, - "CustomerAccountNote": { - "type": "cds.String", - "length": 30 - }, - "CustomerHeadOffice": { - "type": "cds.String", - "length": 10 - }, - "CustomerSupplierClearingIsUsed": { - "type": "cds.Boolean" - }, - "HouseBank": { - "type": "cds.String", - "length": 5 - }, - "InterestCalculationCode": { - "type": "cds.String", - "length": 2 - }, - "InterestCalculationDate": { - "type": "cds.Date" - }, - "IntrstCalcFrequencyInMonths": { - "type": "cds.String", - "length": 2 - }, - "IsToBeLocallyProcessed": { - "type": "cds.Boolean" - }, - "ItemIsToBePaidSeparately": { - "type": "cds.Boolean" - }, - "LayoutSortingRule": { - "type": "cds.String", - "length": 3 - }, - "PaymentBlockingReason": { - "type": "cds.String", - "length": 1 - }, - "PaymentMethodsList": { - "type": "cds.String", - "length": 10 - }, - "PaymentTerms": { - "type": "cds.String", - "length": 4 - }, - "PaytAdviceIsSentbyEDI": { - "type": "cds.Boolean" - }, - "PhysicalInventoryBlockInd": { - "type": "cds.Boolean" - }, - "ReconciliationAccount": { - "type": "cds.String", - "length": 10 - }, - "RecordPaymentHistoryIndicator": { - "type": "cds.Boolean" - }, - "UserAtCustomer": { - "type": "cds.String", - "length": 15 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "CashPlanningGroup": { - "type": "cds.String", - "length": 10 - }, - "KnownOrNegotiatedLeave": { - "type": "cds.String", - "length": 4 - }, - "ValueAdjustmentKey": { - "type": "cds.String", - "length": 2 - }, - "CustomerAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "to_CompanyText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerCompanyText", - "cardinality": { - "max": "*" - } - }, - "to_CustomerDunning": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerDunning", - "cardinality": { - "max": "*" - } - }, - "to_WithHoldingTax": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerCompanyText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerDunning": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DunningArea": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "DunningBlock": { - "type": "cds.String", - "length": 1 - }, - "DunningLevel": { - "type": "cds.String", - "length": 1 - }, - "DunningProcedure": { - "type": "cds.String", - "length": 4 - }, - "DunningRecipient": { - "type": "cds.String", - "length": 10 - }, - "LastDunnedOn": { - "type": "cds.Date" - }, - "LegDunningProcedureOn": { - "type": "cds.Date" - }, - "DunningClerk": { - "type": "cds.String", - "length": 2 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "CustomerAccountGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerSalesArea": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "SalesOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DistributionChannel": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "Division": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "AccountByCustomer": { - "type": "cds.String", - "length": 12 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "BillingIsBlockedForCustomer": { - "type": "cds.String", - "length": 2 - }, - "CompleteDeliveryIsDefined": { - "type": "cds.Boolean" - }, - "Currency": { - "type": "cds.String", - "length": 5 - }, - "CustomerABCClassification": { - "type": "cds.String", - "length": 2 - }, - "CustomerAccountAssignmentGroup": { - "type": "cds.String", - "length": 2 - }, - "CustomerGroup": { - "type": "cds.String", - "length": 2 - }, - "CustomerPaymentTerms": { - "type": "cds.String", - "length": 4 - }, - "CustomerPriceGroup": { - "type": "cds.String", - "length": 2 - }, - "CustomerPricingProcedure": { - "type": "cds.String", - "length": 2 - }, - "DeliveryIsBlockedForCustomer": { - "type": "cds.String", - "length": 2 - }, - "DeliveryPriority": { - "type": "cds.String", - "length": 2 - }, - "IncotermsClassification": { - "type": "cds.String", - "length": 3 - }, - "IncotermsLocation2": { - "type": "cds.String", - "length": 70 - }, - "IncotermsVersion": { - "type": "cds.String", - "length": 4 - }, - "IncotermsLocation1": { - "type": "cds.String", - "length": 70 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "IncotermsTransferLocation": { - "type": "cds.String", - "length": 28 - }, - "InvoiceDate": { - "type": "cds.String", - "length": 2 - }, - "ItemOrderProbabilityInPercent": { - "type": "cds.String", - "length": 3 - }, - "OrderCombinationIsAllowed": { - "type": "cds.Boolean" - }, - "OrderIsBlockedForCustomer": { - "type": "cds.String", - "length": 2 - }, - "PartialDeliveryIsAllowed": { - "type": "cds.String", - "length": 1 - }, - "PriceListType": { - "type": "cds.String", - "length": 2 - }, - "SalesGroup": { - "type": "cds.String", - "length": 3 - }, - "SalesOffice": { - "type": "cds.String", - "length": 4 - }, - "ShippingCondition": { - "type": "cds.String", - "length": 2 - }, - "SupplyingPlant": { - "type": "cds.String", - "length": 4 - }, - "SalesDistrict": { - "type": "cds.String", - "length": 6 - }, - "InvoiceListSchedule": { - "type": "cds.String", - "length": 2 - }, - "ExchangeRateType": { - "type": "cds.String", - "length": 4 - }, - "AdditionalCustomerGroup1": { - "type": "cds.String", - "length": 3 - }, - "AdditionalCustomerGroup2": { - "type": "cds.String", - "length": 3 - }, - "AdditionalCustomerGroup3": { - "type": "cds.String", - "length": 3 - }, - "AdditionalCustomerGroup4": { - "type": "cds.String", - "length": 3 - }, - "AdditionalCustomerGroup5": { - "type": "cds.String", - "length": 3 - }, - "PaymentGuaranteeProcedure": { - "type": "cds.String", - "length": 4 - }, - "CustomerAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "to_PartnerFunction": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc", - "cardinality": { - "max": "*" - } - }, - "to_SalesAreaTax": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax", - "cardinality": { - "max": "*" - } - }, - "to_SalesAreaText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_CustomerSalesAreaText", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerSalesAreaTax": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "SalesOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DistributionChannel": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "Division": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "DepartureCountry": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "CustomerTaxCategory": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "CustomerTaxClassification": { - "type": "cds.String", - "length": 1 - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerSalesAreaText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "SalesOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DistributionChannel": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "Division": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerTaxGrouping": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CustomerTaxGroupingCode": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "CustTaxGrpExemptionCertificate": { - "type": "cds.String", - "length": 15 - }, - "CustTaxGroupExemptionRate": { - "type": "cds.Decimal", - "precision": 5, - "scale": 2 - }, - "CustTaxGroupExemptionStartDate": { - "type": "cds.Date" - }, - "CustTaxGroupExemptionEndDate": { - "type": "cds.Date" - }, - "CustTaxGroupSubjectedStartDate": { - "type": "cds.Date" - }, - "CustTaxGroupSubjectedEndDate": { - "type": "cds.Date" - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_CustomerWithHoldingTax": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "WithholdingTaxType": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "WithholdingTaxCode": { - "type": "cds.String", - "length": 2 - }, - "WithholdingTaxAgent": { - "type": "cds.Boolean" - }, - "ObligationDateBegin": { - "type": "cds.Date" - }, - "ObligationDateEnd": { - "type": "cds.Date" - }, - "WithholdingTaxNumber": { - "type": "cds.String", - "length": 16 - }, - "WithholdingTaxCertificate": { - "type": "cds.String", - "length": 25 - }, - "WithholdingTaxExmptPercent": { - "type": "cds.Decimal", - "precision": 5, - "scale": 2 - }, - "ExemptionDateBegin": { - "type": "cds.Date" - }, - "ExemptionDateEnd": { - "type": "cds.Date" - }, - "ExemptionReason": { - "type": "cds.String", - "length": 2 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_CustSalesPartnerFunc": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Customer": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "SalesOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DistributionChannel": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "Division": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "PartnerCounter": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "PartnerFunction": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "BPCustomerNumber": { - "type": "cds.String", - "length": 10 - }, - "CustomerPartnerDescription": { - "type": "cds.String", - "length": 30 - }, - "DefaultPartner": { - "type": "cds.Boolean" - }, - "Supplier": { - "type": "cds.String", - "length": 10 - }, - "PersonnelNumber": { - "type": "cds.String", - "length": 8 - }, - "ContactPerson": { - "type": "cds.String", - "length": 10 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_Supplier": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "AlternativePayeeAccountNumber": { - "type": "cds.String", - "length": 10 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "CreatedByUser": { - "type": "cds.String", - "length": 12 - }, - "CreationDate": { - "type": "cds.Date" - }, - "Customer": { - "type": "cds.String", - "length": 10 - }, - "PaymentIsBlockedForSupplier": { - "type": "cds.Boolean" - }, - "PostingIsBlocked": { - "type": "cds.Boolean" - }, - "PurchasingIsBlocked": { - "type": "cds.Boolean" - }, - "SupplierAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "SupplierFullName": { - "type": "cds.String", - "length": 220 - }, - "SupplierName": { - "type": "cds.String", - "length": 80 - }, - "VATRegistration": { - "type": "cds.String", - "length": 20 - }, - "BirthDate": { - "type": "cds.Date" - }, - "ConcatenatedInternationalLocNo": { - "type": "cds.String", - "length": 20 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "FiscalAddress": { - "type": "cds.String", - "length": 10 - }, - "Industry": { - "type": "cds.String", - "length": 4 - }, - "InternationalLocationNumber1": { - "type": "cds.String", - "length": 7 - }, - "InternationalLocationNumber2": { - "type": "cds.String", - "length": 5 - }, - "InternationalLocationNumber3": { - "type": "cds.String", - "length": 1 - }, - "IsNaturalPerson": { - "type": "cds.String", - "length": 1 - }, - "ResponsibleType": { - "type": "cds.String", - "length": 2 - }, - "SuplrQltyInProcmtCertfnValidTo": { - "type": "cds.Date" - }, - "SuplrQualityManagementSystem": { - "type": "cds.String", - "length": 4 - }, - "SupplierCorporateGroup": { - "type": "cds.String", - "length": 10 - }, - "SupplierProcurementBlock": { - "type": "cds.String", - "length": 2 - }, - "TaxNumber1": { - "type": "cds.String", - "length": 16 - }, - "TaxNumber2": { - "type": "cds.String", - "length": 11 - }, - "TaxNumber3": { - "type": "cds.String", - "length": 18 - }, - "TaxNumber4": { - "type": "cds.String", - "length": 18 - }, - "TaxNumber5": { - "type": "cds.String", - "length": 60 - }, - "TaxNumberResponsible": { - "type": "cds.String", - "length": 18 - }, - "TaxNumberType": { - "type": "cds.String", - "length": 2 - }, - "SuplrProofOfDelivRlvtCode": { - "type": "cds.String", - "length": 1 - }, - "BR_TaxIsSplit": { - "type": "cds.Boolean" - }, - "to_SupplierCompany": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierCompany", - "cardinality": { - "max": "*" - } - }, - "to_SupplierPurchasingOrg": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg", - "cardinality": { - "max": "*" - } - }, - "to_SupplierText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierText", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierCompany": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "CompanyCodeName": { - "type": "cds.String", - "length": 25 - }, - "PaymentBlockingReason": { - "type": "cds.String", - "length": 1 - }, - "SupplierIsBlockedForPosting": { - "type": "cds.Boolean" - }, - "AccountingClerk": { - "type": "cds.String", - "length": 2 - }, - "AccountingClerkFaxNumber": { - "type": "cds.String", - "length": 31 - }, - "AccountingClerkPhoneNumber": { - "type": "cds.String", - "length": 30 - }, - "SupplierClerk": { - "type": "cds.String", - "length": 15 - }, - "SupplierClerkURL": { - "type": "cds.String", - "length": 130 - }, - "PaymentMethodsList": { - "type": "cds.String", - "length": 10 - }, - "PaymentTerms": { - "type": "cds.String", - "length": 4 - }, - "ClearCustomerSupplier": { - "type": "cds.Boolean" - }, - "IsToBeLocallyProcessed": { - "type": "cds.Boolean" - }, - "ItemIsToBePaidSeparately": { - "type": "cds.Boolean" - }, - "PaymentIsToBeSentByEDI": { - "type": "cds.Boolean" - }, - "HouseBank": { - "type": "cds.String", - "length": 5 - }, - "CheckPaidDurationInDays": { - "type": "cds.Decimal", - "precision": 3, - "scale": 0 - }, - "Currency": { - "type": "cds.String", - "length": 5 - }, - "BillOfExchLmtAmtInCoCodeCrcy": { - "type": "cds.Decimal", - "precision": 14, - "scale": 3 - }, - "SupplierClerkIDBySupplier": { - "type": "cds.String", - "length": 12 - }, - "ReconciliationAccount": { - "type": "cds.String", - "length": 10 - }, - "InterestCalculationCode": { - "type": "cds.String", - "length": 2 - }, - "InterestCalculationDate": { - "type": "cds.Date" - }, - "IntrstCalcFrequencyInMonths": { - "type": "cds.String", - "length": 2 - }, - "SupplierHeadOffice": { - "type": "cds.String", - "length": 10 - }, - "AlternativePayee": { - "type": "cds.String", - "length": 10 - }, - "LayoutSortingRule": { - "type": "cds.String", - "length": 3 - }, - "APARToleranceGroup": { - "type": "cds.String", - "length": 4 - }, - "SupplierCertificationDate": { - "type": "cds.Date" - }, - "SupplierAccountNote": { - "type": "cds.String", - "length": 30 - }, - "WithholdingTaxCountry": { - "type": "cds.String", - "length": 3 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "CashPlanningGroup": { - "type": "cds.String", - "length": 10 - }, - "IsToBeCheckedForDuplicates": { - "type": "cds.Boolean" - }, - "MinorityGroup": { - "type": "cds.String", - "length": 3 - }, - "SupplierAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "to_CompanyText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierCompanyText", - "cardinality": { - "max": "*" - } - }, - "to_Supplier": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_Supplier" - }, - "to_SupplierDunning": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierDunning", - "cardinality": { - "max": "*" - } - }, - "to_SupplierWithHoldingTax": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierCompanyText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierDunning": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "DunningArea": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "DunningBlock": { - "type": "cds.String", - "length": 1 - }, - "DunningLevel": { - "type": "cds.String", - "length": 1 - }, - "DunningProcedure": { - "type": "cds.String", - "length": 4 - }, - "DunningRecipient": { - "type": "cds.String", - "length": 10 - }, - "LastDunnedOn": { - "type": "cds.Date" - }, - "LegDunningProcedureOn": { - "type": "cds.Date" - }, - "DunningClerk": { - "type": "cds.String", - "length": 2 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "SupplierAccountGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierPartnerFunc": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "PurchasingOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "SupplierSubrange": { - "key": true, - "type": "cds.String", - "length": 6 - }, - "Plant": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "PartnerFunction": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "PartnerCounter": { - "key": true, - "type": "cds.String", - "length": 3 - }, - "DefaultPartner": { - "type": "cds.Boolean" - }, - "CreationDate": { - "type": "cds.Date" - }, - "CreatedByUser": { - "type": "cds.String", - "length": 12 - }, - "ReferenceSupplier": { - "type": "cds.String", - "length": 10 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierPurchasingOrg": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "PurchasingOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "CalculationSchemaGroupCode": { - "type": "cds.String", - "length": 2 - }, - "DeletionIndicator": { - "type": "cds.Boolean" - }, - "IncotermsClassification": { - "type": "cds.String", - "length": 3 - }, - "IncotermsTransferLocation": { - "type": "cds.String", - "length": 28 - }, - "IncotermsVersion": { - "type": "cds.String", - "length": 4 - }, - "IncotermsLocation1": { - "type": "cds.String", - "length": 70 - }, - "IncotermsLocation2": { - "type": "cds.String", - "length": 70 - }, - "InvoiceIsGoodsReceiptBased": { - "type": "cds.Boolean" - }, - "MaterialPlannedDeliveryDurn": { - "type": "cds.Decimal", - "precision": 3, - "scale": 0 - }, - "MinimumOrderAmount": { - "type": "cds.Decimal", - "precision": 14, - "scale": 3 - }, - "PaymentTerms": { - "type": "cds.String", - "length": 4 - }, - "PricingDateControl": { - "type": "cds.String", - "length": 1 - }, - "PurOrdAutoGenerationIsAllowed": { - "type": "cds.Boolean" - }, - "PurchaseOrderCurrency": { - "type": "cds.String", - "length": 5 - }, - "PurchasingGroup": { - "type": "cds.String", - "length": 3 - }, - "PurchasingIsBlockedForSupplier": { - "type": "cds.Boolean" - }, - "ShippingCondition": { - "type": "cds.String", - "length": 2 - }, - "SupplierABCClassificationCode": { - "type": "cds.String", - "length": 1 - }, - "SupplierPhoneNumber": { - "type": "cds.String", - "length": 16 - }, - "SupplierRespSalesPersonName": { - "type": "cds.String", - "length": 30 - }, - "SupplierConfirmationControlKey": { - "type": "cds.String", - "length": 4 - }, - "IsOrderAcknRqd": { - "type": "cds.Boolean" - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - }, - "SupplierAccountGroup": { - "type": "cds.String", - "length": 4 - }, - "to_PartnerFunction": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierPartnerFunc", - "cardinality": { - "max": "*" - } - }, - "to_PurchasingOrgText": { - "type": "cds.Association", - "target": "API_BUSINESS_PARTNER.A_SupplierPurchasingOrgText", - "cardinality": { - "max": "*" - } - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierPurchasingOrgText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "PurchasingOrganization": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierText": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "Language": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "LongTextID": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "LongText": { - "type": "cds.LargeString" - } - } - }, - "API_BUSINESS_PARTNER.A_SupplierWithHoldingTax": { - "kind": "entity", - "@cds.persistence.skip": true, - "elements": { - "Supplier": { - "key": true, - "type": "cds.String", - "length": 10 - }, - "CompanyCode": { - "key": true, - "type": "cds.String", - "length": 4 - }, - "WithholdingTaxType": { - "key": true, - "type": "cds.String", - "length": 2 - }, - "ExemptionDateBegin": { - "type": "cds.Date" - }, - "ExemptionDateEnd": { - "type": "cds.Date" - }, - "ExemptionReason": { - "type": "cds.String", - "length": 2 - }, - "IsWithholdingTaxSubject": { - "type": "cds.Boolean" - }, - "RecipientType": { - "type": "cds.String", - "length": 2 - }, - "WithholdingTaxCertificate": { - "type": "cds.String", - "length": 25 - }, - "WithholdingTaxCode": { - "type": "cds.String", - "length": 2 - }, - "WithholdingTaxExmptPercent": { - "type": "cds.Decimal", - "precision": 5, - "scale": 2 - }, - "WithholdingTaxNumber": { - "type": "cds.String", - "length": 16 - }, - "AuthorizationGroup": { - "type": "cds.String", - "length": 4 - } - } - } - } -} \ No newline at end of file diff --git a/notes/srv/external/API_BUSINESS_PARTNER.edmx b/notes/srv/external/API_BUSINESS_PARTNER.edmx deleted file mode 100644 index a6aa7986..00000000 --- a/notes/srv/external/API_BUSINESS_PARTNER.edmx +++ /dev/null @@ -1,6614 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - - - Internet mail address, also called e-mail address. - Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). - - - - - This field is generated by the system from the complete Internet mail address and is stored in table ADR6. - It contains the first 20 characters of the Internet mail address in normalized form, that is, without comment characters and converted into uppercase.The field cannot be maintained by the user or from an interface.The table ADR6 contains an index for this field.Using an Internet mail address, the corresponding key of table ADR6 and the owner of the address are determined (for example, business partner or user). - - - - - Additional information about the communication connection - You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. - - - - - - - - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - - If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. - The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. - - - - - The country/region for the telephone number or fax number is maintained here. - This specification is used to determine the correct country/region code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country/region of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country/region from the user parameter LND is proposed (if it is maintained).If the user parameter LND is not maintained, the country/region of the company address assigned in the user master data is proposed.If the country/region of the address changes, the country/region of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country/region for this telephone number also has to be retained and must not be changed automatically to the new country/region of the address. - - - - - Fax number, consisting of dialling code and number, but without country dialling code. - If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. - - - - - Fax extension number - If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. - - - - - The content of this field is automatically calculated by the system based on fax number and country code components. - This field is therefore not to be filled when Business Address Services function modules are called. - - - - - Additional information about the communication connection - You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. - - - - - - - - - - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - - - - - Additional information about the communication connection - You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. - - - - - - - - - - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - - The country/region for the telephone number or fax number is maintained here. - This specification is used to determine the correct country/region code. A normalized form of the telephone number or fax number is then derived and stored in a field for a program-driven search.In most cases, the telephone number or fax number refers directly to an address.If this is the case, when a new number is created, the country/region of the address is proposed.If this is not the case (for example, with address-independent communication data for a business partner), the country/region from the user parameter LND is proposed (if it is maintained).If the user parameter LND is not maintained, the country/region of the company address assigned in the user master data is proposed.If the country/region of the address changes, the country/region of the corresponding telephone number and fax address is not changed automatically.Example: A business partner moves abroad.If the telephone number is for a permanent connection, the telephone number also changes when the business partner moves and has to be maintained again in the system.If the telephone number is for a mobile telephone and the number is retained, the original country/region for this telephone number also has to be retained and must not be changed automatically to the new country/region of the address. - - - - - If several addresses are maintained for one communication type, the user in the SAP System can be reached under one of these addresses. One address can be set as theStandard Address. - The standard address is used for the following functions:When sending using the SMTP nodein SAPconnect, the home address of the communication type used is the one set as the sender address. The recipient can see this address in the sender information and can also reply directly to this address. The standard address is also transferred and can be used for incoming status notifications, for example.When sending using an RFC node in SAPconnect, the standard address of the communication type used is the one set as the sender address. The structure defined in the case of the RFC does not permit another address to be transferred, so the standard address is used for incoming status notifications too.The SAP users have the addresses of their exchange P.O. boxes in their standard communication type 'Internet Mail' as the home address and their Internet address in the SAP system as their standard address. Example:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address, it arrives back to the SAP system.Example using a mail system groupThe users should get all messages in their Microsoft Exchange postboxes. In the SAP system the mail system group is activated for this using the setting "Send Messages to the Home Address".The address settings of the SAP users remain unchanged:Home address: Bernard.Brown@Company.comStandard address: Bernard.Brown@System.Company.comSending using an SMTP nodeThe home address of the communication type 'Internet Mail' (Bernard.Brown@Company.com) is used as the sender address. If a reply is sent to this address the user receives directly in the exchange postbox.Sending using the RFC nodeThe standard address of the communication type 'Internet Mail' (Bernard.Brown@System.Company.com) is used as the sender address. If a reply is sent to this address it arrives back in the SAP system. It is then forwarded using the mail system group to the home address and the user gets it in the exchange postbox. - - - - - Telephone number, consisting of dialling code and number, but without country dialling code. - If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. - - - - - Telephone extension number - If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. - - - - - The content of this field is automatically calculated by the system based on the telephone number and country code components. - This field is therefore not to be filled when Business Address Services function modules are called. - - - - - This field specifies whether the telephone number is a mobile telephone number. - ' ' : The telephone number is a fixed-line telephone'1' : The telephone number is the standard fixed-line telephone'2' : The telephone nubmer is a mobile telephone'3' : The telephone number is the standard mobile telephoneEither the standard fixed-line telephone number or the standard mobile telephone number is also the standard telephone number (FLGDEFAULT = 'X').In older data sets, this field may have also have the value ' ' for the standard fixed-line telephone. In this case, however, FLGDEFAULT is always 'X'.In Customizing, you can specify whether the SMS-compatible indicator is to be proposed for new mobile telephone numbers created in dialog by choosing General Settings -> Set countries -> Define Mobile Telephone Attributes for each country. - - - - - Additional information about the communication connection - You can maintain further information about the communication connection here. In the case of telephone numbers, for example, you can maintain the times at which the call recipient is available and those at which they are not, or you can specify whether the number is that of the secretary.The information is stored in table ADRT, regardless of language. - - - - - - - - - - - - - - The business partner relationship number is an internal number that identifies the business partner relationship set. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - Additional address field which is printed above the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address. - - - - - Additional address field which is printed under the Street line. - The Street address has two lines above the street and two lines below the steet.See Print the Street address. - - - - - Time zone as part of an address. - The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. - - - - - Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). - Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - - City name as part of the address. - The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. - - - - - Postal code that is assigned directly to one company (= company postal code = major customer postal code). - This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. - - - - - The country/region key contains information which the system uses to check entries such as the length of the postal code or bank account number. - The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country/region code or a typical country/region key, for example, in Germany the Federal statistics office key.The country/region keys are determined at system installation in the global settings.The definition of the country/region keys in the SAP system does not necessarily have to match political or state units.Since the country/region key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country/region key cannot query the country/region key T005-LAND1, but have to program based on the ISO code T005 INTCA. - - - - - Specifies the county’s name - This field is used to store the county’s name. You can enter the name of the county in this field. - - - - - The delivery service is part of the PO box address. - Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. - - - - - The delivery service is part of the PO box address. - Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. - - - - - City or District supplement - In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. - - - - - Key for form of address text. - You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. - - - - - This field contains the full name or formatted name of a party. - For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. - - - - - City of residence which is different from the postal city - In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - House number as part of an address. - It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. - - - - - House number supplement as part of an address, e.g. - App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. - - - - - The language key indicates - - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. - - - - - PO Box number as part of an address. - Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. - - - - - Different city for the PO Box as an address component. - The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. - - - - - Other country/region for PO box in an address. - Here you can enter the country/region for the PO box if this country/region is different to the country/region of the street address.If the address only has a PO box address, you enter the country/region in in the normal field for country/region.If the street address and the PO box belong to two different countries/regions, you fill this field.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - Different Region for PO Box in an address. - Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - PO Box address without PO Box number flag. - Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - The PO box lobby is part of the PO box address. - In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. - - - - - Postal code that is required for a unique assignment of the PO box. - This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - Postal code as part of the address - If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. - - - - - Communication method with which you can exchange documents and messages with a business partner. - In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. - - - - - In some countries, the region forms part of the address. The meaning depends on the country. - The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State - - - - - Street name as part of the address. - The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. - - - - - Additional address field which is printed above the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - Additional address field which is printed below the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address. - - - - - Specifies the tax jurisdiction. - - - - - - Sales and distribution: - Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. - - - - - Version indicator of an address. - You can maintain addresses in multiple versions. In this way, addresses can be stored in the system in different international display formats (such as Kanji or Latin letters).The version indicator is a part of the address key.You can use the standard version keys or enter your own version keys in the view V_SAPTSADV.For more information, see the section 'Print Formatting for Addresses' in the BAS documentation (see SAP note 383362). - - - - - Function of a person, e.g. as contact person in a company. - In anglo-saxon countries this is often part of the formatted address (e.g. in an address window). - - - - - This field contains the department in a company as part of the company address. - It is the department name used at the customer for a customer contact person.It is usually the same as the department name used on business cards.The department is printed, e.g.:SAP AGBasis Technology <<<<Herr Peter LarssonNeurottstr. 16D-69190 Walldorf - - - - - Floor of the building as more exact specification of an address. - This field is not printed in the address.Floors which should be printed must be in the field house number supplement or in one of the fields Street2, Street3, Street4 or Street5 depending on the desired position. See Print the Street address. - - - - - Number or ID for the building in a contact person address. - This field is not printed.This is not the same as the building name which is part of an address. - - - - - Appartment or room number in an a ddress. - This field is not printed.Entries which are to be printed must in the house number supplement field or in one of the Street2, Street3, Street4 or Street5 fields, depending on the desired position. See Print the Street address. - - - - - Communication method with which you can exchange documents and messages with a business partner. - In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. - - - - - - - - - - - - - - - - - - - - The business partner relationship number is an internal number that identifies the business partner relationship set. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - - Identifies the function that a person has within a company. - This is a contact person attribute that you can define in Customizing.Personnel managerSecretary - - - - - Name of the department of a business partner for your internal usage. - The name given by the business partner to this particular department may differ from the name that you use. You can enter the name given by the business partner in the field company department.This is a contact person attribute that you can define in Customizing.For your purposes, the department name is "Sales". The business partner names the same department "Sales South". - - - - - Telephone number, consisting of dialling code and number, but without country dialling code. - If the telephone number consists of a company number and an extension, the extension must be entered in the field extension.Telephone number, as it is dialled from within the country.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. - - - - - Telephone extension number - If the telephone number consists of a company number and an extension, the extension should be entered here.Enter the extension.The following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.For the number "01234/567-0" enter the following:Telephone: 01234/567Estension: 0For the number "01234/567-891" enter the following:Telephone: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Telepone: 012-345Extension: 678In the following cases enter the complete number (without country dialling code) in the field Telephone:No part of the number can be regarded as an extension.You are not sure which part of the number can be regarded as an extension. - - - - - Fax number, consisting of dialling code and number, but without country dialling code. - If the fax number consists of a company number and an extension, the extension must be entered in the field extension.Fax number, as it is to be dialled from within the same country.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. - - - - - Fax extension number - If the fax number consists of a company number and an extension, the extension must be entered here.Enter the extensionThe following rules apply for the format of telephone and fax numbers:The length of the entries in the field Telephone and Extension (Fax and Extension) cannot be more than 24 characters in total.Leading spaces are not allowed in the field Telephone or Fax or in the field Extension.Valid characters are:Numbers (0123456789)Letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)Following other characters: /, (, ), - *, # and " " (space), but not as a leading space.If an + is entered as the first character, the system checks whether the specified number starts with a country code. If so, a warning message is displayed because the country code is automatically determined by the system and should not be stored in the Telephone number (Fax number) field.If an & is entered as the first character, the automatic check and formatting of the telephone number (fax number), as well as the determination of the country code, is suppressed.Enter the following for the number "01234/567-0":Fax: 01234/567Extension: 0Enter the following for the number "01234/567-891":Fax: 01234/567Extension: 891For the number "012-345-678" (678 as extension) enter the following:Fax: 012-345Extension: 678In the following cases, enter the complete number (without country dialing code) in the field Fax:No part of the number can be considered as an extension.You are not sure which part of the number can be considered as an extension. - - - - - Internet mail address, also called e-mail address. - Example: user.name@company.comThe Internet mail address is used to send mail via the Internet world-wide; the protocol used is SMTP (Simple Mail Transfer Protocol).The Internet mail address format is specified in various RFCs (Internet Request for Comment), including RFCs 821 and 822.This is not an IP address (192.56.30.6). - - - - - A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. - A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) - - - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - - Business partner attribute, which you can use to distinguish between various addresses by defining the address usage for communication with business partners. - Maintain the usage types for addresses (address types) in Customizing.You can create a short description and a name for the address type.When maintaining business partners you can use the function address usage to assign business partner addresses to address types.If necessary, you can set the indicator for multiple use in Customizing.Correspondence addressDelivery address - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - - Establishes which is the standard address for an address usage. - Several addresses per period can be assigned to an address usage.If this is the case, then this indicator controls which of the assigned addresses should be the standard address of the relevant usage. This is determined automatically when the address usage is accessed. - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - A document (such as an ID card or driver's license) or an entry in a system of records (such as a commercial register) whose key can be stored as an attribute for a business partner. - The identification type is for classifying identification numbers.You can define the identification types and their descriptions in Customizing.You can also specify for which business partner category an ID type should be valid.If necessary, assign the identification type to an Identification Category.You can only assign one identification type to an identification category. - - - - - Number that serves to identify a business partner, such as driver's license, or ID card number. - - - - - - Institution that adminsters or assigns an ID number. - - - - - - Date on which the ID number was registered or assigned by the appropriate authority. - - - - - - Country/region in which an ID number was assigned, or in which the number is valid. - - - - - - In some countries, the region forms part of the address. The meaning depends on the country. - The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State - - - - - This date marks the start of validity of an ID number. - - - - - - This date marks the end of validity of an ID number. - - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - - - - - - - Describes an industry. - An industry is a classification of companies according to their main business activity. For example, you can use Commerce, Banking, Services, Industry, Healthcare, Public Sector, Media, and so on, as industries.You can define industries along with their descriptions in Customizing.Assign the industry key to an industry key system. - - - - - Serves to combine and categorize several industries into a group. - You can create different industry systems, each with its own catalog of industries, whereby an industry can be assigned to several industry systems.You have to select one industry system as the standard industry system. This is then automatically displayed in the initial screen for the maintenance of industry data.You can define an industry system along with its description in Customizing. You can assign several industry systems to a business partner.If you choose the button All Industry Systems, you can access all the industry systems defined in the Customizing using the input help. - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Identifies the industry in an industry system that can be defined as the standard industry. - It is recommended that you define an industry within an industry system as the standard industry, because only the standard industries can be determined at the interfaces to BW or the APIs, for example.This means that even if only one industry exists within an industry system, it should be indicated as the standard industry as this this information cannot be determined otherwise. - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - Key for academic title. - You can define a key for an academic title in Customizing. - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - Category under which a business partner is classified. - You can distinguish between the following business partner categories:OrganizationNatural personGroup of natural persons or organizationsThe processing screens for the business partner categories are set up differently.So, for example, the screen for an organization contains the field Legal form, but this is not needed in the screen for a natural person. - - - - - - Classification assigned when creating a business partner. - Assign each business partner to a grouping when you create the business partner. The grouping determines the number range. You cannot change the assignment afterwards.You can define the groupings, their descriptions, the associated number range and other attributes in Customizing.You can define standard groupings for the internal and the external number assignment.For each grouping create a number range.When you create a business partner, the entry in the grouping field determines whether and how an entry is made in the business partner number field. - - - - - - - Correspondence language (written) for business partners in the 'Person' category. Maintain the correspondence language for business partners in the 'Organization' and 'Group' category with the address (communication). - When transferring data (direct input), make sure that for a'Person', the field 'LANGU_CORR' and for an'Organization' or "Group" the field 'LANGU'has an entry. - - - - - - - - - Key for form of address text. - You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. - - - - - An industry sector is the term used to classify a company according to its main business activity. - You can assign an industry sector to business partners in the category 'Organization'RetailBanksServicesIndustryHealth servicePublic sectorMedia - - - - - Here you enter the first 7 digits of the international location number. - The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). - - - - - Here, you enter digits 8-12 of the 13-digit international location number. - The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). - - - - - - - Indicator through which a distinction between natural and legal persons can be made during tax reporting. - Is used in Italy and Mexico ,among other countries.Brasil: If the indicator is not set, 'CGC' is relevant in tax number 1. If the indicator is set, 'CPF' is relevant in tax number 2.Colombia: In the case of some natural persons, the NIT number does not have a check digit. In this case you should set this indicator and the check is deactivated. - - - - - - - Language for verbal communication with a business partner. - This language may differ from the language(s) defined for written correspondence. - - - - - - - - - Denotes certain legal norms that are of significance for the organization of a company. - For business partners in the category "Organization", you can state the legal form of the company. This is for information purposes only.Stock corporation (AG in Germany)Limited liability company (GmbH in Germany) - - - - - First name field for business partners in the Organization category. - - - - - - Second name field for business partners in the Organization category. - - - - - - Third name field for business partners in the Organization category. - - - - - - Fourth name field for business partners in the Organization category. - - - - - - Indicates the official registration of a company in the Commercial Register. - If a company is not officially registered in the Commercial Register, it has to use some type of text addition, such as foundation pending, when referring to the legal form. - - - - - Term for the end of bankruptcy proceedings. - This date also indicates that the company no longer exists. - - - - - Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. - - - - - - Denotes the term that you define for a business partner, and via which you can restrict the search for a business partner in the business partner search or in the locator. - - - - - - - - If the Business partner's actual birthdate is unknown, a partial entry can be made or read. This field then indicates which part of the birthdate is unknown. Below are some examples (Dates are specified in format MM/DD/YYYY): - 01/01/0000 => 01/01/1880 Year unknown00/01/1911 => 01/01/1911 Month unknown05/00/1911 => 05/01/1911 Day unknown05/05/1911 => 05/05/1911 Fully known00/00/1911 => 05/05/1911 Day & Month unknown00/05/0000 => 05/05/1911 Month & Year unknown05/00/0000 => 05/05/1911 Day & Year unknown00/00/0000=> 05/05/1911 Fully unknown'Date of Birth: Status' field determines the unknown parts of birthdate.Enter a valid date under Birthdate. Future dates are not accepted. If any part/s of the date is/are unknown, select the nearest date.If year is unknown, select any random valid year. - - - - - - If the business partner is blocked centrally, certain activities cannot be executed. - - - - - - You can use the business partner type to group business partners according to your own criteria in Customizing (IMG). - In Customizing you can show or hide fields for data entry, depending on the requirements of the relevant business partner type.Select a business partner type. You can obtain help by pressing the F4 key. - - - - - - First name field for business partners in the Group category. - - - - - - Second name field for business partners in the Group category. - - - - - - Internal key for identifying the address for communication data that spans all addresses in Business Partner. - For more information on the significance and usage of the address number, see the documentation for Business Address Services (BAS). - - - - - The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. - - - - - - - The country/region for the name format rule and the name format rule key together uniquely identify a formatting rule. - A country/region can have several formats which correspond to different rules. You need formatting rules to describe the composition of a person's name. - - - - - See Name format. - - - - - - States the complete name of a person. - The complete name is generally generated and saved by the Business Address Services (BAS) according to country-specific rules from the individual name components (without the form of address).If, during the formatting of an address, you want to use an alternative name, you can manually format the alternative name here. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - Establishes if the business partner is meant to be archived. - If the indicator is set, the relevant business partner can be archived from the view of the business partner administration.If the check of the data to be archived shows, for example, that there are still active business transactions the archiving of the business partner data is prevented even if the indicator is set.If the indicator is not set, the business partner will not be taken into consideration during archiving. - - - - - Business partner number from an external system or a legacy system. - If the current business partner is known under a different number in an external system, you can store this number here for information purposes.Direct input gives you the option of maintaining a business partner by specifying the external business partner number. If you maintain business partner data in your legacy system, you can transmit changes made to business partners to the SAP system without having to know the SAP business partner number in the legacy system. - - - - - Company ID standard for the whole group. - - - - - - - - - - - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Internal key for identifying a Business Address Services address. - For more information about the meaning and use of the address number and the Business Address Services concepts, see the function group SZA0 documentation. - - - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - Additional address field which is printed above the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address. - - - - - Additional address field which is printed under the Street line. - The Street address has two lines above the street and two lines below the steet.See Print the Street address. - - - - - Time zone as part of an address. - The time zone is automatically determined by the system in address maintenance if time zone Customizing is maintained.It depends on the country and the region. (Region means state, province or county, depending on the country)The automatic determination is only made if there is no value in the time zone field. - - - - - Part of the address (c/o = care of) if the recipient is different from the occupant and the names are not similar (e.g. subtenants). - Put the country-specific code (e.g. c/o) in front of the name of the occupant. This is not automatically done in the print format, like the language-specific word "PO Box".John Smithc/o David BrownThis field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - - City name as part of the address. - The city name is saved redundantly in another database field in upper- case letters, for search help.If the Postal regional structure ('city file') is active, the city name is checked against the Cities defined in the regional structure. - - - - - Postal code that is assigned directly to one company (= company postal code = major customer postal code). - This field is used for countries where major companies are assigned their own postal code by the national post office.This postal code has to be entered in the field "Company Postal Code". Postal codes for group major customers, however, have to be entered in the field "PO Box Postal Code", since individual customers with a shared postal code for group major customers are differentiated by means of their PO box. - - - - - The country/region key contains information which the system uses to check entries such as the length of the postal code or bank account number. - The two-character ISO code in accordance with ISO 3166, which is delivered by SAP as a default, is usually used.It could also be the vehicle license plate country/region code or a typical country/region key, for example, in Germany the Federal statistics office key.The country/region keys are determined at system installation in the global settings.The definition of the country/region keys in the SAP system does not necessarily have to match political or state units.Since the country/region key does not have to correspond to the ISO code in all installations, programs that differ according to certain values of the country/region key cannot query the country/region key T005-LAND1, but have to program based on the ISO code T005 INTCA. - - - - - Specifies the county’s name - This field is used to store the county’s name. You can enter the name of the county in this field. - - - - - The delivery service is part of the PO box address. - Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Number of Delivery Service," the number of the Private Bag, Response Bag, or other relevant service has to be entered. Entering a number is not mandatory for each delivery service.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. - - - - - The delivery service is part of the PO box address. - Some countries offer different services in addition to regular postal delivery and PO boxes, for example the Private Bag or Response Bag. If an address is related to one of these delivery services, the information about this particular delivery service has to be entered in the corresponding fields.In the field "Type of Delivery Service," the type of the delivery service has to be entered.For each address, either the information about the PO box or the information about the delivery service can be entered, but not both types of information at the same time.Mr PickeringPrivate Bag 106999Timaru 7942Delivery services will only be taken into account for address formatting in countries in which they are commonly used in addition to regular postal delivery and PO boxes, for example, in Australia, New Zealand, and the USA. In all other countries, these fields will not be taken into account for address formatting. - - - - - City or District supplement - In some countries, this entry is appended with a hyphen to the city name by the automatic address formatting, other countries, it is output on a line of its own or (e.g. in the USA) not printed.See the examples in the Address Layout Key documentation. - - - - - Key for form of address text. - You can also define a form of address text in Customizing.The form of address text can be maintained in different languages. - - - - - This field contains the full name or formatted name of a party. - For organizations or document addresses, typically the fields Name1 and Name2 are concatenated.For persons the field contains the formatted name according to country specific rules. It corresponds e.g. to the content of the fields BUT000-NAME1_TEXT or ADRP-NAME_TEXT. - - - - - City of residence which is different from the postal city - In some countries, the residential city is required if it differs from the postal city.In the USA, the official street indexes, against which data can be checked, are based on the residential city, not the postal city, which may be different.It is the same in France, where a postally correct address must contain the residential city in a separate line above the postal city, if it differs from the postal city.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - House number as part of an address. - It is printed in the Street line.Other supplementary street information can be entered in the House number supplement or one of the Street2, Street3, Street4 or Street5 fields. See Print the Street address.A house number (e.g. 117) or a house number with supplement (e.g. 117a), or a house number range (e.g. 16-20), can be maintained in this field. - - - - - House number supplement as part of an address, e.g. - App. 17 orSuite 600.It is printed in the Street line.Further Street supplements can be put in one of the fields Street2, Street3, Street4 or Street5.See Print the Street address. - - - - - The language key indicates - - the language in which texts are displayed,- the language in which you enter texts,- the language in which the system prints texts. - - - - - PO Box number as part of an address. - Only enter the PO Box number in this field. The text "PO Box" is provided in the recipient language by the system when you print the address.When you print an address, the "Street address" and the "PO Box address" are distinguished. The print program determines which of them has priority if both are maintained in an address record.Besides the PO Box number, the PO Box address uses the following fields:PO Box postal code, if specified (otherwise the normal postal code)PO Box city, if specified (otherwise the normal city)PO Box region, if specified (otherwise the normal region)PO Box country, if specified (otherwise the normal country)If the address is a "PO Box" (without a number), do not fill the "PO Box" field. Select the "PO Box w/o Number" indicator instead.You can also enter a company postal code for organizational addresses, instead of a PO Box. A separate field is predefined for this entry.For general information and examples about address formatting, see the documentation on the Address Structure Key. - - - - - Different city for the PO Box as an address component. - The PO Box city can be entered here if it is different from the address city.If the address is only a PO Box address, enter the city in the normal city field.If the address contains two different city names for the address and the PO Box address, use this field. - - - - - Other country/region for PO box in an address. - Here you can enter the country/region for the PO box if this country/region is different to the country/region of the street address.If the address only has a PO box address, you enter the country/region in in the normal field for country/region.If the street address and the PO box belong to two different countries/regions, you fill this field.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - Different Region for PO Box in an address. - Enter the PO Box Region here, if it differs from the street address region.If the address only has a PO Box address, the Region in in the normal Region field.Use this field if the address has two different Region values for the street address and the PO Box address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - PO Box address without PO Box number flag. - Only the word 'PO Box' is output in PO Box addresses without PO Box number.Set this flag for a PO Box address without PO Box number.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - The PO box lobby is part of the PO box address. - In some countries, entering a PO box, postal code and city is not sufficient to uniquely identify a PO box, because the same PO box number is assigned multiple times in some cities.Therefore, additional information might be required to determine the post office of the PO box in question. This information can be entered in the field "PO Box Lobby."Mr NellingPO Box 4099HighfieldTimaru 7942The PO box lobby will only be taken into account for address formatting in countries in which it is commonly used in addition to regular postal delivery and PO boxes, for example, in Canada or New Zealand. In all other countries, this field will not be taken into account for address formatting. - - - - - Postal code that is required for a unique assignment of the PO box. - This field is used for countries where a different postal code applies to mail that is sent to the PO box rather than to the street address of a particular business partner.Postal codes for group major customers also have to be entered in the field for the PO box postal code since individual customers with a shared postal code for group major customers are differentiated by means of the PO box. Postal codes for major customers (= company postal codes), however, are assigned to one customer only and have to be entered in the field 'Company Postal Code'. - - - - - Internal key for identifying a person in Business Address Services. - For more information about the meaning and use of the person number and Business Address Services concepts, see the function group SZA0 documentation. - - - - - Postal code as part of the address - If different postal codes are maintained for the PO Box and Street address of an address, this field contains the Street address postal code. - - - - - Communication method with which you can exchange documents and messages with a business partner. - In Business Address Services, you can specify a standard communication method that can be used by programs to determine the means of communication for sending messages.One business partner wants all messages by fax, another by e-mail.The application context can restrict the possible methods of communication. For example, invitations should perhaps only be sent by post because of enclosures, whereas minutes can be sent by post, fax or e-mail.Communication strategies can be defined for this purpose and applied in application contexts. - - - - - In some countries, the region forms part of the address. The meaning depends on the country. - The automatic address formatting function prints the region in addresses in the USA, Canada, Italy, Brazil or Australia, and the county in Great Britain.For more information, see the examples in the documentation on the Address Layout Key.Meaning of the regional code in ...Australia -> ProvinceBrazil -> StateCanada -> ProvinceGermany -> StateGreat Britain -> CountyItaly -> ProvinceJapan -> PrefectureSwitzerland -> CantonUSA -> State - - - - - Street name as part of the address. - The street name is saved, redundantly in upper case in another database field, for search help purposes.There are other fields for address parts which can be printed above or below the street. See Print the Street address.The house number and other supplements are usually maintained in their own fields. See Formatting the Street line. - - - - - Additional address field which is printed above the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address.This field is not always automatically printed, as it was subsequently added to the address structure.The print program or form may need to be adjusted.This exception applies to the following fields:Street2, Street3, Street4, Street5, c/o name, and to all address fields added after Release 4.5. - - - - - Additional address field which is printed below the Street line. - The Street address contains two lines above the street and two lines below the street.See Print the Street address. - - - - - Specifies the tax jurisdiction. - - - - - - Sales and distribution: - Regional zone of Goods recipient.Purchasing:Regional zone of supplier.You can define regional zones to suit the requirements of your own business and country.Sales and distributionthe system automatically proposes a suitable route by using the transportation zone of the goods recipient in combination with other information about the delivery, such as theCountries of origin and destinationShipping conditionsTransportation groupIn the USA, for example, you can define regional zones to correspond to the US postal zip codes. - - - - - Address number from an external system or a legacy system - If the current address has a different number in an external system, you can save this number here for information purposes.In direct input you are able to maintain an address for a business partner by stating the external address number. If your business partner data is maintained in a legacy system, you can thus transmit changes to a BP address to the SAP system without having to know the SAP address number in the legacy system. - - - - - Specifies the county’s code - This field stores the county’s code. You cannot enter any data in this field. The system fetches this data from the ADRCOUNTY table and updates it in this field. - - - - - Specifies the township’s code - This field stores the township’s code. You cannot enter any data in this field. The system fetches this data from the ADRTOWNSHIP table and updates it in this field. - - - - - Specifies the township’s name - This field is used to store the township’s name. You can enter the name of the township in this field. - - - - - - - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Key identifying a business partner's bank details. - Enter a bank details ID for each separate set of bank details for a business partner.Business Partner: H. MillerBD-ID Fin.institution Acct no. 0001 Chemical Bank, NYC 56234560002 Chemical Bank, NYC 56231220003 First Bank of Pittsburgh ...Business partner: T.Wolsey and Co.BD-ID Fin.institution Acct no.GIR0 Citibank, Charleston ...GIR1 Chemical Bank, NYC ... - - - - - Specifies the country/region where the bank is based. - The country/region key determines according to which rules the remaining bank data (for example, bank number and bank account number) is checked. - - - - - The name under which the bank operates. - - - - - - The bank key (under which the bank data is stored in the appropriate country) is specified in this field. - The country-specific meaning of this bank key is specified when defining country key.Normally banks have a bank number, which then also appears in the control data of the bank.In certain countries the bank account number assumes this function; in such a case there would be no bank numbers, the bank details are then under the account number.For data medium exchange it can be useful to be able create banks for foreign business partners without a bank number, even if the country in question has bank numbers. In such cases the bank key can be assigned internally.If the bank data is under another key, such as the SWIFT code for example, numbers can also be assigned externally. - - - - - Uniquely identifies a bank throughout the world. - SWIFT stands for Society for Worldwide Interbank Financial Telecommunication.BIC stands for Bank Identifier Code.This globally unique code can be used in international payment transactions to identify the bank without the need to specify an address or bank number. Specification of the SWIFT code/BIC is mainly relevant for automatic payment transactions. - - - - - Brazil, France, Spain, Portugal and Italy - The field contains a check key for the combination bank number and bank account number.USAIn USA this field is used to differentiate between a savings and a current account (if no value is entered, the default value 01 is used).01 Current account02 Savings account03 Loan account04 General ledgerJapanIn Japan this field specifies the type of account. This information is is copied from the payment medium print program into payment medium. The following is an example of the account types used:01 FUTSU (similar to a savings account)02 TOUZA (similar to a current account)04 CHOCHIKU (similar to an investment account)09 Other types of bank accountsSouth AfricaIn South Africa this field specifies the type of account. The information entered here is forwarded to the bank that carries out the payment order. The following account types are permitted in ABC format:01 Current (Cheque) Account02 Savings Account03 Transmission Account04 Bond Account06 Subscription Share AccountArgentinaIn Argentina this field specifies the type of account:CC Current Account (Cuenta corriente)CA Saving Account (Caja de ahorro)CE Special Saving Account (Caja de ahorro especial)CS Salary Account (Cuenta sueldos)VenezuelaIn Venezuela this field specifies the type of account:CC Checking Account (Cuenta corriente)CA Saving Account (Cuenta de ahorro)CE Special Saving Account (Cuenta de ahorro especial)CS Salary Account (Cuenta sueldos)MexicoIn Mexico this field contains a two-digit key for classifying the bank account (for example, as a savings or current account). This key have different definitions, depending on the bank.NoteFor countries that are not listed here, this field can be used for account-specific information. - - - - - Here you can enter another name that the payment program can use if the name of the account holder is not the same as the name of the Business Partner. - - - - - - - - - A uniform standardized ID number for representing bank details that is in accordance with the ECBS (European Committee for Banking Standards). An IBAN has a maximum of 34 alphanumeric characters and is a combination of the following elements: - Country key of the bank (ISO code)Two-digit check numberCountry-specific account number (in Germany this consists of the bank number and account number, in France the bank number, account number and check key).The IBAN not only makes international payments easier, in some countries it has advantages for domestic payments as well. Depending on the country, it can mean advantages for value and fees.The IBAN can be maintained in parallel with the bank details but does not replace them. It is stored under the master data of the business partner and can then be used when creating the payment medium.Since it is only the bank that has the account that may generate the IBAN corresponding to an account number, the SAP system only generates a proposal. You can confirm or change this proposal. If no proposal is generated, enter the IBAN manually.An IBAN in Belgium may look like this:Electronic Form:BE62510007547061Printed form, as it would appear on an invoice:IBAN BE62 5100 0754 7061 - - - - - - This field contains the number under which the account is managed at the bank. - - - - - - Additional details for the bank details of the business partner. - In some countries the data for the bank details of the business partner (bank number, bank account number, name of the account holder) have to supplemented by other details in order to be able to use certain payment processes. This supplementary details are defined here.If additional data is required for the bank details for payment transactions in your country (see the following examples), enter the reference information.If for an automatic debit the bank requires the reference number of the collection authorization in Norway or Great Britain, specify this number here.In Great Britain when making payments to an account in a 'Building Society' you must specify which number payment recipient has. These details must be defined in the reference field, whereas the fields Bank Key and Account Number are to be used for the bank details of the 'Building Society'.In Great Britain when entering a building society account number, the name of the building society should also be maintained in the system. - - - - - States that the bank has collection authorization from the business partner for the account. - Set this indicator if the bank has collection authorization.Note for Accounts Receivable (FI-AR)If this indicator is not set, there is no bank collection.Note for Contract Accounts Receivable and Payable (FI-CA)This indicator is not relevant. - - - - - Name of the city as a part of the address. - - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - - - - - - - - The business partner relationship number is an internal number that identifies the business partner relationship set. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - - - States whether the relationship is a standard relationship. - If several relationships of the BP relationship category contact person have been defined for, you can set the indicator standard relationship for one of these relationships.A relationship that is marked as a standard relationship can be used whenA certain scenario automatically selects a contact personThe contact person responsible is not knownYou can give this indicator to only one business partner relationship of a BP relationship category for a particular period. Another relationship of the same relationship category can be indicated as the standard relationship only if the periods for the relationship do not overlap or coincide. - - - - - A relationship may exist between two business partners. The business partner relationship category characterizes the features of the relationship. - A distinction is made between a one-way and an undirected business partner relationship category. In a one-way relationship category, the relationship extends from one partner to another, but not vice versa.Marriage (undirected)Employee (one-way)Contact person (one-way) - - - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Function that a business partner takes on, depending on a business transaction. - You can define business partner roles along with their attributes in Customizing.You can create an alphanumeric, 6-digit key for the BP role. You can also choose a title as the short form and a description as the long form for the role text.Screen control in the dialog takes place by assigning a BP view.A program can access specific business partner roles for a business partner using thebusiness partner role category . The role categories are also in the TB003 table. - - - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - - - - - - Key identifying a business partner in the SAP system. The key is unique within a client. - - - - - - Specifies the tax number category. - - - - - - Specifies the tax number. - - - - - - Specifies the tax number. - You can enter up to 60 characters in this field. - - - - - You can use authorization groups to stipulate which business partners a user is allowed to process. - Use the following authorization object:'Business partners: authorization groups' (B_BUPA_GRP).The system only checks this authorization if you made an entry in the "Authorization group" field for the business partner. Otherwise, any user may process the business partner. - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - Indicates if the processing of billing documents is blocked for the customer in all sales areas (company-wide, for example). - You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block the processing of all credit memos to a certain customer, pending manual approval. - - - - - Name with which the user who entered the master record was logged on in the R/3 System. - - - - - - Date on which the master record, or the part of the master record being viewed, was created. - - - - - - The account group is a classifying feature within customer master records. The account group determines: - in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. - - - - - Specifies a classification of the customer (for example, classifies the customer as a bulk purchaser). - The classifications are freely definable according to the needs of your organization. - - - - - - - Indicates if delivery processing is blocked for the customer in all sales areas (company-wide, for example). - You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all deliveries to a certain customer for credit reasons. - - - - - Denotes a natural person. - In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. - - - - - Indicates if sales order processing is blocked for the customer in all sales areas (company-wide, for example). - If you block sales order processing, the block counts for the following partner functions of the customer:Sold-to partyShip-to partyPayerIf you want to process an order where the ship-to party differs from the sold-to party, and the ship-to party is blocked, you cannot process the order.You can define different kinds of block, according to the needs of your organization. You can, for example, automatically block all free of charge deliveries and credit memo requests for a certain customer, pending manual approval before further processing can take place. - - - - - Indicates that the account is blocked for posting for all company codes. - If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. - If you create a matchcode using this group key, group evaluations are possible. - - - - - Account number of another master record in which the official address is stored. This address is used, for example, for tax reports to the tax authorities in Italy. - - - - - - An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. - The industry field belongs to the general data area of customer and vendor master records. - - - - - Specifies the code that uniquely identifies the industry (or industries) of the customer. - Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. You can assign more than one industry code to a customer by choosing Create more. - - - - - Specifies an additional code that identifies the industry (or industries) of the customer. - Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. - - - - - Specifies an additional code that identifies the industry (or industries) of the customer. - Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. - - - - - Specifies an additional code that identifies the industry (or industries) of the customer. - Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. - - - - - Specifies an additional code that identifies the industry (or industries) of the customer. - Depending on the standards your organization uses (for example, Standard Industry Codes (SIC)), enter the appropriate code. - - - - - Here you enter the first 7 digits of the international location number. - The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). - - - - - Specifies a regional division according to the market categories created by the A. C. Nielsen company. - By allocating a Nielsen division, you can use the services of the Nielsen Institute to create a market analysis of your customers. - - - - - Classification of companies according to tax aspects. - - - - - - Specifies the tax number. - Enter the appropriate tax number:Country/Region Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N - - - - - Specifies the tax number. - Enter the appropriate tax number:Country/Region Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberNorway Organization registration numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number - - - - - Specifies the tax number. - Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number - - - - - Specifies the tax number. - Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) - - - - - Kazakhstan - Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. - - - - - Taxes in Argentina: - The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. - - - - - VAT registration number (VAT reg.no.) of the customer, vendor or your company code. - The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. - - - - - Indicates that all data in this master record is to be deleted. - To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. - - - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. - - - - - - This field contains the account number the company is listed under at the customer. - - - - - - Identification code for the accounting clerk. - The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). - - - - - - - - - Account number of the customer for whom automatic payment transactions are to be carried out.The account number is only needed if bank collections are not to be made via the customer who owes the receivables. The same applies to refunds of payables.The specification in this field only applies to this company code. There is another field in which you can enter an alternative payee for all company codes. If both fields are filled, the specification for the company code has priority. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - Indicator which specifies at what intervals the collective invoices are to be created for the customer. - - - - - - Internal memo of the accounting department. - The memo serves only as information on special features of the customer/vendor. - - - - - This field contains the account number of the head office. - This account number is only specified for branch accounts. All postings for which the account number of the branch is specified, are automatically posted to the head office account. The account number of the branch affected is noted in the line items.No line items or balances are managed in the branch account. - - - - - Indicates that during automatic payment transactions clearing is made with the corresponding vendor account, and that during manual clearing procedures, the items of that vendor account are also selected. - To use this function in automatic payment transactions, you have toenter the vendor account number in the customer master record,enter the customer account number in the vendor master record, andselect the "Clearing with customer" indicator in the vendor master record.If you set this indicator, the system will also include items of the vendor account in customer dunning. - - - - - All bank data is determined using this key. - - - - - - You enter an interest indicator here if you want the business partner to be included in automatic interest calculation. - - - - - - The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. - Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. - - - - - An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. - Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. - - - - - Indicates that payment transactions and dunning notices are created for the branch. - Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. - - - - - If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. - - - - - - Indicates the layout rule for the Allocation field in the document line item. - The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. - - - - - Block key (enqueue key) that is used to block an open item or an account to payment transactions. - You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in the configuration step Change Message Control, udter Finance -> Localization -> General Settings.Release for PaymentIf you want to use a block key for payment release in accounting, then you have to set the attribute Not Changeable for the block key. You make this setting in the configuration step Control Payment Block Reasons, under Finance -> Accounts Payable -> General Payment Settings. - - - - - List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. - If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. - - - - - Key for defining payment terms composed of cash discount percentages and payment periods. - It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. - - - - - This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. - - - - - - Indicates that the account is blocked for posting in the specified company code. - If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. - - - - - The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). - For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. - - - - - Indicator that the payment history of the customer is to be recorded. - The amount and number of payments are then recorded per calendar month, as well as the average days in arrears.Information about cash discount payments and net payments is recorded separately.The indicator should not be set for one-time accounts and accounts which are paid automatically (bank collection or bank bill in Germany, bill of exchange payment request in France).You can only carry out evaluation of the payment history, for example, with the report for customer evaluation with OI listing, if you have selected this field. - - - - - Name or identification code of the accounting clerk at the customer. - - - - - - Indicates that the company code data in this master record is to be deleted. - To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. - - - - - In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. - You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... - - - - - With the key specified here, you can refer to known/negotiated leave. - - - - - - The value adjustment key controls the way the open items are processed during individual value adjustment. - - - - - - The account group is a classifying feature within customer master records. The account group determines: - in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. - - - - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. - If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. - - - - - Key which reflects the reason for a dunning block indicator. - - - - - - Number that specifies how often an item or account has been dunned. - The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. - - - - - This field contains the key for the dunning procedure to be used. - - - - - - Account number of the customer who is to be the recipient of the dunning letters. - The account number is only needed if dunning letters are not sent to the customer who owes the receivables. - - - - - Date on which the last dunning notice was made. - - - - - - Date on which a legal dunning procedure was initiated. - The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. - - - - - Identification code for the accounting clerk dealing with dunning letters. - Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - The account group is a classifying feature within customer master records. The account group determines: - in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. - You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. - You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. - A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. - - - - - This field contains the account number your company is listed under at the customer or vendor. - - - - - - The authorization group enables you protect access to certain objects. - In order to carry out a specific activity, the user must have authorization for the combination of the activity and the authorization group. - - - - - Indicates if further billing activities are blocked for the customer. The block applies throughout the specified sales area. - If you enter a blocking indicator, billing that is already underway is continued. However, you cannot process the document further.Enter one of the values predefined for your system. If you want to block billing for a customer throughout an entire sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block billing for a customer if, for example, there are credit-related or legal problems to be resolved. - - - - - Indicates whether a sales order must be delivered completely in a single delivery or whether the order can be partially delivered and completed over a number of deliveries. - - - - - - Customer's currency for a sales area. This currency will be used to settle the customer's charges for the given sales organization. - - - - - - - The account assignment group to which the system automatically posts the sales document. - The system uses the account assignment group as one of the criteria during the automatic determination of revenue accounts.The system automatically proposes the account assignment group from the customer master record of the payer. You can change the default value in the sales document or the billing document. - - - - - Identifies a particular group of customers (for example, wholesale or retail) for the purpose of pricing or generating statistics. - - - - - - Key for defining payment terms composed of cash discount percentages and payment periods. - It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. - - - - - A grouping of customers who share the same pricing requirements. - You can define price groups according to the needs of your organization and create pricing records for each group. You can, for example, define a group of customers to whom you want to give the same kind of discount. You can assign a price group to an individual customer either in the customer master record or in the sales document.The system can propose the price group from the customer master record. You can change the proposed value manually in the sales document at both header and item level. - - - - - Determines which pricing procedure the system should apply when you create a sales document for the customer. - You can define different pricing procedures for your system. A pricing procedure determines the type and sequence of conditions that the system uses for pricing in, for example, a sales order. - - - - - Indicates if further delivery processing is blocked for the customer. The block applies throughout the specified sales area. - If you enter a blocking indicator, delivery processing that is already underway is continued. However, no new processing can take place.Enter one of the values predefined for your system. If you want to block delivery processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sales organization is defined.You can block delivery processing for a customer if, for example, there are credit-related or legal problems to be resolved. - - - - - The delivery priority assigned to an item. - You can assign delivery priority to either a particular material or to a combination of customer and material. When you process deliveries collectively, you can use delivery priority as one of the selection criteria. - - - - - Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). - Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. - - - - - Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: - No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination - - - - - An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). - - - - - - Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: - 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. - - - - - Indicates that all data in the master record will be deleted for the specified sales area. Before the deletion is made, the system checks for dependent data that would prevent the deletion. - - - - - - Additional information for the primary Incoterm. - If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). - - - - - Identifies the calendar that determines the schedule of billing dates for the customer. - If, for example, a customer wants to consolidate the invoices you send out, you can predefine the billing schedule in a calendar in the system. During billing, the system automatically proposes the appropriate billing date from the calendar.The system proposes the billing schedule from the customer master record of the payer. You can change the value manually in the sales document. - - - - - The probability (expressed as a percentage) of the customer confirming the inquiry or quotation item as part of a sales order. - The system combines the probability factors from the sales document type and from the customer master record of the sold-to party.If probability is 80% for the sales document type and 50% in the customer master record, the system combines the two values. In this case, the system takes 50% of 80% and proposes 40% for the item.The system proposes the probability. You can change the value manually for the item.You can generate requirements from quotations. Accordingly, the probability of quotation items affects how requirements are passed on. For example, a quotation for 100 pieces and a probability of 50% will generate requirements for 50 pieces. - - - - - Indicates whether you are allowed to combine orders during delivery processing. - The system proposes the indicator from the customer master record. You can change the value manually in the sales document at both header and item level. - - - - - Indicates if further sales order processing is blocked for the customer. The block applies throughout the specified sales area. - You can define blocks according to the needs of your organization. If you enter a blocking indicator, sales order processing that is already underway is continued. However, no new processing can occur.Enter one of the values predefined for your system. If you want to block sales order processing for a customer within a particular sales organization, you must enter a blocking indicator for each sales area in which the sale organization is defined.You can block sales order processing for a customer if, for example, there are credit-related or legal problems to be resolved. - - - - - Specifies whether the customer requires full or partial delivery for the item. - You use this field to control partial deliveries at the item level. If the customer allows partial delivery, you can choose from different partial delivery options. For example, you can specify whether the customer allows you to make one delivery attempt only on the requested delivery date or whether unlimited delivery attempts are possible.When partial delivery indicator 'D' is set, the order can never have status 'fully delivered'. You must complete each item by entering a reason for rejection. This could be applied to scheduling agreements, for example.You can enter a value in this field only if the customer allows partial deliveries for the entire sales document. - - - - - Identifies a price list or other condition type (for example, a surcharge or discount). - You can define price list types according to the needs of your own organization. Price list types can be grouped according to:the kind of price list (for example, wholesale or retail)the currency in which the price appearsthe number of the price list typeYou can use price list types to apply conditions during pricing or to generate statistics.In the customer master record, enter one of the values predefined for your system. The system proposes the value automatically during sales order processing. You can change the value manually in the sales document header. - - - - - A group of sales people who are responsible for processing sales of certain products or services. - By using sales groups you can designate different areas of responsibility within a sales office. When you generate sales statistics, you can use the sales group as one of the selection criteria.If sales office personnel service both retail and wholesale markets, you can assign a sales group to each market.You assign each salesperson to a sales group in his or her user master record. You assign each customer to a particular sales group in the customer's master record. - - - - - A physical location (for example, a branch office) that has responsibility for the sale of certain products or services within a given geographical area. - When you create sales statistics, you can use a sales office as one of the selection criteria. When you print out order confirmations, you can include the address of the sales office.You can assign each customer to a sales office in the customer master record.Within a sales office you can establish sales groups (for example, departments) with specific sales responsibilities. Each person who works in the sales office can be assigned to a sales group in his or her user master record. Each customer can also be assigned to a particular sales group in the customer master record. - - - - - General shipping strategy for the delivery of goods from the vendor to the customer. - You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. - - - - - Plant from which the goods should be delivered to the customer. - This plant is automatically copied into the sales order item as the default value.If there is no default value when you process the sales order item, enter a delivering plant.The value proposed in the item is eitherfrom the customer master record of the goods recipient, orfrom the material master recordThe system checks whether it can propose a value (and for your own plants, whether the material has been created in the plant). If the system can propose a value, the plant is copied to the sales order item where you can change it as required. - - - - - A geographical sales district or region. - Each customer can be assigned to a sales district. You can use sales districts to apply pricing conditions. When you want to generate sales statistics, you can use sales districts as a selection criteria.The system can propose a value from the customer master record of the sold-to party. You can change the value manually in the document at the header or item level. - - - - - Identifies the customer's factory calendar that is used during the processing of invoice lists. - An invoice list is a list of invoices (single or collective) that you create for the customer either periodically or on predefined dates. The periods and dates are defined in the customer's factory calendar. Typically, the recipient of an invoice list takes on the responsibility for collecting payments from numerous individual customers and receives a factoring or del credere discount for the service.If you want to create invoice lists for the customer, you must enter an identifier for a predefined factory calendar. - - - - - Key representing a type of exchange rate in the system. - You enter the exchange rate type to store different exchange rates.You can use the exchange rate type to define a buying rate, selling rate, or average rate for translating foreign currency amounts. You can use the average rate for the currency translation, and the bank buying and selling rates for valuation of foreign currency amounts. - - - - - Specifies a customer-defined group of customers. - You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. - - - - - Specifies a customer-defined group of customers. - You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. - - - - - Specifies a customer-defined group of customers. - You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. - - - - - Specifies a customer-defined group of customers. - You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. - - - - - Specifies a customer-defined group of customers. - You can define up to five different groups of customers, according to the needs of your organization. You specify the groups in the customer master record under "Additional data". If you assign a particular customer to one or more groups, the system automatically displays the groups in the header data of corresponding sales orders.You can define customer groups in Tables TVV1 through TVV5 and assign them to specific languages in Tables TVV1T through TVV5T. - - - - - This key identifies the customer payment guarantee procedure. - The customer payment guarantee procedure determines which payment guarantee procedure the system automatically uses when you create a sales document for the customer.In receivables risk management, the system determines the payment guarantee procedure taking into account:the key for the document payment guarantee procedure in the header for the sales document type.the customer payment guarantee procedure key in the customer master.You can define different payment guarantee procedures for your system. The payment guarantee procedure defines the type and sequence of forms of payment guarantee that the system assigns to the sales document items. - - - - - The account group is a classifying feature within customer master records. The account group determines: - in which number range the customer account number should be;whether the number is assigned by the user or by the system;which specifications are necessary or possible in the master record. - - - - - - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. - You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - Specifies a distribution channel that you want to use as a reference for customer and material master data for other distribution channels. - You can specify one distribution channel as the source of customer and material master data for other distribution channels. You need then only to maintain the data in one place.Distrib.channel Ref.distrib.channel01 0102 0103 0104 04In this example, only distribution channels 01 and 04 have customer and material master data defined. Distribution channels 01, 02, and 03 share the master data that you defined for distribution channel 01. Distribution channel 04 has its own master data. When you create a sales order in distribution channel 03, the system checks the customer and material master data against the data defined for distribution channel 01. - - - - - A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. - A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. - - - - - Identifies the country or region in which the delivery originates. - You can define the country/region key in a table. As a rule, it is a good idea to use the existing international standards for identifying vehicles from different countries or regions (for example: USA = United States, I = Italy, and so on). The system uses the key to do the following:Help determine the relevant taxes during pricingDetermine important country or region-specific standards (the length of postal codes and bank account numbers, for example) - - - - - Identifies the condition that the system uses to automatically determine country-specific taxes during pricing. - You can define one or more tax categories for each country. During sales order processing, the system applies the tax category according tothe geographical location of your delivering plant and the location of the customer receiving the goodstax classifications in the customer master record and the material master record.In the USA, for example, you can define tax categories for Federal Sales Tax and Federal Excise Tax. In the U.K., you can define a tax category for Value Added Tax (VAT). - - - - - Specifies the tax liability of the customer, based on the tax structure of the customer's country. - You can use the tax classification to specify, for example, whether a customer is liable for sales taxes, such as VAT or state sales taxes.During sales order processing, the system copies the tax classification from the tax information stored in thecustomer master record of the payer, if the payer is different from the sold-to party and the sales tax identification number is maintained for the payer.ship to party, if the sales tax identification number of the ship-to party is maintained.sold-to party, if none of the criteria for the payer or the ship-to party are met.During pricing, the system calculates any relevant taxes by taking the following factors into account:The tax classification of the customer and the materialThe country keys of the customer and the delivering plant - - - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. - You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. - You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. - A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - This indicator is used to allocate customers and vendors to different tax categories. The system evaluates this information during document entry to assist users in selecting the tax code. - - - - - - The exemption information are displayed while posting a document to help the user find the correct tax code. If the posting date lies within an exemption interval the corresponding tax category will be highlighted. - - - - - - Tax categories - The exemption information is used by the system to help the user find the correct tax code while posting a document.The system will not apply the exemption rate to a tax amount previously calculated. This has to be done by defining a special tax code with a reduced percentage rate.Withholding taxThe exemption percentage is applied to the calculated withholding tax amount. - - - - - - - This field gives the start date of the status of being subjected. - - - - - - This field gives the end date of the status of being subjected. - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - This indicator is used to classify the different types of withholding tax. - Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. - - - - - One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. - Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. - - - - - - Date from which: - The company code is obligated to withhold tax for the given withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obligated to withhold tax for the withholding tax type.This date must be defined in the customer master record. - - - - - Date to which: - The company code is obligated to withhold tax for the withholding tax type.This date must be entered in Customizing under the withholding tax information for the company code.The customer is obigated to withhold tax for the withholding tax type. - - - - - This is a number issued by the tax authorities per withholding tax type. - This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. - - - - - Numbered assigned by the relevant authorities for exemption from withholding tax. - This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. - - - - - Rate of exemption from withholding tax. - Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. - - - - - Date from which withholding tax exemption applies. - - - - - - Date on which withholding tax exemption expires. - - - - - - Indicator used to classify different types of exemption from liability to a particular withholding tax. - These indicators can be defined per withholding tax type in the vendor master record. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - - - - - - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - An organizational unit responsible for the sale of certain products or services. The responsibility of a sales organization may include legal liability for products and customer claims. - You can assign any number of distribution channels and divisions to a sales organization. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - The way in which products or services reach the customer. Typical examples of distribution channels are wholesale, retail, or direct sales. - You can maintain information about customers and materials by sales organization and distribution channel. Within a sales organization you can deliver goods to a given customer through more than one distribution channel.You can assign a distribution channel to one or more sales organizations. If, for example, you have numerous sales organizations, each sales organization may use the "Wholesale" distribution channel.For each combination of sales organization and distribution channel, you can further assign one or more of the divisions that are defined for the sales organization. You can, for example, assign "Food" and "Non-food" divisions to the "Wholesale" distribution channel. A particular combination of sales organization, distribution channel, and division is known as a sales area. - - - - - A way of grouping materials, products, or services. The system uses divisions to determine the sales areas and the business areas for a material, product, or service. - A product or service is always assigned to just one division. From the point of view of sales and distribution, the use of divisions lets you organize your sales structure around groups of similar products or product lines. This allows the people in a division who process orders and service customers to specialize within a manageable area of expertise.If a sales organization sells food and non-food products through both retail and wholesaledistribution channels each distribution channel could then be further split into food and non-food divisions. - - - - - The sequential number that the system applies when there is more than one partner for a particular partner function. - When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. - - - - - The abbreviated form of the name that identifies the partner function. - - - - - - - Sold-to party number sent in by the customer in delivery schedules. - The system uses this number to automatically determine the ship-to party. - - - - - Specifies a partner as the default for a particular partner function. - When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The personnel number is the only feature within a client which is unique to an employee. You have to enter a personnel number before you can display and maintain an employee's master data and time data. - - - - - - The number that uniquely identifies the contact person. - - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The account number of the vendor with whom automatic payment transactions are carried out. - The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies to all company codes. There is a further field in which every company code can enter an alternative payee separately. If both fields are filled, the company code specification has priority. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - Name with which the user who entered the master record was logged on in the R/3 System. - - - - - - Date on which the master record, or the part of the master record being viewed, was created. - - - - - - Gives an alphanumeric key, which clearly identifies the customer or vendor in the SAP system. - - - - - - - Indicates that the account is blocked for posting for all company codes. - If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. - - - - - Indicates whether or not the supplier master record is blocked for all departments (that is, whether or not posting to this record is allowed at all). - - - - - - The account group is a classifying feature within vendor master records. The account group determines: - the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. - - - - - - - VAT registration number (VAT reg.no.) of the customer, vendor or your company code. - The VAT registration number is used within the EU for tax-exempt deliveries for the "EC sales list". The check rules are defined for each EU country and cannot be changed. - - - - - - - Indicates that all data in this master record is to be deleted. - To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.Deletion flags can also be used in the program for deleting master data. You should, however, run this program only to delete test data prior to production startup. - - - - - Specifies an additional master record in which the official address is stored. - This address is used in Italy for business transactions with the tax office in Italy. - - - - - An industry is a distinct group of companies with the same basic business activity. The industry key is used in selecting data for evaluations (for example, a vendor master data list). You can specify industries such as trade, banking, service, manufacturing, health care, public service, media and so on. - The industry field belongs to the general data area of customer and vendor master records. - - - - - Here you enter the first 7 digits of the international location number. - The International Location Number (ILN) is assigned (in Germany by the Centrale for Coorganisation GmbH)) when a company is founded. It consists of 13 digits, the last digit being the check digit. There are two categories of location numbers:Participants who only need an ILN to cleary and unmistakably identify themselves for communication with the business partner are given a category 1 ILN. This cannot be used to identify articles by means of EAN.Participants who wish to assign the location numbers for their own enterprise areas are given a category 2 ILN. For a category 2 ILN, digits 1 to 7 are described as basis number. This is used as basis for the creation of article numbers (EAN). - - - - - Here, you enter digits 8-12 of the 13-digit international location number. - The international location number (ILN) is assigned when establishing a company (by the "Zentrale für Coorganisation GmbH" in Germany). It consists of 13 digits, the last of which is the check digit. There are two types of international location numbers:Subscribers who only need one ILN to identify themselves in communication with the business partner are given an ILN of type 1. These cannot be used for identifying articles by means of EAN.Subscribers who need to assign location numbers for their own company areas are given an ILN of type 2. Positions 1 through 7 of the ILN type 2 are known as the basis number. This basis number forms the basis for article numbers (EAN). - - - - - The check digit is derived from a special check digit procedure from digits of the previous international location numbers. In this way, you can check whether the ILN entered is actually valid. - - - - - - Denotes a natural person. - In the following countries, the system needs to know whether the taxpayer is a legal or natural person so that it can check the tax numbers correctly:BrazilBulgariaColombiaCroatiaGreeceItalyMexicoPeruSloveniaThailandUkraineThe flag is also used in conjunction with the Statement of Payments to Natural Persons report, as used in the Czech Republic and in Slovakia. This report only covers customers and vendors for whom you have set this indicator.In South Korea, it is used in conjunction with the Generic Withholding Tax Reporting program. - - - - - Classification of companies according to tax aspects. - - - - - - Date up to which the certification of the QM-system is valid. - - - - - - If a QM system is maintained by the supplier, you can store a description of the QM system here. - If a material is activated for QM in procurement, the system initiates the following check whenever purchasing functions are carried out (for example, when a request for a quotation is made or if a purchase order is created):Whether the supplier's verified QM system, according to supplier master record or quality info record (for a combination of supplier/material) meets the requirements for QM systems as specified in the material master.When carrying out the check, the system relies on the defined assignments for target QM systems and actual QM systems in the Customizing application. When carrying out the check, the system relies on the assignments for target QM systems and actual QM systems defined in the configuration.If the check is unsuccessful, a warning message is issued when a request for quotation is initiated and an error message is issued for all other procurement activities. - - - - - If the customer or the vendor belongs to a group, you can enter a group key here. The group key is freely assignable. - If you create a matchcode using this group key, group evaluations are possible. - - - - - Key that determines which procurement functions (for example, request for quotation, purchase order, or goods receipt) should be blocked for quality reasons. - You can enter a block key in the:Supplier master recordIn this case, the supplier block applies to all materials and plants.Quality info record for QM in procurementIn this case, the supplier block applies to a single material and plant.A block for quality reasons applies only to those materials for which QM in procurement is active. - - - - - Specifies the tax number. - Enter the appropriate tax number:Country/Region Tax NumberArgentina CUIT number or CUIL numberBelgium Enterprise numberBrazil CNPJ numberBulgaria Unified identification codeChile RUT numberChina VAT registration number (shui wu deng ji hao)Colombia NIT numberCroatia Legal persons: company identification numberNatural persons: JMBG numberCzech Republic DIC numberFrance SIRET numberGreece Personal IDHungary Tax numberItaly Fiscal codeKazakhstan RNN (obsolete)Mexico RFC numberNetherlands SI registration number (Aansluitnummer UWV) of chain- liability vendorNorway VAT numberPeru RUC numberPhilippines Taxpayer identification number (see below)Poland NIP numberPortugal NIF numberRomania Tax numberRussia INNSlovakia DIC numberSlovenia Tax numberSouth Korea Natural persons: Personal identification numberLegal persons: Corporation IDSpain NIF numberSwitzerland UID numberTaiwan GUI registration numberThailand Personal IDTurkey Name of business partner's tax officeUkraine Taxpayer identification numberUnited Kingdom Company registration numberUnited States Social security numberVenezuela RIF numberIn the Philippines, enter the taxpayer identification number with a V or N at the end, as follows:If the business partner is liable to VAT: 999-999-999-999VIf the business partner is not liable to VAT: 999-999-999-999N - - - - - Specifies the tax number. - Enter the appropriate tax number:Country/Region Tax NumberArgentina NIP number or CM numberBelgium VAT numberBrazil CPF numberBulgaria Legal persons: tax numberNatural persons: personal IDCroatia OIB number Czech Republic ICO numberFrance SIREN numberGreece AFM numberIndia TINItaly VAT numberKazakhstan BC (Beneficiary Code)Netherlands BSN numberNorway Organization registration numberRussia OKPO codeSlovakia ICO numberSouth Korea VAT registration numberSweden Organization registration numberSwitzerland VAT numberTaiwan Tax registration numberUkraine Legal persons: USREOU numberNatural persons: SRNP numberTurkey Tax numberUnited Kingdom NI numberUnited States Employer identification numberVenezuela NIT number - - - - - Specifies the tax number. - Enter the tax number that applies:Country Tax numberArgentina Withholding agent numberBrazil State tax numberBulgaria Social security numberMexico CURP numberKazakhstan BINNetherlands Tax registration number (Loonbelastingnummer) of the chain-liability vendorRussia KPP numberThailand Tax ID Ukraine VAT registration number - - - - - Specifies the tax number. - Enter the appropriate tax number:Country Tax NumberBrazil Municipal tax numberKazakhstan IINRussia OFK number (for public bodies only) - - - - - Kazakhstan - Specifies the certificate of registration as VAT payer in the following format: XXXXXYYYYYYYZZZZZZZZ, where: XXXXX is the certificate serial number, YYYYYYY is the certificate number and ZZZZZZZZ is the date of certificate issue. - - - - - The tax number of the vendor at the responsible tax authority. - - - - - - Taxes in Argentina: - The format and the check of tax number 1 depend on the two-digit tax number type.The tax number type is an identification type for tax in Argentina (for example, 80 for CUIT) and is used for the DGI tax report. - - - - - This indicator controls the process of proof of delivery during the incoming goods process for inbound deliveries. Processing is activating by switching on this indicator in the supplier master and by switching on the corresponding indicator in the delivery item category. - There are the following different characteristics:' ': not relevant for POD'A': generally relevant for POD'B': only relevant for POD if differences(Difference between notified quantity and actual quantity received) - - - - - Tax calculation for Brazil: - The IPI tax value is split up for this vendor. 50% of the calculated IPI tax value is posted as deductible input tax, 50% is deducted from the inventory posting or posting to expense account. - - - - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - - Block key (enqueue key) that is used to block an open item or an account to payment transactions. - You can use the block key as described below.Automatic Payment TransactionsIn automatic payment transactions, the block takes effect when it is entered in the system as follows:In the master recordIn the documentIf you enter the block in the master record then all open items for this account are contained in the exception list.The following block keys have a special meaning in the master record:The block key * has the effect that all items of the account are skipped in automatic payment transactions.The block key + has the effect that all items are skipped in which a payment method was not entered explicitly.The block key A is always set automatically when a down payment is entered. Therefore, you must not delete the block key A or use it for other purposes.Whether a block key can be set or removed in payment proposal processing depends on the attribute Changeable in payment proposal of the block key.Manual PaymentsManual payments are only affected by a block key in the document if you set the attribute Blocked for manual payments in the block key.A block key that was set in the master record does not have any effect on manual payments. You can have the system issue a warning message in that case. To do so, you have to make system settings. Set up message 671 of work area F5 in the configuration step Change Message Control, udter Finance -> Localization -> General Settings.Release for PaymentIf you want to use a block key for payment release in accounting, then you have to set the attribute Not Changeable for the block key. You make this setting in the configuration step Control Payment Block Reasons, under Finance -> Accounts Payable -> General Payment Settings. - - - - - Indicates that the account is blocked for posting in the specified company code. - If you set this indicator, the system prevents users from posting items to this account and issues an error message to inform them that the account is blocked. - - - - - Identification code for the accounting clerk. - The name of the accounting clerk defined by this identification code can be used in the payment program for correspondence and reporting (for example, open item lists). - - - - - - - Name or identification code of the accounting clerk at the vendor. - - - - - - - List of payment methods which may be used in automatic payment transactions with this customer/vendor if you do not specify a payment method in the item to be paid. - If you do specify a particular payment method in the item to be paid, this specification has priority over the specifications in the master record. You may also specify payment methods in the item which are not listed in the master record. - - - - - Key for defining payment terms composed of cash discount percentages and payment periods. - It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. - - - - - Indicates that during automatic payment transactions, clearing is made with the corresponding customer account, and that during manual clearing procedures, the items of that customer account are also selected. - To use this function in automatic payment transactions, you have toenter the customer account number in the vendor master record,enter the vendor account number in the customer master record, andselect the "Clearing with vendor" indicator in the customer master record.If this indicator is set, items belonging to the customer account will be included in any dunning run. - - - - - Indicates that payment transactions and dunning notices are created for the branch. - Normally automatic payment transactions and dunning notices are created for the head office.NoteSelect this indicator only if this account is a head office account. - - - - - If this indicator is set, every customer/vendor open item is paid separately during automatic payment transactions. This means that open items are not grouped together for payment. - - - - - - This indicator specifies that the customer/vendor should be sent all payment advice information by EDI. - - - - - - All bank data is determined using this key. - - - - - - Number of days which usually pass until the vendor has cashed your check. - During automatic payment transactions, the system calculates the value date for check payments using this information and stores the date in the line item. The date is calculated as follows:Value date = posting date + check cashing timeIn Cash Management, the value date is used as information about the expected cash outflow. - - - - - Currency key for amounts in the system. - - - - - - Maximum amount which may be issued on a bill of exchange if it is to be used in payment transactions with the business partner. - The amount limit is taken into consideration in automatic payment transactions for payments by bill of exchange and bill of exchange payment requests. Several bill of exchange forms are created if the amount to be settled is higher than the maximum amount given here. Each of these bills of exchange is issued for the maximum amount or for a smaller amount.Amount limits for bills of exchange are used in Spain, for example. - - - - - This field contains the account number the company is listed under at the vendor. - - - - - - The reconciliation account in G/L accounting is the account which is updated parallel to the subledger account for normal postings (for example, invoice or payment). - For special postings (for example, down payment or bill of exchange), this account is replaced by another account (for example, 'down payments received' instead of 'receivables').The replacement takes place due to the special G/L indicator which you must specify for these types of postings. - - - - - You enter an interest indicator here if you want the business partner to be included in automatic interest calculation. - - - - - - The date in this field displays the last time the interest calculation program processed this account. This is generally the upper limit of the last interest run. - Generally, this date is automatically maintained by the program (batch input). A manual entry in this field should only be made if an error has occurred or when implementing the interest calculation. - - - - - An entry in this field determines the intervals (in months) at which interest is to be calculated automatically for this account (account balance interest calculation). The interest calculation frequency is added to the date of the last interest calculation. - Date of last interest calculation: 3/31.+ 01 month interest calculation frequency= 4/30 upper limit for the current interest runThe calculation period specified as a report parameter determines whether an account is included in an interest run.The upper limit of the interest run is calculated as in the above example and compared with the upper limit of the calculation entered in the interest run (report parameter). If the calculated upper limit is after the calculation period, the account is not included in interest calculation.If you maintain the interest calculation frequency in the account master record, this entry is used to calculate the upper limit. If not, the interest calculation frequency entered for the interest indicator is used. - - - - - This field contains the account number of the master record for the head office account. - You specify this account number only for branch accounts. Items that you post using the branch account number are automatically posted to the head office account. The system records the branch account number in the line items.Neither transactions nor balances are kept in the branch account. - - - - - The account number of the vendor with whom automatic payment transactions are to be carried out. - The field is only needed if payments are not to be made directly to the vendor to whom the payable is owed. The same applies to bank collections of receivables.The specification in this field applies only to the company code. There is a further field in which you can enter an alternative payee for each company code. If both fields are filled, the company code specified has priority. - - - - - Indicates the layout rule for the Allocation field in the document line item. - The system uses a standard sort sequence for displaying line items. Among other things, it sorts the items according to the content of the Allocation field. This field can be filled either manually or automatically (by the system) when a document line item is entered.For this purpose, the system requires rules that determine which information is to be taken from the document header or from the document line item and placed in the field. The rules can be stored in the master record of an account which enables you to determine the standard sort sequence on an account-specific basis.NoteField information from another document line item cannot be adopted into the field of a particular item. - - - - - Contains settings that control how the system handles differences between the invoice amount and the amount received from a customer or the amount paid to a supplier. A tolerance group is unique within a company code. - - - - - - US government requirement. - Date field in which to enter certification date for small companies run by women or minorities. This certificate must be renewed every two years. - - - - - Internal memo of the accounting department. - The memo serves only as information on special features of the customer/vendor. - - - - - In some countries, an additional country is needed for calculating or reporting withholding tax. - The calculation can depend on the payee's country.A particular country key can be required by law for reporting which may possibly be different to the key used in the address.Examples: Japan, USA (1042), Argentina - - - - - Indicates that the company code data in this master record is to be deleted. - To delete this data, you have to run the archiving program for Accounts Receivable or Payable. This program will archive all master records marked for deletion provided that there is no dependent data in them.This deletion flag cannot be used in the program that deletes master data. You should, however, run this program only to delete test data prior to production startup. - - - - - In cash management, customers and vendors are allocated to planning groups by means of an entry made in the master record. - You can define these planning groups in Customizing or the Implementation Guide (you will need to ensure that they are all the same length). In order to improve the liquidity forecast display for major customers and vendors, it can be advisable to enter their account number as the planning group.For the planning groups themselves a naming convention should be set up to improve liquidity forecasting. In the following examples, the customer planning groups begin with an "R" for receipts, and the vendor planning groups begin with an "E" for expenses.R1 Customers paying by bank collectionR2 Other domestic customersR3 Customers abroadR4 Affiliated company customersR5 High risk customersR6 Major customersR7 Rental incomeR8 Repayment of loans...E1 Domestic vendorsE2 Vendors abroadE3 Affiliated company vendorsE4 Major vendorsE5 Personnel costsE6 TaxesE7 Investments... - - - - - When incoming invoices are entered or when memos are entered in Financial Accounting (FI), the system checks whether an invoice or credit memo has already been entered for the same date. - Checking Logistics DocumentsThe system checks whether the invoice documents have already been entered in the Logistics invoice verification. For this, the system checks invoices that have been held or parked or that contain errors, or invoices that were entered for invoice verification in the background. The check is performed only if you specify the reference document number when you enter the invoices.When checking for duplicate invoices, the system compares the following specified characteristics:VendorCurrencyCompany CodeGross Invoice AmountReference Document NumberInvoice Document DateIf all of these characteristics are the same, the system issues a message for which you can change the message type in Customizing.When you enter credit memos or subsequent adjustments, the system does not check for duplicate invoices.Exception: For Argentina, invoices and credit memos are checked for duplicates.No message is issued if you enter a document that has previously been reversed.In Customizing for Logistics Invoice Verification under Incoming Invoice -> Set Check for Duplicate Invoices, you can specify that the following characteristics are not checked:Reference Document NumberInvoice Document DateCompany CodeHaving fewer attributes to check increases the likelihood that the system will find a duplicate invoice.Example:The following document has already been entered and posted:Reference Document Number 333Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: ChicagoYou have set up the check for duplicate invoices as follows in Customizing:The characteristics Reference Document Number and Company Code are not activated. Consequently, these characteristics are not checked.Now you enter the following invoice:Reference Document Number 334Invoice Date: 4/28/2000Gross Invoice Amount 100.00Currency: EURVendor: SpencerCompany Code: FlagstaffResultBecause you entered a reference document when you entered the invoice, the system checks for duplicate invoices. Compared against the invoice entered earlier, the invoice just entered has different values in the characteristics Reference and Company Code. However, these characteristics are not checked due to the settings that you have made in Customizing. All other characteristics are the same. The system issues a message telling you that an invoice has been entered twice.If the characteristic "Reference Document Number" had been selected in Customizing, the system would have checked the reference document number and established that it was different from the invoice entered earlier, and it consequently would not have issued a message.Checking FI DocumentsThe system checks whether there are FI documents that were posted or parked with the Logistics invoice verification or with an FI invoice transaction. Depending on the entry in the Reference field, one of the following checks is performed:If a reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateReference NumberIf no reference number was specified in the sequential invoice/credit memo, the system checks whether an invoice/credit memo has already been posted for which all the following attributes agree:Company CodeVendorCurrencyDocument DateAmount in Document CurrencyIn Materials Management, the system applies the check for duplicate invoices for invoices only, not for credit memos. - - - - - - The account group is a classifying feature within vendor master records. The account group determines: - the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. - - - - - - - - - - - - - - - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - The dunning area represents an organizational entity that is responsible for dunning. The dunning areas represent a sub-structure of the company codes. - If different responsibilities or different dunning procedures exist within a company code, you can set up corresponding dunning areas.All dunning notices are made separately according to dunning areas, and if necessary with different dunning procedures.The dunning area must be noted in the line items. As long as documents are copied from preliminary work areas (billing documents), the dunning area can be derived from details such as division or sales area, if necessary. - - - - - Key which reflects the reason for a dunning block indicator. - - - - - - Number that specifies how often an item or account has been dunned. - The business partner has received the dunning level from the last dunning run.If you use dunning areas, it is the dunning level that the business partner received from the last dunning run in the dunning area assigned.The dunning program sets the dunning level automatically when the customer or vendor receives a dunning notice. - - - - - This field contains the key for the dunning procedure to be used. - - - - - - Account number of the vendor who is to receive the dunning notice. - Note:If an entry is not made in this field, the dunning notice is sent to the address of the vendor to be processed. - - - - - Date on which the last dunning notice was made. - - - - - - Date on which a legal dunning procedure was initiated. - The printing of dunning notices in the legal dunning procedure generates an internal notice about any further account movements. A dunning notice is not created for the customer.If the Legal dunning procedure field in the master record contains a date, this means that the account is involved in a legal dunning procedure. The relationship between this date and the dunning date does not affect how the account is processed.The printing of account movements in the legal dunning procedure differs from the normal printing of dunning notices as follows:You must specify a separate form for your dunning procedure in Customizing. For more information, see Customizing (IMG) under Dunning Forms.The dunning program also displays text element 520 "Legal dunning procedure". This makes it possible to display the date of the legal dunning procedure from the master record.The program also displays the documents blocked for dunning and those with a payment method (automatic debit, bank direct debit).Although dunning notices are printed, the dunning level does not change in the master record or in the items. New dunning level = old dunning level.The program only updates the date of the last dunning run.Enter the date manually. - - - - - Identification code for the accounting clerk dealing with dunning letters. - Using this identification code, the accounting clerk whose name is printed on the dunning letters is determined.If this field is not filled, then the entry from the Accounting clerk field is used. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - The account group is a classifying feature within vendor master records. The account group determines: - the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. - - - - - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - Denotes the purchasing organization. - - - - - - Subdivision of a supplier's overall product range according to various criteria. - For each supplier sub-range:The master data is kept on a common basisCertain conditions applyIn the supplier master, you can create different purchasing data and different partner functions for each supplier sub-range.You can also maintain and change the conditions for each supplier sub-range. You assign a material to a supplier sub-range in the info record.In the supplier master, you can maintain different data for particular supplier sub-ranges, such as ordering addresses or terms of payment, for example.When creating a purchase order with a known supplier, different data is only determined if the supplier sub-range is entered in the initial screen.Your supplier Smith in Houston has two sub-ranges: paint and glue.All materials from the "paint" sub-range are ordered in Houston.You have maintained an alternative ordering address in Detroit for the "glue" sub-range.If you order materials from the "glue" sub-range, the supplier sub-range finds the Detroit ordering address. - - - - - Key uniquely identifying a plant. - - - - - - The abbreviated form of the name that identifies the partner function. - - - - - - The sequential number that the system applies when there is more than one partner for a particular partner function. - When you create a sales order for a particular customer, there may be more than one ship-to party defined. The different ship-to parties are numbered sequentially. - - - - - Specifies a partner as the default for a particular partner function. - When you enter more than one partner for a particular partner function (for example, you define three different ship-to parties), you can select one partner as the default. During sales or purchasing processing, if you have defined multiple partners for a partner function, the system prompts you to choose just one partner. The system presents the default partner as the first choice in the pop-up window. - - - - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - - - - - - - Alphanumeric key uniquely identifying the document. - With the supplier number, information from the supplier master record (such as the supplier's address and bank details) is copied into a purchasing document (such as a request for quotation or a purchase order).You can use the supplier number to keep track of requests for quotation, purchase orders and outline agreements. - - - - - Denotes the purchasing organization. - - - - - - Determines which calculation schema (pricing procedure) is to be used in purchasing documents containing this supplier number. - You can use the schema group to specify the calculation schema per purchasing organization or supplier. The relevant calculation schema is determined by reference to the schema group.The effect of this is that the conditions to be maintained in a purchasing document can differ depending on the relevant purchasing organization or supplier.If a calculation schema is only to be valid for certain purchasing organizations or suppliers, proceed as follows:Define the schema group for the purchasing organization or the supplier using the relevant function in the menu "Calculation schema -> Schema groups".Assign the schema group to the calculation schema via "Calculation schema -> Determine schema".Enter the schema group for the supplier in the supplier master records to which the calculation schema is to be assigned. Assign the schema group of the purchasing organization to the relevant purchasing organization using "Calculation schema -> Schema group -> Assign to purch. org.". - - - - - Indicates whether or not the supplier master record is earmarked for deletion. - - - - - - Commonly used trading terms that comply with the standards established by the International Chamber of Commerce (ICC). - Incoterms specify internationally recognized procedures that the shipper and the receiving party must follow for the shipping transaction to be completed successfully.If goods are shipped through a port of departure, the appropriate Incoterm might be: FOB ("Free On Board"). You can provide further details (for example, the name of the port) in the secondary Incoterm field: FOB Boston, for example. - - - - - Additional information for the primary Incoterm. - If the primary Incoterm is, for example, FOB ("Free on Board"), then the second field provides details of the port from which the delivery leaves (for example, "FOB Boston"). - - - - - An incoterms version is an edition containing a list of international terms for transportation that is defined by the International Chamber of Commerce (ICC). - - - - - - Provides additional information for the primary Incoterm. For Incoterms 2010, this field represents: - 1. For sea and inland waterway transport - Port of Shipment2. For any mode of transport - Place of Delivery 2010Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 1 EXW Ex Works Place of DeliveryFCA Free Carrier Place of DeliveryCPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationDAF Delivered at Frontier Place of DeliveryDDP Delivered Duty Paid Place of DestinationDDU Delivered Duty Unpaid Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 1 FAS Free Alongside Ship Port of ShipmentFOB Free On Board Port of ShipmentCFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of DestinationDEQ Delivered Eq Quay (Duty Paid) Port of DestinationDES Delivered Ex Ship Port of DestinationIf the primary incoterm is specified as FOB “Free on Board”, the second field provides details of the port from which the delivery leaves, such as FOB Boston. - - - - - Provides additional information for the Incoterms. This field is only available for C-Clauses (if customized appropriately). Note the following for the incoterms versions below: - No Version:This field is disabledIncoterm Version 2000This field is disabled as part of standard delivery unless a customer decides to enable it by the way of Customizing for Sales and Distribution under Master Data -> Business Partners -> Customers -> Billing Document -> Incoterms -> Map Incoterms to Versions.Incoterm Version 2010For this version, the field represents:Sea and inland waterway transport - Port of DestinationAny mode of transport - Place of Destination2010 Incoterms are divided as follows:Group 1: Rules for any mode or modes of transport (including by vessel)Incoterms Incoterms Description Location 2CPT Carriage Paid To Place of DestinationCIP Carriage & Insurance Paid To Place of DestinationGroup 2: Rules for sea and inland waterwaysIncoterms Incoterms Description Location 2CFR Cost & Freight Port of DestinationCIF Cost Insurance & Freight Port of Destination - - - - - Indicator specifying that provision has been made for goods-receipt-based invoice verification for a purchase order item or invoice item. - - - - - - Number of calendar days needed to obtain the material or service if it is procured externally. - If you have different vendors for a material, you must specify an average value. The same applies if you order the material from a fixed vendor that has varying delivery times.If you use the SAP Retail System, the planned delivery time can be suggested from the vendor sub-range in the vendor master record. - - - - - Minimum value specified for purchase orders issued to the relevant supplier. - - - - - - Key for defining payment terms composed of cash discount percentages and payment periods. - It is used in sales orders, purchase orders, and invoices. Terms of payment provide information for:Cash managementDunning proceduresPayment transactionsData can be entered in the field for the terms of payment key in various ways as you enter a business transaction:In most business transactions, the system defaults the key specified in the master record of the customer/vendor in question.In some transactions (for example, credit memos), however, the system does not default the key from the master record. Despite this, you can use the key from the customer/vendor master record by entering "*" in the field.Regardless of whether or not a key is defaulted from the master record, you can manually enter a key during document entry at:item level in sales ordersheader level in purchase orders and invoicesMaster records have separate areas for Financial Accounting, Sales, and Purchasing. You can specify different terms of payment keys in each of these areas. When you then enter a business transaction, the application in question will use the key specified in its area of the master record. - - - - - Determines which date is to be used for price determination (pricing) purposes. - Enter the key for the desired date.If you choose the date of goods receipt, for example, a new price will be determined upon the arrival of the goods, causing the item to be revaluated at this time.NoteIf you have chosen the delivery date as the date for price determination and an item contains several delivery dates (i.e. has a delivery schedule), the first delivery date (the delivery date specified in the first schedule line) is taken. - - - - - Allows you to automatically generate purchase orders from purchase requisitions if the requisition has been assigned to a supplier (source of supply). - If you want to use automatic conversion, note the following additional conditions:In the case of purchase requisitions for materials, you should also select the indicator Autom.purch.ord. in the Purchasing view in the material master record.In the case of purchase requisitions for services, you should also select the indicator Automatic creation of POs for service PReqs in Customizing for Services by choosing:IMG -> MM -> External Services Management -> Source Determination and Default Values- for Client or- for Purchasing Organization - - - - - Key for the currency on which an order placed with a supplier is based. - - - - - - Key for a buyer or a group of buyers, who is/are responsible for certain purchasing activities. - Internally, the purchasing group is responsible for the procurement of a material or a class of materials.Externally, it is the medium through which contacts with the vendor are maintained. - - - - - Indicates whether or not the supplier master record is blocked for the purchasing organization for posting purposes. - - - - - - General shipping strategy for the delivery of goods from the vendor to the customer. - You can define shipping conditions in your system which correspond to the requirements of your company. You can specify a shipping condition in the customer master and in the vendor master.Shipping point determination (outbound delivery):The loading group, the plant and the shipping condition determine the shipping point that will be proposed by the system.Route determination (outbound delivery):Apart from the country and the geographical region of the shipping point, the ship-to party and the transportation group, the shipping condition determines the route that the system proposes in the order for the delivery of the goods. In the delivery, the route proposal also takes the weight group into account.A particular customer always requires immediate delivery. You enter the appropriate shipping condition into the customer master record. This means that when you process orders for this customer, the system automatically proposes the express mail room as a shipping point and the quickest way to the airport as a route.If a shipping condition has been assigned to a sales document type in Customizing, this condition will be proposed by the system in the corresponding sales document. If there is no assignment, the system copies the relevant data from the corresponding customer master record of the sold-to party. You cannot change this value during delivery processing. The shipping condition will not be copied from the delivery into the shipment. The shipping condition is one of several criteria for selecting deliveries when you create a shipment. You can enter a shipping condition manually in the shipment where it only serves as a characteristic for grouping shipments. - - - - - Means of classifying suppliers according to their significance to your company. - The indicator serves to assign the supplier to one of the categories A, B or C, in accordance with ABC analysis.'A' category suppliers, for instance, are those accounting for the greatest share of the company's total annual spend (in value terms). - - - - - This telephone number is maintained in the supplier master record and adopted in the purchasing document. - - - - - - The name of a contact on the supplier side can be freely maintained. - There is no relation to any other data in the system, for examplebusiness partner. - - - - - Determines which confirmation categories are expected for a PO item (e.g. order acknowledgment, shipping notification). - - - - - - Determines whether the purchasing document (purchase order, outline purchase agreement, etc.) is to be acknowledged by the supplier. - - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - The account group is a classifying feature within vendor master records. The account group determines: - the number interval for the account number of the vendor,whether the number is assigned by the user or by the system,which specifications are necessary and/or possible in the master record. - - - - - - - - - - - - - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The language key is an abbreviation for the language of the object being processed (for example, standard text, form, style). - - - - - - The text ID defines the various types of texts related to a text object. For example, the object "TEXT" (standard texts) can have the following text IDs: - ST for user-specific standard texts (individual texts)SYST for cross-application system textsvarious IDs for specific application departments. You must have the appropriate access authorization in order to access these texts. - - - - - - - - - - - - - Specifies an alphanumeric key that uniquely identifies the supplier in the SAP system. - - - - - - The company code is an organizational unit within financial accounting. - - - - - - This indicator is used to classify the different types of withholding tax. - Withholding tax types classify particular features of a withholding tax including:The time at which the withholding tax is postedThe basis on which the base amount is calculatedThe basis for accumulation (if applicable)Withholding tax types are to be distinguished from withholding tax codes, to which are allocated the withholding tax percentage rate example.Whether a withholding tax can be defined as an existing type by means of a new code, or if a new type needs to be defined will depend on the type of transaction (see below).Note that a business transaction can only be assigned one withholding tax code per withholding tax type. If the business transaction is subject to several withholding taxes simultaneously, these must be represented by different types.This is the case in Argentina for example, where up to four kinds of withholding tax per business transaction are possible. - - - - - Date from which withholding tax exemption applies. - - - - - - Date on which withholding tax exemption expires. - - - - - - Indicator used to classify different types of exemption from liability to a particular withholding tax. - These indicators can be defined per withholding tax type in the vendor master record. - - - - - - The type of recipient can be defined in the vendor master record. - It is used to group vendors together according to particular characteristics such as occupations that may be subject to the same withholding tax type, but which are required to pay different percentage rates (as defined by the withholding tax code).Application in ThailandThis corresponds to the official Thai form number (Phaw.Ngor.Daw) and is used to determine the sequential numbering of a withholding tax certificate. The form number is defined in the vendor master record. - - - - - Numbered assigned by the relevant authorities for exemption from withholding tax. - This number must be entered in the system as follows:In the vendor master record in the case of vendorsFor customers, in Customizing under the settings for withholding tax information for the company code per withholding tax type. - - - - - One or more "withholding tax codes" are assigned to each withholding tax type. One of the things these codes determine is the various percentage rates for the withholding tax type. - Note that when processing a business transaction, no more than one withholding tax code can be assigned per withholding tax type. If the business transaction is subject to more than one withholding taxes, these must be represented in the system by defining various withholding tax types. - - - - - Rate of exemption from withholding tax. - Those persons/activities subject to withholding tax can be exempted from withholding tax up to the percentage rate you enter here. This exemption rate refers to the withholding tax amount itself and not to the whole amount liable to withholding tax (withholding tax base amount).The gross amount of an invoice is 100.00 and the withholding tax base amount is defined as gross. The withholding tax rate is 10% meaning that the withholding tax amount is 10.00. Given an exemption rate of 30%, the withholding tax amount is reduced to 7.00. - - - - - This is a number issued by the tax authorities per withholding tax type. - This number must be specified in Customizing either:(a) As part of the withholding tax information defined for the company code, or(b) As part of the withholding tax information defined in the customer or vendor master record. - - - - - The authorization group allows extended authorization protection for particular objects. The authorization groups are freely definable. The authorization groups usually occur in authorization objects together with an activity. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - aggregate - groupby - filter - - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - LongText - - - - - - - - - LongText - LongText - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv b/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv deleted file mode 100644 index 8a0e4b4a..00000000 --- a/notes/srv/external/data/API_BUSINESS_PARTNER-A_BusinessPartner.csv +++ /dev/null @@ -1,3 +0,0 @@ -BusinessPartner;BusinessPartnerFullName;BusinessPartnerType -11;Alice Wonder;CUSTOMER; -9980000082;Hugo Hollandaise;CUSTOMER \ No newline at end of file diff --git a/notes/srv/notes-service.cds b/notes/srv/notes-service.cds deleted file mode 100644 index 80e1a14b..00000000 --- a/notes/srv/notes-service.cds +++ /dev/null @@ -1,13 +0,0 @@ -using sap.capire.notes from '../db/data-model'; -using { Suppliers as MashupSuppliers } from '../db/mashup'; -using { API_BUSINESS_PARTNER as BusinessPartner } from './external/API_BUSINESS_PARTNER.csn'; - -/** - * Notes Service - * - * Maintain notes for suppliers - */ -service NotesService { - entity Notes as projection on notes.Notes; - entity Suppliers as projection on MashupSuppliers; -} \ No newline at end of file diff --git a/notes/srv/notes-service.js b/notes/srv/notes-service.js deleted file mode 100644 index 3930af7c..00000000 --- a/notes/srv/notes-service.js +++ /dev/null @@ -1,75 +0,0 @@ -const cds = require("@sap/cds"); - -const RemoteHandler = require('./RemoteHandler'); - -const s4apiKey = process.env.S4_APIKEY; -if (!s4apiKey && cds.env.profiles.indexOf("sandbox") >= 0) { - console.error( - "[ERROR] Provide API Key in env var S4_APIKEY for S/4 Sandbox: https://api.sap.com/api/API_BUSINESS_PARTNER/resource -> Show API Key" - ); - process.exit(1); -} - -module.exports = cds.service.impl(async function () { - const { Notes, Suppliers } = this.entities; - - const bpService = await cds.connect.to("API_BUSINESS_PARTNER"); - - // TODO: This seems to be a bug in the compiler - RemoteHandler.columnNameFixes = { ["NotesService.Suppliers.BusinessPartner"]: "ID" }; - - // REVISIT: This is a workaround for the missing capability to add headers to the service - const bpServiceDelegate = { - run: query => bpService.send({ query, headers: { APIKey: s4apiKey } }) - }; - - const remoteHandler = new RemoteHandler(this, { [Suppliers.name]: bpServiceDelegate }); - - this.on("READ", Suppliers, (req, next) => remoteHandler.handle(req, next) ); - this.on("READ", Notes, (req, next) => remoteHandler.handle(req, next) ); - - - /* - // Suppliers?$expand=notes - this.on("READ", Suppliers, async (req, next) => { - const expandIndex = req.query.SELECT.columns.findIndex( - ({ expand, ref }) => expand && ref[0] === "notes" - ); - if (expandIndex < 0) return next(); - - req.query.SELECT.columns.splice(expandIndex, 1); - if (!req.query.SELECT.columns.find( - column => column.ref.find((ref) => ref == "ID")) - ) - req.query.SELECT.columns.push({ ref: ["ID"] }); - - const suppliers = await next(); - - // Request all associated notes - const supplierIds = suppliers.map((supplier) => supplier.ID); - const notes = await this.run(SELECT.from(Notes).where({ supplier_ID: supplierIds })); - - // Convert in a map for easier lookup - const notesForSuppliers = {}; - for (const note of notes) { - if (!notesForSuppliers[note.supplier_ID]) notesForSuppliers[note.supplier_ID] = []; - notesForSuppliers[note.supplier_ID].push(note); - } - - // Add notes to result - for (const supplier of suppliers) { - const notesForSupplier = notesForSuppliers[supplier.ID]; - if (notesForSupplier) supplier.notes = notesForSupplier; - } - - return suppliers; - }); - - - this.on("READ", Suppliers, async req => { - return bpServiceDelegate.run(req.query); - }); - - */ - -}); diff --git a/package.json b/package.json index f97ae344..2d034090 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "@capire/media": "./media", "@capire/orders": "./orders", "@capire/reviews": "./reviews", - "@capire/suppliers": "./suppliers", - "@capire/notes": "./notes" + "@capire/suppliers": "./suppliers" }, "devDependencies": { "chai": "^4.2.0", From d9d7203e4957b3c62b803ee91e320d67c2b2991c Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:47:28 +0200 Subject: [PATCH 072/100] Fix unintended diffs --- package.json | 1 - samples.md | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d034090..6a8fdc91 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ }, "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules", - "fix-antlr": "sed -i -e 's/INVALID_ALT_NUMBER = require.*/INVALID_ALT_NUMBER = 0/' node_modules/antlr4/tree/Trees.js node_modules/antlr4/RuleContext.js", "registry": "node .registry/server.js", "bookshop": "cds watch bookshop", "fiori": "cds watch fiori", diff --git a/samples.md b/samples.md index b5af7c96..f68ce257 100644 --- a/samples.md +++ b/samples.md @@ -62,6 +62,8 @@ Each sub directory essentially is an individual npm package arranged in an [all- - A [composite app, reusing and combining](https://cap.cloud.sap/docs/guides/verticalize) these packages: - [@capire/bookshop](bookshop) - [@capire/common](common) + - [@capire/orders](orders) + - [@capire/reviews](reviews) - [@capire/suppliers](suppliers) - [Adds an SAP Fiori elements application](https://cap.cloud.sap/docs/guides/fiori/) to bookshop, thereby introducing to: - [OData Annotations](https://cap.cloud.sap/docs/guides/fiori#adding-odata-annotations) in `.cds` files From c8c10b7c8abde3a0f176788e1e5b5fc8a7df6b68 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 4 Jun 2021 11:34:52 +0200 Subject: [PATCH 073/100] cds.events test --- test/cds.events.test.js | 22 ++++++++++++++++++++++ test/events.cds | 6 ++++++ 2 files changed, 28 insertions(+) create mode 100644 test/cds.events.test.js create mode 100644 test/events.cds diff --git a/test/cds.events.test.js b/test/cds.events.test.js new file mode 100644 index 00000000..1ebe576c --- /dev/null +++ b/test/cds.events.test.js @@ -0,0 +1,22 @@ +const cds = require ('@sap/cds/lib') +const { expect } = cds.test.in (__dirname) + +describe('cds.events tests', ()=>{ + + let m; before (async ()=> m = await cds.load('events.cds')) + + it ('should have the model loaded', ()=>{ + expect(m.definitions).to.have.property('Sue.Foo') + }) + + it ('should compile the model to edmx', ()=>{ + const edmx = cds.compile(m).to.edmx({service:'Sue'}) + expect(edmx).to.match(//) + }) + + it ('should compile the model to sql', ()=>{ + const sql = cds.compile(m).to.sql().join(';\n') + expect(sql).not.to.match(/CREATE TABLE Sue_Foo/) + expect(sql).to.match(/CREATE TABLE Sue_Bar/) + }) +}) diff --git a/test/events.cds b/test/events.cds new file mode 100644 index 00000000..2eae34aa --- /dev/null +++ b/test/events.cds @@ -0,0 +1,6 @@ +service Sue { + @cds.persistence.skip + entity Foo { key ID:Integer; title:String; status:String(1); } + entity Bar { key ID:Integer; foo: Association to Foo } + event Foo.changed : projection on Foo { ID, status } +} From 80302a0a3dc1cec085685be20f222cc0d2fd55d5 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:50:30 +0200 Subject: [PATCH 074/100] Remove notes test --- test/notes.test.js | 275 --------------------------------------------- 1 file changed, 275 deletions(-) delete mode 100644 test/notes.test.js diff --git a/test/notes.test.js b/test/notes.test.js deleted file mode 100644 index e522fd73..00000000 --- a/test/notes.test.js +++ /dev/null @@ -1,275 +0,0 @@ -const cds = require("@sap/cds/lib"); -const express = require("express"); -if (cds.User.default) cds.User.default = cds.User.Privileged; -// hard core monkey patch -else cds.User = cds.User.Privileged; // hard core monkey patch for older cds releases - -// TODO: remove hack -process.env.S4_APIKEY = "-"; - -const envelope = (entity, value) => { - const result = {"@odata.context": entity.match(/\$metadata/) ? entity : `$metadata#${entity}`}; - - if (Array.isArray(value)) { - result.value = value; - } else { - Object.assign(result, value); - } - return result; -} - -const BPs = [ - { - BusinessPartner: "11", - BusinessPartnerFullName: "Alice Wonder", - BusinessPartnerType: "CUSTOMER", - }, - { - BusinessPartner: "9980000082", - BusinessPartnerFullName: "Hugo Hollandaise", - BusinessPartnerType: "CUSTOMER", - }, -]; - -const Suppliers = [ - { - ID: "11", - fullName: "Alice Wonder", - customerType: "CUSTOMER", - }, - { - ID: "9980000082", - fullName: "Hugo Hollandaise", - customerType: "CUSTOMER", - }, - ]; - -const SuppliersExpandNotes = [ - { - ID: "11", - fullName: "Alice Wonder", - customerType: "CUSTOMER", - notes: [ - { - ID: "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", - note: "note2 for 11", - supplier_ID: "11", - }, - { - ID: "D632D4EE-E772-454A-913E-26A7B8DAA7FB", - note: "note1 for 11", - supplier_ID: "11", - }, - ], - }, - { - ID: "9980000082", - fullName: "Hugo Hollandaise", - customerType: "CUSTOMER", - notes: [ - { - ID: "24B58115-E394-423B-BEAB-53419A32B927", - note: "note3", - supplier_ID: "9980000082", - }, - ], - }, - ]; - -const NotesExpandSuppliers = [ - { - "ID": "24B58115-E394-423B-BEAB-53419A32B927", - "note": "note3", - "supplier_ID": "9980000082", - "supplier": { - "ID": "9980000082", - "fullName": "Hugo Hollandaise", - "customerType": "CUSTOMER" - } - }, - { - "ID": "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", - "note": "note2 for 11", - "supplier_ID": "11", - "supplier": { - "ID": "11", - "fullName": "Alice Wonder", - "customerType": "CUSTOMER" - } - }, - { - "ID": "D632D4EE-E772-454A-913E-26A7B8DAA7FB", - "note": "note1 for 11", - "supplier_ID": "11", - "supplier": { - "ID": "11", - "fullName": "Alice Wonder", - "customerType": "CUSTOMER" - } - } - ]; - -const BPMock = { - url: /.*/, - data: BPs -}; - -const BP11Mock = { - url: /\/A_BusinessPartner\?.*\$filter=BusinessPartner%20eq%20%2711%27/, - data: [ BPs[0] ] -}; - -class MockServer { - async start() { - const http = require('http'); - - this.app = express(); - this.server = http.createServer(this.app).listen(); - this.app.set('port', this.server.address().port); - this.mocks = []; - - this.app.get("*", (req, res) => { - const mock = this.mocks.shift(); - if (!mock || !req.url.match(mock.url)) { - res.writeHead(404); - res.end(); - return; - } - - res.writeHead(200); - res.end(JSON.stringify(mock.data)); - }); - } - - reset() { - this.mocks = []; - } - - add(mock) { - this.mocks.push(mock); - } - - url() { - return `http://localhost:${this.server.address().port}`; - } - - close() { - this.server.close(); - } -} - -if (!global.beforeAll) global.beforeAll = global.before; - -describe("Notes", () => { - const mockServer = new MockServer(); - - beforeAll( async () => { - mockServer.start(); - - // TODO: Need better solution. Does it conflict with other tests? - cds.env.add({ - requires: { - API_BUSINESS_PARTNER: { - kind: "odata", - model: "srv/external/API_BUSINESS_PARTNER", - credentials: { - url: mockServer.url() - }, - }, - }, - }); - - }); - - beforeEach( () => { - mockServer.reset(); - }); - - const { expect, GET, PATCH } = require(".").run( - "serve", - "--project", - "notes", - "--with-mocks", - "--in-memory" - ); - - - it("get notes", async () => { - const { status, data } = await GET("/notes/Notes"); - - expect({ status, data }).to.containSubset({ - status: 200, - data: { - "@odata.context": "$metadata#Notes", - value: [ - { - ID: "24B58115-E394-423B-BEAB-53419A32B927", - note: "note3", - supplier_ID: "9980000082", - }, - { - ID: "545A3CF9-84CF-46C8-93DC-E29F0F2BC6BE", - note: "note2 for 11", - supplier_ID: "11", - }, - { - ID: "D632D4EE-E772-454A-913E-26A7B8DAA7FB", - note: "note1 for 11", - supplier_ID: "11", - }, - ], - }, - }); - }); - - it("get remote suppliers", async () => { - mockServer.add(BPMock); - const { status, data } = await GET("/notes/Suppliers"); - - expect({ status, data }).to.containSubset({ - status: 200, - data: envelope("Suppliers", Suppliers) - }); - }); - - it("get remote suppliers with notes", async () => { - mockServer.add(BPMock); - const { status, data } = await GET("/notes/Suppliers?$expand=notes"); - - expect({ status, data }).to.containSubset({ - status: 200, - data: envelope('Suppliers(notes())', SuppliersExpandNotes), - }); - }); - - it("get notes via navigation", async () => { - mockServer.add(BPMock); - const { status, data } = await GET("/notes/Suppliers('11')/notes"); - - expect({ status, data }).to.containSubset({ - status: 200, - data: envelope('../$metadata#Notes', SuppliersExpandNotes[0].notes) - }); - }); - - it("get notes with suppliers", async () => { - mockServer.add(BPMock); - const { status, data } = await GET("/notes/Notes?$expand=supplier"); - - expect({ status, data }).to.containSubset({ - status: 200, - data: envelope('Notes(supplier())', NotesExpandSuppliers) - }); - }); - - it("get supplier via navigation", async () => { - mockServer.add(BP11Mock); - const { status, data } = await GET(`/notes/Notes(${ NotesExpandSuppliers[1].ID })/supplier`); - expect({ status, data }).to.containSubset({ - status: 200, - data: envelope("../$metadata#Suppliers/$entity", NotesExpandSuppliers[1].supplier ) - }); - }); - - afterAll(() => mockServer.close()); -}); From 11c54b29d0557d34ec4eebde58343242c38ef3d3 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 07:51:51 +0200 Subject: [PATCH 075/100] Fix minor diffs --- fiori/.env | 2 +- fiori/package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fiori/.env b/fiori/.env index 36644fa6..8c601148 100644 --- a/fiori/.env +++ b/fiori/.env @@ -1,2 +1,2 @@ -# cds.requires.messaging.kind = file-based-messaging +cds.requires.messaging.kind = file-based-messaging PORT = 4004 \ No newline at end of file diff --git a/fiori/package.json b/fiori/package.json index 43a41485..76f51da1 100644 --- a/fiori/package.json +++ b/fiori/package.json @@ -20,13 +20,13 @@ "deploy-format": "hdbtable" }, "requires": { - "auth": { - "strategy": "dummy" - }, "API_BUSINESS_PARTNER": { "kind": "odata", "model": "@capire/suppliers" }, + "auth": { + "strategy": "dummy" + }, "ReviewsService": { "kind": "odata", "model": "@capire/reviews" From 649b9c8ca822d6601d9191185ec702b0d251a9d3 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 08:11:51 +0200 Subject: [PATCH 076/100] Test script added as requests --- README.md | 7 +++--- suppliers/requests.http | 56 +++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 42461ee1..ba71c072 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,12 @@ In case you've a question, find a bug, or otherwise need support, use our [commu Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE.txt) file. -# Suppliers - in progress for Service Consumption - +# Suppliers - in progress for Messaging & Service Consumption - ## TODOs -1. Fix problem with `await S4bupa.read (Suppliers).where('ID in',IDs)` --> Johannes -2. Fix issues when running in same process -3. Automated tests +1. Fix issues when running in same process +2. Automated tests ## Usage diff --git a/suppliers/requests.http b/suppliers/requests.http index 8913944c..48ca0c1f 100644 --- a/suppliers/requests.http +++ b/suppliers/requests.http @@ -1,49 +1,51 @@ -@server = http://localhost:4004 +@server = http://localhost:4006 @bpServer = http://localhost:5001 @authAlice = Authorization: Basic alice: -PATCH {{server}}/api-business-partner/A_BusinessPartner('ACME') -Content-Type: application/json - -{ - "BusinessPartnerFullName": "Alice Changed" -} - +### +### Replication on changed Business Partner ### -PATCH {{server}}/admin/Books(201) -{{authAlice}} -Content-Type: application/json +### 1. Check supplier name before update ("A Company Making Everything") -{ - "supplier_ID": "PNG" -} +GET {{server}}/admin/Books(299)?$expand=supplier +{{authAlice}} -### +### 2. Change Business Partner -> Triggers event that updates supplier replication -PATCH {{bpServer}}/api-business-partner/A_BusinessPartner('PNG') +PATCH {{bpServer}}/api-business-partner/A_BusinessPartner('ACME') Content-Type: application/json { - "BusinessPartnerFullName": "Penguin Books (Changed)" + "BusinessPartnerFullName": "A Company Making Everything *better*" } -### +### 3. Check supplier name after update ("A Company Making Everything *better*") -GET {{server}}/admin/Books?$top=11&$expand=supplier +GET {{server}}/admin/Books(299)?$expand=supplier {{authAlice}} -@S4bupa = http://localhost:4006/api-business-partner +### +### Replication on new assigned supplier +### -################################################# -# -# Suppliers Service (-> S/4) -# +### 1. No supplier is assigned to "Wuthering Heights" -PATCH {{S4bupa}}/A_BusinessPartner('ACME') +GET {{server}}/admin/Books(201)?$expand=supplier +{{authAlice}} + +### 2. Assign supplier ID "PNG" + +PATCH {{server}}/admin/Books(201) +{{authAlice}} Content-Type: application/json -{ "FirstName":"ACME" } +{ + "supplier_ID": "PNG" +} -### +### 3. Supplier information is replicated + +GET {{server}}/admin/Books(201)?$expand=supplier +{{authAlice}} From 21359a7ad37c3f202ceb1337afee46731d8310f3 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 9 Jun 2021 08:41:00 +0200 Subject: [PATCH 077/100] Use type reference --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index b31ce5c9..d2247d00 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -81,6 +81,6 @@ extend projection CatalogService.ListOfBooks with { extend service S4 { @type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1' event BusinessPartner.Changed { - BusinessPartner: String(10); + BusinessPartner: S4.A_BusinessPartner:BusinessPartner; } } \ No newline at end of file From 31c110e9e2e540e6298615f224e44f460f06a67e Mon Sep 17 00:00:00 2001 From: D065023 Date: Thu, 10 Jun 2021 15:55:26 +0200 Subject: [PATCH 078/100] added profiles --- suppliers/package.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/suppliers/package.json b/suppliers/package.json index 9be35291..fc5aa5d2 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -18,16 +18,22 @@ "API_BUSINESS_PARTNER": { "kind": "odata", "model": "srv/external/API_BUSINESS_PARTNER", - "[with-destination]": { + "[hybrid]": { "credentials": { - "destination": "" + "destination": "cap-api098", + "path": "/sap/opu/odata/sap/API_BUSINESS_PARTNER" } } }, - "[development]": { + "[local-hybrid]": { "messaging": { "kind": "file-based-messaging" } + }, + "[hybrid]": { + "messaging": { + "kind": "enterprise-messaging" + } } } } From 5e76c7f52e660f678f86dc32d7e33eb0bb978ea4 Mon Sep 17 00:00:00 2001 From: D065023 Date: Thu, 10 Jun 2021 15:58:25 +0200 Subject: [PATCH 079/100] console.log --- suppliers/srv/mashup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 3de8f285..52784f5b 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -40,6 +40,7 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 await new Promise( resolve => setTimeout( resolve, 1000 )); + console.log(">>", msg.event) const id = msg.data.BusinessPartner; let replica = await SELECT.one('ID').from (Suppliers) .where ('ID =', id); if (replica) await replicate(id); From 4a0db3e2590adcaf43ed103f4a5e2bed4c5e970a Mon Sep 17 00:00:00 2001 From: D065023 Date: Thu, 10 Jun 2021 15:59:00 +0200 Subject: [PATCH 080/100] rm sleep --- suppliers/srv/mashup.js | 1 - 1 file changed, 1 deletion(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 52784f5b..0c903d40 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -39,7 +39,6 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 - await new Promise( resolve => setTimeout( resolve, 1000 )); console.log(">>", msg.event) const id = msg.data.BusinessPartner; let replica = await SELECT.one('ID').from (Suppliers) .where ('ID =', id); From 870f8d063d02d750a8adfd7dcbdbc3bd56dc5d8d Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 11 Jun 2021 08:15:27 +0200 Subject: [PATCH 081/100] Add Fiori UI for Book administration * Copyied from fiori/app/admin * Added Supplier + Value Help + Texts * Fixed bug in replication handler that caused to return wrong data --- suppliers/app/_i18n/i18n.properties | 31 ++ suppliers/app/_i18n/i18n_de.properties | 18 ++ suppliers/app/admin-fiori.html | 55 ++++ suppliers/app/admin/fiori-service.cds | 121 ++++++++ suppliers/app/admin/webapp/Component.js | 8 + .../app/admin/webapp/i18n/i18n.properties | 11 + suppliers/app/admin/webapp/manifest.json | 128 +++++++++ suppliers/app/common.cds | 264 ++++++++++++++++++ suppliers/app/services.cds | 12 + suppliers/srv/mashup.cds | 1 + suppliers/srv/mashup.js | 6 +- 11 files changed, 653 insertions(+), 2 deletions(-) create mode 100644 suppliers/app/_i18n/i18n.properties create mode 100644 suppliers/app/_i18n/i18n_de.properties create mode 100644 suppliers/app/admin-fiori.html create mode 100644 suppliers/app/admin/fiori-service.cds create mode 100644 suppliers/app/admin/webapp/Component.js create mode 100644 suppliers/app/admin/webapp/i18n/i18n.properties create mode 100644 suppliers/app/admin/webapp/manifest.json create mode 100644 suppliers/app/common.cds create mode 100644 suppliers/app/services.cds diff --git a/suppliers/app/_i18n/i18n.properties b/suppliers/app/_i18n/i18n.properties new file mode 100644 index 00000000..05cd38b5 --- /dev/null +++ b/suppliers/app/_i18n/i18n.properties @@ -0,0 +1,31 @@ +Books = Books +Book = Book +ID = ID +Title = Title +Author = Author +AuthorID = Author ID +Stock = Stock +Name = Name +AuthorName = Author's Name +DateOfBirth = Date of Birth +DateOfDeath = Date of Death +PlaceOfBirth = Place of Birth +PlaceOfDeath = Place of Death +Age = Age +Authors = Authors +Order = Order +Orders = Orders +Price = Price + +Genre = Genre +Genres = Genres +SubGenres = Sub Genres + +NumCode = Numeric Code +MinorUnit = Minor Unit +Exponent = Exponent + +Supplier = Supplier +SupplierName = Supplier Name +Id = Id +Name = Name \ No newline at end of file diff --git a/suppliers/app/_i18n/i18n_de.properties b/suppliers/app/_i18n/i18n_de.properties new file mode 100644 index 00000000..ee3b52f1 --- /dev/null +++ b/suppliers/app/_i18n/i18n_de.properties @@ -0,0 +1,18 @@ +Books = Bücher +Book = Buch +ID = ID +Title = Titel +Authors = Autoren +Author = Autor +AuthorID = ID des Autors +AuthorName = Name des Autors +Age = Alter +Name = Name +Stock = Bestand +Order = Bestellung +Orders = Bestellungen +Price = Preis +Supplier = Lieferant +SupplierName = Lieferantenname +Id = Id +Name = Name \ No newline at end of file diff --git a/suppliers/app/admin-fiori.html b/suppliers/app/admin-fiori.html new file mode 100644 index 00000000..6c229e6b --- /dev/null +++ b/suppliers/app/admin-fiori.html @@ -0,0 +1,55 @@ + + + + + + + + Bookshop + + + + + + + + + + \ No newline at end of file diff --git a/suppliers/app/admin/fiori-service.cds b/suppliers/app/admin/fiori-service.cds new file mode 100644 index 00000000..da70b9b4 --- /dev/null +++ b/suppliers/app/admin/fiori-service.cds @@ -0,0 +1,121 @@ +//using { AdminService } from '../../db/schema'; + +//////////////////////////////////////////////////////////////////////////// +// +// Books Object Page +// + +annotate AdminService.Books with @( + UI: { + Facets: [ + {$Type: 'UI.ReferenceFacet', Label: '{i18n>General}', Target: '@UI.FieldGroup#General'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Translations}', Target: 'texts/@UI.LineItem'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Supplier}', Target: '@UI.FieldGroup#Supplier'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Admin}', Target: '@UI.FieldGroup#Admin'}, + ], + FieldGroup#General: { + Data: [ + {Value: title}, + {Value: author_ID}, + {Value: genre_ID}, + {Value: descr}, + ] + }, + FieldGroup#Details: { + Data: [ + {Value: stock}, + {Value: price}, + {Value: currency_code, Label: '{i18n>Currency}'}, + ] + }, + FieldGroup#Supplier: { + Data: [ + {Value: supplier_ID, Label: '{i18n>Id}'}, + {Value: supplier.name, Label: '{i18n>Name}'} + ] + }, + FieldGroup#Admin: { + Data: [ + {Value: createdBy}, + {Value: createdAt}, + {Value: modifiedBy}, + {Value: modifiedAt} + ] + } + } +); + +annotate AdminService.Authors with @( + UI: { + HeaderInfo: { + Description: {Value: lifetime} + }, + Facets: [ + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Books}', Target: 'books/@UI.LineItem'}, + ], + FieldGroup#Details: { + Data: [ + {Value: placeOfBirth}, + {Value: placeOfDeath}, + {Value: dateOfBirth}, + {Value: dateOfDeath}, + {Value: age, Label: '{i18n>Age}'}, + ] + }, + } +); + + + +//////////////////////////////////////////////////////////// +// +// Draft for Localized Data +// + +annotate sap.capire.bookshop.Books with @fiori.draft.enabled; +annotate AdminService.Books with @odata.draft.enabled; + +annotate AdminService.Books.texts with @( + UI: { + Identification: [{Value:title}], + SelectionFields: [ locale, title ], + LineItem: [ + {Value: locale, Label: 'Locale'}, + {Value: title, Label: 'Title'}, + {Value: descr, Label: 'Description'} + ] + } +); + +// Add Value Help for Locales +annotate AdminService.Books.texts { + locale @ValueList:{entity:'Languages',type:#fixed} +} +// In addition we need to expose Languages through AdminService +using { sap } from '@sap/cds/common'; +extend service AdminService { + entity Languages as projection on sap.common.Languages; +} + +annotate AdminService.Books with { + supplier @( + Common: { + Label: '{i18n>Supplier}', + ValueList: { + Label: '{i18n>Supplier}', + CollectionPath: 'Suppliers', + Parameters: [ + { $Type: 'Common.ValueListParameterInOut', + LocalDataProperty: supplier_ID, + ValueListProperty: 'ID' + }, + { $Type: 'Common.ValueListParameterDisplayOnly', + ValueListProperty: 'name' + } + ] + } + } + ); +} diff --git a/suppliers/app/admin/webapp/Component.js b/suppliers/app/admin/webapp/Component.js new file mode 100644 index 00000000..c3137017 --- /dev/null +++ b/suppliers/app/admin/webapp/Component.js @@ -0,0 +1,8 @@ +sap.ui.define(["sap/fe/core/AppComponent"], function(AppComponent) { + "use strict"; + return AppComponent.extend("admin.Component", { + metadata: { manifest: "json" } + }); +}); + +/* eslint no-undef:0 */ \ No newline at end of file diff --git a/suppliers/app/admin/webapp/i18n/i18n.properties b/suppliers/app/admin/webapp/i18n/i18n.properties new file mode 100644 index 00000000..28b03dff --- /dev/null +++ b/suppliers/app/admin/webapp/i18n/i18n.properties @@ -0,0 +1,11 @@ +# This is the resource bundle of itelo +# __ldi.translation.uuid=c3431418-9caf-11e8-98d0-529269fb1459 + +# JCI app descriptor contains lower case TITLE +appTitle=Bookshop Sample + +# JCI app descriptor contains lower case DESCRIPTION +appSubTitle=CAP Sample Application + +# JCI app descriptor contains lower case DESCRIPTION +appDescription=CDS Sample Service diff --git a/suppliers/app/admin/webapp/manifest.json b/suppliers/app/admin/webapp/manifest.json new file mode 100644 index 00000000..25047c29 --- /dev/null +++ b/suppliers/app/admin/webapp/manifest.json @@ -0,0 +1,128 @@ +{ + "_version": "1.8.0", + "sap.app": { + "id": "admin", + "type": "application", + "title": "Manage Books", + "description": "Sample Application", + "i18n": "i18n/i18n.properties", + "dataSources": { + "AdminService": { + "uri": "/admin/", + "type": "OData", + "settings": { + "odataVersion": "4.0" + } + } + }, + "-sourceTemplate": { + "id": "ui5template.basicSAPUI5ApplicationProject", + "-id": "ui5template.smartTemplate", + "-version": "1.40.12" + } + }, + "sap.ui5": { + "dependencies": { + "libs": { + "sap.fe.templates": {} + } + }, + "models": { + "i18n": { + "type": "sap.ui.model.resource.ResourceModel", + "uri": "i18n/i18n.properties" + }, + "": { + "dataSource": "AdminService", + "settings": { + "synchronizationMode": "None", + "operationMode": "Server", + "autoExpandSelect" : true, + "earlyRequests": true, + "groupProperties": { + "default": { + "submit": "Auto" + } + } + } + } + }, + "routing": { + "routes": [ + { + "pattern": ":?query:", + "name": "BooksList", + "target": "BooksList" + }, + { + "pattern": "Books({key}):?query:", + "name": "BooksDetails", + "target": "BooksDetails" + }, + { + "pattern": "Books({key}/author({key2}):?query:", + "name": "AuthorsDetails", + "target": "AuthorsDetails" + } + ], + "targets": { + "BooksList": { + "type": "Component", + "id": "BooksList", + "name": "sap.fe.templates.ListReport", + "options": { + "settings" : { + "entitySet" : "Books", + "navigation" : { + "Books" : { + "detail" : { + "route" : "BooksDetails" + } + } + } + } + } + }, + "BooksDetails": { + "type": "Component", + "id": "BooksDetailsList", + "name": "sap.fe.templates.ObjectPage", + "options": { + "settings" : { + "entitySet" : "Books", + "navigation" : { + "Authors" : { + "detail" : { + "route" : "AuthorsDetails" + } + } + } + } + } + }, + "AuthorsDetails": { + "type": "Component", + "id": "AuthorsDetailsList", + "name": "sap.fe.templates.ObjectPage", + "options": { + "settings" : { + "entitySet" : "Authors" + } + } + } + } + }, + "contentDensities": { + "compact": true, + "cozy": true + } + }, + "sap.ui": { + "technology": "UI5", + "fullWidth": false + }, + "sap.fiori": { + "registrationIds": [], + "archeType": "transactional" + } +} \ No newline at end of file diff --git a/suppliers/app/common.cds b/suppliers/app/common.cds new file mode 100644 index 00000000..a37b2b05 --- /dev/null +++ b/suppliers/app/common.cds @@ -0,0 +1,264 @@ +/* + Common Annotations shared by all apps +*/ + +using { sap.capire.bookshop as my } from '@capire/bookshop'; +using { sap.common } from '@capire/common'; + +//////////////////////////////////////////////////////////////////////////// +// +// Books Lists +// +annotate my.Books with @( + Common.SemanticKey: [title], + UI: { + Identification: [{Value:title}], + SelectionFields: [ ID, author_ID, price, currency_code, supplier_ID, supplier.name ], + LineItem: [ + {Value: ID}, + {Value: title}, + {Value: author.name, Label:'{i18n>Author}'}, + {Value: genre.name}, + {Value: stock}, + {Value: price}, + {Value: currency.symbol, Label:' '}, + {Value: supplier_ID}, + {Value: supplier.name} + ] + } +) { + author @ValueList.entity:'Authors'; +}; + +//////////////////////////////////////////////////////////////////////////// +// +// Books Details +// +annotate my.Books with @( + UI: { + HeaderInfo: { + TypeName: '{i18n>Book}', + TypeNamePlural: '{i18n>Books}', + Title: {Value: title}, + Description: {Value: author.name} + }, + } +); + + + +//////////////////////////////////////////////////////////////////////////// +// +// Books Elements +// +annotate my.Books with { + ID @title:'{i18n>ID}' @UI.HiddenFilter; + title @title:'{i18n>Title}'; + genre @title:'{i18n>Genre}' @Common: { Text: genre.name, TextArrangement: #TextOnly }; + author @title:'{i18n>Author}' @Common: { Text: author.name, TextArrangement: #TextOnly }; + price @title:'{i18n>Price}' @Measures.ISOCurrency: currency_code; + stock @title:'{i18n>Stock}'; + descr @UI.MultiLineText; + supplier_ID @title:'{i18n>Supplier}'; +} + +annotate my.Suppliers with { + name @title:'{i18n>SupplierName}'; +} + +//////////////////////////////////////////////////////////////////////////// +// +// Genres List +// +annotate my.Genres with @( + Common.SemanticKey: [name], + UI: { + SelectionFields: [ name ], + LineItem:[ + {Value: name}, + {Value: parent.name, Label: 'Main Genre'}, + ], + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Genre Details +// +annotate my.Genres with @( + UI: { + Identification: [{Value:name}], + HeaderInfo: { + TypeName: '{i18n>Genre}', + TypeNamePlural: '{i18n>Genres}', + Title: {Value: name}, + Description: {Value: ID} + }, + Facets: [ + {$Type: 'UI.ReferenceFacet', Label: '{i18n>SubGenres}', Target: 'children/@UI.LineItem'}, + ], + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Genres Elements +// +annotate my.Genres with { + ID @title: '{i18n>ID}'; + name @title: '{i18n>Genre}'; +} + +//////////////////////////////////////////////////////////////////////////// +// +// Authors List +// +annotate my.Authors with @( + Common.SemanticKey: [name], + UI: { + Identification: [{Value:name}], + SelectionFields: [ name ], + LineItem:[ + {Value: ID}, + {Value: name}, + {Value: dateOfBirth}, + {Value: dateOfDeath}, + {Value: placeOfBirth}, + {Value: placeOfDeath}, + ], + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Author Details +// +annotate my.Authors with @( + UI: { + HeaderInfo: { + TypeName: '{i18n>Author}', + TypeNamePlural: '{i18n>Authors}', + Title: {Value: name}, + Description: {Value: dateOfBirth} + }, + Facets: [ + {$Type: 'UI.ReferenceFacet', Target: 'books/@UI.LineItem'}, + ], + } +); + + +//////////////////////////////////////////////////////////////////////////// +// +// Authors Elements +// +annotate my.Authors with { + ID @title:'{i18n>ID}' @UI.HiddenFilter; + name @title:'{i18n>Name}'; + dateOfBirth @title:'{i18n>DateOfBirth}'; + dateOfDeath @title:'{i18n>DateOfDeath}'; + placeOfBirth @title:'{i18n>PlaceOfBirth}'; + placeOfDeath @title:'{i18n>PlaceOfDeath}'; +} + +//////////////////////////////////////////////////////////////////////////// +// +// Languages List +// +annotate common.Languages with @( + Common.SemanticKey: [code], + Identification: [{Value:code}], + UI: { + SelectionFields: [ name, descr ], + LineItem:[ + {Value: code}, + {Value: name}, + ], + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Language Details +// +annotate common.Languages with @( + UI: { + HeaderInfo: { + TypeName: '{i18n>Language}', + TypeNamePlural: '{i18n>Languages}', + Title: {Value: name}, + Description: {Value: descr} + }, + Facets: [ + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, + ], + FieldGroup#Details: { + Data: [ + {Value: code}, + {Value: name}, + {Value: descr} + ] + }, + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Currencies List +// +annotate common.Currencies with @( + Common.SemanticKey: [code], + Identification: [{Value:code}], + UI: { + SelectionFields: [ name, descr ], + LineItem:[ + {Value: descr}, + {Value: symbol}, + {Value: code}, + ], + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Currency Details +// +annotate common.Currencies with @( + UI: { + HeaderInfo: { + TypeName: '{i18n>Currency}', + TypeNamePlural: '{i18n>Currencies}', + Title: {Value: descr}, + Description: {Value: code} + }, + Facets: [ + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Extended}', Target: '@UI.FieldGroup#Extended'}, + ], + FieldGroup#Details: { + Data: [ + {Value: name}, + {Value: symbol}, + {Value: code}, + {Value: descr} + ] + }, + FieldGroup#Extended: { + Data: [ + {Value: numcode}, + {Value: minor}, + {Value: exponent} + ] + }, + } +); + +//////////////////////////////////////////////////////////////////////////// +// +// Currencies Elements +// +annotate common.Currencies with { + numcode @title:'{i18n>NumCode}'; + minor @title:'{i18n>MinorUnit}'; + exponent @title:'{i18n>Exponent}'; +} diff --git a/suppliers/app/services.cds b/suppliers/app/services.cds new file mode 100644 index 00000000..595023e9 --- /dev/null +++ b/suppliers/app/services.cds @@ -0,0 +1,12 @@ +/* + This model controls what gets served to Fiori frontends... +*/ + +using from './admin/fiori-service'; +using from './browse/fiori-service'; +using from './common'; + +using from '@capire/common'; + +// only works in case of embedded orders service +using from '@capire/orders/app/orders/fiori-service'; diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 3d2e9799..a6e28b0e 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -8,6 +8,7 @@ using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; @cds.autoexpose // or expose explicitly in Catalog and AdminService @cds.persistence: {table,skip:false} // add persistency +@readonly entity sap.capire.bookshop.Suppliers as projection on S4.A_BusinessPartner { // TODO: Aliases not supported in Java, yet? key BusinessPartner as ID, diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 0c903d40..981634ac 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -31,8 +31,10 @@ module.exports = async()=>{ // called by server.js if (!replicated) await replicate (supplierId, 'initial'); }; - if (supplierId) return Promise.all ([ next(), replicateIfNotExists() ]) - else return next() //> don't forget to pass down the interceptor stack + if (supplierId) + return (await Promise.all ([ next(), replicateIfNotExists() ]))[0] + else + return next() //> don't forget to pass down the interceptor stack }) }) From 097b74db03a6110355cd943bd379a0fec657edb0 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Fri, 11 Jun 2021 10:40:17 +0200 Subject: [PATCH 082/100] Adjustments --- suppliers/app/services.cds | 2 +- .../data/API_BUSINESS_PARTNER-Suppliers.csv | 5 -- .../data/sap.capire.bookshop-Suppliers.csv | 5 +- suppliers/srv/mashup.cds | 54 ++++--------------- suppliers/srv/mashup.js | 52 +++++------------- 5 files changed, 24 insertions(+), 94 deletions(-) delete mode 100644 suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv diff --git a/suppliers/app/services.cds b/suppliers/app/services.cds index 595023e9..92fc127e 100644 --- a/suppliers/app/services.cds +++ b/suppliers/app/services.cds @@ -3,7 +3,7 @@ */ using from './admin/fiori-service'; -using from './browse/fiori-service'; +//using from './browse/fiori-service'; using from './common'; using from '@capire/common'; diff --git a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv b/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv deleted file mode 100644 index cbb3ca2e..00000000 --- a/suppliers/srv/external/data/API_BUSINESS_PARTNER-Suppliers.csv +++ /dev/null @@ -1,5 +0,0 @@ -ID;name -ACME;A Company Making Everything -B4U;Books for You -S&C;Shakespeare & Co. -WSL;Waterstones diff --git a/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv index 1096eb4a..69c08d69 100644 --- a/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv +++ b/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv @@ -1,6 +1,3 @@ ID;name -ACME;A Company Making Everything (local) -B4U;Books for You -S&C;Shakespeare & Co. -WSL;Waterstones +ACME;A Company Making Everything (replicated) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index a6e28b0e..5ca632ce 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -10,44 +10,18 @@ using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; @cds.persistence: {table,skip:false} // add persistency @readonly entity sap.capire.bookshop.Suppliers as projection on S4.A_BusinessPartner { - // TODO: Aliases not supported in Java, yet? key BusinessPartner as ID, - BusinessPartnerFullName as name, - - // REVISIT: following is not supported so far in cds compiler... - // to_BusinessPartnerAddress as city { - // CityCode as code, - // CityName as name - // } - - // to_BusinessPartnerAddress - - // REVISIT: following is not supported so far in cqn2odata... - // to_BusinessPartnerAddress.CityCode as city, - // to_BusinessPartnerAddress.CityName as city_name, - - //// REVISIT: Should this be here or in the service, when it is only used for Fiori? - //// Compositions should work as well - //// The version with "virtual" is prefered, as this makes clear that the association is "added" here - // virtual books: Association to Books on book.supplier = $self, - // books2: Association to Books on book.supplier = $self, - //// Add virtual field, that does'nt exisits in the persistence or the underlying service - // virtual saveEnabled: Boolean -} excluding { - OrganizationBPName1, OrganizationBPName2,OrganizationBPName3, OrganizationBPName4, to_BuPaIdentification, to_BuPaIndustry, to_BusinessPartnerAddress, to_BusinessPartnerBank, to_BusinessPartnerContact, to_BusinessPartnerRole, to_BusinessPartnerTax, to_Customer, to_Supplier + BusinessPartnerFullName as name } - -// REVISIT: Alternative idea to use a specific replication view, but request data from -// a different view and manual map values. -// entity ReplicatedSuppliers as projection on Suppliers { -// ID, -// name, -// to_BusinessPartnerAddress.CityCode as city, -// to_BusinessPartnerAddress.CityName as city_name -// } - - +/* + You can also expose external entities through your own services + For this to work, you need to delegate the respective calls + addressed to your services into calls to the external service. + */ +extend service AdminService with { + entity Suppliers as projection on bookshop.Suppliers; +} /* @@ -59,16 +33,6 @@ extend Books with { supplier : Association to bookshop.Suppliers; } - -/* - You can also expose external entities through your own services - For this to work, you need to delegate the respective calls - addressed to your services into calls to the external service. - */ -extend service AdminService with { - entity Suppliers as projection on bookshop.Suppliers; -} - /** Having locally cached replicas also allows us to display supplier data in lists of books, which otherwise would generate unwanted diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 981634ac..f7aae6dd 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -31,10 +31,11 @@ module.exports = async()=>{ // called by server.js if (!replicated) await replicate (supplierId, 'initial'); }; - if (supplierId) - return (await Promise.all ([ next(), replicateIfNotExists() ]))[0] - else - return next() //> don't forget to pass down the interceptor stack + if (supplierId) { + const [result, _] = await Promise.all([next(), replicateIfNotExists()]); + return result; + } else + return next(); //> don't forget to pass down the interceptor stack }) }) @@ -42,46 +43,19 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 console.log(">>", msg.event) - const id = msg.data.BusinessPartner; - let replica = await SELECT.one('ID').from (Suppliers) .where ('ID =', id); - if (replica) await replicate(id); + const ID = msg.data.BusinessPartner; + let replica = await SELECT.one('ID').from(Suppliers).where({ID}); + if (replica) await replicate(ID); }) /** * Helper function to replicate Suppliers data. - * @param {string} a single ID + * @param {string} ID a single ID * @param {truthy|falsy} _initial indicates whether an insert or an update is required */ - async function replicate (id,_initial) { - // TODO: Doesn't work when running in same process with mocked API_BUSINESS_PARTNER - - // TODO: Doesn't work because fields are not mapped back! - //let supplier = await S4bupa.run(SELECT.one('*').from(Suppliers).where('ID =',id)); - - let suppliers = await S4bupa.read(Suppliers).where('ID =',id); - if (_initial) return db.insert (suppliers) .into (Suppliers) //> using bulk insert - else return db.update(Suppliers,id) .with (suppliers[0]); - } - - - // TODO: remove test code - { - // one server: returns AdminService.Suppliers - // two servers: returns API_BUSINESS_PARTNER.A_BusinessPartner - const tx = S4bupa.tx({}); - let result = await tx.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); - tx.commit(); - console.log(result); - } - - // TODO: remove test code - { - // one server: returns AdminService.Suppliers - // two servers: returns AdminService.Suppliers - const tx = db.tx({}); - let result = await db.run(SELECT('*').from ('AdminService.Suppliers') .where ('ID =', 'ACME')); - tx.commit(); - console.log(result); + async function replicate (ID,_initial) { + let supplier = await S4bupa.run(SELECT.one(Suppliers).where({ID})); + if (_initial) return db.insert(supplier).into(Suppliers); + else return db.update(Suppliers).with(supplier).where({ID}); } - } From 9bbc431448aff607eb1c8072cfbbe9268529ab50 Mon Sep 17 00:00:00 2001 From: D065023 Date: Fri, 11 Jun 2021 14:46:09 +0200 Subject: [PATCH 083/100] odata-v2 (needs PR) and rm file-based --- suppliers/.env | 3 +-- suppliers/package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/suppliers/.env b/suppliers/.env index 616dd8d0..9d7dc2db 100644 --- a/suppliers/.env +++ b/suppliers/.env @@ -1,2 +1 @@ -cds.requires.messaging.kind = file-based-messaging -PORT = 4006 \ No newline at end of file +PORT = 4006 diff --git a/suppliers/package.json b/suppliers/package.json index fc5aa5d2..3bd4a3b3 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -16,7 +16,7 @@ "cds": { "requires": { "API_BUSINESS_PARTNER": { - "kind": "odata", + "kind": "odata-v2", "model": "srv/external/API_BUSINESS_PARTNER", "[hybrid]": { "credentials": { From 86e6983bede6568c3f47b47137714da56851b991 Mon Sep 17 00:00:00 2001 From: D065023 Date: Fri, 11 Jun 2021 14:46:51 +0200 Subject: [PATCH 084/100] use enterprise-messaging-shared --- suppliers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/package.json b/suppliers/package.json index 3bd4a3b3..83f469d7 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -32,7 +32,7 @@ }, "[hybrid]": { "messaging": { - "kind": "enterprise-messaging" + "kind": "enterprise-messaging-shared" } } } From ba3eeff58b4d3ae6e1685de896ea8ba06e7aff46 Mon Sep 17 00:00:00 2001 From: D065023 Date: Mon, 14 Jun 2021 12:44:21 +0200 Subject: [PATCH 085/100] odata-v2 -> odata otherwise mock won't work --- suppliers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/package.json b/suppliers/package.json index 83f469d7..8dff8241 100644 --- a/suppliers/package.json +++ b/suppliers/package.json @@ -16,7 +16,7 @@ "cds": { "requires": { "API_BUSINESS_PARTNER": { - "kind": "odata-v2", + "kind": "odata", "model": "srv/external/API_BUSINESS_PARTNER", "[hybrid]": { "credentials": { From 0cb7349e6262b2c9f3e22e753c49d096c3f0a8cf Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 15 Jun 2021 12:57:42 +0200 Subject: [PATCH 086/100] Cosmetics -> for docs --- suppliers/srv/mashup.cds | 72 +++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 5ca632ce..c1aa3c0a 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -1,23 +1,35 @@ -/* - Optionally add projections to external entities, to capture what - you actually want to use from there. - */ - -using { sap.capire.bookshop as bookshop } from '@capire/bookshop'; using { API_BUSINESS_PARTNER as S4 } from './external/API_BUSINESS_PARTNER.csn'; +using { CatalogService, sap.capire.bookshop.Books } from '@capire/bookshop'; +namespace sap.capire.bookshop; -@cds.autoexpose // or expose explicitly in Catalog and AdminService -@cds.persistence: {table,skip:false} // add persistency -@readonly -entity sap.capire.bookshop.Suppliers as projection on S4.A_BusinessPartner { + +/** + Add projections to external entities to capture the subset of fields we're + actually interested in. This fosters both: (a) minimized network traffic as + well as (b) options to dynamically add extension fields by SaaS tenants. + */ +entity Suppliers as projection on S4.A_BusinessPartner { key BusinessPartner as ID, - BusinessPartnerFullName as name + BusinessPartnerFullName as name, + // to_BusinessPartnerAddress[1: ValidityStartDate <= $now and $now < ValidityEndDate].CityName, + // to_BusinessPartnerAddress[1: ValidityStartDate <= $now and $now < ValidityEndDate].Country, } + +/** + We can mashup entities from external services, or projections thereof, with + our project's own entities, e.g. by adding relationships as below. + */ +extend Books with { + supplier : Association to Suppliers; +} + + /* - You can also expose external entities through your own services - For this to work, you need to delegate the respective calls - addressed to your services into calls to the external service. + Optionally expose external entities through own services, e.g. for Value Helps, + or to display details fetched on demand. + For this to work, we need to delegate the respective calls addressed to our + services into calls to the external service. */ extend service AdminService with { entity Suppliers as projection on bookshop.Suppliers; @@ -25,27 +37,35 @@ extend service AdminService with { /* - You can mashup entities from external services, or projections - thereof, with your project's own entities + Optionally add local persistency to replicate data for fast access, + e.g. to display lists containing remote data. */ -using { sap.capire.bookshop.Books, CatalogService } from '@capire/bookshop'; -extend Books with { - supplier : Association to bookshop.Suppliers; -} +annotate Suppliers with @cds.persistence: {table,skip:false}; + /** - Having locally cached replicas also allows us to display supplier - data in lists of books, which otherwise would generate unwanted - traffic on S4 backends. + Having locally cached replicas also allows to display supplier data in lists + of books, which otherwise would generate unwanted traffic on S4 backends. */ extend projection CatalogService.ListOfBooks with { supplier.name as supplier } -// Extend S4 service with an event (events are not included in EDMX files) + +/** + Optionally declare events emitted from the source, but not included in + imported APIs (e.g. as in case of EDMXes from API Hub). + + This allows CAP's advanced support for events and messaging to kick in, + e.g. to automatically emit to and subscribe to events from message brokers + behind the scenes. + + Note: as sync and async APIs from S/4 sources are not correlated, we have + to specify the event type names, e.g. as be found at: + https://api.sap.com/event/SAPS4HANACloudBusinessEvents_BusinessPartner/resource + */ extend service S4 { - @type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1' - event BusinessPartner.Changed { + event BusinessPartner.Changed @(type: 'sap.s4.beh.businesspartner.v1.BusinessPartner.Changed.v1') { BusinessPartner: S4.A_BusinessPartner:BusinessPartner; } } From 4a8b85f227581b8e5435fa6af27ae7a70e264337 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 15 Jun 2021 12:58:09 +0200 Subject: [PATCH 087/100] Added illustrations to ffollow up on workarounds --- suppliers/model.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 suppliers/model.drawio diff --git a/suppliers/model.drawio b/suppliers/model.drawio new file mode 100644 index 00000000..bdcd9928 --- /dev/null +++ b/suppliers/model.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file From db595a9635ffcfe6ee48bae96ddb6e3a768ab0b6 Mon Sep 17 00:00:00 2001 From: D065023 Date: Tue, 15 Jun 2021 15:02:13 +0200 Subject: [PATCH 088/100] better logs --- suppliers/srv/mashup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index f7aae6dd..f6917b1a 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -42,7 +42,7 @@ module.exports = async()=>{ // called by server.js // Subscribe to changes in the S4 origin of Suppliers data S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 - console.log(">>", msg.event) + console.log(">>", msg.event, msg.data) const ID = msg.data.BusinessPartner; let replica = await SELECT.one('ID').from(Suppliers).where({ID}); if (replica) await replicate(ID); From 732b6b081ce88d99ff66edae03d9f488ecc2fc54 Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 16 Jun 2021 07:16:05 +0200 Subject: [PATCH 089/100] Add missing profile --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba71c072..43f62b54 100644 --- a/README.md +++ b/README.md @@ -97,14 +97,14 @@ Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This 1. Run: ``` - cds mock API_BUSINESS_PARTNER -p 5001 + CDS_ENV=local-hybrid cds mock API_BUSINESS_PARTNER -p 5001 ``` 2. Wait until startup is completed 3. Run in a 2nd terminal: ``` - cds serve all --with-mocks --in-memory + CDS_ENV=local-hybrid cds serve all --with-mocks --in-memory ``` 4. Now, you can issues the requests listed in `suppliers/requests.http` From d2bd4c5bb1f6f7adf264f0b29176c3a94c3a7dfe Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 16 Jun 2021 07:17:09 +0200 Subject: [PATCH 090/100] Fix replication error due to removed entity namespace --- suppliers/srv/mashup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index f6917b1a..46d4ec4b 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -12,7 +12,7 @@ module.exports = async()=>{ // called by server.js const db = await cds.connect.to('db') //> our primary database // Reflect CDS definition of the Suppliers entity - const Suppliers = db.entities["sap.capire.bookshop.Suppliers"]; + const Suppliers = db.entities.Suppliers; admin.prepend (()=>{ //> to ensure our .on handlers below go before the default ones From f2877db34f17ca19bf5fcef4e308d51a9feaf81c Mon Sep 17 00:00:00 2001 From: Uwe Klinger Date: Wed, 16 Jun 2021 11:02:00 +0200 Subject: [PATCH 091/100] Disable search field in value help --- suppliers/app/admin/fiori-service.cds | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/suppliers/app/admin/fiori-service.cds b/suppliers/app/admin/fiori-service.cds index da70b9b4..980d0e79 100644 --- a/suppliers/app/admin/fiori-service.cds +++ b/suppliers/app/admin/fiori-service.cds @@ -119,3 +119,8 @@ annotate AdminService.Books with { } ); } + +annotate AdminService.Suppliers with + @(Capabilities.SearchRestrictions : { + Searchable : false +}); \ No newline at end of file From c6e2fac8601e2e3664b17b75797b9650c3362147 Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 12:02:00 +0200 Subject: [PATCH 092/100] mv data --- suppliers/srv/{external => }/data/sap.capire.bookshop-Books.csv | 0 .../srv/{external => }/data/sap.capire.bookshop-Suppliers.csv | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename suppliers/srv/{external => }/data/sap.capire.bookshop-Books.csv (100%) rename suppliers/srv/{external => }/data/sap.capire.bookshop-Suppliers.csv (100%) diff --git a/suppliers/srv/external/data/sap.capire.bookshop-Books.csv b/suppliers/srv/data/sap.capire.bookshop-Books.csv similarity index 100% rename from suppliers/srv/external/data/sap.capire.bookshop-Books.csv rename to suppliers/srv/data/sap.capire.bookshop-Books.csv diff --git a/suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv b/suppliers/srv/data/sap.capire.bookshop-Suppliers.csv similarity index 100% rename from suppliers/srv/external/data/sap.capire.bookshop-Suppliers.csv rename to suppliers/srv/data/sap.capire.bookshop-Suppliers.csv From 2b9ceba62fd51c7bed6fc90eac566adc01e497b7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 16 Jun 2021 12:30:30 +0200 Subject: [PATCH 093/100] illustrations --- suppliers/model.drawio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/model.drawio b/suppliers/model.drawio index bdcd9928..8e519f67 100644 --- a/suppliers/model.drawio +++ b/suppliers/model.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file From 785ecbda8f51dad8648fa5ec0ab4642635bf7238 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 16 Jun 2021 12:30:56 +0200 Subject: [PATCH 094/100] cleaned up code --- suppliers/srv/mashup.js | 45 +++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 46d4ec4b..8828d38e 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -12,7 +12,7 @@ module.exports = async()=>{ // called by server.js const db = await cds.connect.to('db') //> our primary database // Reflect CDS definition of the Suppliers entity - const Suppliers = db.entities.Suppliers; + const { Suppliers } = db.entities admin.prepend (()=>{ //> to ensure our .on handlers below go before the default ones @@ -23,19 +23,19 @@ module.exports = async()=>{ // called by server.js }) // Replicate Supplier data when edited Books have suppliers - admin.on (['CREATE','UPDATE'], 'Books', async ({data:{supplier_ID: supplierId}}, next) => { - // Using Promise.all(...) to parallelize local write, i.e. next(), and replication - - const replicateIfNotExists = async()=>{ - let replicated = await db.exists (Suppliers, supplierId); - if (!replicated) await replicate (supplierId, 'initial'); - }; - - if (supplierId) { - const [result, _] = await Promise.all([next(), replicateIfNotExists()]); - return result; - } else - return next(); //> don't forget to pass down the interceptor stack + admin.on (['CREATE','UPDATE'], 'Books', async ({data:{supplier_ID:ID}}, next) => { + if (ID) { + // Using Promise.all(...) to parallelize local write, i.e. next(), and replication + const [result] = await Promise.all([ next(), (async()=>{ + let replicated = await db.exists (Suppliers,ID) + if (!replicated) { // initially replicate Supplier info + let supplier = await S4bupa.read (Suppliers,ID) + await INSERT(supplier) .into (Suppliers) + } + })()]) + return result + } + else return next() //> don't forget to pass down the interceptor stack }) }) @@ -44,18 +44,11 @@ module.exports = async()=>{ // called by server.js S4bupa.on ('BusinessPartner.Changed', async msg => { //> would be great if we had batch events from S/4 console.log(">>", msg.event, msg.data) const ID = msg.data.BusinessPartner; - let replica = await SELECT.one('ID').from(Suppliers).where({ID}); - if (replica) await replicate(ID); + let replicated = await db.exists (Suppliers,ID) + if (replicated) { // update replicated Supplier info + let supplier = await S4bupa.read (Suppliers,ID) + await UPDATE(Suppliers,ID) .with (supplier) + } }) - /** - * Helper function to replicate Suppliers data. - * @param {string} ID a single ID - * @param {truthy|falsy} _initial indicates whether an insert or an update is required - */ - async function replicate (ID,_initial) { - let supplier = await S4bupa.run(SELECT.one(Suppliers).where({ID})); - if (_initial) return db.insert(supplier).into(Suppliers); - else return db.update(Suppliers).with(supplier).where({ID}); - } } From 5141df8e0f4c17fcb90b5ba32472ebfe03d49f8e Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 16:40:18 +0200 Subject: [PATCH 095/100] better value list --- suppliers/app/admin/fiori-service.cds | 21 --------------------- suppliers/srv/mashup.cds | 1 + 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/suppliers/app/admin/fiori-service.cds b/suppliers/app/admin/fiori-service.cds index 980d0e79..97322697 100644 --- a/suppliers/app/admin/fiori-service.cds +++ b/suppliers/app/admin/fiori-service.cds @@ -99,27 +99,6 @@ extend service AdminService { entity Languages as projection on sap.common.Languages; } -annotate AdminService.Books with { - supplier @( - Common: { - Label: '{i18n>Supplier}', - ValueList: { - Label: '{i18n>Supplier}', - CollectionPath: 'Suppliers', - Parameters: [ - { $Type: 'Common.ValueListParameterInOut', - LocalDataProperty: supplier_ID, - ValueListProperty: 'ID' - }, - { $Type: 'Common.ValueListParameterDisplayOnly', - ValueListProperty: 'name' - } - ] - } - } - ); -} - annotate AdminService.Suppliers with @(Capabilities.SearchRestrictions : { Searchable : false diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index c1aa3c0a..2f53f1fd 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -8,6 +8,7 @@ namespace sap.capire.bookshop; actually interested in. This fosters both: (a) minimized network traffic as well as (b) options to dynamically add extension fields by SaaS tenants. */ +@cds.odata.valuelist entity Suppliers as projection on S4.A_BusinessPartner { key BusinessPartner as ID, BusinessPartnerFullName as name, From cabcd404cf43eee6312e8a7c8e69ba4c02a62056 Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 16:41:39 +0200 Subject: [PATCH 096/100] dot notation in line items --- suppliers/app/common.cds | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/suppliers/app/common.cds b/suppliers/app/common.cds index a37b2b05..3dcc5fe7 100644 --- a/suppliers/app/common.cds +++ b/suppliers/app/common.cds @@ -22,7 +22,7 @@ annotate my.Books with @( {Value: stock}, {Value: price}, {Value: currency.symbol, Label:' '}, - {Value: supplier_ID}, + {Value: supplier.ID}, {Value: supplier.name} ] } @@ -64,6 +64,7 @@ annotate my.Books with { annotate my.Suppliers with { name @title:'{i18n>SupplierName}'; + ID @title:'{i18n>Supplier}'; } //////////////////////////////////////////////////////////////////////////// From 2e10b1ac4dbfd57f4b332ca6cb7ab83d58e97ce3 Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 16:44:58 +0200 Subject: [PATCH 097/100] after handler --- suppliers/srv/mashup.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index 8828d38e..d3e7a5b9 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -23,19 +23,14 @@ module.exports = async()=>{ // called by server.js }) // Replicate Supplier data when edited Books have suppliers - admin.on (['CREATE','UPDATE'], 'Books', async ({data:{supplier_ID:ID}}, next) => { + admin.after (['CREATE','UPDATE'], 'Books', async ({supplier_ID:ID}) => { if (ID) { - // Using Promise.all(...) to parallelize local write, i.e. next(), and replication - const [result] = await Promise.all([ next(), (async()=>{ - let replicated = await db.exists (Suppliers,ID) - if (!replicated) { // initially replicate Supplier info + let replicated = await db.exists (Suppliers,ID) + if (!replicated) { // initially replicate Supplier info let supplier = await S4bupa.read (Suppliers,ID) await INSERT(supplier) .into (Suppliers) - } - })()]) - return result + } } - else return next() //> don't forget to pass down the interceptor stack }) }) From d977c21483899520ca397a835d4a2502d36afe82 Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 16:46:53 +0200 Subject: [PATCH 098/100] a bit nicer --- suppliers/srv/mashup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.js b/suppliers/srv/mashup.js index d3e7a5b9..300a705d 100644 --- a/suppliers/srv/mashup.js +++ b/suppliers/srv/mashup.js @@ -23,7 +23,8 @@ module.exports = async()=>{ // called by server.js }) // Replicate Supplier data when edited Books have suppliers - admin.after (['CREATE','UPDATE'], 'Books', async ({supplier_ID:ID}) => { + admin.after (['CREATE','UPDATE'], 'Books', async data => { + const { supplier_ID: ID } = data if (ID) { let replicated = await db.exists (Suppliers,ID) if (!replicated) { // initially replicate Supplier info From e7fbcc1ac15e1ec2e71024b08b5b23c4b0d1f020 Mon Sep 17 00:00:00 2001 From: D065023 Date: Wed, 16 Jun 2021 17:04:40 +0200 Subject: [PATCH 099/100] mv annotation to better place --- suppliers/srv/mashup.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/srv/mashup.cds b/suppliers/srv/mashup.cds index 2f53f1fd..16ca03d1 100644 --- a/suppliers/srv/mashup.cds +++ b/suppliers/srv/mashup.cds @@ -8,7 +8,6 @@ namespace sap.capire.bookshop; actually interested in. This fosters both: (a) minimized network traffic as well as (b) options to dynamically add extension fields by SaaS tenants. */ -@cds.odata.valuelist entity Suppliers as projection on S4.A_BusinessPartner { key BusinessPartner as ID, BusinessPartnerFullName as name, @@ -33,6 +32,7 @@ extend Books with { services into calls to the external service. */ extend service AdminService with { + @cds.odata.valuelist entity Suppliers as projection on bookshop.Suppliers; } From 8ba8381ca728afb2d948756af693b590cc7b3bd2 Mon Sep 17 00:00:00 2001 From: D065023 Date: Fri, 18 Jun 2021 08:29:33 +0200 Subject: [PATCH 100/100] dash to dot --- suppliers/app/common.cds | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suppliers/app/common.cds b/suppliers/app/common.cds index 3dcc5fe7..0850e010 100644 --- a/suppliers/app/common.cds +++ b/suppliers/app/common.cds @@ -13,7 +13,7 @@ annotate my.Books with @( Common.SemanticKey: [title], UI: { Identification: [{Value:title}], - SelectionFields: [ ID, author_ID, price, currency_code, supplier_ID, supplier.name ], + SelectionFields: [ ID, author_ID, price, currency_code, supplier.ID, supplier.name ], LineItem: [ {Value: ID}, {Value: title},