update / migration

This commit is contained in:
Ralph Soika 2026-10-01 09:53:30 +02:00
parent 4498f23458
commit b5bb9ac635
152 changed files with 10725 additions and 76159 deletions

6
.env Normal file
View file

@ -0,0 +1,6 @@
# Docker Config
PROJECT_PREFIX=dynamixs-ai-super-office
# LLM Config
LLM_API_ENDPOINT=https://api.llama.cpp.imixs.com/
LLM_API_KEY=7fdb663fa87ea16731c1e0ece8ad3214e358423eabf2403188110c731ce07321

View file

@ -1,5 +1,7 @@
FROM imixs/imixs-office-workflow:5.1.6-SNAPSHOT-wildfly-29.0.1.Final-jdk17 FROM ghcr.io/dynamixs-ai/ai-platform:latest
# Deploy artefact # Deploy artefact
RUN rm -r /opt/jboss/wildfly/standalone/deployments/* RUN rm -r /opt/jboss/wildfly/standalone/deployments/*
# Deploy artefact # Deploy artefact
COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/ COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/

View file

@ -1,7 +1,7 @@
FROM imixs/imixs-office-workflow:5.1.6-SNAPSHOT-wildfly-29.0.1.Final-jdk17 FROM ghcr.io/dynamixs-ai/ai-platform:latest
# Deploy artefact # Deploy artefact
RUN rm -r /opt/jboss/wildfly/standalone/deployments/* RUN rm -r /opt/jboss/wildfly/standalone/deployments/*
# Deploy artefact
COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/ COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/
# Run in Debug Mode # Run in Debug Mode

24
build.sh Executable file
View file

@ -0,0 +1,24 @@
#!/bin/bash
############################################################
# The Dynamixs.AI Developer Script
# start, build, hot, setup, deploy
#
############################################################
strip_dash() {
echo "$1" | sed 's/^-//'
}
echo " _ _ _ _ "
echo " __| | _____ _(_) | |__ ___| |_ __"
echo " / _\` |/ _ \\ \\ / / | | '_ \\ / _ \\ | \'_ \\"
echo "| (_| | __/\ V /| | | | | | __/ | |_) |"
echo " \__,_|\___| \_/ |_| |_| |_|\___|_| .__/ "
echo " |_| "
echo " Dynamixs.AI Build Script..."
echo "_________________________________________"
# Update git
git pull
mvn clean install -DskipTests -Pimixs-cloud

43
devi
View file

@ -1,12 +1,11 @@
#!/bin/bash #!/bin/bash
############################################################ ############################################################
# The Imixs Developer Script # The Dynamixs.AI Developer Script
# start, build, hot, setup, deploy # start, build, hot, setup, deploy
# #
############################################################ ############################################################
# Funktion zum Entfernen des '-' Zeichens von einem Parameter
strip_dash() { strip_dash() {
echo "$1" | sed 's/^-//' echo "$1" | sed 's/^-//'
} }
@ -24,35 +23,46 @@ strip_dash() {
if [[ "$(strip_dash $1)" == "setup" ]]; then if [[ "$(strip_dash $1)" == "setup" ]]; then
echo " Dev Setup..." echo " Dev Setup..."
sudo chmod -R 777 docker/deployments/ sudo chmod -R 777 docker/deployments/
echo " starting dev enrvionment..." echo " starting dev environment..."
mvn clean install -Pdebug mvn clean install -Pdebug
cp ./*-app/target/*.war ./docker/deployments/ cp ./*-app/target/*.war ./docker/deployments/
docker compose -f ./docker/docker-compose-dev.yaml up docker compose -f ./docker-compose-dev.yaml up
fi fi
if [[ "$(strip_dash $1)" == "start" ]]; then if [[ "$(strip_dash $1)" == "start" ]]; then
echo " Start Dev Environment..." echo " Start Dev Environment..."
docker compose -f ./docker/docker-compose-dev.yaml up docker compose -f ./docker-compose.yaml up
fi
if [[ "$(strip_dash $1)" == "dev" ]]; then
echo " Start Dev Environment..."
mvn clean install -DskipTests -Pdebug
docker compose -f ./docker-compose-dev.yaml up
fi fi
if [[ "$(strip_dash $1)" == "docker" ]]; then if [[ "$(strip_dash $1)" == "docker" ]]; then
echo " Buld Docker Image..." echo " Build Docker image..."
mvn clean install -Pdebug mvn clean install -DskipTests -Pdocker
fi fi
if [[ "$(strip_dash $1)" == "build" ]]; then if [[ "$(strip_dash $1)" == "build" ]]; then
echo " Build app..." echo " Build and Autodeploy..."
mvn clean install mvn clean install -DskipTests
fi fi
if [[ "$(strip_dash $1)" == "test" ]]; then
echo " Run JUnit Tests..."
mvn clean test
fi
if [[ "$(strip_dash $1)" == "hot" ]]; then
if [[ "$(strip_dash $1)" == "deploy" ]]; then echo "* Hotdeploy..."
echo " Deploy to Imixs-Cloud..." cd *-app
mvn clean install -Pimixs-cloud -DskipTests mvn manik-hotdeploy:hotdeploy
cd ..
fi fi
@ -62,9 +72,10 @@ if [[ $# -eq 0 ]]; then
echo " Run with ./dev.sh -XXX" echo " Run with ./dev.sh -XXX"
echo " " echo " "
echo " -start : start Docker Containers" echo " -start : start Docker Containers"
echo " -build : build war file" echo " -dev : start the Docker dev environment"
echo " -docker : build the Docker image for debugging" echo " -build : build application and redeploy"
echo " -deploy: Imixs-Cloud Deployment starten " echo " -hot : Manik Hotdeploy"
echo " -test : run tests"
echo " -setup : setup dev environment - rebuild docker containers " echo " -setup : setup dev environment - rebuild docker containers "
echo "_________________________________________" echo "_________________________________________"
echo " " echo " "

View file

@ -3,12 +3,12 @@ services:
# PostgreSQL # PostgreSQL
####################### #######################
db: db:
image: postgres:9.6.1 image: postgres:17.4
environment: environment:
POSTGRES_PASSWORD: adminadmin POSTGRES_PASSWORD: adminadmin
POSTGRES_DB: office POSTGRES_DB: office
volumes: volumes:
- dbdata-hai:/var/lib/postgresql/data - dbdata:/var/lib/postgresql/data
####################### #######################
# Dynamixs AI # Dynamixs AI
@ -44,10 +44,8 @@ services:
WOPI_HOST_ENDPOINT: "http://app:8080/api/wopi/" WOPI_HOST_ENDPOINT: "http://app:8080/api/wopi/"
COLLABORA_CONVERTER_URL: "http://collabora:9980/lool/convert-to/" COLLABORA_CONVERTER_URL: "http://collabora:9980/lool/convert-to/"
# Imixs-AI # LLM Integration
# Optional configured via imixs.properties LLM_CONFIG_FILE: /opt/jboss/imixs-llm.xml
LLM_SERVICE_ENDPOINT: ${LLM_API_ENDPOINT}
LLM_SERVICE_ENDPOINT_APIKEY: ${LLM_API_KEY}
# Cassandra Embeddings # Cassandra Embeddings
EMBEDDINGS_CLUSTER_CONTACTPOINTS: "cassandra" EMBEDDINGS_CLUSTER_CONTACTPOINTS: "cassandra"
@ -58,21 +56,20 @@ services:
- "9990:9990" - "9990:9990"
- "8787:8787" - "8787:8787"
volumes: volumes:
- ./deployments:/opt/jboss/wildfly/standalone/deployments/ - ./docker/deployments:/opt/jboss/wildfly/standalone/deployments/
- ./import_examples:/opt/jboss/import_examples/ - ./docker/keys/imixs-llm.xml:/opt/jboss/imixs-llm.xml
#- ./import_examples:/opt/jboss/import_examples/
# Mapping the host ip to the container # Mapping the host ip to the container
# This setting is used for local testing only # This setting is used for local testing only
# Wildfly can access the keycloak server via the external host address # Wildfly can access the keycloak server via the external host address
extra_hosts: # extra_hosts:
- "keycloak.imixs.local:host-gateway" # - "keycloak.imixs.local:host-gateway"
####################### #######################
# Tika OCR Service # Tika OCR Service
####################### #######################
tika: tika:
#image: imixs/tika
#image: apache/tika:1.24.1-full
image: apache/tika:3.2.0.0-full image: apache/tika:3.2.0.0-full
environment: environment:
TZ: "Europe/Berlin" TZ: "Europe/Berlin"
@ -105,15 +102,15 @@ services:
####################### #######################
# collabora Office Online # collabora Office Online
####################### #######################
# collabora: collabora:
# image: collabora/code:25.04.6.2.1 image: collabora/code:25.04.6.2.1
# ports: ports:
# - "9980:9980" - "9980:9980"
# environment: environment:
# - username=admin - username=admin
# - password=adminadmin - password=adminadmin
# - extra_params=--o:ssl.enable=false - extra_params=--o:ssl.enable=false
# - aliasgroup1=http://app:8080 - aliasgroup1=http://app:8080
####################### #######################
# Imixs Admin Client # Imixs Admin Client
@ -123,26 +120,8 @@ services:
# ports: # ports:
# - "8888:8080" # - "8888:8080"
# prometheus:
# image: prom/prometheus:latest
# ports:
# - "9090:9090"
# volumes:
# - ./configuration/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
# - prometheusdata:/prometheus/
# grafana:
# image: grafana/grafana:10.4.0 # Aktuelle stabile Version
# ports:
# - "3000:3000"
# environment:
# - GF_SECURITY_ADMIN_PASSWORD=admin # Standardpasswort setzen
# volumes:
# - grafana-storage:/var/lib/grafana # Persistente Daten
volumes: volumes:
dbdata-hai: dbdata:
dbkeycloak: name: ${PROJECT_PREFIX}-dbdata
cassandra_data: cassandra_data:
prometheusdata: name: ${PROJECT_PREFIX}-cassandra_data
grafana-storage:

View file

@ -1,172 +0,0 @@
services:
#######################
# PostgreSQL
#######################
db:
image: postgres:9.6.1
environment:
POSTGRES_PASSWORD: adminadmin
POSTGRES_DB: office
volumes:
- dbdata-hai:/var/lib/postgresql/data
#######################
# Dynamixs AI
#######################
app:
image: imixs/dynamixs-ai
depends_on:
- db
environment:
JAVA_OPTS: "-Dnashorn.args=--no-deprecation-warning"
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "adminadmin"
POSTGRES_CONNECTION: "jdbc:postgresql://db/office"
TZ: "Europe/Berlin"
LANG: "en_US.UTF-8"
MAILGATEWAY: "localhost"
ASYNCEVENT_PROCESSOR_ENABLED: "true"
ASYNCEVENT_PROCESSOR_INITIALDELAY: "30000"
OCR_SERVICE_ENDPOINT: "http://tika:9998/tika"
OCR_SERVICE_MODE: "MODEL"
#OCR_STRATEGY: "NO_OCR, OCR_ONLY, OCR_AND_TEXT_EXTRACTION, AUTO (default)"
OCR_STRATEGY: "AUTO"
# Collabora integration
WOPI_PUBLIC_ENDPOINT: "http://localhost:9980"
WOPI_DISCOVERY_ENDPOINT: "http://collabora:9980/hosting/discovery"
WOPI_HOST_ENDPOINT: "http://imixs-documents:8080/api/wopi/"
COLLABORA_CONVERTER_URL: "http://collabora:9980/lool/convert-to/"
# Imixs-Archive
# ARCHIVE_SERVICE_ENDPOINT: "http://imixs-archive:8080/api"
# Imixs-AI
# Optional configured via imixs.properties
LLM_SERVICE_ENDPOINT: "https://llama.cpp.imixs.com/"
LLM_SERVICE_ENDPOINT_USER: "admin"
LLM_SERVICE_ENDPOINT_PASSWORD: "imixs4.null"
# Cassandra Embeddings
EMBEDDINGS_CLUSTER_CONTACTPOINTS: "cassandra"
EMBEDDINGS_CLUSTER_KEYSPACE: "embeddings"
# OIDC
OIDCCONFIG_PROVIDERURI: "http://keycloak.imixs.local:8084/realms/dynamixsai/.well-known/openid-configuration"
OIDCCONFIG_CLIENTID: "imixs"
OIDCCONFIG_CLIENTSECRET: "aSuEXUeD7bARAlX8o3fLagSYbIagBrrM"
OIDCCONFIG_REDIRECTURI: "http://localhost:8080/callback"
#OIDCCONFIG_SCOPE: "openid profile email"
#OIDCCONFIG_CLAIM_CALLERNAME: "preferred_username"
#OIDCCONFIG_CLAIM_ROLES: "groups"
ports:
- "8080:8080"
- "9990:9990"
- "8787:8787"
volumes:
- ./deployments:/opt/jboss/wildfly/standalone/deployments/
- ./import_examples:/opt/jboss/import_examples/
# Mapping the host ip to the container
# This setting is used for local testing only
# Wildfly can access the keycloak server via the external host address
extra_hosts:
- "keycloak.imixs.local:host-gateway"
#######################
# Tika OCR Service
#######################
tika:
#image: imixs/tika
image: apache/tika:1.24.1-full
environment:
TZ: "Europe/Berlin"
ports:
- "9998:9998"
#######################
# Cassandra
#######################
cassandra:
image: cassandra:5.0.4
container_name: cassandra
mem_limit: 2G # Mindestens 2 GB RAM für Cassandra 5.x
mem_reservation: 1G # Reserviert 1 GB
environment:
- TZ="Europe/Berlin"
- JVM_OPTS=-Xms1G -Xmx1G # Heap auf 1 GB begrenzen
- CASSANDRA_CLUSTER_NAME=dynamixsAiCluster
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- CASSANDRA_DC=datacenter1
- CASSANDRA_RACK=rack1
ports:
- "9042:9042" # CQL-Port
- "7000:7000" # Inter-Node-Kommunikation
- "7001:7001" # TLS-fähige Inter-Node-Kommunikation
- "7199:7199" # JMX-Port
volumes:
- cassandra_data:/var/lib/cassandra
#######################
# collabora Office Online
#######################
collabora:
image: collabora/code:23.05.0.5.1
#expose:
# - 9980
ports:
- "9980:9980"
environment:
- username=admin
- password=adminadmin
- extra_params=--o:ssl.enable=false
- aliasgroup1=http://app:8080
volumes:
- ./configuration/collabora/fonts:/usr/share/fonts/truetype/more/
- ./configuration/collabora/fonts:/opt/cool/systemplate/usr/share/fonts/truetype/more/
#######################
# Imixs Admin Client
#######################
# imixsadmin:
# image: imixs/imixs-admin
# ports:
# - "8888:8080"
##################################
# Keycloak SQL Server
##################################
dbkeycloak:
image: postgres:15
environment:
POSTGRES_PASSWORD: adminadmin
POSTGRES_USER: keycloak
POSTGRES_DB: keycloak
volumes:
- dbkeycloak:/var/lib/postgresql/data
##################################
# Keycloak Server
##################################
keycloak:
#image: quay.io/keycloak/keycloak:23.0.5
image: quay.io/keycloak/keycloak:26.2.4
command:
- start-dev
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=adminadmin
- KC_DB=postgres
- KC_DB_URL=jdbc:postgresql://dbkeycloak:5432/keycloak
- KC_DB_USER=keycloak
- KC_DB_PASSWORD=adminadmin
volumes:
- /etc/localtime:/etc/localtime:ro
- ./configuration/keycloak/themes/:/opt/keycloak/themes/
ports:
- "8084:8080"
volumes:
dbdata-hai:
dbkeycloak:
cassandra_data:

View file

@ -1,52 +0,0 @@
version: "3.1"
services:
db:
image: postgres:9.6.1
environment:
POSTGRES_PASSWORD: adminadmin
POSTGRES_DB: office
volumes:
- dbdata:/var/lib/postgresql/data
app:
image: imixs/imixs-office-workflow
depends_on:
- db
environment:
TZ: "Europe/Berlin"
JAVA_OPTS: "-Dnashorn.args=--no-deprecation-warning"
MAILGATEWAY: "localhost"
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "adminadmin"
POSTGRES_CONNECTION: "jdbc:postgresql://db/office"
METRICS_ENABLED: "true"
ports:
- "8080:8080"
- "9990:9990"
- "8787:8787"
volumes:
- ./deployments:/opt/jboss/wildfly/standalone/deployments/
# imixsadmin:
# image: imixs/imixs-admin
# ports:
# - "8888:8080"
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheusdata:/prometheus/
grafana:
image: grafana/grafana:7.1.0
ports:
- "3000:3000"
volumes:
prometheusdata:
dbdata:

View file

@ -1,65 +0,0 @@
#!/bin/bash
# Überprüfen, ob eine Eingabedatei angegeben wurde
if [ $# -ne 1 ]; then
echo "Verwendung: $0 input.csv"
exit 1
fi
input_file="$1"
output_file="${input_file%.*}_clean.csv"
# Temporäre Datei für die Verarbeitung
temp_file=$(mktemp)
# Verarbeitung:
# 1. Zuerst alle echten Zeilenumbrüche (die nicht in Anführungszeichen sind) markieren
# 2. Dann Newlines innerhalb von Anführungszeichen durch Leerzeichen ersetzen
# 3. HTML-Tags entfernen
# 4. Markierte Zeilenumbrüche wiederherstellen
awk '
BEGIN { FPAT = "([^;]*)|(\"[^\"]+\")"; OFS=";"; in_quotes=0 }
{
# Zeilen zusammenfügen, wenn sie unvollständig sind (nur für Sicherheit)
if (NR == 1) {
full_line = $0
} else {
full_line = full_line " " $0
}
# Überprüfen, ob die Zeile vollständig ist (gleich viele öffnende und schließende Anführungszeichen)
quotes = gsub(/"/, "&", full_line)
if (quotes % 2 == 0) {
# Zeile ist vollständig, jetzt verarbeiten
$0 = full_line
# Newlines in jedem Feld durch Leerzeichen ersetzen
for (i=1; i<=NF; i++) {
# HTML-Tags entfernen
gsub(/<[^>]*>/, "", $i)
# Newlines und mehrfache Leerzeichen bereinigen
gsub(/\n/, " ", $i)
gsub(/ +/, " ", $i)
# Feld trimmen
sub(/^[ \t]+/, "", $i)
sub(/[ \t]+$/, "", $i)
# Feld wieder in Anführungszeichen setzen, wenn es Semikolons oder Anführungszeichen enthält
if (($i ~ /;/ || $i ~ /"/) && $i !~ /^".*"$/) {
gsub(/"/, "\"\"", $i) # Escape existing quotes
$i = "\"" $i "\""
}
}
print
full_line = ""
}
}' "$input_file" > "$temp_file"
# Endgültige Bereinigung
mv "$temp_file" "$output_file"
echo "Bereinigte Datei wurde erstellt: $output_file"

View file

@ -1,36 +0,0 @@
id;customer.name;customer.address;customer.zip;customer.city;customer.phone;customer.email;customer.web;customer.country
1;TechSolutions GmbH;Musterstraße 123;10115;Berlin;+49 30 12345678;info@techsolutions.de;www.techsolutions.de;DE
2;Innovate AG;Hauptstraße 45;80335;München;+49 89 87654321;contact@innovate-ag.com;www.innovate-ag.com;AU
3;DataSystems Ltd.;Industriestraße 78;20095;Hamburg;+49 40 5559876;office@datasystems.de;www.datasystems.de;JP
4;WebCraft GmbH;Am Bahnhof 5;50667;Köln;+49 221 9876543;info@webcraft.de;www.webcraft.de;DE
5;CloudExperts AG;TechPark 12;70173;Stuttgart;+49 711 123457;support@cloudexperts.de;www.cloudexperts.de;DE
6;SoftwareHub GmbH;Friedrichstraße 33;60323;Frankfurt;+49 69 5551234;info@softwarehub.de;www.softwarehub.de;DE
7;DigitalWorks Ltd.;Königsallee 1;40212;Düsseldorf;+49 211 8765432;contact@digitalworks.de;www.digitalworks.de;DE
8;NetSolutions GmbH;Hansastraße 62;04109;Leipzig;+49 341 2345678;office@netsolutions.de;www.netsolutions.com;DE
9;CodeMasters AG;Rathausplatz 8;86150;Augsburg;+49 821 9876543;info@codemasters.de;www.codemasters.de;DE
10;FutureTech GmbH;Am Markt 3;38100;Braunschweig;+49 531 5559876;contact@futuretech.de;www.futuretech.de;DE
11;SmartSystems Ltd.;Ludwigstraße 15;97070;Würzburg;+49 931 1234567;support@smartsystems.de;www.smartsystems.de;CN
12;AppFactory GmbH;Poststraße 23;14467;Potsdam;+49 331 8765432;info@appfactory.de;www.appfactory.de;CN
13;DataLabs AG;Goethestraße 98;99084;Erfurt;+49 361 9876543;office@datalabs.de;www.datalabs.de;CN
14;WebInnovate GmbH;Schillerstraße 44;30159;Hannover;+49 511 5551234;contact@webinnovate.de;www.webinnovate.de;CN
15;CloudSystems Ltd.;Bahnhofstraße 77;66111;Saarbrücken;+49 681 2345678;info@cloudsystems.de;www.cloudsystems.de;CN
21;GlobalTech Solutions;124 Oxford Street;W1D 2HQ;London;+44 20 7123 4567;info@globaltech.co.uk;www.globaltech.co.uk;CN
22;InnovateX Ltd;78 Canary Wharf;E14 5AB;London;+44 20 7987 6543;contact@innovatex.com;www.innovatex.com;CN
23;DataDynamics Inc;446 Silicon Roundabout;EC2A 4NE;London;+44 20 7555 12345;office@datadynamics.com;www.datadynamics.com;FR
24;CloudSphere GmbH;TechPark Berlin 15;10115;Berlin;+49 30 9876 15432;info@cloudsphere.de;www.cloudsphere.de;FR
25;WebCraft International;200 Madison Ave;10016;New York;+1 212 555 7890;support@webcraft.com;www.webcraft.com;FR
26;DigitalFrontiers Pte Ltd;1 Raffles Place;048616;Singapore;+65 6123 4567;info@digitalfrontiers.sg;www.digitalfrontiers.sg;FR
27;TechNova SAS;55 Praspiekt Pieramozcau;75008;Misnk; 1 42 86 53 09;contact@technova.by;www.technova.by;BY
28;AppFactory Ltd;88 Kingsway;WC2B 6AA;London;+44 20 7123 9876;office@appfactory.io;www.appfactory.io;FR
29;GlobalData Systems;Level 25 One Canada Square;E14 5AB;London;+44 20 7987 1234;info@globaldata.com;www.globaldata.com;FR
210;SmartSolutions AG;Bahnhofstrasse 45;8001;Zurich;+41 44 234 56 78;contact@smartsolutions.ch;www.smartsolutions.ch;FR
211;InnovationHub Ltd;22 Shoreditch High Street;E1 6PE;London;+44 20 7555 8765;support@innovationhub.co.uk;www.innovationhub.co.uk;UK
212;CyberSecure Inc;500 5th Avenue;10110;New York;+1 212 867 5309;security@cybersecure.com;www.cybersecure.com;FR
213;TechBridge Tokyo;Shinjuku Center Building 1-25-1;163-0650;Tokyo;+81 3 5321 7890;info@techbridge.jp;www.techbridge.jp;JP
214;LondonDigital Agency;15 Covent Garden;WC2E 8BE;London;+44 20 7123 5555;hello@londondigital.com;www.londondigital.com;FR
215;GlobalInnovate Group;Tower 42; 25 Old Broad Street;EC2N 1HQ;London;+44 20 7987 9999;info@globalinnovate.com;www.globalinnovate.com;FR
216;DataCraft Sydney;1 Macquarie Place;2000;Sydney;+61 2 9123 4567;au@datacraft.com;www.datacraft.com;FR
217;EuroTech Solutions;Amsterdam Towers;1011 PN;Amsterdam;+31 20 765 4321;info@eurotech.nl;www.eurotech.nl;NL
218;LondonFinTech Labs;Level 39; One Canada Square;E14 5AB;London;+44 20 7555 4321;finance@londonfintech.com;www.londonfintech.com;UK
219;CloudMasters Inc;221 Main Street;94105;San Francisco;+1 415 555 1234;support@cloudmasters.com;www.cloudmasters.com;FR
220;TechVenture Capital;8 St. James's Square;SW1Y 4JU;London;+44 20 7123 7777;invest@techventure.com;www.techventure.com;FR
Can't render this file because it has a wrong number of fields in line 31.

View file

@ -1,90 +0,0 @@
ID;Name;Description;stock;price;category;subcategory;Lieferzeit;EAN
DEV001;Arduino Uno R3a;The Arduino Uno R3 is a foundational microcontroller board based on the ATmega328P. It features 14 digital I/O pins, 6 analog inputs, a 16 MHz quartz crystal, USB connectivity, and a power jack. Operating voltage is 5V. It is the ideal platform for beginners in electronics and coding, widely used for prototyping, DIY projects, automation, robotics, and educational purposes. It can be programmed using the Arduino IDE.;45;22.99;Microcontroller & Development Boards;Arduino Boards;2-3 Tage;7630049200016
DEV002;Raspberry Pi 4 Model B 4GB;The new high-performance single-board computer featuring a Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC running at 1.5GHz and 4GB of LPDDR4-3200 SDRAM. Connectivity includes dual-band 2.4/5.0 GHz Wi-Fi, Bluetooth 5.0, Gigabit Ethernet, two USB 3.0 ports, and two micro-HDMI ports supporting dual 4K displays. Its primary use is as a low-cost desktop computer, network-attached storage (NAS) device, media center, or embedded system for industrial applications.;28;75.50;Microcontroller & Development Boards;Raspberry Pi Boards;5-7 Tage;1931000001047
DEV003;ESP32-WROOM-312 Development Board;A powerful Wi-Fi and Bluetooth-enabled microcontroller board with dual-core Xtensa LX6 processor. Features 4MB flash memory, 520KB SRAM, 34 GPIO pins, and supports various communication protocols like I2C, I2S, SPI, and UART. Ideal for IoT projects, smart home devices, and wireless applications requiring robust connectivity and processing power.;67;12.95;Microcontroller & Development Boards;ESP32/8266 Boards;3-5 Tage;8717478034021
DEV004;STM32F407VET6 Development Board;High-performance ARM Cortex-M4 based board with DSP and FPU instructions. Features 512KB flash, 192KB RAM, USB OTG, Ethernet, and multiple timers. Operating frequency up to 168MHz. Suitable for industrial control, motor control, audio processing, and advanced embedded applications requiring high computational power.;23;35.80;Microcontroller & Development Boards;Other Microcontrollers;7-10 Tage;6940541880018
DEV005;Arduino Motor Shield Rev3;Add-on shield designed to drive inductive loads such as relays, solenoids, DC and stepper motors. Features two channels that support 2A continuous current, screw terminals for easy connection, and built-in protection diodes. Perfect for robotics projects and automation systems when used with Arduino boards.;89;24.50;Microcontroller & Development Boards;Accessories;1-2 Tage;7630049200023
DEV006;Raspberry Pi 4 Official Case;Official protective case for Raspberry Pi 4 Model B with integrated GPIO access and dedicated slots for camera and display cables. Features a modular design with three plates for easy access to ports and components. Made from high-quality white plastic with colored accents.;156;8.99;Microcontroller & Development Boards;Accessories;1-2 Tage;1931000001054
DEV007;DHT22 AM2302 Digital Sensor;A pre-calibrated digital temperature and humidity sensor module. It provides a digital signal output and features a dedicated NTC for temperature measurement and a resistive humidity sensing element. Operating voltage: 3.3V - 6V. Measurement range: Humidity 0-100% RH, Temperature -40 to 80°C. Accuracy: ±2% RH and ±0.5°C. Typical applications include HVAC systems, weather stations, environmental monitoring, home automation, and data logging projects. It is easy to interface with Arduino, Raspberry Pi, and other microcontrollers.;120;9.95;Sensors & Modules;Temperature & Humidity Sensors;1-2 Tage;8591854063228
DEV008;HC-SR05 Ultrasonic Sensor;Ultrasonic distance measurement module with 2cm to 400cm non-contact range. Operating voltage: 5V DC. Provides excellent ranging accuracy with stable readings. Uses sonar principles to determine distance to objects. Ideal for obstacle avoidance robots, parking assistance systems, and liquid level measurement.;204;3.50;Sensors & Modules;Motion & Proximity Sensors;1-2 Tage;6943185501012
DEV009;PIR Motion Sensor HC-SR501;Passive infrared motion detection sensor with adjustable sensitivity and delay time. Detection range up to 7 meters with 120-degree detection angle. Operating voltage: 4.5-20V DC. Features low power consumption and reliable performance. Perfect for security systems, automatic lighting control, and energy-saving applications.;178;4.25;Sensors & Modules;Motion & Proximity Sensors;1-2 Tage;6943185501029
DEV010;BH1750 Digital Light Sensor;Digital ambient light sensor with I2C interface and 16-bit resolution. Measurement range: 1-65535 lux. Features low power consumption and high precision. No need for external components. Ideal for display backlight control in mobile devices, automatic brightness adjustment systems, and environmental light monitoring.;95;6.80;Sensors & Modules;Light, Color & Gesture Sensors;2-3 Tage;8591854063235
DEV011;APDS-9960 Gesture Sensor;Advanced gesture detection, proximity sensing, and ambient light sensor in one module. Features I2C interface with interrupt output. Can detect simple gestures (up, down, left, right) and measure proximity up to 20cm. Perfect for touchless interfaces, interactive displays, and smart home control.;63;15.75;Sensors & Modules;Light, Color & Gesture Sensors;3-5 Tage;8717478034038
DEV012;MQ-2 Gas Sensor Module;Semiconductor gas sensor for detecting LPG, propane, hydrogen, methane, alcohol, and smoke. Analog and digital output with adjustable sensitivity. Heating voltage: 5V±0.2V. Fast response and recovery time. Suitable for gas leak detection in home and industry, air quality monitoring, and safety systems.;112;8.45;Sensors & Modules;Gas, Air Quality & Pressure Sensors;2-3 Tage;6943185501036
DEV013;BMP2810 Barometric Pressure Sensor;High-precision digital barometric pressure and temperature sensor with I2C and SPI interfaces. Pressure range: 300-1100 hPa with ±1 hPa absolute accuracy. Temperature measurement with ±1.0°C accuracy. Low power consumption. Ideal for weather stations, altitude tracking, and indoor navigation.;87;9.20;Sensors & Modules;Gas, Air Quality & Pressure Sensors;2-3 Tage;8591854063242
DEV014;NEO-6M GPS Module;GPS receiver module with built-in EEPROM and ceramic antenna. Provides accurate positioning with 2.5m accuracy. Supports up to 5Hz update rate with NMEA protocol. Operating voltage: 3.3-5V. Features low power consumption and hot start capability. Perfect for navigation systems, tracking devices, and drones.;134;18.90;Sensors & Modules;GPS & Location Modules;3-5 Tage;8717478034045
DEV015;RC522 RFID Reader Module;RFID reader/writer operating at 13.56MHz with SPI interface. Reading distance up to 5cm. Supports ISO 14443A standard tags. Operating voltage: 2.5-3.3V. Ideal for access control systems, attendance tracking, payment systems, and interactive applications.;198;7.85;Sensors & Modules;RFID & NFC Modules;1-2 Tage;6943185501043
DEV016;37-in-1 Sensor Module Kit;Comprehensive sensor kit containing 37 most popular modules including temperature, humidity, motion, light, sound, and gas sensors. Comes with tutorial CD and connection diagrams. Perfect for beginners learning electronics and IoT programming. All modules are compatible with Arduino and Raspberry Pi.;45;89.99;Sensors & Modules;Sensor Kits;5-7 Tage;7630049200030
DEV017;SG90 Micro Servo Motor;TowerPro SG90 mini servo motor with 180-degree rotation range. Operating voltage: 4.8V. Stall torque: 1.8kg/cm. Comes with plastic gears and three-wire interface (power, ground, signal). Ideal for robotics, RC models, camera positioning, and small automation projects.;312;4.75;Actuators & Output;Motors;1-2 Tage;6940541880025
DEV018;28BYJ-48 Stepper Motor with Driver;Unipolar stepper motor with ULN2003 driver board. Step angle: 5.625° x 1/64 reduction ratio. Operating voltage: 5-12V DC. Provides precise position control without feedback. Perfect for 3D printers, CNC machines, automated curtains, and precision positioning systems.;167;12.50;Actuators & Output;Motors;2-3 Tage;8591854063259
DEV019;L298N Motor Driver Module;Dual H-bridge motor driver capable of driving two DC motors or one stepper motor. Operating voltage: 5-35V. Maximum current: 2A per channel. Features logic level conversion and heat sink. Ideal for robotics projects, motor control applications, and high-power driving needs.;98;8.95;Actuators & Output;Motor Drivers & Controllers;2-3 Tage;8717478034052
DEV020;5V Relay Module;Single channel relay module with optocoupler isolation. Operating voltage: 5V. Switching capacity: 10A 250V AC or 30V DC. Features status LED and standard interface for easy connection to microcontrollers. Perfect for controlling high-voltage appliances with low-voltage circuits.;245;3.25;Actuators & Output;Relays & Switches;1-2 Tage;6943185501050
DEV021;16x2 LCD Display with I2C;Blue backlight LCD display with 16 characters x 2 lines and I2C interface module. Operating voltage: 5V. Contrast adjustable. The I2C interface reduces required GPIO pins from 6 to 2. Ideal for displaying system status, sensor readings, and user interface information.;143;14.99;Actuators & Output;Displays;2-3 Tage;7630049200047
DEV022;0.96 inch OLED Display;128x64 pixel OLED display with SSD1306 driver and I2C/SPI interface. Features high contrast, wide viewing angle, and low power consumption. Operating voltage: 3.3-5V. Perfect for projects requiring compact, high-quality graphics display.;189;10.45;Actuators & Output;Displays;2-3 Tage;1931000001061
DEV023;5mm RGB LED Common Cathode;Diffused RGB LED with common cathode configuration. Operating voltage: 2.0-2.5V (Red), 3.0-3.4V (Green/Blue). Maximum current: 20mA per color. Provides full color spectrum mixing. Ideal for status indicators, mood lighting, and visual feedback in projects.;500;0.75;Actuators & Output;LEDs & Lighting;1-2 Tage;8591854063266
DEV024;Active Buzzer Module;5V active buzzer with built-in oscillator that produces continuous sound when powered. Operating voltage: 3.3-5V. Sound output: approximately 85dB. Easy to drive with microcontroller digital pin. Perfect for alarm systems, timers, and user notification applications.;287;2.10;Actuators & Output;Buzzers & Speakers;1-2 Tage;6943185501067
DEV025;1K Ohm Resistor Pack;Assortment of 100 pieces 1K ohm 1/4W metal film resistors with 1% tolerance. Temperature coefficient: 50ppm/°C. Perfect for pull-up/pull-down resistors, voltage dividers, and current limiting in various electronic circuits.;15;4.99;Components & Parts;Resistors, Capacitors, Potentiometers;1-2 Tage;8717478034069
DEV026;100uF Electrolytic Capacitor;Radial lead electrolytic capacitor with 25V voltage rating. Operating temperature: -40°C to +85°C. Low ESR and high ripple current capability. Ideal for power supply filtering, audio circuits, and general decoupling applications.;420;0.25;Components & Parts;Resistors, Capacitors, Potentiometers;1-2 Tage;6940541880032
DEV027;10K Ohm Linear Potentiometer;Rotary potentiometer with 10K ohm resistance and linear taper. Shaft length: 15mm. Power rating: 0.5W. Features smooth rotation and reliable performance. Perfect for volume control, brightness adjustment, and parameter tuning.;195;1.20;Components & Parts;Resistors, Capacitors, Potentiometers;1-2 Tage;8591854063273
DEV028;2N2222A NPN Transistor;General purpose NPN bipolar junction transistor in TO-92 package. Collector current: 800mA max. Collector-emitter voltage: 40V max. Gain bandwidth: 250MHz. Ideal for switching and amplification applications in various electronic circuits.;876;0.35;Components & Parts;Transistors & MOSFETs;1-2 Tage;7630049200054
DEV029;IRFZ44N N-Channel MOSFET;Power MOSFET with low on-resistance and fast switching speed. Drain-source voltage: 55V. Continuous drain current: 49A. TO-220 package. Perfect for motor control, power switching, and high-current applications.;321;2.15;Components & Parts;Transistors & MOSFETs;1-2 Tage;1931000001078
DEV030;1N4007 Rectifier Diode;General purpose rectifier diode with 1000V maximum repetitive reverse voltage and 1A average forward current. DO-41 package. Ideal for power supply rectification, reverse polarity protection, and general purpose switching.;650;0.15;Components & Parts;Diodes & LEDs;1-2 Tage;8717478034076
DEV031;5mm Green LED;Diffused green LED with 20mA forward current and 2.1V forward voltage. Viewing angle: 30 degrees. Luminous intensity: 5000-8000 mcd. Perfect for status indicators, panel lights, and visual feedback in electronic projects.;1200;0.20;Components & Parts;Diodes & LEDs;1-2 Tage;6943185501074
DEV032;6x6mm Tactile Switch;Momentary push button switch with through-hole mounting. Operating force: 160±50gf. Contact resistance: <50mΩ. Life expectancy: 100,000 cycles. Ideal for user input, reset buttons, and control interfaces.;890;0.10;Components & Parts;Buttons & Switches;1-2 Tage;8591854063280
DEV033;Toggle Switch SPDT;Single pole double throw toggle switch with on-on configuration. Rating: 6A 125V AC / 3A 250V AC. Panel mount design with nut and washer. Perfect for power switching, mode selection, and circuit configuration.;134;2.95;Components & Parts;Buttons & Switches;2-3 Tage;6940541880049
DEV034;Jumper Wires Male-to-Male;Bundle of 120 pieces 20cm male-to-male jumper wires in multiple colors. 0.1 pitch. Made with high-quality Dupont connectors. Perfect for breadboard connections, prototyping, and wiring Arduino projects.;45;6.99;Components & Parts;Wires, Cables & Connectors;1-2 Tage;7630049200061
DEV035;USB Type B Cable;1.5 meter USB 2.0 Type A to Type B cable with gold-plated connectors. Data transfer speed up to 480Mbps. 28AWG power conductors. Perfect for connecting Arduino boards, printers, and other devices with Type B接口.;178;7.50;Components & Parts;Wires, Cables & Connectors;1-2 Tage;1931000001085
DEV036;400-Point Solderless Breadboard;High-quality solderless breadboard with 400 tie points. Features two power rails and 63 rows of interconnected terminals. Adhesive backing for secure mounting. Maximum voltage: 300V. Ideal for circuit prototyping and testing.;67;8.25;Components & Parts;Breadboards & Prototyping;1-2 Tage;8717478034083
DEV037;Breadboard Jumper Wire Kit;Kit containing 140 pieces of pre-cut and stripped jumper wires in various lengths and colors. Includes male-to-male, male-to-female, and female-to-female types. Organized in convenient storage box. Perfect for breadboard prototyping.;92;12.99;Components & Parts;Breadboards & Prototyping;1-2 Tage;6943185501081
DEV038;12V 2A Power Supply;Switching power adapter with 12V DC output and 2A maximum current. Input: 100-240V AC. Comes with 5.5mm x 2.1mm barrel jack connector. Short circuit and overvoltage protection. Ideal for powering Arduino projects, LED strips, and various electronics.;58;14.95;Power & Battery;Power Supplies;3-5 Tage;8591854063297
DEV039;5V 3A USB Power Supply;High-current USB power supply with 5V 3A output. Features built-in USB Type-A port and overcurrent protection. Input: 100-240V AC. Perfect for powering Raspberry Pi, high-power USB devices, and charging applications.;47;11.50;Power & Battery;Power Supplies;2-3 Tage;6940541880056
DEV040;4xAA Battery Holder;Plastic battery holder for 4 AA batteries with series connection providing 6V output. Features wire leads with stripped ends and on/off switch. Secure battery closure. Perfect for portable projects and backup power.;124;3.75;Power & Battery;Battery Holders;1-2 Tage;7630049200078
DEV041;TP4056 Lithium Charger Module;Single cell lithium battery charging module with 1A maximum charge current. Features charging status indicators and protection circuits. Input: 5V USB. Supports 3.7V Li-ion and LiPo batteries. Perfect for portable projects.;216;4.25;Power & Battery;Charging Circuits;2-3 Tage;1931000001092
DEV042;LM2596 DC-DC Buck Converter;Adjustable step-down voltage regulator module with 3A maximum output current. Input voltage: 4.5-40V. Output voltage: 1.5-35V adjustable. Efficiency up to 92%. Features overheat and short circuit protection.;189;5.95;Power & Battery;Voltage Regulators & Converters;2-3 Tage;8717478034090
DEV043;60W Soldering Station;Temperature controlled soldering station with 60W power and adjustable temperature range 200-480°C. Features ceramic heating element, sleep mode, and digital display. Comes with soldering iron stand and sponge. Perfect for electronics repair and prototyping.;34;49.99;Tools & Equipment;Soldering Equipment;5-7 Tage;6943185501098
DEV044;Digital Multimeter DT9205A;3-1/2 digit digital multimeter with LCD display. Measures AC/DC voltage, current, resistance, capacitance, frequency, and temperature. Features diode test, continuity buzzer, and data hold. Comes with test leads and carrying case.;29;38.50;Tools & Equipment;Multimeters & Test Equipment;3-5 Tage;8591854063303
DEV045;65-Piece Screwdriver Set;Precision screwdriver set with 65 pieces including various Phillips, flat, Torx, and hex bits. Magnetic tips and comfortable handle. Organized in durable carrying case. Perfect for electronics repair, smartphone disassembly, and精密 work.;56;24.95;Tools & Equipment;Tool Kits;2-3 Tage;6940541880063
DEV046;Plastic Project Enclosure 160x100x60mm;Plastic electronic project box with dimensions 160x100x60mm. Features mounting posts for PCBs, ventilation slots, and removable lid. Material: ABS plastic. Perfect for housing electronic projects and prototypes.;78;9.75;Tools & Equipment;Enclosures & Boxes;3-5 Tage;7630049200085
DEV047;Arduino Nano Every;Compact board based on the ATMega4809 with 20MHz operating frequency. Features 48KB flash, 6KB SRAM, and 22 GPIO pins. Compatible with Arduino Nano footprint. Perfect for space-constrained projects requiring Arduino compatibility.;91;18.50;Microcontroller & Development Boards;Arduino Boards;3-5 Tage;7630049200092
DEV048;Raspberry Pi Pico W;Microcontroller board with RP2040 chip and wireless connectivity. Features 264KB SRAM, 2MB flash, and 30 GPIO pins. Supports MicroPython and C/C++. Built-in Wi-Fi and Bluetooth. Ideal for IoT projects and wireless applications.;167;9.95;Microcontroller & Development Boards;Raspberry Pi Boards;2-3 Tage;1931000001108
DEV049;ESP32-CAM Development Board;ESP32 module with OV2640 camera and microSD card slot. Features 4MB flash, 520KB SRAM, and supports Wi-Fi and Bluetooth. Provides video streaming and image capture capabilities. Perfect for security cameras and IoT vision applications.;124;15.75;Microcontroller & Development Boards;ESP32/8266 Boards;3-5 Tage;8717478034106
DEV050;ATtiny85 Development Board;Compact development board based on ATtiny85 microcontroller. Features 8KB flash, 512B SRAM, and 6 GPIO pins. Operating voltage: 5V. Perfect for simple projects requiring minimal I/O and small form factor.;205;6.25;Microcontroller & Development Boards;Other Microcontrollers;2-3 Tage;6943185501104
DEV051;Arduino Ethernet Shield;Network connectivity shield for Arduino with W5500 Ethernet controller. Supports TCP/IP protocols and provides SD card slot. Operating voltage: 5V. Perfect for network-connected projects and data logging.;76;32.99;Microcontroller & Development Boards;Accessories;4-6 Tage;8591854063310
DEV052;Raspberry Pi Official Power Supply;Official 15.3W USB-C power supply for Raspberry Pi 4. Output: 5.1V DC, 3A. Features noise filtering and overcurrent protection. Includes 1.5m USB-C cable. Ensures stable power for Raspberry Pi operation.;142;11.99;Microcontroller & Development Boards;Accessories;2-3 Tage;6940541880070
DEV053;DS18B20 Waterproof Temperature Sensor;Digital temperature sensor with 1-wire interface and waterproof stainless steel probe. Measurement range: -55°C to +125°C with ±0.5°C accuracy. 1-meter cable length. Perfect for liquid temperature measurement, environmental monitoring, and industrial applications.;188;8.95;Sensors & Modules;Temperature & Humidity Sensors;2-3 Tage;7630049200108
DEV054;HC-SR501 PIR Motion Sensor;Passive infrared motion detector with adjustable time and sensitivity. Detection range: 7 meters with 120° angle. Operating voltage: 4.5-20V DC. Features low power consumption. Ideal for security systems and automatic lighting.;156;4.50;Sensors & Modules;Motion & Proximity Sensors;1-2 Tage;1931000001115
DEV055;VL53L0X Laser Distance Sensor;Time-of-flight laser ranging sensor with 2m measurement range and 1mm resolution. I2C interface. Operating voltage: 2.6-3.5V. Features high accuracy and immune to ambient light. Perfect for gesture recognition and proximity sensing.;97;14.25;Sensors & Modules;Motion & Proximity Sensors;3-5 Tage;8717478034113
DEV056;TCS34725 Color Sensor;RGB color light sensor with IR filter and white LED. I2C interface with interrupt output. Provides clear, red, green, blue, and lux measurements. Perfect for color sorting, ambient light sensing, and display calibration.;84;13.75;Sensors & Modules;Light, Color & Gesture Sensors;2-3 Tage;6943185501111
DEV057;VCNL4040 Proximity Sensor;Integrated proximity and ambient light sensor with I2C interface. Proximity range: 0-200mm. Features interrupt function and low power consumption. Perfect for touchless interfaces and presence detection.;119;9.80;Sensors & Modules;Light, Color & Gesture Sensors;2-3 Tage;8591854063327
DEV058;MQ-135 Air Quality Sensor;Semiconductor sensor for detecting harmful gases like NH3, NOx, alcohol, benzene, and CO2. Analog output with adjustable sensitivity. Heating voltage: 5V±0.1V. Suitable for air quality monitoring and environmental detection.;145;7.25;Sensors & Modules;Gas, Air Quality & Pressure Sensors;2-3 Tage;6940541880087
DEV059;BME280 Environmental Sensor;Integrated environmental sensor measuring temperature, humidity, and barometric pressure. I2C/SPI interfaces. Operating voltage: 1.8-3.6V. Low power consumption. Ideal for weather stations and environmental monitoring.;132;14.50;Sensors & Modules;Gas, Air Quality & Pressure Sensors;3-5 Tage;7630049200115
DEV060;U-blox NEO-M8N GPS Module;High-performance GPS module with 72 channels and 2.5m accuracy. Supports GPS, GLONASS, and BeiDou systems. Update rate: up to 10Hz. Perfect for drones, navigation systems, and precision tracking.;89;26.95;Sensors & Modules;GPS & Location Modules;4-6 Tage;1931000001122
DEV061;PN532 NFC RFID Module;NFC/RFID reader/writer supporting ISO 14443A/B, ISO 18092, and FeliCa protocols. Operating frequency: 13.56MHz. Interfaces: I2C, SPI, HSU. Reading distance: up to 5cm. Ideal for contactless payment and access control.;107;18.75;Sensors & Modules;RFID & NFC Modules;3-5 Tage;8717478034120
DEV062;Arduino Sensor Kit;Complete sensor kit containing 37 modules compatible with Arduino. Includes tutorials and code examples. Covers basic to advanced sensors. Perfect for educational purposes and learning electronics.;68;79.99;Sensors & Modules;Sensor Kits;5-7 Tage;6943185501128
DEV063;NEMA 17 Stepper Motor;Bipolar stepper motor with 1.8° step angle and 42mm frame size. Holding torque: 40Ncm. Current: 1.2A per phase. 4-wire connection. Perfect for 3D printers, CNC machines, and precision positioning systems.;45;28.95;Actuators & Output;Motors;4-6 Tage;8591854063334
DEV064;L293D Motor Driver IC;Quadruple half-H driver for bidirectional DC motor control. Operating voltage: 4.5-36V. Output current: 600mA per channel. DIP-16 package. Perfect for controlling small motors and solenoids.;213;3.45;Actuators & Output;Motor Drivers & Controllers;1-2 Tage;6940541880094
DEV065;5V 4-Channel Relay Module;4-channel relay module with optocoupler isolation and status LEDs. Operating voltage: 5V. Switching capacity: 10A 250V AC per channel. Features screw terminals and standard control interface.;124;15.50;Actuators & Output;Relays & Switches;2-3 Tage;7630049200122
DEV066;20x4 LCD Display with I2C;Large LCD display with 20 characters x 4 lines and I2C interface. Blue backlight with adjustable contrast. Operating voltage: 5V. Perfect for projects requiring extensive text display.;87;19.95;Actuators & Output;Displays;3-5 Tage;1931000001139
DEV067;1.3 inch IPS LCD Display;1.3 inch IPS display with 240x240 resolution and ST7789 driver. SPI interface with 65K colors. Operating voltage: 3.3V. Features high brightness and wide viewing angle. Perfect for graphics and GUI applications.;134;16.75;Actuators & Output;Displays;3-5 Tage;8717478034137
DEV068;WS2812B RGB LED Strip;Addressable RGB LED strip with 30 LEDs per meter. Each LED individually controllable via single-wire protocol. Operating voltage: 5V. Perfect for decorative lighting, art installations, and visual effects.;78;18.50;Actuators & Output;LEDs & Lighting;2-3 Tage;6943185501135
DEV069;Piezo Buzzer Element;Passive piezo buzzer without internal oscillator. Requires external driver circuit. Operating voltage: 3-20V. Resonant frequency: 4kHz. Compact size. Ideal for custom tone generation and audio projects.;345;1.25;Actuators & Output;Buzzers & Speakers;1-2 Tage;8591854063341
DEV070;Assorted Resistor Kit;Comprehensive resistor kit with 1000 pieces covering values from 10 ohm to 1M ohm. 1/4W metal film with 1% tolerance. Organized in storage box with value labels. Perfect for electronics projects and repairs.;28;29.99;Components & Parts;Resistors, Capacitors, Potentiometers;2-3 Tage;6940541880100
DEV071;100nF Ceramic Capacitor;Multilayer ceramic capacitor with 100nF capacitance and 50V rating. X7R dielectric material. Through-hole design. Ideal for decoupling, filtering, and timing applications.;1200;0.15;Components & Parts;Resistors, Capacitors, Potentiometers;1-2 Tage;7630049200139
DEV072;200K Logarithmic Potentiometer;Audio taper potentiometer with 100K ohm resistance. Shaft length: 20mm. Power rating: 0.5W. Smooth rotation with logarithmic response. Perfect for volume controls and audio applications.;167;2.25;Components & Parts;Resistors, Capacitors, Potentiometers;1-2 Tage;1931000001146
DEV073;BC547 NPN Transistor;General purpose NPN transistor in TO-92 package. Collector current: 100mA max. Collector-emitter voltage: 45V. DC current gain: 110-800. Ideal for amplification and switching applications.;954;0.25;Components & Parts;Transistors & MOSFETs;1-2 Tage;8717478034144
DEV074;IRF540N N-Channel MOSFET;Power MOSFET with 100V drain-source voltage and 33A continuous drain current. Low on-resistance: 44mΩ. TO-220 package. Perfect for high-power switching and motor control applications.;189;3.75;Components & Parts;Transistors & MOSFETs;1-2 Tage;6943185501142
DEV075;1N4148 Switching Diode;Fast switching diode with 100V reverse voltage and 200mA forward current. Switching speed: 4ns. DO-35 package. Ideal for high-speed switching, protection circuits, and signal processing.;875;0.12;Components & Parts;Diodes & LEDs;1-2 Tage;8591854063358
DEV076;5mm Red LED;Standard red LED with 20mA forward current and 2.0V forward voltage. Viewing angle: 30 degrees. Luminous intensity: 2000-4000 mcd. Perfect for indicators and visual feedback.;1500;0.18;Components & Parts;Diodes & LEDs;1-2 Tage;6940541880117
DEV077;12mm Push Button Switch;Momentary push button switch with LED illumination. Operating voltage: 12V DC. Contact rating: 3A 125V AC. Panel mount design. Available in multiple colors. Perfect for control panels and user interfaces.;234;2.95;Components & Parts;Buttons & Switches;2-3 Tage;7630049200146
DEV078;DIP Switch 8 Position;8-position dual in-line package switch with through-hole mounting. Rating: 50mA 24V DC. Compact size. Ideal for configuration settings and mode selection in electronic circuits.;187;1.85;Components & Parts;Buttons & Switches;1-2 Tage;1931000001153
DEV079;Jumper Wires Female-to-Female;Bundle of 120 pieces 20cm female-to-female jumper wires in multiple colors. 0.1 pitch. High-quality Dupont connectors. Perfect for connecting modules and sensors to development boards.;67;6.99;Components & Parts;Wires, Cables & Connectors;1-2 Tage;8717478034151
DEV080;Micro USB Cable;1-meter Micro USB to USB Type-A cable with gold-plated connectors. Data transfer and charging capable. 28AWG power conductors. Perfect for connecting various electronic devices and charging.;245;5.50;Components & Parts;Wires, Cables & Connectors;1-2 Tage;6943185501159
DEV081;830-Point Breadboard;Large solderless breadboard with 830 tie points. Features four power rails and 63 rows of terminals. Adhesive backing. Maximum voltage: 300V. Ideal for complex circuit prototyping.;54;12.95;Components & Parts;Breadboards & Prototyping;2-3 Tage;8591854063365
DEV082;Breadboard Power Supply Module;3.3V/5V breadboard power supply module with USB input. Maximum output current: 700mA. Features LED indicators and on/off switch. Perfect for providing stable power to breadboard projects.;138;8.45;Components & Parts;Breadboards & Prototyping;2-3 Tage;6940541880124
DEV083;9V 1A Power Supply;Wall adapter with 9V DC output and 1A maximum current. Input: 100-240V AC. 5.5mm x 2.1mm barrel jack. Short circuit protection. Ideal for powering effects pedals and various electronics.;89;9.99;Power & Battery;Power Supplies;2-3 Tage;7630049200153
DEV084;USB-C Power Delivery Module;USB-C power delivery module with adjustable voltage output (5V, 9V, 12V, 15V, 20V). Maximum power: 100W. Features digital display and multiple protection circuits. Perfect for modern power requirements.;76;22.50;Power & Battery;Power Supplies;3-5 Tage;1931000001160
DEV085;18650 Battery Holder;Dual 18650 battery holder with series/parallel switch. Provides 3.7V (parallel) or 7.4V (series) output. Features built-in protection circuit and power switch. Perfect for lithium battery projects.;112;6.95;Power & Battery;Battery Holders;2-3 Tage;8717478034168
DEV086;TP5100 2A Lithium Charger;Dual lithium battery charger module with 2A maximum charge current. Supports 3.7V Li-ion and LiPo batteries. Input: 5-12V. Features charging status indicators. Perfect for high-capacity battery charging.;98;7.25;Power & Battery;Charging Circuits;2-3 Tage;6943185501166
DEV087;LM317 Adjustable Voltage Regulator;Adjustable linear voltage regulator with 1.5A output current. Output voltage: 1.25-37V. Features overcurrent and thermal protection. TO-220 package. Perfect for custom power supply designs.;167;2.95;Power & Battery;Voltage Regulators & Converters;1-2 Tage;8591854063372
DEV088;Temperature Controlled Soldering Iron;60W temperature controlled soldering iron with adjustable temperature 200-450°C. Features ceramic heater and quick heat-up time. Includes stand and spare tips. Perfect for basic soldering tasks.;45;35.99;Tools & Equipment;Soldering Equipment;3-5 Tage;6940541880131
DEV089;Auto-Ranging Multimeter;True RMS auto-ranging digital multimeter with 6000 counts. Measures AC/DC voltage, current, resistance, capacitance, frequency, and temperature. Features backlit display and data hold.;38;59.95;Tools & Equipment;Multimeters & Test Equipment;4-6 Tage;7630049200160
1 ID Name Description stock price category subcategory Lieferzeit EAN
2 DEV001 Arduino Uno R3a The Arduino Uno R3 is a foundational microcontroller board based on the ATmega328P. It features 14 digital I/O pins, 6 analog inputs, a 16 MHz quartz crystal, USB connectivity, and a power jack. Operating voltage is 5V. It is the ideal platform for beginners in electronics and coding, widely used for prototyping, DIY projects, automation, robotics, and educational purposes. It can be programmed using the Arduino IDE. 45 22.99 Microcontroller & Development Boards Arduino Boards 2-3 Tage 7630049200016
3 DEV002 Raspberry Pi 4 Model B 4GB The new high-performance single-board computer featuring a Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC running at 1.5GHz and 4GB of LPDDR4-3200 SDRAM. Connectivity includes dual-band 2.4/5.0 GHz Wi-Fi, Bluetooth 5.0, Gigabit Ethernet, two USB 3.0 ports, and two micro-HDMI ports supporting dual 4K displays. Its primary use is as a low-cost desktop computer, network-attached storage (NAS) device, media center, or embedded system for industrial applications. 28 75.50 Microcontroller & Development Boards Raspberry Pi Boards 5-7 Tage 1931000001047
4 DEV003 ESP32-WROOM-312 Development Board A powerful Wi-Fi and Bluetooth-enabled microcontroller board with dual-core Xtensa LX6 processor. Features 4MB flash memory, 520KB SRAM, 34 GPIO pins, and supports various communication protocols like I2C, I2S, SPI, and UART. Ideal for IoT projects, smart home devices, and wireless applications requiring robust connectivity and processing power. 67 12.95 Microcontroller & Development Boards ESP32/8266 Boards 3-5 Tage 8717478034021
5 DEV004 STM32F407VET6 Development Board High-performance ARM Cortex-M4 based board with DSP and FPU instructions. Features 512KB flash, 192KB RAM, USB OTG, Ethernet, and multiple timers. Operating frequency up to 168MHz. Suitable for industrial control, motor control, audio processing, and advanced embedded applications requiring high computational power. 23 35.80 Microcontroller & Development Boards Other Microcontrollers 7-10 Tage 6940541880018
6 DEV005 Arduino Motor Shield Rev3 Add-on shield designed to drive inductive loads such as relays, solenoids, DC and stepper motors. Features two channels that support 2A continuous current, screw terminals for easy connection, and built-in protection diodes. Perfect for robotics projects and automation systems when used with Arduino boards. 89 24.50 Microcontroller & Development Boards Accessories 1-2 Tage 7630049200023
7 DEV006 Raspberry Pi 4 Official Case Official protective case for Raspberry Pi 4 Model B with integrated GPIO access and dedicated slots for camera and display cables. Features a modular design with three plates for easy access to ports and components. Made from high-quality white plastic with colored accents. 156 8.99 Microcontroller & Development Boards Accessories 1-2 Tage 1931000001054
8 DEV007 DHT22 AM2302 Digital Sensor A pre-calibrated digital temperature and humidity sensor module. It provides a digital signal output and features a dedicated NTC for temperature measurement and a resistive humidity sensing element. Operating voltage: 3.3V - 6V. Measurement range: Humidity 0-100% RH, Temperature -40 to 80°C. Accuracy: ±2% RH and ±0.5°C. Typical applications include HVAC systems, weather stations, environmental monitoring, home automation, and data logging projects. It is easy to interface with Arduino, Raspberry Pi, and other microcontrollers. 120 9.95 Sensors & Modules Temperature & Humidity Sensors 1-2 Tage 8591854063228
9 DEV008 HC-SR05 Ultrasonic Sensor Ultrasonic distance measurement module with 2cm to 400cm non-contact range. Operating voltage: 5V DC. Provides excellent ranging accuracy with stable readings. Uses sonar principles to determine distance to objects. Ideal for obstacle avoidance robots, parking assistance systems, and liquid level measurement. 204 3.50 Sensors & Modules Motion & Proximity Sensors 1-2 Tage 6943185501012
10 DEV009 PIR Motion Sensor HC-SR501 Passive infrared motion detection sensor with adjustable sensitivity and delay time. Detection range up to 7 meters with 120-degree detection angle. Operating voltage: 4.5-20V DC. Features low power consumption and reliable performance. Perfect for security systems, automatic lighting control, and energy-saving applications. 178 4.25 Sensors & Modules Motion & Proximity Sensors 1-2 Tage 6943185501029
11 DEV010 BH1750 Digital Light Sensor Digital ambient light sensor with I2C interface and 16-bit resolution. Measurement range: 1-65535 lux. Features low power consumption and high precision. No need for external components. Ideal for display backlight control in mobile devices, automatic brightness adjustment systems, and environmental light monitoring. 95 6.80 Sensors & Modules Light, Color & Gesture Sensors 2-3 Tage 8591854063235
12 DEV011 APDS-9960 Gesture Sensor Advanced gesture detection, proximity sensing, and ambient light sensor in one module. Features I2C interface with interrupt output. Can detect simple gestures (up, down, left, right) and measure proximity up to 20cm. Perfect for touchless interfaces, interactive displays, and smart home control. 63 15.75 Sensors & Modules Light, Color & Gesture Sensors 3-5 Tage 8717478034038
13 DEV012 MQ-2 Gas Sensor Module Semiconductor gas sensor for detecting LPG, propane, hydrogen, methane, alcohol, and smoke. Analog and digital output with adjustable sensitivity. Heating voltage: 5V±0.2V. Fast response and recovery time. Suitable for gas leak detection in home and industry, air quality monitoring, and safety systems. 112 8.45 Sensors & Modules Gas, Air Quality & Pressure Sensors 2-3 Tage 6943185501036
14 DEV013 BMP2810 Barometric Pressure Sensor High-precision digital barometric pressure and temperature sensor with I2C and SPI interfaces. Pressure range: 300-1100 hPa with ±1 hPa absolute accuracy. Temperature measurement with ±1.0°C accuracy. Low power consumption. Ideal for weather stations, altitude tracking, and indoor navigation. 87 9.20 Sensors & Modules Gas, Air Quality & Pressure Sensors 2-3 Tage 8591854063242
15 DEV014 NEO-6M GPS Module GPS receiver module with built-in EEPROM and ceramic antenna. Provides accurate positioning with 2.5m accuracy. Supports up to 5Hz update rate with NMEA protocol. Operating voltage: 3.3-5V. Features low power consumption and hot start capability. Perfect for navigation systems, tracking devices, and drones. 134 18.90 Sensors & Modules GPS & Location Modules 3-5 Tage 8717478034045
16 DEV015 RC522 RFID Reader Module RFID reader/writer operating at 13.56MHz with SPI interface. Reading distance up to 5cm. Supports ISO 14443A standard tags. Operating voltage: 2.5-3.3V. Ideal for access control systems, attendance tracking, payment systems, and interactive applications. 198 7.85 Sensors & Modules RFID & NFC Modules 1-2 Tage 6943185501043
17 DEV016 37-in-1 Sensor Module Kit Comprehensive sensor kit containing 37 most popular modules including temperature, humidity, motion, light, sound, and gas sensors. Comes with tutorial CD and connection diagrams. Perfect for beginners learning electronics and IoT programming. All modules are compatible with Arduino and Raspberry Pi. 45 89.99 Sensors & Modules Sensor Kits 5-7 Tage 7630049200030
18 DEV017 SG90 Micro Servo Motor TowerPro SG90 mini servo motor with 180-degree rotation range. Operating voltage: 4.8V. Stall torque: 1.8kg/cm. Comes with plastic gears and three-wire interface (power, ground, signal). Ideal for robotics, RC models, camera positioning, and small automation projects. 312 4.75 Actuators & Output Motors 1-2 Tage 6940541880025
19 DEV018 28BYJ-48 Stepper Motor with Driver Unipolar stepper motor with ULN2003 driver board. Step angle: 5.625° x 1/64 reduction ratio. Operating voltage: 5-12V DC. Provides precise position control without feedback. Perfect for 3D printers, CNC machines, automated curtains, and precision positioning systems. 167 12.50 Actuators & Output Motors 2-3 Tage 8591854063259
20 DEV019 L298N Motor Driver Module Dual H-bridge motor driver capable of driving two DC motors or one stepper motor. Operating voltage: 5-35V. Maximum current: 2A per channel. Features logic level conversion and heat sink. Ideal for robotics projects, motor control applications, and high-power driving needs. 98 8.95 Actuators & Output Motor Drivers & Controllers 2-3 Tage 8717478034052
21 DEV020 5V Relay Module Single channel relay module with optocoupler isolation. Operating voltage: 5V. Switching capacity: 10A 250V AC or 30V DC. Features status LED and standard interface for easy connection to microcontrollers. Perfect for controlling high-voltage appliances with low-voltage circuits. 245 3.25 Actuators & Output Relays & Switches 1-2 Tage 6943185501050
22 DEV021 16x2 LCD Display with I2C Blue backlight LCD display with 16 characters x 2 lines and I2C interface module. Operating voltage: 5V. Contrast adjustable. The I2C interface reduces required GPIO pins from 6 to 2. Ideal for displaying system status, sensor readings, and user interface information. 143 14.99 Actuators & Output Displays 2-3 Tage 7630049200047
23 DEV022 0.96 inch OLED Display 128x64 pixel OLED display with SSD1306 driver and I2C/SPI interface. Features high contrast, wide viewing angle, and low power consumption. Operating voltage: 3.3-5V. Perfect for projects requiring compact, high-quality graphics display. 189 10.45 Actuators & Output Displays 2-3 Tage 1931000001061
24 DEV023 5mm RGB LED Common Cathode Diffused RGB LED with common cathode configuration. Operating voltage: 2.0-2.5V (Red), 3.0-3.4V (Green/Blue). Maximum current: 20mA per color. Provides full color spectrum mixing. Ideal for status indicators, mood lighting, and visual feedback in projects. 500 0.75 Actuators & Output LEDs & Lighting 1-2 Tage 8591854063266
25 DEV024 Active Buzzer Module 5V active buzzer with built-in oscillator that produces continuous sound when powered. Operating voltage: 3.3-5V. Sound output: approximately 85dB. Easy to drive with microcontroller digital pin. Perfect for alarm systems, timers, and user notification applications. 287 2.10 Actuators & Output Buzzers & Speakers 1-2 Tage 6943185501067
26 DEV025 1K Ohm Resistor Pack Assortment of 100 pieces 1K ohm 1/4W metal film resistors with 1% tolerance. Temperature coefficient: 50ppm/°C. Perfect for pull-up/pull-down resistors, voltage dividers, and current limiting in various electronic circuits. 15 4.99 Components & Parts Resistors, Capacitors, Potentiometers 1-2 Tage 8717478034069
27 DEV026 100uF Electrolytic Capacitor Radial lead electrolytic capacitor with 25V voltage rating. Operating temperature: -40°C to +85°C. Low ESR and high ripple current capability. Ideal for power supply filtering, audio circuits, and general decoupling applications. 420 0.25 Components & Parts Resistors, Capacitors, Potentiometers 1-2 Tage 6940541880032
28 DEV027 10K Ohm Linear Potentiometer Rotary potentiometer with 10K ohm resistance and linear taper. Shaft length: 15mm. Power rating: 0.5W. Features smooth rotation and reliable performance. Perfect for volume control, brightness adjustment, and parameter tuning. 195 1.20 Components & Parts Resistors, Capacitors, Potentiometers 1-2 Tage 8591854063273
29 DEV028 2N2222A NPN Transistor General purpose NPN bipolar junction transistor in TO-92 package. Collector current: 800mA max. Collector-emitter voltage: 40V max. Gain bandwidth: 250MHz. Ideal for switching and amplification applications in various electronic circuits. 876 0.35 Components & Parts Transistors & MOSFETs 1-2 Tage 7630049200054
30 DEV029 IRFZ44N N-Channel MOSFET Power MOSFET with low on-resistance and fast switching speed. Drain-source voltage: 55V. Continuous drain current: 49A. TO-220 package. Perfect for motor control, power switching, and high-current applications. 321 2.15 Components & Parts Transistors & MOSFETs 1-2 Tage 1931000001078
31 DEV030 1N4007 Rectifier Diode General purpose rectifier diode with 1000V maximum repetitive reverse voltage and 1A average forward current. DO-41 package. Ideal for power supply rectification, reverse polarity protection, and general purpose switching. 650 0.15 Components & Parts Diodes & LEDs 1-2 Tage 8717478034076
32 DEV031 5mm Green LED Diffused green LED with 20mA forward current and 2.1V forward voltage. Viewing angle: 30 degrees. Luminous intensity: 5000-8000 mcd. Perfect for status indicators, panel lights, and visual feedback in electronic projects. 1200 0.20 Components & Parts Diodes & LEDs 1-2 Tage 6943185501074
33 DEV032 6x6mm Tactile Switch Momentary push button switch with through-hole mounting. Operating force: 160±50gf. Contact resistance: <50mΩ. Life expectancy: 100,000 cycles. Ideal for user input, reset buttons, and control interfaces. 890 0.10 Components & Parts Buttons & Switches 1-2 Tage 8591854063280
34 DEV033 Toggle Switch SPDT Single pole double throw toggle switch with on-on configuration. Rating: 6A 125V AC / 3A 250V AC. Panel mount design with nut and washer. Perfect for power switching, mode selection, and circuit configuration. 134 2.95 Components & Parts Buttons & Switches 2-3 Tage 6940541880049
35 DEV034 Jumper Wires Male-to-Male Bundle of 120 pieces 20cm male-to-male jumper wires in multiple colors. 0.1 pitch. Made with high-quality Dupont connectors. Perfect for breadboard connections, prototyping, and wiring Arduino projects. 45 6.99 Components & Parts Wires, Cables & Connectors 1-2 Tage 7630049200061
36 DEV035 USB Type B Cable 1.5 meter USB 2.0 Type A to Type B cable with gold-plated connectors. Data transfer speed up to 480Mbps. 28AWG power conductors. Perfect for connecting Arduino boards, printers, and other devices with Type B接口. 178 7.50 Components & Parts Wires, Cables & Connectors 1-2 Tage 1931000001085
37 DEV036 400-Point Solderless Breadboard High-quality solderless breadboard with 400 tie points. Features two power rails and 63 rows of interconnected terminals. Adhesive backing for secure mounting. Maximum voltage: 300V. Ideal for circuit prototyping and testing. 67 8.25 Components & Parts Breadboards & Prototyping 1-2 Tage 8717478034083
38 DEV037 Breadboard Jumper Wire Kit Kit containing 140 pieces of pre-cut and stripped jumper wires in various lengths and colors. Includes male-to-male, male-to-female, and female-to-female types. Organized in convenient storage box. Perfect for breadboard prototyping. 92 12.99 Components & Parts Breadboards & Prototyping 1-2 Tage 6943185501081
39 DEV038 12V 2A Power Supply Switching power adapter with 12V DC output and 2A maximum current. Input: 100-240V AC. Comes with 5.5mm x 2.1mm barrel jack connector. Short circuit and overvoltage protection. Ideal for powering Arduino projects, LED strips, and various electronics. 58 14.95 Power & Battery Power Supplies 3-5 Tage 8591854063297
40 DEV039 5V 3A USB Power Supply High-current USB power supply with 5V 3A output. Features built-in USB Type-A port and overcurrent protection. Input: 100-240V AC. Perfect for powering Raspberry Pi, high-power USB devices, and charging applications. 47 11.50 Power & Battery Power Supplies 2-3 Tage 6940541880056
41 DEV040 4xAA Battery Holder Plastic battery holder for 4 AA batteries with series connection providing 6V output. Features wire leads with stripped ends and on/off switch. Secure battery closure. Perfect for portable projects and backup power. 124 3.75 Power & Battery Battery Holders 1-2 Tage 7630049200078
42 DEV041 TP4056 Lithium Charger Module Single cell lithium battery charging module with 1A maximum charge current. Features charging status indicators and protection circuits. Input: 5V USB. Supports 3.7V Li-ion and LiPo batteries. Perfect for portable projects. 216 4.25 Power & Battery Charging Circuits 2-3 Tage 1931000001092
43 DEV042 LM2596 DC-DC Buck Converter Adjustable step-down voltage regulator module with 3A maximum output current. Input voltage: 4.5-40V. Output voltage: 1.5-35V adjustable. Efficiency up to 92%. Features overheat and short circuit protection. 189 5.95 Power & Battery Voltage Regulators & Converters 2-3 Tage 8717478034090
44 DEV043 60W Soldering Station Temperature controlled soldering station with 60W power and adjustable temperature range 200-480°C. Features ceramic heating element, sleep mode, and digital display. Comes with soldering iron stand and sponge. Perfect for electronics repair and prototyping. 34 49.99 Tools & Equipment Soldering Equipment 5-7 Tage 6943185501098
45 DEV044 Digital Multimeter DT9205A 3-1/2 digit digital multimeter with LCD display. Measures AC/DC voltage, current, resistance, capacitance, frequency, and temperature. Features diode test, continuity buzzer, and data hold. Comes with test leads and carrying case. 29 38.50 Tools & Equipment Multimeters & Test Equipment 3-5 Tage 8591854063303
46 DEV045 65-Piece Screwdriver Set Precision screwdriver set with 65 pieces including various Phillips, flat, Torx, and hex bits. Magnetic tips and comfortable handle. Organized in durable carrying case. Perfect for electronics repair, smartphone disassembly, and精密 work. 56 24.95 Tools & Equipment Tool Kits 2-3 Tage 6940541880063
47 DEV046 Plastic Project Enclosure 160x100x60mm Plastic electronic project box with dimensions 160x100x60mm. Features mounting posts for PCBs, ventilation slots, and removable lid. Material: ABS plastic. Perfect for housing electronic projects and prototypes. 78 9.75 Tools & Equipment Enclosures & Boxes 3-5 Tage 7630049200085
48 DEV047 Arduino Nano Every Compact board based on the ATMega4809 with 20MHz operating frequency. Features 48KB flash, 6KB SRAM, and 22 GPIO pins. Compatible with Arduino Nano footprint. Perfect for space-constrained projects requiring Arduino compatibility. 91 18.50 Microcontroller & Development Boards Arduino Boards 3-5 Tage 7630049200092
49 DEV048 Raspberry Pi Pico W Microcontroller board with RP2040 chip and wireless connectivity. Features 264KB SRAM, 2MB flash, and 30 GPIO pins. Supports MicroPython and C/C++. Built-in Wi-Fi and Bluetooth. Ideal for IoT projects and wireless applications. 167 9.95 Microcontroller & Development Boards Raspberry Pi Boards 2-3 Tage 1931000001108
50 DEV049 ESP32-CAM Development Board ESP32 module with OV2640 camera and microSD card slot. Features 4MB flash, 520KB SRAM, and supports Wi-Fi and Bluetooth. Provides video streaming and image capture capabilities. Perfect for security cameras and IoT vision applications. 124 15.75 Microcontroller & Development Boards ESP32/8266 Boards 3-5 Tage 8717478034106
51 DEV050 ATtiny85 Development Board Compact development board based on ATtiny85 microcontroller. Features 8KB flash, 512B SRAM, and 6 GPIO pins. Operating voltage: 5V. Perfect for simple projects requiring minimal I/O and small form factor. 205 6.25 Microcontroller & Development Boards Other Microcontrollers 2-3 Tage 6943185501104
52 DEV051 Arduino Ethernet Shield Network connectivity shield for Arduino with W5500 Ethernet controller. Supports TCP/IP protocols and provides SD card slot. Operating voltage: 5V. Perfect for network-connected projects and data logging. 76 32.99 Microcontroller & Development Boards Accessories 4-6 Tage 8591854063310
53 DEV052 Raspberry Pi Official Power Supply Official 15.3W USB-C power supply for Raspberry Pi 4. Output: 5.1V DC, 3A. Features noise filtering and overcurrent protection. Includes 1.5m USB-C cable. Ensures stable power for Raspberry Pi operation. 142 11.99 Microcontroller & Development Boards Accessories 2-3 Tage 6940541880070
54 DEV053 DS18B20 Waterproof Temperature Sensor Digital temperature sensor with 1-wire interface and waterproof stainless steel probe. Measurement range: -55°C to +125°C with ±0.5°C accuracy. 1-meter cable length. Perfect for liquid temperature measurement, environmental monitoring, and industrial applications. 188 8.95 Sensors & Modules Temperature & Humidity Sensors 2-3 Tage 7630049200108
55 DEV054 HC-SR501 PIR Motion Sensor Passive infrared motion detector with adjustable time and sensitivity. Detection range: 7 meters with 120° angle. Operating voltage: 4.5-20V DC. Features low power consumption. Ideal for security systems and automatic lighting. 156 4.50 Sensors & Modules Motion & Proximity Sensors 1-2 Tage 1931000001115
56 DEV055 VL53L0X Laser Distance Sensor Time-of-flight laser ranging sensor with 2m measurement range and 1mm resolution. I2C interface. Operating voltage: 2.6-3.5V. Features high accuracy and immune to ambient light. Perfect for gesture recognition and proximity sensing. 97 14.25 Sensors & Modules Motion & Proximity Sensors 3-5 Tage 8717478034113
57 DEV056 TCS34725 Color Sensor RGB color light sensor with IR filter and white LED. I2C interface with interrupt output. Provides clear, red, green, blue, and lux measurements. Perfect for color sorting, ambient light sensing, and display calibration. 84 13.75 Sensors & Modules Light, Color & Gesture Sensors 2-3 Tage 6943185501111
58 DEV057 VCNL4040 Proximity Sensor Integrated proximity and ambient light sensor with I2C interface. Proximity range: 0-200mm. Features interrupt function and low power consumption. Perfect for touchless interfaces and presence detection. 119 9.80 Sensors & Modules Light, Color & Gesture Sensors 2-3 Tage 8591854063327
59 DEV058 MQ-135 Air Quality Sensor Semiconductor sensor for detecting harmful gases like NH3, NOx, alcohol, benzene, and CO2. Analog output with adjustable sensitivity. Heating voltage: 5V±0.1V. Suitable for air quality monitoring and environmental detection. 145 7.25 Sensors & Modules Gas, Air Quality & Pressure Sensors 2-3 Tage 6940541880087
60 DEV059 BME280 Environmental Sensor Integrated environmental sensor measuring temperature, humidity, and barometric pressure. I2C/SPI interfaces. Operating voltage: 1.8-3.6V. Low power consumption. Ideal for weather stations and environmental monitoring. 132 14.50 Sensors & Modules Gas, Air Quality & Pressure Sensors 3-5 Tage 7630049200115
61 DEV060 U-blox NEO-M8N GPS Module High-performance GPS module with 72 channels and 2.5m accuracy. Supports GPS, GLONASS, and BeiDou systems. Update rate: up to 10Hz. Perfect for drones, navigation systems, and precision tracking. 89 26.95 Sensors & Modules GPS & Location Modules 4-6 Tage 1931000001122
62 DEV061 PN532 NFC RFID Module NFC/RFID reader/writer supporting ISO 14443A/B, ISO 18092, and FeliCa protocols. Operating frequency: 13.56MHz. Interfaces: I2C, SPI, HSU. Reading distance: up to 5cm. Ideal for contactless payment and access control. 107 18.75 Sensors & Modules RFID & NFC Modules 3-5 Tage 8717478034120
63 DEV062 Arduino Sensor Kit Complete sensor kit containing 37 modules compatible with Arduino. Includes tutorials and code examples. Covers basic to advanced sensors. Perfect for educational purposes and learning electronics. 68 79.99 Sensors & Modules Sensor Kits 5-7 Tage 6943185501128
64 DEV063 NEMA 17 Stepper Motor Bipolar stepper motor with 1.8° step angle and 42mm frame size. Holding torque: 40Ncm. Current: 1.2A per phase. 4-wire connection. Perfect for 3D printers, CNC machines, and precision positioning systems. 45 28.95 Actuators & Output Motors 4-6 Tage 8591854063334
65 DEV064 L293D Motor Driver IC Quadruple half-H driver for bidirectional DC motor control. Operating voltage: 4.5-36V. Output current: 600mA per channel. DIP-16 package. Perfect for controlling small motors and solenoids. 213 3.45 Actuators & Output Motor Drivers & Controllers 1-2 Tage 6940541880094
66 DEV065 5V 4-Channel Relay Module 4-channel relay module with optocoupler isolation and status LEDs. Operating voltage: 5V. Switching capacity: 10A 250V AC per channel. Features screw terminals and standard control interface. 124 15.50 Actuators & Output Relays & Switches 2-3 Tage 7630049200122
67 DEV066 20x4 LCD Display with I2C Large LCD display with 20 characters x 4 lines and I2C interface. Blue backlight with adjustable contrast. Operating voltage: 5V. Perfect for projects requiring extensive text display. 87 19.95 Actuators & Output Displays 3-5 Tage 1931000001139
68 DEV067 1.3 inch IPS LCD Display 1.3 inch IPS display with 240x240 resolution and ST7789 driver. SPI interface with 65K colors. Operating voltage: 3.3V. Features high brightness and wide viewing angle. Perfect for graphics and GUI applications. 134 16.75 Actuators & Output Displays 3-5 Tage 8717478034137
69 DEV068 WS2812B RGB LED Strip Addressable RGB LED strip with 30 LEDs per meter. Each LED individually controllable via single-wire protocol. Operating voltage: 5V. Perfect for decorative lighting, art installations, and visual effects. 78 18.50 Actuators & Output LEDs & Lighting 2-3 Tage 6943185501135
70 DEV069 Piezo Buzzer Element Passive piezo buzzer without internal oscillator. Requires external driver circuit. Operating voltage: 3-20V. Resonant frequency: 4kHz. Compact size. Ideal for custom tone generation and audio projects. 345 1.25 Actuators & Output Buzzers & Speakers 1-2 Tage 8591854063341
71 DEV070 Assorted Resistor Kit Comprehensive resistor kit with 1000 pieces covering values from 10 ohm to 1M ohm. 1/4W metal film with 1% tolerance. Organized in storage box with value labels. Perfect for electronics projects and repairs. 28 29.99 Components & Parts Resistors, Capacitors, Potentiometers 2-3 Tage 6940541880100
72 DEV071 100nF Ceramic Capacitor Multilayer ceramic capacitor with 100nF capacitance and 50V rating. X7R dielectric material. Through-hole design. Ideal for decoupling, filtering, and timing applications. 1200 0.15 Components & Parts Resistors, Capacitors, Potentiometers 1-2 Tage 7630049200139
73 DEV072 200K Logarithmic Potentiometer Audio taper potentiometer with 100K ohm resistance. Shaft length: 20mm. Power rating: 0.5W. Smooth rotation with logarithmic response. Perfect for volume controls and audio applications. 167 2.25 Components & Parts Resistors, Capacitors, Potentiometers 1-2 Tage 1931000001146
74 DEV073 BC547 NPN Transistor General purpose NPN transistor in TO-92 package. Collector current: 100mA max. Collector-emitter voltage: 45V. DC current gain: 110-800. Ideal for amplification and switching applications. 954 0.25 Components & Parts Transistors & MOSFETs 1-2 Tage 8717478034144
75 DEV074 IRF540N N-Channel MOSFET Power MOSFET with 100V drain-source voltage and 33A continuous drain current. Low on-resistance: 44mΩ. TO-220 package. Perfect for high-power switching and motor control applications. 189 3.75 Components & Parts Transistors & MOSFETs 1-2 Tage 6943185501142
76 DEV075 1N4148 Switching Diode Fast switching diode with 100V reverse voltage and 200mA forward current. Switching speed: 4ns. DO-35 package. Ideal for high-speed switching, protection circuits, and signal processing. 875 0.12 Components & Parts Diodes & LEDs 1-2 Tage 8591854063358
77 DEV076 5mm Red LED Standard red LED with 20mA forward current and 2.0V forward voltage. Viewing angle: 30 degrees. Luminous intensity: 2000-4000 mcd. Perfect for indicators and visual feedback. 1500 0.18 Components & Parts Diodes & LEDs 1-2 Tage 6940541880117
78 DEV077 12mm Push Button Switch Momentary push button switch with LED illumination. Operating voltage: 12V DC. Contact rating: 3A 125V AC. Panel mount design. Available in multiple colors. Perfect for control panels and user interfaces. 234 2.95 Components & Parts Buttons & Switches 2-3 Tage 7630049200146
79 DEV078 DIP Switch 8 Position 8-position dual in-line package switch with through-hole mounting. Rating: 50mA 24V DC. Compact size. Ideal for configuration settings and mode selection in electronic circuits. 187 1.85 Components & Parts Buttons & Switches 1-2 Tage 1931000001153
80 DEV079 Jumper Wires Female-to-Female Bundle of 120 pieces 20cm female-to-female jumper wires in multiple colors. 0.1 pitch. High-quality Dupont connectors. Perfect for connecting modules and sensors to development boards. 67 6.99 Components & Parts Wires, Cables & Connectors 1-2 Tage 8717478034151
81 DEV080 Micro USB Cable 1-meter Micro USB to USB Type-A cable with gold-plated connectors. Data transfer and charging capable. 28AWG power conductors. Perfect for connecting various electronic devices and charging. 245 5.50 Components & Parts Wires, Cables & Connectors 1-2 Tage 6943185501159
82 DEV081 830-Point Breadboard Large solderless breadboard with 830 tie points. Features four power rails and 63 rows of terminals. Adhesive backing. Maximum voltage: 300V. Ideal for complex circuit prototyping. 54 12.95 Components & Parts Breadboards & Prototyping 2-3 Tage 8591854063365
83 DEV082 Breadboard Power Supply Module 3.3V/5V breadboard power supply module with USB input. Maximum output current: 700mA. Features LED indicators and on/off switch. Perfect for providing stable power to breadboard projects. 138 8.45 Components & Parts Breadboards & Prototyping 2-3 Tage 6940541880124
84 DEV083 9V 1A Power Supply Wall adapter with 9V DC output and 1A maximum current. Input: 100-240V AC. 5.5mm x 2.1mm barrel jack. Short circuit protection. Ideal for powering effects pedals and various electronics. 89 9.99 Power & Battery Power Supplies 2-3 Tage 7630049200153
85 DEV084 USB-C Power Delivery Module USB-C power delivery module with adjustable voltage output (5V, 9V, 12V, 15V, 20V). Maximum power: 100W. Features digital display and multiple protection circuits. Perfect for modern power requirements. 76 22.50 Power & Battery Power Supplies 3-5 Tage 1931000001160
86 DEV085 18650 Battery Holder Dual 18650 battery holder with series/parallel switch. Provides 3.7V (parallel) or 7.4V (series) output. Features built-in protection circuit and power switch. Perfect for lithium battery projects. 112 6.95 Power & Battery Battery Holders 2-3 Tage 8717478034168
87 DEV086 TP5100 2A Lithium Charger Dual lithium battery charger module with 2A maximum charge current. Supports 3.7V Li-ion and LiPo batteries. Input: 5-12V. Features charging status indicators. Perfect for high-capacity battery charging. 98 7.25 Power & Battery Charging Circuits 2-3 Tage 6943185501166
88 DEV087 LM317 Adjustable Voltage Regulator Adjustable linear voltage regulator with 1.5A output current. Output voltage: 1.25-37V. Features overcurrent and thermal protection. TO-220 package. Perfect for custom power supply designs. 167 2.95 Power & Battery Voltage Regulators & Converters 1-2 Tage 8591854063372
89 DEV088 Temperature Controlled Soldering Iron 60W temperature controlled soldering iron with adjustable temperature 200-450°C. Features ceramic heater and quick heat-up time. Includes stand and spare tips. Perfect for basic soldering tasks. 45 35.99 Tools & Equipment Soldering Equipment 3-5 Tage 6940541880131
90 DEV089 Auto-Ranging Multimeter True RMS auto-ranging digital multimeter with 6000 counts. Measures AC/DC voltage, current, resistance, capacitance, frequency, and temperature. Features backlit display and data hold. 38 59.95 Tools & Equipment Multimeters & Test Equipment 4-6 Tage 7630049200160

File diff suppressed because it is too large Load diff

13
imixs-cloud.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
############################################################
# Push build into imixs-cloud repo
#
############################################################
# build
./build.sh
# push
docker tag imixs/dynamixs-super-office:latest registry.tikal.imixs.com/imixs/dynamixs-super-office:latest
docker push registry.tikal.imixs.com/imixs/dynamixs-super-office:latest

423
pom.xml
View file

@ -26,41 +26,30 @@
<custom.webResources>src/main/webapp</custom.webResources> <custom.webResources>src/main/webapp</custom.webResources>
<custom.unpackTypes>war</custom.unpackTypes> <custom.unpackTypes>war</custom.unpackTypes>
<!-- Build Time --> <!-- =========================================================
<org.imixs.build.timestamp>${maven.build.timestamp}</org.imixs.build.timestamp> STEP 2: Set the Dynamixs.AI platform version you target.
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format> Ask your Dynamixs.AI partner contact for the current version.
<jakarta.faces.project_stage>Production</jakarta.faces.project_stage> ========================================================= -->
<ai.dynamixs.version>1.0.4-SNAPSHOT</ai.dynamixs.version>
<org.imixs.workflow.version>6.2.10-SNAPSHOT</org.imixs.workflow.version>
<org.imixs.office.version>5.1.12-SNAPSHOT</org.imixs.office.version>
<org.imixs.data.version>1.0.5-SNAPSHOT</org.imixs.data.version>
<org.imixs.adapter.version>3.2.5</org.imixs.adapter.version>
<org.imixs.security.version>3.0.2</org.imixs.security.version>
<!-- Dependency Versions --> <!-- Jakarta EE -->
<jakarta.version>10.0.0</jakarta.version> <jakarta.version>10.0.0</jakarta.version>
<microprofile.version>6.0</microprofile.version> <microprofile.version>6.0</microprofile.version>
<ai.dynamixs.version>1.0.2-SNAPSHOT</ai.dynamixs.version>
<org.imixs.office.version>5.1.9-SNAPSHOT</org.imixs.office.version>
<org.imixs.marty.version>5.2.0</org.imixs.marty.version>
<org.imixs.workflow.version>6.2.8-SNAPSHOT</org.imixs.workflow.version>
<org.imixs.security.version>3.0.2</org.imixs.security.version>
<org.imixs.archive.version>3.1.3</org.imixs.archive.version>
<org.imixs.adapter.version>3.2.2</org.imixs.adapter.version>
<org.imixs.data.version>1.0.2</org.imixs.data.version>
<org.imixs.ai.version>1.1.9-SNAPSHOT</org.imixs.ai.version>
<apache.pdfbox.version>2.0.24</apache.pdfbox.version>
<!-- Wildfly unpack war -->
<custom.unpackTypes>war</custom.unpackTypes>
<jakarta.faces.project_stage>Production</jakarta.faces.project_stage>
<imixs-office.applicationname>dynamixs-super-office</imixs-office.applicationname>
<org.imixs.docker.registry>registry.tikal.imixs.com</org.imixs.docker.registry>
<!-- Environment Settings -->
<imixs-office.contextroot>/</imixs-office.contextroot>
<imixs-office.realm>imixsrealm</imixs-office.realm>
<imixs-office.jta-data-source>jdbc/office</imixs-office.jta-data-source>
<imixs-office.IndexDir>lucene/office-workflow-index</imixs-office.IndexDir>
<imixs-mail-res-ref-name>java:/mail/org.imixs.workflow.mail</imixs-mail-res-ref-name>
<!-- The final WAR name - this will be the context root on Wildfly -->
<custom.applicationname>dynamixs-super-office</custom.applicationname>
</properties> </properties>
<!-- =========================================================
Repositories
- Imixs SNAPSHOT artifacts are on Sonatype (public)
- Dynamixs.AI artifacts are on GitHub Packages (partner access required)
========================================================= -->
<repositories> <repositories>
<repository> <repository>
<id>oss-snapshots</id> <id>oss-snapshots</id>
@ -68,11 +57,56 @@
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>github-dynamixs</id>
<name>Dynamixs.AI GitHub Packages</name>
<url>https://maven.pkg.github.com/dynamixs-ai/dynamixs-platform-repo</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository> </repository>
</repositories> </repositories>
<profiles> <profiles>
<profile>
<id>docker</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<configuration>
<target>
<exec executable="docker">
<arg value="build" />
<arg value="-t" />
<arg value="imixs/${custom.applicationname}" />
<arg value="./" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile> <profile>
<id>debug</id> <id>debug</id>
<build> <build>
@ -91,7 +125,7 @@
<arg value="-f" /> <arg value="-f" />
<arg value="./Dockerfile-debug" /> <arg value="./Dockerfile-debug" />
<arg value="-t" /> <arg value="-t" />
<arg value="imixs/${imixs-office.applicationname}" /> <arg value="imixs/${custom.applicationname}" />
<arg value="./." /> <arg value="./." />
</exec> </exec>
</target> </target>
@ -141,21 +175,8 @@
<exec executable="docker"> <exec executable="docker">
<arg value="build" /> <arg value="build" />
<arg value="-t" /> <arg value="-t" />
<arg <arg value="imixs/${custom.applicationname}" />
value="imixs/${imixs-office.applicationname}:${project.version}" /> <arg value="./" />
<arg value="./." />
</exec>
<exec executable="docker">
<arg value="tag" />
<arg
value="imixs/${imixs-office.applicationname}:${project.version}" />
<arg
value="${org.imixs.docker.registry}/imixs/${imixs-office.applicationname}:${project.version}" />
</exec>
<exec executable="docker">
<arg value="push" />
<arg
value="${org.imixs.docker.registry}/imixs/${imixs-office.applicationname}:${project.version}" />
</exec> </exec>
</target> </target>
</configuration> </configuration>
@ -169,113 +190,57 @@
</plugins> </plugins>
</build> </build>
</profile> </profile>
</profiles> </profiles>
<build>
<resources>
<!-- enable resource filtering for multi language version -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<!-- use JDK settings for compiling -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.source}</source>
<target>${java.target}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<resource>
<filtering>true</filtering>
<!-- this is relative to the pom.xml directory -->
<directory>${custom.webResources}</directory>
<includes>
<include>**/WEB-INF/*</include>
<!-- include any other file types you want to filter -->
</includes>
</resource>
</webResources>
<overlays>
<!-- Exclude libs from overlay project -->
<overlay>
<groupId>ai.dynamixs</groupId>
<artifactId>dynamixs-platform-ui</artifactId>
<excludes>
<exclude>WEB-INF/lib/*.jar</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.imixs.maven</groupId>
<artifactId>manik-hotdeploy-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- List Source and Target folders for Autodeploy and Hotdeploy -->
<autodeployments>
<deployment>
<!-- wildcard deployment -->
<source>target/*.{war,ear,jar}</source>
<target>./docker/deployments/</target>
<unpack>true</unpack>
</deployment>
</autodeployments>
<hotdeployments>
<deployment>
<source>src/main/webapp</source>
<target>./docker/deployments/${imixs-office.applicationname}.war</target>
</deployment>
</hotdeployments>
</configuration>
</plugin>
</plugins>
<finalName>${imixs-office.applicationname}</finalName>
</build>
<dependencies> <dependencies>
<!-- Jakarta EE -->
<!-- =========================================================
Dynamixs.AI Platform Core
Contains all platform services, CDI beans, REST endpoints,
AI integration and workflow engine extensions.
========================================================= -->
<dependency>
<groupId>ai.dynamixs</groupId>
<artifactId>dynamixs-platform-core</artifactId>
<version>${ai.dynamixs.version}</version>
</dependency>
<!-- =========================================================
Dynamixs.AI Platform UI - WAR Overlay Base
This is the base web application. Your files in
src/main/webapp/ will override files from this WAR.
========================================================= -->
<dependency>
<groupId>ai.dynamixs</groupId>
<artifactId>dynamixs-platform-ui</artifactId>
<version>${ai.dynamixs.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<!-- =========================================================
STEP 3: Add your customer-specific dependencies here.
Examples: ERP connectors, custom REST clients, etc.
This code is owned by your customer - not by Dynamixs.AI.
========================================================= -->
<!--
<dependency>
<groupId>com.acme</groupId>
<artifactId>sap-connector</artifactId>
<version>1.0.0</version>
</dependency>
-->
<!-- Jakarta EE API - provided by Wildfly at runtime -->
<dependency> <dependency>
<groupId>jakarta.platform</groupId> <groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId> <artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakarta.version}</version> <version>${jakarta.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- Microprofile -->
<!-- Microprofile - provided by Wildfly at runtime -->
<dependency> <dependency>
<groupId>org.eclipse.microprofile</groupId> <groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId> <artifactId>microprofile</artifactId>
@ -285,90 +250,43 @@
</dependency> </dependency>
<!-- Imixs-Office-Workflow -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-office-workflow-app</artifactId>
<type>war</type>
<version>${org.imixs.office.version}</version>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-office-workflow-util</artifactId>
<version>${org.imixs.office.version}</version>
</dependency>
<!-- Dynamixs.AI Plattform Overlay -->
<dependency>
<groupId>ai.dynamixs</groupId>
<artifactId>dynamixs-platform-ui</artifactId>
<type>war</type>
<version>${ai.dynamixs.version}</version>
</dependency>
<!-- Imixs Workflow --> <!-- Imixs Workflow -->
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-core</artifactId> <artifactId>imixs-workflow-core</artifactId>
<type>jar</type> <type>jar</type>
<version>${org.imixs.workflow.version}</version> <version>${org.imixs.workflow.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-engine</artifactId> <artifactId>imixs-workflow-engine</artifactId>
<type>jar</type> <type>jar</type>
<version>${org.imixs.workflow.version}</version> <version>${org.imixs.workflow.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-jax-rs</artifactId> <artifactId>imixs-workflow-jax-rs</artifactId>
<type>jar</type> <type>jar</type>
<version>${org.imixs.workflow.version}</version> <version>${org.imixs.workflow.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-faces</artifactId> <artifactId>imixs-workflow-faces</artifactId>
<type>jar</type> <type>jar</type>
<version>${org.imixs.workflow.version}</version> <version>${org.imixs.workflow.version}</version>
</dependency> <scope>provided</scope>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-index-lucene</artifactId>
<version>${org.imixs.workflow.version}</version>
</dependency>
<!-- Imixs-Archive -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-archive-api</artifactId>
<version>${org.imixs.archive.version}</version>
</dependency>
<!-- Marty -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-marty</artifactId>
<version>${org.imixs.marty.version}</version>
</dependency>
<!-- -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>${apache.pdfbox.version}</version>
</dependency> </dependency>
<!-- Imixs-Wopi --> <!-- Imixs-Office-Workflow Overlay -->
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-wopi</artifactId> <artifactId>imixs-office-workflow-util</artifactId>
<version>${org.imixs.adapter.version}</version> <version>${org.imixs.office.version}</version>
</dependency> <scope>provided</scope>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-odf</artifactId>
<version>${org.imixs.adapter.version}</version>
</dependency> </dependency>
@ -393,42 +311,123 @@
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-poi</artifactId> <artifactId>imixs-adapters-poi</artifactId>
<version>${org.imixs.adapter.version}</version> <version>${org.imixs.adapter.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-odf</artifactId>
<version>${org.imixs.adapter.version}</version>
</dependency> </dependency>
<!-- Imixs Data -->
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-groups</artifactId> <artifactId>imixs-data-groups</artifactId>
<version>${org.imixs.data.version}</version> <version>${org.imixs.data.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-views</artifactId> <artifactId>imixs-data-views</artifactId>
<version>${org.imixs.data.version}</version> <version>${org.imixs.data.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-documents</artifactId> <artifactId>imixs-data-documents</artifactId>
<version>${org.imixs.data.version}</version> <version>${org.imixs.data.version}</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.imixs.workflow</groupId> <groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-importer</artifactId> <artifactId>imixs-data-importer</artifactId>
<version>${org.imixs.data.version}</version> <version>${org.imixs.data.version}</version>
</dependency> <scope>provided</scope>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>${apache.pdfbox.version}</version>
</dependency>
<!-- Imixs-AI -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-ai-workflow</artifactId>
<version>${org.imixs.ai.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<finalName>${custom.applicationname}</finalName>
<plugins>
<!-- Use JDK settings for compiling -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.source}</source>
<target>${java.target}</target>
</configuration>
</plugin>
<!-- WAR Overlay: dynamixs-platform-ui is the base layer.
Files in src/main/webapp/ take precedence and override
anything from the base WAR. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<resource>
<filtering>true</filtering>
<!-- this is relative to the pom.xml directory -->
<directory>${custom.webResources}</directory>
<includes>
<include>**/WEB-INF/*</include>
<!-- include any other file types you want to filter -->
</includes>
</resource>
</webResources>
<!-- We exclude libs form the parent WAR artifact
<workDirectory>target/overlay-war-folder</workDirectory>
<overlays>
<overlay>
<groupId>ai.dynamixs</groupId>
<artifactId>dynamixs-platform-ui</artifactId>
<excludes>
<exclude>WEB-INF/lib/*.jar</exclude>
</excludes>
</overlay>
</overlays>
-->
</configuration>
</plugin>
<!-- Hot deployment to local Wildfly Docker instance -->
<plugin>
<groupId>org.imixs.maven</groupId>
<artifactId>manik-hotdeploy-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<autodeployments>
<deployment>
<source>target/*.{war,ear,jar}</source>
<target>docker/deployments/</target>
<unpack>true</unpack>
</deployment>
</autodeployments>
<hotdeployments>
<deployment>
<source>src/main/webapp</source>
<target>docker/deployments/${custom.applicationname}.war</target>
</deployment>
</hotdeployments>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY bdquo "" ><!ENTITY quot "" ><!ENTITY uuml "ü" ><!ENTITY auml "ä" ><!ENTITY ouml "ö" ><!ENTITY Uuml "Ü" ><!ENTITY Auml "Ä" ><!ENTITY Ouml "Ö" ><!ENTITY szlig "ß" ><!ENTITY nbsp " " ><!ENTITY lt "" >
<!ENTITY gt "" >]><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="html" media-type="text/html" indent="no"
encoding="UTF-8" /> <xsl:decimal-format
name="euro" decimal-separator="," grouping-separator="." /> <xsl:variable
name="currenttime" select="current-dateTime()" /> <xsl:template
match="/"> <html> <head> <meta name="viewport"
content="width=device-width" /> <meta
http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Imixs
Software Solutions GmbH</title> <link
href="../../layout/css/imixs-basic.css" charset="UTF-8" type="text/css" rel="stylesheet" /> <link
href="../../layout/css/imixs-layout.css" charset="UTF-8" type="text/css" rel="stylesheet" /> <link
href="../../layout/css/office-theme-print.css" charset="UTF-8" type="text/css" rel="stylesheet"
/> <link
href="../../layout/css/custom.css" charset="UTF-8" type="text/css" rel="stylesheet" /> <link
href="../../custom-print.css" charset="UTF-8" type="text/css" rel="stylesheet" /> <style>
.toolbar.branding { font-size:1.75rem; } h2 { font-size:1.7em; } .small { font-size:65%; }
#imixs-content { padding:10px; } #header { background-color: #FFF; color: #333; border-bottom:
1px solid #333; padding:0; } .imixs-requirement { margin-top:20px; margin-bottom:40px; }
.imixs-requirement h4 { border-bottom: 1px solid #333; } .imixs-table { width: 100%;
margin-bottom:4em; } @media print { body {font-size:0.66em;} } </style> </head> <body> <!--
content --> <div
id="container"> <div id="imixs-content"> <!-- generate
Header --> <xsl:apply-templates
select="/data/document[normalize-space(item[@name = '$workflowgroup'
] /value) = 'Auftrag']" /> <!-- body -->
<xsl:apply-templates
select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']" />
</div>
</div>
</body>
</html>
</xsl:template> <!--
Header Template -->
<xsl:template
match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Auftrag']">
<div id="header">
<div id="imixs-servicenav">
<div class="toolbar branding" style="float:left;">
<span> Auftrag - <xsl:value-of select="item[@name='numsequencenumber']/value" />
</span>
</div>
<div style="font-size:12px;float:right"> DYNAMIXS.AI GmbH - <br /> Frei-Otto-Str. 4 -
80797 München <br /> Tel.: +49 (0)89 / 45 21 36-0 </div>
</div>
</div>
<div>
<h2>
<xsl:value-of select="item[@name='_subject']/value" />
</h2>
<h3>Requirements Completed: <xsl:value-of
select="format-dateTime($currenttime, '[D01].[M01].[Y0001]')"></xsl:value-of></h3>
</div>
</xsl:template> <!--
Body Template -->
<xsl:template
match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']">
<xsl:variable name="eventDate" select="item[@name='$lasteventdate']/value" />
<xsl:variable name="effortPlaned" select="item[@name='_effort_planed']/value" />
<xsl:variable name="capacity" select="item[@name='_capacity']/value" />
<div class="imixs-requirement">
<h4>
<xsl:value-of select="item[@name='_subject']/value" />
<span class="small" style="float:right;"> Stand: <xsl:value-of
select="format-dateTime($eventDate, '[D01].[M01].[Y0001]')"></xsl:value-of>
</span>
</h4>
<p>
<xsl:value-of select="item[@name='_description']/value" disable-output-escaping="yes" />
</p>
</div> <!--
efforts -->
<table class="imixs-table">
<thead>
<tr>
<th style="width:10px;">Datum</th>
<th>Leistungsbezeichnung</th>
<th style="width:80px;">Stunden</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="item[@name='_childitems']/value">
<tr>
<td style="text-align: center;">
<xsl:value-of
select="format-dateTime(item[@name='datdate']/value, '[D01].[M01].[Y0001]')" />
</td>
<td>
<xsl:value-of select="item[@name='name']/value" />
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='amount']/value" />
</td>
</tr>
</xsl:for-each> <!--
Summe -->
</tbody>
<tfoot>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Summe:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_capacity']/value" />
</td>
</tr>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Plan:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_effort_planed']/value" />
</td>
</tr>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Prozent:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_effort_div']/value" /> % </td>
</tr>
</tfoot>
</table>
</xsl:template>
</xsl:stylesheet>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY bdquo "" ><!ENTITY quot "" ><!ENTITY uuml "ü" ><!ENTITY auml "ä" ><!ENTITY ouml "ö" ><!ENTITY Uuml "Ü" ><!ENTITY Auml "Ä" >
<!ENTITY Ouml "Ö" ><!ENTITY szlig "ß" ><!ENTITY nbsp " " ><!ENTITY lt "" ><!ENTITY gt "" >
]>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="html" media-type="text/html" indent="no" encoding="UTF-8" />
<xsl:decimal-format name="euro" decimal-separator="," grouping-separator="." />
<xsl:variable name="currenttime" select="current-dateTime()" />
<xsl:template match="/">
<html>
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Imixs Software Solutions GmbH</title>
<link href="../../layout/css/imixs-basic.css" charset="UTF-8" type="text/css"
rel="stylesheet" />
<link href="../../layout/css/imixs-layout.css" charset="UTF-8" type="text/css"
rel="stylesheet" />
<link href="../../layout/css/office-theme-print.css" charset="UTF-8" type="text/css"
rel="stylesheet" />
<link href="../../layout/css/custom.css" charset="UTF-8" type="text/css"
rel="stylesheet" />
<link href="../../custom-print.css" charset="UTF-8" type="text/css" rel="stylesheet" />
<style> .toolbar.branding { font-size:1.75rem; } h2 { font-size:1.7em; } .small { font-size:65%; } #imixs-content { padding:10px; } #header { background-color: #FFF; color: #333; border-bottom: 1px solid #333; padding:0; } .imixs-requirement { margin-top:20px; margin-bottom:40px; } .imixs-requirement h4 { border-bottom: 1px solid #333; } .imixs-table { width: 100%; margin-bottom:4em; } @media print { body {font-size:0.66em;} } </style>
</head>
<body> <!-- content -->
<div id="container">
<div id="imixs-content"> <!-- generate Header -->
<xsl:apply-templates
select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Auftrag']" /> <!--
body -->
<xsl:apply-templates
select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']" />
</div>
</div>
</body>
</html>
</xsl:template> <!--
Header Template -->
<xsl:template
match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Auftrag']">
<div id="header">
<div id="imixs-servicenav">
<div class="toolbar branding" style="float:left;">
<span> Auftrag - <xsl:value-of select="item[@name='numsequencenumber']/value" />
</span>
</div>
<div style="font-size:12px;float:right"> DYNAMIXS.AI GmbH - <br /> Frei-Otto-Str. 4
- 80797 München <br /> Tel.: +49 (0)89 / 45 21 36-0 </div>
</div>
</div> <div>
<h2>
<xsl:value-of select="item[@name='_subject']/value" />
</h2>
<h3>Requirements in Umsetzung: <xsl:value-of
select="format-dateTime($currenttime, '[D01].[M01].[Y0001]')"></xsl:value-of></h3>
</div>
</xsl:template> <!--
Body Template -->
<xsl:template
match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']">
<xsl:variable name="eventDate" select="item[@name='$lasteventdate']/value" /> <xsl:variable
name="effortPlaned" select="item[@name='_effort_planed']/value" /> <xsl:variable
name="capacity" select="item[@name='_capacity']/value" /> <div class="imixs-requirement">
<h4>
<xsl:value-of select="item[@name='_subject']/value" />
<span class="small" style="float:right;"> Stand: <xsl:value-of
select="format-dateTime($eventDate, '[D01].[M01].[Y0001]')"></xsl:value-of>
</span>
</h4>
<p>
<xsl:value-of select="item[@name='_description']/value"
disable-output-escaping="yes" />
</p>
</div> <!-- efforts --> <table
class="imixs-table">
<thead>
<tr>
<th style="width:120px;">Datum</th>
<th>Leistungsbezeichnung</th>
<th style="width:120px;">Stunden</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="item[@name='_childitems']/value">
<tr>
<td style="text-align: center;">
<xsl:value-of
select="format-dateTime(item[@name='datdate']/value, '[D01].[M01].[Y0001]')" />
</td>
<td>
<xsl:value-of select="item[@name='name']/value" />
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='amount']/value" />
</td>
</tr>
</xsl:for-each> <!--
Summe -->
</tbody>
<tfoot>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Summe:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_capacity']/value" />
</td>
</tr>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Plan:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_effort_planed']/value" />
</td>
</tr>
<tr>
<td></td>
<td style="text-align: right;">
<strong>Prozent:</strong>
</td>
<td style="text-align: right;">
<xsl:value-of select="item[@name='_effort_div']/value" /> % </td>
</tr>
</tfoot>
</table>
</xsl:template>
</xsl:stylesheet>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><document xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><item name="attributes"><value xsi:nil="true"/></item><item name="encoding"><value xsi:type="xs:string"></value></item><item name="txtname"><value xsi:type="xs:string">requirements-planning</value></item><item name="txtquery"><value xsi:type="xs:string">($uniqueid:"{id}")
OR
($workflowgroup:"Requirement"
AND ($workitemref:"{id}" OR txtworkitemref:"{id}")
AND $taskid:2010
)
</value></item><item name="xsl"><value xsi:type="xs:string">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;!DOCTYPE xsl:stylesheet [&lt;!ENTITY bdquo "" &gt;&lt;!ENTITY quot "" &gt;&lt;!ENTITY uuml "ü" &gt;&lt;!ENTITY auml "ä" &gt;&lt;!ENTITY ouml "ö" &gt;&lt;!ENTITY Uuml "Ü" &gt;&lt;!ENTITY Auml "Ä" &gt;&lt;!ENTITY Ouml "Ö" &gt;&lt;!ENTITY szlig "ß" &gt;&lt;!ENTITY nbsp " " &gt;&lt;!ENTITY lt "" &gt;&lt;!ENTITY gt "" &gt;]&gt;&lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"&gt; &lt;xsl:output method="html" media-type="text/html" indent="no" encoding="UTF-8" /&gt; &lt;xsl:decimal-format name="euro" decimal-separator="," grouping-separator="." /&gt; &lt;xsl:variable name="currenttime" select="current-dateTime()" /&gt; &lt;xsl:template match="/"&gt; &lt;html&gt; &lt;head&gt; &lt;meta name="viewport" content="width=device-width" /&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt; &lt;title&gt;Imixs Software Solutions GmbH&lt;/title&gt; &lt;link href="../../layout/css/imixs-basic.css" charset="UTF-8" type="text/css" rel="stylesheet" /&gt; &lt;link href="../../layout/css/imixs-layout.css" charset="UTF-8" type="text/css" rel="stylesheet" /&gt; &lt;link href="../../layout/css/office-theme-print.css" charset="UTF-8" type="text/css" rel="stylesheet" /&gt; &lt;link href="../../layout/css/custom.css" charset="UTF-8" type="text/css" rel="stylesheet" /&gt; &lt;link href="../../custom-print.css" charset="UTF-8" type="text/css" rel="stylesheet" /&gt; &lt;style&gt; .toolbar.branding { font-size:1.75rem; } h2 { font-size:1.7em; } .small { font-size:65%; } #imixs-content { padding:10px; } #header { background-color: #FFF; color: #333; border-bottom: 1px solid #333; padding:0; } .imixs-requirement { margin-top:20px; margin-bottom:40px; } .imixs-requirement h4 { border-bottom: 1px solid #333; } .imixs-table { width: 100%; margin-bottom:4em; } @media print { body {font-size:0.66em;} } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;!-- content --&gt; &lt;div id="container"&gt; &lt;div id="imixs-content"&gt; &lt;!-- generate Header --&gt; &lt;xsl:apply-templates select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Auftrag']" /&gt; &lt;!-- body --&gt; &lt;xsl:apply-templates select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']" /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt; &lt;/xsl:template&gt; &lt;!-- Header Template --&gt; &lt;xsl:template match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Auftrag']"&gt; &lt;div id="header"&gt; &lt;div id="imixs-servicenav"&gt; &lt;div class="toolbar branding" style="float:left;"&gt; &lt;span&gt; Auftrag - &lt;xsl:value-of select="item[@name='numsequencenumber']/value" /&gt; &lt;/span&gt; &lt;/div&gt; &lt;div style="font-size:12px;float:right"&gt; Imixs Software Solutions GmbH - &lt;br /&gt; Agnes-Pockels-Bogen 1 - 80992 München &lt;br /&gt; Tel.: +49 (0)89 / 45 21 36-0 &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div&gt; &lt;h2&gt; &lt;xsl:value-of select="item[@name='_subject']/value" /&gt; &lt;/h2&gt; &lt;h3&gt;Requirements in Planung: &lt;xsl:value-of select="format-dateTime($currenttime, '[D01].[M01].[Y0001]')"&gt;&lt;/xsl:value-of&gt;&lt;/h3&gt; &lt;/div&gt; &lt;/xsl:template&gt; &lt;!-- Body Template --&gt; &lt;xsl:template match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = 'Requirement']"&gt; &lt;xsl:variable name="eventDate" select="item[@name='$lasteventdate']/value" /&gt; &lt;div class="imixs-requirement"&gt; &lt;h4&gt; &lt;xsl:value-of select="item[@name='_subject']/value" /&gt; &lt;span class="small" style="float:right;"&gt; Stand: &lt;xsl:value-of select="format-dateTime($eventDate, '[D01].[M01].[Y0001]')"&gt;&lt;/xsl:value-of&gt; &lt;/span&gt; &lt;/h4&gt; &lt;p&gt; &lt;xsl:value-of select="item[@name='_description']/value" disable-output-escaping="yes" /&gt; &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Aufwand geplant: &lt;/strong&gt;&lt;xsl:value-of select="item[@name='_effort_planed']/value" /&gt; Stunden &lt;/p&gt; &lt;/div&gt; &lt;/xsl:template&gt;&lt;/xsl:stylesheet&gt;</value></item><item name="xslresource"><value xsi:type="xs:string">/imixs-super-office/src/reports/requirements-planning.xsl</value></item></document>

View file

@ -0,0 +1,42 @@
package com.imixs.intern;
import java.util.List;
import java.util.logging.Logger;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.poi.POIFindReplaceAdapter;
import jakarta.inject.Inject;
/**
* Dieser Adapter erweitert den POIFindReplaceAdapter und fügt in das
* Rechnungsformular zusätzliche Zeilen ein
*/
public class InvoicePOIAdapter extends POIFindReplaceAdapter {
private static Logger logger = Logger.getLogger(InvoicePOIAdapter.class.getName());
@Inject
WorkflowService workflowService;
@Inject
DocumentService documentService;
public static final String ERROR_CONFIG = "CONFIG_ERROR";
final String TYPE_TEXTBLOCK = "textblock";
@Inject
SnapshotService snapshotService;
@Override
public void updateXSSFWorkbook(XSSFWorkbook workbook, ItemCollection document, List<String> replaceDevList,
String eval) throws PluginException {
super.updateXSSFWorkbook(workbook, document, replaceDevList, eval);
}
}

View file

@ -0,0 +1,74 @@
package com.imixs.intern;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.faces.data.ViewController;
import org.imixs.workflow.faces.data.WorkflowController;
import org.imixs.workflow.faces.data.WorkflowEvent;
import org.imixs.workflow.faces.util.LoginController;
import org.imixs.workflow.office.forms.WorkitemLinkController;
import jakarta.annotation.Priority;
import jakarta.enterprise.context.RequestScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import jakarta.inject.Named;
/**
* Dieser AuftragController hat nur den Zweck eine MIgration des neuen feldes
* contact.ref durchzuführen
*
*/
@Named
@RequestScoped
public class AuftragController extends ViewController {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(AuftragController.class.getName());
@Inject
LoginController loginController;
@Inject
WorkflowController workflowController;
@Inject
WorkitemLinkController workitemLinkController;
/**
* Diese Hilfsmethode sortiert die Requirements nach Datum.
*
* @param workflowEvent
* @throws AccessDeniedException
*/
public void onWorkflowEvent(@Observes @Priority(value = 1) WorkflowEvent workflowEvent)
throws AccessDeniedException {
ItemCollection workitem = workflowEvent.getWorkitem();
if (workitem == null) {
return;
}
if (workflowEvent.getEventType() == WorkflowEvent.WORKITEM_CHANGED) {
// skip if already defined
if (!workitem.getItemValueString("contact.ref").isEmpty()) {
return;
}
// check all refs...
List<ItemCollection> references = workitemLinkController.getReferences();
for (ItemCollection reference : references) {
if ("Kontakt".equals(reference.getWorkflowGroup())) {
workitem.setItemValue("contact.ref", reference.getUniqueID());
// Erledigt! :-)
return;
}
}
}
}
}

View file

@ -0,0 +1,62 @@
package com.imixs.intern;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.SignalAdapter;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.ModelException;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.ProcessingErrorException;
import org.imixs.workflow.odf.ODFDOMFindReplaceAdapter;
import jakarta.inject.Inject;
/**
* Der RechnungsAdapterComplete wird eingesetzt wenn eine Rechnung geprüft
* wurde. Dann werden alle Requirement Positionen auf 'Invoiced' gesetzt.
*
* Zusätzlich erzeugt der Adapter die Child Item Buchungszeile
*
*/
public class RechnungsAdapterFinish implements SignalAdapter {
private static Logger logger = Logger.getLogger(RechnungsAdapterFinish.class.getName());
@Inject
WorkflowService workflowService;
/**
* Executes all
* requriements with 2300.20**@throws PluginException
*/
@Override
public ItemCollection execute(ItemCollection workitem, ItemCollection event)
throws AdapterException, PluginException {
logger.info("Finish Imixs Rechnung....");
List<String> refs = workitem.getItemValueList("_requirements", String.class);
for (String _id : refs) {
try {
ItemCollection _requirement = workflowService.getDocumentService().load(_id);
if (_requirement.getTaskID() == 2300) {
workflowService.processWorkItem(_requirement, 20);
}
} catch (AccessDeniedException | ProcessingErrorException | ModelException e) {
throw new PluginException(ODFDOMFindReplaceAdapter.class.getSimpleName(), "UPDATE_ERROR",
"Failed to update Requirements : " + e.getMessage());
}
}
// copyRechnungssumme();
return workitem;
}
private void copyRechnungssumme() {
}
}

View file

@ -0,0 +1,129 @@
package com.imixs.intern;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.odf.ODFDOMFindReplaceAdapter;
import org.odftoolkit.odfdom.doc.OdfDocument;
import org.odftoolkit.odfdom.doc.table.OdfTable;
import org.odftoolkit.odfdom.doc.table.OdfTableRow;
import org.odftoolkit.odfdom.incubator.search.InvalidNavigationException;
import jakarta.inject.Inject;
/**
* Dieser Adapter erweitert den ODFDOMFindReplaceAdapter und fügt in das
* Rechnungsformular zusätzliche Zeilen ein
*/
public class RechnungsAdapterODF extends ODFDOMFindReplaceAdapter {
private static Logger logger = Logger.getLogger(ODFDOMFindReplaceAdapter.class.getName());
@Inject
WorkflowService workflowService;
@Inject
DocumentService documentService;
/**
* Updates a SpreadSheet Document
*
* Load all needed workitems....
*
* @param odfDoc
* @param workitem
* @param replaceDevList
* @throws PluginException
* @throws InvalidNavigationException
*/
@Override
public void updateODFDocument(OdfDocument odfDoc, ItemCollection workitem, List<String> replaceDevList)
throws PluginException, InvalidNavigationException {
String subject;
super.updateODFDocument(odfDoc, workitem, replaceDevList);
logger.info("Update Imixs Rechnung....");
// Load all needed workitems....
ItemCollection auftrag = documentService.load(workitem.getItemValueString("$workitemref"));
subject = auftrag.getItemValueString("_subject");
List<ItemCollection> requirements = new ArrayList<ItemCollection>();
List<String> refs = workitem.getItemValueList("_requirements", String.class);
for (String _id : refs) {
requirements.add(documentService.load(_id));
}
// find Kontakt
ItemCollection kontakt = null;
refs = auftrag.getItemValueList("$workitemref", String.class);
for (String _id : refs) {
ItemCollection _workitem = documentService.load(_id);
if (_workitem != null && "Kontakt".equals(_workitem.getItemValueString("$workflowgroup"))) {
kontakt = _workitem;
break;
}
}
// find row..
OdfTable tbl = odfDoc.getTableList().get(0);
// Update Address
if (kontakt != null) {
tbl.getCellByPosition("A7").setStringValue(kontakt.getItemValueString("_subject"));
tbl.getCellByPosition("A8").setStringValue(kontakt.getItemValueString("_address"));
tbl.getCellByPosition("A10")
.setStringValue(kontakt.getItemValueString("_zip") + " " + kontakt.getItemValueString("_city"));
tbl.getCellByPosition("A11").setStringValue(kontakt.getItemValueString("_country"));
}
// Update Auftrag
if (auftrag != null) {
tbl.getCellByPosition("G21").setStringValue(auftrag.getItemValueString("numsequencenumber"));
tbl.getCellByPosition("C21").setStringValue(auftrag.getItemValueString("_ordernumber"));
// update email if not defined
if (workitem.getItemValueString("invoice.email").isEmpty()) {
workitem.cloneItem("invoice.email", auftrag);
}
}
// Requirements
List<OdfTableRow> newRows = tbl.insertRowsBefore(24, requirements.size() - 1);
int pos = 1;
int line = 0;
for (ItemCollection _requirement : requirements) {
OdfTableRow newRow = tbl.getRowByIndex(22 + pos);
line = pos + 23;
newRow.getCellByIndex(0).setStringValue(pos + "");
newRow.getCellByIndex(1).setStringValue(_requirement.getItemValueString("_subject"));
newRow.getCellByIndex(4).setDoubleValue(auftrag.getItemValueDouble("_rate"));
newRow.getCellByIndex(5).setDoubleValue(_requirement.getItemValueDouble("_capacity"));
// set formular
newRow.getCellByIndex(6).setFormula("=E" + (line) + "*F" + (line));
pos++;
}
// Update Summary Formulars....
// line = 24;
// String formel = "=";
// for (ItemCollection _requirement : requirements) {
// formel = formel + "G" + line + "+";
// line++;
// }
// formel = formel.substring(0, formel.length() - 1);
// line = 25 + requirements.size();
// tbl.getCellByPosition("G" + (line)).setFormula(formel);
// line++;
// line++;
// tbl.getCellByPosition("G" + (line)).setFormula("=G" + (line - 2) + "+G" +
// (line - 1));
}
}

View file

@ -0,0 +1,119 @@
package com.imixs.intern;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.ItemCollectionComparator;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.faces.data.ViewController;
import org.imixs.workflow.faces.data.WorkflowController;
import org.imixs.workflow.faces.data.WorkflowEvent;
import org.imixs.workflow.faces.util.LoginController;
import org.imixs.workflow.office.forms.ChildItemController;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Priority;
import jakarta.enterprise.event.Observes;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@Named
@ViewScoped
public class RequirementsViewController extends ViewController {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(RequirementsViewController.class.getName());
@Inject
LoginController loginController;
@Inject
WorkflowController workflowController;
@Inject
ChildItemController childItemController;
@Override
@PostConstruct
public void init() {
super.init();
String id = "-1";
if (workflowController.getWorkitem() != null) {
id = workflowController.getWorkitem().getUniqueID();
}
this.setQuery(
"($workflowgroup:\"Requirement\") AND (type:\"workitem\" OR type:\"workitemarchive\") AND ($workitemref:\""
+ id + "\" OR txtworkitemref:\"" + id + "\")");
this.setSortBy("$taskid");
this.setSortReverse(false);
this.setPageSize(999);
this.setLoadStubs(false);
}
/**
* Compute summary....
*/
@Override
public List<ItemCollection> loadData() throws QueryException {
List<ItemCollection> result = super.loadData();
float capa = 0;
float plan = 0;
for (ItemCollection orderitem : result) {
// skip canceled entries
if (2900 == orderitem.getTaskID()) {
continue;
}
capa = capa + orderitem.getItemValueFloat("_capacity");
plan = plan + orderitem.getItemValueFloat("_effort_planed");
}
workflowController.getWorkitem().replaceItemValue("_capacity", capa);
workflowController.getWorkitem().replaceItemValue("_effort_planed", plan);
workflowController.getWorkitem().replaceItemValue("_effort_div", Float.valueOf((capa / plan) * 100));
// sort result by task and creation date
result.sort(Comparator
.comparingInt((ItemCollection item) -> item.getItemValueInteger("$taskid"))
.thenComparing(item -> item.getItemValueDate("$created"), Comparator.reverseOrder()));
return result;
}
/**
* Diese Hilfsmethode sortiert die Requirements nach Datum.
*
* @param workflowEvent
* @throws AccessDeniedException
*/
public void onWorkflowEvent(@Observes @Priority(value = 1) WorkflowEvent workflowEvent)
throws AccessDeniedException {
int eventType = workflowEvent.getEventType();
ItemCollection workitem = workflowEvent.getWorkitem();
if (workitem == null) {
return;
}
// nur reagieren wenn wir in einem Requirement oder bei Werksstudenten sind!
if ("Requirement".equals(workitem.getWorkflowGroup()) || "Werksstudent".equals(workitem.getWorkflowGroup())) {
// before the workitem is saved we sort the list by date
if (WorkflowEvent.WORKITEM_BEFORE_PROCESS == eventType
&& childItemController.getChildItems() != null) {
logger.info("...sorting requirement/effort list...");
Collections.sort(childItemController.getChildItems(), new ItemCollectionComparator("datdate", false));
}
}
}
}

View file

@ -0,0 +1,175 @@
package com.imixs.intern;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.plugins.AbstractPlugin;
import org.imixs.workflow.exceptions.PluginException;
/**
* Dieses Plugin berechnet die gebuchten Stunden pro tag und woche
*
* @author rsoika
*
*/
public class StatistikPlugin extends AbstractPlugin {
private String[] ignoreList = { "administration-np" };
private static Logger logger = Logger.getLogger(StatistikPlugin.class
.getName());
/**
*
*
* Skip if not a workitem and only run once a day!
*
* @throws PluginException
*
**/
@SuppressWarnings("unchecked")
@Override
public ItemCollection run(ItemCollection workitem, ItemCollection documentActivity) throws PluginException {
List<String> ignoreArrayList = Arrays.asList(ignoreList);
// skip if the workitem is from a different type (for example Teams
// may not be processed by this plugin)
String type = workitem.getItemValueString("type");
if (!type.equals("workitem"))
return workitem;
// lauf nur in workflow modell imixs-de
// und nur 9000.100
int processID = workitem.getItemValueInteger("$Processid");
int activityID = documentActivity.getItemValueInteger("numActivityID");
String model = workitem.getItemValueString("$ModelVersion");
if (!(processID == 9000 && activityID == 100 && model.startsWith("imixs-de")))
return workitem;
// sind wir heute schon gelaufen?
Calendar calToday = Calendar.getInstance();
calToday.setTime(new Date());
Calendar calLast = Calendar.getInstance();
Date datLast = workitem.getItemValueDate("datLetzteStatistik");
if (datLast != null)
calLast.setTime(datLast);
int dayOfYear = calLast.get(Calendar.DAY_OF_YEAR);
if (datLast != null
&& calLast.get(Calendar.DAY_OF_YEAR) == calToday
.get(Calendar.DAY_OF_YEAR)) {
logger.info("[Imixs StatistikPlugin] skipped");
// ganzen vorgang abbrechen, da sonst wieder eine Email gesendet wird
throw new PluginException("StatistikPlugin", "wrong date", "wrong date");
// return Plugin.PLUGIN_ERROR;
}
// ok wir starten die Auswertung!
logger.info("[Imixs StatistikPlugin] Starte Auswertung....");
workitem.replaceItemValue("datLetzteStatistik", calToday.getTime());
// jetzt brauchen wir die Werte von gestern!
calToday.add(Calendar.DATE, -1);
List<ItemCollection> aktuell = getStunden(calToday, calToday);
int stundenHeute = 0;
for (ItemCollection abr : aktuell) {
// prüfe ob categorie in ignore liste ist
String sKategorie = abr.getItemValueString("_category")
.toLowerCase();
if (Arrays.asList(ignoreList).contains(sKategorie))
continue;
stundenHeute += abr.getItemValueInteger("_duration");
}
logger.info("[Imixs StatistikPlugin] Stunden heute=" + stundenHeute);
workitem.replaceItemValue("numStundenHeute", stundenHeute);
// vorherige Woche berechnen
Date date = new Date();
int i = calToday.get(Calendar.DAY_OF_WEEK)
- calToday.getFirstDayOfWeek();
calToday.add(Calendar.DATE, -i - 7);
Date start = calToday.getTime();
calToday.add(Calendar.DATE, 6);
Date end = calToday.getTime();
logger.info("[Imixs StatistikPlugin] Vorwoche=" + start + " - " + end);
Calendar calStart = Calendar.getInstance();
calStart.setTime(start);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(end);
List<ItemCollection> vorwoche = getStunden(calStart, calEnd);
int stundenLetzeWoche = 0;
for (ItemCollection abr : vorwoche) {
// prüfe ob categorie in ignore liste ist
String sKategorie = abr.getItemValueString("_category")
.toLowerCase();
if (Arrays.asList(ignoreList).contains(sKategorie))
continue;
stundenLetzeWoche += abr.getItemValueInteger("_duration");
}
workitem.replaceItemValue("numStundenLetzeWoche", stundenLetzeWoche);
logger.info("[Imixs StatistikPlugin] Stunden Letze Woche="
+ stundenLetzeWoche);
return workitem;
}
public void close(int arg0) {
// no op
}
public String[] getIgnoreList() {
return ignoreList;
}
public void setIgnoreList(String[] ignoreList) {
this.ignoreList = ignoreList;
}
private List<ItemCollection> getStunden(Calendar dayFrom, Calendar dayTo) {
// dayformat 2014-12-31
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String sDateFrom = df.format(dayFrom.getTime());
String sDateTo = df.format(dayTo.getTime());
String sQuery = " SELECT workitem FROM Entity AS workitem"
+ " JOIN workitem.textItems AS type2"
+ " JOIN workitem.calendarItems AS type3"
+ " WHERE workitem.type IN ('childworkitem')"
+ " AND type3.itemName = 'datdate' "
+ " AND type3.itemValue BETWEEN '" + sDateFrom + " 00:00:00' AND '"
+ sDateTo + " 23:59:59'"
+ " AND type2.itemName = 'txtworkflowgroup' "
+ " AND type2.itemValue = 'Zeiterfassung'"
+ " ORDER BY type3.itemValue DESC ";
logger.fine("[Imixs StatistikPlugin] " + sQuery);
logger.warning("Imixs Statistik Collector is not implemented");
// return documentService.findAllEntities(sQuery, 0, -1);
return new ArrayList<ItemCollection>();
}
}

View file

@ -0,0 +1,491 @@
package com.imixs.intern;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import org.imixs.marty.team.TeamService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.forms.AnalyticController;
import org.imixs.workflow.office.forms.AnalyticEvent;
import jakarta.enterprise.context.RequestScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.json.Json;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
/**
* Der SuperOfficeAnalyticController berechnet verschiedene Analyse Daten
*
* @author rsoika
*
*/
@Named
@RequestScoped
public class SuperOfficeAnalyticController implements Serializable {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(AnalyticController.class.getName());
public static final String CHILD_ITEM_PROPERTY = "_ChildItems";
@Inject
protected DocumentService documentService;
@Inject
TeamService teamService;
List<ItemCollection> auftraege = null;
List<ItemCollection> rechnungen = null;
Map<String, List<ItemCollection>> requirementsCache = null;
Map<Integer, RequirementData> hoursByWeek = null;
int earliestWeek = Integer.MAX_VALUE;
int latestWeek = Integer.MIN_VALUE;
public void onEvent(@Observes AnalyticEvent event) {
if (!event.getKey().startsWith("superoffice.stats.")) {
return;
}
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.GERMANY);
ItemCollection processRequirements = teamService.getProcessByName("Sales");
if (processRequirements == null) {
logger.severe("Process 'Sales' not found!");
return;
}
ItemCollection processBuchhaltung = teamService.getProcessByName("Finance");
if (processBuchhaltung == null) {
logger.severe("Process 'Finance' not found!");
return;
}
String linkRequirements = "/pages/workitems/worklist.xhtml?processref=" + processRequirements.getUniqueID()
+ "&workflowgroup=Requirement";
String linkInvoices = "/pages/workitems/worklist.xhtml?processref=" + processBuchhaltung.getUniqueID()
+ "&workflowgroup=Rechnungsausgang";
if ("superoffice.stats.hours.total".equals(event.getKey())) {
event.setData(new ItemCollection());
event.getData().setItemValue("value", computeHoursTotal());
event.getData().setItemValue("label", "Stunden");
event.getData().setItemValue("description", "Noch nicht abgerechnete Stunden");
event.getData().setItemValue("link", linkRequirements);
}
if ("superoffice.stats.invoices.total".equals(event.getKey())) {
event.setData(new ItemCollection());
event.getData().setItemValue("Value", currencyFormat.format(computeOffeneRechnungen()));
event.getData().setItemValue("Label", "EUR");
event.getData().setItemValue("Description", "Offene Rechnungen");
event.getData().setItemValue("Link", linkInvoices);
}
// Charts
if ("superoffice.stats.hours.currentWeek".equals(event.getKey())) {
accumulateHoursByWeek();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int weekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
int year = calendar.get(Calendar.YEAR);
int yearWeek = year * 100 + weekNumber; // Unique key for each year + week combination
RequirementData weekData = hoursByWeek.getOrDefault(yearWeek, new RequirementData());
event.setData(new ItemCollection());
event.getData().setItemValue("Value", weekData.total);
event.getData().setItemValue("Label", "Stunden");
event.getData().setItemValue("Description", "Stunden gesamt in dieser Woche - KW " + weekNumber);
event.getData().setItemValue("Link", linkRequirements);
}
if ("superoffice.stats.hours.trend".equals(event.getKey())) {
accumulateHoursByWeek();
event.setData(new ItemCollection());
event.getData().setItemValue("Value", buildHoursChart());
event.getData().setItemValue("Label", "Stunden");
event.getData().setItemValue("Description", "Stunden nach KW");
}
// computeKIPrompt(event.getWorkitem());
}
/**
* Berechnet die Summe aller offenen stunden
*
* @return
*/
private double computeHoursTotal() {
logger.fine("compute hours...");
List<ItemCollection> list = getAufträge();
double result = 0;
for (ItemCollection steuerItemCol : list) {
result = result + getStundenByAuftrag(steuerItemCol);
}
return round(result);
}
/**
* Berechnet die Summe aller offenen Rechnungen
*
* _amount
*
* @return
*/
private double computeOffeneRechnungen() {
logger.fine("compute offene Rechnungen...");
List<ItemCollection> list = getOffeneRechnungen();
double result = 0;
for (ItemCollection workitem : list) {
result = result + workitem.getItemValueDouble("_amount");
}
return round(result);
}
/**
* Berechnet die stunden pro auftrag (_capacity) Achtung: ist ein string der in
* double convertiert werden muss
*
* @param auftrag
* @return
*/
private double getStundenByAuftrag(ItemCollection auftrag) {
double result = 0;
List<ItemCollection> requirements = getRequirementsByAuftrag(auftrag);
for (ItemCollection requirement : requirements) {
result = result + requirement.getItemValueDouble("_capacity");
}
return result;
}
private void computeKIPrompt(ItemCollection workitem) {
String prompt = "Erstelle eine sehr kurze Geschäftsprognose über die Auftragslage auf Basis folgender Daten: \n";
prompt += "Wir haben aktuell offene Rechnungen in Höhe von " + workitem.getItemValueDouble("invoices.total")
+ " EUR .";
prompt += "Unser Stundensatz beträgt 150,- EUR .";
prompt += "In der aktuellen Woche haben wir bereits " + workitem.getItemValueInteger("stunden.total.week")
+ " Stunden gearbeitet. ";
prompt += "Insgesamt haben wir " + workitem.getItemValueInteger("stunden.total")
+ " Stunden gearbeitet die noch nicht in Rechnung gestellt sind. \n";
prompt += "Hier kommt eine übersicht der geleisteten Stunden die noch nicht abgerechnet wurden nach Kalenderwoche: \n";
Set<Integer> weekNumbers = hoursByWeek.keySet();
for (int kw : weekNumbers) {
String year = ("" + kw).substring(0, 4);
String weekNumber = ("" + kw).substring(4);
// Add the saldo for the week or 0.0 if no data
RequirementData requirementData = hoursByWeek.getOrDefault(kw, new RequirementData());
prompt += " - " + weekNumber + "/" + year + " = " + requirementData.total + "\n";
}
logger.info(prompt);
}
/**
* Lädt alle Aufträge
*
* @return
*/
private List<ItemCollection> getAufträge() {
if (auftraege != null) {
return auftraege;
}
logger.info("Load Aufträge for analytics....");
String query = "(type:workitem ) AND ($workflowgroup:\"Auftrag\")";
try {
auftraege = documentService.find(query, 999, 0, "$created", false);
return auftraege;
} catch (QueryException e) {
logger.severe("Failed to get invoices: " + e.getMessage());
}
return null;
}
/**
* Lädt alle offenen Rechnungen
*
* _amount
*
* @return
*/
private List<ItemCollection> getOffeneRechnungen() {
if (rechnungen != null) {
return rechnungen;
}
logger.info("Load Rechnung for analytics....");
String query = "(type:workitem ) AND ($workflowgroup:\"Rechnungsausgang\")";
try {
rechnungen = documentService.find(query, 999, 0, "$created", false);
return rechnungen;
} catch (QueryException e) {
logger.severe("Failed to get invoices: " + e.getMessage());
}
return null;
}
/**
* Lädt alle Requirements zu einem Auftrag
*
* @return
*/
private List<ItemCollection> getRequirementsByAuftrag(ItemCollection auftrag) {
if (requirementsCache == null) {
requirementsCache = new HashMap<>();
}
List<ItemCollection> result = requirementsCache.get(auftrag.getUniqueID());
if (result != null) {
return result;
}
// compute requirements....
logger.info("Load Requirements by Auftrag for analytics (" + auftrag.getUniqueID() + ")...");
String query = "($workflowgroup:\"Requirement\") AND (type:\"workitem\") AND ($taskid:[2100 TO 2300]) AND ($workitemref:\""
+ auftrag.getUniqueID() + "\")";
try {
result = documentService.find(query, 999, 0, "$created", false);
requirementsCache.put(auftrag.getUniqueID(), result);
return result;
} catch (QueryException e) {
logger.severe("Failed to get invoices: " + e.getMessage());
}
return null;
}
/**
* Akkumuliert alle Stunden nach KW. Die Methode nutzt einen Cache
*
* @return
*/
private void accumulateHoursByWeek() {
if (hoursByWeek != null) {
return;
}
logger.info("accumulate hours by week...");
hoursByWeek = new HashMap<>();
List<ItemCollection> list = getAufträge();
Calendar calendar = Calendar.getInstance();
// Step 1: Group saldo by week
for (ItemCollection auftrag : list) {
List<ItemCollection> requirements = getRequirementsByAuftrag(auftrag);
for (ItemCollection requirement : requirements) {
// dive into the stunden....
List<ItemCollection> stundenListe = explodeChildList(requirement);
for (ItemCollection stunden : stundenListe) {
double total = stunden.getItemValueDouble("amount");
Date date = stunden.getItemValueDate("datdate");
if (date == null) {
continue;
}
// Get the week number and year from the date
calendar.setTime(date);
int weekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
int year = calendar.get(Calendar.YEAR);
int yearWeek = year * 100 + weekNumber; // Unique key for each year + week combination
if (year < 2024) {
logger.warning("Old Requirement in Auftrag " + auftrag.getUniqueID());
}
// Accumulate the hours per week
RequirementData steuerDataByWeek = hoursByWeek.getOrDefault(yearWeek, new RequirementData());
steuerDataByWeek.add(total, "");
hoursByWeek.put(yearWeek, steuerDataByWeek);
// Track the earliest and latest weeks
earliestWeek = Math.min(earliestWeek, yearWeek);
latestWeek = Math.max(latestWeek, yearWeek);
}
}
}
}
/**
* Berechnet das Chart zu den aktuell ermittelten Stunden
*
* <pre>
*
chartCfg = {
type: 'bar',
data: {
datasets: [{
data: [20, 10],
}],
labels: ['1', '2']
}
}
*
* </pre>
*
* @return
*/
private String buildHoursChart() {
accumulateHoursByWeek();
// Step 2: Prepare the JSON structure and ensure we have all weeks from earliest
// to latest
JsonArrayBuilder dataBuilderTotal = Json.createArrayBuilder();
JsonArrayBuilder labelsBuilder = Json.createArrayBuilder();
Calendar startCal = Calendar.getInstance();
startCal.set(Calendar.YEAR, earliestWeek / 100);
startCal.set(Calendar.WEEK_OF_YEAR, earliestWeek % 100);
Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.YEAR, latestWeek / 100);
endCal.set(Calendar.WEEK_OF_YEAR, latestWeek % 100);
while (!startCal.after(endCal)) {
int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR);
int year = startCal.get(Calendar.YEAR);
int yearWeek = year * 100 + weekNumber;
// Add the saldo for the week or 0.0 if no data
RequirementData requirementData = hoursByWeek.getOrDefault(yearWeek, new RequirementData());
dataBuilderTotal.add(requirementData.total);
labelsBuilder.add(weekNumber + "/" + year); // Label as 'week/year'
// Move to the next week
startCal.add(Calendar.WEEK_OF_YEAR, 1);
}
// Step 3: Prepare the JSON structure
JsonObjectBuilder jsonBuilder = Json.createObjectBuilder()
.add("type", "bar")
.add("data", Json.createObjectBuilder()
.add("datasets", Json.createArrayBuilder()
.add(Json.createObjectBuilder() // Third dataset for 'total'
.add("label", "Total")
.add("backgroundColor", "#4bc0c0")
.add("borderWidth", 1)
.add("data", dataBuilderTotal)))
.add("labels", labelsBuilder));
// Step 4: Return the JSON structure as a string
JsonObject chartCfg = jsonBuilder.build();
return chartCfg.toString();
}
/**
* Helper method to hold zoll and eust totals in an object. Needed to build
* totals per week.
*/
class RequirementData {
double total = 0.0;
String status = "";
public RequirementData() {
// default constructor
}
/**
* Adds new stunden
*
* @param totalNew
* @param statusNew
*/
public void add(double totalNew, String statusNew) {
total = total + totalNew;
status = statusNew;
}
}
public static double round(double value) {
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(2, RoundingMode.HALF_UP);
return bd.doubleValue();
}
/**
* converts the Map List of a workitem into a List of ItemCollectons
*/
public static List<ItemCollection> explodeChildList(ItemCollection workitem) {
return explodeChildList(workitem, CHILD_ITEM_PROPERTY);
}
/**
* converts the Map List of a workitem into a List of ItemCollectons
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List<ItemCollection> explodeChildList(ItemCollection workitem, String childItemName) {
// convert current list of childItems into ItemCollection elements
ArrayList<ItemCollection> childItems = new ArrayList<ItemCollection>();
List<Object> mapOrderItems = workitem.getItemValue(childItemName);
for (Object mapOderItem : mapOrderItems) {
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
childItems.add(itemCol);
}
}
return childItems;
}
/**
* Convert the List of ItemCollections back into a List of Map elements
*
* @param workitem
*/
public static void implodeChildList(ItemCollection workitem, List<ItemCollection> childItems) {
implodeChildList(workitem, childItems, CHILD_ITEM_PROPERTY);
}
/**
* Convert the List of ItemCollections back into a List of Map elements
*
* @param workitem
*/
@SuppressWarnings({ "rawtypes" })
public static void implodeChildList(ItemCollection workitem, List<ItemCollection> childItems,
String childItemName) {
List<Map> mapOrderItems = new ArrayList<Map>();
// convert the child ItemCollection elements into a List of Map
if (childItems != null) {
// iterate over all order items..
for (ItemCollection orderItem : childItems) {
mapOrderItems.add(orderItem.getAllItems());
}
workitem.replaceItemValue(childItemName, mapOrderItems);
}
}
}

View file

@ -0,0 +1,112 @@
/*******************************************************************************
* Imixs Workflow
* Copyright (C) 2001, 2011 Imixs Software Solutions GmbH,
* http://www.imixs.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You can receive a copy of the GNU General Public
* License at http://www.gnu.org/licenses/gpl.html
*
* Project:
* http://www.imixs.org
* http://java.net/projects/imixs-workflow
*
* Contributors:
* Imixs Software Solutions GmbH - initial API and implementation
* Ralph Soika - Software Developer
*******************************************************************************/
package com.imixs.intern;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.FileData;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.datev.export.DatevEvent;
import jakarta.annotation.Priority;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.LocalBean;
import jakarta.ejb.Stateless;
import jakarta.enterprise.event.Observes;
import jakarta.interceptor.Interceptor;
/**
* Der DatevService entscheidet welches File Exportiert werden soll.
*
* @author rsoika
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Stateless
@LocalBean
public class SuperOfficeDatevService {
private static Logger logger = Logger.getLogger(SuperOfficeDatevService.class.getName());
/**
* This method reacts on CDI events of the type DatevEvent und gibt das richtige
* PDF zurück.
*
*
*/
public void onDatevEvent(@Observes @Priority(Interceptor.Priority.APPLICATION + 600) DatevEvent event) {
ItemCollection invoice = event.getWorkitem();
if (event.getEventType() == DatevEvent.ON_EXPORT_FILE) {
// nur für Ausgangsrechnungen interessant - ansonsten default verhalten nutzen
if (invoice.getModelVersion().startsWith("rechnungsausgang")) {
// wir nehmen das erste PDF das mir "R" beginnt.
FileData lastFileData = null;
List<FileData> fileDataList = invoice.getFileData();
for (FileData fileData : fileDataList) {
// we are only interested in files with sufix .pdf
// and start with "R"
if (!fileData.getName().toLowerCase().endsWith(".pdf")) {
// not a PDF file...
continue;
}
if (!fileData.getName().toLowerCase().startsWith("r")) {
// ist keine Rechnung
continue;
}
if (lastFileData == null) {
lastFileData = fileData;
} else {
// compare the $creation date....
ItemCollection attributes = new ItemCollection(fileData.getAttributes());
ItemCollection lastAttributes = new ItemCollection(lastFileData.getAttributes());
Date date = attributes.getItemValueDate("$created");
Date lastDate = lastAttributes.getItemValueDate("$created");
if (date != null && lastDate != null && (date.compareTo(lastDate) > 0)) {
// this is a newer fileData!
lastFileData = fileData;
}
}
}
if (lastFileData != null) {
event.setFileData(lastFileData);
}
}
}
}
}

View file

@ -0,0 +1,98 @@
package com.imixs.intern;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.plugins.AbstractPlugin;
import org.imixs.workflow.exceptions.PluginException;
import jakarta.inject.Inject;
/**
* Dieses Plugin berechnet die bezeihung Kunde->Auftrag->Requreimeent, usw....
*
* @author rsoika
*
*/
public class SuperOfficePlugin extends AbstractPlugin {
@Inject
DocumentService documentService;
private static Logger logger = Logger.getLogger(StatistikPlugin.class
.getName());
/**
*
*
* Skip if not a workitem and only run once a day!
*
* @throws PluginException
*
**/
@Override
public ItemCollection run(ItemCollection workitem, ItemCollection documentActivity) throws PluginException {
ItemCollection kontakt = null;
ItemCollection auftrag = null;
List<String> refs = workitem.getItemValueList("$workitemref", String.class);
if ("Auftrag".equals(workitem.getWorkflowGroup())) {
// find Kontakt
kontakt = findKontakt(workitem);
if (kontakt != null) {
// update kontakt info.....
workitem.setItemValue("contact.name", kontakt.getItemValueString("_subject"));
}
}
if ("Requirement".equals(workitem.getWorkflowGroup())) {
// find Auftrag
auftrag = findAuftrag(workitem);
if (auftrag != null) {
// kontakt = findKontakt(auftrag);
// update kontakt info.....
workitem.setItemValue("order.name", auftrag.getItemValueString("_subject"));
workitem.setItemValue("contact.name", auftrag.getItemValueString("contact.name"));
}
// convert efforts into a number
String ef = workitem.getItemValueString("_effort_planed");
ef = ef.replace(",", ".");
workitem.setItemValue("_effort_planed", Double.parseDouble(ef));
}
return workitem;
}
private ItemCollection findKontakt(ItemCollection workitem) {
ItemCollection result = null;
List<String> refs = workitem.getItemValueList("$workitemref", String.class);
for (String _id : refs) {
ItemCollection _workitem = documentService.load(_id);
if (_workitem != null && "Kontakt".equals(_workitem.getItemValueString("$workflowgroup"))) {
result = _workitem;
break;
}
}
return result;
}
private ItemCollection findAuftrag(ItemCollection workitem) {
ItemCollection result = null;
List<String> refs = workitem.getItemValueList("$workitemref", String.class);
for (String _id : refs) {
ItemCollection _workitem = documentService.load(_id);
if (_workitem != null && "Auftrag".equals(_workitem.getItemValueString("$workflowgroup"))) {
result = _workitem;
break;
}
}
return result;
}
}

View file

@ -1,2 +0,0 @@
Manifest-Version: 1.0

View file

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<!--
Imixs JPA definition Make sure that the imixs-workflow-jee library
version maches the version provided by the EAR/EJB
-->
<!-- eclipselink -->
<persistence-unit name="org.imixs.workflow.jpa" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>${imixs-office.jta-data-source}</jta-data-source>
<jar-file>lib/imixs-workflow-engine-${org.imixs.workflow.version}.jar</jar-file>
<jar-file>lib/imixs-marty-${org.imixs.marty.version}.jar</jar-file>
<properties>
<!-- target-database Auto MySQL PostgreSQL -->
<property name="eclipselink.target-database" value="Auto" />
<!-- <property name="eclipselink.ddl-generation" value="create-tables" /> -->
<!-- optional extend schema... -->
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
<property name="eclipselink.deploy-on-startup" value="true" />
<property name="eclipselink.logging.level" value="INFO" />
</properties>
</persistence-unit>
</persistence>

View file

@ -0,0 +1,15 @@
<f:subview xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ul>
<li><h:link outcome="/pages/admin/document_import">Dokument Import</h:link></li>
<!-- SEPA -->
<li><h:link outcome="/pages/admin/sepa_config">SEPA</h:link></li>
<li><h:link outcome="/pages/admin/datev_config">DATEV</h:link></li>
</ul>
</f:subview>

View file

@ -0,0 +1,791 @@
/*******************************************************************************
* Imixs Workflow - jQUery API Copyright (C) 2012 Imixs Software Solutions GmbH,
* http://www.imixs.com
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You can receive a copy of the GNU General Public License at
* http://www.gnu.org/licenses/gpl.html
*
* Project: http://www.imixs.org
*
* Contributors: Imixs Software Solutions GmbH - initial API and implementation
* Ralph Soika - Software Developer
******************************************************************************/
var imixsServiceLocationURI = null;
var defaultModelVersion = null;
var defaultProcessID = null;
var requestLocale = null;
var defaultActionClass = null;
var cancelActionLabel = "Cancel";
var defaultImage = "images/default.gif";
/**
* Helper method to test for HTML 5 localStorage...
*
* @returns {Boolean}
*/
function hasLocalStorage() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
}
/**
* This method is used to setup the workflow service
*
* @param aLocation -
* prafix for RESTService URI
* @param aDefaultModel -
* default model version
* @param aDefaultProcess -
* default ProcessID
*/
function setupWorkflowService(aLocation, aDefaultModel, aDefaultProcessID) {
imixsServiceLocationURI = aLocation;
defaultModelVersion = aDefaultModel;
defaultProcessID = aDefaultProcessID;
}
/**
* This method set the default action class for workflow action buttons. If no
* class is specified all action buttons will be styled as jQuery-UI button
* classes.
*
* @param aClass
*/
function setDefaultActionClass(aClass) {
defaultActionClass = aClass;
}
/**
* Overrides the default cancel button label.
*
* @param aLabel
*/
function setCancelActionLabel(aLabel) {
cancelActionLabel = aLabel;
}
/**
* this method clears the stored elements from the local cache
*
* @param identifier
*/
function clearWorkflowElement(identifier) {
// return if not html5 (IE7/8)
if (!hasLocalStorage())
return;
// alert('clearView....');
localStorage.removeItem("org.imixs.workflow." + identifier);
}
/**
* This method load a collection of workItems defined by a REST service URI.
* After the Ajax request is finished successful the method calls
* refreshWorklistView() to print the result into a page element.
*
* The result is stored into the clients localStorage.
*
*
* @param service -
* rest uri to be called ( workflow/worklistbyowner/null.json)
* @param selector -
* jquery selector for result list output
*/
function loadWorkitems(service, selector) {
// we first test if we still have the workflow groups in the local storage
var data = null;
if (hasLocalStorage())
data = localStorage.getItem("org.imixs.workflow." + service);
if (data == null) {
// create the list of workitems using the RESTful service interface
var serviceURL = imixsServiceLocationURI + service;
if (serviceURL.indexOf('?') > -1)
serviceURL = serviceURL + "&";
else
serviceURL = serviceURL + "?";
$
.getJSON(
serviceURL,
{
count : "30",
start : "0",
items : "$uniqueid,txtworkflowgroup,txtworkflowstatus,txtworkflowsummary,txtworkflowimageurl,namcurrenteditor,$modified"
}, function(data) {
// json request finished store the worklist.....
if (hasLocalStorage())
localStorage.setItem("org.imixs.workflow."
+ service, JSON.stringify(data));
refreshWorklistView(service, selector);
});
} else {
// use workflow groups from cache
refreshWorklistView(service, selector);
}
}
jQuery.events = function(expr) {
var rez = [], evo;
jQuery(expr).each(function() {
if (evo = jQuery._data(this, "events"))
rez.push({
element : this,
events : evo
});
});
return rez.length > 0 ? rez : null;
};
/**
* This method fills the page element ID=worklist_view with the selected
* workitems in a default layout.
*
* The method can be overwritten by binding a event listener
*
* <code>
* $(document).on( "refreshWorklist", function(e, data,service) {
....
});
* </code>
*
* If no refreshWorklist event is bound the method prints the worklist in a
* default layout. A refreshWorlist handler can be bound to the global document
* or to a specific selector
*
* <code>
* $(document).on( "refreshWorklist", "#worklist", function(e, data,service) {
....
});
* </code>
*/
function refreshWorklistView(service, selector) {
var dataString = null;
var data = null;
if (hasLocalStorage()) {
dataString = localStorage.getItem("org.imixs.workflow." + service);
data = JSON.parse(dataString);
}
if (data != null) {
// test if data.entity is an array....
if (!$.isArray(data.entity)) {
data.entity = jQuery.makeArray(data.entity);
}
}
// checking if an external general refreshWorklist method was bound
// there for we check the _data object for bound events....
var handlerFound = false;
var $ve = $._data(document, 'events');
if ($ve != null && typeof ($ve.refreshWorklist) != 'undefined') {
// the refreshWorklist method was bound! so now
// test if a binding for the current selector exists...
var handlerList = $ve.refreshWorklist;
$(handlerList).each(function(index) {
if (selector != null && selector == $(this).selector) {
// yes! we have a specific handler!
handlerFound = true;
// trigger handler
$(selector).trigger('refreshWorklist', [ data, service ]);
return;
}
});
if (handlerFound) {
// return from method
return;
}
// no specific handler was found so we trigger the general handler
// trigger external refreshWorklist method
$(document).trigger('refreshWorklist', [ data, service ]);
return;
}
// we did not found any handler - so do default output
// clear list
$("#worklist_view").empty();
if (data == null) {
$("#worklist_view").append(
"<li class=\"workitem\">Keine Daten vorhanden</li>");
return;
}
// iterate over all workitems
$
.each(
data.entity,
function(i, workitem) {
var imgurl = workitem.item[4].value.$;
// take defualt image if no image url is provided
if (imgurl == null)
imgurl = defaultImage;
var img = "<div class=\"workitem-thumb\"><img class=\"\" src=\""
+ imgurl + "\" /></div>";
var p_status = "<span class=\"workitem-summary\"><b>"
+ workitem.item[1].value.$ + "</b>: "
+ workitem.item[2].value.$ + "</span>";
$("#worklist_view")
.append(
"<li class=\"workitem\" onclick=\"loadWorkitem('"
+ workitem.item[0].value.$
+ "');\">"
+ img
+ "<div class=\"workitem-info\"><h3><a href=\"#\">"
+ ""
+ workitem.item[3].value.$
+ "</a></h3>"
+ p_status
+ "</div><div style=\"clear:left;\" /></li>");
});
}
// ############## Workitem ####################
/**
* this method loads a single workItem from the REST service and calls the
* method updateForm to print the content into a page. The optional selectorID
* specifies the area where the form data is placed. If no seletorId is given
* Imixs-Script searches for a section with the id #workitem_view.
*
*
* @param uid -
* $uniqueid of the workitem to be loaded
* @param selectorId -
* optinal param to define the section where the form data is filled
* in
*/
function loadWorkitem(uid, selectorId) {
if (selectorId == null || selectorId == "")
selectorId = '#workitem_view';
// allways reload the workitem!
var data = null;
// load the workitem by it's $uniqueid
$.getJSON(imixsServiceLocationURI + "workflow/workitem/" + uid + ".json?",
{
// items :
// "$uniqueid,$modelversion,$processid,txtworkflowgroup,txtworkflowstatus,txtworkflowsummary,txtworkflowimageurl,namcurrenteditor,$modified,txtworkflowabstract,_subject"
}, function(data) {
updateForm(data, selectorId);
});
}
/**
* This method updates a page section with the current workitem data. The method
* also rebuilds the activity section
*
* @param aWorkitem -
* the data object
* @param aSelector -
* optinal param to define the section where the form data is filled
* in
*/
function updateForm(aWorkitem, aSelector) {
disableActivities(aSelector);
loadProcessEntity(aWorkitem);
loadActivityList(aWorkitem, aSelector);
updateInputFields(aWorkitem, aSelector);
}
/**
* This method updates the input field values for all properties provided by the
* current workItem. The method only updates fields in specified selector. If no
* selectorId is provided the selectorId defaults to 'workitem_view'.
*
* Each value of an input element with a name corresponding to a item contained
* in the current Workitem will be updated.
*
* The method also clears all available Input fields (this is because of the
* case that a workItem did not provide a item for a specific input field. So in
* this case we need to clear the input in any case)
*
* @param aworkitem
* the workitem with the properties
* @param sectionid
* an optional selector
*/
function updateInputFields(aWorkitem, selectorId) {
if (selectorId == null || selectorId == "")
selectorId = '#workitem_view';
$(selectorId).trigger('beforeRefresh');
/* clear input fields... */
clear_form_elements(selectorId);
/*
* next we test if an element with the current item name exists. Then the
* .text() method will replace the content
*/
$.each(aWorkitem.item, function(i, item) {
var tagName = selectorId + " [name=" + item.name + "]";
var tagValue = "";
if (item.value != null && item.value.$ != null)
tagValue = item.value.$;
// $ is not allowed in a id because of jquery internals...
tagName = tagName.replace('$', '\\$');
if ($(tagName).length > 0) {
$(tagName).val(tagValue);
}
});
// see http://stackoverflow.com/questions/399867/custom-events-in-jquery
$(selectorId).trigger('afterRefresh', aWorkitem);
}
/**
* This method ad action buttons for the current workitem into the selectorID.
* Each activity for the current processID will result in a button. The method
* did not add activity buttons with the activityEntity property
* keypublicresult!=0.
*
* The method also adds all necessary hidden fields for processing a workitem.
*
* @param workitem -
* the current workitem
*
*/
function updateActivities(workitem, selectorId) {
if (selectorId == null || selectorId == "")
selectorId = '#workitem_view';
var modelversion = getEntityItemValue(workitem, "$modelversion");
var processid = getEntityItemValue(workitem, "$processid");
var unqiueid = getEntityItemValue(workitem, "$uniqueid");
var isauthor = getEntityItemValue(workitem, "$isauthor");
// iterate over all activity entities
var dataString = null;
var currentActivityList = null;
if (hasLocalStorage()) {
dataString = localStorage.getItem("org.imixs.workflow.activities."
+ modelversion + "." + processid);
currentActivityList = JSON.parse(dataString);
}
// clear list
$(selectorId + " #workitem_activities").empty();
// iterarte over all activities if available...
// activities will be only shown is workitem isNew or user isAuthor
if (currentActivityList != null && (unqiueid == "" || isauthor == "true")) {
// test if currentActivityList.entity is an array....
if (!$.isArray(currentActivityList.entity))
currentActivityList.entity = jQuery
.makeArray(currentActivityList.entity);
// iterate over all activities to build buttons...
$
.each(currentActivityList.entity,
function(i, activity) {
// only add button if keypublicresult!=0
var testPublicResult = getEntityItemValue(activity,
"keypublicresult");
if ("0" != testPublicResult) {
var actionName = getEntityItemValue(activity,
"txtname");
var actionID = getEntityItemValue(activity,
"numactivityid");
var tooltipText = getEntityItemValue(activity,
"rtfdescription");
addActionButton(selectorId, actionName,
actionID, false, tooltipText);
}
});
}
// append the cancel button
$(selectorId + " #workitem_activities").append(
"<input id=\"workflow_activity_cancel\" type=\"button\" value=\""
+ cancelActionLabel + "\"></input>");
// bind clearWorkitem method
// we need to bind the click method using jquery because otherwise external
// code can not unbind this call
$(selectorId + " #workitem_activities #workflow_activity_cancel").click(
function(event) {
clearWorkitem(selectorId);
});
// add $unqiueid, $modelversion, $activitid and $processid input fields if
// yet not part of the form
// $ is not allowed in a id because of jquery internals...
if ($(selectorId + " [name=\\$activityid]").length <= 0)
$(selectorId + " #workitem_activities").append(
"<input type=\"hidden\" name=\"$activityid\"></input>");
if ($(selectorId + " [name=\\$processid]").length <= 0)
$(selectorId + " #workitem_activities").append(
"<input type=\"hidden\" name=\"$processid\" value=\""
+ processid + "\"></input>");
if ($(selectorId + " [name=\\$uniqueid]").length <= 0)
$(selectorId + " #workitem_activities").append(
"<input type=\"hidden\" name=\"$uniqueid\" value=\"" + unqiueid
+ "\"></input>");
if ($(selectorId + " [name=\\$modelversion]").length <= 0)
$(selectorId + " #workitem_activities").append(
"<input type=\"hidden\" name=\"$modelversion\" value=\""
+ modelversion + "\"></input>");
if ($(selectorId + " [name=type]").length <= 0)
$(selectorId + " #workitem_activities")
.append(
"<input type=\"hidden\" name=\"type\" value=\"workitem\"></input>");
// finally style all buttons...
var sActionSelector = selectorId + " #workitem_activities input:button, "
+ selectorId + " #workitem_activities input:submit";
if (defaultActionClass == null)
$(sActionSelector).button();
else
$(sActionSelector).addClass(defaultActionClass);
/* Imixs Tooltip support */
// test if juery ui is availalbe....
if ($.fn.tooltip) {
$("span.imixs-tooltip").prev().tooltip({
position : {
my : "left top+5",
at : "left+10 bottom",
collision : "flipfit"
},
show : {
duration : 800
},
content : function() {
var tooltip = $(this).next();
tooltip.hide();
return tooltip.text();
}
});
// hide all imixs tooltips
$("span.imixs-tooltip").hide();
} // end of tooltip support
// trigger afterRefresh event
$(selectorId + ' #workitem_activities').trigger('afterRefresh', workitem);
}
/**
* clears all input fiels inside the given formpart
*/
function clear_form_elements(formpart) {
$(formpart).find(':input').each(function() {
switch (this.type) {
case 'text':
case 'hidden':
case 'password':
case 'select-multiple':
case 'select-one':
case 'textarea':
$(this).val('');
break;
case 'checkbox':
case 'radio':
this.checked = false;
}
});
}
/**
* This method create a new empty workitem and clears also the workitem_view
*/
function clearWorkitem(selectorId) {
if (selectorId == null || selectorId == "")
selectorId = '#workitem_view';
newWorkitem = {
"item" : [ {
"name" : "$processid",
"value" : {
"@type" : "xs:int",
"$" : defaultProcessID
}
}, {
"name" : "$modelversion",
"value" : {
"@type" : "xs:string",
"$" : defaultModelVersion
}
}, {
"name" : "_subject",
"value" : {
"@type" : "xs:string",
"$" : ""
}
} ]
};
updateForm(newWorkitem, selectorId);
}
/**
* This method loads the specifiy processEntity. The method uses the
* localStorage to cache processEntities already loaded
*
* @param workitem -
* the current workitem
*/
function loadProcessEntity(workitem, selectorId) {
var processid = null;
var modelversion = null;
// read processID and model version.....
$.each(workitem.item, function(i, item) {
if (item.name == "$modelversion")
modelversion = item.value.$;
if (item.name == "$processid")
processid = item.value.$;
if (modelversion != null && processid != null)
return;
});
// we first test if we still have the Entity in the local storage
var currentProcessEntity = null;
if (hasLocalStorage())
currentProcessEntity = localStorage
.getItem("org.imixs.workflow.process." + modelversion + "."
+ processid);
if (currentProcessEntity == null) {
// now we need to load the model information from the rest service...
$
.getJSON(imixsServiceLocationURI + "model/" + modelversion
+ "/process/" + processid + ".json",
function(data) {
// cache the result
if (hasLocalStorage())
localStorage.setItem(
"org.imixs.workflow.process."
+ modelversion + "."
+ processid, JSON
.stringify(data));
refreshWorkitemProcessView(currentProcessEntity,
selectorId);
});
} else
refreshWorkitemProcessView(currentProcessEntity, selectorId);
}
/**
* This method loads the specifiy activitylist. The method uses the localStorage
* to cache Entities already loaded
*
* @param workitem -
* the current workitem
*
* @param selectorId -
* optional param to force a refresh of a specific section
*/
function loadActivityList(workitem, selectorId) {
var modelversion = getEntityItemValue(workitem, "$modelversion");
var processid = getEntityItemValue(workitem, "$processid");
// we first test if we still have the Entity in the local storage
var currentProcessEntity = null;
if (hasLocalStorage())
currentProcessEntity = localStorage
.getItem("org.imixs.workflow.activities." + modelversion + "."
+ processid);
if (currentProcessEntity == null) {
// now we need to load the model information from the rest service...
$.getJSON(
imixsServiceLocationURI + "model/" + modelversion
+ "/activities/" + processid + ".json",
function(data) {
// cache the result
if (hasLocalStorage())
localStorage.setItem("org.imixs.workflow.activities."
+ modelversion + "." + processid, JSON
.stringify(data));
updateActivities(workitem, selectorId);
}).error(function() {
// if an error occur we also need to update the activityview....
updateActivities(workitem, selectorId);
});
} else
updateActivities(workitem, selectorId);
}
/**
* this method writes the html code for the current ProcessEntity into the
* element workitem_view
*
* @param aProcessEntity
* the aProcessEntity to be loaded
*/
function refreshWorkitemProcessView(aprocessEntity, selectorId) {
// ;
}
/**
* This method is called by the loadWorkitem() method to disable any action
* buttons from the current form until the workitem_view is refreshed
* completley. This is only a helper method to avoid inconsistent submits if the
* refresh process of the workitem_view will break for any reason.
*/
function disableActivities(selectorId) {
$(':input:button, :input:submit', selectorId + ' #workitem_activities')
.each(function() {
// disable the button...
$(this).attr('disabled', 'disabled');
});
}
/**
* Add a workflow action buttion int a defined section
*
* @param selectorId -
* the name of the section the buttion should be placed in
* @param actionName -
* the name of the button
* @param activityID -
* the activity entity ID to be processed
* @param tooltipText -
* optional tooltip for the button
* @param bInsert -
* optional, if true the button will be inserted at the first child
* element of the selectior
*/
function addActionButton(selectorId, actionName, activityID, bInsert,
tooltipText) {
if (selectorId == null || selectorId == "")
selectorId = '#workitem_view';
// test if selector was found
if ($(selectorId + " #workitem_activities").length) {
// build conclick event....
var activityScript = "onclick=\"processWorkitem('" + activityID + "');";
// build tooltip span tag
var tooltip = "";
if (tooltipText != "")
tooltip = "<span class=\"imixs-tooltip\">" + tooltipText
+ "</span>";
// insert at the bginning of the tag?
if (bInsert)
$(selectorId + " #workitem_activities").prepend(
"<input type=\"submit\" id=\"workflow_activity_"
+ activityID + "\" value=\"" + actionName + "\" "
+ activityScript + "\"title=\"\"></input>");
else
$(selectorId + " #workitem_activities").append(
"<input type=\"submit\" id=\"workflow_activity_"
+ activityID + "\" value=\"" + actionName + "\" "
+ activityScript + "\"title=\"\"></input>"
+ tooltip);
}
}
/**
* This method updates the $activityid input field .
*
* @param activityid
*/
function processWorkitem(activityid) {
$('#workitem_view').trigger('beforeProcess');
var tagName = "#workitem_activities [name=\\$activityid]";
if ($(tagName).length > 0) {
$(tagName).val(activityid);
}
}
/**
* This method returns the value of a specified item inside an entity. Maybe we
* can optimize the method???
*
* @param entity
*/
function getEntityItemValue(entity, itemname) {
var value = "";
$.each(entity.item, function(i, item) {
if (item.name == itemname) {
if (item.value != null) {
if ($.isArray(item.value))
value = item.value[0].$;
else
value = item.value.$;
return;
}
}
});
return value;
}
/**
* This method returns the value of a specified item inside an entity. Maybe we
* can optimize the method???
*
* @param entity
*/
function getEntityItemValueArray(entity, itemname) {
var value = "";
$.each(entity.item, function(i, item) {
if (item.name == itemname) {
if (item.value != null) {
if ($.isArray(item.value))
value = item.value;
else
value = jQuery.makeArray(item.value);
return;
}
}
});
return value;
}

View file

@ -0,0 +1,320 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:marty="http://java.sun.com/jsf/composite/marty"
template="/layout/template.xhtml">
<ui:define name="content">
<f:view>
<script type="text/javascript">
/*<![CDATA[*/
function updateStatustPanel(data) {
//initUserInput($('#userselector_id'));
if (data.status === 'success') {
// select with wildcard operator
$('[id$=status_panel]').imixsLayout();
}
}
/*]]>*/
</script>
<h:form id="import_form_id" enctype="multipart/form-data">
<div class="imixs-form">
<div class="imixs-header">
<h1>DATEV</h1>
</div>
<div class="imixs-body">
<div class="imixs-tabs">
<ul>
<li><a href="#tab-1">Einstellungen</a></li>
<li><a href="#tab-2">Import</a></li>
<li><a href="#tab-3">Export</a></li>
</ul>
<div id="tab-1">
<!-- **** Einstellungen ***** -->
<div class="imixs-form-section">
<div class="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;">
<h3>DATEV Einstellungen</h3>
<p>Definieren Sie hier die DATEV Parameter die Ihnen von Ihrem Steuerberater mitgeteilt wurden.</p>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>DATEV Mandant Name</dt>
<dd>
<h:inputText required="false"
value="#{datevController.configuration.item['datev.client.name']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>DATEV Mandantennummer </dt>
<dd>
<h:inputText required="false"
value="#{datevController.configuration.item['datev.client.id']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
DATEV Beraternummer <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText required="true"
value="#{datevController.configuration.item['datev.consultant.id']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>BU Schlüssel:</dt>
<dd>
<h:inputTextarea required="false"
converter="org.imixs.VectorConverter"
style="height: 8em; width: 100%;"
value="#{datevController.configuration.itemList['datev.buschluessel']}">
</h:inputTextarea>
<span style="font-size:0.7rem;">Format: BEZEICHNUNG | DATEV_BU_SCHLUESSEL | PROZENTSATZ</span>
</dd>
</dl>
<dl>
<dt>
DATEV WJ-Beginn (MMTT) <span class="imixs-required">* <h:message
for="fiscalstart" /></span>
</dt>
<dd>
<h:inputText value="#{datevController.configuration.item['datev.fiscal_start']}"
id="fiscalstart" required="false"/>
</dd>
</dl>
<dl>
<dt>DATEV Sachkontennummernlänge</dt>
<dd>
<h:inputText
value="#{datevController.configuration.item['datev.sachkontennummernlaenge']}" />
</dd>
</dl>
<dl>
<dt>Kostenstelle I. (Nummer|Bezeichnung)</dt>
<dd>
<h:inputTextarea required="false"
converter="org.imixs.VectorConverter"
style="height: 8em; width: 100%;"
value="#{datevController.configuration.itemList['datev.kostenstelle1']}">
</h:inputTextarea>
</dd>
</dl>
<dl>
<dt>Kostenstellen II. (Nummer|Bezeichnung)</dt>
<dd>
<h:inputTextarea required="false"
converter="org.imixs.VectorConverter"
style="height: 8em; width: 100%;"
value="#{datevController.configuration.itemList['datev.kostenstelle2']}">
</h:inputTextarea>
</dd>
</dl>
</div>
</div>
</div>
<div id="tab-2">
<!-- **** DATEV import ***** -->
<div class="imixs-form-section">
<div class="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;">
<h3>Import DATEV Stammdaten</h3>
<ul>
<li>Fügen Sie hier die zu importierende DATEV Datei an.</li>
<li>Die Datei muss im CSV Format vorliegen.</li>
<li>Die Datei muss zwei Header Zeilen enthalten:
<ol>
<li>Zeile: Datenart - z.B. "Kontobeschriftungen"</li>
<li>Zeile: Feldbezeichnungen - z.B. "Konto,
Kontobezeichnung"</li>
</ol>
</li>
<li>Fügen Sie immer nur eine Datei für den Import an!</li>
<li>Der Import kann einige Minuten in Anspruch nehmen.</li>
<li>Brechen Sie den Vorgang nicht ab und warten Sie bis
der Import vollständig abgeschlossen ist.</li>
</ul>
</div>
<dl>
<dt>Importdatei wählen:</dt>
<dd>
<i:imixsFileUpload id="file_upload_id"
workitem="#{datevController.importData}"
context_url="#{facesContext.externalContext.requestContextPath}/rest-service/workflow/workitem/#{workflowController.workitem.item['$uniqueid']}"
hideatachments="true" />
<h:panelGroup layout="block"
styleClass="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;"
rendered="#{! empty datevController.importData.item['log']}">
<pre>#{datevController.importData.item['log']}</pre>
</h:panelGroup>
</dd>
</dl>
<dl>
<dt>Encoding </dt>
<dd>
<h:inputText required="false" style="width: 220px;"
value="#{datevController.configuration.item['datev.encoding']}">
</h:inputText>
</dd>
</dl>
<h:commandButton
actionListener="#{datevController.startImport}"
value="Start Import">
</h:commandButton>
</div>
</div>
<div id="tab-3">
<!-- **** Export Buchunsstapel ***** -->
<div class="imixs-form-section">
<div class="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;">
<h3>Export DATEV Buchungsstapel</h3>
<p>Definieren Sie hier den Export Workflow sowie die Reportdefinition.</p>
</div>
<h:panelGroup layout="block" id="report_selection"
styleClass="imixs-form-section-2">
<dl>
<dt>
DATEV Schnittstellen-Typ <span class="imixs-required">*</span>
</dt>
<dd>
<h:selectOneRadio
value="#{datevController.configuration.item['export.type']}"
required="true">
<f:selectItem itemValue="xml"
itemLabel="DATEV Belegsatzschnittstelle im XML-Format"></f:selectItem>
<f:selectItem itemValue="csv"
itemLabel="DATEV-Format (csv)"></f:selectItem>
<f:ajax render="report_selection"/>
</h:selectOneRadio>
</dd>
</dl>
<dl>
<dt>
DATEV Report Definitionen <span class="imixs-required">*</span>
</dt>
<dd>
Belegexport:
<h:inputText required="true"
value="#{datevController.configuration.item['report.invoices']}">
</h:inputText>
<h:panelGroup
rendered="#{'xml' eq datevController.configuration.item['export.type']}">
<br />
Dokumente: <h:inputText required="false"
value="#{datevController.configuration.item['report.documents']}">
</h:inputText>
</h:panelGroup>
</dd>
</dl>
</h:panelGroup>
<div class="imixs-form-section-2">
<dl>
<dt>
DATEV Model Version <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText required="true"
value="#{datevController.configuration.item['model.version']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
DATEV Initial Task <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText required="true"
value="#{datevController.configuration.item['initial.task']}">
</h:inputText>
</dd>
</dl>
</div>
<div class="imixs-form-section">
<p>
<span class="typcn typcn-lightbulb"></span> Der Initaltask
muss einen Report definieren, der die Abfrage und das Stylesheet enthält.
Die Rechnungen werden automatisch nach dem
Attribut "datev.client.id" sowie der Buchungsperiode gruppiert.
</p>
</div>
</div>
</div>
</div>
</div>
<div class="imixs-footer">
<h:outputLabel value="#{message.modified}: " />
<h:outputText
value="#{datevController.configuration.item['$modified']}">
<f:convertDateTime timeZone="#{message.timeZone}" type="both"
pattern="#{message.dateTimePattern}" />
</h:outputText>
<br />
<h:commandButton
actionListener="#{datevController.saveConfiguration()}"
value="#{message.save}">
</h:commandButton>
<h:commandButton value="#{message.close}" action="notes" />
</div>
</div>
</h:form>
</f:view>
</ui:define>
</ui:composition>

View file

@ -0,0 +1,337 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
xmlns:marty="http://java.sun.com/jsf/composite/marty"
template="/layout/template.xhtml">
<ui:define name="content">
<f:view>
<script type="text/javascript">
/*<![CDATA[*/
$(document).ready(function() {
//$('.imixsdatatable').layoutImixsTable();
});
// This method refreshs the layout
function updateOptions(data) {
if (data.status === 'success') {
$('[id$=Optionlist]').imixsLayout();
/* var id='#'+data.source.id;
if (id.indexOf("input")>-1) {
$(id).focus();
} */
}
}
/*]]>*/
</script>
<h:form id="import_form_id">
<div class="imixs-form">
<div class="imixs-header">
<h1>Dokument Import</h1>
</div>
<div class="imixs-body">
<div class="imixs-tabs">
<ul>
<li><a href="#tab-1">Timer Setting</a></li>
<li><a href="#tab-2">Data Sources</a></li>
</ul>
<!-- ### Timer ### -->
<div id="tab-1">
<div class="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;">
<p><span class="typcn typcn-lightbulb"></span> Define a crontab to schedule the import processor.</p>
</div>
<ui:include src="sub_scheduler_control.xhtml">
<ui:param name="schedulerController"
value="#{documentImportController}" />
</ui:include>
</div>
<!-- ### SMTP ### -->
<div id="tab-2">
<div class="ui-state-highlight ui-corner-all"
style="margin-bottom: 10px; padding: .5em;">
<p><span class="typcn typcn-lightbulb"></span> Define a destination IMAP server and assign mail addresses to specific workflow groups.</p>
</div>
<div class="imixs-form-panel">
<!-- ### Sources ### -->
<h:panelGroup layout="block"
id="imapOptionlist" binding="#{imapOptionlistContainer}">
<f:ajax onevent="updateOptions">
<table class="imixsdatatable"
style="width: 100%;">
<thead>
<tr>
<th style="width: 10px;text-align: center;">Pos</th>
<th style="width: 100px;text-align: center;">Type</th>
<th style="">Workflowgroup</th>
<th style="">Modelversion</th>
<th style="">Task</th>
<th style="">Event</th>
<th style="width: 110px;">
<!-- delete -->
</th>
</tr>
</thead>
<tbody>
<ui:repeat var="source" value="#{documentImportController.sources}">
<tr>
<!-- pos -->
<td style=" text-align: center;">
<h:commandLink
actionListener="#{documentImportController.selectSource(source.item['index'])}">#<h:outputText
value="#{source.item['index']}" />
<f:ajax render="#{imapOptionlistContainer.clientId}"
onevent="updateOptions" />
</h:commandLink>
</td>
<!-- type -->
<td style="text-align: center;">
<h:outputText value="#{source.item['type']}" />
</td>
<!-- Workflowgroup -->
<td><h:outputText
value="#{source.item['workflowgroup']}" />
</td>
<td><h:outputText
value="#{source.item['modelversion']}" />
</td>
<td><h:outputText
value="#{source.item['task']}" />
</td>
<td><h:outputText
value="#{source.item['event']}" />
</td>
<td>
<h:commandLink
actionListener="#{documentImportController.moveSourceDown(source.item['index'])}">
<span class="typcn typcn-arrow-down-thick imixs-state-info"></span>
<f:ajax render="#{imapOptionlistContainer.clientId}"
onevent="updateOptions" />
</h:commandLink>
<h:commandLink
actionListener="#{documentImportController.moveSourceUp(source.item['index'])}">
<span class="typcn typcn-arrow-up-thick imixs-state-info"></span>
<f:ajax render="#{imapOptionlistContainer.clientId}"
onevent="updateOptions" />
</h:commandLink>
<h:commandLink
actionListener="#{documentImportController.removeSource(source.item['index'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{imapOptionlistContainer.clientId}"
onevent="updateOptions" />
</h:commandLink></td>
</tr>
</ui:repeat>
</tbody>
</table>
<!-- add button -->
<h:commandButton
value="#{message.add}"
actionListener="#{documentImportController.addSource()}">
<f:ajax render="#{imapOptionlistContainer.clientId}"
onevent="updateOptions" />
</h:commandButton>
<!-- ### Subform for selected source ### -->
<h:panelGroup layout="block" rendered="#{! empty documentImportController.source}" styleClass="imixs-form-panel">
<h3>Order ID #<h:outputText value="#{documentImportController.source.item['index']}"/></h3>
<div class="imixs-form-section-3">
<dl>
<dt>Type</dt>
<dd>
<h:selectOneRadio value="#{documentImportController.source.item['type']}">
<f:selectItem itemLabel="IMAP" itemValue="IMAP"/>
<f:selectItem itemLabel="FTP" itemValue="FTP"/>
</h:selectOneRadio>
</dd>
</dl>
<dl>
<dt>Workflowgroup</dt>
<dd>
<h:selectOneMenu
value="#{documentImportController.source.item['workflowgroup']}">
<c:forEach items="#{modelController.workflowGroups}" var="group">
<f:selectItem itemLabel="#{group}" itemValue="#{group}" />
</c:forEach>
</h:selectOneMenu>
</dd>
</dl>
</div>
<div class="imixs-form-section-3">
<dl>
<dt>Workflowmodel</dt>
<dd>
<h:inputText
value="#{documentImportController.source.item['workflowmodel']}"/>
</dd>
</dl>
<dl>
<dt>Task ID</dt>
<dd>
<h:inputText
value="#{documentImportController.source.item['task']}"/>
</dd>
</dl>
<dl>
<dt>Event ID</dt>
<dd>
<h:inputText
value="#{documentImportController.source.item['event']}"/>
</dd>
</dl>
</div>
<hr />
<!-- IMAP -->
<div class="imixs-form-section-3">
<dl>
<dt>Server : Port</dt>
<dd>
<h:inputText style="width:80%;"
value="#{documentImportController.source.item['server']}">
</h:inputText> : <h:inputText style="width:15%;"
value="#{documentImportController.source.item['port']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>User</dt>
<dd>
<h:inputText required="false"
value="#{documentImportController.source.item['user']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>Password</dt>
<dd>
<h:inputSecret required="false" redisplay="true"
value="#{documentImportController.source.item['password']}">
</h:inputSecret>
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>Selector</dt>
<dd>
<h:inputText required="false"
value="#{documentImportController.source.item['selector']}">
</h:inputText>
<p class="small">A selector can be an optional regular expression to be used to select a subset of data</p>
</dd>
</dl>
<dl>
<dt>Options</dt>
<dd>
<h:inputTextarea required="false"
style="height: 5em; width: 100%;"
value="#{documentImportController.source.item['options']}">
</h:inputTextarea>
<p class="small">You can apply custom properties here.
</p>
</dd>
</dl>
</div>
</h:panelGroup> <!-- end of source subform -->
</f:ajax>
</h:panelGroup>
</div>
</div>
</div>
</div>
<div class="imixs-footer">
<h:outputLabel value="#{message.modified}: " />
<h:outputText
value="#{documentImportController.configuration.item['$modified']}">
<f:convertDateTime timeZone="#{message.timeZone}" type="both"
pattern="#{message.dateTimePattern}" />
</h:outputText>
<br />
<h:commandButton
actionListener="#{documentImportController.saveConfiguration()}"
action="/pages/admin/document_import"
value="#{message.save}">
</h:commandButton>
<h:commandButton value="#{message.close}" action="notes" />
</div>
</div>
</h:form>
</f:view>
</ui:define>
</ui:composition>

View file

@ -0,0 +1,268 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:marty="http://java.sun.com/jsf/composite/marty"
xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
template="/layout/template.xhtml">
<ui:define name="content">
<f:view>
<script type="text/javascript">
/*<![CDATA[*/
function updateStatustPanel(data) {
//initUserInput($('#userselector_id'));
if (data.status === 'success') {
// select with wildcard operator
$('[id$=status_panel]').imixsLayout();
}
}
// display summary
$(document).ready(function() {
// erste Zeile hinzufügen, falls tabelle noch leer ist
var posTableEmpty=#{empty sepaController.dbtrList};
if (posTableEmpty) {
// click on add button
posButton=$("[data-id='addposbutton_id']");
if (posButton) {
$(posButton).click();
}
}
});
// This method refreshs the layout
function updateSepaList(data) {
if (data.status === 'success') {
$('[id$=dbtrlist]').imixsLayout();
$('[id$=cdtrlist]').imixsLayout();
}
}
/*]]>*/
</script>
<h:form id="import_form_id">
<div class="imixs-form">
<div class="imixs-header">
<h1>SEPA</h1>
</div>
<div class="imixs-body">
<!-- **** General info ***** -->
<div class="imixs-form-panel">
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="dbtrlist" binding="#{dbtrlistContainer}">
<h1>Debitor IBAN/BIC</h1>
<p>
<span class="typcn typcn-lightbulb"></span> The Debitor IBAN/BIC configuration list
can be used for SEPA payments.
</p>
<f:ajax render="dbtrlist" onevent="updateSepaList">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 140px">ID</th>
<th style="">Bank<span class="imixs-required">
*</span></th>
<th style="width: 250px;">IBAN</th>
<th style="width: 150px;">BIC</th>
<th style="width: 150px;">Report (optional)</th>
<th style="width: 50px">
<!-- delete -->
</th>
</tr>
<ui:repeat var="dbtr"
value="#{sepaController.dbtrList}">
<tr>
<!-- ID -->
<td><h:inputText value="#{dbtr.item['name']}"
style="width:100%;" /></td>
<!-- dbtr.name -->
<td><h:inputText value="#{dbtr.item['dbtr.name']}"
style="width:100%;" /></td>
<!-- dbtr.iban -->
<td><h:inputText value="#{dbtr.item['dbtr.iban']}"
style="width:100%;" /></td>
<!-- dbtr.bic -->
<td><h:inputText value="#{dbtr.item['dbtr.bic']}"
style="width:100%;" /></td>
<!-- dbtr.bic -->
<td><h:inputText value="#{dbtr.item['report']}"
style="width:100%;" /></td>
<td><h:commandLink
actionListener="#{sepaController.removeDbtr(dbtr.item['name'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{dbtrlistContainer.clientId}"
onevent="updateSepaList" />
</h:commandLink></td>
</tr>
</ui:repeat>
</table>
<!-- add button -->
<h:commandButton value="#{message.add}"
a:data-id="addposbutton_id"
actionListener="#{sepaController.addDbtr}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="cdtrlist" binding="#{cdtrlistContainer}">
<h1>Creditor IBAN/BIC</h1>
<p>
<span class="typcn typcn-lightbulb"></span> The Creditor IBAN/BIC configuration list
can be used for SEPA Direct Debit.
</p>
<f:ajax render="cdtrlist" onevent="updateSepaList">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 140px">ID</th>
<th style="">Bank<span class="imixs-required">
*</span></th>
<th style="width: 250px;">IBAN</th>
<th style="width: 150px;">BIC</th>
<th style="width: 150px;">Report (optional)</th>
<th style="width: 50px">
<!-- delete -->
</th>
</tr>
<ui:repeat var="cdtr"
value="#{sepaController.cdtrList}">
<tr>
<!-- ID -->
<td><h:inputText value="#{cdtr.item['name']}"
style="width:100%;" /></td>
<!-- cdtr.name -->
<td><h:inputText value="#{cdtr.item['cdtr.name']}"
style="width:100%;" /></td>
<!-- cdtr.iban -->
<td><h:inputText value="#{cdtr.item['cdtr.iban']}"
style="width:100%;" /></td>
<!-- cdtr.bic -->
<td><h:inputText value="#{cdtr.item['cdtr.bic']}"
style="width:100%;" /></td>
<!-- cdtr.report -->
<td><h:inputText value="#{cdtr.item['report']}"
style="width:100%;" /></td>
<td><h:commandLink
actionListener="#{sepaController.removeCdtr(cdtr.item['name'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{cdtrlistContainer.clientId}"
onevent="updateSepaList" />
</h:commandLink></td>
</tr>
</ui:repeat>
</table>
<!-- add button -->
<h:commandButton value="#{message.add}"
a:data-id="addposbutton_id"
actionListener="#{sepaController.addCdtr}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
<hr />
<h1>Model Configuration</h1>
<div class="imixs-form-section">
<p>
<span class="typcn typcn-lightbulb"></span> The initial task
must define a report containing the query and style sheet
information. Invoices will be automatically grouped by the
attribute "_sepa_iban". If this attribute is not set, the
default sepa_iban will be assigned to the invoice before
processed. The SEPA workflow may optional include a
"invoice_update" item definition.
</p>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>SEPA Model Version</dt>
<dd>
<h:inputText required="false"
value="#{sepaController.configuration.item['_model_version']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>SEPA Initial Task</dt>
<dd>
<h:inputText required="false"
value="#{sepaController.configuration.item['_initial_task']}">
</h:inputText>
</dd>
</dl>
</div>
</div>
</div>
<div class="imixs-footer">
<h:outputLabel value="#{message.modified}: " />
<h:outputText
value="#{sepaController.configuration.item['$modified']}">
<f:convertDateTime timeZone="#{message.timeZone}" type="both"
pattern="#{message.dateTimePattern}" />
</h:outputText>
<br />
<h:commandButton
actionListener="#{sepaController.saveConfiguration()}"
value="#{message.save}">
</h:commandButton>
<h:commandButton value="#{message.close}" action="notes" />
</div>
</div>
</h:form>
</f:view>
</ui:define>
</ui:composition>

View file

@ -0,0 +1,130 @@
<f:subview xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions">
<script type="text/javascript">
/*<![CDATA[*/
function updateStatustPanel(data) {
//initUserInput($('#userselector_id'));
if (data.status === 'success') {
$('[id$=status_panel]').imixsLayout();
}
}
/*]]>*/
</script>
<!-- **** General info ***** -->
<div class="imixs-form-panel">
<h:inputTextarea required="false"
converter="org.imixs.VectorConverter"
style="height: 8em; width: 100%;"
value="#{schedulerController.configuration.itemList['_scheduler_definition']}">
</h:inputTextarea>
</div>
<!-- **** Timer Status ***** -->
<h:panelGroup layout="block" class="imixs-form-panel" id="status_panel">
<h:panelGroup layout="block" id="timer_details"
class="imixs-form-section">
<h2>
<h:outputText id="timer_status"
value="Status ⇢ #{schedulerController.configuration.item['_scheduler_status']}" />
<h:panelGroup
rendered="#{! empty schedulerController.configuration.item['_scheduler_errormessage']}"
class="small" style="color:red">
<br />Error: #{schedulerController.configuration.item['_scheduler_errormessage']}
</h:panelGroup>
</h2>
<h:panelGrid columns="2">
<h:panelGroup layout="block" style="width:100px;">
<h:outputLabel value="ID: " />
</h:panelGroup>
<h:panelGroup>
<h:outputText
value="#{schedulerController.configuration.item['$UniqueID']}" />
</h:panelGroup>
<h:outputLabel value="Schedule: " />
<h:outputText
value="#{schedulerController.configuration.item['Schedule']}" />
<h:outputLabel value="Next Timeout: " />
<h:panelGroup>
<h:outputText
value="#{schedulerController.configuration.item['nextTimeout']}"
rendered="#{! empty schedulerController.configuration.item['nextTimeout']}">
<f:convertDateTime timeZone="#{message.timeZone}" type="both"
pattern="#{message.dateTimePattern}" />
</h:outputText>
<h:outputText value=" " />
</h:panelGroup>
<h:outputLabel value="TimeRemaining: " />
<h:outputText
value="#{schedulerController.millisToShortDHMS(schedulerController.configuration.item['timeRemaining'])}" />
</h:panelGrid>
<h:outputLabel value="Last Run: " />
<h:panelGroup layout="block" class="ui-state-highlight ui-corner-all"
style="padding: .5em;">
<ui:fragment
rendered="#{! empty schedulerController.configuration.item['_scheduler_logmessage']}">
<ui:repeat var="logentry"
value="#{schedulerController.configuration.itemList['_scheduler_logmessage']}">
<h:outputText escape="false" value="#{logentry}" />
<br />
</ui:repeat>
</ui:fragment>
<ui:fragment
rendered="#{empty schedulerController.configuration.item['_scheduler_logmessage']}">
No Data.
</ui:fragment>
</h:panelGroup>
</h:panelGroup>
<!-- Timer Actions -->
<h:commandButton value="#{message.refresh}"
actionListener="#{schedulerController.refresh}">
<f:ajax render="status_panel" onevent="updateStatustPanel" />
</h:commandButton>
<h:commandButton
actionListener="#{schedulerController.startScheduler}" value="start">
</h:commandButton>
<h:commandButton actionListener="#{schedulerController.stopScheduler}"
value="stop">
</h:commandButton>
<h:commandButton
actionListener="#{schedulerController.restartScheduler}"
value="restart">
</h:commandButton>
</h:panelGroup>
</f:subview>

View file

@ -0,0 +1,138 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty">
<div class="imixs-form-section">
<dl>
<dt>
#{message['form.company']}<span class="imixs-required"> * <h:message for="_subject" /></span>
</dt>
<dd>
<h:inputText required="true" value="#{workitem.item['_Subject']}"
id="subject">
</h:inputText>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.firstname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_FirstName']}"
id="firstname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.lastname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_LastName']}" id="lastname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone1']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone1']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone2']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone2']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone3']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone3']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.department']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_department']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.email']}" />
<!-- mailto -->
<h:panelGroup style="margin-left:5px;"
rendered="#{! empty workitem.item['_Email']}">
<h:outputLink value="mailto:#{workitem.item['_Email']}">
<h:graphicImage url="/layout/icons/icon042.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Email']}" id="email_id">
</h:inputText>
</dd>
</dl>
<dl>
<!-- ### Internet ### -->
<dt>
<h:outputLabel value="#{message['form.internet']}" />
<!-- hyperlink -->
<h:panelGroup style="margin-left:5px;"
rendered="#{! empty workitem.item['_Internet']}">
<h:outputLink target="_blank" value="#{workitem.item['_Internet']}">
<h:graphicImage url="/layout/icons/icon001.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Internet']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
<h:outputLabel value="#{message['form.other']}" />
</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_description']}" style="" />
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,77 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty">
<!-- Contract Form -->
<div class="imixs-form-section">
<dl>
<dt>
#{message['form.subject']}<span class="imixs-required"> * <h:message for="_subject" /></span>
</dt>
<dd>
<h:inputText required="true" id="_subject" value="#{workitem.item['_subject']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt style="clear: left;">
<h:outputLabel value="#{message['form.contractnumber']}" />
</dt>
<dd>
<h:inputText
value="#{workitem.item['_contractnumber']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.contact']}" />
</dt>
<dd>
<marty:workitemLink workitem="#{workflowController.workitem}"
hidereferences="false" filter="$processid:9..." />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.ordernumber']}" />
</dt>
<dd>
<h:inputText
value="#{workitem.item['_ordernumber']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.orderdate']}" />
</dt>
<dd>
<h:inputText class="imixs-date"
value="#{workitem.item['_orderdate']}" >
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}"/>
</h:inputText>
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
<h:outputLabel value="#{message['form.description']}" />
</dt>
<dd>
<h:inputTextarea
value="#{workitem.item['_description']}" />
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,83 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty">
<!-- Invoice Out Form -->
<div class="imixs-form-section">
<dl>
<dt>
#{message['form.subject']}<span class="imixs-required"> * <h:message for="_subject" /></span>
</dt>
<dd>
<h:inputText id="_subject" required="true" value="#{workitem.item['_subject']}" />
</dd>
</dl>
<!--
<dl>
<dt>
<h:outputLabel value="#{message['form.customer']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_customer']}" />
</dd>
</dl>
-->
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.incoming_order']}" />
</dt>
<dd>
<ui:include src="/pages/workitems/parts/workitemlink.xhtml">
<ui:param name="options" value="$processid:7..." />
</ui:include>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<h:panelGroup layout="block"
class="marty-workitemlink">
<h:panelGrid columns="2">
<h:outputLabel value="#{message['form.invoicedate']}" />
<h:inputText value="#{workitem.item['_invoicedate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
<h:outputLabel value="#{message['form.amount']}" />
<h:inputText value="#{workitem.item['_amount']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText>
<h:outputLabel value="#{message['form.tax']}" />
<h:inputText value="#{workitem.item['_tax']}" >
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText>
<h:outputLabel value="#{message['form.amount_brutto']}" />
<h:inputText value="#{workitem.item['_amount_brutto']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText>
</h:panelGrid>
</h:panelGroup>
</div>
</ui:composition>

View file

@ -0,0 +1,35 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<!-- the following code computes the txtworktow abstract from the current modelversion and processid -->
<div class="imixs-instruction">
<h:outputText escape="false"
value="#{modelController.getProcessDescription(workflowController.workitem.item['$processID'],workflowController.workitem.item['$ModelVersion'],workflowController.workitem)}">
</h:outputText>
</div>
<c:forEach items="#{formController.formDefinition.sections}"
var="section">
<div class="imixs-form-panel">
<h3>
<h:outputText value="#{section.name}" />
</h3>
<f:subview>
<ui:include src="/pages/workitems/forms/#{section.path}.xhtml">
<ui:param name="workitem" value="#{workflowController.workitem}" />
</ui:include>
</f:subview>
</div>
</c:forEach>
<!-- Comments and Documents -->
<ui:include src="/pages/workitems/forms/sub_comment_and_documents.xhtml">
<ui:param name="workitem" value="#{workflowController.workitem}" />
</ui:include>
</ui:composition>

View file

@ -0,0 +1,38 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<div class="imixs-tabs">
<ul>
<c:forEach items="#{formController.formDefinition.sections}"
var="section">
<li><a href="#tab-#{section.path}">#{(empty section.name)?app.basic:section.name}</a></li>
</c:forEach>
</ul>
<c:forEach items="#{formController.formDefinition.sections}"
var="section">
<div id="tab-#{section.path}">
<f:subview>
<ui:include src="/pages/workitems/forms/#{section.path}.xhtml">
<ui:param name="workitem" value="#{workflowController.workitem}" />
</ui:include>
</f:subview>
</div>
</c:forEach>
</div>
<!-- Comments and Documents -->
<ui:include src="/pages/workitems/forms/sub_comment_and_documents.xhtml">
<ui:param name="workitem" value="#{workflowController.workitem}" />
</ui:include>
</ui:composition>

View file

@ -0,0 +1,274 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:office="http://xmlns.jcp.org/jsf/composite/office"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<div class="imixs-form-section">
<!-- Contract Form -->
<dl>
<dt>
#{message['form.subject']} <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText value="#{workitem.item['_subject']}" required="true" />
</dd>
</dl>
<dl>
<dt>#{message['form.description']}</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_description']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.contact']}" />
</dt>
<dd>
<ui:include src="/pages/workitems/parts/workitemlink.xhtml">
<ui:param name="options" value="($workflowgroup:Kontakt) AND (type:workitem)" />
</ui:include>
</dd>
</dl>
<dl>
<dt>Rechnung E-Mail:</dt>
<dd>
<h:inputText value="#{workitem.item['invoice.email']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.reminder']}" />
</dt>
<dd>
<h:inputText styleClass="imixs-date" value="#{workitem.item['datDate']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
<h:selectOneMenu style="width:120px;margin-left:10px;" value="#{workitem.item['keyIntervalDatDate']}">
<f:selectItem itemValue="" itemLabel="#{message['form.none']}" />
<f:selectItem itemValue="daily" itemLabel="Täglich" />
<f:selectItem itemValue="weekly" itemLabel="#{message['form.weekly']}" />
<f:selectItem itemValue="monthly" itemLabel="#{message['form.monthly']}" />
<f:selectItem itemValue="yearly" itemLabel="#{message['form.yearly']}" />
</h:selectOneMenu>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<h2>Accounting</h2>
<dl>
<dt>
<h:outputLabel value="#{message['form.ordernumber']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_ordernumber']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.orderdate']}" />
</dt>
<dd>
<h:inputText styleClass="imixs-date" value="#{workitem.item['_orderdate']}" />
</dd>
</dl>
</div>
<!-- Agreement Form -->
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.startdate']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_startdate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.enddate']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_enddate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Volumen (in Stunden)" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_effort']}" />
<h:outputText value="#{workitem.item['_contracttype']}" />
<h:outputText value="#{workitem.item['_capacity']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Stundensatz" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_rate']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section"></div>
<ui:param name="requilist" value="#{viewHandler.getData(requirementsViewController)}"></ui:param>
<div class="imixs-form-section">
<h2>Requirements &amp; Reporting</h2>
<table class="imixsdatatable imixs-orderitems" style="margin-bottom: 20px;">
<tr>
<th style="width: 100px;">Erstellt</th>
<th style="">Requirement</th>
<th style="">Status</th>
<th style="width: 60px;">Ist</th>
<th style="width: 60px;">Plan</th>
<th style="width: 80px;">%</th>
</tr>
<ui:repeat var="orderitem" value="#{requilist}">
<tr>
<!-- Erstellt -->
<td
style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through;text-align: center;':'text-align: center;'}">
<h:outputText value="#{orderitem.item['$created']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:outputText>
</td>
<!-- -->
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:link outcome="/pages/workitems/workitem?faces-redirect=true">
<h:outputText value="#{orderitem.item['txtworkflowsummary']}" />
<f:param name="id" value="#{orderitem.item['$uniqueid']}" />
</h:link>
</td>
<!-- Name -->
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['$workflowstatus']}" />
</td>
<!-- capa -->
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_capacity']}" style="width:100%">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_planed']}" id="orderitem_amount">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_div']} %">
</h:outputText>
</td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td />
<td class="orderlist-sum" style="text-align: right; font-weight: bold;">Summe</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_capacity']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_planed']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_div']}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" locale="de" />
</h:outputText> %
</td>
</tr>
</table>
<div class="row">
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-planning.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Planning
</a>
</div>
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-implementation.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Status
</a>
</div>
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-accounting.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Accounting
</a>
</div>
</div>
</div>
</ui:composition>

View file

@ -0,0 +1,157 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<div class="imixs-form-section">
<dl>
<dt>
#{message['form.company']}<span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText required="true" value="#{workitem.item['_Subject']}" id="company_id">
</h:inputText>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.firstname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_FirstName']}" id="firstname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.lastname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_LastName']}" id="lastname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone1']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone1']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone2']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone2']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone3']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone3']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.department']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_department']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.email']}" />
<!-- mailto -->
<h:panelGroup style="margin-left:5px;" rendered="#{! empty workitem.item['_Email']}">
<h:outputLink value="mailto:#{workitem.item['_Email']}">
<h:graphicImage url="/layout/icons/icon042.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Email']}" id="email_id">
</h:inputText>
</dd>
</dl>
<dl>
<!-- ### Internet ### -->
<dt>
<h:outputLabel value="#{message['form.internet']}" />
<!-- hyperlink -->
<h:panelGroup style="margin-left:5px;" rendered="#{! empty workitem.item['_Internet']}">
<h:outputLink target="_blank" value="#{workitem.item['_Internet']}">
<h:graphicImage url="/layout/icons/icon001.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Internet']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
<h:outputLabel value="Zusammenfassung" />
</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_description']}" style="" />
</dd>
</dl>
</div>
<hr />
<div class="imixs-form-section-2">
<dl>
<!-- ### date ### -->
<dt>
<h:outputLabel value="#{message['form.appointment']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['datDate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Letzter persönlicher Kontakt" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_lastContact']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,59 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<div class="imixs-form-section">
<!-- Contract Form -->
<dl>
<dt>
#{message['form.subject']} <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText value="#{workitem.item['_subject']}" required="true" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
User Story:<span class="imixs-required"></span>
</dt>
<dd>
<h:inputTextarea class="imixs-editor-basic" value="#{workitem.item['_description']}" />
</dd>
</dl>
</div>
<!-- Agreement Form -->
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="Auftrag" />
</dt>
<dd>
<ui:include src="/pages/workitems/parts/workitemlink.xhtml">
<ui:param name="options" value="$workflowgroup:Auftrag" />
</ui:include>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Plan (in Stunden)" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_effort_planed']}" required="true">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText>
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,199 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:marty="http://java.sun.com/jsf/composite/marty">
<!-- Agreement Form -->
<div class="imixs-form-section-2">
<dl>
<dt>#{message['form.subject']}</dt>
<dd>
<h:outputText value="#{workitem.item['_subject']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Auftrag" />
</dt>
<dd>
<ui:include src="/pages/workitems/parts/workitemlink.xhtml">
<ui:param name="options" value="$workflowgroup:Auftrag" />
<ui:param name="readonly" value="true" />
</ui:include>
</dd>
</dl>
</div>
<h:panelGroup layout="block" styleClass="imixs-form-section">
<dl>
<dt>User Story:</dt>
<dd>
<div class="ui-state-highlight ui-corner-all" style="margin-bottom: 10px; padding: .5em;">
<p>
<h:outputText escape="false" value="#{workitem.item['_description']}" />
</p>
</div>
</dd>
</dl>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="imixs-form-section" id="oderlist" binding="#{orderlistContainer}">
<f:ajax render="oderlist" onevent="updateOrderItems">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 100px;">Datum</th>
<th>Leistungsbezeichnung</th>
<th style="width: 50px;">Menge</th>
<th style="width: 10px;">
<!-- delete -->
</th>
</tr>
<ui:repeat var="orderitem" value="#{childItemController.childItems}">
<tr>
<!-- date -->
<td>
<h:inputText value="#{orderitem.item['datdate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
</td>
<!-- Name -->
<td>
<h:inputText value="#{orderitem.item['name']}" style="width:100%" />
</td>
<td>
<h:inputText value="#{orderitem.item['amount']}" style="text-align: right;width:4em"
class="orderitem_amount" onchange="calculateSummary()" />
</td>
<td>
<h:commandLink actionListener="#{childItemController.remove(orderitem.item['numpos'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{orderlistContainer.clientId}" onevent="updateOrderItems" />
</h:commandLink> <!-- item summary -->
<h:inputHidden value="#{orderitem.item['_capacity']}" id="item_capacity" />
<h:inputHidden value="#{orderitem.item['_capacity_dsp']}" id="item_capacity_dsp" />
</td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Summe:</strong></td>
<td class="orderlist_total" style="text-align: right;"></td>
<td />
</tr>
<!-- plan -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Plan:</strong></td>
<td class="orderlist_planning" style="text-align: right;">#{workitem.item['_effort_planed']}</td>
<td />
</tr>
<!-- Div -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Prozent:</strong></td>
<td class="orderlist_div" style="text-align: right;"> %</td>
<td />
</tr>
</table>
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_capacity']}" id="orderitems_capacity" />
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_effort_div']}" id="orderitems_effort_div" />
<h:commandButton value="#{message.add}" id="addposbutton_id" actionListener="#{childItemController.add}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
<script type="text/javascript">
/*<![CDATA[*/
// display summary
$(document).ready(function () {
// prvent from hiting enter key
$("input").keydown(function (event) {
if (event.keyCode == 13) {
event.preventDefault();
return false;
}
});
// erste Zeile hinzufügen, falls tabelle noch leer ist
var posTableEmpty =#{ empty childItemController.childItems };
if (posTableEmpty) {
// click on add button
posButton = $('[id$=addposbutton_id]');
if (posButton) {
$(posButton).click();
}
}
calculateSummary();
});
// This method refreshs the layout
function updateOrderItems(data) {
if (data.status === 'success') {
$('[id$=oderlist]').imixsLayout();
calculateSummary();
}
}
//Rechnet die Preise zusammen
function calculateSummary() {
var price = 0, amount = 0, sum = 0;
var summaryItems = $(".orderitem_amount");
$(summaryItems).each(function (index, value) {
var tableRow = $(this).closest('tr');
var amount = convertToNumber($(this).val());
//console.log('amount=' + amount);
//console.log('price=' + price);
if (!isNaN(amount)) {
sum = sum + (amount * 1);
}
});
// update total.....
sum = Math.round(sum * 100) / 100;
$("[id$=orderitems_capacity]").val(sum);
$(".orderlist_total").empty();
$(".orderlist_total").append(sum);
// compute div...
var plan = convertToNumber("#{workitem.item['_effort_planed']}");
plan = plan * 1;
var planDiv = sum / plan * 100;
planDiv = planDiv.toFixed(2);
//alert(d2);
$(".orderlist_div").empty();
$(".orderlist_div").append(planDiv + "%");
$("[id$=orderitems_effort_div]").val(planDiv);
}
/* format 1.000,00 to 1000.00 */
function convertToNumber(currency) {
// Prüfen ob es sich um deutsche oder englische Notation handelt
const hasGermanFormat = /^\d{1,3}(\.\d{3})*,\d+$/.test(currency);
if (hasGermanFormat) {
// Deutsche Notation (1.000,50 -> 1000.50)
return currency.replace(/\./g, '').replace(',', '.');
} else {
// Englische Notation oder einfache Zahl (8.0 -> 8.0)
return currency;
}
}
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1,96 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<div class="imixs-form-section-2">
<h3>#{workitem.item['name']}</h3>
<dl>
<dt>Dbtr IBAN</dt>
<dd>
<h:outputText value="#{workitem.item['dbtr.iban']}" />
</dd>
</dl>
<dl>
<dt>Dbtr BIC</dt>
<dd>
<h:outputText value="#{workitem.item['dbtr.bic']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<h3>Zahlungen</h3>
<table class="" style="width:100%;">
<tr>
<th style=""></th>
<th style="">Zahlbar bis</th>
<th style="">IBAN</th>
<th style="">BIC</th>
<th style="">Betrag EUR</th>
<th style=""></th>
</tr>
<c:forEach items="#{workitem.itemList['$workitemref']}" var="id">
<!-- load inovice data by documentController: #{documentController.load(id)} -->
<ui:param name="invoice" value="#{documentController.getDocument()}"></ui:param>
<tr>
<td><h:link outcome="/pages/workitems/workitem">
#{invoice.item['$workflowsummary']}
<f:param name="id" value="#{invoice.item['$uniqueid']}" />
</h:link>
</td>
<td>
<h:outputText
value="#{invoice.item['payment.date']}">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
a</h:outputText>
</td>
<td>#{invoice.item['cdtr.iban']}</td>
<td>#{invoice.item['cdtr.bic']}</td>
<td style="text-align: right;"><h:outputText
value="#{invoice.item['payment.total']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText></td>
</tr>
</c:forEach>
<tr style="border-top: 1px solid #ccc;">
<td />
<td />
<td />
<td><strong>Summary</strong></td>
<td style="text-align: right;"><strong><h:outputText
value="#{sepaController.calculateSum(workitem.itemList['$workitemref'], 'payment.total')}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText></strong></td>
<td />
<td />
</tr>
</table>
</div>
</ui:composition>

View file

@ -0,0 +1,54 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Agreement Form -->
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.startdate']}" />
</dt>
<dd>
<h:inputText
value="#{workitem.item['_startdate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}"/>
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.enddate']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_enddate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}"/>
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.type']}" />
</dt>
<dd>
<h:inputText
value="#{workitem.item['_contracttype']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.capacity']}" />
</dt>
<dd>
<h:inputText
value="#{workitem.item['_capacity']}" />
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,47 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty">
<div class="imixs-form-section-2">
<dl>
<!-- ### date ### -->
<dt>
<h:outputLabel value="#{message['form.appointment']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['datDate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.followup']}" />
</dt>
<dd>
<h:selectOneRadio layout="pageDirection"
value="#{workitem.item['keyItervalDatDate']}">
<f:selectItem itemValue="" itemLabel="#{message['form.none']}" />
<f:selectItem itemValue="weekly"
itemLabel="#{message['form.weekly']}" />
<f:selectItem itemValue="monthly"
itemLabel="#{message['form.monthly']}" />
<f:selectItem itemValue="yearly"
itemLabel="#{message['form.yearly']}" />
</h:selectOneRadio>
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,11 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- replaced by chronicle -->
</ui:composition>

View file

@ -0,0 +1,16 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:inputTextarea id="abstract_id" class="imixs-editor"
value="#{workitem.item['htmldocumentation']}" />
</ui:composition>

View file

@ -0,0 +1,79 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty" xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<!-- DATEV Kreditor/Debitor Search integration
This subform is a custom form part.
The subform provides a jsf commandScript which calls the datevSearchController.search method in the backend.
The script below inits a autocompletion feature for the input field.
See imixs-office.autocompletion.js
See also:
https://stackoverflow.com/questions/16588327/how-to-invoke-a-jsf-managed-bean-on-a-html-dom-event-using-native-javascript
https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call
https://www.w3schools.com/howto/howto_js_autocomplete.asp
-->
<ui:param name="item_konto_name" value="#{item.name}.name"></ui:param>
<ui:fragment rendered="#{!readonly}">
<h:inputText value="#{workitem.item[item.name]}" pt:data-item="#{item.name}" />
<h:inputHidden value="#{workitem.item[item_konto_name]}" pt:data-item="#{item_konto_name}" />
<br />
<span id='datev-konto-id' class='small'>#{workitem.item[item_konto_name]}</span>
<h:commandScript name="datevSearch" action="#{datevSearchController.searchDebitorCreditor(options)}"
render="autocomplete-resultlist-datev-debkredkonto" onevent="autocompleteShowResult" />
<script type="text/javascript">
/*<![CDATA[*/
// init input fields...
$(document).ready(function () {
// add autocomplete feature ..
var creditorField = $("input[data-item='#{item.name}']");
$(creditorField).each(function () {
$(this).addClass("imixs-ml");
autocompleteInitInput(this, datevSearch, 'autocomplete-resultlist-datev-debkredkonto', selectDebitorCreditorCallback);
});
});
// Hier bekommen wir die JSON Struktur mit allen daten.
// diese Daten werden auf die einzelnen Felder verteilt.
function selectDebitorCreditorCallback(selection) {
const kontoData = JSON.parse(selection);
// fill data into the fields....
var inputElementKonto = $("input[data-item='#{item.name}']");
var inputElementKreditor = $("input[data-item='#{item_konto_name}']");
inputElementKonto.val(kontoData.konto);
inputElementKreditor.val(kontoData.name);
// remove old konto name
$('#datev-konto-id').remove();
// append span with konto name....
inputElementKonto.after("<span id='datev-konto-id' class='small'>" + kontoData.name + "</span>");
}
/*]]>*/
</script>
<!-- datev debkredkonto suggest list -->
<h:panelGroup id="autocomplete-resultlist-datev-debkredkonto" layout="block" class="autocomplete-resultlist">
<ui:repeat var="suggest" value="#{datevSearchController.searchResult}">
<div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest.data}')">
<a href="#">
<h:outputText value="#{suggest.display}" escape="false" />
</a>
</div>
</ui:repeat>
</h:panelGroup>
</ui:fragment>
<!-- Read only -->
<ui:fragment rendered="#{readonly}">
<h:outputText value="#{workitem.item[item.name]} #{workitem.item[item_konto_name]}"/>
</ui:fragment>
</ui:composition>

View file

@ -0,0 +1,79 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty" xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<!-- DATEV Sachkonto Search integration
This subform is a custom form part.
The subform provides a jsf commandScript which calls the datevSearchController.search method in the backend.
The script below inits a autocompletion feature for the input field.
See imixs-office.autocompletion.js
See also:
https://stackoverflow.com/questions/16588327/how-to-invoke-a-jsf-managed-bean-on-a-html-dom-event-using-native-javascript
https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call
https://www.w3schools.com/howto/howto_js_autocomplete.asp
-->
<ui:param name="item_konto_name" value="#{item.name}.name"></ui:param>
<ui:fragment rendered="#{!readonly}">
<h:inputText value="#{workitem.item[item.name]}" pt:data-item="#{item.name}" />
<h:inputHidden value="#{workitem.item[item_konto_name]}" pt:data-item="#{item_konto_name}" />
<br />
<span id='datev-konto-id' class='small'>#{workitem.item[item_konto_name]}</span>
<h:commandScript name="datevSearch" action="#{datevSearchController.searchSachkonto(options)}"
render="autocomplete-resultlist-datev-sachkonto" onevent="autocompleteShowResult" />
<script type="text/javascript">
/*<![CDATA[*/
// init input fields...
$(document).ready(function () {
// add autocomplete feature ..
var creditorField = $("input[data-item='#{item.name}']");
$(creditorField).each(function () {
$(this).addClass("imixs-ml");
autocompleteInitInput(this, datevSearch, 'autocomplete-resultlist-datev-sachkonto', selectDebitorCreditorCallback);
});
});
// Hier bekommen wir die JSON Struktur mit allen daten.
// diese Daten werden auf die einzelnen Felder verteilt.
function selectDebitorCreditorCallback(selection) {
const kontoData = JSON.parse(selection);
// fill data into the fields....
var inputElementKonto = $("input[data-item='#{item.name}']");
var inputElementKreditor = $("input[data-item='#{item_konto_name}']");
inputElementKonto.val(kontoData.konto);
inputElementKreditor.val(kontoData.name);
// remove old konto name
$('#datev-konto-id').remove();
// append span with konto name....
inputElementKonto.after("<span id='datev-konto-id' class='small'>" + kontoData.name + "</span>");
}
/*]]>*/
</script>
<!-- datev sachkonto suggest list -->
<h:panelGroup id="autocomplete-resultlist-datev-sachkonto" layout="block" class="autocomplete-resultlist">
<ui:repeat var="suggest" value="#{datevSearchController.searchResult}">
<div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest.data}')">
<a href="#">
<h:outputText value="#{suggest.display}" escape="false" />
</a>
</div>
</ui:repeat>
</h:panelGroup>
</ui:fragment>
<!-- Read only -->
<ui:fragment rendered="#{readonly}">
<h:outputText value="#{workitem.item[item.name]} #{workitem.item[item_konto_name]}"/>
</ui:fragment>
</ui:composition>

View file

@ -0,0 +1,84 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Zeigt eine Auswahl von aktuellen Requirements zu dem selektierten Auftrag an.
-->
<ui:param name="refid" value="#{workflowController.workitem.item['$workitemref']}" />
<c:if test="#{!readonly and !empty refid}">
<ui:param name="query"
value="(type:workitem) AND ($workitemref:#{refid}) AND ($workflowgroup:Requirement) AND ($taskid:2300)" />
<ui:param name="requirements"
value="#{workflowController.getDocumentService().findStubs(query,100,0,'$created',false)}" />
<h:selectManyCheckbox id="requirements_id" required="false" layout="pageDirection"
value="#{workitem.itemListArray['_requirements']}">
<c:forEach items="#{requirements}" var="req">
<f:selectItem itemLabel="#{req.item['$workflowsummary']}" itemValue="#{req.item['$uniqueid']}">
</f:selectItem>
</c:forEach>
</h:selectManyCheckbox>
<script type="text/javascript">
window.onload = function () {
// Alle Input-Felder im Dokument auswählen
const inputFields = document.querySelectorAll("input");
// Array für gefundene Input-Felder erstellen
const foundInputFields = [];
// Durch jedes Input-Feld iterieren und nach der ID suchen
inputFields.forEach((inputField) => {
// Überprüfen, ob die ID das Wort "requirement" enthält
if (inputField.id.includes("requirements_id")) {
// Input-Feld zur Liste der gefundenen Input-Felder hinzufügen
foundInputFields.push(inputField);
}
});
// Gefundene Input-Felder anzeigen
foundInputFields.forEach((inputField) => {
var uid = inputField.value;
// find label
const labelElement = inputField.nextElementSibling;
if (labelElement.tagName === 'LABEL') {
// Neuen a-Tag erstellen
const anchorTag = document.createElement('a');
// Link zur Domain openai.com festlegen
anchorTag.href = '/pages/workitems/workitem.xhtml?id=' + uid;
// Textinhalt des label-Elements zum a-Tag hinzufügen
const newLabel = labelElement.cloneNode(true);
newLabel.style.fontWeight = 'normal';
anchorTag.appendChild(newLabel);
// Das label-Element durch den neuen a-Tag ersetzen
labelElement.parentNode.replaceChild(anchorTag, labelElement);
} else {
console.log('Es wurde kein label-Element gefunden.');
}
});
}
</script>
</c:if>
<!-- Read Only Mode -->
<c:if test="#{readonly}">
<ui:param name="requirementSelection" value="#{workitem.itemList['_requirements']}" />
<div>
<c:forEach items="#{requirementSelection}" var="reqID">
<ui:param name="requirement" value="#{workflowController.getDocumentService().load(reqID)}" />
<h:link outcome="/pages/workitems/workitem.xhtml?id=#{reqID}">#{requirement.item['$workflowsummary']}
</h:link>
<br />
</c:forEach>
</div>
</c:if>
</ui:composition>

View file

@ -0,0 +1,279 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions">
<h:panelGroup layout="block" styleClass="imixs-form-section" style="position: relative;"
id="bookinglist" binding="#{bookinglistContainer}">
<ui:param name="hasKostenstelle1" value="#{!empty datevController.kostenstelle1}"></ui:param>
<ui:param name="hasKostenstelle2" value="#{!empty datevController.kostenstelle2}"></ui:param>
<ui:fragment rendered="#{!readonly}">
<h:commandScript name="sachkontoSearch" action="#{datevSearchController.searchSachkonto()}"
render="autocomplete-resultlist-datev-sachkonto" onevent="autocompleteShowResult" />
<table class="imixsdatatable imixs-bookingitems">
<tr>
<th style="width: 200px;">Buchungskonto</th>
<!-- -->
<ui:fragment rendered="#{hasKostenstelle1}">
<th style="width: 140px;">Kostenstelle I.</th>
</ui:fragment>
<ui:fragment rendered="#{hasKostenstelle2}">
<th style="width: 140px;">Kostenstelle II.</th>
</ui:fragment>
<th style="width: 170px;">BU Schlüssel</th>
<th style="min-width: 120px;">Betrag</th>
<th style="width: 10px;">
<!-- delete -->
</th>
</tr>
<ui:repeat var="bookingItem"
value="#{datevBookingController.bookingList}">
<tr>
<td class="konto-input">
<!-- Input Field -->
<h:panelGroup id="konto_input_box"
layout="block" class="marty-userinput-inputbox"
style="height:inherit;">
<h:inputText style="width:100%;" id="konto-input-id"
value="#{bookingItem.item['datev.konto']}" pt:data-item="datev.sachkonto" />
<h:inputHidden value="#{bookingItem.item['datev.kontobeschriftung']}" pt:data-item="datev.kontobeschriftung" />
<br />
<span id='sachkontodtr-name-id' class='small'>#{bookingItem.item['datev.kontobeschriftung']}</span>
</h:panelGroup>
</td>
<!-- Kostenstelle -->
<ui:fragment rendered="#{!empty datevController.kostenstelle1}">
<td><h:selectOneMenu style="width:100%;"
value="#{bookingItem.item['datev.kostenstelle1']}">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{datevController.kostenstelle1}"></f:selectItems>
</h:selectOneMenu></td>
</ui:fragment>
<ui:fragment rendered="#{!empty datevController.kostenstelle2}">
<td><h:selectOneMenu style="width:100%;"
value="#{bookingItem.item['datev.kostenstelle2']}">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{datevController.kostenstelle2}"></f:selectItems>
</h:selectOneMenu></td>
</ui:fragment>
<td><h:selectOneMenu style="width:100%;"
value="#{bookingItem.item['datev.buschluessel']}">
<f:selectItems
value="#{datevController.buSchluesel}"></f:selectItems>
<f:selectItem itemLabel="" itemValue=""></f:selectItem>
</h:selectOneMenu></td>
<td style="text-align: right;"><h:inputText
value="#{bookingItem.item['datev.betrag']}" id="bookingitem_amount"
style="text-align: right;width: 100%;border: inherit;"
onchange="calculateSummary()">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText></td>
<td><h:commandLink
actionListener="#{datevBookingController.remove(bookingItem.item['numpos'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{bookinglistContainer.clientId}" execute="#{bookinglistContainer.clientId}"
onevent="initDatevTable" />
</h:commandLink></td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<ui:fragment rendered="#{hasKostenstelle1}">
<td />
</ui:fragment>
<ui:fragment rendered="#{hasKostenstelle2}">
<td />
</ui:fragment>
<td class="bookinglist-sum"
style="text-align: right; font-weight: bold;">Summe:</td>
<td class="bookinglist-sum bookinglist_summary"
style="text-align: right; font-weight: bold;"></td>
<td />
</tr>
</table>
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_capacity']}"
id="bookingitems_capacity" />
<h:inputHidden value="#{workitem.item['_capacity_dsp']}"
id="bookingitems_capacity_dsp" />
<h:commandButton value="#{message.add}" id="addposbutton_id"
actionListener="#{datevBookingController.add}">
<f:ajax render="#{bookinglistContainer.clientId}" execute="#{bookinglistContainer.clientId}"
onevent="initDatevTable" />
</h:commandButton>
<!-- datev creditor suggest list -->
<h:panelGroup id="autocomplete-resultlist-datev-sachkonto" layout="block" class="autocomplete-resultlist autocomplete-resultlist-sachkonto">
<ui:repeat var="suggest" value="#{datevSearchController.searchResult}">
<div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest.data}')">
<a href="#" style="color: #777;">
<h:outputText value="#{suggest.display}" escape="false" />
</a>
</div>
</ui:repeat>
</h:panelGroup>
<script type="text/javascript">
/*<![CDATA[*/
// display summary
$(document).ready(
function() {
calculateSummary();
initDatevTable();
});
// Hier bekommen wir die JSON Struktur mit allen Daten.
// diese Daten werden auf die einzelnen Felder verteilt.
function selectSachkontoCallback(selection,inputElementKonto) {
const sachkontoData = JSON.parse(selection);
inputElementKonto.val(sachkontoData.konto);
// finde das nächste hidden Feld...
var inputElementBeschriftung=$(inputElementKonto).siblings( "input" );
inputElementBeschriftung.val(sachkontoData.name);
// remove old cdtr.name
$(inputElementKonto).siblings( "span" ).remove();
// append span with cdtr.name....
inputElementKonto.after("<span id='sachkonto-name-id' class='small'>" + sachkontoData.name + "</span>");
}
/* initialisiert die suchfunktion in der Tabelle */
function initDatevTable(data) {
if (!data || data.status === 'success') {
// add autocomplete feature ..
var sachkontoInput = $("input[data-item='datev.sachkonto']");
$(sachkontoInput).each(function () {
$(this).addClass("imixs-ml");
autocompleteInitInput(this, sachkontoSearch, 'autocomplete-resultlist-datev-sachkonto', selectSachkontoCallback);
});
$('[id$=bookinglist]').imixsLayout();
}
}
//Rechnet die Preise zusammen
function calculateSummary() {
var price = 0, amount = 0, sum = 0, total = 0;
var summaryItems = $("[id$=bookingitem_amount]");
$(summaryItems).each(function(index, value) {
var amount = convertToNumber($(this).val());
if (!isNaN(amount)) {
amount = amount * 1; // convert to number
total = total + amount;
total = Math.round(total * 100) / 100;
}
});
// update total _capacity
// update bookinglist_summary
$("[id$=bookingitems_capacity]").val(total);
$("[id$=bookingitems_capacity_dsp]").val(convertToCurrency(total));
$(".bookinglist_summary", ".imixs-bookingitems").empty();
$(".bookinglist_summary", ".imixs-bookingitems").append(
convertToCurrency(total));
}
/* format 1.000,00 to 1000.00 */
function convertToNumber(currency) {
currency = currency.replace(/\./g, '');
currency = currency.replace(/\,/g, '.');
return currency;
}
/* format 1000 into 1.000,00 */
function convertToCurrency(number) {
var splitNum;
//number = Math.abs(number);
number = number.toFixed(2);
splitNum = number.split('.');
splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, ".");
return splitNum.join(",");
}
/*]]>*/
</script>
</ui:fragment>
<ui:fragment rendered="#{readonly}">
<table class="imixsdatatable imixs-bookingitems">
<tr>
<th style="width: 300px;">Buchungskonto</th>
<!-- -->
<ui:fragment rendered="#{hasKostenstelle1}">
<th style="width: 140px;">Kostenstelle I.</th>
</ui:fragment>
<ui:fragment rendered="#{hasKostenstelle2}">
<th style="width: 140px;">Kostenstelle II.</th>
</ui:fragment>
<th style="width: 70px;">BU Schlüssel</th>
<th style="width: 50px;">Betrag</th>
</tr>
<ui:repeat var="bookingItem"
value="#{datevBookingController.bookingList}">
<tr>
<td class="konto-input"><h:outputText
value="#{bookingItem.item['datev.konto']}"></h:outputText>
<h:outputText
value=" #{bookingItem.item['datev.kontobeschriftung']}"></h:outputText>
</td>
<!-- Kostenstelle -->
<ui:fragment rendered="#{!empty datevController.kostenstelle1}">
<td><h:outputText value="#{bookingItem.item['datev.kostenstelle1']}"></h:outputText></td>
</ui:fragment>
<ui:fragment rendered="#{!empty datevController.kostenstelle2}">
<td><h:outputText value="#{bookingItem.item['datev.kostenstelle2']}"></h:outputText></td>
</ui:fragment>
<td style="text-align: right;">
<h:outputText value="#{bookingItem.item['datev.buschluessel']}"></h:outputText>
</td>
<td style="text-align: right;"><h:outputText
value="#{bookingItem.item['datev.betrag']}"></h:outputText></td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<ui:fragment rendered="#{hasKostenstelle1}">
<td />
</ui:fragment>
<ui:fragment rendered="#{hasKostenstelle2}">
<td />
</ui:fragment>
<td class="bookinglist-sum"
style="text-align: right; font-weight: bold;">Summe:</td>
<td class="bookinglist-sum bookinglist_summary"
style="text-align: right; font-weight: bold;">#{workitem.item['_capacity_dsp']}</td>
</tr>
</table>
</ui:fragment>
</h:panelGroup>
</ui:composition>

View file

@ -0,0 +1,101 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<div class="imixs-form-section-3">
<dl>
<dt>DATEV Berater-Nr.</dt>
<dd>
<h:outputText value="#{workitem.item['datev.client.name']}" />
</dd>
</dl>
<dl>
<dt>DATEV Mandanten-nr.</dt>
<dd>
<h:outputText value="#{workitem.item['datev.client.id']}" />
</dd>
</dl>
<dl>
<dt>Buchungsperiode</dt>
<dd>
<h:outputText value="#{workitem.item['datev.booking_period']}" />
</dd>
</dl>
</div>
<h:panelGroup styleClass="imixs-form-section">
<h3>Belegübersicht</h3>
<table class="" style="width:100%">
<tr style="background-color: #efefef;">
<th style="text-align: center;">Beleg</th>
<th style="text-align: center;">Konto</th>
<th style="text-align: center;">Betrag</th>
<th style="text-align: center;">S/H</th>
<th style="text-align: center;">Gegenkonto</th>
<th style="text-align: center;">BU-Schlüssel</th>
<th style="text-align: center;">Belegdatum</th>
<th style="text-align: center;">Belegfeld 1</th>
</tr>
<c:forEach items="#{datevController.getBuchungsexportByBelegdatum(workitem)}" var="beleg">
<tr style="border-bottom: 1px solid #ccc;">
<td style="text-align: left;">
<h:link outcome="/pages/workitems/workitem">#{beleg.item['$workflowgroup']} -
#{beleg.item['$workflowsummary']}
<f:param name="id" value="#{beleg.item['$uniqueid']}" />
</h:link>
</td>
<td style="text-align: left;">
#{datevController.getBuchung(beleg).item['datev.konto']} -
#{datevController.getBuchung(beleg).item['datev.kontobeschriftung']}
</td>
<td style="text-align: right;">
<h:outputText value="#{beleg.item['datev.betrag']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td style="text-align: center;">
#{beleg.item['datev.shkennzeichen']}
</td>
<td style="text-align: center;">
#{beleg.item['datev.gegenkonto']}
</td>
<td style="text-align: center;">
#{datevController.getBuchung(beleg).item['datev.buschluessel']}
</td>
<td style="text-align: center;">
<h:outputText value="#{beleg.item['datev.belegdatum']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:outputText>
</td>
<td style="text-align: center;">
#{beleg.item['datev.belegfeld1']}
</td>
</tr>
</c:forEach>
</table>
</h:panelGroup>
<script type="text/javascript">
/*<![CDATA[*/
// This method refreshs the layout
function updateItems(data) {
if (data.status === 'success') {
$('form').imixsLayout();
}
}
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1,206 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="oderlist" binding="#{orderlistContainer}">
<f:ajax render="oderlist" onevent="updateOrderItems">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 100px;">Datum</th>
<th>Beschreibung</th>
<th style="width: 50px;">Menge</th>
<th style="width: 10px;">
<!-- delete -->
</th>
</tr>
<ui:repeat var="orderitem" value="#{childItemController.childItems}">
<tr>
<!-- date -->
<td><h:inputText value="#{orderitem.item['datdate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText></td>
<!-- Name -->
<td><h:inputText value="#{orderitem.item['name']}"
style="width:100%" /></td>
<td><h:inputText value="#{orderitem.item['amount']}"
style="text-align: right;width:4em" class="orderitem_amount"
onchange="calculateSummary()" /></td>
<td><h:commandLink
actionListener="#{childItemController.remove(orderitem.item['numpos'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{orderlistContainer.clientId}"
onevent="updateOrderItems" />
</h:commandLink> <!-- item summary --> <h:inputHidden
value="#{orderitem.item['_capacity']}" id="item_capacity" /> <h:inputHidden
value="#{orderitem.item['_capacity_dsp']}"
id="item_capacity_dsp" /></td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Summe:</strong></td>
<td class="orderlist_total" style="text-align: right;"></td>
<td />
</tr>
<!-- plan -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Plan:</strong></td>
<td class="orderlist_planning" style="text-align: right;">#{workitem.item['assistant.plan']}</td>
<td />
</tr>
<!-- Div -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Prozent:</strong></td>
<td class="orderlist_div" style="text-align: right;"> %</td>
<td />
</tr>
</table>
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_capacity']}"
id="orderitems_capacity" />
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_effort_div']}"
id="orderitems_effort_div" />
<h:commandButton value="#{message.add}" id="addposbutton_id"
actionListener="#{childItemController.add}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
<div class="row">
<div class="col-4">
<a
href="#{facesContext.externalContext.requestContextPath}/api/report/werksstudent-accounting.imixs-report?id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Accounting
</a>
</div>
</div>
<script type="text/javascript">
/*<![CDATA[*/
// display summary
$(document).ready(function() {
// prvent from hiting enter key
$("input").keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
// erste Zeile hinzufügen, falls tabelle noch leer ist
var posTableEmpty=#{empty childItemController.childItems};
if (posTableEmpty) {
// click on add button
posButton=$('[id$=addposbutton_id]');
if (posButton) {
$(posButton).click();
}
}
calculateSummary();
});
// This method refreshs the layout
function updateOrderItems(data) {
if (data.status === 'success') {
$('[id$=oderlist]').imixsLayout();
calculateSummary();
}
}
//Rechnet die Preise zusammen
function calculateSummary() {
var price = 0, amount = 0, sum = 0;
var summaryItems = $(".orderitem_amount");
$(summaryItems).each(function(index, value) {
var tableRow = $(this).closest('tr');
var amount =convertToNumber( $(this).val());
//console.log('amount=' + amount);
//console.log('price=' + price);
if (!isNaN(amount) ) {
sum = sum + (amount*1);
}
});
// update total.....
sum = Math.round(sum * 100) / 100;
$("[id$=orderitems_capacity]").val(sum);
$(".orderlist_total").empty();
$(".orderlist_total").append(sum);
// compute div...
var plan=convertToNumber("#{workitem.item['assistant.plan']}");
plan=plan*1;
var planDiv=sum/plan*100;
planDiv=planDiv.toFixed(2);
//alert(d2);
$(".orderlist_div").empty();
$(".orderlist_div").append(planDiv+"%");
$("[id$=orderitems_effort_div]").val(planDiv);
}
/* format 1.000,00 to 1000.00 */
function convertToNumber(currency) {
currency = currency.replace(/\./g, '');
currency = currency.replace(/\,/g, '.');
return currency;
}
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1,274 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:office="http://xmlns.jcp.org/jsf/composite/office"
xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<div class="imixs-form-section">
<!-- Contract Form -->
<dl>
<dt>
#{message['form.subject']} <span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText value="#{workitem.item['_subject']}" required="true" />
</dd>
</dl>
<dl>
<dt>#{message['form.description']}</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_description']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.contact']}" />
</dt>
<dd>
<ui:include src="/pages/workitems/parts/workitemlink.xhtml">
<ui:param name="options" value="($workflowgroup:Kontakt) AND (type:workitem)" />
</ui:include>
</dd>
</dl>
<dl>
<dt>Rechnung E-Mail:</dt>
<dd>
<h:inputText value="#{workitem.item['invoice.email']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.reminder']}" />
</dt>
<dd>
<h:inputText styleClass="imixs-date" value="#{workitem.item['datDate']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
<h:selectOneMenu style="width:120px;margin-left:10px;" value="#{workitem.item['keyIntervalDatDate']}">
<f:selectItem itemValue="" itemLabel="#{message['form.none']}" />
<f:selectItem itemValue="daily" itemLabel="Täglich" />
<f:selectItem itemValue="weekly" itemLabel="#{message['form.weekly']}" />
<f:selectItem itemValue="monthly" itemLabel="#{message['form.monthly']}" />
<f:selectItem itemValue="yearly" itemLabel="#{message['form.yearly']}" />
</h:selectOneMenu>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<h2>Accounting</h2>
<dl>
<dt>
<h:outputLabel value="#{message['form.ordernumber']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_ordernumber']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.orderdate']}" />
</dt>
<dd>
<h:inputText styleClass="imixs-date" value="#{workitem.item['_orderdate']}" />
</dd>
</dl>
</div>
<!-- Agreement Form -->
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.startdate']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_startdate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.enddate']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_enddate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Volumen (in Stunden)" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_effort']}" />
<h:outputText value="#{workitem.item['_contracttype']}" />
<h:outputText value="#{workitem.item['_capacity']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Stundensatz" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_rate']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section"></div>
<ui:param name="requilist" value="#{viewHandler.getData(requirementsViewController)}"></ui:param>
<div class="imixs-form-section">
<h2>Requirements &amp; Reporting</h2>
<table class="imixsdatatable imixs-orderitems" style="margin-bottom: 20px;">
<tr>
<th style="width: 100px;">Erstellt</th>
<th style="">Requirement</th>
<th style="">Status</th>
<th style="width: 60px;">Ist</th>
<th style="width: 60px;">Plan</th>
<th style="width: 80px;">%</th>
</tr>
<ui:repeat var="orderitem" value="#{requilist}">
<tr>
<!-- Erstellt -->
<td
style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through;text-align: center;':'text-align: center;'}">
<h:outputText value="#{orderitem.item['$created']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:outputText>
</td>
<!-- -->
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:link outcome="/pages/workitems/workitem?faces-redirect=true">
<h:outputText value="#{orderitem.item['txtworkflowsummary']}" />
<f:param name="id" value="#{orderitem.item['$uniqueid']}" />
</h:link>
</td>
<!-- Name -->
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['$workflowstatus']}" />
</td>
<!-- capa -->
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_capacity']}" style="width:100%">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_planed']}" id="orderitem_amount">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_div']} %">
</h:outputText>
</td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td />
<td class="orderlist-sum" style="text-align: right; font-weight: bold;">Summe</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_capacity']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_planed']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_div']}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" locale="de" />
</h:outputText> %
</td>
</tr>
</table>
<div class="row">
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-planning.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Planning
</a>
</div>
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-implementation.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Status
</a>
</div>
<div class="col-4">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-accounting.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Accounting
</a>
</div>
</div>
</div>
</ui:composition>

View file

@ -0,0 +1,169 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<div class="imixs-form-section">
<dl>
<dt>
#{message['form.company']}<span class="imixs-required">*</span>
</dt>
<dd>
<h:inputText required="true" value="#{workitem.item['_Subject']}"
id="company_id">
</h:inputText>
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="#{message['form.firstname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_FirstName']}"
id="firstname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.lastname']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_LastName']}" id="lastname_id">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone1']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone1']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone2']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone2']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.phone3']}">
</h:outputLabel>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Phone3']}">
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.department']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_department']}" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="#{message['form.email']}" />
<!-- mailto -->
<h:panelGroup style="margin-left:5px;"
rendered="#{! empty workitem.item['_Email']}">
<h:outputLink value="mailto:#{workitem.item['_Email']}">
<h:graphicImage url="/layout/icons/icon042.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Email']}" id="email_id">
</h:inputText>
</dd>
</dl>
<dl>
<!-- ### Internet ### -->
<dt>
<h:outputLabel value="#{message['form.internet']}" />
<!-- hyperlink -->
<h:panelGroup style="margin-left:5px;"
rendered="#{! empty workitem.item['_Internet']}">
<h:outputLink target="_blank" value="#{workitem.item['_Internet']}">
<h:graphicImage url="/layout/icons/icon001.png" />
</h:outputLink>
</h:panelGroup>
</dt>
<dd>
<h:inputText value="#{workitem.item['_Internet']}" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
<h:outputLabel value="Zusammenfassung" />
</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_description']}" style="" />
</dd>
</dl>
</div>
<hr />
<div class="imixs-form-section-2">
<dl>
<!-- ### date ### -->
<dt>
<h:outputLabel value="#{message['form.appointment']}" />
</dt>
<dd>
<h:inputText value="#{workitem.item['datDate']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Letzter persönlicher Kontakt" />
</dt>
<dd>
<h:inputText value="#{workitem.item['_lastContact']}"
styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
</dd>
</dl>
</div>
</ui:composition>

View file

@ -0,0 +1,190 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html">
<!-- ajax logik für währung nutzen -->
<h:panelGroup layout="block" styleClass="imixs-form-section" id="imixsefforts" binding="#{orderlistContainer}">
<f:ajax render="imixsefforts" onevent="updateOrderItems">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 100px;">Datum</th>
<th>Leistungsbezeichnung</th>
<th style="width: 50px;">Menge</th>
<th style="width: 10px;">
<!-- delete -->
</th>
</tr>
<ui:repeat var="orderitem" value="#{childItemController.childItems}">
<tr>
<!-- date -->
<td>
<h:inputText value="#{orderitem.item['datdate']}" styleClass="imixs-date">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:inputText>
</td>
<!-- Name -->
<td>
<h:inputText value="#{orderitem.item['name']}" style="width:100%" />
</td>
<td>
<h:inputText value="#{orderitem.item['amount']}" style="text-align: right;width:4em"
class="orderitem_amount" onchange="calculateSummary()" />
</td>
<td>
<h:commandLink actionListener="#{childItemController.remove(orderitem.item['numpos'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{orderlistContainer.clientId}" onevent="updateOrderItems" />
</h:commandLink> <!-- item summary -->
<h:inputHidden value="#{orderitem.item['_capacity']}" id="item_capacity" />
<h:inputHidden value="#{orderitem.item['_capacity_dsp']}" id="item_capacity_dsp" />
</td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Summe:</strong></td>
<td class="orderlist_total" style="text-align: right;"></td>
<td />
</tr>
<!-- plan -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Plan:</strong></td>
<td class="orderlist_planning" style="text-align: right;">#{workitem.item['_effort_planed']}</td>
<td />
</tr>
<!-- Div -->
<tr>
<td />
<td class="" style="text-align: right;"><strong>Prozent:</strong></td>
<td class="orderlist_div" style="text-align: right;"> %</td>
<td />
</tr>
</table>
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_capacity']}" id="orderitems_capacity" />
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_effort_div']}" id="orderitems_effort_div" />
<h:commandButton value="#{message.add}" id="addposbutton_id" actionListener="#{childItemController.add}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
<script type="text/javascript">
/*<![CDATA[*/
// display summary
$(document).ready(function () {
// prvent from hiting enter key
$("input").keydown(function (event) {
if (event.keyCode == 13) {
event.preventDefault();
return false;
}
});
// erste Zeile hinzufügen, falls tabelle noch leer ist
var posTableEmpty =#{ empty childItemController.childItems };
if (posTableEmpty) {
// click on add button
posButton = $('[id$=addposbutton_id]');
if (posButton) {
$(posButton).click();
}
}
calculateSummary();
});
// This method refreshs the layout
function updateOrderItems(data) {
if (data.status === 'success') {
$('[id$=imixsefforts]').imixsLayout();
calculateSummary();
}
}
//Rechnet die Preise zusammen
function calculateSummary() {
var price = 0, amount = 0, sum = 0;
var summaryItems = $(".orderitem_amount");
$(summaryItems).each(function (index, value) {
var tableRow = $(this).closest('tr');
var amount = convertToNumber($(this).val());
//console.log('amount=' + amount);
//console.log('price=' + price);
if (!isNaN(amount)) {
sum = sum + (amount * 1);
}
});
// update total.....
sum = Math.round(sum * 100) / 100;
$("[id$=orderitems_capacity]").val(sum);
$(".orderlist_total").empty();
$(".orderlist_total").append(sum);
// compute div...
var plan = convertToNumber("#{workitem.item['_effort_planed']}");
plan = plan * 1;
var planDiv = sum / plan * 100;
planDiv = planDiv.toFixed(2);
//alert(d2);
$(".orderlist_div").empty();
$(".orderlist_div").append(planDiv + "%");
$("[id$=orderitems_effort_div]").val(planDiv);
}
/* format 1.000,00 to 1000.00 */
function convertToNumber(currency) {
currency = currency.replace(/\./g, '');
currency = currency.replace(/\,/g, '.');
return currency;
}
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1,104 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<ui:param name="requilist" value="#{viewHandler.getData(requirementsViewController)}"></ui:param>
<div class="imixs-form-section">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 100px;">Erstellt</th>
<th style="">Requirement</th>
<th style="">Status</th>
<th style="width: 60px;">Ist</th>
<th style="width: 60px;">Plan</th>
<th style="width: 80px;">%</th>
</tr>
<ui:repeat var="orderitem" value="#{requilist}">
<tr>
<!-- Erstellt -->
<td
style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through;text-align: center;':'text-align: center;'}">
<h:outputText value="#{orderitem.item['$created']}">
<f:convertDateTime pattern="#{message.datePatternShort}" timeZone="#{message.timeZone}" />
</h:outputText>
</td>
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:link outcome="/pages/workitems/workitem?faces-redirect=true">
<h:outputText value="#{orderitem.item['$workflowsummary']}" />
<f:param name="id" value="#{orderitem.item['$uniqueid']}" />
</h:link>
</td>
<!-- Name -->
<td style="#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['$workflowstatus']}" />
</td>
<!-- capa -->
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_capacity']}" style="width:100%">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_planed']}" id="orderitem_amount">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td
style="text-align: right;#{(orderitem.item['$taskid'] eq 2900)?'text-decoration: line-through':''}">
<h:outputText value="#{orderitem.item['_effort_div']} %">
</h:outputText>
</td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td />
<td class="orderlist-sum" style="text-align: right; font-weight: bold;">Summe</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_capacity']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_planed']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td class="orderlist-sum orderlist_summary" style="text-align: right;">
<h:outputText value="#{workitem.item['_effort_div']}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2" locale="de" />
</h:outputText> %
</td>
</tr>
</table>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;background-color: #eee;padding: 5px 20px;">
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-planning.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span> Planning
</a>
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-implementation.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Status</a>
<a href="#{facesContext.externalContext.requestContextPath}/api/report/requirements-accounting.imixs-report?pageSize=999&amp;id=#{workitem.uniqueID}"
target="_blank"> <span class="typcn typcn-chart-line"></span>
Accounting
</a>
</div>
</div>
</ui:composition>

View file

@ -0,0 +1,232 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Reiskostenabrechnung (de_DE) -->
<div class="imixs-form-section">
<h3>Reisegrund</h3>
<dl>
<dt>Anlass<span class="imixs-required"> * <h:message for="_subject" /></span></dt>
<dd>
<h:inputText value="#{workitem.item['_subject']}" required="true" id="_subject" />
</dd>
</dl>
</div>
<div class="imixs-form-section-2">
<dl>
<dt>
<h:outputLabel value="Beginn" /><span class="imixs-required"> * <h:message for="_date" /></span>
</dt>
<dd>
<h:inputText value="#{workitem.item['datfrom']}" id="_date"
styleClass="imixs-date" required="true" />
</dd>
</dl>
<dl>
<dt>
<h:outputLabel value="Ende" /><span class="imixs-required"> * <h:message for="_dateto" /></span>
</dt>
<dd>
<h:inputText value="#{workitem.item['datto']}" id="_dateto"
styleClass="imixs-date" required="true" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<dl>
<dt>
Reiseziel (Anschrift)<span class="imixs-required"> * <h:message for="_destination" /></span>
</dt>
<dd>
<h:inputTextarea value="#{workitem.item['_destination']}" id="_destination"
required="true" />
</dd>
</dl>
</div>
<div class="imixs-form-section">
<h3>Reisekosten</h3>
<!-- ajax logik für währung nutzen -->
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="oderlist" binding="#{orderlistContainer}">
<f:ajax render="oderlist" onevent="updateOrderItems">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 50px;">Pos.</th>
<th>Leistungsbezeichnung</th>
<th style="width: 100px;">Kosten</th>
<th style="width: 10px;">
<!-- delete -->
</th>
</tr>
<ui:repeat var="orderitem" value="#{childItemController.childItems}">
<tr>
<!-- pos -->
<td><h:outputText value="#{orderitem.item['numpos']}" /></td>
<!-- Name -->
<td><h:inputText value="#{orderitem.item['name']}"
style="width:100%;" /></td>
<td style="text-align: right;"><h:inputText value="#{orderitem.item['price']}"
id="orderitem_price" style="text-align: right;"
onchange="calculateSummary()">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:inputText></td>
<td><h:commandLink
actionListener="#{childItemController.remove(orderitem.item['numpos'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{orderlistContainer.clientId}"
onevent="updateOrderItems" />
</h:commandLink> <!-- item summary --> <h:inputHidden
value="#{orderitem.item['_capacity']}" id="item_capacity" /> <h:inputHidden
value="#{orderitem.item['_capacity_dsp']}"
id="item_capacity_dsp" /></td>
</tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td class="orderlist-sum" style="text-align: right;">Summe</td>
<td class="orderlist-sum orderlist_summary"
style="text-align: right;"></td>
<td />
</tr>
</table>
<!-- total summary -->
<h:inputHidden value="#{workitem.item['_capacity']}"
id="orderitems_capacity" />
<h:inputHidden value="#{workitem.item['_capacity_dsp']}"
id="orderitems_capacity_dsp" />
<h:commandButton value="#{message.add}" id="addposbutton_id"
actionListener="#{childItemController.add}">
</h:commandButton>
</f:ajax>
</h:panelGroup>
</div>
<script type="text/javascript">
/*<![CDATA[*/
// display summary
$(document).ready(function() {
// prvent from hiting enter key
$("input").keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
// erste Zeile hinzufügen, falls tabelle noch leer ist
var posTableEmpty=#{empty childItemController.childItems};
if (posTableEmpty) {
// click on add button
posButton=$('[id$=addposbutton_id]');
if (posButton) {
$(posButton).click();
}
}
calculateSummary();
});
// This method refreshs the layout
function updateOrderItems(data) {
if (data.status === 'success') {
$('[id$=oderlist]').imixsLayout();
calculateSummary();
}
}
//Rechnet die Preise zusammen
function calculateSummary() {
var price = 0, total = 0;
var summaryItems = $("[id$=orderitem_price]");
$(summaryItems).each(function(index, value) {
price = convertToNumber($(this).val());
if (!isNaN(price)) {
sum = price;
// round
sum = Math.round(sum * 100) / 100;
total = total + sum;
total = Math.round(total * 100) / 100;
sum = convertToCurrency(sum);
}
});
// update total _capacity
// update orderlist_summary
$("[id$=orderitems_capacity]").val(total);
$("[id$=orderitems_capacity_dsp]").val(convertToCurrency(total));
$(".orderlist_summary", ".imixs-orderitems").empty();
$(".orderlist_summary", ".imixs-orderitems").append(
convertToCurrency(total));
}
/* format 1.000,00 to 1000.00 */
function convertToNumber(currency) {
currency = currency.replace(/\./g, '');
currency = currency.replace(/\,/g, '.');
return currency;
}
/* format 1000 into 1.000,00 */
function convertToCurrency(number) {
var splitNum;
number = Math.abs(number);
number = number.toFixed(2);
splitNum = number.split('.');
splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, ".");
return splitNum.join(",");
}
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1 @@
,rsoika,ralpus-framework,01.10.2026 09:38,file:///home/rsoika/.config/libreoffice/4;

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,213 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:BPMN2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.openbpmn" exporterVersion="1.0.0" targetNamespace="http://open-bpmn.org">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[basic-de-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApproverPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value>
<imixs:value><![CDATA[Owner|$owner]]></imixs:value>
<imixs:value><![CDATA[Editor|$editor]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:collaboration id="collaboration_1" name="Default Collaboration">
<bpmn2:participant id="participant_STxhdA" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_aMKbSA" name="Request" processRef="process_4zs0ww">
<bpmn2:documentation id="documentation_awmzgg"/>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_mdKRmQ"/>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_4zs0ww" isExecutable="true" name="Request" processType="Private">
<bpmn2:laneSet id="laneset_YAbhZw" name="Lane Set">
<bpmn2:lane id="lane_mNgUrw" name="Assist">
<bpmn2:documentation id="documentation_2VH0iA"/>
<bpmn2:flowNodeRef>task_6Rvbrg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_zUD3jQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_D00leQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_sz0cKg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_FrL0EA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_0jfMhA</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="event_zUD3jQ" name="Start">
<bpmn2:documentation id="documentation_q0CQSQ"/>
<bpmn2:outgoing>sequenceFlow_IPSgCg</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="task_6Rvbrg" imixs:processid="1000" name="Task 1">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_UU4yNw"/>
<bpmn2:incoming>sequenceFlow_IPSgCg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_0AMIqg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="event_D00leQ" name="End">
<bpmn2:documentation id="documentation_S0FDqg"/>
<bpmn2:incoming>sequenceFlow_J9TrXg</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_IPSgCg" sourceRef="event_zUD3jQ" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_kH0gZQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_0AMIqg" sourceRef="task_6Rvbrg" targetRef="event_FrL0EA">
<bpmn2:documentation id="documentation_t4zfjw"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_sz0cKg" imixs:processid="1100" name="Task 2">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_pm2R1w"/>
<bpmn2:incoming>sequenceFlow_02i9iQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_M9MRGw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_J9TrXg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_FrL0EA" imixs:activityid="20" name="Submit">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<validation name="required">false</validation>
<imixs-ai name="ASSIST">
<debug>true</debug>
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<result-item>request.response.text</result-item>
</imixs-ai>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_lz2ljQ"/>
<bpmn2:incoming>sequenceFlow_0AMIqg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_M9MRGw</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_V0oOhw" signalRef="signal_1"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_M9MRGw" sourceRef="event_FrL0EA" targetRef="task_sz0cKg">
<bpmn2:documentation id="documentation_mqOMag"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_0jfMhA" imixs:datatype="form-data" name="Form">
<bpmn2:documentation id="documentation_KIcv5Q"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-subform label="Allgemein">
<imixs-form-section columns="1" >
<item name="request.subject" type="text" label="Firma:" required="true" />
<item name="request.description" type="textarea" label="Anfrage:" />
</imixs-form-section>
<imixs-form-section columns="2" label="">
<item name="customer.firstname" type="text" label="Vorname:" />
<item name="customer.lastname" type="text" label="Nachname:" />
<item name="customer.phone1" type="text" label="Telefon:" />
<item name="customer.phone2" type="text" label="Mobile:" />
<item name="customer.email" type="text" label="E-Mail:" />
<item name="customer.internet" type="text" label="Internet:" />
</imixs-form-section>
<imixs-form-section columns="2" label="Wiedervorlage">
<item name="customer.reminder.date" type="date" label="Termin:" />
<item name="customer.lastcontact.date" type="date" label="Letzter persönlicher Kontakt:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Vorschlag E-Mail Antwort" readonly="true" >
<item name="request.response.text" type="custom" path="markdown" />
</imixs-form-section>
</imixs-subform>
<imixs-subform label="Adresse" >
<imixs-form-section columns="4" >
<item name="customer.address" type="text" label="Straße:" />
<item name="customer.zip" type="text" label="PLZ:" />
<item name="custmer.city" type="text" label="Ort:" />
<item name="customer.country" type="custom" path="country" label="Land:" />
<item name="customer.department" type="text" label="Abteilung:" />
</imixs-form-section>
</imixs-subform>
</imixs-form>
]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_X5iIsg" sourceRef="dataObject_0jfMhA" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_PDwxmg"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_J9TrXg" sourceRef="task_sz0cKg" targetRef="event_D00leQ">
<bpmn2:documentation id="documentation_woMiMQ"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:signal id="signal_1" name="org.imixs.ai.workflow.ImixsAIAssistantAdapter"/>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="process_1" id="BPMNPlane_wBZ1iA">
<bpmndi:BPMNShape bpmnElement="participant_STxhdA" id="BPMNShape_F40S0w">
<dc:Bounds height="210.0" width="800.0" x="0.0" y="0.0"/>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_E78zcg">
<bpmndi:BPMNShape bpmnElement="participant_aMKbSA" id="BPMNShape_t6JRBw">
<dc:Bounds height="340.0" width="1330.0" x="80.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_mNgUrw" id="BPMNShape_ytlcMg">
<dc:Bounds height="340.0" width="1300.0" x="110.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_zUD3jQ" id="BPMNShape_cvGU9Q">
<dc:Bounds height="36.0" width="36.0" x="177.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_3U3fqA">
<dc:Bounds height="20.0" width="100.0" x="145.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_6Rvbrg" id="BPMNShape_Tx6tQQ">
<dc:Bounds height="50.0" width="110.0" x="290.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_D00leQ" id="BPMNShape_Ymu9vA">
<dc:Bounds height="36.0" width="36.0" x="1107.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Q3qxiA">
<dc:Bounds height="20.0" width="100.0" x="1075.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_sz0cKg" id="BPMNShape_ZPpE9Q">
<dc:Bounds height="50.0" width="110.0" x="840.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_FrL0EA" id="BPMNShape_beJhIA">
<dc:Bounds height="36.0" width="36.0" x="597.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_dlLiYw">
<dc:Bounds height="20.0" width="100.0" x="565.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_IPSgCg" id="BPMNEdge_1fpCJA" sourceElement="BPMNShape_cvGU9Q" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="213.0" y="275.0"/>
<di:waypoint x="290.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0AMIqg" id="BPMNEdge_TLb2hA" sourceElement="BPMNShape_Tx6tQQ" targetElement="BPMNShape_beJhIA">
<di:waypoint x="400.0" y="275.0"/>
<di:waypoint x="597.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M9MRGw" id="BPMNEdge_8yerTg" sourceElement="BPMNShape_beJhIA" targetElement="BPMNShape_ZPpE9Q">
<di:waypoint x="633.0" y="275.0"/>
<di:waypoint x="840.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_0jfMhA" id="BPMNShape_sxOufg">
<dc:Bounds height="50.0" width="35.0" x="180.0" y="160.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Em4O4Q">
<dc:Bounds height="20.0" width="100.0" x="147.5" y="215.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_X5iIsg" id="BPMNEdge_89BTFw" sourceElement="BPMNShape_sxOufg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="215.0" y="186.0"/>
<di:waypoint x="316.0" y="186.0"/>
<di:waypoint x="316.0" y="250.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_J9TrXg" id="BPMNEdge_uRbDXA" sourceElement="BPMNShape_ZPpE9Q" targetElement="BPMNShape_Ymu9vA">
<di:waypoint x="950.0" y="275.0"/>
<di:waypoint x="1107.0" y="275.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View file

@ -1,507 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:BPMN2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.openbpmn" exporterVersion="1.0.0" targetNamespace="http://open-bpmn.org">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[sales-request-en-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApproverPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value>
<imixs:value><![CDATA[Owner|$owner]]></imixs:value>
<imixs:value><![CDATA[Editor|$editor]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:collaboration id="collaboration_1" name="Default Collaboration">
<bpmn2:participant id="participant_STxhdA" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_aMKbSA" name="Sales Request" processRef="process_4zs0ww">
<bpmn2:documentation id="documentation_awmzgg"/>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_mdKRmQ"/>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_4zs0ww" isExecutable="true" name="Sales Request" processType="Private">
<bpmn2:laneSet id="laneset_YAbhZw" name="Lane Set">
<bpmn2:lane id="lane_mNgUrw" name="Assist">
<bpmn2:documentation id="documentation_2VH0iA"/>
<bpmn2:flowNodeRef>task_6Rvbrg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_zUD3jQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_D00leQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_sz0cKg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_FrL0EA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_0jfMhA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_6m4mpw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_3cHBTA</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="event_zUD3jQ" name="Start">
<bpmn2:documentation id="documentation_q0CQSQ"/>
<bpmn2:outgoing>sequenceFlow_IPSgCg</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="task_6Rvbrg" imixs:processid="1000" name="New Sales Request">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_UU4yNw"/>
<bpmn2:incoming>sequenceFlow_IPSgCg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_0AMIqg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="event_D00leQ" name="End">
<bpmn2:documentation id="documentation_S0FDqg"/>
<bpmn2:incoming>sequenceFlow_J9TrXg</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_IPSgCg" sourceRef="event_zUD3jQ" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_kH0gZQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_0AMIqg" sourceRef="task_6Rvbrg" targetRef="event_FrL0EA">
<bpmn2:documentation id="documentation_t4zfjw"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_sz0cKg" imixs:processid="1100" name="Confirmation sent">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_pm2R1w"/>
<bpmn2:incoming>sequenceFlow_02i9iQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_M9MRGw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_J9TrXg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_FrL0EA" imixs:activityid="20" name="Send E-Mail Confrimation">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<validation name="required">false</validation>
<imixs-ai name="ASSIST">
<debug>true</debug>
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<result-item>request.response.text</result-item>
</imixs-ai>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_lz2ljQ"/>
<bpmn2:incoming>sequenceFlow_0AMIqg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_M9MRGw</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_V0oOhw" signalRef="signal_1"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_M9MRGw" sourceRef="event_FrL0EA" targetRef="task_sz0cKg">
<bpmn2:documentation id="documentation_mqOMag"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_0jfMhA" imixs:datatype="form-data" name="Form">
<bpmn2:documentation id="documentation_KIcv5Q"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-subform label="Allgemein">
<imixs-form-section columns="1" >
<item name="request.subject" type="text" label="Firma:" required="true" />
<item name="request.description" type="textarea" label="Anfrage:" />
</imixs-form-section>
<imixs-form-section columns="2" label="">
<item name="customer.firstname" type="text" label="Vorname:" />
<item name="customer.lastname" type="text" label="Nachname:" />
<item name="customer.phone1" type="text" label="Telefon:" />
<item name="customer.phone2" type="text" label="Mobile:" />
<item name="customer.email" type="text" label="E-Mail:" />
<item name="customer.internet" type="text" label="Internet:" />
</imixs-form-section>
<imixs-form-section columns="2" label="Wiedervorlage">
<item name="customer.reminder.date" type="date" label="Termin:" />
<item name="customer.lastcontact.date" type="date" label="Letzter persönlicher Kontakt:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Vorschlag E-Mail Antwort" readonly="true" >
<item name="request.response.text" type="custom" path="markdown" />
</imixs-form-section>
</imixs-subform>
<imixs-subform label="Adresse" >
<imixs-form-section columns="4" >
<item name="customer.address" type="text" label="Straße:" />
<item name="customer.zip" type="text" label="PLZ:" />
<item name="custmer.city" type="text" label="Ort:" />
<item name="customer.country" type="custom" path="country" label="Land:" />
<item name="customer.department" type="text" label="Abteilung:" />
</imixs-form-section>
</imixs-subform>
</imixs-form>
]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_X5iIsg" sourceRef="dataObject_0jfMhA" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_PDwxmg"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_J9TrXg" sourceRef="task_sz0cKg" targetRef="event_D00leQ">
<bpmn2:documentation id="documentation_woMiMQ"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_6m4mpw" imixs:datatype="prompt-data" name="What">
<bpmn2:documentation id="documentation_3GuzxA"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt role="system"><![CDATA[
# KI-Vertriebsassistent für Imixs-Office-Workflow
## Deine Rolle
Du bist Vertriebsleiter der Imixs Software Solutions GmbH. Deine Aufgabe ist es unsere Software Lösung "Imixs-Office-Workflow" an Neukunden und Interessenten zu verkaufen. Das beinhaltet die Kommunikation mit dem Kunden bei einem ersten Kontakt sowie die laufende Kommunikation bis zum Vertragsabschluss.
## Verkaufsziele
Bis zu einem erfolgreichen Vertragsabschluss können folgende Teilziele erreicht werden:
- Den Kunden mit grundlegenden Informationen über unsere Lösung zu versorgen um sein Interesse zu wecken
- Den Kunden zu einer Webkonferenz einladen damit wir ihm die Vorteile unserer Lösung anhand einer Demo live zeigen können
- Das Nachfassen um den Kontakt aufrecht zu erhalten
- Der Vertragsabschluss
## Kommunikationsstil
Du bist stets freundlich aber auch bestimmt und zeigst dem Kunden die vielfältigen Vorteile unserer Lösung "Imixs-Office-Workflow" auf. Beginne Gespräche immer mit einer Bedarfsanalyse und höre aktiv zu.
## Über Imixs-Office-Workflow
### Die Plattform
Imixs-Office-Workflow ist eine moderne Low-Code Business Process Management Plattform, die auf BPMN 2.0 basiert. Die Lösung ermöglicht es Unternehmen, ihre Geschäftsprozesse ohne Programmierkenntnisse zu digitalisieren und zu automatisieren.
### Kernvorteile
- **Low-Code-Ansatz**: Schnelle Umsetzung ohne Programmierkenntnisse erforderlich
- **BPMN 2.0 Standard**: Branchenunabhängige, standardisierte Prozessmodellierung
- **Sofort einsetzbar**: In allen Unternehmensbereichen anwendbar
- **DSGVO-konform**: Höchste Datenschutz- und Datensicherheitsstandards
- **KI-Integration**: Verantwortungsvoller KI-Einsatz im Rahmen des EU AI Acts
- **System-Integration**: Nahtlose Anbindung an bestehende IT-Systeme
### Haupteinsatzbereiche
- **Auftragsverwaltung**: Angebote, Bestellungen, Rechnungsausgang, Mahnwesen
- **Controlling**: Rechnungseingang, Rechnungsprüfung, Einkauf, BANF, Investitionen
- **Projektmanagement**: Aufgabenmanagement, Zeiterfassung, Vertragsmanagement
- **Qualitätsmanagement**: Arbeitsanweisungen, Ticket Management, ISO-Zertifizierung, Reklamationen
- **Dokumentenmanagement**: DMS, Posteingang, Rechnungseingang, Ablage, Kategorisierung, Archivierung, OCR
- **Reporting & BI**: Business Intelligence, Auswertungen, Analysen, Qualitätsmanagement
## Unser umfassendes Servicekonzept
### Full-Service-Ansatz
Wir bieten unseren Kunden ein komplettes Servicepaket, das sie von der ersten Analyse bis zum laufenden Betrieb begleitet:
#### 1. Prozessanalyse & Beratung
- Individuelle Analyse bestehender Arbeitsabläufe
- Identifikation von Digitalisierungspotenzialen
- Strategische Digitalisierungsberatung
- Maßgeschneiderte Lösungskonzepte
#### 2. Prozessmodellierung & Implementierung
- BPMN 2.0-basierte Prozessmodellierung
- Konfiguration der Imixs-Office-Workflow Plattform
- Anpassung an spezifische Unternehmensanforderungen
- Umfassende Tests und Qualitätssicherung
#### 3. System-Integration
- **Nahtlose Integration** in bestehende IT-Landschaften
- Anbindung an ERP-Systeme, CRM-Systeme, Datenbanken
- API-basierte Schnittstellen zu Drittsystemen
- Migration bestehender Daten und Prozesse
#### 4. Plattform-Betrieb & Support
- Hosting und technischer Betrieb der Plattform
- Kontinuierliche Wartung und Updates
- 24/7 Support und Monitoring
- Backup- und Disaster-Recovery-Services
#### 5. Schulung & Change Management
- Anwender-Schulungen für alle Beteiligten
- Train-the-Trainer Programme
- Change Management Begleitung
- Kontinuierliche Weiterbildungsangebote
### Unser Mehrwert
- **Schneller Start**: Von der Analyse bis zur produktiven Nutzung in wenigen Wochen
- **Keine IT-Kenntnisse erforderlich**: Wir übernehmen die komplette technische Umsetzung
- **Minimales Risiko**: Bewährte Technologie und erfahrenes Team
- **Maximale Integration**: Ihre bestehenden Systeme bleiben erhalten und werden optimal eingebunden
## Zielgruppe
Kleine und mittelständische Unternehmen, die ihre Geschäftsprozesse digitalisieren möchten, aber nicht über umfassende IT-Kenntnisse verfügen oder keine teuren Individuallösungen benötigen.
## Gesprächsführung
### Einstieg
- Beginne immer mit einer Bedarfsanalyse: "In welchen Bereichen sehen Sie aktuell die größten Herausforderungen bei Ihren Geschäftsprozessen?"
- Höre aktiv zu und stelle gezielte Nachfragen
- Identifiziere konkrete Schmerzpunkte
### Argumentation
- Fokussiere auf konkrete Schmerzpunkte: Zeitaufwand, manuelle Prozesse, fehlende Transparenz, Medienbrüche
- Zeige branchenspezifische Anwendungsfälle auf
- Betone unseren Full-Service-Ansatz als Alleinstellungsmerkmal
- Verwende konkrete Beispiele aus den Einsatzbereichen
- Stelle die System-Integration als wichtigen Vorteil heraus
### Nutzenargumentation
- **Effizienzsteigerung**: Automatisierte Prozesse sparen Zeit und Ressourcen
- **Transparenz**: Vollständige Nachverfolgbarkeit aller Prozesse
- **Compliance**: DSGVO-konforme und rechtssichere Prozessabwicklung
- **Skalierbarkeit**: Lösung wächst mit dem Unternehmen mit
- **ROI**: Schnelle Amortisation durch Effizienzgewinne
## Einwandbehandlung
### Häufige Einwände und Antworten
- **"Zu komplex für unser kleines Unternehmen"**
→ Betone Low-Code-Ansatz und unseren Full-Service: "Genau dafür sind wir da - Sie müssen sich um nichts kümmern"
- **"Zu teuer"**
→ Fokus auf ROI: "Welche Kosten entstehen Ihnen durch ineffiziente manuelle Prozesse?"
- **"Haben bereits eine Lösung"**
→ Integration hervorheben: "Wir ersetzen nicht, sondern integrieren und optimieren"
- **"Brauchen individuelle Lösung"**
→ BPMN-Standard: "BPMN ermöglicht maximale Anpassung an Ihre spezifischen Anforderungen"
- **"Keine IT-Ressourcen"**
→ Full-Service betonen: "Das ist kein Problem - wir übernehmen Analyse, Umsetzung und Betrieb komplett"
- **"Angst vor Systemausfall"**
→ Hosting und Support: "24/7 Monitoring und professioneller Betrieb sorgen für maximale Verfügbarkeit"
## Call-to-Actions
- Einladung zu einer unverbindlichen Prozessanalyse
- Demo-Termin für eine Live-Präsentation
- Workshop zur Identifikation von Digitalisierungspotenzialen
- Pilotprojekt für einen ersten Prozess
]]]]><![CDATA[>
</prompt>
</PromptDefinition>]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_DGdajg" sourceRef="dataObject_6m4mpw" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_b0naDw"/>
</bpmn2:association>
<bpmn2:dataObject id="dataObject_3cHBTA" imixs:datatype="prompt-data" name="How">
<bpmn2:documentation id="documentation_wYgnLw"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt role="user"><![CDATA[
## AKTUELLE AUFGABE: <itemvalue>$workflowstatus</itemvalue>
Du befindest dich jetzt im Task "<itemvalue>$event.name</itemvalue>" des Prozesses.
Deine Aufgabe ist es, basierend auf der nachfolgenden Kundenanfrage eine professionelle Antwort-E-Mail zu verfassen, die folgende Ziele verfolgt:
1. Interesse des Kunden bestätigen und verstärken
2. Einen konkreten Demo-Termin vorschlagen
3. Den Mehrwert einer Live-Demonstration hervorheben
4. Vertrauen aufbauen durch Kompetenz und Service-Orientierung
## E-Mail Struktur
### Betreff
Erstelle einen ansprechenden, personalisierten Betreff der Neugier weckt:
- Bezug zur Kundenanfrage
- Benefit-orientiert
- Handlungsaufforderung
**Beispiele:**
- "Ihre Prozessoptimierung bei [Firmenname] - Live-Demo vereinbaren?"
- "So digitalisieren Sie [spezifischer Prozess] in 3 Wochen - Demo-Termin?"
### Anrede
- Persönlich und angemessen
- Bei Unklarheit "Sehr geehrte Damen und Herren"
### Einleitung (2-3 Sätze)
- Dank für die Anfrage
- Bestätigung des Verständnisses für die Herausforderung
- Positive Einschätzung der Machbarkeit
### Hauptteil - Problem-Lösung-Nutzen
**1. Problem-Verständnis demonstrieren:**
- Spiegle die vom Kunden genannten Herausforderungen wider
- Zeige Verständnis für die Branche/Situation
**2. Lösungsansatz skizzieren:**
- Konkrete Anwendungsfälle für ihren Bereich
- Verweis auf ähnliche erfolgreiche Projekte
- Betonung des Full-Service-Ansatzes
**3. Demo-Mehrwert herausstellen:**
- "Live erleben statt nur hören"
- Individuelle Anpassung der Demo an ihre Prozesse
- Sofortige Beantwortung ihrer spezifischen Fragen
### Call-to-Action - Terminvorschlag
**Konkrete Terminoptionen anbieten:**
- 2-3 spezifische Zeitslots in den nächsten 7-10 Tagen
- Dauer angeben (45-60 Minuten)
- Online-Meeting erwähnen (flexibel und zeitsparend)
**Beispiel:**
"Ich schlage Ihnen gerne folgende Termine für eine 45-minütige Online-Demo vor:
- Dienstag, [Datum] um 14:00 Uhr
- Donnerstag, [Datum] um 10:00 Uhr
- Freitag, [Datum] um 15:00 Uhr"
### Zusätzliche Services erwähnen
- Kostenlose Prozessanalyse
- Unverbindliche Machbarkeitsstudie
- Referenzkunden aus der Branche
### Schluss
- Freundlicher, aber bestimmter Ton
- Verfügbarkeit für Rückfragen
- Professionelle Grußformel
## Ton und Stil
- **Professionell aber zugänglich**
- **Nutzen-orientiert statt feature-lastig**
- **Vertrauensbildend durch Kompetenz**
- **Handlungsorientiert aber nicht aufdringlich**
- **Persönlich aber nicht zu familiär**
## Wichtige Elemente
- Immer Bezug zur ursprünglichen Anfrage
- Branchenspezifische Beispiele wenn möglich
- Betonung der System-Integration
- Verweis auf den Full-Service-Ansatz
- Zeitnahe Terminvorschläge
- Klare nächste Schritte
## Was zu vermeiden ist
- Generische Massenantworten
- Zu technische Details
- Zu lange E-Mails (max. 200 Wörter)
- Zu aggressive Verkaufssprache
- Vage Terminvorschläge ("nächste Woche")
## Variablen für Personalisierung
Die E-Mail soll folgende Informationen aus der Kundenanfrage verwenden:
- `{FIRMENNAME}` - Name des Unternehmens
- `{ANSPRECHPARTNER}` - Name der Kontaktperson
- `{BRANCHE}` - Branche des Unternehmens
- `{HERAUSFORDERUNG}` - Spezifische genannte Probleme
- `{PROZESSBEREICH}` - Relevante Einsatzbereiche
- `{ZEITRAHMEN}` - Gewünschter Umsetzungszeitraum (falls genannt)
## Erfolgsmessung
Die generierte E-Mail ist erfolgreich, wenn sie:
- Professionell und fehlerfrei ist
- Konkrete nächste Schritte definiert
- Den Mehrwert einer Demo klar kommuniziert
- Vertrauen in unsere Kompetenz aufbaut
- Eine hohe Antwortwahrscheinlichkeit hat
# Kunden Anfrage:
Firma: <itemvalue>request.subject</itemvalue>
Vorname: <itemvalue>customer.firstname</itemvalue>
Nachname: <itemvalue>customer.lastname</itemvalue>
## Grund der Anfrage:
<itemvalue>request.description</itemvalue>
]]]]><![CDATA[>
</prompt>
</PromptDefinition>]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_iB96Yg" sourceRef="dataObject_3cHBTA" targetRef="event_FrL0EA">
<bpmn2:documentation id="documentation_g0te0Q"/>
</bpmn2:association>
</bpmn2:process>
<bpmn2:signal id="signal_1" name="org.imixs.ai.workflow.ImixsAIAssistantAdapter"/>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="process_1" id="BPMNPlane_wBZ1iA">
<bpmndi:BPMNShape bpmnElement="participant_STxhdA" id="BPMNShape_F40S0w">
<dc:Bounds height="210.0" width="800.0" x="0.0" y="0.0"/>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_E78zcg">
<bpmndi:BPMNShape bpmnElement="participant_aMKbSA" id="BPMNShape_t6JRBw">
<dc:Bounds height="340.0" width="1330.0" x="80.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_mNgUrw" id="BPMNShape_ytlcMg">
<dc:Bounds height="340.0" width="1300.0" x="110.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_zUD3jQ" id="BPMNShape_cvGU9Q">
<dc:Bounds height="36.0" width="36.0" x="177.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_3U3fqA">
<dc:Bounds height="20.0" width="100.0" x="145.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_6Rvbrg" id="BPMNShape_Tx6tQQ">
<dc:Bounds height="50.0" width="110.0" x="290.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_D00leQ" id="BPMNShape_Ymu9vA">
<dc:Bounds height="36.0" width="36.0" x="1107.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Q3qxiA">
<dc:Bounds height="20.0" width="100.0" x="1075.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_sz0cKg" id="BPMNShape_ZPpE9Q">
<dc:Bounds height="50.0" width="110.0" x="840.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_FrL0EA" id="BPMNShape_beJhIA">
<dc:Bounds height="36.0" width="36.0" x="597.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_dlLiYw">
<dc:Bounds height="20.0" width="100.0" x="565.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataObject_6m4mpw" id="BPMNShape_yfVFKg">
<dc:Bounds height="50.0" width="35.0" x="289.5" y="347.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_JrhJbw">
<dc:Bounds height="20.0" width="100.0" x="257.0" y="402.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataObject_3cHBTA" id="BPMNShape_N0J0Qw">
<dc:Bounds height="50.0" width="35.0" x="600.0" y="350.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_UUXWCg">
<dc:Bounds height="20.0" width="100.0" x="567.5" y="405.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_IPSgCg" id="BPMNEdge_1fpCJA" sourceElement="BPMNShape_cvGU9Q" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="213.0" y="275.0"/>
<di:waypoint x="290.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0AMIqg" id="BPMNEdge_TLb2hA" sourceElement="BPMNShape_Tx6tQQ" targetElement="BPMNShape_beJhIA">
<di:waypoint x="400.0" y="275.0"/>
<di:waypoint x="597.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M9MRGw" id="BPMNEdge_8yerTg" sourceElement="BPMNShape_beJhIA" targetElement="BPMNShape_ZPpE9Q">
<di:waypoint x="633.0" y="275.0"/>
<di:waypoint x="840.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_0jfMhA" id="BPMNShape_sxOufg">
<dc:Bounds height="50.0" width="35.0" x="180.0" y="160.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Em4O4Q">
<dc:Bounds height="20.0" width="100.0" x="147.5" y="215.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_X5iIsg" id="BPMNEdge_89BTFw" sourceElement="BPMNShape_sxOufg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="215.0" y="186.0"/>
<di:waypoint x="316.0" y="186.0"/>
<di:waypoint x="316.0" y="250.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_J9TrXg" id="BPMNEdge_uRbDXA" sourceElement="BPMNShape_ZPpE9Q" targetElement="BPMNShape_Ymu9vA">
<di:waypoint x="950.0" y="275.0"/>
<di:waypoint x="1107.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_DGdajg" id="BPMNEdge_XHS3Fw" sourceElement="BPMNShape_yfVFKg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="307.0" y="347.0"/>
<di:waypoint x="307.0" y="324.0"/>
<di:waypoint x="345.0" y="324.0"/>
<di:waypoint x="345.0" y="300.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_iB96Yg" id="BPMNEdge_up8OmA" sourceElement="BPMNShape_N0J0Qw" targetElement="BPMNShape_beJhIA">
<di:waypoint x="618.0" y="350.0"/>
<di:waypoint x="618.0" y="322.0"/>
<di:waypoint x="615.0" y="322.0"/>
<di:waypoint x="615.0" y="293.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View file

@ -1,213 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:BPMN2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.openbpmn" exporterVersion="1.0.0" targetNamespace="http://open-bpmn.org">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[basic-de-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApproverPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value>
<imixs:value><![CDATA[Owner|$owner]]></imixs:value>
<imixs:value><![CDATA[Editor|$editor]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:collaboration id="collaboration_1" name="Default Collaboration">
<bpmn2:participant id="participant_STxhdA" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_aMKbSA" name="Request" processRef="process_4zs0ww">
<bpmn2:documentation id="documentation_awmzgg"/>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_mdKRmQ"/>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_4zs0ww" isExecutable="true" name="Request" processType="Private">
<bpmn2:laneSet id="laneset_YAbhZw" name="Lane Set">
<bpmn2:lane id="lane_mNgUrw" name="Assist">
<bpmn2:documentation id="documentation_2VH0iA"/>
<bpmn2:flowNodeRef>task_6Rvbrg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_zUD3jQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_D00leQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_sz0cKg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_FrL0EA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_0jfMhA</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="event_zUD3jQ" name="Start">
<bpmn2:documentation id="documentation_q0CQSQ"/>
<bpmn2:outgoing>sequenceFlow_IPSgCg</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="task_6Rvbrg" imixs:processid="1000" name="Task 1">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_UU4yNw"/>
<bpmn2:incoming>sequenceFlow_IPSgCg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_0AMIqg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="event_D00leQ" name="End">
<bpmn2:documentation id="documentation_S0FDqg"/>
<bpmn2:incoming>sequenceFlow_J9TrXg</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_IPSgCg" sourceRef="event_zUD3jQ" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_kH0gZQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_0AMIqg" sourceRef="task_6Rvbrg" targetRef="event_FrL0EA">
<bpmn2:documentation id="documentation_t4zfjw"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_sz0cKg" imixs:processid="1100" name="Task 2">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_pm2R1w"/>
<bpmn2:incoming>sequenceFlow_02i9iQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_M9MRGw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_J9TrXg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_FrL0EA" imixs:activityid="20" name="Submit">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<validation name="required">false</validation>
<imixs-ai name="ASSIST">
<debug>true</debug>
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<result-item>request.response.text</result-item>
</imixs-ai>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_lz2ljQ"/>
<bpmn2:incoming>sequenceFlow_0AMIqg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_M9MRGw</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_V0oOhw" signalRef="signal_1"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_M9MRGw" sourceRef="event_FrL0EA" targetRef="task_sz0cKg">
<bpmn2:documentation id="documentation_mqOMag"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_0jfMhA" imixs:datatype="form-data" name="Form">
<bpmn2:documentation id="documentation_KIcv5Q"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-subform label="Allgemein">
<imixs-form-section columns="1" >
<item name="request.subject" type="text" label="Firma:" required="true" />
<item name="request.description" type="textarea" label="Anfrage:" />
</imixs-form-section>
<imixs-form-section columns="2" label="">
<item name="customer.firstname" type="text" label="Vorname:" />
<item name="customer.lastname" type="text" label="Nachname:" />
<item name="customer.phone1" type="text" label="Telefon:" />
<item name="customer.phone2" type="text" label="Mobile:" />
<item name="customer.email" type="text" label="E-Mail:" />
<item name="customer.internet" type="text" label="Internet:" />
</imixs-form-section>
<imixs-form-section columns="2" label="Wiedervorlage">
<item name="customer.reminder.date" type="date" label="Termin:" />
<item name="customer.lastcontact.date" type="date" label="Letzter persönlicher Kontakt:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Vorschlag E-Mail Antwort" readonly="true" >
<item name="request.response.text" type="custom" path="markdown" />
</imixs-form-section>
</imixs-subform>
<imixs-subform label="Adresse" >
<imixs-form-section columns="4" >
<item name="customer.address" type="text" label="Straße:" />
<item name="customer.zip" type="text" label="PLZ:" />
<item name="custmer.city" type="text" label="Ort:" />
<item name="customer.country" type="custom" path="country" label="Land:" />
<item name="customer.department" type="text" label="Abteilung:" />
</imixs-form-section>
</imixs-subform>
</imixs-form>
]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_X5iIsg" sourceRef="dataObject_0jfMhA" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_PDwxmg"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_J9TrXg" sourceRef="task_sz0cKg" targetRef="event_D00leQ">
<bpmn2:documentation id="documentation_woMiMQ"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:signal id="signal_1" name="org.imixs.ai.workflow.ImixsAIAssistantAdapter"/>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="process_1" id="BPMNPlane_wBZ1iA">
<bpmndi:BPMNShape bpmnElement="participant_STxhdA" id="BPMNShape_F40S0w">
<dc:Bounds height="210.0" width="800.0" x="0.0" y="0.0"/>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_E78zcg">
<bpmndi:BPMNShape bpmnElement="participant_aMKbSA" id="BPMNShape_t6JRBw">
<dc:Bounds height="340.0" width="1330.0" x="80.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_mNgUrw" id="BPMNShape_ytlcMg">
<dc:Bounds height="340.0" width="1300.0" x="110.0" y="130.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_zUD3jQ" id="BPMNShape_cvGU9Q">
<dc:Bounds height="36.0" width="36.0" x="177.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_3U3fqA">
<dc:Bounds height="20.0" width="100.0" x="145.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_6Rvbrg" id="BPMNShape_Tx6tQQ">
<dc:Bounds height="50.0" width="110.0" x="290.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_D00leQ" id="BPMNShape_Ymu9vA">
<dc:Bounds height="36.0" width="36.0" x="1107.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Q3qxiA">
<dc:Bounds height="20.0" width="100.0" x="1075.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_sz0cKg" id="BPMNShape_ZPpE9Q">
<dc:Bounds height="50.0" width="110.0" x="840.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_FrL0EA" id="BPMNShape_beJhIA">
<dc:Bounds height="36.0" width="36.0" x="597.0" y="257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_dlLiYw">
<dc:Bounds height="20.0" width="100.0" x="565.0" y="296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_IPSgCg" id="BPMNEdge_1fpCJA" sourceElement="BPMNShape_cvGU9Q" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="213.0" y="275.0"/>
<di:waypoint x="290.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0AMIqg" id="BPMNEdge_TLb2hA" sourceElement="BPMNShape_Tx6tQQ" targetElement="BPMNShape_beJhIA">
<di:waypoint x="400.0" y="275.0"/>
<di:waypoint x="597.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M9MRGw" id="BPMNEdge_8yerTg" sourceElement="BPMNShape_beJhIA" targetElement="BPMNShape_ZPpE9Q">
<di:waypoint x="633.0" y="275.0"/>
<di:waypoint x="840.0" y="275.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_0jfMhA" id="BPMNShape_sxOufg">
<dc:Bounds height="50.0" width="35.0" x="180.0" y="160.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Em4O4Q">
<dc:Bounds height="20.0" width="100.0" x="147.5" y="215.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_X5iIsg" id="BPMNEdge_89BTFw" sourceElement="BPMNShape_sxOufg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="215.0" y="186.0"/>
<di:waypoint x="316.0" y="186.0"/>
<di:waypoint x="316.0" y="250.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_J9TrXg" id="BPMNEdge_uRbDXA" sourceElement="BPMNShape_ZPpE9Q" targetElement="BPMNShape_Ymu9vA">
<di:waypoint x="950.0" y="275.0"/>
<di:waypoint x="1107.0" y="275.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,598 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- origin at X=0.0 Y=0.0 --><bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:ext="http://org.eclipse.bpmn2/ext" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.eclipse.bpmn2.modeler.core" exporterVersion="1.5.4.RC1-v20220528-0836-B1" id="Definitions_1" targetNamespace="http://www.imixs.org/bpmn2">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[zahlungseingang-de-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Ersteller|namCreator]]></imixs:value>
<imixs:value><![CDATA[Aktueller Bearbeiter|namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[Eigentümer|namowner]]></imixs:value>
<imixs:value><![CDATA[Prozess-Verantwortliche|namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[Prozess-Team|namprocessteam]]></imixs:value>
<imixs:value><![CDATA[Prozess-Assistenz|namprocessassist]]></imixs:value>
<imixs:value><![CDATA[Bereichs-Verantwortliche|namspacemanager]]></imixs:value>
<imixs:value><![CDATA[Bereichs-Team|namspaceteam]]></imixs:value>
<imixs:value><![CDATA[Bereichs-Assistenz|namspaceassist]]></imixs:value>
<imixs:value><![CDATA[Verantwortlich|namteam]]></imixs:value>
</imixs:item>
<imixs:item name="txttimefieldmapping" type="xs:string">
<imixs:value><![CDATA[Vertragsbeginn|contract.start]]></imixs:value>
<imixs:value><![CDATA[Vertragsende|contract.end]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.office.plugins.WorkitemLinkPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.ProfilePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.CommentPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.team.TeamPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.DeputyPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.LogPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
</imixs:item>
<open-bpmn:auto-align/>
</bpmn2:extensionElements>
<bpmn2:message id="Message_2" name="Html-Header">
<bpmn2:documentation id="Documentation_7"><![CDATA[<html>
<head>
<style type="text/css">
html, body, div, p, h1, h2, h3, ul, ol, span, a, table, td, form, img,
li {
font-family: Arial;
font-style: normal;
font-variant: normal;
font-weight: normal;
font-size: 11pt;
}
body {
margin: 0;
padding: 1em;
min-width: 41em;
}
h2 {
font-size: 12pt;
font-weight: bold;
}
th, td {
border: 1px solid #ccc;
}
th {
font-weight: bold;
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Mueller-Ahlhorn Email</title>
</head>
<body>]]></bpmn2:documentation>
</bpmn2:message>
<bpmn2:message id="Message_4" name="Html-Footer">
<bpmn2:documentation id="Documentation_9"><![CDATA[</body>
</html>]]></bpmn2:documentation>
</bpmn2:message>
<bpmn2:collaboration id="Collaboration_1">
<bpmn2:participant id="Participant_1" name="Zahlungseingang" processRef="Process_1">
<bpmn2:documentation id="documentation_3bSaXQ"/>
</bpmn2:participant>
<bpmn2:participant id="participant_5CZoTA" name="Default Process" processRef="process_2"/>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Zahlungseingang" processType="Private">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Ersteller">
<bpmn2:flowNodeRef>IntermediateCatchEvent_6</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>StartEvent_1</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_4</bpmn2:flowNodeRef>
<bpmn2:documentation id="documentation_6uRMpg"/>
<bpmn2:flowNodeRef>DataObject_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_9</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_10hUxQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_13</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="StartEvent_1" name="Start">
<bpmn2:outgoing>SequenceFlow_18</bpmn2:outgoing>
<bpmn2:documentation id="documentation_P58KBw"/>
</bpmn2:startEvent>
<bpmn2:task id="Task_2" imixs:processid="5000" name="Neu">
<bpmn2:extensionElements>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<itemvalue>txtlastcomment</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Rechnung erhalten]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-upload]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue format="dd.MM.yyyy">payment.date</itemvalue> : <itemvalue>customer.name</itemvalue> (<itemvalue format="#,###,##0.00" locale="de_DE">payment.amount</itemvalue> <itemvalue>payment.currency</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
<imixs:value><![CDATA[namprocessassist]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_2"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_18</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_hvJ59w</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_8</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:dataObject id="DataObject_2" imixs:datatype="form-data" name="Invoice Form">
<bpmn2:documentation id="Documentation_8"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="1">
<item name="invoice.ref"
type="custom" required="true"
path="workitemlink"
options="($workflowgroup:Rechnungsausgang)(type:workitem)($taskid:[5300 TO 5499])"
label="Rechnung:" />
</imixs-form-section>
<imixs-form-section columns="3" label="Zahlungsdaten">
<item name="payment.date" type="date" required="true" label="Datum:" />
<item name="payment.currency" type="selectOneMenu" required="true"
label="Währung:"
options="EUR;USD" />
<item name="payment.amount" type="currency" label="Betrag:" />
</imixs-form-section>
</imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_1"/>
</bpmn2:dataObject>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_13" imixs:activityid="10" name="Speichern">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namCreator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="comment" ignore="true"/>
<workitemlink name="copydata">
<ref>invoice.ref</ref>
<items>(^customer\.),sequencenumber|customer.number</items>
<debug>false</debug>
</workitemlink>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
<imixs:item name="keymailreceiverfields" type="xs:string"/>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_19"><![CDATA[Save and update]]></bpmn2:documentation>
<bpmn2:outgoing>sequenceFlow_hvJ59w</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:task id="Task_4" imixs:processid="5100" name="Gebucht">
<bpmn2:extensionElements>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<itemvalue>txtlastcomment</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Rechnung erhalten]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-upload]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue format="dd.MM.yyyy">payment.date</itemvalue> : <itemvalue>customer.name</itemvalue> (<itemvalue format="#,###,##0.00" locale="de_DE">payment.amount</itemvalue> <itemvalue>payment.currency</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_18"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_19</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_LjFiXQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_Sopi3A</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_6" imixs:activityid="20" name="Buchen">
<bpmn2:extensionElements>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value><![CDATA[Empfangsbestätigung Rechnungseingang]]></imixs:value>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value><![CDATA[Hallo,
die von Ihnen an uns gesendete Eingangsrechung haben wir erhalten.
Die Bearbeitung erfolgt in Kürze.
Bei Fragen wenden Sie sich bitte an info@imixs.com
]]></imixs:value>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5005]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Akzeptieren]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Neue Rechnung angelegt]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_23"><![CDATA[Neue Rechnung anlegen]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_8</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_LjFiXQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_8" sourceRef="Task_2" targetRef="IntermediateCatchEvent_6">
<bpmn2:documentation id="documentation_H5FuOQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="SequenceFlow_18" sourceRef="StartEvent_1" targetRef="Task_2">
<bpmn2:documentation id="documentation_l7AV0w"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_9" imixs:activityid="10" name="Speichern">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namCreator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<poi-copy name="filename"><itemvalue>sequencenumber</itemvalue>.*\.xlsx</poi-copy>
<poi-copy name="copy">
<find>INVOICE_TOTAL</find>
<itemname>invoice.total</itemname>
<type>number</type>
</poi-copy>
<poi-copy name="copy">
<find>INVOICE_CURRENCY</find>
<itemname>invoice.currency</itemname>
</poi-copy>
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
<imixs:item name="keymailreceiverfields" type="xs:string"/>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_46"/>
<bpmn2:outgoing>SequenceFlow_19</bpmn2:outgoing>
<bpmn2:dataOutput id="DataOutput_5" name="Signal_6_Output"/>
<bpmn2:dataOutputAssociation id="DataOutputAssociation_5">
<bpmn2:sourceRef>DataOutput_5</bpmn2:sourceRef>
</bpmn2:dataOutputAssociation>
<bpmn2:outputSet id="OutputSet_6" name="Output Set 6">
<bpmn2:dataOutputRefs>DataOutput_5</bpmn2:dataOutputRefs>
</bpmn2:outputSet>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_19" sourceRef="IntermediateCatchEvent_9" targetRef="Task_4">
<bpmn2:documentation id="documentation_XxCUQw"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="Association_2" sourceRef="DataObject_2" targetRef="Task_2">
<bpmn2:documentation id="documentation_dSQkCA"/>
</bpmn2:association>
<bpmn2:association id="Association_3" sourceRef="DataObject_2" targetRef="Task_4">
<bpmn2:documentation id="documentation_4OkmiA"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_LjFiXQ" sourceRef="IntermediateCatchEvent_6" targetRef="Task_4">
<bpmn2:documentation id="documentation_YsCGAw"/>
</bpmn2:sequenceFlow>
<bpmn2:endEvent id="event_10hUxQ" name="Event-12">
<bpmn2:documentation id="documentation_1EBsgg"/>
<bpmn2:incoming>sequenceFlow_Sopi3A</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_Sopi3A" sourceRef="Task_4" targetRef="event_10hUxQ">
<bpmn2:documentation id="documentation_BPw23w"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_hvJ59w" sourceRef="IntermediateCatchEvent_13" targetRef="Task_2">
<bpmn2:documentation id="documentation_OhlRYw"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:process id="process_2" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_6zIncA"/>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
</bpmn2:process>
<bpmn2:signal id="signal_1" name="com.alexanderlogistics.ZahlungseingangSaldoAdapter"/>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_Process_1">
<bpmndi:BPMNShape bpmnElement="Participant_1" id="BPMNShape_Participant_1" isHorizontal="true">
<dc:Bounds height="570.0" width="1180.0" x="50.0" y="100.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true">
<dc:Bounds height="570.0" width="1150.0" x="80.0" y="100.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_StartEvent_1">
<dc:Bounds height="36.0" width="36.0" x="197.0" y="417.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="167.5" y="456.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_TextAnnotation_1">
<dc:Bounds height="73.0" width="131.0" x="130.0" y="581.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_30">
<dc:Bounds height="67.0" width="119.0" x="136.0" y="581.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_5">
<dc:Bounds height="50.0" width="110.0" x="280.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_33" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="14.0" width="57.0" x="244.0" y="239.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="DataObject_2" id="BPMNShape_DataObject_1">
<dc:Bounds height="50.0" width="35.0" x="470.0" y="290.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_85">
<dc:Bounds height="20.0" width="100.0" x="438.0" y="340.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_13" id="BPMNShape_IntermediateCatchEvent_13">
<dc:Bounds height="36.0" width="36.0" x="317.0" y="507.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_39" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="288.0" y="546.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_4" id="BPMNShape_Task_1">
<dc:Bounds height="50.0" width="110.0" x="740.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_16" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="14.0" width="77.0" x="913.0" y="239.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_6" id="BPMNShape_IntermediateCatchEvent_7">
<dc:Bounds height="36.0" width="36.0" x="487.0" y="417.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_17" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="455.0" y="456.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_9" id="BPMNShape_IntermediateCatchEvent_9">
<dc:Bounds height="36.0" width="36.0" x="777.0" y="507.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_41" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="752.0" y="547.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Message_2" id="BPMNShape_Message_1">
<dc:Bounds height="20.0" width="30.0" x="90.0" y="20.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_9">
<dc:Bounds height="20.0" width="100.0" x="55.0" y="40.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Message_4" id="BPMNShape_Message_2">
<dc:Bounds height="20.0" width="30.0" x="200.0" y="20.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_11">
<dc:Bounds height="20.0" width="100.0" x="165.0" y="40.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="participant_5CZoTA" id="BPMNShape_C5w96Q">
<dc:Bounds height="210.0" width="800.0" x="0.0" y="0.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_10hUxQ" id="BPMNShape_9EaWBg">
<dc:Bounds height="36.0" width="36.0" x="907.0" y="417.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_4UJtyQ">
<dc:Bounds height="20.0" width="100.0" x="875.0" y="456.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_DataObject_1" targetElement="BPMNShape_Task_5">
<di:waypoint x="470.0" y="315.0"/>
<di:waypoint x="335.0" y="315.0"/>
<di:waypoint x="335.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_86"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_8" id="BPMNEdge_SequenceFlow_9" sourceElement="BPMNShape_Task_5" targetElement="BPMNShape_IntermediateCatchEvent_7">
<di:waypoint x="390.0" y="435.0"/>
<di:waypoint x="487.0" y="435.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_19"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_Task_5">
<di:waypoint x="233.0" y="435.0"/>
<di:waypoint x="280.0" y="435.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_37"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_20" sourceElement="BPMNShape_IntermediateCatchEvent_9" targetElement="BPMNShape_Task_1">
<di:waypoint x="795.0" y="507.0"/>
<di:waypoint x="795.0" y="460.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_42"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="Association_3" id="BPMNEdge_Association_3" sourceElement="BPMNShape_DataObject_1" targetElement="BPMNShape_Task_1">
<di:waypoint x="505.0" y="314.0"/>
<di:waypoint x="793.0" y="314.0"/>
<di:waypoint x="793.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_43"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_LjFiXQ" id="BPMNEdge_cSngaw" sourceElement="BPMNShape_IntermediateCatchEvent_7" targetElement="BPMNShape_Task_1">
<di:waypoint x="523.0" y="435.0"/>
<di:waypoint x="740.0" y="435.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_Sopi3A" id="BPMNEdge_jFxUJQ" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_9EaWBg">
<di:waypoint x="850.0" y="435.0"/>
<di:waypoint x="907.0" y="435.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_hvJ59w" id="BPMNEdge_yChyAg" sourceElement="BPMNShape_IntermediateCatchEvent_13" targetElement="BPMNShape_Task_5">
<di:waypoint x="335.0" y="507.0"/>
<di:waypoint x="335.0" y="460.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>
</bpmndi:BPMNLabelStyle>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View file

@ -1,784 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:BPMN2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.openbpmn" exporterVersion="1.0.0" targetNamespace="http://open-bpmn.org">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[framework-agreement-en-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApproverPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value>
<imixs:value><![CDATA[Owner|$owner]]></imixs:value>
<imixs:value><![CDATA[Editor|$editor]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:collaboration id="collaboration_1" name="Default Collaboration">
<bpmn2:participant id="participant_STxhdA" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_aMKbSA" name="Framework Agreement" processRef="process_4zs0ww">
<bpmn2:documentation id="documentation_awmzgg"/>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_mdKRmQ"/>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_4zs0ww" isExecutable="true" name="Framework Agreement" processType="Private">
<bpmn2:laneSet id="laneset_YAbhZw" name="Lane Set">
<bpmn2:lane id="lane_mNgUrw" name="Sales Assist">
<bpmn2:documentation id="documentation_2VH0iA"/>
<bpmn2:flowNodeRef>task_6Rvbrg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_htD1AQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_zUD3jQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_FrL0EA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_06dF0Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_xW07Ug</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_D00leQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_4U3ZjA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_GVwcdA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_0jfMhA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_0TmpPA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_U6M8lw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_JNec8w</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_9G400A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_TToOrg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_aiUjxQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_dLS6Ng</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_ZSh00w" name="Lane 2">
<bpmn2:documentation id="documentation_9IFabg"/>
<bpmn2:flowNodeRef>event_jdHseQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_nmbHpg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_sz0cKg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_BqjeNQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_SY74Ew</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_MOYOPg</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="lane_9iZDDw" name="Lane 3">
<bpmn2:documentation id="documentation_Mq48Fw"/>
<bpmn2:flowNodeRef>task_k5bMQQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_oYIv6A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_0i0F0A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_FUrgaA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_4Bh0BQ</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="event_zUD3jQ" name="Start">
<bpmn2:documentation id="documentation_q0CQSQ"/>
<bpmn2:outgoing>sequenceFlow_IPSgCg</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:task id="task_6Rvbrg" imixs:processid="1000" name="Draft">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_UU4yNw"/>
<bpmn2:incoming>sequenceFlow_cGrlYQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_Bsyk0Q</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_K8TSbQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_0AMIqg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_pQ27gg</bpmn2:incoming>
</bpmn2:task>
<bpmn2:sequenceFlow id="sequenceFlow_IPSgCg" sourceRef="event_zUD3jQ" targetRef="gateway_dLS6Ng">
<bpmn2:documentation id="documentation_kH0gZQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_0AMIqg" sourceRef="task_6Rvbrg" targetRef="gateway_4U3ZjA">
<bpmn2:documentation id="documentation_t4zfjw"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_sz0cKg" imixs:processid="1100" name="Technical Review">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_pm2R1w"/>
<bpmn2:incoming>sequenceFlow_02i9iQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_M9MRGw</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_LsYEUA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_l3F8tQ</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_FrL0EA" imixs:activityid="30" name="Submit for Review">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Submitted for Review]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<wopi-converter name="api-endpoint">http://collabora:9980/lool/convert-to/</wopi-converter>
<wopi-converter name="filename">FA<itemvalue>sequencenumber</itemvalue>.docx</wopi-converter>
<wopi-converter name="convert-to">pdf</wopi-converter>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_lz2ljQ"/>
<bpmn2:incoming>sequenceFlow_t4LJUg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_M9MRGw</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_Fzn39g" signalRef="signal_5"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_M9MRGw" sourceRef="event_FrL0EA" targetRef="task_sz0cKg">
<bpmn2:documentation id="documentation_mqOMag"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_0jfMhA" imixs:datatype="form-data" name="Form">
<bpmn2:documentation id="documentation_KIcv5Q"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-subform label="Allgemein">
<imixs-form-section columns="2" >
<item name="customer.company.name" type="text" label="Company Name:" required="true" />
<item name="customer.company.registration.number" type="text" label="Registration Number:" />
</imixs-form-section>
<imixs-form-section columns="2" label="">
<item name="customer.firstname" type="text" label="Vorname:" />
<item name="customer.lastname" type="text" label="Nachname:" />
<item name="customer.phone1" type="text" label="Telefon:" />
<item name="customer.phone2" type="text" label="Mobile:" />
<item name="customer.email" type="text" label="E-Mail:" />
<item name="customer.internet" type="text" label="Internet:" />
</imixs-form-section>
<imixs-form-section columns="2" label="Contract">
<item name="contract.date" type="date" label="Contract Date:" required="true" />
<item name="contract.date.to" type="date" label="Valid until:" />
</imixs-form-section>
</imixs-subform>
<imixs-subform label="Adresse" >
<imixs-form-section columns="4" >
<item name="customer.address" type="text" label="Street:" />
<item name="customer.zip" type="text" label="ZIP:" />
<item name="custmer.city" type="text" label="City:" />
<item name="customer.country" type="custom" path="country" label="Country:" />
<item name="customer.department" type="text" label="Department:" />
</imixs-form-section>
</imixs-subform>
</imixs-form>
]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_X5iIsg" sourceRef="dataObject_0jfMhA" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_PDwxmg"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_06dF0Q" imixs:activityid="40" name="Reminder">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_qYAxGA"/>
<bpmn2:incoming>association_SDkT5A</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_zGFeYA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_9jTAFA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_9jTAFA" sourceRef="event_06dF0Q" targetRef="event_xW07Ug">
<bpmn2:documentation id="documentation_Mnx6Mg"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_htD1AQ" imixs:processid="1800" name="Active">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_6AHSSA"/>
<bpmn2:incoming>sequenceFlow_M9MRGw</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_usZTeg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_a8V05Q</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_d4R0mQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_9jTAFA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_wVsGfw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_0NV7gg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_xW07Ug" name="E-Mail">
<bpmn2:documentation id="documentation_B5HG2A"/>
<bpmn2:incoming>sequenceFlow_9jTAFA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_usZTeg</bpmn2:outgoing>
<bpmn2:messageEventDefinition id="messageEventDefinition_UYw0dg" messageRef="message_1"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_usZTeg" sourceRef="event_xW07Ug" targetRef="task_htD1AQ">
<bpmn2:documentation id="documentation_H8W0Dg"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_k5bMQQ" imixs:processid="1200" name="Legal Review">
<bpmn2:extensionElements/>
<bpmn2:documentation id="documentation_TDs8jA"/>
<bpmn2:incoming>sequenceFlow_02i9iQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_jHW2yQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_nzcb6g</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_m7e0fA</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="event_D00leQ" name="End">
<bpmn2:documentation id="documentation_S0FDqg"/>
<bpmn2:incoming>sequenceFlow_wVsGfw</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:intermediateCatchEvent id="event_jdHseQ" imixs:activityid="20" name="Submit">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Submitted for Review]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_sWtqhQ"/>
<bpmn2:incoming>sequenceFlow_XB22VQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_jHW2yQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_l3F8tQ" sourceRef="task_sz0cKg" targetRef="gateway_BqjeNQ">
<bpmn2:documentation id="documentation_Q8BnHw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_jHW2yQ" sourceRef="event_jdHseQ" targetRef="task_k5bMQQ">
<bpmn2:documentation id="documentation_xlq07A"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_zGFeYA" sourceRef="gateway_0i0F0A" targetRef="event_06dF0Q">
<bpmn2:documentation id="documentation_6nxkZg"/>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_BqjeNQ" name="">
<bpmn2:documentation id="documentation_ETBOrA"/>
<bpmn2:incoming>sequenceFlow_l3F8tQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_XB22VQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_c30Xwg</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_XB22VQ" sourceRef="gateway_BqjeNQ" targetRef="event_jdHseQ">
<bpmn2:documentation id="documentation_YGtAYg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_nmbHpg" imixs:activityid="30" name="Reject">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Rejected]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_cYD37g"/>
<bpmn2:incoming>sequenceFlow_c30Xwg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_ftfnGg</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_c30Xwg" sourceRef="gateway_BqjeNQ" targetRef="event_nmbHpg">
<bpmn2:documentation id="documentation_LkC8eQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_ftfnGg" sourceRef="event_nmbHpg" targetRef="event_MOYOPg">
<bpmn2:documentation id="documentation_fGrLAA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_wVsGfw" sourceRef="task_htD1AQ" targetRef="event_D00leQ">
<bpmn2:documentation id="documentation_DcvKjg"/>
</bpmn2:sequenceFlow>
<bpmn2:eventBasedGateway gatewayDirection="Diverging" id="gateway_4U3ZjA" name="">
<bpmn2:documentation id="documentation_56W8fQ"/>
<bpmn2:incoming>sequenceFlow_0AMIqg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_t4LJUg</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_SjjEbg</bpmn2:outgoing>
</bpmn2:eventBasedGateway>
<bpmn2:sequenceFlow id="sequenceFlow_t4LJUg" sourceRef="gateway_4U3ZjA" targetRef="event_FrL0EA">
<bpmn2:documentation id="documentation_pyznTA"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_GVwcdA" imixs:activityid="201" name="[Tempate]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<wopi-template>
<source-path><textblock>template-framework-aggreement</textblock></source-path>
<target-name>FA<itemvalue>sequencenumber</itemvalue>.docx</target-name>
<auto-open>true</auto-open>
</wopi-template>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_0EGILw"/>
<bpmn2:incoming>sequenceFlow_jWWfuw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_X9JlJA</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_0se0pQ" signalRef="signal_2"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_jWWfuw" sourceRef="event_9G400A" targetRef="event_GVwcdA">
<bpmn2:documentation id="documentation_joElOw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_0TmpPA" imixs:activityid="10" name="Update">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_Beb0YQ"/>
<bpmn2:outgoing>sequenceFlow_pQ27gg</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_cGrlYQ" sourceRef="gateway_dLS6Ng" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_HLAPyg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_U6M8lw" imixs:activityid="202" name="[Update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<poi-update name="filename">FA<itemvalue>sequencenumber</itemvalue>.docx</poi-update>
<poi-update name="findreplace">
<find>[NUMBER]</find>
<replace><itemvalue>sequencenumber</itemvalue></replace>
</poi-update>
<poi-update name="findreplace">
<find>[DATE]</find>
<replace><itemvalue format="dd.MM.yyyy">contract.date</itemvalue></replace>
</poi-update>
<poi-update name="findreplace">
<find>[Customer Company Name]</find>
<replace><itemvalue>customer.company.name</itemvalue></replace>
</poi-update>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_upi00A"/>
<bpmn2:incoming>sequenceFlow_X9JlJA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_Bsyk0Q</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_5Ob2Fg" signalRef="signal_4"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_X9JlJA" sourceRef="event_GVwcdA" targetRef="event_U6M8lw">
<bpmn2:documentation id="documentation_IrqCqg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_Bsyk0Q" sourceRef="event_U6M8lw" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_ZtzdUg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_JNec8w" imixs:activityid="90" name="Restart">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_VNXvzQ"/>
<bpmn2:incoming>association_SDkT5A</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_0NV7gg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_K8TSbQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_0NV7gg" sourceRef="task_htD1AQ" targetRef="event_JNec8w">
<bpmn2:documentation id="documentation_VmaBkA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_K8TSbQ" sourceRef="event_JNec8w" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_LqSc4g"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_9G400A" imixs:activityid="20" name="Generate Contract">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Generate Template]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_H6Bbag"/>
<bpmn2:incoming>sequenceFlow_SjjEbg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_jWWfuw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_SjjEbg" sourceRef="gateway_4U3ZjA" targetRef="event_9G400A">
<bpmn2:documentation id="documentation_KC6vTQ"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_TToOrg" imixs:activityid="10" name="Update">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_DNt1QQ"/>
<bpmn2:outgoing>sequenceFlow_a8V05Q</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_a8V05Q" sourceRef="event_TToOrg" targetRef="task_htD1AQ">
<bpmn2:documentation id="documentation_PmgPpg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_SY74Ew" imixs:activityid="10" name="Update">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_VNNXQQ"/>
<bpmn2:outgoing>sequenceFlow_LsYEUA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateCatchEvent id="event_oYIv6A" imixs:activityid="10" name="Update">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_jkjs3A"/>
<bpmn2:outgoing>sequenceFlow_nzcb6g</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_nzcb6g" sourceRef="event_oYIv6A" targetRef="task_k5bMQQ">
<bpmn2:documentation id="documentation_rxdazQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_LsYEUA" sourceRef="event_SY74Ew" targetRef="task_sz0cKg">
<bpmn2:documentation id="documentation_RDY6Xw"/>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_0i0F0A" name="">
<bpmn2:documentation id="documentation_mq3gpg"/>
<bpmn2:incoming>sequenceFlow_m7e0fA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_c30Xwg</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_zGFeYA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_GGVfww</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_m7e0fA" sourceRef="task_k5bMQQ" targetRef="gateway_0i0F0A">
<bpmn2:documentation id="documentation_RBh92Q"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_FUrgaA" imixs:activityid="30" name="Reject">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Rejected]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_IA7mKA"/>
<bpmn2:incoming>sequenceFlow_GGVfww</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_JhGZ0w</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_GGVfww" sourceRef="gateway_0i0F0A" targetRef="event_FUrgaA">
<bpmn2:documentation id="documentation_4KaNNg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_JhGZ0w" sourceRef="event_FUrgaA" targetRef="event_4Bh0BQ">
<bpmn2:documentation id="documentation_F40zSg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_aiUjxQ" name="REJECT">
<bpmn2:documentation id="documentation_0AHKhA"/>
<bpmn2:outgoing>sequenceFlow_TGHwmQ</bpmn2:outgoing>
<bpmn2:linkEventDefinition id="linkEventDefinition_qjQkmQ"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateThrowEvent id="event_4Bh0BQ" name="REJECT">
<bpmn2:documentation id="documentation_MsZCPg"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_jKLU0Q"/>
<bpmn2:incoming>sequenceFlow_JhGZ0w</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:intermediateThrowEvent id="event_MOYOPg" name="REJECT">
<bpmn2:documentation id="documentation_rRDDUQ"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_CDl0hQ"/>
<bpmn2:incoming>sequenceFlow_ftfnGg</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_dLS6Ng" name="">
<bpmn2:documentation id="documentation_ZHAmZg"/>
<bpmn2:incoming>sequenceFlow_TGHwmQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_c30Xwg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_IPSgCg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_cGrlYQ</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_TGHwmQ" sourceRef="event_aiUjxQ" targetRef="gateway_dLS6Ng">
<bpmn2:documentation id="documentation_8ezEkw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_pQ27gg" sourceRef="event_0TmpPA" targetRef="task_6Rvbrg">
<bpmn2:documentation id="documentation_e0WYJw"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:signal id="signal_1" name="org.imixs.ai.workflow.ImixsAIAssistantAdapter"/>
<bpmn2:message id="message_1" name="Message 1">
<bpmn2:documentation id="documentation_aEqAaA"/>
</bpmn2:message>
<bpmn2:signal id="signal_2" name="org.imixs.workflow.wopi.WopiTemplateAdapter"/>
<bpmn2:signal id="signal_4" name="org.imixs.workflow.poi.POIFindReplaceAdapter"/>
<bpmn2:signal id="signal_5" name="org.imixs.workflow.wopi.WopiDocumentConverterAdapter"/>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="process_1" id="BPMNPlane_wBZ1iA">
<bpmndi:BPMNShape bpmnElement="participant_STxhdA" id="BPMNShape_F40S0w">
<dc:Bounds height="210.0" width="800.0" x="0.0" y="0.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="message_1" id="BPMNShape_0Cmdiw">
<dc:Bounds height="20.0" width="30.0" x="180.0" y="-80.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_WdYgDQ">
<dc:Bounds height="20.0" width="100.0" x="145.0" y="-55.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_E78zcg">
<bpmndi:BPMNShape bpmnElement="participant_aMKbSA" id="BPMNShape_t6JRBw">
<dc:Bounds height="910.0" width="1970.0" x="150.0" y="-10.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_mNgUrw" id="BPMNShape_ytlcMg">
<dc:Bounds height="430.0" width="1940.0" x="180.0" y="-10.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_zUD3jQ" id="BPMNShape_cvGU9Q">
<dc:Bounds height="36.0" width="36.0" x="247.0" y="267.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_3U3fqA">
<dc:Bounds height="20.0" width="100.0" x="213.0" y="307.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_6Rvbrg" id="BPMNShape_Tx6tQQ">
<dc:Bounds height="50.0" width="110.0" x="480.0" y="260.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_sz0cKg" id="BPMNShape_ZPpE9Q">
<dc:Bounds height="50.0" width="110.0" x="850.0" y="520.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_FrL0EA" id="BPMNShape_beJhIA">
<dc:Bounds height="36.0" width="36.0" x="887.0" y="267.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_dlLiYw">
<dc:Bounds height="20.0" width="100.0" x="855.0" y="306.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_06dF0Q" id="BPMNShape_9NYhlQ">
<dc:Bounds height="36.0" width="36.0" x="1437.0" y="117.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_PLNrYw">
<dc:Bounds height="20.0" width="100.0" x="1405.0" y="156.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_htD1AQ" id="BPMNShape_00qcug">
<dc:Bounds height="50.0" width="110.0" x="1690.0" y="110.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_xW07Ug" id="BPMNShape_iDXcsw">
<dc:Bounds height="36.0" width="36.0" x="1587.0" y="117.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_7FZLNg">
<dc:Bounds height="20.0" width="100.0" x="1555.0" y="156.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_k5bMQQ" id="BPMNShape_QXG11A">
<dc:Bounds height="50.0" width="110.0" x="1090.0" y="700.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_ZSh00w" id="BPMNShape_kQCm0w">
<dc:Bounds height="218.0" width="1940.0" x="180.0" y="420.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_9iZDDw" id="BPMNShape_qm454w">
<dc:Bounds height="262.0" width="1940.0" x="180.0" y="638.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_jdHseQ" id="BPMNShape_prSlJA">
<dc:Bounds height="36.0" width="36.0" x="1127.0" y="527.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_PfGuNQ">
<dc:Bounds height="20.0" width="100.0" x="1095.0" y="566.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_BqjeNQ" id="BPMNShape_MuWNyw">
<dc:Bounds height="50.0" width="50.0" x="1010.0" y="520.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_intEkA">
<dc:Bounds height="20.0" width="100.0" x="985.0" y="573.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_nmbHpg" id="BPMNShape_N6P5ng">
<dc:Bounds height="36.0" width="36.0" x="1017.0" y="437.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_GEd0gQ">
<dc:Bounds height="20.0" width="100.0" x="985.0" y="476.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_GVwcdA" id="BPMNShape_bAaWkA">
<dc:Bounds height="36.0" width="36.0" x="687.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_KkinFg">
<dc:Bounds height="20.0" width="100.0" x="655.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_0TmpPA" id="BPMNShape_Kj90Gw">
<dc:Bounds height="36.0" width="36.0" x="517.0" y="357.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_VUyZpw">
<dc:Bounds height="20.0" width="100.0" x="485.0" y="396.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_U6M8lw" id="BPMNShape_CkFcYg">
<dc:Bounds height="36.0" width="36.0" x="587.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_firQZw">
<dc:Bounds height="20.0" width="100.0" x="555.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_JNec8w" id="BPMNShape_iyhTpg">
<dc:Bounds height="36.0" width="36.0" x="1587.0" y="37.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_0LNjlg">
<dc:Bounds height="20.0" width="100.0" x="1555.0" y="76.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_9G400A" id="BPMNShape_VMy0SQ">
<dc:Bounds height="36.0" width="36.0" x="787.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_I1EH7A">
<dc:Bounds height="20.0" width="100.0" x="755.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_TToOrg" id="BPMNShape_iV8xVg">
<dc:Bounds height="36.0" width="36.0" x="1727.0" y="227.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_OmCnUQ">
<dc:Bounds height="20.0" width="100.0" x="1695.0" y="266.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_SY74Ew" id="BPMNShape_HR8miw">
<dc:Bounds height="36.0" width="36.0" x="757.0" y="527.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_46KxMQ">
<dc:Bounds height="20.0" width="100.0" x="725.0" y="566.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_oYIv6A" id="BPMNShape_H5UcVA">
<dc:Bounds height="36.0" width="36.0" x="1127.0" y="797.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_FFB2RA">
<dc:Bounds height="20.0" width="100.0" x="1095.0" y="836.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_0i0F0A" id="BPMNShape_AsZ90w">
<dc:Bounds height="50.0" width="50.0" x="1270.0" y="700.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_WQ0lqA">
<dc:Bounds height="20.0" width="100.0" x="1245.0" y="753.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_FUrgaA" id="BPMNShape_1wtyUA">
<dc:Bounds height="36.0" width="36.0" x="1277.0" y="797.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_0RzZMA">
<dc:Bounds height="20.0" width="100.0" x="1245.0" y="836.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_4Bh0BQ" id="BPMNShape_l9zgCg">
<dc:Bounds height="36.0" width="36.0" x="1367.0" y="797.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_VFv6Eg">
<dc:Bounds height="20.0" width="100.0" x="1335.0" y="836.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_MOYOPg" id="BPMNShape_670Hwg">
<dc:Bounds height="36.0" width="36.0" x="1127.0" y="437.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_TgsR4Q">
<dc:Bounds height="20.0" width="100.0" x="1095.0" y="476.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_dLS6Ng" id="BPMNShape_ei8RvQ">
<dc:Bounds height="50.0" width="50.0" x="340.0" y="260.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_bjT3bA">
<dc:Bounds height="20.0" width="100.0" x="315.0" y="313.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_IPSgCg" id="BPMNEdge_1fpCJA" sourceElement="BPMNShape_cvGU9Q" targetElement="BPMNShape_ei8RvQ">
<di:waypoint x="283.0" y="285.0"/>
<di:waypoint x="340.0" y="285.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0AMIqg" id="BPMNEdge_TLb2hA" sourceElement="BPMNShape_Tx6tQQ" targetElement="BPMNShape_hbrciQ">
<di:waypoint x="590.0" y="285.0"/>
<di:waypoint x="780.0" y="285.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M9MRGw" id="BPMNEdge_8yerTg" sourceElement="BPMNShape_beJhIA" targetElement="BPMNShape_ZPpE9Q">
<di:waypoint x="905.0" y="303.0"/>
<di:waypoint x="905.0" y="520.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_0jfMhA" id="BPMNShape_sxOufg">
<dc:Bounds height="50.0" width="35.0" x="350.0" y="110.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Em4O4Q">
<dc:Bounds height="20.0" width="100.0" x="317.5" y="165.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_X5iIsg" id="BPMNEdge_89BTFw" sourceElement="BPMNShape_sxOufg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="385.0" y="156.0"/>
<di:waypoint x="507.0" y="156.0"/>
<di:waypoint x="507.0" y="260.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9jTAFA" id="BPMNEdge_jirxxQ" sourceElement="BPMNShape_9NYhlQ" targetElement="BPMNShape_iDXcsw">
<di:waypoint x="1473.0" y="135.0"/>
<di:waypoint x="1587.0" y="135.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_usZTeg" id="BPMNEdge_onrGxg" sourceElement="BPMNShape_iDXcsw" targetElement="BPMNShape_00qcug">
<di:waypoint x="1623.0" y="135.0"/>
<di:waypoint x="1690.0" y="135.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_D00leQ" id="BPMNShape_Ymu9vA">
<dc:Bounds height="36.0" width="36.0" x="1877.0" y="117.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Q3qxiA">
<dc:Bounds height="20.0" width="100.0" x="1845.0" y="156.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_l3F8tQ" id="BPMNEdge_YDRbPA" sourceElement="BPMNShape_ZPpE9Q" targetElement="BPMNShape_MuWNyw">
<di:waypoint x="960.0" y="545.0"/>
<di:waypoint x="1010.0" y="545.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_jHW2yQ" id="BPMNEdge_ZEEVKg" sourceElement="BPMNShape_prSlJA" targetElement="BPMNShape_QXG11A">
<di:waypoint x="1145.0" y="563.0"/>
<di:waypoint x="1145.0" y="607.0"/>
<di:waypoint x="1145.0" y="700.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_zGFeYA" id="BPMNEdge_B702Aw" sourceElement="BPMNShape_AsZ90w" targetElement="BPMNShape_9NYhlQ">
<di:waypoint x="1319.0" y="724.0"/>
<di:waypoint x="1378.0" y="724.0"/>
<di:waypoint x="1378.0" y="135.0"/>
<di:waypoint x="1437.0" y="135.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_XB22VQ" id="BPMNEdge_umlnrQ" sourceElement="BPMNShape_MuWNyw" targetElement="BPMNShape_prSlJA">
<di:waypoint x="1060.0" y="545.0"/>
<di:waypoint x="1127.0" y="545.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_c30Xwg" id="BPMNEdge_DQhbYA" sourceElement="BPMNShape_MuWNyw" targetElement="BPMNShape_N6P5ng">
<di:waypoint x="1035.0" y="520.0"/>
<di:waypoint x="1035.0" y="473.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ftfnGg" id="BPMNEdge_FHJbdg" sourceElement="BPMNShape_N6P5ng" targetElement="BPMNShape_670Hwg">
<di:waypoint x="1053.0" y="455.0"/>
<di:waypoint x="1127.0" y="455.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_wVsGfw" id="BPMNEdge_keb8Iw" sourceElement="BPMNShape_00qcug" targetElement="BPMNShape_Ymu9vA">
<di:waypoint x="1800.0" y="135.0"/>
<di:waypoint x="1877.0" y="135.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_4U3ZjA" id="BPMNShape_hbrciQ">
<dc:Bounds height="50.0" width="50.0" x="780.0" y="260.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_l10vDg">
<dc:Bounds height="20.0" width="100.0" x="755.0" y="313.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_t4LJUg" id="BPMNEdge_EToOWg" sourceElement="BPMNShape_hbrciQ" targetElement="BPMNShape_beJhIA">
<di:waypoint x="830.0" y="285.0"/>
<di:waypoint x="887.0" y="285.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_jWWfuw" id="BPMNEdge_QZwQ1A" sourceElement="BPMNShape_VMy0SQ" targetElement="BPMNShape_bAaWkA">
<di:waypoint x="787.0" y="195.0"/>
<di:waypoint x="723.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_cGrlYQ" id="BPMNEdge_iwPhHw" sourceElement="BPMNShape_ei8RvQ" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="390.0" y="285.0"/>
<di:waypoint x="480.0" y="285.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_X9JlJA" id="BPMNEdge_yiJf9g" sourceElement="BPMNShape_bAaWkA" targetElement="BPMNShape_CkFcYg">
<di:waypoint x="687.0" y="195.0"/>
<di:waypoint x="623.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_Bsyk0Q" id="BPMNEdge_2otTog" sourceElement="BPMNShape_CkFcYg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="587.0" y="195.0"/>
<di:waypoint x="554.0" y="195.0"/>
<di:waypoint x="554.0" y="260.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0NV7gg" id="BPMNEdge_HJQBAQ" sourceElement="BPMNShape_00qcug" targetElement="BPMNShape_iyhTpg">
<di:waypoint x="1746.0" y="110.0"/>
<di:waypoint x="1746.0" y="55.0"/>
<di:waypoint x="1623.0" y="55.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_K8TSbQ" id="BPMNEdge_OKyE0g" sourceElement="BPMNShape_iyhTpg" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="1587.0" y="55.0"/>
<di:waypoint x="536.0" y="55.0"/>
<di:waypoint x="536.0" y="260.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_SjjEbg" id="BPMNEdge_ydgksA" sourceElement="BPMNShape_hbrciQ" targetElement="BPMNShape_VMy0SQ">
<di:waypoint x="805.0" y="260.0"/>
<di:waypoint x="805.0" y="234.0"/>
<di:waypoint x="805.0" y="213.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_a8V05Q" id="BPMNEdge_MWKNEw" sourceElement="BPMNShape_iV8xVg" targetElement="BPMNShape_00qcug">
<di:waypoint x="1745.0" y="227.0"/>
<di:waypoint x="1745.0" y="160.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_nzcb6g" id="BPMNEdge_TT34Tw" sourceElement="BPMNShape_H5UcVA" targetElement="BPMNShape_QXG11A">
<di:waypoint x="1145.0" y="797.0"/>
<di:waypoint x="1145.0" y="750.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_LsYEUA" id="BPMNEdge_kAPpIw" sourceElement="BPMNShape_HR8miw" targetElement="BPMNShape_ZPpE9Q">
<di:waypoint x="793.0" y="545.0"/>
<di:waypoint x="850.0" y="545.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_m7e0fA" id="BPMNEdge_IU6gPQ" sourceElement="BPMNShape_QXG11A" targetElement="BPMNShape_AsZ90w">
<di:waypoint x="1200.0" y="725.0"/>
<di:waypoint x="1270.0" y="725.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_GGVfww" id="BPMNEdge_dv4oDw" sourceElement="BPMNShape_AsZ90w" targetElement="BPMNShape_1wtyUA">
<di:waypoint x="1295.0" y="750.0"/>
<di:waypoint x="1295.0" y="793.0"/>
<di:waypoint x="1295.0" y="797.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_JhGZ0w" id="BPMNEdge_uXEr5Q" sourceElement="BPMNShape_1wtyUA" targetElement="BPMNShape_l9zgCg">
<di:waypoint x="1313.0" y="815.0"/>
<di:waypoint x="1367.0" y="815.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_aiUjxQ" id="BPMNShape_ln6pJQ">
<dc:Bounds height="36.0" width="36.0" x="247.0" y="187.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_TiuRtQ">
<dc:Bounds height="20.0" width="100.0" x="215.0" y="226.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_TGHwmQ" id="BPMNEdge_2smNkg" sourceElement="BPMNShape_ln6pJQ" targetElement="BPMNShape_ei8RvQ">
<di:waypoint x="283.0" y="205.0"/>
<di:waypoint x="366.0" y="205.0"/>
<di:waypoint x="366.0" y="261.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_pQ27gg" id="BPMNEdge_Ebw6Vg" sourceElement="BPMNShape_Kj90Gw" targetElement="BPMNShape_Tx6tQQ">
<di:waypoint x="535.0" y="357.0"/>
<di:waypoint x="535.0" y="310.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt><![CDATA[You are a sales representative. Your task is to respond to incoming inquiries and provide suggestions for offers.
# Instructions for creating the offer:
1. Politely thank the customer for the inquiry and briefly address the customer's concern in the introduction.
2. Choose the most suitable products for the request.
3. **Do not include more than one product per category.** If multiple products are from the same category, pick the one that best fits the request.
4. Create a clear table with the following columns:
- Product
- Quantity
- Price per unit
5. Provide a short, customer-friendly explanation of why each selected product was chosen. Do not refer to products not listed in the final offer.
6. Ensure the table contains only the selected products (one per category).
7. The offer and all explanations should be written in English.
# Customer Request:
<itemvalue>request.description</itemvalue>
# Possible Products
The following products are relevant for the current request:
<for-each-ref item="product.ref">
Product: <itemvalue>product.name</itemvalue>
Category: <itemvalue>product.category</itemvalue> / <itemvalue>product.subcategory</itemvalue>
Price: <itemvalue>product.price</itemvalue> <itemvalue>_currency</itemvalue>
Product Details:
<itemvalue>product.description</itemvalue>
-----------------------------------------------------------------------------
</for-each-ref>
]]>
</prompt>
</PromptDefinition>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,20 +0,0 @@
<imixs-ai name="PROMPT">
<endpoint>https://embeddings.llama.cpp.imixs.com/</endpoint>
<prompt-template>
<PromptDefinition>
<prompt_options>{"n_predict": 2048, "temperature": 0.2, "top_p": 0.9}</prompt_options>
<prompt role="system"><![CDATA[
You are a process analyst. A workflow has just been completed.
Create a brief project insight:
What specifically happened? (Include relevant names from people, companies, products when mentioned.)
- Is there anything unusual or important to remember for the future? (Pay attention to user comments - they often contain important warnings or decisions.)
No general advice. Only project-specific facts and insights. ]]>
</prompt>
<prompt role="user"><![CDATA[
{chronicle}
]]>
</prompt>
</PromptDefinition>
</prompt-template>
<debug>true</debug>
</imixs-ai>

File diff suppressed because it is too large Load diff

View file

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 512, "temperature": 0 }</prompt_options>
<prompt role="system"><![CDATA[
You are an employee in a company. Your job is to check incoming documents and forward them internally to departments and employees.
Assign the document to one of the following categories:
- Invoice - the document is an invoice in which services and goods are invoiced.
- Contract - the document describes contractual agreements.
- Order - if it is a customer purchase order for goods or services.
- Offer - if it is a customer offer for goods or services.
- Complaint - if it is a complaint about our services provided.
Also determine the company name from which this document originates and the language the document is written in.
Note: The company name is the name of the company created this document, not the recipient. The company name is usually at the beginning or end of the invoice document. It is not Imixs!
Output the information as one XML object that has the following structure:
<document>
<document.type>DOCUMENT TYPE<document.type>
<document.company>SENDER NAME<document.company>
<document.language>LANGUAGE<document.language>
</document>
Note: Do not generate any other information instead of the XML object. Do not generate more than one XML Object.
]]>
</prompt>
<prompt role="user"><![CDATA[
<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>
]]>
</prompt>
</PromptDefinition>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt role="system"><![CDATA[
Du bist Sachbearbeiter in einem Unternehmen. Deine Aufgabe ist es, eingehende Vertragsdokumente zu prüfen.
Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags.
- Vertragsgeber
- Vertragsnehmer
- Gegenstand
- Laufzeit
]]>
</prompt>
<prompt role="user"><![CDATA[<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>]]></prompt>
<loglevel>FINE</loglevel>
</PromptDefinition>

View file

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 512, "temperature": 0 }</prompt_options>
<prompt><![CDATA[[INST] You are an employee in a company. Your job is to check incoming documents and forward them internally to departments and employees. [/INST]
<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>
</s>[INST] Assign the document to one of the following categories:
- Invoice - the document is an invoice in which services and goods are invoiced.
- Contract - the document describes contractual agreements.
- Order - if it is a customer purchase order for goods or services.
- Offer - if it is a customer offer for goods or services.
- Complaint - if it is a complaint about our services provided.
Also determine the company name from which this document originates and the language the document is written in.
Note: The company name is the name of the company created this document, not the recipient. The company name is usually at the beginning or end of the invoice document. It is not Imixs!
Output the information as one XML object that has the following structure:
<document>
<document.type>DOCUMENT TYPE<document.type>
<document.company>SENDER NAME<document.company>
<document.language>LANGUAGE<document.language>
</document>
Note: Do not generate any other information instead of the XML object. Do not generate more than one XML Object.
[/INST]
]]>
</prompt>
</PromptDefinition>

View file

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0 }</prompt_options>
<prompt><![CDATA[[INST]You are a clerk at a logistic company. Your task is to check incoming invoices. [/INST]
<itemvalue>invoice.summary</itemvalue>
</s>[INST]Transfer the invoice data into an XML object with the following structure:
<invoice>
<cdtr.name>...</cdtr.name>
<invoice.number>...</invoice.number>
<invoice.date type="date">2024-12-31</invoice.date>
<payment.date type="date">2024-12-31</payment.date>
<invoice.total type="double">1234.00</invoice.total>
<cdtr.iban>...</cdtr.iban>
<cdtr.bic>...</cdtr.bic>
</invoice>
Transfer the individual invoice data to the XML tags, taking into account the following suggestions for mapping:
- Company name ==> "cdtr.name" (the name of the company that issued the invoice document, not the recipient)
- Invoice number ==> "invoice.number"
- Invoice Date ==> "invoice.date"
- Total ==> "invoice.total" (in EUR or if not available in USD or PLN)
- IBAN ==> "cdtr.iban"
- BIC or SWIFT ==> "cdtr.bic"
- Payment date / Due date ==> "payment.date"
Note: Output only the XML object! Don't add explanations or comments. Use only the XML structure specified in this example and do not create any other XML tags. If you don't have data for some fields, leave the corresponding XML tags blank. Format date values (invoice.date, payment.date) into the ISO 8601 format (YYYY-MM-DD). Format numbers and amounts (type="double") according to ISO 4217.
<<EXAMPLES_XML>>
[/INST]
]]>
</prompt>
</PromptDefinition>

View file

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt><![CDATA[[INST]You are a clerk at Imixs Software Solutions GmbH. Your task is to check incoming invoices. [/INST]
<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>
</s>[INST]
Summarize the data from this invoice document:
- Company information
- General Billing data
- Invoice total information
- Payment summary
- Invoice items
The company name is the name of the company that issued the invoice document, not the Imixs Software Solutions GmbH. The company name is usually at the beginning or end of the invoice document.
Summarize the invoice lines in a table.
Use only the default values and do not perform any calculations, summing or changes to these values yourself.
Format numbers and amounts according to ISO 4217
[/INST]
]]>
</prompt>
</PromptDefinition>

View file

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0 }</prompt_options>
<prompt role="system"><![CDATA[
You are a clerk at a logistic company. Your task is to check incoming invoices.
Transfer the invoice data into an XML object with the following structure:
<invoice>
<cdtr.name>...</cdtr.name>
<invoice.number>...</invoice.number>
<invoice.date type="date">2024-12-31</invoice.date>
<payment.date type="date">2024-12-31</payment.date>
<invoice.total type="double">1234.00</invoice.total>
<cdtr.iban>...</cdtr.iban>
<cdtr.bic>...</cdtr.bic>
</invoice>
Transfer the individual invoice data to the XML tags, taking into account the following suggestions for mapping:
- Company name ==> "cdtr.name" (the name of the company that issued the invoice document, not the recipient)
- Invoice number ==> "invoice.number"
- Invoice Date ==> "invoice.date"
- Total ==> "invoice.total" (in EUR or if not available in USD or PLN)
- IBAN ==> "cdtr.iban"
- BIC or SWIFT ==> "cdtr.bic"
- Payment date / Due date ==> "payment.date"
Note: Output only the XML object! Don't add explanations or comments. Use only the XML structure specified in this example and do not create any other XML tags. If you don't have data for some fields, leave the corresponding XML tags blank. Format date values (invoice.date, payment.date) into the ISO 8601 format (YYYY-MM-DD). Format numbers and amounts (type="double") according to ISO 4217.
<<EXAMPLES_XML>>
]]>
</prompt>
<prompt role="user"><![CDATA[<itemvalue>invoice.summary</itemvalue>]]></prompt>
<loglevel>FINE</loglevel>
</PromptDefinition>

View file

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt role="system"><![CDATA[
You are a clerk at Imixs Software Solutions GmbH. Your task is to check incoming invoices.
Summarize the data from this invoice document:
- Company information
- General Billing data
- Invoice total information
- Payment summary
- Invoice items
The company name is the name of the company that issued the invoice document, not the Imixs Software Solutions GmbH. The company name is usually at the beginning or end of the invoice document.
Summarize the invoice lines in a table.
Use only the default values and do not perform any calculations, summing or changes to these values yourself.
Format numbers and amounts according to ISO 4217
]]>
</prompt>
<prompt role="user"><![CDATA[<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>]]></prompt>
<loglevel>FINE</loglevel>
</PromptDefinition>

View file

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt><![CDATA[[INST]You are a clerk at Imixs Software Solutions GmbH. Your task is to compare an incoming invoice with an existing offer. [/INST]
# INVOICE
<itemvalue>invoice.summary</itemvalue>
# OFFER
<workitemref filter="($workflowgroup:Bedarfsmeldung)">offer.summary</workitemref>.
</s>[INST]
If there are discrepancies between the offer positions and the invoice items regarding quantity, price, or description, create a corresponding note.
[/INST]
]]>
</prompt>
</PromptDefinition>

View file

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt role="system"><![CDATA[
You are a clerk at Imixs Software Solutions GmbH. Your task is to check incoming offers.
Summarize the data from this offer document:
- Company information
- General Billing data
- Offer price information
- Payment summary
- Offer items
The company name is the name of the company that issued the invoice document, not the Imixs Software Solutions GmbH. The company name is usually at the beginning or end of the invoice document.
Summarize the offer lines in a table.
Use only the default values and do not perform any calculations, summing or changes to these values yourself.
Format numbers and amounts according to ISO 4217
]]>
</prompt>
<prompt role="system"><![CDATA[<FILECONTEXT>^.+\.([pP][dD][fF])$</FILECONTEXT>]]></prompt>
</PromptDefinition>

View file

@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt role="user"><![CDATA[
## AKTUELLE AUFGABE: <itemvalue>$workflowstatus</itemvalue>
Du befindest dich jetzt im Task "<itemvalue>$event.name</itemvalue>" des Prozesses.
Deine Aufgabe ist es, basierend auf der nachfolgenden Kundenanfrage eine professionelle Antwort-E-Mail zu verfassen, die folgende Ziele verfolgt:
1. Interesse des Kunden bestätigen und verstärken
2. Einen konkreten Demo-Termin vorschlagen
3. Den Mehrwert einer Live-Demonstration hervorheben
4. Vertrauen aufbauen durch Kompetenz und Service-Orientierung
## E-Mail Struktur
### Betreff
Erstelle einen ansprechenden, personalisierten Betreff der Neugier weckt:
- Bezug zur Kundenanfrage
- Benefit-orientiert
- Handlungsaufforderung
**Beispiele:**
- "Ihre Prozessoptimierung bei [Firmenname] - Live-Demo vereinbaren?"
- "So digitalisieren Sie [spezifischer Prozess] in 3 Wochen - Demo-Termin?"
### Anrede
- Persönlich und angemessen
- Bei Unklarheit "Sehr geehrte Damen und Herren"
### Einleitung (2-3 Sätze)
- Dank für die Anfrage
- Bestätigung des Verständnisses für die Herausforderung
- Positive Einschätzung der Machbarkeit
### Hauptteil - Problem-Lösung-Nutzen
**1. Problem-Verständnis demonstrieren:**
- Spiegle die vom Kunden genannten Herausforderungen wider
- Zeige Verständnis für die Branche/Situation
**2. Lösungsansatz skizzieren:**
- Konkrete Anwendungsfälle für ihren Bereich
- Verweis auf ähnliche erfolgreiche Projekte
- Betonung des Full-Service-Ansatzes
**3. Demo-Mehrwert herausstellen:**
- "Live erleben statt nur hören"
- Individuelle Anpassung der Demo an ihre Prozesse
- Sofortige Beantwortung ihrer spezifischen Fragen
### Call-to-Action - Terminvorschlag
**Konkrete Terminoptionen anbieten:**
- 2-3 spezifische Zeitslots in den nächsten 7-10 Tagen
- Dauer angeben (45-60 Minuten)
- Online-Meeting erwähnen (flexibel und zeitsparend)
**Beispiel:**
"Ich schlage Ihnen gerne folgende Termine für eine 45-minütige Online-Demo vor:
- Dienstag, [Datum] um 14:00 Uhr
- Donnerstag, [Datum] um 10:00 Uhr
- Freitag, [Datum] um 15:00 Uhr"
### Zusätzliche Services erwähnen
- Kostenlose Prozessanalyse
- Unverbindliche Machbarkeitsstudie
- Referenzkunden aus der Branche
### Schluss
- Freundlicher, aber bestimmter Ton
- Verfügbarkeit für Rückfragen
- Professionelle Grußformel
## Ton und Stil
- **Professionell aber zugänglich**
- **Nutzen-orientiert statt feature-lastig**
- **Vertrauensbildend durch Kompetenz**
- **Handlungsorientiert aber nicht aufdringlich**
- **Persönlich aber nicht zu familiär**
## Wichtige Elemente
- Immer Bezug zur ursprünglichen Anfrage
- Branchenspezifische Beispiele wenn möglich
- Betonung der System-Integration
- Verweis auf den Full-Service-Ansatz
- Zeitnahe Terminvorschläge
- Klare nächste Schritte
## Was zu vermeiden ist
- Generische Massenantworten
- Zu technische Details
- Zu lange E-Mails (max. 200 Wörter)
- Zu aggressive Verkaufssprache
- Vage Terminvorschläge ("nächste Woche")
## Variablen für Personalisierung
Die E-Mail soll folgende Informationen aus der Kundenanfrage verwenden:
- `{FIRMENNAME}` - Name des Unternehmens
- `{ANSPRECHPARTNER}` - Name der Kontaktperson
- `{BRANCHE}` - Branche des Unternehmens
- `{HERAUSFORDERUNG}` - Spezifische genannte Probleme
- `{PROZESSBEREICH}` - Relevante Einsatzbereiche
- `{ZEITRAHMEN}` - Gewünschter Umsetzungszeitraum (falls genannt)
## Erfolgsmessung
Die generierte E-Mail ist erfolgreich, wenn sie:
- Professionell und fehlerfrei ist
- Konkrete nächste Schritte definiert
- Den Mehrwert einer Demo klar kommuniziert
- Vertrauen in unsere Kompetenz aufbaut
- Eine hohe Antwortwahrscheinlichkeit hat
# Kunden Anfrage:
Firma: <itemvalue>request.subject</itemvalue>
Vorname: <itemvalue>customer.firstname</itemvalue>
Nachname: <itemvalue>customer.lastname</itemvalue>
## Grund der Anfrage:
<itemvalue>request.description</itemvalue>
]]>
</prompt>
</PromptDefinition>

View file

@ -1,10 +0,0 @@
// Boolean expression to check if request date is within the next 7 days
(function() {
const requestDate = workitem.getItemValueDate('request.date');
const now = new Date();
const sevenDaysFromNow = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
return requestDate !== null &&
requestDate !== undefined &&
requestDate.getTime() >= now.getTime() &&
requestDate.getTime() <= sevenDaysFromNow.getTime();
})();

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt role="system"><![CDATA[
# KI-Vertriebsassistent für Imixs-Office-Workflow
## Deine Rolle
Du bist Vertriebsleiter der Imixs Software Solutions GmbH. Deine Aufgabe ist es unsere Software Lösung "Imixs-Office-Workflow" an Neukunden und Interessenten zu verkaufen. Das beinhaltet die Kommunikation mit dem Kunden bei einem ersten Kontakt sowie die laufende Kommunikation bis zum Vertragsabschluss.
## Verkaufsziele
Bis zu einem erfolgreichen Vertragsabschluss können folgende Teilziele erreicht werden:
- Den Kunden mit grundlegenden Informationen über unsere Lösung zu versorgen um sein Interesse zu wecken
- Den Kunden zu einer Webkonferenz einladen damit wir ihm die Vorteile unserer Lösung anhand einer Demo live zeigen können
- Das Nachfassen um den Kontakt aufrecht zu erhalten
- Der Vertragsabschluss
## Kommunikationsstil
Du bist stets freundlich aber auch bestimmt und zeigst dem Kunden die vielfältigen Vorteile unserer Lösung "Imixs-Office-Workflow" auf. Beginne Gespräche immer mit einer Bedarfsanalyse und höre aktiv zu.
## Über Imixs-Office-Workflow
### Die Plattform
Imixs-Office-Workflow ist eine moderne Low-Code Business Process Management Plattform, die auf BPMN 2.0 basiert. Die Lösung ermöglicht es Unternehmen, ihre Geschäftsprozesse ohne Programmierkenntnisse zu digitalisieren und zu automatisieren.
### Kernvorteile
- **Low-Code-Ansatz**: Schnelle Umsetzung ohne Programmierkenntnisse erforderlich
- **BPMN 2.0 Standard**: Branchenunabhängige, standardisierte Prozessmodellierung
- **Sofort einsetzbar**: In allen Unternehmensbereichen anwendbar
- **DSGVO-konform**: Höchste Datenschutz- und Datensicherheitsstandards
- **KI-Integration**: Verantwortungsvoller KI-Einsatz im Rahmen des EU AI Acts
- **System-Integration**: Nahtlose Anbindung an bestehende IT-Systeme
### Haupteinsatzbereiche
- **Auftragsverwaltung**: Angebote, Bestellungen, Rechnungsausgang, Mahnwesen
- **Controlling**: Rechnungseingang, Rechnungsprüfung, Einkauf, BANF, Investitionen
- **Projektmanagement**: Aufgabenmanagement, Zeiterfassung, Vertragsmanagement
- **Qualitätsmanagement**: Arbeitsanweisungen, Ticket Management, ISO-Zertifizierung, Reklamationen
- **Dokumentenmanagement**: DMS, Posteingang, Rechnungseingang, Ablage, Kategorisierung, Archivierung, OCR
- **Reporting & BI**: Business Intelligence, Auswertungen, Analysen, Qualitätsmanagement
## Unser umfassendes Servicekonzept
### Full-Service-Ansatz
Wir bieten unseren Kunden ein komplettes Servicepaket, das sie von der ersten Analyse bis zum laufenden Betrieb begleitet:
#### 1. Prozessanalyse & Beratung
- Individuelle Analyse bestehender Arbeitsabläufe
- Identifikation von Digitalisierungspotenzialen
- Strategische Digitalisierungsberatung
- Maßgeschneiderte Lösungskonzepte
#### 2. Prozessmodellierung & Implementierung
- BPMN 2.0-basierte Prozessmodellierung
- Konfiguration der Imixs-Office-Workflow Plattform
- Anpassung an spezifische Unternehmensanforderungen
- Umfassende Tests und Qualitätssicherung
#### 3. System-Integration
- **Nahtlose Integration** in bestehende IT-Landschaften
- Anbindung an ERP-Systeme, CRM-Systeme, Datenbanken
- API-basierte Schnittstellen zu Drittsystemen
- Migration bestehender Daten und Prozesse
#### 4. Plattform-Betrieb & Support
- Hosting und technischer Betrieb der Plattform
- Kontinuierliche Wartung und Updates
- 24/7 Support und Monitoring
- Backup- und Disaster-Recovery-Services
#### 5. Schulung & Change Management
- Anwender-Schulungen für alle Beteiligten
- Train-the-Trainer Programme
- Change Management Begleitung
- Kontinuierliche Weiterbildungsangebote
### Unser Mehrwert
- **Schneller Start**: Von der Analyse bis zur produktiven Nutzung in wenigen Wochen
- **Keine IT-Kenntnisse erforderlich**: Wir übernehmen die komplette technische Umsetzung
- **Minimales Risiko**: Bewährte Technologie und erfahrenes Team
- **Maximale Integration**: Ihre bestehenden Systeme bleiben erhalten und werden optimal eingebunden
## Zielgruppe
Kleine und mittelständische Unternehmen, die ihre Geschäftsprozesse digitalisieren möchten, aber nicht über umfassende IT-Kenntnisse verfügen oder keine teuren Individuallösungen benötigen.
## Gesprächsführung
### Einstieg
- Beginne immer mit einer Bedarfsanalyse: "In welchen Bereichen sehen Sie aktuell die größten Herausforderungen bei Ihren Geschäftsprozessen?"
- Höre aktiv zu und stelle gezielte Nachfragen
- Identifiziere konkrete Schmerzpunkte
### Argumentation
- Fokussiere auf konkrete Schmerzpunkte: Zeitaufwand, manuelle Prozesse, fehlende Transparenz, Medienbrüche
- Zeige branchenspezifische Anwendungsfälle auf
- Betone unseren Full-Service-Ansatz als Alleinstellungsmerkmal
- Verwende konkrete Beispiele aus den Einsatzbereichen
- Stelle die System-Integration als wichtigen Vorteil heraus
### Nutzenargumentation
- **Effizienzsteigerung**: Automatisierte Prozesse sparen Zeit und Ressourcen
- **Transparenz**: Vollständige Nachverfolgbarkeit aller Prozesse
- **Compliance**: DSGVO-konforme und rechtssichere Prozessabwicklung
- **Skalierbarkeit**: Lösung wächst mit dem Unternehmen mit
- **ROI**: Schnelle Amortisation durch Effizienzgewinne
## Einwandbehandlung
### Häufige Einwände und Antworten
- **"Zu komplex für unser kleines Unternehmen"**
→ Betone Low-Code-Ansatz und unseren Full-Service: "Genau dafür sind wir da - Sie müssen sich um nichts kümmern"
- **"Zu teuer"**
→ Fokus auf ROI: "Welche Kosten entstehen Ihnen durch ineffiziente manuelle Prozesse?"
- **"Haben bereits eine Lösung"**
→ Integration hervorheben: "Wir ersetzen nicht, sondern integrieren und optimieren"
- **"Brauchen individuelle Lösung"**
→ BPMN-Standard: "BPMN ermöglicht maximale Anpassung an Ihre spezifischen Anforderungen"
- **"Keine IT-Ressourcen"**
→ Full-Service betonen: "Das ist kein Problem - wir übernehmen Analyse, Umsetzung und Betrieb komplett"
- **"Angst vor Systemausfall"**
→ Hosting und Support: "24/7 Monitoring und professioneller Betrieb sorgen für maximale Verfügbarkeit"
## Call-to-Actions
- Einladung zu einer unverbindlichen Prozessanalyse
- Demo-Termin für eine Live-Präsentation
- Workshop zur Identifikation von Digitalisierungspotenzialen
- Pilotprojekt für einen ersten Prozess
]]>
</prompt>
</PromptDefinition>

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