Codebasis als Dateien ins Arbeitsrepo statt als Gitlink

QuellCode/CentronERP war nur als Gitlink (Submodul-Referenz auf 79c1142)
getrackt, ohne .gitmodules und ohne erreichbares Remote. Der
Untersuchungsgegenstand der Versuchsreihe war damit nicht reproduzierbar
gesichert: Ein Klon haette ein leeres Verzeichnis erhalten, und die Belege
der 3.287 Anforderungen waeren nicht ueberpruefbar gewesen.

Umstellung:
- Historie nach c:\DEV\CentronERP_git_snapshot_79c1142 ausgelagert
  (vollstaendig lesbar, enthaelt 79c1142 und Vorgaenger 89ccfd6)
- Gitlink aus dem Index entfernt
- Dateiinhalt aufgenommen: 24.557 Dateien, rund 333 MB

Die verschachtelte .gitignore der Codebasis gilt weiter, Build-Artefakte
bleiben ausgeschlossen. Details in Versuche/Versuch_01/_Codebasis-Nachweis.md
This commit is contained in:
Christoph Schwörer
2026-08-26 07:43:51 +02:00
parent 18edae75b6
commit f045b99a25
24664 changed files with 5846716 additions and 1 deletions
Submodule QuellCode/CentronERP deleted from 79c1142f48
+14
View File
@@ -0,0 +1,14 @@
**/.git
**/.idea
**/app.config
**/bin
**/obj
./.editorconfig
./azure
./deployment
./docker
./docs
./scripts
./src/centron/
./tests
bin
+64
View File
@@ -0,0 +1,64 @@
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true
# C# and XAML files
[*.{cs,xaml}]
charset = utf-8-bom
# C# files
[*.cs]
#### Naming styles ####
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.private_or_internal_field_should_be_camel_case_with___prefix.severity = warning
dotnet_naming_rule.private_or_internal_field_should_be_camel_case_with___prefix.symbols = private_or_internal_field
dotnet_naming_rule.private_or_internal_field_should_be_camel_case_with___prefix.style = camel_case_with___prefix
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal
dotnet_naming_symbols.non_field_members.required_modifiers =
# Naming styles
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.camel_case_with___prefix.required_prefix = _
dotnet_naming_style.camel_case_with___prefix.required_suffix =
dotnet_naming_style.camel_case_with___prefix.word_separator =
dotnet_naming_style.camel_case_with___prefix.capitalization = camel_case
+63
View File
@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto eol=lf
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
@@ -0,0 +1,149 @@
name: Sign artifacts
description: >
Signs files via azure/artifact-signing-action with up to three attempts.
The Microsoft timestamp server (timestamp.acs.microsoft.com) fails
intermittently; re-signing already-signed files is safe because signtool
replaces existing signatures, so failed batches can simply be retried.
inputs:
azure-tenant-id:
description: Azure tenant id used for authentication.
required: true
azure-client-id:
description: Azure client id used for authentication.
required: true
azure-client-secret:
description: Azure client secret used for authentication.
required: true
files:
description: Newline-separated list of files to sign.
required: false
default: ''
files-folder:
description: Folder containing the files to sign.
required: false
default: ''
files-folder-filter:
description: Comma-separated file extensions to sign within files-folder.
required: false
default: ''
files-folder-recurse:
description: Whether to search files-folder recursively.
required: false
default: 'false'
endpoint:
description: Artifact Signing endpoint.
required: false
default: https://weu.codesigning.azure.net/
signing-account-name:
description: Artifact Signing account name.
required: false
default: CentronCodesigning
certificate-profile-name:
description: Certificate profile name.
required: false
default: centroncert
runs:
using: composite
steps:
- name: Sign (attempt 1)
id: attempt1
continue-on-error: true
uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0
with:
azure-tenant-id: ${{ inputs.azure-tenant-id }}
azure-client-id: ${{ inputs.azure-client-id }}
azure-client-secret: ${{ inputs.azure-client-secret }}
endpoint: ${{ inputs.endpoint }}
signing-account-name: ${{ inputs.signing-account-name }}
certificate-profile-name: ${{ inputs.certificate-profile-name }}
files: ${{ inputs.files }}
files-folder: ${{ inputs.files-folder }}
files-folder-filter: ${{ inputs.files-folder-filter }}
files-folder-recurse: ${{ inputs.files-folder-recurse }}
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
exclude-environment-credential: false
exclude-workload-identity-credential: true
exclude-managed-identity-credential: true
exclude-shared-token-cache-credential: true
exclude-visual-studio-credential: true
exclude-visual-studio-code-credential: true
exclude-azure-cli-credential: true
exclude-azure-powershell-credential: true
exclude-azure-developer-cli-credential: true
exclude-interactive-browser-credential: true
- name: Wait before retry (attempt 2)
if: steps.attempt1.outcome == 'failure'
shell: pwsh
run: |
Write-Host 'Signing failed, retrying in 30 seconds...'
Start-Sleep -Seconds 30
- name: Sign (attempt 2)
id: attempt2
if: steps.attempt1.outcome == 'failure'
continue-on-error: true
uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0
with:
azure-tenant-id: ${{ inputs.azure-tenant-id }}
azure-client-id: ${{ inputs.azure-client-id }}
azure-client-secret: ${{ inputs.azure-client-secret }}
endpoint: ${{ inputs.endpoint }}
signing-account-name: ${{ inputs.signing-account-name }}
certificate-profile-name: ${{ inputs.certificate-profile-name }}
files: ${{ inputs.files }}
files-folder: ${{ inputs.files-folder }}
files-folder-filter: ${{ inputs.files-folder-filter }}
files-folder-recurse: ${{ inputs.files-folder-recurse }}
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
exclude-environment-credential: false
exclude-workload-identity-credential: true
exclude-managed-identity-credential: true
exclude-shared-token-cache-credential: true
exclude-visual-studio-credential: true
exclude-visual-studio-code-credential: true
exclude-azure-cli-credential: true
exclude-azure-powershell-credential: true
exclude-azure-developer-cli-credential: true
exclude-interactive-browser-credential: true
- name: Wait before retry (attempt 3)
if: steps.attempt1.outcome == 'failure' && steps.attempt2.outcome == 'failure'
shell: pwsh
run: |
Write-Host 'Signing failed again, retrying in 90 seconds...'
Start-Sleep -Seconds 90
- name: Sign (attempt 3)
if: steps.attempt1.outcome == 'failure' && steps.attempt2.outcome == 'failure'
uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0
with:
azure-tenant-id: ${{ inputs.azure-tenant-id }}
azure-client-id: ${{ inputs.azure-client-id }}
azure-client-secret: ${{ inputs.azure-client-secret }}
endpoint: ${{ inputs.endpoint }}
signing-account-name: ${{ inputs.signing-account-name }}
certificate-profile-name: ${{ inputs.certificate-profile-name }}
files: ${{ inputs.files }}
files-folder: ${{ inputs.files-folder }}
files-folder-filter: ${{ inputs.files-folder-filter }}
files-folder-recurse: ${{ inputs.files-folder-recurse }}
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
exclude-environment-credential: false
exclude-workload-identity-credential: true
exclude-managed-identity-credential: true
exclude-shared-token-cache-credential: true
exclude-visual-studio-credential: true
exclude-visual-studio-code-credential: true
exclude-azure-cli-credential: true
exclude-azure-powershell-credential: true
exclude-azure-developer-cli-credential: true
exclude-interactive-browser-credential: true
+431
View File
@@ -0,0 +1,431 @@
name: Build, sign, and publish
on:
workflow_dispatch:
pull_request:
branches:
- main
- 'release/**'
types:
- opened
- synchronize
- reopened
- ready_for_review
push:
branches:
- main
- 'release/**'
permissions:
contents: read
# Supersede in-flight runs of this workflow for the same pull request. Pushes to main and
# release branches are excluded so every commit there still gets a full, recorded result.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
name: Build and sign
if: ${{ github.event_name != 'pull_request' || (github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.repository) }}
runs-on:
group: self-hosted
labels: [self-hosted, Windows, X64]
timeout-minutes: 180
permissions:
contents: read
outputs:
version: ${{ steps.version.outputs.version }}
main_version: ${{ steps.version.outputs.main_version }}
env:
DOTNET_NOLOGO: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
CENTRON_BUILD_RUNNING_IN_AZURE_PIPELINE: true
CENTRON_BUILD_IS_DEV_BUILD: false
steps:
- name: Show runner information
shell: pwsh
run: |
Write-Host "Runner: $env:RUNNER_NAME"
Write-Host "Computer: $env:COMPUTERNAME"
Write-Host "PowerShell: $($PSVersionTable.PSVersion)"
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Normalize Git repository format
shell: pwsh
run: |
$workspace = [IO.Path]::GetFullPath($env:GITHUB_WORKSPACE)
$safeDirectories = @(git config --global --get-all safe.directory)
$safeDirectoriesExitCode = $LASTEXITCODE
if ($safeDirectoriesExitCode -notin 0, 1) {
throw 'Could not determine the configured Git safe directories.'
}
if ($safeDirectories -notcontains $workspace) {
git config --global --add safe.directory $workspace
if ($LASTEXITCODE -ne 0) {
throw "Could not register the GitHub workspace as a safe directory: $workspace"
}
}
$repositoryFormatVersion = git config --local --get core.repositoryFormatVersion
if ($LASTEXITCODE -ne 0) {
throw 'Could not determine the Git repository format version.'
}
if ($repositoryFormatVersion -eq '1') {
$extensions = @(git config --local --name-only --get-regexp '^extensions\.')
$extensionsExitCode = $LASTEXITCODE
if ($extensionsExitCode -notin 0, 1) {
throw 'Could not determine the active Git repository extensions.'
}
if ($extensions.Count -gt 0) {
throw "Cannot normalize the Git repository while extensions are active: $($extensions -join ', ')"
}
git config --local core.repositoryFormatVersion 0
if ($LASTEXITCODE -ne 0) {
throw 'Could not normalize the Git repository format for Nerdbank.GitVersioning.'
}
}
- name: Verify build environment
shell: pwsh
run: |
$sdkVersion = dotnet --version
if ($LASTEXITCODE -ne 0) {
throw "The .NET SDK could not be resolved using global.json."
}
if ($sdkVersion -notmatch '^10\.0\.') {
throw "Expected a .NET 10 SDK, but resolved '$sdkVersion'."
}
if ((git rev-parse --is-shallow-repository) -ne 'false') {
throw 'Repository was checked out without its full history.'
}
Write-Host "Resolved .NET SDK: $sdkVersion"
dotnet --info
- name: Set version and create NuGet packages
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- create-nuget-packages
- name: Determine build version
id: version
shell: pwsh
run: |
$versionText = [string](
& ".\dotnettools\nbgv.exe" get-version -v Version
)
if ($LASTEXITCODE -ne 0) {
throw "Nerdbank.GitVersioning failed with exit code $LASTEXITCODE."
}
$version = [Version]$versionText
$buildVersion = $version.ToString()
$mainVersion = $version.ToString(3)
Write-Host "Build version: $buildVersion"
Write-Host "Main version: $mainVersion"
"version=$buildVersion" >> $env:GITHUB_OUTPUT
"main_version=$mainVersion" >> $env:GITHUB_OUTPUT
$metadataDirectory = Join-Path $env:RUNNER_TEMP 'centron-build-metadata'
New-Item -Path $metadataDirectory -ItemType Directory -Force | Out-Null
Set-Content `
-LiteralPath (Join-Path $metadataDirectory 'version.txt') `
-Value $buildVersion `
-Encoding utf8NoBOM
- name: Prepare Artifact Signing dependencies
shell: powershell
run: |
if ((Get-PackageProvider -Name NuGet -ErrorAction Ignore) -eq $null) {
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
}
if ((Get-InstalledModule -Name PowerShellGet -MinimumVersion 2.2.1 -ErrorAction Ignore) -eq $null) {
Install-Module -Name PowerShellGet -MinimumVersion 2.2.1 -Scope CurrentUser -Force -AllowClobber
}
- name: Build Web Service
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- build-web-service-only
- name: Sign Web Service
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files: |
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\Centron.Host.WindowsService.exe
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\Centron.Host.WindowsService.dll
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\ConnectionManager\c-entron Connection Manager.exe
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\ConnectionManager\c-entron Connection Manager.dll
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\Centron.Interfaces.dll
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\Centron.WebServices.Core.dll
${{ github.workspace }}\src\webservice\Centron.Host.WindowsService\bin\Release\net10.0-windows\win-x64\publish\Centron.Core.dll
- name: Create Web Service installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- set-dependencies-web-service build-web-service-installer-only
- name: Sign Web Service installer
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files-folder: ${{ github.workspace }}\deployment\centron\WebServiceSetupProject\bin\Release
files-folder-filter: exe,dll,msi
files-folder-recurse: true
- name: Package Web Service installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- set-zip-directory-web-service
- name: Build c-entron.NET
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- build-centron-net-only
- name: Sign c-entron.NET
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files: |
${{ github.workspace }}\src\centron\Centron.WPF.UI\bin\Release\net10.0-windows\win-x64\publish\c-entron 2.0.exe
${{ github.workspace }}\src\centron\Centron.WPF.UI\bin\Release\net10.0-windows\win-x64\publish\c-entron 2.0.dll
- name: Create c-entron.NET installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- set-dependencies-centron-net build-centron-net-installer-only
- name: Sign c-entron.NET installer
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files-folder: ${{ github.workspace }}\deployment\centron\CentronSetupProject\bin\Release
files-folder-filter: exe,dll,msi
files-folder-recurse: true
- name: Package c-entron.NET installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- set-zip-directory-centron-net
- name: Build Nexus
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Scripts\Scripts.csproj" `
-- build-nexus
- name: Sign Nexus
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files: |
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\CentronNexus.Host.exe
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\CentronNexus.Host.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\CentronNexus.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\CentronNexus.OutlookAddIn.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\Centron.Core.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\Centron.WebServices.Core.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\Centron.Interfaces.dll
${{ github.workspace }}\src\nexus\CentronNexus.Host\bin\Release\net10.0\win-x64\publish\Centron.Office.Client.dll
- name: Prepare Nexus installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Scripts\Scripts.csproj" `
-- zip-nexus-directory
dotnet tool update --global wix --version 5.0.2 --allow-downgrade
if ($LASTEXITCODE -ne 0) {
dotnet tool install --global wix --version 5.0.2
}
wix extension add -g WixToolset.UI.wixext/5.0.2
dotnet run `
--project ".\scripts\Scripts\Scripts.csproj" `
-- build-nexus-installer
- name: Sign Nexus installer
uses: ./.github/actions/sign-artifacts
with:
azure-tenant-id: ${{ vars.ARTIFACT_SIGNING_TENANT_ID }}
azure-client-id: ${{ vars.ARTIFACT_SIGNING_CLIENT_ID }}
azure-client-secret: ${{ secrets.ARTIFACT_SIGNING_CLIENT_SECRET }}
files: ${{ github.workspace }}\deployment\WixSharpInstaller\bin\Release\net10.0-windows\c-entron Nexus.msi
- name: Verify signed installers
shell: pwsh
run: |
$files = @(
'.\deployment\centron\WebServiceSetupProject\bin\Release\c-entron Web-Service Installer.msi'
'.\deployment\centron\CentronSetupProject\bin\Release\c-entron.NET Installer.msi'
'.\deployment\WixSharpInstaller\bin\Release\net10.0-windows\c-entron Nexus.msi'
)
foreach ($file in $files) {
if (-not (Test-Path -LiteralPath $file -PathType Leaf)) {
throw "Signed installer not found: $file"
}
$signature = Get-AuthenticodeSignature -LiteralPath $file
if ($signature.Status -ne 'Valid') {
throw "Invalid signature for '$file': $($signature.StatusMessage)"
}
Write-Host "Valid signature: $file"
}
- name: Package Nexus installer
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Scripts\Scripts.csproj" `
-- zip-nexus-singleFile
- name: Upload build artifacts
id: build-artifact
uses: actions/upload-artifact@v7
with:
name: centron-build
path: artifacts/
if-no-files-found: error
retention-days: 14
- name: Upload build version metadata
uses: actions/upload-artifact@v7
with:
name: centron-build-version-${{ steps.version.outputs.version }}
path: ${{ runner.temp }}/centron-build-metadata/version.txt
if-no-files-found: error
retention-days: 14
- name: Add artifact download link
shell: pwsh
run: |
"### Signed build artifacts" >> $env:GITHUB_STEP_SUMMARY
"Build version: ${{ steps.version.outputs.version }}" >> $env:GITHUB_STEP_SUMMARY
"[Download centron-build](${{ steps.build-artifact.outputs.artifact-url }})" >> $env:GITHUB_STEP_SUMMARY
upload-centron-net:
name: Upload c-entron.NET
needs: build
if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') }}
permissions:
actions: read
contents: read
id-token: write
uses: NEXOWARE-Systems/ci-cd-reusable-workflows/.github/workflows/upload-software-build.yml@main
with:
artifact_name: centron-build
source_path: c-entron.NET Installer.zip
destination_folder: c-entron.NET
destination_file: c-entron.NET Installer.zip
version: ${{ needs.build.outputs.version }}
main_version: ${{ needs.build.outputs.main_version }}
environment_name: SoftwareBuilds
azure_client_id: ${{ vars.AZURE_CLIENT_ID }}
azure_tenant_id: ${{ vars.AZURE_TENANT_ID }}
upload-web-service:
name: Upload c-entron Web Service
needs: build
if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') }}
permissions:
actions: read
contents: read
id-token: write
uses: NEXOWARE-Systems/ci-cd-reusable-workflows/.github/workflows/upload-software-build.yml@main
with:
artifact_name: centron-build
source_path: c-entron Web-Service Installer.zip
destination_folder: c-entron Web-Service
destination_file: c-entron Web-Service Installer.zip
version: ${{ needs.build.outputs.version }}
main_version: ${{ needs.build.outputs.main_version }}
environment_name: SoftwareBuilds
azure_client_id: ${{ vars.AZURE_CLIENT_ID }}
azure_tenant_id: ${{ vars.AZURE_TENANT_ID }}
upload-nexus:
name: Upload c-entron Nexus
needs: build
if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') }}
permissions:
actions: read
contents: read
id-token: write
uses: NEXOWARE-Systems/ci-cd-reusable-workflows/.github/workflows/upload-software-build.yml@main
with:
artifact_name: centron-build
source_path: c-entron Nexus Installer.zip
destination_folder: c-entron Nexus
destination_file: c-entron Nexus Installer.zip
version: ${{ needs.build.outputs.version }}
main_version: ${{ needs.build.outputs.main_version }}
environment_name: SoftwareBuilds
azure_client_id: ${{ vars.AZURE_CLIENT_ID }}
azure_tenant_id: ${{ vars.AZURE_TENANT_ID }}
@@ -0,0 +1,117 @@
name: Clean up closed PR artifacts
on:
pull_request_target:
types:
- closed
permissions:
actions: write
pull-requests: read
jobs:
delete-artifacts:
name: Delete PR artifacts
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Delete artifacts from PR workflow runs
uses: actions/github-script@v9
with:
script: |
const { owner, repo } = context.repo;
const pullRequest = context.payload.pull_request;
const workflowRuns = await github.paginate(
github.rest.actions.listWorkflowRunsForRepo,
{
owner,
repo,
event: 'pull_request',
branch: pullRequest.head.ref,
per_page: 100
}
);
const pullRequestRuns = [];
const associatedPullRequestsBySha = new Map();
for (const run of workflowRuns) {
if (!associatedPullRequestsBySha.has(run.head_sha)) {
const associatedPullRequests = await github.paginate(
github.rest.repos.listPullRequestsAssociatedWithCommit,
{
owner,
repo,
commit_sha: run.head_sha,
per_page: 100
}
);
associatedPullRequestsBySha.set(run.head_sha, associatedPullRequests);
}
const belongsToPullRequest = associatedPullRequestsBySha
.get(run.head_sha)
.some(pr => pr.number === pullRequest.number);
if (belongsToPullRequest) {
pullRequestRuns.push(run);
}
}
let deletedArtifacts = 0;
let deletedBytes = 0;
for (const run of pullRequestRuns) {
const artifacts = await github.paginate(
github.rest.actions.listWorkflowRunArtifacts,
{
owner,
repo,
run_id: run.id,
per_page: 100
}
);
for (const artifact of artifacts) {
if (artifact.expired) {
core.info(`Skipping expired artifact ${artifact.name} (${artifact.id}).`);
continue;
}
try {
await github.rest.actions.deleteArtifact({
owner,
repo,
artifact_id: artifact.id
});
deletedArtifacts += 1;
deletedBytes += artifact.size_in_bytes;
core.info(`Deleted artifact ${artifact.name} (${artifact.id}).`);
} catch (error) {
if (error.status === 404) {
core.info(`Artifact ${artifact.name} (${artifact.id}) was already deleted.`);
continue;
}
throw error;
}
}
}
const deletedMiB = (deletedBytes / 1024 / 1024).toFixed(1);
core.info(
`Deleted ${deletedArtifacts} artifact(s) (${deletedMiB} MiB) ` +
`from ${pullRequestRuns.length} workflow run(s) for PR #${pullRequest.number}.`
);
await core.summary
.addHeading('PR artifact cleanup')
.addRaw(`Pull request: #${pullRequest.number}`, true)
.addRaw(`Workflow runs inspected: ${pullRequestRuns.length}`, true)
.addRaw(`Artifacts deleted: ${deletedArtifacts}`, true)
.addRaw(`Storage released: ${deletedMiB} MiB`, true)
.write();
@@ -0,0 +1,269 @@
name: Regression tests
on:
workflow_dispatch:
pull_request:
branches:
- main
- 'release/**'
push:
branches:
- main
- 'release/**'
permissions:
contents: read
# Supersede in-flight runs of this workflow for the same pull request. Pushes to main and
# release branches are excluded so every commit there still gets a full, recorded result.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
regression-tests:
name: End-to-end regression tests
runs-on: ubuntu-24.04
timeout-minutes: 180
env:
DOTNET_NOLOGO: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DevExpress_License: ${{ secrets.DEVEXPRESS_LICENSE }}
ACR_USERNAME: ${{ secrets.ACR_USERNAME }}
ACR_PASSWORD: ${{ secrets.ACR_PASSWORD }}
DB_USERNAME: sa
DB_PASSWORD: SA!password
DB_PORT: 1433
steps:
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0
# Verifier.OverrideExpectedFiles = true rewrites the expected files instead of comparing
# against them, so a test that keeps the flag silently verifies nothing. It is only meant
# to be set temporarily while regenerating snapshots and must never be committed.
- name: Check for committed OverrideExpectedFiles
shell: pwsh
run: |
$violations = foreach ($file in Get-ChildItem -Path ./tests -Recurse -Filter *.cs) {
$segments = $file.FullName -split '[\\/]'
if ($segments -contains 'bin' -or $segments -contains 'obj') { continue }
$text = Get-Content -LiteralPath $file.FullName -Raw
if ([string]::IsNullOrEmpty($text)) { continue }
# Blank out block comments, keeping newlines so reported line numbers stay correct.
$text = [regex]::Replace($text, '(?s)/\*.*?\*/', { param($m) $m.Value -replace '[^\r\n]', '' })
$lineNumber = 0
foreach ($line in $text -split '\r?\n') {
$lineNumber++
# The assignment must start the line, optionally behind a dotted receiver such as
# this.Verifier. - anything else in front (other code, // or /// ) means it is not a
# statement. Deliberately not stripping // comments: that would also cut a real
# assignment that follows a string containing '//', turning a false positive into a
# false negative.
if ($line -match '^\s*(?:[A-Za-z_][A-Za-z0-9_.]*\.)?OverrideExpectedFiles\s*=\s*true') {
[pscustomobject]@{ Path = $file.FullName; Line = $lineNumber }
}
}
}
if ($violations) {
foreach ($violation in $violations) {
Write-Host "::error file=$($violation.Path),line=$($violation.Line)::Remove 'OverrideExpectedFiles = true' before committing - the test compares nothing while it is set."
}
throw "Found $(@($violations).Count) committed 'OverrideExpectedFiles = true' assignment(s). Regenerate the expected files locally, then remove the flag."
}
Write-Host 'No committed OverrideExpectedFiles assignments found.'
- name: Set up .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x
- name: Verify test environment
shell: pwsh
run: |
$sdkVersion = dotnet --version
if ($LASTEXITCODE -ne 0 -or $sdkVersion -notmatch '^10\.0\.') {
throw "Expected a .NET 10 SDK, but resolved '$sdkVersion'."
}
docker version
if ($LASTEXITCODE -ne 0) {
throw 'Docker is unavailable on the self-hosted runner.'
}
- name: Sign in to Azure Container Registry
shell: pwsh
run: |
if ([string]::IsNullOrWhiteSpace($env:ACR_USERNAME) -or
[string]::IsNullOrWhiteSpace($env:ACR_PASSWORD)) {
throw 'ACR_USERNAME and ACR_PASSWORD secrets are required on GitHub-hosted runners.'
}
$env:ACR_PASSWORD | docker login centron.azurecr.io --username $env:ACR_USERNAME --password-stdin
if ($LASTEXITCODE -ne 0) {
throw 'Azure Container Registry login failed.'
}
# Superseded runs are now cancelled mid-test. "Stop regression database" below uses
# if: always() and therefore still runs on cancellation, but a hard runner failure can
# leave a container behind. Drop anything older than the job timeout so leftovers cannot
# pile up on the self-hosted runner. Younger containers may belong to a concurrent run of
# another pull request and are left alone.
- name: Remove stale regression containers
continue-on-error: true
shell: pwsh
run: |
$cutoff = (Get-Date).ToUniversalTime().AddHours(-4)
# The docker name filter is a regex over a substring, so an unanchored pattern would
# also match something like backup-centron-regression-db. '^/?' anchors it and works
# whether the daemon matches the bare name or the internal '/name'.
foreach ($id in @(docker ps --all --quiet --filter 'name=^/?centron-regression-')) {
if ([string]::IsNullOrWhiteSpace($id)) { continue }
$parts = (docker inspect --format '{{.Name}}|{{.Created}}' $id) -split '\|', 2
if ($parts.Count -ne 2) { continue }
$name = $parts[0].TrimStart('/')
$created = $parts[1]
# Second guard: this force-removes containers, so never act on a name that does not
# actually carry the prefix, whatever the daemon's filter semantics happen to be.
if (-not $name.StartsWith('centron-regression-')) { continue }
$parsed = [datetime]::MinValue
$isParsed = [datetime]::TryParse(
$created,
[cultureinfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::AdjustToUniversal,
[ref] $parsed)
if ($isParsed -and $parsed -lt $cutoff) {
Write-Host "Removing stale regression container $name created at $created."
docker rm --force $id | Out-Null
}
}
$global:LASTEXITCODE = 0
- name: Start regression database
shell: pwsh
run: |
$containerName = "centron-regression-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT".ToLowerInvariant()
"DB_CONTAINER_NAME=$containerName" >> $env:GITHUB_ENV
docker pull centron.azurecr.io/centron_db/regression_tests:latest
if ($LASTEXITCODE -ne 0) {
throw 'Could not pull the regression database image.'
}
docker run --detach `
--name $containerName `
--env "MSSQL_SA_PASSWORD=$env:DB_PASSWORD" `
--env ACCEPT_EULA=Y `
--env MSSQL_PID=Standard `
--publish "${env:DB_PORT}:1433" `
centron.azurecr.io/centron_db/regression_tests:latest | Out-Null
if ($LASTEXITCODE -ne 0) {
throw 'Could not start the regression database container.'
}
- name: Wait for regression database
shell: pwsh
run: |
for ($attempt = 1; $attempt -le 120; $attempt++) {
$client = [Net.Sockets.TcpClient]::new()
try {
$connected = $client.ConnectAsync('localhost', [int]$env:DB_PORT).Wait(1000)
if ($connected -and $client.Connected) {
Write-Host 'Regression database is reachable.'
exit 0
}
}
catch {
# Database is still starting.
}
finally {
$client.Dispose()
}
Start-Sleep -Seconds 2
}
throw 'Regression database did not become reachable within four minutes.'
- name: Build regression tests
shell: pwsh
run: |
dotnet build `
"./tests/Centron.Tests.EndToEnd/Centron.Tests.EndToEnd.csproj" `
--configuration Release `
--framework net10.0 `
-nodeReuse:false
- name: Run regression tests
shell: pwsh
env:
CENTRON_TESTS_DATABASE_SERVER: localhost,1433
CENTRON_TESTS_DATABASE_USERNAME: sa
CENTRON_TESTS_DATABASE_PASSWORD: SA!password
DATABASE_BACKUP_PATH: /var/opt/mssql/backup/DatabaseBackup.bak
run: |
dotnet test `
"./tests/Centron.Tests.EndToEnd/Centron.Tests.EndToEnd.csproj" `
--configuration Release `
--framework net10.0 `
--no-build `
--logger "trx;LogFileName=TestResults.trx" `
--results-directory "./artifacts/EndToEndTests" `
-nodeReuse:false
- name: Capture database logs
if: always()
continue-on-error: true
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path './artifacts/EndToEndTests' | Out-Null
docker logs $env:DB_CONTAINER_NAME *>&1 |
Set-Content -LiteralPath './artifacts/EndToEndTests/database.log'
- name: Stop regression database
if: always()
continue-on-error: true
shell: pwsh
run: |
if (-not [string]::IsNullOrWhiteSpace($env:DB_CONTAINER_NAME)) {
docker rm --force $env:DB_CONTAINER_NAME 2>$null
}
$global:LASTEXITCODE = 0
- name: Upload regression results
if: always()
uses: actions/upload-artifact@v7
with:
name: regression-test-results
path: artifacts/EndToEndTests/
if-no-files-found: warn
retention-days: 14
+105
View File
@@ -0,0 +1,105 @@
name: Unit tests
on:
workflow_dispatch:
pull_request:
branches:
- main
- 'release/**'
push:
branches:
- main
- 'release/**'
permissions:
contents: read
# Supersede in-flight runs of this workflow for the same pull request. Pushes to main and
# release branches are excluded so every commit there still gets a full, recorded result.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
test:
name: ${{ matrix.display_name }}
runs-on: windows-2025
timeout-minutes: 120
strategy:
fail-fast: false
matrix:
include:
- name: backend-bl
display_name: Backend BL tests
project: .\tests\backend\Centron.Tests.BL\Centron.Tests.BL.csproj
results_directory: artifacts/tests/backend/bl
- name: backend-dao
display_name: Backend DAO tests
project: .\tests\backend\Centron.Tests.DAO\Centron.Tests.DAO.csproj
results_directory: artifacts/tests/backend/dao
- name: shared-core
display_name: Shared Core tests
project: .\tests\shared\Centron.Tests.Core\Centron.Tests.Core.csproj
results_directory: artifacts/tests/shared/core
- name: nexus
display_name: Nexus tests
project: .\tests\CentronNexusTests\CentronNexusTests.csproj
results_directory: artifacts/tests/nexus
env:
DOTNET_NOLOGO: true
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
CENTRON_BUILD_IS_DEV_BUILD: true
DevExpress_License: ${{ secrets.DEVEXPRESS_LICENSE }}
steps:
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Set up .NET SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x
- name: Verify .NET SDK
shell: pwsh
run: |
$sdkVersion = dotnet --version
if ($LASTEXITCODE -ne 0 -or $sdkVersion -notmatch '^10\.0\.') {
throw "Expected a .NET 10 SDK, but resolved '$sdkVersion'."
}
Write-Host "Resolved .NET SDK: $sdkVersion"
- name: Set build version
shell: pwsh
run: |
dotnet run `
--project ".\scripts\Centron.Scripts\Centron.Scripts.csproj" `
-- setup-versioning
- name: Run tests
shell: pwsh
run: |
dotnet test "${{ matrix.project }}" `
--configuration Release `
--framework net10.0 `
--logger "trx;LogFileName=TestResults.trx" `
--results-directory "${{ matrix.results_directory }}" `
-nodeReuse:false
- name: Upload test results
if: always()
uses: actions/upload-artifact@v7
with:
name: test-results-${{ matrix.name }}
path: ${{ matrix.results_directory }}/TestResults.trx
if-no-files-found: warn
retention-days: 14
+404
View File
@@ -0,0 +1,404 @@
# Created by https://www.gitignore.io/api/visualstudio
# Edit at https://www.gitignore.io/?templates=visualstudio
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*.lscache
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# End of https://www.gitignore.io/api/visualstudio
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/.idea
# c-entron Custom Ignores
!src/backend/Centron.Entities/Entities/Import/Log
/deployment/centron/CentronSetupProject/Files
/deployment/centron/WebServiceSetupProject/Files
/deployment/riverbird/RiverbirdWebserviceSetup/Files
/dotnettools
*actual.txt
*AnalyticsUserId.txt
!/nugets/*.nupkg
/.claude/settings.local.json
kind-pike
/.claude/worktrees
BlazorServer/wwwroot/js/index.bundle.js
BlazorServer/NpmJS/src/*.js
BlazorServer/NpmJS/src/*.js.map
BlazorServer/NpmJS/package-lock.json
src/CentronNexus/ProjectManagement/NpmJS/src/*.js
src/CentronNexus/ProjectManagement/NpmJS/src/*.js.map
src/CentronNexus/ProjectManagement/NpmJS/package-lock.json
src/CentronNexus/wwwroot/js/*.bundle.js
src/CentronNexus/Shared/Scripts/src/*.js
src/CentronNexus/Shared/Scripts/src/*.js.map
src/CentronNexus/Shared/Scripts/package-lock.json
/deployment/WixSharpInstaller/Files
/src/CentronNexus/.config/dotnet-tools.json
/src/CentronNexus/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/
/.windows-mcp
+26
View File
@@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/src/centron/Centron.WPF.UI/bin/Debug/net8.0-windows/c-entron 2.0.dll",
"args": [],
"cwd": "${workspaceFolder}/src/centron/Centron.WPF.UI",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}
+41
View File
@@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj"
],
"problemMatcher": "$msCompile"
}
]
}
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\src\backend\Centron.Interfaces\Centron.Interfaces.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,131 @@
using Centron.Api.docuFORM.Helper;
using Centron.Api.docuFORM.Models;
using Centron.Api.docuFORM.Models.Swagger;
using Centron.Api.docuFORM.Models.Swagger.Responses;
using Centron.Core;
using Centron.Core.Extensions;
using Centron.Interfaces.BL;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM
{
public class DocuFormRestApiClient : IDocuFormApiClient, IDisposable
{
#region Fields
private readonly HttpClient _httpClient;
private bool _disposed = false;
#endregion
#region Ctor
public DocuFormRestApiClient(string serverAddress)
{
try
{
var trimmedAddress = serverAddress.TrimEnd('/');
var handler = new SocketsHttpHandler() { MaxConnectionsPerServer = 20 };
this._httpClient = new HttpClient(handler) { BaseAddress = new Uri(trimmedAddress) };
this._httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
catch(Exception ex)
{
throw new Exception($"Fehler beim Initalisieren des HTTP-Clients für folgende Adresse \"{serverAddress}\"!{Environment.NewLine}{ex.Message}");
}
}
#endregion
#region Methods
public async Task<string> RequestAuthorization(AuthCodeRequest authCodeRequest)
{
Guard.NotNull(authCodeRequest, nameof(authCodeRequest));
var requestUrl = DocuFormRequestHelper.CreateAuthorizationRequestURI(authCodeRequest);
var response = await this._httpClient.GetAsync(requestUrl);
var contentString = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException($"Fehler während der Authorisierung bei docuFORM: {contentString}");
return contentString;
}
public async Task<AuthTokenResponse> RequestToken(AuthTokenRequest tokenRequest)
{
Guard.NotNull(tokenRequest, nameof(tokenRequest));
var paremeters = DocuFormRequestHelper.RequestToParameters(tokenRequest);
var request = new HttpRequestMessage(HttpMethod.Post, DocuFormRestApiConstants._endpointAuthToken)
{
Content = new FormUrlEncodedContent(paremeters)
};
var response = await this._httpClient.SendAsync(request);
var responseContentString = await response.ReadContentAndThrowIfError();
var authToken = JsonSerializer.Deserialize<AuthTokenResponse>(responseContentString);
if(authToken == null)
throw new HttpRequestException($"No auth token was received!");
return authToken;
}
public async Task<Result<DevicesResponse>> GetAllDevices(string token)
{
var requestUri = DocuFormRestApiConstants._endpointDevices;
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
var response = await this._httpClient.SendRequestWithToken(request, token);
return await response.CheckResponseAndDeserializeContent<DevicesResponse>();
}
public async Task<Result<DeviceCountersResponse>> GetDeviceCounters(string token, int deviceId, DateTime? requestedDate = null)
{
var requestUri = DocuFormRestApiConstants._endpointDevices + $"/{deviceId}/counters";
if (requestedDate.HasValue)
{
var utcDate = requestedDate.Value.ToUniversalTime();
requestUri += $"?date={utcDate.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture)}";
}
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
var response = await this._httpClient.SendRequestWithToken(request, token);
return await response.CheckResponseAndDeserializeContent<DeviceCountersResponse>();
}
#endregion
#region IDisposable Support
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed && disposing)
{
_httpClient?.Dispose();
_disposed = true;
}
}
#endregion
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Centron.Api.docuFORM
{
internal static class DocuFormRestApiConstants
{
internal static readonly string _redirectURI = "http://127.0.0.1"; // Don't ad trailing /
internal static readonly string _endpointAuthToken = "/auth/v2/token";
internal static readonly string _endpointAuthCode = "/auth/v2/authorize";
internal static readonly string _endpointDevices = "/dfmserver/v2/devices";
}
}
@@ -0,0 +1,70 @@
using Centron.Api.docuFORM.Models;
using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Helper
{
public static class DocuFormRequestHelper
{
public static string CreateAuthorizationRequestURI(AuthCodeRequest authCodeRequest, string? baseUriToAdd = null)
{
var parameters = RequestToParameterString(authCodeRequest);
var endPointAndParameters = DocuFormRestApiConstants._endpointAuthCode + "?" + parameters;
var baseUri = baseUriToAdd != null
? new Uri(baseUriToAdd)
: null;
return baseUri != null
? new Uri(baseUri, endPointAndParameters).ToString()
: endPointAndParameters;
}
public static string RequestToParameterString<T>(T request)
{
var parameters = RequestToParameters(request);
var parameterString = string.Join("&", parameters.Select(f => $"{WebUtility.UrlEncode(f.Key)}={WebUtility.UrlEncode(f.Value)}"));
return parameterString;
}
public static Dictionary<string, string> RequestToParameters<T>(T request, bool removeParameterWithoutValue = true)
{
var dict = new Dictionary<string, string>();
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
var attr = prop.GetCustomAttribute<JsonPropertyNameAttribute>();
var key = attr?.Name ?? prop.Name;
var value = prop.GetValue(request)?.ToString();
if(removeParameterWithoutValue && string.IsNullOrWhiteSpace(value))
continue;
dict[key] = value ?? string.Empty;
}
return dict;
}
public static string CreateRedirectURI(int? portNumber = null)
{
var uriBuilder = new UriBuilder(DocuFormRestApiConstants._redirectURI);
uriBuilder.Port = portNumber.HasValue && portNumber.Value > 0
? portNumber.Value
: -1;
var uri = uriBuilder.ToString();
while(uri.EndsWith("/"))
uri = uri.Substring(0, uri.Length - 1);
return uri;
}
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Text;
namespace Centron.Api.docuFORM.Helper
{
public static class HttpClientExtensions
{
public static async Task<HttpResponseMessage> SendRequestWithToken(this HttpClient httpClient, HttpRequestMessage httpRequest, string token)
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
if (httpRequest.Headers.Accept.Count == 0)
httpRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return await httpClient.SendAsync(httpRequest).ConfigureAwait(false);
}
}
}
@@ -0,0 +1,50 @@
using Centron.Api.docuFORM.Models.Swagger.Responses;
using Centron.Interfaces.BL;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Text.Json;
namespace Centron.Api.docuFORM.Helper
{
public static class HttpResponseMessageExtensions
{
public static async Task<string> ReadContentAndThrowIfError(this HttpResponseMessage? response)
{
if(response == null)
throw new HttpRequestException ($"No http response received!");
var content = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException ($"An error occured during the http request: {content}");
return content;
}
public static async Task<Result<T>> CheckResponseAndDeserializeContent<T>(this HttpResponseMessage? response)
{
try
{
if(response == null)
throw new HttpRequestException ($"No http response received!");
var content = await ReadContentAndThrowIfError(response);
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var obj = JsonSerializer.Deserialize<T>(content, options);
if(obj != null)
return Result<T>.AsSuccess(obj);
return Result<T>.AsError("Unable to deserialize object!");
}
catch (Exception ex)
{
return Result<T>.FromException(ex);
}
}
}
}
@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace Centron.Api.docuFORM.Helper
{
public static class OAuthHelper
{
// Can be used to generate a "state" or the codeVerifier for the "code challenge"
public static string GenerateRandomBase64String(int byteLength = 32)
{
byte[] randomBytes = new byte[byteLength];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomBytes);
}
// Base64 URL-safe encoding
string state = Convert.ToBase64String(randomBytes)
.Replace("+", "-")
.Replace("/", "_")
.Replace("=", "");
return state;
}
public static string GenerateCodeChallenge(string codeVerifier)
{
using (var sha256 = SHA256.Create())
{
byte[] hash = sha256.ComputeHash(Encoding.ASCII.GetBytes(codeVerifier));
string codeChallenge = Convert.ToBase64String(hash)
.Replace("+", "-")
.Replace("/", "_")
.Replace("=", "");
return codeChallenge;
}
}
}
}
@@ -0,0 +1,21 @@
using Centron.Api.docuFORM.Models;
using Centron.Api.docuFORM.Models.Swagger;
using Centron.Api.docuFORM.Models.Swagger.Responses;
using Centron.Interfaces.BL;
using System;
using System.Collections.Generic;
using System.Text;
namespace Centron.Api.docuFORM
{
public interface IDocuFormApiClient
{
public Task<string> RequestAuthorization(AuthCodeRequest authCodeRequest);
public Task<AuthTokenResponse> RequestToken(AuthTokenRequest tokenRequest);
public Task<Result<DevicesResponse>> GetAllDevices(string token);
public Task<Result<DeviceCountersResponse>> GetDeviceCounters(string token, int deviceId, DateTime? requestedDate);
}
}
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models
{
public class AuthCodeRequest
{
[JsonPropertyName("client_id")]
public string ClientId { get; set; } = string.Empty;
[JsonPropertyName("response_type")]
public string ResponseType { get; set; } = "code";
[JsonPropertyName("scope")]
public string Scope { get; set; } = string.Empty;
[JsonPropertyName("redirect_uri")]
public string RedirectUri { get; set; } = "http://127.0.0.1";
[JsonPropertyName("authMode")]
public string AuthMode { get; set; } = string.Empty;
[JsonPropertyName("state")]
public string State { get; set; } = string.Empty;
[JsonPropertyName("code_challenge_method")]
public string CodeChallengeMethod { get; set; } = "S256";
[JsonPropertyName("code_challenge")]
public string CodeChallenge { get; set; } = string.Empty;
[JsonPropertyName("infotext")]
public string InfoText { get; set; } = string.Empty;
[JsonPropertyName("username")]
public string UserName { get; set; } = string.Empty;
}
}
@@ -0,0 +1,39 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class AuthTokenRequest
{
[JsonPropertyName("grant_type")]
public string GrantType { get; set; } = string.Empty;
[JsonPropertyName("client_id")]
public string ClientId { get; set; } = string.Empty;
[JsonPropertyName("client_secret")]
public string? ClientSecret { get; set; }
[JsonPropertyName("username")]
public string? Username { get; set; }
[JsonPropertyName("password")]
public string? Password { get; set; }
[JsonPropertyName("refresh_token")]
public string? RefreshToken { get; set; }
[JsonPropertyName("code")]
public string? Code { get; set; }
[JsonPropertyName("code_verifier")]
public string? CodeVerifier { get; set; }
[JsonPropertyName("scope")]
public string? Scope { get; set; }
[JsonPropertyName("redirect_uri")]
public string? RedirectUri { get; set; }
[JsonPropertyName("client_deviceid")]
public string? ClientDeviceId { get; set; }
}
@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class AuthTokenResponse
{
[JsonPropertyName("access_token")]
public string? AccessToken { get; set; }
[JsonPropertyName("refresh_token")]
public string? RefreshToken { get; set; }
[JsonPropertyName("expires_in")]
public long ExpiresIn { get; set; }
[JsonPropertyName("token_type")]
public string? TokenType { get; set; }
[JsonPropertyName("server_api_url")]
public string? ServerApiUrl { get; set; }
[JsonPropertyName("client_api_url")]
public string? ClientApiUrl { get; set; }
[JsonPropertyName("user_id")]
public int UserId { get; set; }
}
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Customer : CustomerCreate
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("uuid")]
public string? Uuid { get; set; }
[JsonPropertyName("dealerUuid")]
public string? DealerUuid { get; set; }
[JsonPropertyName("created")]
public DateTime? Created { get; set; }
[JsonPropertyName("createdBy")]
public string? CreatedBy { get; set; }
[JsonPropertyName("restApiClientUuid")]
public string? RestApiClientUuid { get; set; }
[JsonPropertyName("lastLogin")]
public DateTime? LastLogin { get; set; }
[JsonPropertyName("productVersion")]
public string? ProductVersion { get; set; }
}
@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class CustomerCreate : CustomerUpdate
{
[JsonPropertyName("dealerId")]
public int DealerId { get; set; }
/// <summary>Customer name. Shadows <see cref="UserProperties.Name"/> (the user login name).</summary>
[JsonPropertyName("name")]
public new string Name { get; set; } = string.Empty;
}
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class CustomerDeployment
{
[JsonPropertyName("mcsCollectionUuid")]
public string? McsCollectionUuid { get; set; }
[JsonPropertyName("mcsPassword")]
public string? McsPassword { get; set; }
[JsonPropertyName("mcsOauthHost")]
public string? McsOauthHost { get; set; }
}
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class CustomerRights
{
[JsonPropertyName("dashboard")]
public bool? Dashboard { get; set; }
[JsonPropertyName("reports")]
public bool? Reports { get; set; }
[JsonPropertyName("eshop")]
public bool? Eshop { get; set; }
[JsonPropertyName("customerThresholds")]
public bool? CustomerThresholds { get; set; }
[JsonPropertyName("customerAlerts")]
public bool? CustomerAlerts { get; set; }
[JsonPropertyName("deletePrinters")]
public bool? DeletePrinters { get; set; }
[JsonPropertyName("contractManagement")]
public bool? ContractManagement { get; set; }
[JsonPropertyName("deployment")]
public bool? Deployment { get; set; }
}
@@ -0,0 +1,21 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class CustomerUpdate : UserProperties
{
[JsonPropertyName("password")]
public string? Password { get; set; }
[JsonPropertyName("submitPassword")]
public string? SubmitPassword { get; set; }
[JsonPropertyName("f2pControl")]
public string? F2pControl { get; set; }
[JsonPropertyName("rights")]
public CustomerRights? Rights { get; set; }
[JsonPropertyName("deployment")]
public CustomerDeployment? Deployment { get; set; }
}
@@ -0,0 +1,24 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Dealer : UserProperties
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("uuid")]
public string? Uuid { get; set; }
[JsonPropertyName("created")]
public DateTime? Created { get; set; }
[JsonPropertyName("createdBy")]
public string? CreatedBy { get; set; }
[JsonPropertyName("restApiClientUuid")]
public string? RestApiClientUuid { get; set; }
[JsonPropertyName("lastLogin")]
public DateTime? LastLogin { get; set; }
}
@@ -0,0 +1,73 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Device : DeviceCreate
{
// DeviceProperties (server-populated read fields)
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("uuid")]
public string? Uuid { get; set; }
[JsonPropertyName("macAddress")]
public string? MacAddress { get; set; }
[JsonPropertyName("serialNumber")]
public string? SerialNumber { get; set; }
[JsonPropertyName("ipAddress")]
public string? IpAddress { get; set; }
[JsonPropertyName("hostAddressDate")]
public DateTime? HostAddressDate { get; set; }
[JsonPropertyName("contractId")]
public int? ContractId { get; set; }
[JsonPropertyName("createdOn")]
public DeviceCreatedOn? CreatedOn { get; set; }
[JsonPropertyName("firmware")]
public string? Firmware { get; set; }
[JsonPropertyName("mibFile")]
public DeviceMibFile? MibFile { get; set; }
[JsonPropertyName("modelName")]
public string? ModelName { get; set; }
[JsonPropertyName("vendorName")]
public string? VendorName { get; set; }
[JsonPropertyName("vendorId")]
public int? VendorId { get; set; }
[JsonPropertyName("systemName")]
public string? SystemName { get; set; }
[JsonPropertyName("pageCount")]
public int? PageCount { get; set; }
[JsonPropertyName("properties")]
public List<string>? Properties { get; set; }
[JsonPropertyName("outputDimensions")]
public DeviceFeatureOutputDimensions? OutputDimensions { get; set; }
[JsonPropertyName("technicalSpecs")]
public DeviceFeatureTecSpecs? TechnicalSpecs { get; set; }
[JsonPropertyName("numOutputTrays")]
public int? NumOutputTrays { get; set; }
[JsonPropertyName("numPaperTrays")]
public int? NumPaperTrays { get; set; }
[JsonPropertyName("resolution")]
public string? Resolution { get; set; }
[JsonPropertyName("paperTrays")]
public List<DevicePaperTray>? PaperTrays { get; set; }
}
@@ -0,0 +1,24 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceCiData
{
[JsonPropertyName("articleNumber")]
public string? ArticleNumber { get; set; }
[JsonPropertyName("ciSerial")]
public string? CiSerial { get; set; }
[JsonPropertyName("exceptionFleet")]
public bool ExceptionFleet { get; set; }
[JsonPropertyName("mpsClientId")]
public string? MpsClientId { get; set; }
[JsonPropertyName("npsServerId")]
public string? NpsServerId { get; set; }
[JsonPropertyName("sla")]
public string? Sla { get; set; }
}
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceCounters
{
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("timestamp")]
public DateTime? Timestamp { get; set; }
[JsonPropertyName("standardCounters")]
public Dictionary<string, int>? StandardCounters { get; set; }
[JsonPropertyName("extendedCounters")]
public Dictionary<string, int>? ExtendedCounters { get; set; }
}
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceCreate : DeviceUpdate
{
[JsonPropertyName("dealerId")]
public int DealerId { get; set; }
[JsonPropertyName("customerId")]
public int CustomerId { get; set; }
[JsonPropertyName("hostAddress")]
public string HostAddress { get; set; } = string.Empty;
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceCreatedOn
{
[JsonPropertyName("client")]
public DateTime? Client { get; set; }
[JsonPropertyName("server")]
public DateTime? Server { get; set; }
}
@@ -0,0 +1,42 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceEvent
{
[JsonPropertyName("id")]
public int? Id { get; set; }
[JsonPropertyName("eventId")]
public string? EventId { get; set; }
[JsonPropertyName("time")]
public DateTime? Time { get; set; }
[JsonPropertyName("notified")]
public bool? Notified { get; set; }
[JsonPropertyName("clearDate")]
public DateTime? ClearDate { get; set; }
[JsonPropertyName("contractId")]
public int? ContractId { get; set; }
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("message")]
public string Message { get; set; } = string.Empty;
[JsonPropertyName("key")]
public string? Key { get; set; }
[JsonPropertyName("pageCount")]
public int? PageCount { get; set; }
[JsonPropertyName("severity")]
public string? Severity { get; set; }
[JsonPropertyName("source")]
public string? Source { get; set; }
}
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceEvents
{
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("events")]
public List<DeviceEvent>? Events { get; set; }
[JsonPropertyName("nextPageToken")]
public string? NextPageToken { get; set; }
}
@@ -0,0 +1,16 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
/// <summary>Media feed dimensions of the device.</summary>
public class DeviceFeatureOutputDimensions
{
[JsonPropertyName("maxMediaFeedDimension")]
public long? MaxMediaFeedDimension { get; set; }
[JsonPropertyName("maxMediaXFeedDimension")]
public long? MaxMediaXFeedDimension { get; set; }
[JsonPropertyName("northMargin")]
public long? NorthMargin { get; set; }
}
@@ -0,0 +1,28 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
/// <summary>Technical specifications of the device.</summary>
public class DeviceFeatureTecSpecs
{
[JsonPropertyName("copiesByDriver")]
public int? CopiesByDriver { get; set; }
[JsonPropertyName("externalPSGeneration")]
public int? ExternalPsGeneration { get; set; }
[JsonPropertyName("feedResolution")]
public int? FeedResolution { get; set; }
[JsonPropertyName("paperTrayFormatIds")]
public string? PaperTrayFormatIds { get; set; }
[JsonPropertyName("securePinPrinting")]
public string? SecurePinPrinting { get; set; }
[JsonPropertyName("supportedPDL")]
public string? SupportedPdl { get; set; }
[JsonPropertyName("xFeedResolution")]
public int? XFeedResolution { get; set; }
}
@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceFeatures
{
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("properties")]
public List<string>? Properties { get; set; }
[JsonPropertyName("outputDimensions")]
public DeviceFeatureOutputDimensions? OutputDimensions { get; set; }
[JsonPropertyName("technicalSpecs")]
public DeviceFeatureTecSpecs? TechnicalSpecs { get; set; }
[JsonPropertyName("outputTrays")]
public int? OutputTrays { get; set; }
[JsonPropertyName("paperTrays")]
public int? PaperTrays { get; set; }
[JsonPropertyName("resolution")]
public string? Resolution { get; set; }
}
@@ -0,0 +1,24 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceItem
{
[JsonPropertyName("supplyIndex")]
public int SupplyIndex { get; set; }
[JsonPropertyName("installationIncluded")]
public bool? InstallationIncluded { get; set; }
[JsonPropertyName("isRecommended")]
public bool? IsRecommended { get; set; }
[JsonPropertyName("isAttached")]
public bool? IsAttached { get; set; }
[JsonPropertyName("isOriginal")]
public bool? IsOriginal { get; set; }
[JsonPropertyName("item")]
public Item? Item { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceItemCreate : ItemCreateProperties
{
[JsonPropertyName("supplyIndex")]
public int SupplyIndex { get; set; }
[JsonPropertyName("installationIncluded")]
public bool? InstallationIncluded { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceMibFile
{
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("version")]
public string? Version { get; set; }
}
@@ -0,0 +1,22 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceNotifications
{
[JsonPropertyName("alertName")]
public string? AlertName { get; set; }
[JsonPropertyName("thresholdName")]
public string? ThresholdName { get; set; }
[JsonPropertyName("thresholdAction")]
public int? ThresholdAction { get; set; }
/// <summary>Note: the API uses "tresholdReceiver" (typo) in the write schema but "thresholdReceiver" in read.</summary>
[JsonPropertyName("thresholdReceiver")]
public string? ThresholdReceiver { get; set; }
[JsonPropertyName("thresholdSubject")]
public string? ThresholdSubject { get; set; }
}
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DevicePaperTray
{
[JsonPropertyName("index")]
public int Index { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("formatId")]
public int? FormatId { get; set; }
[JsonPropertyName("formatName")]
public string? FormatName { get; set; }
[JsonPropertyName("mediaDimX")]
public int? MediaDimX { get; set; }
[JsonPropertyName("mediaDimY")]
public int? MediaDimY { get; set; }
[JsonPropertyName("mediaLevelPcnt")]
public int? MediaLevelPcnt { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DevicePaperTrays
{
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("paperTrays")]
public List<DevicePaperTray>? PaperTrays { get; set; }
}
@@ -0,0 +1,22 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
/// <summary>SNMP configuration as returned in Device read responses.</summary>
public class DeviceSnmp
{
[JsonPropertyName("community")]
public string? Community { get; set; }
[JsonPropertyName("contextName")]
public string? ContextName { get; set; }
[JsonPropertyName("portNumber")]
public int? PortNumber { get; set; }
[JsonPropertyName("securityName")]
public string? SecurityName { get; set; }
[JsonPropertyName("version")]
public int? Version { get; set; }
}
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSnmpData
{
[JsonPropertyName("contact")]
public string? Contact { get; set; }
[JsonPropertyName("location")]
public string? Location { get; set; }
[JsonPropertyName("overwritable")]
public bool Overwritable { get; set; }
[JsonPropertyName("queriedOn")]
public DateTime? QueriedOn { get; set; }
}
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSummary
{
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("lastUpdate")]
public DateTime? LastUpdate { get; set; }
[JsonPropertyName("warning")]
public bool Warning { get; set; }
[JsonPropertyName("groups")]
public List<DeviceSummaryGroup>? Groups { get; set; }
}
@@ -0,0 +1,16 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSummaryCounterElement
{
/// <summary>Type discriminator — value is 2 for counter elements.</summary>
[JsonPropertyName("type")]
public int? Type { get; set; }
[JsonPropertyName("title")]
public string? Title { get; set; }
[JsonPropertyName("value")]
public string? Value { get; set; }
}
@@ -0,0 +1,17 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSummaryGroup
{
[JsonPropertyName("title")]
public string? Title { get; set; }
/// <summary>
/// Each element is either a <see cref="DeviceSummarySupplyElement"/> (type=1) or a
/// <see cref="DeviceSummaryCounterElement"/> (type=2). Deserialized as generic objects;
/// check the "type" field to cast accordingly.
/// </summary>
[JsonPropertyName("elements")]
public List<object>? Elements { get; set; }
}
@@ -0,0 +1,25 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSummarySupplyElement
{
/// <summary>Type discriminator — value is 1 for supply elements.</summary>
[JsonPropertyName("type")]
public int? Type { get; set; }
[JsonPropertyName("hex")]
public string? Hex { get; set; }
[JsonPropertyName("title")]
public string? Title { get; set; }
[JsonPropertyName("subtitle")]
public string? Subtitle { get; set; }
[JsonPropertyName("warning")]
public bool? Warning { get; set; }
[JsonPropertyName("value")]
public string? Value { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSupplies
{
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("supplies")]
public List<DeviceSupply>? Supplies { get; set; }
}
@@ -0,0 +1,60 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceSupply
{
[JsonPropertyName("attachedItemId")]
public int? AttachedItemId { get; set; }
[JsonPropertyName("capacity")]
public int? Capacity { get; set; }
[JsonPropertyName("class")]
public int? Class { get; set; }
[JsonPropertyName("colorant")]
public string? Colorant { get; set; }
[JsonPropertyName("index")]
public int Index { get; set; }
[JsonPropertyName("level")]
public int? Level { get; set; }
[JsonPropertyName("levelCorrectionMode")]
public string? LevelCorrectionMode { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("orderState")]
public string? OrderState { get; set; }
[JsonPropertyName("originalPartNo")]
public string? OriginalPartNo { get; set; }
[JsonPropertyName("percent")]
public int? Percent { get; set; }
[JsonPropertyName("remainingPages")]
public int? RemainingPages { get; set; }
[JsonPropertyName("remainingDays")]
public int? RemainingDays { get; set; }
[JsonPropertyName("thresholdReached")]
public bool? ThresholdReached { get; set; }
[JsonPropertyName("timestamp")]
public DateTime? Timestamp { get; set; }
[JsonPropertyName("type")]
public int? Type { get; set; }
[JsonPropertyName("unit")]
public int? Unit { get; set; }
[JsonPropertyName("value")]
public string? Value { get; set; }
}
@@ -0,0 +1,78 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceUpdate
{
[JsonPropertyName("isActive")]
public bool? IsActive { get; set; }
[JsonPropertyName("isManaged")]
public bool? IsManaged { get; set; }
[JsonPropertyName("isLicensed")]
public bool? IsLicensed { get; set; }
[JsonPropertyName("assetNumber")]
public string? AssetNumber { get; set; }
[JsonPropertyName("cardReaderAddress")]
public string? CardReaderAddress { get; set; }
[JsonPropertyName("ciid")]
public string? Ciid { get; set; }
[JsonPropertyName("ciData")]
public DeviceCiData? CiData { get; set; }
[JsonPropertyName("costCenter")]
public string? CostCenter { get; set; }
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("follow2Print")]
public bool? Follow2Print { get; set; }
[JsonPropertyName("information")]
public List<string>? Information { get; set; }
[JsonPropertyName("inventoryNumber")]
public string? InventoryNumber { get; set; }
[JsonPropertyName("itemDeliveryAddress")]
public string? ItemDeliveryAddress { get; set; }
[JsonPropertyName("itemDeliveryNote")]
public string? ItemDeliveryNote { get; set; }
[JsonPropertyName("itemDeliveryInformation")]
public List<string>? ItemDeliveryInformation { get; set; }
[JsonPropertyName("locationDescription")]
public string? LocationDescription { get; set; }
[JsonPropertyName("locationLevels")]
public List<string>? LocationLevels { get; set; }
[JsonPropertyName("notifications")]
public DeviceNotifications? Notifications { get; set; }
[JsonPropertyName("officePrint")]
public bool? OfficePrint { get; set; }
[JsonPropertyName("productionProcess")]
public bool? ProductionProcess { get; set; }
[JsonPropertyName("securePrint")]
public bool? SecurePrint { get; set; }
[JsonPropertyName("snmp")]
public DeviceSnmp? Snmp { get; set; }
[JsonPropertyName("snmpData")]
public DeviceSnmpData? SnmpData { get; set; }
[JsonPropertyName("warranty")]
public DeviceWarranty? Warranty { get; set; }
}
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class DeviceWarranty
{
[JsonPropertyName("start")]
public DateTime? Start { get; set; }
[JsonPropertyName("months")]
public int? Months { get; set; }
[JsonPropertyName("clicks")]
public int? Clicks { get; set; }
}
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Item : ItemCreateProperties
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("colorant")]
public string? Colorant { get; set; }
[JsonPropertyName("supplyType")]
public int? SupplyType { get; set; }
[JsonPropertyName("isColorMarker")]
public bool? IsColorMarker { get; set; }
}
@@ -0,0 +1,42 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class ItemCreateProperties
{
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("manufacturer")]
public string? Manufacturer { get; set; }
[JsonPropertyName("partNo")]
public string PartNo { get; set; } = string.Empty;
[JsonPropertyName("articleNo")]
public string ArticleNo { get; set; } = string.Empty;
[JsonPropertyName("originalPartNo")]
public string OriginalPartNo { get; set; } = string.Empty;
[JsonPropertyName("isKit")]
public bool? IsKit { get; set; }
[JsonPropertyName("pages")]
public int? Pages { get; set; }
[JsonPropertyName("percentage")]
public double? Percentage { get; set; }
[JsonPropertyName("price")]
public double? Price { get; set; }
[JsonPropertyName("currency")]
public string? Currency { get; set; }
[JsonPropertyName("unit")]
public string? Unit { get; set; }
}
@@ -0,0 +1,35 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class JobCreate
{
[JsonPropertyName("ipAddress")]
public string IpAddress { get; set; } = string.Empty;
[JsonPropertyName("cardId")]
public string CardId { get; set; } = string.Empty;
/// <summary>1=SmartCard, 2=PIN, 3=Fingerprint, 4=Username.</summary>
[JsonPropertyName("cardType")]
public int CardType { get; set; }
[JsonPropertyName("jobName")]
public string JobName { get; set; } = string.Empty;
[JsonPropertyName("billingCode")]
public int? BillingCode { get; set; }
/// <summary>20=Copies, 21=Scan, 22=Fax.</summary>
[JsonPropertyName("dataType")]
public int DataType { get; set; }
[JsonPropertyName("stapled")]
public bool? Stapled { get; set; }
[JsonPropertyName("punched")]
public bool? Punched { get; set; }
[JsonPropertyName("paperInfos")]
public List<JobCreatePaperInfo>? PaperInfos { get; set; }
}
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class JobCreatePaperInfo
{
[JsonPropertyName("paperTray")]
public int? PaperTray { get; set; }
[JsonPropertyName("windowsPaperSize")]
public int? WindowsPaperSize { get; set; }
[JsonPropertyName("paperWidth")]
public int? PaperWidth { get; set; }
[JsonPropertyName("paperHeight")]
public int? PaperHeight { get; set; }
[JsonPropertyName("pagesSimplexBw")]
public int PagesSimplexBw { get; set; }
[JsonPropertyName("pagesDuplexBw")]
public int PagesDuplexBw { get; set; }
[JsonPropertyName("pagesSimplexColor")]
public int PagesSimplexColor { get; set; }
[JsonPropertyName("pagesDuplexColor")]
public int PagesDuplexColor { get; set; }
}
@@ -0,0 +1,51 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class JobRead
{
[JsonPropertyName("access")]
public bool Access { get; set; }
[JsonPropertyName("balance")]
public double? Balance { get; set; }
[JsonPropertyName("billing")]
public bool? Billing { get; set; }
[JsonPropertyName("billingId")]
public int? BillingId { get; set; }
[JsonPropertyName("budget")]
public double? Budget { get; set; }
[JsonPropertyName("clickTimeout")]
public int? ClickTimeout { get; set; }
[JsonPropertyName("currency")]
public string? Currency { get; set; }
[JsonPropertyName("email")]
public string? Email { get; set; }
[JsonPropertyName("fullName")]
public string? FullName { get; set; }
[JsonPropertyName("maxTotalCount")]
public int? MaxTotalCount { get; set; }
[JsonPropertyName("maxColorCount")]
public int? MaxColorCount { get; set; }
[JsonPropertyName("private")]
public bool? Private { get; set; }
[JsonPropertyName("senseTimeout")]
public int? SenseTimeout { get; set; }
[JsonPropertyName("userId")]
public int? UserId { get; set; }
[JsonPropertyName("userName")]
public string? UserName { get; set; }
}
@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class MpsClient
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("uuid")]
public string? Uuid { get; set; }
[JsonPropertyName("dealerId")]
public int DealerId { get; set; }
[JsonPropertyName("clientApiUrl")]
public string? ClientApiUrl { get; set; }
[JsonPropertyName("lastTransfer")]
public DateTime? LastTransfer { get; set; }
[JsonPropertyName("lastUpdate")]
public DateTime? LastUpdate { get; set; }
[JsonPropertyName("lastUpdateQuery")]
public DateTime? LastUpdateQuery { get; set; }
}
@@ -0,0 +1,67 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Order
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("orderNumber")]
public string? OrderNumber { get; set; }
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("supplyIndex")]
public int? SupplyIndex { get; set; }
[JsonPropertyName("quantity")]
public int? Quantity { get; set; }
[JsonPropertyName("purchaseRequisitionNumber")]
public string? PurchaseRequisitionNumber { get; set; }
[JsonPropertyName("installationIncluded")]
public bool? InstallationIncluded { get; set; }
[JsonPropertyName("note")]
public string? Note { get; set; }
[JsonPropertyName("orderDate")]
public DateTime? OrderDate { get; set; }
[JsonPropertyName("orderedBy")]
public string? OrderedBy { get; set; }
[JsonPropertyName("deliveryDate")]
public DateTime? DeliveryDate { get; set; }
[JsonPropertyName("address")]
public string? Address { get; set; }
[JsonPropertyName("deliveryNotes")]
public List<string>? DeliveryNotes { get; set; }
[JsonPropertyName("supplierInfoUrl")]
public string? SupplierInfoUrl { get; set; }
[JsonPropertyName("item")]
public Item? Item { get; set; }
/// <summary>Current order state: notAvailable, proposed, placed, confirmed, shipped, delivered, completed.</summary>
[JsonPropertyName("state")]
public string? State { get; set; }
[JsonPropertyName("requestDate")]
public DateTime? RequestDate { get; set; }
[JsonPropertyName("requestedBy")]
public string? RequestedBy { get; set; }
[JsonPropertyName("mountDate")]
public DateTime? MountDate { get; set; }
[JsonPropertyName("shipmentInfo")]
public OrderShipmentInfo? ShipmentInfo { get; set; }
}
@@ -0,0 +1,64 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class OrderCreate
{
// Required fields
[JsonPropertyName("deviceId")]
public int DeviceId { get; set; }
[JsonPropertyName("supplyIndex")]
public int SupplyIndex { get; set; }
[JsonPropertyName("quantity")]
public int Quantity { get; set; }
/// <summary>Required. Allowed values: placed, confirmed, shipped, delivered.</summary>
[JsonPropertyName("state")]
public string State { get; set; } = string.Empty;
// Item identification (at least one required)
[JsonPropertyName("itemId")]
public int? ItemId { get; set; }
[JsonPropertyName("articleNo")]
public string? ArticleNo { get; set; }
[JsonPropertyName("partNo")]
public string? PartNo { get; set; }
// Order details
[JsonPropertyName("orderNumber")]
public string? OrderNumber { get; set; }
[JsonPropertyName("purchaseRequisitionNumber")]
public string? PurchaseRequisitionNumber { get; set; }
[JsonPropertyName("installationIncluded")]
public bool? InstallationIncluded { get; set; }
[JsonPropertyName("note")]
public string? Note { get; set; }
[JsonPropertyName("orderDate")]
public DateTime? OrderDate { get; set; }
[JsonPropertyName("orderedBy")]
public string? OrderedBy { get; set; }
[JsonPropertyName("deliveryDate")]
public DateTime? DeliveryDate { get; set; }
[JsonPropertyName("address")]
public string? Address { get; set; }
[JsonPropertyName("deliveryNotes")]
public List<string>? DeliveryNotes { get; set; }
[JsonPropertyName("supplierInfoUrl")]
public string? SupplierInfoUrl { get; set; }
[JsonPropertyName("shipmentInfo")]
public OrderShipmentInfo? ShipmentInfo { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class OrderShipmentInfo
{
[JsonPropertyName("text")]
public string? Text { get; set; }
[JsonPropertyName("url")]
public string? Url { get; set; }
}
@@ -0,0 +1,16 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class OrderUpdate
{
/// <summary>Allowed values: notAvailable, confirmed, shipped, delivered.</summary>
[JsonPropertyName("state")]
public string? State { get; set; }
[JsonPropertyName("deliveryDate")]
public DateTime? DeliveryDate { get; set; }
[JsonPropertyName("shipmentInfo")]
public OrderShipmentInfo? ShipmentInfo { get; set; }
}
@@ -0,0 +1,21 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class ResourceGroups
{
[JsonPropertyName("contract")]
public Dictionary<string, string>? Contract { get; set; }
[JsonPropertyName("delivery")]
public Dictionary<string, string>? Delivery { get; set; }
[JsonPropertyName("device")]
public Dictionary<string, string>? Device { get; set; }
[JsonPropertyName("location")]
public Dictionary<string, string>? Location { get; set; }
[JsonPropertyName("system")]
public Dictionary<string, string>? System { get; set; }
}
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Resources
{
[JsonPropertyName("language")]
public string? Language { get; set; }
[JsonPropertyName("groups")]
public ResourceGroups? Groups { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class ClientsResponse
{
[JsonPropertyName("clients")]
public List<MpsClient>? Clients { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class CustomerResponse
{
[JsonPropertyName("customer")]
public Customer? Customer { get; set; }
}
@@ -0,0 +1,13 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class CustomersResponse
{
[JsonPropertyName("customers")]
public List<Customer>? Customers { get; set; }
[JsonPropertyName("nextPageToken")]
public string? NextPageToken { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DealerResponse
{
[JsonPropertyName("dealer")]
public Dealer? Dealer { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DealersResponse
{
[JsonPropertyName("dealers")]
public List<Dealer>? Dealers { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceCountersResponse
{
[JsonPropertyName("deviceCounters")]
public DeviceCounters? DeviceCounters { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceEventsResponse
{
[JsonPropertyName("deviceEvents")]
public DeviceEvents? DeviceEvents { get; set; }
}
@@ -0,0 +1,11 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceFeaturesResponse
{
/// <summary>Note: the API response uses the capitalized key "DeviceFeatures".</summary>
[JsonPropertyName("DeviceFeatures")]
public DeviceFeatures? DeviceFeatures { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceItemResponse
{
[JsonPropertyName("deviceItem")]
public DeviceItem? DeviceItem { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceItemsResponse
{
[JsonPropertyName("deviceItems")]
public List<DeviceItem>? DeviceItems { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DevicePaperTraysResponse
{
[JsonPropertyName("devicePaperTrays")]
public DevicePaperTrays? DevicePaperTrays { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceResponse
{
[JsonPropertyName("device")]
public Device? Device { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DeviceSuppliesResponse
{
[JsonPropertyName("deviceSupplies")]
public DeviceSupplies? DeviceSupplies { get; set; }
}
@@ -0,0 +1,16 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class DevicesResponse
{
[JsonPropertyName("devices")]
public List<Device>? Devices { get; set; }
[JsonPropertyName("lastHostAddressChangeOn")]
public string? LastHostAddressChangeOn { get; set; }
[JsonPropertyName("nextPageToken")]
public string? NextPageToken { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class OrderResponse
{
[JsonPropertyName("order")]
public Order? Order { get; set; }
}
@@ -0,0 +1,13 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class OrdersResponse
{
[JsonPropertyName("orders")]
public List<Order>? Orders { get; set; }
[JsonPropertyName("nextPageToken")]
public string? NextPageToken { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class ResourcesResponse
{
[JsonPropertyName("resources")]
public List<Resources>? Resources { get; set; }
}
@@ -0,0 +1,10 @@
using Centron.Api.docuFORM.Models.Swagger;
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger.Responses;
public class VendorsResponse
{
[JsonPropertyName("vendors")]
public List<Vendor>? Vendors { get; set; }
}
@@ -0,0 +1,45 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class UserProperties
{
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("isAdmin")]
public bool IsAdmin { get; set; }
[JsonPropertyName("isLocked")]
public bool IsLocked { get; set; }
[JsonPropertyName("isReadOnly")]
public bool IsReadOnly { get; set; }
[JsonPropertyName("trialUntil")]
public DateTime? TrialUntil { get; set; }
[JsonPropertyName("validUntil")]
public DateTime? ValidUntil { get; set; }
[JsonPropertyName("fullName")]
public string? FullName { get; set; }
[JsonPropertyName("eMail")]
public string? EMail { get; set; }
[JsonPropertyName("referenceNumber")]
public string? ReferenceNumber { get; set; }
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("street")]
public string? Street { get; set; }
[JsonPropertyName("zip")]
public string? Zip { get; set; }
[JsonPropertyName("city")]
public string? City { get; set; }
}
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Centron.Api.docuFORM.Models.Swagger;
public class Vendor
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("smiPEN")]
public int SmiPen { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
}
+828
View File
@@ -0,0 +1,828 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.3.11527.330 d18.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{2673DB6C-17D0-4215-A743-FF856058E5E7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deployment", "deployment", "{426F4A65-49AE-4BE3-8840-502211B24EBD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution items", "solution items", "{ECEB3622-444D-4E12-B839-890D9699A1B4}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitignore = .gitignore
Directory.Build.props = Directory.Build.props
global.json = global.json
nuget.config = nuget.config
StrongNamingKeyFile.snk = StrongNamingKeyFile.snk
EndProjectSection
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "CentronSetupProject", "deployment\centron\CentronSetupProject\CentronSetupProject.wixproj", "{651E9627-5EB4-40A7-A9C5-042D529697B3}"
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "WebServiceSetupProject", "deployment\centron\WebServiceSetupProject\WebServiceSetupProject.wixproj", "{8F65595B-29B0-461F-840E-37091F53046E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "backend", "backend", "{63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "centron", "centron", "{94BFF10D-755B-44FC-BB07-911607A4F08D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "webservice", "webservice", "{DF32298B-4D77-4987-8613-6B3BC459945A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.BL", "src\backend\Centron.BL\Centron.BL.csproj", "{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Common", "src\backend\Centron.Common\Centron.Common.csproj", "{41555800-1544-4180-8FA5-F55422743DFD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.DAO", "src\backend\Centron.DAO\Centron.DAO.csproj", "{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Entities", "src\backend\Centron.Entities\Centron.Entities.csproj", "{BCE70684-DE69-4335-8051-21DE138EE341}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Gateway", "src\backend\Centron.Gateway\Centron.Gateway.csproj", "{40EAE244-51C4-4744-A087-927520F6615D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Interfaces", "src\backend\Centron.Interfaces\Centron.Interfaces.csproj", "{7CCA19D0-4F32-4710-9678-9507EA5B00C3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.WPF.UI", "src\centron\Centron.WPF.UI\Centron.WPF.UI.csproj", "{C0BD1754-6702-4BB6-BA25-7381988CFE7B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.WPF.UI.Extension", "src\centron\Centron.WPF.UI.Extension\Centron.WPF.UI.Extension.csproj", "{869E518C-A7AB-4F06-86D1-F96E8689AF6D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Host", "src\webservice\Centron.Host\Centron.Host.csproj", "{82E76759-E338-46A0-AAC7-69D0294A808F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Host.Console", "src\webservice\Centron.Host.Console\Centron.Host.Console.csproj", "{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Host.WindowsService", "src\webservice\Centron.Host.WindowsService\Centron.Host.WindowsService.csproj", "{8632D0F9-09CC-4358-8EAE-91ACABF21C23}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "c-entron.misc.ConnectionManager", "src\webservice\c-entron.misc.ConnectionManager\c-entron.misc.ConnectionManager.csproj", "{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.WebServices.Core", "src\webservice\Centron.WebServices.Core\Centron.WebServices.Core.csproj", "{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assemblies", "assemblies", "{0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "7pdf", "7pdf", "{6CA9C833-1499-4FD6-AF15-DFD3672DCCF3}"
ProjectSection(SolutionItems) = preProject
assemblies\7pdf\pdf7.PDFWriter.dll = assemblies\7pdf\pdf7.PDFWriter.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tapi", "tapi", "{BB481EF5-B85B-4D09-BA4A-EB325D81D273}"
ProjectSection(SolutionItems) = preProject
assemblies\tapi\README.md = assemblies\tapi\README.md
assemblies\tapi\Traysoft.AddTapi.dll = assemblies\tapi\Traysoft.AddTapi.dll
assemblies\tapi\Traysoft.Internal.dll = assemblies\tapi\Traysoft.Internal.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wpf", "wpf", "{E6F7AB8B-1796-4639-B742-6C60F5E787C3}"
ProjectSection(SolutionItems) = preProject
assemblies\wpf\Centron.WPF.MetroTheme.dll = assemblies\wpf\Centron.WPF.MetroTheme.dll
assemblies\wpf\Centron.WPF.Theme.dll = assemblies\wpf\Centron.WPF.Theme.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{36C8A994-A96E-48D7-A36C-80AB4D85548A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Scripts", "scripts\Centron.Scripts\Centron.Scripts.csproj", "{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{2F71ED3A-FF09-4148-BEBA-FE06257EFCE4}"
ProjectSection(SolutionItems) = preProject
docs\.order = docs\.order
docs\README.md = docs\README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "getting-started", "getting-started", "{01F71AAA-B574-490A-A241-E905C4E4F358}"
ProjectSection(SolutionItems) = preProject
docs\getting-started\documentation-rules.md = docs\getting-started\documentation-rules.md
docs\getting-started\general-structure.md = docs\getting-started\general-structure.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "guides", "guides", "{14A535B2-736F-4BF8-9A8C-D8AF78D028E9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "development", "development", "{E65BC114-9ABA-44EA-ABEC-598E9F968E24}"
ProjectSection(SolutionItems) = preProject
docs\guides\development\add-a-new-right.md = docs\guides\development\add-a-new-right.md
docs\guides\development\check-userrights.md = docs\guides\development\check-userrights.md
docs\guides\development\create-mail-templates.md = docs\guides\development\create-mail-templates.md
docs\guides\development\end-to-end-testing.md = docs\guides\development\end-to-end-testing.md
docs\guides\development\fixed-memory-leaks.md = docs\guides\development\fixed-memory-leaks.md
docs\guides\development\settings-management.md = docs\guides\development\settings-management.md
docs\guides\development\xrechnung.md = docs\guides\development\xrechnung.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "database", "database", "{6DB9540C-9A72-4494-81C3-254BC21214BF}"
ProjectSection(SolutionItems) = preProject
docs\guides\database\create-scripts.md = docs\guides\database\create-scripts.md
docs\guides\database\database-conventions.md = docs\guides\database\database-conventions.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ui", "ui", "{AFE4AB7B-ADC3-4C26-8CCA-20ADC52C637C}"
ProjectSection(SolutionItems) = preProject
docs\guides\ui\create-dialog.md = docs\guides\ui\create-dialog.md
docs\guides\ui\create-module.md = docs\guides\ui\create-module.md
docs\guides\ui\create-settings-page.md = docs\guides\ui\create-settings-page.md
docs\guides\ui\localization.md = docs\guides\ui\localization.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{414CAEBF-64D9-4778-9A59-07C2425B3BB3}"
ProjectSection(SolutionItems) = preProject
docs\guides\services\add-webservice-methods.md = docs\guides\services\add-webservice-methods.md
docs\guides\services\web-service-on-linux.md = docs\guides\services\web-service-on-linux.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "reference", "reference", "{CEFF7840-35A3-4743-B7D5-A58798BF3911}"
ProjectSection(SolutionItems) = preProject
docs\reference\zugferd-feldzuordnung-anwender.md = docs\reference\zugferd-feldzuordnung-anwender.md
docs\reference\zugferd-field-mapping.md = docs\reference\zugferd-field-mapping.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "database", "database", "{8D62EB3E-A0D0-45E5-B0A6-03DABF4CAC47}"
ProjectSection(SolutionItems) = preProject
docs\reference\database\script-rules.md = docs\reference\database\script-rules.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "security", "security", "{94F8A20A-8A42-4433-B770-3775986A95B1}"
ProjectSection(SolutionItems) = preProject
docs\reference\security\developer-security.md = docs\reference\security\developer-security.md
docs\reference\security\licensing-system.md = docs\reference\security\licensing-system.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "receipts", "receipts", "{A7C9E4F2-8B1D-4A5E-9F3C-1E6D2B8A9C7F}"
ProjectSection(SolutionItems) = preProject
docs\reference\receipts\actionprice-system.md = docs\reference\receipts\actionprice-system.md
docs\reference\receipts\contract-billing-rmm-article-logic.md = docs\reference\receipts\contract-billing-rmm-article-logic.md
docs\reference\receipts\contracts-backend.md = docs\reference\receipts\contracts-backend.md
docs\reference\receipts\receipt-search-architecture.md = docs\reference\receipts\receipt-search-architecture.md
docs\reference\receipts\receipts-backend-architecture.md = docs\reference\receipts\receipts-backend-architecture.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "architecture", "architecture", "{8E1F422E-AD81-4288-84AF-E73641C28765}"
ProjectSection(SolutionItems) = preProject
docs\reference\architecture\dtos-and-entities.md = docs\reference\architecture\dtos-and-entities.md
docs\reference\architecture\mvvm-in-centron.md = docs\reference\architecture\mvvm-in-centron.md
docs\reference\architecture\requests-and-responses.md = docs\reference\architecture\requests-and-responses.md
docs\reference\architecture\results-and-responses.md = docs\reference\architecture\results-and-responses.md
docs\reference\architecture\stanislaus-secret-api-documentation.md = docs\reference\architecture\stanislaus-secret-api-documentation.md
docs\reference\architecture\tapi.md = docs\reference\architecture\tapi.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "edi", "edi", "{8A440F15-AE56-4C90-A2A6-F91CFCEF1872}"
ProjectSection(SolutionItems) = preProject
docs\reference\edi\edi-architecture.md = docs\reference\edi\edi-architecture.md
docs\reference\edi\edi-import-rules.md = docs\reference\edi\edi-import-rules.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "operations", "operations", "{B778B179-7F32-45CB-BC0A-F2F8E36E639B}"
ProjectSection(SolutionItems) = preProject
docs\operations\build-server-and-automated-builds.md = docs\operations\build-server-and-automated-builds.md
docs\operations\release-stop.md = docs\operations\release-stop.md
docs\operations\update-devexpress.md = docs\operations\update-devexpress.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Tests.EndToEnd", "tests\Centron.Tests.EndToEnd\Centron.Tests.EndToEnd.csproj", "{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Tests.Integration", "tests\Centron.Tests.Integration\Centron.Tests.Integration.csproj", "{5C35456A-AD21-4F54-BF7B-D056F9E19917}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "azure", "azure", "{A9A6DCD4-47A8-43CD-A8EE-418DFF9BF4E0}"
ProjectSection(SolutionItems) = preProject
azure\analyze-pipeline.yml = azure\analyze-pipeline.yml
azure\build-pipeline.yml = azure\build-pipeline.yml
azure\build-pipeline2.yml = azure\build-pipeline2.yml
azure\docker-pipeline.yml = azure\docker-pipeline.yml
azure\regression-tests-pipeline.yml = azure\regression-tests-pipeline.yml
azure\tests-pipeline.yml = azure\tests-pipeline.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build-templates", "build-templates", "{355397CD-E4CA-49CE-ACBF-46C352324455}"
ProjectSection(SolutionItems) = preProject
azure\build-templates\build-centron-net.yaml = azure\build-templates\build-centron-net.yaml
azure\build-templates\build-nexus.yaml = azure\build-templates\build-nexus.yaml
azure\build-templates\build-web-service.yaml = azure\build-templates\build-web-service.yaml
azure\build-templates\deploy-artifacts-nuget.yaml = azure\build-templates\deploy-artifacts-nuget.yaml
azure\build-templates\deploy-artifacts-sharepoint.yaml = azure\build-templates\deploy-artifacts-sharepoint.yaml
azure\build-templates\deploy-artifacts.yaml = azure\build-templates\deploy-artifacts.yaml
azure\build-templates\versioning.yaml = azure\build-templates\versioning.yaml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apis", "apis", "{4789367D-012A-4619-B242-AB5DC832CC3B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Api.EbInterface", "src\apis\Centron.Api.EbInterface\Centron.Api.EbInterface.csproj", "{9681F92D-2759-4618-B3AC-7A036048FA38}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Api.Gls", "src\apis\Centron.Api.Gls\Centron.Api.Gls.csproj", "{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.CopDataAccess", "src\apis\Centron.APIs.CopDataAccess\Centron.APIs.CopDataAccess.csproj", "{436B30C8-32FB-469D-A528-90DCCCF76CB1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.EgisDataAccess", "src\apis\Centron.APIs.EgisDataAccess\Centron.APIs.EgisDataAccess.csproj", "{88C9107F-0275-4359-B7D7-D2F10072B1BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.IcecatDataAccess", "src\apis\Centron.APIs.IcecatDataAccess\Centron.APIs.IcecatDataAccess.csproj", "{036E8795-025A-4321-98A7-F5852A9B01B5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.ITscopeDataAccess", "src\apis\Centron.APIs.ITscopeDataAccess\Centron.APIs.ITscopeDataAccess.csproj", "{FC3E9AE7-1223-4324-B724-41419521FFC6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.FinAPI", "src\apis\Centron.APIs.FinAPI\Centron.APIs.FinAPI.csproj", "{F242AB2F-B297-4D92-9110-3B66D4E01C1A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apis", "apis", "{AEA734A6-D7BF-4700-B460-50246AF3D13F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.CopDatabase.Tests", "tests\apis\Centron.APIs.CopDatabase.Tests\Centron.APIs.CopDatabase.Tests.csproj", "{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.EgisDataAccess.Tests", "tests\apis\Centron.APIs.EgisDataAccess.Tests\Centron.APIs.EgisDataAccess.Tests.csproj", "{26E7956F-8919-441A-8CF5-EC351A9C7E7D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.IcecatDataAccess.Tests", "tests\apis\Centron.APIs.IcecatDataAccess.Tests\Centron.APIs.IcecatDataAccess.Tests.csproj", "{835D92F9-7620-4C22-B7B4-BB4C34D1664A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.APIs.ITscopeDataAccess.Tests", "tests\apis\Centron.APIs.ITscopeDataAccess.Tests\Centron.APIs.ITscopeDataAccess.Tests.csproj", "{2783863F-E24A-486A-B420-3E1125F2922D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "centron", "centron", "{37E8290B-F9FB-4EB1-92EC-9DD82D0D1F3A}"
ProjectSection(SolutionItems) = preProject
version.json = version.json
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "outlook", "outlook", "{F170B186-804F-4972-AE52-ECE8A324CB12}"
ProjectSection(SolutionItems) = preProject
assemblies\outlook\Microsoft.Office.Interop.Outlook.dll = assemblies\outlook\Microsoft.Office.Interop.Outlook.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "remote-desktop", "remote-desktop", "{7C89B4CC-2D02-4975-AAE1-100464B6E501}"
ProjectSection(SolutionItems) = preProject
assemblies\remote-desktop\AxInterop.MSTSCLib.dll = assemblies\remote-desktop\AxInterop.MSTSCLib.dll
assemblies\remote-desktop\Interop.MSTSCLib.dll = assemblies\remote-desktop\Interop.MSTSCLib.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{0B59FAEA-EFF2-403A-95E4-AF0729DFB5AE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Controls", "src\shared\Centron.Controls\Centron.Controls.csproj", "{850ED0CE-2FCB-4FDA-A261-ACF15813C418}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Controls.Preview", "src\shared\Centron.Controls.Preview\Centron.Controls.Preview.csproj", "{395597B8-52B5-41A8-8283-AD704555B7A4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Centron.Core", "src\shared\Centron.Core\Centron.Core.csproj", "{039C7717-C471-4687-B53C-0214DA2C914E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nugets", "nugets", "{B302E1A7-1D24-4EDF-A9E6-7C1B48E9BECA}"
ProjectSection(SolutionItems) = preProject
nugets\Centron.Help.1.0.2509.1.nupkg = nugets\Centron.Help.1.0.2509.1.nupkg
nugets\FastReport.Core.2022.1.6.nupkg = nugets\FastReport.Core.2022.1.6.nupkg
nugets\FastReport.Net.Pro.2022.1.6.2.nupkg = nugets\FastReport.Net.Pro.2022.1.6.2.nupkg
nugets\RiverbirdPortal.Common.1.0.4.nupkg = nugets\RiverbirdPortal.Common.1.0.4.nupkg
nugets\RiverbirdPortal.Interfaces.1.0.4.nupkg = nugets\RiverbirdPortal.Interfaces.1.0.4.nupkg
nugets\RiverbirdPortal.WebServices.Core.1.0.4.nupkg = nugets\RiverbirdPortal.WebServices.Core.1.0.4.nupkg
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Tests.DAO", "tests\backend\Centron.Tests.DAO\Centron.Tests.DAO.csproj", "{E9D16944-8E0B-442B-85BC-92761CFDB5A2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Tests.BL", "tests\backend\Centron.Tests.BL\Centron.Tests.BL.csproj", "{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Tests.Core", "tests\shared\Centron.Tests.Core\Centron.Tests.Core.csproj", "{36F4C881-F45C-496D-BF09-CE0781634CB6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Tests.Controls", "tests\shared\Centron.Tests.Controls\Centron.Tests.Controls.csproj", "{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Api.Shipcloud", "src\apis\Centron.Api.Shipcloud\Centron.Api.Shipcloud.csproj", "{156834EF-12F3-4FC1-9ADA-385EBB387F70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaywrightTests", "tests\PlaywrightTests\PlaywrightTests.csproj", "{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CentronNexusTests", "tests\CentronNexusTests\CentronNexusTests.csproj", "{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixSharpInstaller", "deployment\WixSharpInstaller\WixSharpInstaller.csproj", "{B82B65E3-89E6-4D84-9A96-245B697E41D2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scripts", "scripts\Scripts\Scripts.csproj", "{86677AB3-A1B7-4518-A67F-5B946FD16654}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Controllers", "src\webservice\Centron.Controllers\Centron.Controllers.csproj", "{C8ECF626-40F3-478F-B42A-146F7524ACD6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nexus", "nexus", "{1C4E5D83-869D-480B-8114-2DE58FD0125C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CentronNexus", "src\nexus\CentronNexus\CentronNexus.csproj", "{3BF6377B-F52B-475F-93BF-1213BCC02AAA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CentronNexus.Host", "src\nexus\CentronNexus.Host\CentronNexus.Host.csproj", "{C58C680E-8333-4A1F-926F-5DD1DCF1F075}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CentronNexus.OutlookAddIn", "src\nexus\CentronNexus.OutlookAddIn\CentronNexus.OutlookAddIn.csproj", "{27358E8C-942B-4985-A366-00CF9F57B8EA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Centron.Api.docuFORM", "Centron.Api.docuFORM\Centron.Api.docuFORM.csproj", "{BF0D49B4-1266-485F-A8F5-5C057244D8ED}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug Riverbird|Any CPU = Debug Riverbird|Any CPU
Debug|Any CPU = Debug|Any CPU
Release Barivion|Any CPU = Release Barivion|Any CPU
Release Riverbird|Any CPU = Release Riverbird|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{651E9627-5EB4-40A7-A9C5-042D529697B3}.Debug Riverbird|Any CPU.ActiveCfg = Debug|x86
{651E9627-5EB4-40A7-A9C5-042D529697B3}.Debug|Any CPU.ActiveCfg = Debug|x86
{651E9627-5EB4-40A7-A9C5-042D529697B3}.Release Barivion|Any CPU.ActiveCfg = Release|x86
{651E9627-5EB4-40A7-A9C5-042D529697B3}.Release Riverbird|Any CPU.ActiveCfg = Release|x86
{651E9627-5EB4-40A7-A9C5-042D529697B3}.Release|Any CPU.ActiveCfg = Release|x86
{8F65595B-29B0-461F-840E-37091F53046E}.Debug Riverbird|Any CPU.ActiveCfg = Debug|x86
{8F65595B-29B0-461F-840E-37091F53046E}.Debug|Any CPU.ActiveCfg = Debug|x86
{8F65595B-29B0-461F-840E-37091F53046E}.Release Barivion|Any CPU.ActiveCfg = Release|x86
{8F65595B-29B0-461F-840E-37091F53046E}.Release Riverbird|Any CPU.ActiveCfg = Release|x86
{8F65595B-29B0-461F-840E-37091F53046E}.Release|Any CPU.ActiveCfg = Release|x86
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC}.Release|Any CPU.Build.0 = Release|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41555800-1544-4180-8FA5-F55422743DFD}.Release|Any CPU.Build.0 = Release|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA}.Release|Any CPU.Build.0 = Release|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BCE70684-DE69-4335-8051-21DE138EE341}.Release|Any CPU.Build.0 = Release|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40EAE244-51C4-4744-A087-927520F6615D}.Release|Any CPU.Build.0 = Release|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CCA19D0-4F32-4710-9678-9507EA5B00C3}.Release|Any CPU.Build.0 = Release|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C0BD1754-6702-4BB6-BA25-7381988CFE7B}.Release|Any CPU.Build.0 = Release|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{869E518C-A7AB-4F06-86D1-F96E8689AF6D}.Release|Any CPU.Build.0 = Release|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82E76759-E338-46A0-AAC7-69D0294A808F}.Release|Any CPU.Build.0 = Release|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0}.Release|Any CPU.Build.0 = Release|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8632D0F9-09CC-4358-8EAE-91ACABF21C23}.Release|Any CPU.Build.0 = Release|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8}.Release|Any CPU.Build.0 = Release|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E}.Release|Any CPU.Build.0 = Release|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85}.Release|Any CPU.Build.0 = Release|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC}.Release|Any CPU.Build.0 = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release Barivion|Any CPU.ActiveCfg = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release Barivion|Any CPU.Build.0 = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release Riverbird|Any CPU.ActiveCfg = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release Riverbird|Any CPU.Build.0 = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C35456A-AD21-4F54-BF7B-D056F9E19917}.Release|Any CPU.Build.0 = Release|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9681F92D-2759-4618-B3AC-7A036048FA38}.Release|Any CPU.Build.0 = Release|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8}.Release|Any CPU.Build.0 = Release|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{436B30C8-32FB-469D-A528-90DCCCF76CB1}.Release|Any CPU.Build.0 = Release|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{88C9107F-0275-4359-B7D7-D2F10072B1BD}.Release|Any CPU.Build.0 = Release|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{036E8795-025A-4321-98A7-F5852A9B01B5}.Release|Any CPU.Build.0 = Release|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC3E9AE7-1223-4324-B724-41419521FFC6}.Release|Any CPU.Build.0 = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release Barivion|Any CPU.ActiveCfg = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release Barivion|Any CPU.Build.0 = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release Riverbird|Any CPU.ActiveCfg = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release Riverbird|Any CPU.Build.0 = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F242AB2F-B297-4D92-9110-3B66D4E01C1A}.Release|Any CPU.Build.0 = Release|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C}.Release|Any CPU.Build.0 = Release|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26E7956F-8919-441A-8CF5-EC351A9C7E7D}.Release|Any CPU.Build.0 = Release|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{835D92F9-7620-4C22-B7B4-BB4C34D1664A}.Release|Any CPU.Build.0 = Release|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2783863F-E24A-486A-B420-3E1125F2922D}.Release|Any CPU.Build.0 = Release|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Debug|Any CPU.Build.0 = Debug|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release|Any CPU.ActiveCfg = Release|Any CPU
{850ED0CE-2FCB-4FDA-A261-ACF15813C418}.Release|Any CPU.Build.0 = Release|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{395597B8-52B5-41A8-8283-AD704555B7A4}.Release|Any CPU.Build.0 = Release|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Debug Riverbird|Any CPU.ActiveCfg = Debug Riverbird|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Debug Riverbird|Any CPU.Build.0 = Debug Riverbird|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release Barivion|Any CPU.ActiveCfg = Release Barivion|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release Barivion|Any CPU.Build.0 = Release Barivion|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release Riverbird|Any CPU.ActiveCfg = Release Riverbird|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release Riverbird|Any CPU.Build.0 = Release Riverbird|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{039C7717-C471-4687-B53C-0214DA2C914E}.Release|Any CPU.Build.0 = Release|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9D16944-8E0B-442B-85BC-92761CFDB5A2}.Release|Any CPU.Build.0 = Release|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ECFF6CC0-F611-4F15-8DE0-4F5AF8B27CBC}.Release|Any CPU.Build.0 = Release|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{36F4C881-F45C-496D-BF09-CE0781634CB6}.Release|Any CPU.Build.0 = Release|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{364598CF-254D-40B1-BF3B-49CCFB1F0BB3}.Release|Any CPU.Build.0 = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release Barivion|Any CPU.ActiveCfg = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release Barivion|Any CPU.Build.0 = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release Riverbird|Any CPU.ActiveCfg = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release Riverbird|Any CPU.Build.0 = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{156834EF-12F3-4FC1-9ADA-385EBB387F70}.Release|Any CPU.Build.0 = Release|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF}.Release|Any CPU.Build.0 = Release|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5}.Release|Any CPU.Build.0 = Release|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B82B65E3-89E6-4D84-9A96-245B697E41D2}.Release|Any CPU.Build.0 = Release|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86677AB3-A1B7-4518-A67F-5B946FD16654}.Release|Any CPU.Build.0 = Release|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8ECF626-40F3-478F-B42A-146F7524ACD6}.Release|Any CPU.Build.0 = Release|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3BF6377B-F52B-475F-93BF-1213BCC02AAA}.Release|Any CPU.Build.0 = Release|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C58C680E-8333-4A1F-926F-5DD1DCF1F075}.Release|Any CPU.Build.0 = Release|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release Barivion|Any CPU.ActiveCfg = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release Barivion|Any CPU.Build.0 = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release Riverbird|Any CPU.Build.0 = Debug|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27358E8C-942B-4985-A366-00CF9F57B8EA}.Release|Any CPU.Build.0 = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Debug Riverbird|Any CPU.ActiveCfg = Debug|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Debug Riverbird|Any CPU.Build.0 = Debug|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release Barivion|Any CPU.ActiveCfg = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release Barivion|Any CPU.Build.0 = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release Riverbird|Any CPU.ActiveCfg = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release Riverbird|Any CPU.Build.0 = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF0D49B4-1266-485F-A8F5-5C057244D8ED}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{651E9627-5EB4-40A7-A9C5-042D529697B3} = {37E8290B-F9FB-4EB1-92EC-9DD82D0D1F3A}
{8F65595B-29B0-461F-840E-37091F53046E} = {37E8290B-F9FB-4EB1-92EC-9DD82D0D1F3A}
{63BA375E-99FA-49DC-9C6F-D3D4C4F4C113} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{94BFF10D-755B-44FC-BB07-911607A4F08D} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{DF32298B-4D77-4987-8613-6B3BC459945A} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{E099F8B6-6A0F-4A2A-BAB7-62ACB9AA26DC} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{41555800-1544-4180-8FA5-F55422743DFD} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{8E6C0B8C-AC1F-4555-8187-E9BEAA53CAFA} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{BCE70684-DE69-4335-8051-21DE138EE341} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{40EAE244-51C4-4744-A087-927520F6615D} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{7CCA19D0-4F32-4710-9678-9507EA5B00C3} = {63BA375E-99FA-49DC-9C6F-D3D4C4F4C113}
{C0BD1754-6702-4BB6-BA25-7381988CFE7B} = {94BFF10D-755B-44FC-BB07-911607A4F08D}
{869E518C-A7AB-4F06-86D1-F96E8689AF6D} = {94BFF10D-755B-44FC-BB07-911607A4F08D}
{82E76759-E338-46A0-AAC7-69D0294A808F} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{157B1F36-2191-48C9-9F21-51C9D3E6D3C0} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{8632D0F9-09CC-4358-8EAE-91ACABF21C23} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{677D4F47-4BFE-45A8-9F94-9A6BD9B817F8} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{29A2608B-B6C2-48CF-8EF4-0B1AF5AB156E} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{6CA9C833-1499-4FD6-AF15-DFD3672DCCF3} = {0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}
{BB481EF5-B85B-4D09-BA4A-EB325D81D273} = {0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}
{E6F7AB8B-1796-4639-B742-6C60F5E787C3} = {0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}
{D1C468C4-F0AC-44BE-980C-84A0CA4F7C85} = {36C8A994-A96E-48D7-A36C-80AB4D85548A}
{01F71AAA-B574-490A-A241-E905C4E4F358} = {2F71ED3A-FF09-4148-BEBA-FE06257EFCE4}
{14A535B2-736F-4BF8-9A8C-D8AF78D028E9} = {2F71ED3A-FF09-4148-BEBA-FE06257EFCE4}
{E65BC114-9ABA-44EA-ABEC-598E9F968E24} = {14A535B2-736F-4BF8-9A8C-D8AF78D028E9}
{6DB9540C-9A72-4494-81C3-254BC21214BF} = {14A535B2-736F-4BF8-9A8C-D8AF78D028E9}
{AFE4AB7B-ADC3-4C26-8CCA-20ADC52C637C} = {14A535B2-736F-4BF8-9A8C-D8AF78D028E9}
{414CAEBF-64D9-4778-9A59-07C2425B3BB3} = {14A535B2-736F-4BF8-9A8C-D8AF78D028E9}
{CEFF7840-35A3-4743-B7D5-A58798BF3911} = {2F71ED3A-FF09-4148-BEBA-FE06257EFCE4}
{8D62EB3E-A0D0-45E5-B0A6-03DABF4CAC47} = {CEFF7840-35A3-4743-B7D5-A58798BF3911}
{94F8A20A-8A42-4433-B770-3775986A95B1} = {CEFF7840-35A3-4743-B7D5-A58798BF3911}
{A7C9E4F2-8B1D-4A5E-9F3C-1E6D2B8A9C7F} = {CEFF7840-35A3-4743-B7D5-A58798BF3911}
{8E1F422E-AD81-4288-84AF-E73641C28765} = {CEFF7840-35A3-4743-B7D5-A58798BF3911}
{B778B179-7F32-45CB-BC0A-F2F8E36E639B} = {2F71ED3A-FF09-4148-BEBA-FE06257EFCE4}
{836CEDAB-5BA5-4440-B0FD-7457F08DADFC} = {2673DB6C-17D0-4215-A743-FF856058E5E7}
{5C35456A-AD21-4F54-BF7B-D056F9E19917} = {2673DB6C-17D0-4215-A743-FF856058E5E7}
{355397CD-E4CA-49CE-ACBF-46C352324455} = {A9A6DCD4-47A8-43CD-A8EE-418DFF9BF4E0}
{4789367D-012A-4619-B242-AB5DC832CC3B} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{9681F92D-2759-4618-B3AC-7A036048FA38} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{7CD9D1EC-B8A6-4DB4-A597-95C616158CE8} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{436B30C8-32FB-469D-A528-90DCCCF76CB1} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{88C9107F-0275-4359-B7D7-D2F10072B1BD} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{036E8795-025A-4321-98A7-F5852A9B01B5} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{FC3E9AE7-1223-4324-B724-41419521FFC6} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{F242AB2F-B297-4D92-9110-3B66D4E01C1A} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{AEA734A6-D7BF-4700-B460-50246AF3D13F} = {2673DB6C-17D0-4215-A743-FF856058E5E7}
{BEC97621-1661-403E-85E7-AE5DD2FD1C2C} = {AEA734A6-D7BF-4700-B460-50246AF3D13F}
{26E7956F-8919-441A-8CF5-EC351A9C7E7D} = {AEA734A6-D7BF-4700-B460-50246AF3D13F}
{835D92F9-7620-4C22-B7B4-BB4C34D1664A} = {AEA734A6-D7BF-4700-B460-50246AF3D13F}
{2783863F-E24A-486A-B420-3E1125F2922D} = {AEA734A6-D7BF-4700-B460-50246AF3D13F}
{37E8290B-F9FB-4EB1-92EC-9DD82D0D1F3A} = {426F4A65-49AE-4BE3-8840-502211B24EBD}
{F170B186-804F-4972-AE52-ECE8A324CB12} = {0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}
{7C89B4CC-2D02-4975-AAE1-100464B6E501} = {0F3DB6DC-E5DD-4F55-84DA-4658F0A29A7C}
{0B59FAEA-EFF2-403A-95E4-AF0729DFB5AE} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{850ED0CE-2FCB-4FDA-A261-ACF15813C418} = {0B59FAEA-EFF2-403A-95E4-AF0729DFB5AE}
{395597B8-52B5-41A8-8283-AD704555B7A4} = {0B59FAEA-EFF2-403A-95E4-AF0729DFB5AE}
{039C7717-C471-4687-B53C-0214DA2C914E} = {0B59FAEA-EFF2-403A-95E4-AF0729DFB5AE}
{156834EF-12F3-4FC1-9ADA-385EBB387F70} = {4789367D-012A-4619-B242-AB5DC832CC3B}
{A2F192C2-2FEB-4F02-84CA-E5E942137AAF} = {2673DB6C-17D0-4215-A743-FF856058E5E7}
{042391AA-8FCE-4EEF-BD56-4C0C28A09EA5} = {2673DB6C-17D0-4215-A743-FF856058E5E7}
{B82B65E3-89E6-4D84-9A96-245B697E41D2} = {426F4A65-49AE-4BE3-8840-502211B24EBD}
{86677AB3-A1B7-4518-A67F-5B946FD16654} = {36C8A994-A96E-48D7-A36C-80AB4D85548A}
{C8ECF626-40F3-478F-B42A-146F7524ACD6} = {DF32298B-4D77-4987-8613-6B3BC459945A}
{1C4E5D83-869D-480B-8114-2DE58FD0125C} = {9756B695-DBA5-4DF2-BD91-6D6B7826A6BD}
{3BF6377B-F52B-475F-93BF-1213BCC02AAA} = {1C4E5D83-869D-480B-8114-2DE58FD0125C}
{C58C680E-8333-4A1F-926F-5DD1DCF1F075} = {1C4E5D83-869D-480B-8114-2DE58FD0125C}
{27358E8C-942B-4985-A366-00CF9F57B8EA} = {1C4E5D83-869D-480B-8114-2DE58FD0125C}
{BF0D49B4-1266-485F-A8F5-5C057244D8ED} = {4789367D-012A-4619-B242-AB5DC832CC3B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {72C3FAA3-1DA6-48AF-96DC-B99119AA347C}
RESX_SortFileContentOnSave = True
EndGlobalSection
EndGlobal
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/CodeAnnotations/NamespacesWithAnnotations/=Centron_002EControls_002EAnnotations/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
+159
View File
@@ -0,0 +1,159 @@
# c-entron Rights
## Helpdesk
### 1. Helpdesk anzeigen
Without this right, the user should not see any ticket and have no access to any ticket list.
*UserRightsConst.Sales.Customer.Helpdesk.SHOW_HELPDESK*
### 1.1. Tickets anzeigen - nur eigene
This is a **restricting right**. If the user has this right, he should only see and access tickets where he is
either editor or responsible person.
*UserRightsConst.Sales.Customer.Helpdesk.SHOW_HELPDESK_ONLY_OWN*
### 1.2. Tickets anzeigen - eigene Filiale
This is a **restricting right**. If the user has this right, he should only see and access tickets that belong to the
users' branch.
*UserRightsConst.Sales.Customer.Helpdesk.SHOW_HELPDESK_ONLY_OWN_BRANCH*
### 2. Neuen Helpdesk anlegen
Without this right, the user should not be able to create a new ticket.
*UserRightsConst.Sales.Customer.Helpdesk.ADD_NEW_HELPDESK*
### 2.1. Neues Ticket anlegen - nur eigene Filiale
This is a **restricting right**. If the user has this right, he should only be able to create a ticket that belongs to
his branch.
*UserRightsConst.Sales.Customer.Helpdesk.CREATE_HELPDESK_ONLY_OWN_BRANCH*
### 3. Helpdesk bearbeiten
Without this right, the user should not be able to edit any ticket.
*UserRightsConst.Sales.Customer.Helpdesk.EDIT_HELPDESK*
### 4. Helpdeskzuweisung nur an eigene Abteilungen
This is a **restricting right**. If the user has this right, he should only be able to assign a ticket members of
his own department.
*UserRightsConst.Sales.Customer.Helpdesk.ASSIGN_HELPDESK_ONLY_TO_OWN_DEPARTMENTS*
### 5. Fälligkeit ändern
This right allows the user to change the due date of a ticket. This may also be required when
changing the status of a ticket, if this requires a due date change.
*UserRightsConst.Sales.Customer.Helpdesk.MATURITY_CHANGE*
### 6. Request abschliessen
This right allows the user to close a ticket.
*UserRightsConst.Sales.Customer.Helpdesk.CLOSE_REQUEST*
### 7. Zeiten bearbeiten
This right allows the user to edit the time records of a ticket.
*UserRightsConst.Sales.Customer.Helpdesk.EDIT_TIME*
### 7.1. Zeiten bearbeiten - nur eigene Zeiten
This is a **restricting right**. If the user has this right, he should only be able to edit time records
that are assigned to him. This means the employee article of the time record must belong to the user.
*UserRightsConst.Sales.Customer.Helpdesk.OWN_TIME_EDIT*
### 7.2. Unterschrift aus Zeit löschen
This right allows the user to delete the signature from a time record.
*UserRightsConst.Sales.Customer.Helpdesk.DELETE_HELPDESK_SIGNATURE*
### 8. Helpdeskzeiten verschieben
This right allows the user to move a time record from one ticket to another. But only if the
ticket is not part of a receipt.
*UserRightsConst.Sales.Customer.Helpdesk.MOVE_HELPDESK_TIMER*
### 9. Helpdeskzeiten löschen
This right allows the user to delete a time record. But only if the ticket is not part of a receipt.
*UserRightsConst.Sales.Customer.Helpdesk.DELETE_HELPDESK_TIMER*
### 10. Neuen Helpdesk Typ anlegen
This right allows the user to create a new ticket type in the settings.
*UserRightsConst.Sales.Customer.Helpdesk.ADD_NEW_HELPDESK_TYPE*
### 11. Neue Helpdesk Hauptkategorie anlegen
This right allows the user to create a new main category in the settings.
*UserRightsConst.Sales.Customer.Helpdesk.ADD_NEW_HELPDESK_MAIN_CATEGORY*
### 12. Neue Helpdesk Unterkategorie 1 anlegen
This right allows the user to create a new subcategory 1 in the settings.
*UserRightsConst.Sales.Customer.Helpdesk.ADD_NEW_HELPDESK_SUB_CATEGORY1*
### 13. Neue Helpdesk Unterkategorie 2 anlegen
This right allows the user to create a new subcategory 2 in the settings.
*UserRightsConst.Sales.Customer.Helpdesk.ADD_NEW_HELPDESK_SUB_CATEGORY2*
### 14. Helpdeskzeitenanfahrten bearbeiten
This right allows the user to edit additional articles that appear for certain time record types.
*UserRightsConst.Sales.Customer.Helpdesk.EDIT_HELPDESKTIMER_ADDRESSSPECIALARTICLES*
### 15. Sichtbarkeit von Tickets bearbeiten
This right allows the user to change if a ticket is only internally visible.
*UserRightsConst.Sales.Customer.Helpdesk.CHANGE_VISIBILITY*
### 16. Checklisten
#### 16.1. Checklisten Vorlagen anlegen
This right allows the user to create new checklist templates.
*UserRightsConst.Sales.Customer.Helpdesk.Checklists.CREATE_NEW_CHECKLIST_TEMPLATES*
### 16.2. Checklisten Vorlagen bearbeiten
This right allows the user to edit checklist templates.
*UserRightsConst.Sales.Customer.Helpdesk.Checklists.EDIT_CHECKLIST_TEMPLATES*
### 16.3. Checklisten bearbeiten
This right allows the user to edit checklists.
*UserRightsConst.Sales.Customer.Helpdesk.Checklists.EDIT_CHECKLISTS*
### 16.4. Checklisten Punkte bearbeiten ändern (sic)
This right allows the user to change the editor of a checklist item.
*UserRightsConst.Sales.Customer.Helpdesk.Checklists.EDIT_CHECKLIST_ITEM_EDITOR*
### 17 Ticketvorlagen
### 17.1. Ticketvorlagen bearbeiten
This right allows the user to edit C-FLOW ticket templates.
*UserRightsConst.Sales.Customer.Helpdesk.CFlow.EDIT_CFLOW_TICKETPATTERN*
### 17.2. Ticketvorlagenkategorien erstellen
This right allows the user to create new categories for C-FLOW ticket templates.
*UserRightsConst.Sales.Customer.Helpdesk.CFlow.CREATE_NEW_CFLOW_TICKETPATTERNCATEGORY*
### 17.3. Ticketvorlagen erstellen
This right allows the user to create new C-FLOW ticket templates.
*UserRightsConst.Sales.Customer.Helpdesk.CFlow.CREATE_NEW_CFLOW_TICKETPATTERN*
### 17.4. Ticketvorlagen löschen
This right allows the user to delete C-FLOW ticket templates.
*UserRightsConst.Sales.Customer.Helpdesk.CFlow.DELETE_CFLOW_TICKETTPATERN*
### 18 Taskmanagement anzeigen
This right allows the user to access the task management.
*UserRightsConst.Sales.Customer.Helpdesk.SHOW_TASKMANAGEMENT*
# Kalender
This right allows the user to access the calendar.
*UserRightsConst.RIGHT_KALENDER*
## 1. Kalender anzeigen alle
This right allows the user to see all calendar entries. Currently, this right is not used.
*UserRightsConst.RIGHT_KALENDERANZEIGENALLE*
## 2. Kalender anzeigen nur eigene
This is a **restricting right**. If the user has this right, he should only see his own calendar entries.
*UserRightsConst.RIGHT_KALENDERANZEIGENEIGENE*
# Mitarbeiterauslastung
## 1. Auslastung von anderen Mitarbeitern anzeigen
This right allows the user to see the workload of other employees.
*UserRightsConst.RIGHT_MITARBEITERAUSLASTUNG*
## 2. Mitarbeiterauslastung - nur eigene Filiale
This is a **restricting right**. If the user has this right, he should only see the workload of employees that belong to
his branch.
*UserRightsConst.RIGHT_MITARBEITERAUSLASTUNGNUREIGENEFILIALE*
@@ -0,0 +1,12 @@
<Project>
<!--
Single source of truth for the DevExpress NuGet version.
Imported by both the repo-root Directory.Build.props (covers WPF, backend, webservice,
shared) and src/nexus/Directory.Build.props (covers the Blazor/Nexus projects, which do
not inherit the root props). A DevExpress update only needs to change the value here.
Not named Directory.Build.props on purpose so MSBuild does not auto-import it.
-->
<PropertyGroup>
<NugetVersionDevExpress>26.1.3</NugetVersionDevExpress>
</PropertyGroup>
</Project>
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<!--
Default properties used for all projects.
-->
<PropertyGroup>
<DebugSymbols>true</DebugSymbols>
<!-- We always want to generate PDBs -->
<DebugType>embedded</DebugType>
<IsDevBuild>true</IsDevBuild>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Company>NEXOWARE Systems GmbH</Company>
<Description>A protected assembly of NEXOWARE Systems GmbH. Using only allowed with license of the NEXOWARE Systems GmbH company.</Description>
<Product>NEXOWARE c-entron ERP</Product>
<Copyright>Copyright © NEXOWARE Systems GmbH 2012 - 2026</Copyright>
<Trademark>NEXOWARE c-entron ERP</Trademark>
<Version>1.0.0.0</Version>
<GitCommitId></GitCommitId>
<!-- Placeholder for inserting the git commit-id for the InformationalVersion -->
</PropertyGroup>
<!-- Change Errors and Warnings -->
<PropertyGroup>
<WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904;NU1510;NU1603;CS0618;ASPDEPR004;ASPDEPR008</WarningsNotAsErrors>
<!-- Nuget known vulnerabilities should not break the build (see https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1901-nu1904) -->
<!-- CS0618: Obsolete warnings should not break the build during API migration -->
</PropertyGroup>
<!-- Set InformationalVersion -->
<PropertyGroup>
<InformationalVersion>$(Version)</InformationalVersion>
</PropertyGroup>
<!-- Add GitCommitId to InformationalVersion -->
<PropertyGroup Condition=" '$(GitCommitId)' != '' ">
<InformationalVersion>$(InformationalVersion)+$(GitCommitId)</InformationalVersion>
</PropertyGroup>
<!-- Handle IsDevBuild -->
<PropertyGroup Condition=" '$(IsDevBuild)' == true">
<InformationalVersion>Dev-Build $(InformationalVersion)</InformationalVersion>
<DefineConstants>$(DefineConstants);DEV_BUILD</DefineConstants>
</PropertyGroup>
<!-- BinaryFormatter (only used for NHibernate Configuration serialization) -->
<PropertyGroup>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
<!-- NuGet Package Versions -->
<!-- Single source of truth for the DevExpress version, shared with src/nexus/Directory.Build.props -->
<Import Project="$(MSBuildThisFileDirectory)DevExpress.Version.props" />
</Project>
+36
View File
@@ -0,0 +1,36 @@
# c-entron Nexus (aka c-entron Web)
# Rules
## 1. Referencing javascript/css dependencies
When referencing any javascript or css dependency, we allow 2 ways of referencing them:
1. Use LibMan to download the files into the repository.
2. Reference the files from a CDN like jsdelivr.net, but then we must include a integrity hash in that reference.
### Referencing javascript/css using LibMan
See here for how to use LibMan: https://learn.microsoft.com/en-US/aspnet/core/client-side/libman/libman-vs?view=aspnetcore-6.0
### Reference from CDN with integrity hash
You can use https://www.srihash.org/ to create the integrity hash for a file.
## 2. Which components to use
In general we prefer to use the DevExpress blazor components instead of plain bootstrap components.
DevExpress uses the bootstrap styling, so the components do look similar.
## 3. Custom CSS
Don't use your own colors and border-radius and so on in custom CSS.
Use whatever variables from bootstrap are available.
This means, that we can change the bootstrap theme in the future and even our custom CSS will adjust.
## 4. HTML layouting
For layouting HTML stuff our preference is as follows:
`CSS Grid` or `Flexbox` **>** `Bootstrap Grid` **>** DevExpress layout components (like `DxGridLayout` and `DxStackLayout`)
# Contributing
## 1. WebCart
* The webcart is a a feature primarily intended for the customers of our customers
* That means it's available if you login as a web-account (create one in c-entron.NET Adressstamm)
* The available articles come from the customers "Sonderpreise", so create some of them in the c-entron.NET Adressstamm too
* The web-account should now be able to login at c-entron Nexus, click on "Shop" and see the articles
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Values xmlns="urn:tom-englert.de/Configuration/1/0">
<Value Key="SortFileContentOnSave">True</Value>
</Values>
Binary file not shown.
@@ -0,0 +1 @@
BEFORE UPDATING TAPI PLEASE CHECK Tapi.md FOR DOCUMENTATION

Some files were not shown because too many files have changed in this diff Show More