This commit is contained in:
Thomas 2025-01-16 08:54:57 +01:00
parent 6d7f485e9c
commit 348e65b831
65 changed files with 2040 additions and 64369 deletions

View File

@ -7,8 +7,8 @@ services:
context: ../../
dockerfile: ./.docker/images/php/base/Dockerfile
platforms:
- "linux/amd64"
#- "linux/arm64"
- "linux/amd64"
# - "linux/arm64"
args:
- ALPINE_VERSION=${ALPINE_VERSION?}
- APP_CODE_PATH=${APP_CODE_PATH_CONTAINER?}

View File

@ -6,8 +6,8 @@ services:
build:
context: ../
platforms:
- "linux/amd64"
# - "linux/arm64"
- "linux/amd64"
# - "linux/arm64"
dockerfile: ./images/php/application/Dockerfile
target: ${ENV?}
args:

View File

@ -6,8 +6,8 @@ services:
build:
context: ../
platforms:
- "linux/amd64"
# - "linux/arm64"
- "linux/amd64"
# - "linux/arm64"
dockerfile: ./images/php/fpm/Dockerfile
target: ${ENV?}
args:
@ -18,8 +18,8 @@ services:
build:
context: ../
platforms:
- "linux/amd64"
# - "linux/arm64"
- "linux/amd64"
#- "linux/arm64"
dockerfile: ./images/php/cron/Dockerfile
target: ${ENV?}
args:
@ -31,8 +31,8 @@ services:
build:
context: ../../
platforms:
- "linux/amd64"
# - "linux/arm64"
- "linux/amd64"
# - "linux/arm64"
dockerfile: ./.docker/images/nginx/Dockerfile
target: ${ENV?}
args:

View File

@ -65,12 +65,27 @@ services:
- "4444:4444"
networks:
- network
smtp4dev:
image: registry.thomas-peterson.de/smtp4dev
restart: always
ports:
# Change the number before : to the port the web interface should be accessible on
- '5000:80'
# Change the number before : to the port the SMTP server should be accessible on
- '25:25'
# Change the number before : to the port the IMAP server should be accessible on
- '143:143'
environment:
- ServerOptions__Urls=http://*:80
- ServerOptions__HostName=smtp4dev
networks:
- network
application:
image: ${DOCKER_REGISTRY?}/${DOCKER_NAMESPACE?}/application-${ENV?}:${TAG?}
build:
context: ../
platforms:
- "linux/amd64"
- "linux/amd64"
#- "linux/arm64"
dockerfile: ./images/php/application/Dockerfile
args:

View File

@ -7,14 +7,14 @@ ARG APP_CODE_PATH
RUN sed -i "s#__NGINX_ROOT_NEW;#$APP_CODE_PATH/new/web;#" /etc/nginx/conf.d/default.conf
RUN sed -i "s#__NGINX_ROOT_OLD;#$APP_CODE_PATH/old/public;#" /etc/nginx/conf.d/default.conf
FROM base as prod
COPY ./src/old/public /data/www/old/public
COPY ./src/new/var/plugins/System /data/www/new/var/plugins/System
COPY ./src/new/web /data/www/new/web
COPY ./src/new/vendor/nelmio/api-doc-bundle/Resources/public /data/www/new/vendor/nelmio/api-doc-bundle/Resources/public
FROM base as prod
FROM base as local
COPY ./src/old/public /data/www/old/public
COPY ./src/new/web /data/www/new/web

View File

@ -64,11 +64,6 @@ server {
try_files $uri @sfFront;
}
location /w2p/ {
proxy_pass http://tp:8080/w2p/;
proxy_temp_path /tmp/proxy;
}
location @sfFront { # Symfony
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
@ -76,11 +71,11 @@ server {
# Om nom nom cookies
#
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
#
# Custom headers and headers various browsers *should* be OK with but aren't
#
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,apikey';
add_header 'Access-Control-Allow-Headers' 'authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,apikey';
#
# Tell client that this pre-flight info is valid for 20 days
#
@ -92,6 +87,7 @@ server {
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Credentials true always;
add_header 'Access-Control-Allow-Headers' 'authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,apikey';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header Access-Control-Expose-Headers Access-Control-Allow-Origin always;
fastcgi_temp_path /tmp/fastcgi 1 2;

View File

@ -100,7 +100,7 @@ RUN docker-php-ext-install -j$(nproc) ldap
RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \
docker-php-ext-install -j$(nproc) imap
COPY ./.docker/images/php/base/pdf/php_pdflib.so /pdflib.so
# COPY ./.docker/images/php/base/pdf/php_pdflib.so /pdflib.so
# make bash default shell
RUN sed -e 's;/bin/ash$;/bin/bash;g' -i /etc/passwd

View File

@ -11,4 +11,4 @@ opcache.interned_strings_buffer=12
memory_limit = -1
disable_functions =
extension=/pdflib.so
;extension=/pdflib.so

View File

@ -109,6 +109,10 @@ docker-compose-build-image-config: validate-docker-compose-variables ## generate
docker-compose-build-php: validate-docker-compose-variables ## Build the php base image
$(DOCKER_COMPOSE_PHP_BASE) build --no-cache $(DOCKER_SERVICE_NAME_PHP_BASE) $(ARGS)
.PHONY: docker-compose-build-web
docker-compose-build-web: validate-docker-compose-variables ## Build the php base image
$(DOCKER_COMPOSE) build --no-cache web $(ARGS)
.PHONY: docker-compose-build
docker-compose-build: docker-compose-build-php docker-compose-build-image ## Build the php image and then all other docker images

View File

@ -23,4 +23,4 @@ VM_NAME_WEB=$(DOCKER_SERVICE_NAME_WEB)-vm
VM_NAME_MYSQL=$(DOCKER_SERVICE_NAME_MYSQL)-vm
VM_NAME_MONGODB=$(DOCKER_SERVICE_NAME_MONGODB)-vm
# Helpers
ALL_VM_SERVICE_NAMES=$(VM_NAME_APPLICATION):$(DOCKER_SERVICE_NAME_APPLICATION) $(VM_NAME_PHP_FPM):$(DOCKER_SERVICE_NAME_PHP_FPM) $(VM_NAME_PHP_CRON):$(DOCKER_SERVICE_NAME_PHP_CRON) $(VM_NAME_WEB):$(DOCKER_SERVICE_NAME_WEB)
ALL_VM_SERVICE_NAMES=$(VM_NAME_APPLICATION):$(DOCKER_SERVICE_NAME_APPLICATION) $(VM_NAME_PHP_FPM):$(DOCKER_SERVICE_NAME_PHP_FPM) $(VM_NAME_PsHP_CRON):$(DOCKER_SERVICE_NAME_PHP_CRON) $(VM_NAME_WEB):$(DOCKER_SERVICE_NAME_WEB)

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
APP_ENV=test
MAILER_DSN=smtp://192.168.188.136:2500
MAILER_DSN=smtp://smtp4dev:25
PDFLIB_LIC=L900202-010091-135115-PPD3D2-EHE432
CORS_ALLOW_ORIGIN=*
DATABASE_URL=sqlite:///%kernel.project_dir%/var/test.sqlite

View File

@ -22,7 +22,7 @@
"chillerlan/php-qrcode": "v5.0.x-dev",
"cocur/slugify": "v3.1",
"composer/package-versions-deprecated": "^1.8",
"ddeboer/imap": "1.12.2",
"ddeboer/imap": "1.18.*",
"doctrine/annotations": "^1.0",
"doctrine/cache": "^1.11",
"doctrine/doctrine-bundle": "2.7.*",
@ -78,7 +78,7 @@
"symfony/monolog-bundle": "^3.8",
"symfony/notifier": "*",
"symfony/process": "*",
"symfony/property-access": "6.4.*",
"symfony/property-access": "6.4.4",
"symfony/property-info": "*",
"symfony/proxy-manager-bridge": "*",
"symfony/runtime": "*",

54
src/new/composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "f4966c70ab29743cfc549b7bf648292f",
"content-hash": "662f9319208d03de9b69b0d3b1488f2a",
"packages": [
{
"name": "azuyalabs/yasumi",
@ -555,32 +555,33 @@
},
{
"name": "ddeboer/imap",
"version": "1.12.2",
"version": "1.18.0",
"source": {
"type": "git",
"url": "https://github.com/ddeboer/imap.git",
"reference": "5f1d8ed40b365386c028e038658376410c59e8a8"
"reference": "424106ad6b4166f134048ebd7ee461436e57d3b2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ddeboer/imap/zipball/5f1d8ed40b365386c028e038658376410c59e8a8",
"reference": "5f1d8ed40b365386c028e038658376410c59e8a8",
"url": "https://api.github.com/repos/ddeboer/imap/zipball/424106ad6b4166f134048ebd7ee461436e57d3b2",
"reference": "424106ad6b4166f134048ebd7ee461436e57d3b2",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-iconv": "*",
"ext-imap": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"php": "^7.4 || ^8.0.1"
"php": "~8.1.0 || ~8.2.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^v3.1.0",
"laminas/laminas-mail": "^2.15.0",
"malukenho/mcbumpface": "^1.1.5",
"phpstan/phpstan": "^0.12.99",
"phpstan/phpstan-phpunit": "^0.12.22",
"phpstan/phpstan-strict-rules": "^0.12.11",
"phpunit/phpunit": "^9.5.9"
"friendsofphp/php-cs-fixer": "^3.14.4",
"laminas/laminas-mail": "^2.22.0",
"phpstan/phpstan": "^1.9.17",
"phpstan/phpstan-phpunit": "^1.3.4",
"phpstan/phpstan-strict-rules": "^1.4.5",
"phpunit/phpunit": "^10.0.7"
},
"type": "library",
"autoload": {
@ -614,7 +615,7 @@
],
"support": {
"issues": "https://github.com/ddeboer/imap/issues",
"source": "https://github.com/ddeboer/imap/tree/1.12.2"
"source": "https://github.com/ddeboer/imap/tree/1.18.0"
},
"funding": [
{
@ -626,7 +627,7 @@
"type": "github"
}
],
"time": "2021-09-23T05:56:38+00:00"
"time": "2023-05-22T06:42:26+00:00"
},
{
"name": "doctrine/annotations",
@ -2929,16 +2930,16 @@
},
{
"name": "horstoeko/zugferd",
"version": "v1.0.100",
"version": "v1.0.102",
"source": {
"type": "git",
"url": "https://github.com/horstoeko/zugferd.git",
"reference": "cb189408232284fc801fca436ce86cc3e1dff356"
"reference": "c43788ad1713393247a2d73bbded8308f1eea031"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/horstoeko/zugferd/zipball/cb189408232284fc801fca436ce86cc3e1dff356",
"reference": "cb189408232284fc801fca436ce86cc3e1dff356",
"url": "https://api.github.com/repos/horstoeko/zugferd/zipball/c43788ad1713393247a2d73bbded8308f1eea031",
"reference": "c43788ad1713393247a2d73bbded8308f1eea031",
"shasum": ""
},
"require": {
@ -2951,6 +2952,7 @@
"setasign/fpdf": "^1",
"setasign/fpdi": "^2",
"smalot/pdfparser": "^0|^2",
"symfony/finder": "^5|^6|^7",
"symfony/process": "^5|^6|^7",
"symfony/validator": "^5|^6|^7",
"symfony/yaml": "^5|^6|^7"
@ -2996,9 +2998,9 @@
],
"support": {
"issues": "https://github.com/horstoeko/zugferd/issues",
"source": "https://github.com/horstoeko/zugferd/tree/v1.0.100"
"source": "https://github.com/horstoeko/zugferd/tree/v1.0.102"
},
"time": "2024-12-27T15:54:50+00:00"
"time": "2025-01-03T10:49:47+00:00"
},
{
"name": "imagine/imagine",
@ -15243,16 +15245,16 @@
},
{
"name": "phpstan/phpstan",
"version": "1.12.14",
"version": "1.12.15",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "e73868f809e68fff33be961ad4946e2e43ec9e38"
"reference": "c91d4e8bc056f46cf653656e6f71004b254574d1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/e73868f809e68fff33be961ad4946e2e43ec9e38",
"reference": "e73868f809e68fff33be961ad4946e2e43ec9e38",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/c91d4e8bc056f46cf653656e6f71004b254574d1",
"reference": "c91d4e8bc056f46cf653656e6f71004b254574d1",
"shasum": ""
},
"require": {
@ -15297,7 +15299,7 @@
"type": "github"
}
],
"time": "2024-12-31T07:26:13+00:00"
"time": "2025-01-05T16:40:22+00:00"
},
{
"name": "phpunit/php-code-coverage",

View File

@ -5,5 +5,26 @@ declare(strict_types=1);
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$containerConfigurator->extension('nelmio_cors', ['defaults' => ['origin_regex' => true, 'allow_methods' => ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'], 'allow_headers' => ['Content-Type', 'Authorization'], 'expose_headers' => ['Link'], 'max_age' => 3600], 'paths' => ['^/api/' => ['allow_headers' => ['apikey'], 'allow_methods' => ['POST', 'PUT', 'GET', 'DELETE'], 'max_age' => 3600], '^/' => null]]);
$containerConfigurator->extension(
'nelmio_cors',
[
'defaults' => [
'allow_credentials' => true,
'origin_regex' => true,
'allow_methods' => ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'],
'allow_headers' => ['Content-Type', 'Authorization'],
'expose_headers' => ['Link'],
'max_age' => 3600
],
'paths' => [
'^/api/' => [
'allow_credentials' => true,
'allow_headers' => ['Content-Type', 'Authorization', 'apikey', 'token'],
'allow_methods' => ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS', 'PATCH'],
'max_age' => 3600
],
'^/' => null
]
]
);
};

View File

@ -125,7 +125,7 @@
</div>
</td>
<td class="text-end px-4 py-3">
<a href="{{ path("psc_shop_contact_backend_edit", {uuid: order.uuid}) }}" class="text-gray-900 bg-gray-100 hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 font-medium rounded-lg text-sm px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-gray-500">
<a href="{{ path("psc_shop_order_backend_detail_show", {uuid: order.uuid}) }}" class="text-gray-900 bg-gray-100 hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 font-medium rounded-lg text-sm px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-gray-500">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 text-psc">
<path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10" />
</svg>

View File

@ -101,14 +101,14 @@
{% import "knp_menu.html.twig" as macros %}
{% if item.hasChildren %}
<a x-on:click="{{ item.name|slug }} = ! {{ item.name|slug('') }}" class="flex items-center justify-center gap-3 px-3 py-2 rounded-lg font-medium transition hover:bg-psc-500 focus:bg-psc-500 hover:text-white focus:text-white" {{ macros.attributes(item.linkAttributes) }}>
<i class="{{ item.getExtra('icon') }}"></i>
<a x-on:click="{{ item.name|slug }} = ! {{ item.name|slug('') }}" class="flex items-center justify-center gap-3 px-3 p-1 rounded-lg font-medium transition hover:bg-psc-500 focus:bg-psc-500 hover:text-white focus:text-white" {{ macros.attributes(item.linkAttributes) }}>
<i class="w-4 {{ item.getExtra('icon') }}"></i>
<div class="flex flex-1" x-show="$store.sideBar.isOpen">{{ block('label') }} {% if item.getExtra('error') > 0 %}<span class="badge bg-danger">({{ item.getExtra('error') }})</span>{% endif %}</div>
<b class="inline-flex items-center justify-center ml-auto rtl:ml-0 rtl:mr-auto min-h-4 px-2 py-0.5 text-xs font-medium tracking-tight rounded-xl whitespace-normal"><i class="fas fa-chevron-left"></i></b>
</a>
{% else %}
<a class="flex items-center justify-center gap-3 px-3 py-2 rounded-lg font-medium transition hover:bg-psc-500 focus:bg-psc-500 hover:text-white focus:text-white" id="{{ item.label }}" title="{{ item.label }}" href="{{ item.uri }}"{{ macros.attributes(item.linkAttributes) }}>
<i class="{{ item.getExtra('icon') }}"></i>
<a class="flex items-center justify-center gap-3 px-3 p-1 rounded-lg font-medium transition hover:bg-psc-500 focus:bg-psc-500 hover:text-white focus:text-white" id="{{ item.label }}" title="{{ item.label }}" href="{{ item.uri }}"{{ macros.attributes(item.linkAttributes) }}>
<i class="w-4 {{ item.getExtra('icon') }}"></i>
<div class="flex flex-1" x-show="$store.sideBar.isOpen">{{ block('label') }} {% if item.getExtra('error') > 0 %}<span class="badge bg-danger">({{ item.getExtra('error') }})</span>{% endif %}</div>
</a>
{% endif %}

View File

@ -1,15 +1,17 @@
{% if domain %}
<a target="_blank" href="https://{{ domain }}" class="text-psc-500" title="Shop anzeigen">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="inline w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.59 14.37a6 6 0 01-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 006.16-12.12A14.98 14.98 0 009.631 8.41m5.96 5.96a14.926 14.926 0 01-5.841 2.58m-.119-8.54a6 6 0 00-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 00-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 01-2.448-2.448 14.9 14.9 0 01.06-.312m-2.24 2.39a4.493 4.493 0 00-1.757 4.306 4.493 4.493 0 004.306-1.758M16.5 9a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z" />
</svg>
</a>
{% endif %}
<select class="text-gray-900 transition duration-75 rounded-lg shadow-sm outline-none focus:border-primary-500 focus:ring-1 focus:ring-inset focus:ring-primary-500 disabled:opacity-70 border-gray-300" onchange="this.options[this.selectedIndex].value && (window.location = this.options[this.selectedIndex].value);">
{% for shop in shops %}
{% if displayDeletedShop == true or shop.deleted == false %}
<option {% if selectedShop.uid == shop.uid %}selected{% endif %} value="{{ path('psc_backend_dashboard_shop_change', {'shop_uuid': shop.uid}) }}">{{ shop.title }}</option>
{% endif %}
{% endfor %}
</select>
<input type="checkbox" class=" border-gray-300 rounded shadow-sm text-primary-600 outline-none focus:ring focus:ring-primary-200 focus:ring-opacity-50" onchange="window.location='{{ path('psc_backend_dashboard_toogle_deleted_shop') }}'" {% if displayDeletedShop %}checked="checked"{% endif %}/> Deaktive Shops zeigen
<select class="text-gray-900 transition duration-75 rounded-lg shadow-sm outline-none focus:border-primary-500 focus:ring-1 focus:ring-inset focus:ring-primary-500 disabled:opacity-70 border-gray-300" onchange="this.options[this.selectedIndex].value && (window.location = this.options[this.selectedIndex].value);">
{% for shop in shops %}
{% if displayDeletedShop == true or shop.deleted == false %}
<option {% if selectedShop.uid == shop.uid %}selected{% endif %} value="{{ path('psc_backend_dashboard_shop_change', {'shop_uuid': shop.uid}) }}">{{ shop.title }}</option>
{% endif %}
{% endfor %}
</select>
{% if domain %}
<a target="_blank" href="https://{{ domain }}" class="text-psc-500" title="Shop anzeigen">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="inline w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.59 14.37a6 6 0 01-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 006.16-12.12A14.98 14.98 0 009.631 8.41m5.96 5.96a14.926 14.926 0 01-5.841 2.58m-.119-8.54a6 6 0 00-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 00-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 01-2.448-2.448 14.9 14.9 0 01.06-.312m-2.24 2.39a4.493 4.493 0 00-1.757 4.306 4.493 4.493 0 004.306-1.758M16.5 9a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z" />
</svg>
</a>
{% endif %}
<span class="hidden md:inline"><input type="checkbox" class=" border-gray-300 rounded shadow-sm text-primary-600 outline-none focus:ring focus:ring-primary-200 focus:ring-opacity-50" onchange="window.location='{{ path('psc_backend_dashboard_toogle_deleted_shop') }}'" {% if displayDeletedShop %}checked="checked"{% endif %}/> Deaktive Shops zeigen</span>

View File

@ -2,4 +2,5 @@ Infotxt1: "Beim Domainprovider den DNS Eintrag anpassen (Nur den A Record (IP4),
Infotxt2: Die Domain hier (ohne www) ergänzen.
Infotxt3: Domains Synchronsieren betätigen, sobald der DNS Eintrag im Internet bekannt ist (wird hier in der Liste dann als DNS OK angezeigt).
Infotxt4: "ACHTUNG: Damit die Synchronisation funktioniert, müssen alle Domains aller Shops mit DNS OK angezeigt werden."
help: Hilfe
Infotxt5: "ACHTUNG: Ohne Domain lassen sich manche Backoffice-Bereiche nicht öffnen."
help: Hilfe

View File

@ -59,6 +59,7 @@
<li>{{ 'Infotxt2'|trans|raw }}</li>
<li>{{ 'Infotxt3'|trans|raw }}</li>
<li>{{ 'Infotxt4'|trans|raw }}</li>
<li>{{ 'Infotxt5'|trans|raw }}</li>
</ol>
</div>
</div>
@ -128,4 +129,4 @@
});
})
</script>
{% endblock %}
{% endblock %}

View File

@ -23,9 +23,9 @@ class DomainSync
{
private $projectDir;
private $domains = [];
/**
* @var EntityManagerInterface
*/
/**
* @var EntityManagerInterface
*/
private EntityManagerInterface $entityManager;
public function __construct($projectDir, EntityManagerInterface $entityManager)
{
@ -50,13 +50,13 @@ class DomainSync
}
}
public function syncDomains()
public function syncDomains(): void
{
$domains = $this->entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Domain')->findAll();
$this->domains = [];
/** @var Domain $domain */
/** @var Domain $domain */
foreach ($domains as $domain) {
if ($this->isDnsOk($domain->getIp())) {
$this->domains[] = $domain->getHost();

View File

@ -20,7 +20,7 @@ class ConfigureMenuListener
public function onMenuConfigureMain(ConfigureMenuEvent $event)
{
$menu = $event->getMenu();
if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
if (false && $this->authorizationChecker->isGranted('ROLE_ADMIN')) {
$menu->addChild('createShop', array(
'route' => 'psc_shop_create_backend_start_index',
'label' => 'Shop erstellen',

View File

@ -0,0 +1,177 @@
<?php
namespace PSC\Shop\EntityBundle\Document\Embed;
use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Field;
#[EmbeddedDocument]
class Operator
{
#[Field(type: 'string')]
private ?string $company = "";
#[Field(type: 'string')]
private ?string $email = "";
#[Field(type: 'string')]
private ?string $lastname = "";
#[Field(type: 'string')]
private ?string $firstname = "";
#[Field(type: 'string')]
private ?string $iban = "";
#[Field(type: 'string')]
private ?string $phone = "";
#[Field(type: 'string')]
private ?string $mobilePhone = "";
#[Field(type: 'string')]
private ?string $ustId = "";
#[Field(type: 'string')]
private ?string $steuerId = "";
#[Field(type: 'string')]
private ?string $street = "";
#[Field(type: 'string')]
private ?string $houseNumber = "";
#[Field(type: 'string')]
private ?string $zip = "";
#[Field(type: 'string')]
private ?string $country = "";
#[Field(type: 'string')]
private ?string $city = "";
#[Field(type: 'string')]
private ?string $lid = "";
public function getCompany(): ?string
{
return $this->company;
}
public function setCompany(?string $var): void
{
$this->company = $var;
}
public function setEmail(?string $email): void
{
$this->email = $email;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setLastname(?string $lastname): void
{
$this->lastname = $lastname;
}
public function getLastname(): ?string
{
return $this->lastname;
}
public function setFirstname(?string $firstname): void
{
$this->firstname = $firstname;
}
public function getFirstname(): ?string
{
return $this->firstname;
}
public function setIban(?string $iban): void
{
$this->iban = $iban;
}
public function getIban(): ?string
{
return $this->iban;
}
public function setPhone(?string $phone): void
{
$this->phone = $phone;
}
public function getPhone(): ?string
{
return $this->phone;
}
public function setUstId(?string $ustId): void
{
$this->ustId = $ustId;
}
public function getUstId(): ?string
{
return $this->ustId;
}
public function setStreet(?string $street): void
{
$this->street = $street;
}
public function getStreet(): ?string
{
return $this->street;
}
public function setHouseNumber(?string $houseNumber): void
{
$this->houseNumber = $houseNumber;
}
public function getHouseNumber(): ?string
{
return $this->houseNumber;
}
public function setZip(?string $zip): void
{
$this->zip = $zip;
}
public function getZip(): ?string
{
return $this->zip;
}
public function setCity(?string $city): void
{
$this->city = $city;
}
public function getCity(): ?string
{
return $this->city;
}
public function setCountry(?string $country): void
{
$this->country = $country;
}
public function getCountry(): ?string
{
return $this->country;
}
public function setSteuerId(?string $steuerId): void
{
$this->steuerId = $steuerId;
}
public function getSteuerId(): ?string
{
return $this->steuerId;
}
public function setMobilePhone(?string $mobilePhone): void
{
$this->mobilePhone = $mobilePhone;
}
public function getMobilePhone(): ?string
{
return $this->mobilePhone;
}
public function setLid(?string $lid): void
{
$this->lid = $lid;
}
public function getLid(): ?string
{
return $this->lid;
}
}

View File

@ -1,22 +1,12 @@
<?php
/**
* PrintshopCreator Suite
*
* PHP Version 5.3
*
* @author Thomas Peterson <info@thomas-peterson.de>
* @copyright 2012-2013 PrintshopCreator GmbH
* @license Private
* @link http://www.printshopcreator.de
*/
namespace PSC\Shop\EntityBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Field;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Id;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbedOne;
use PSC\Shop\EntityBundle\Document\Embed\Operator;
#[Document]
class Order
@ -88,6 +78,8 @@ class Order
protected $deliveryAddressSaved;
#[EmbedOne]
protected $senderAddressSaved;
#[EmbedOne]
protected ?Operator $operator = null;
#[EmbedOne]
protected $contactSaved;
@ -364,4 +356,12 @@ class Order
{
return $this->vouchers;
}
public function setOperator(?Operator $operator): void
{
$this->operator = $operator;
}
public function getOperator(): ?Operator
{
return $this->operator;
}
}

View File

@ -17,6 +17,7 @@ use Doctrine\ODM\MongoDB\Mapping\Annotations\Field;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Id;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
use PSC\Shop\ContactBundle\Model\Address;
use PSC\Shop\EntityBundle\Document\Embed\Operator;
#[Document]
class Shop
@ -514,6 +515,8 @@ class Shop
#[Field(type: 'string')]
protected $senderMobile;
#[Field(type: 'string')]
protected $senderPhone;
#[Field(type: 'string')]
protected $senderEmail;
#[Field(type: 'string')]
protected $senderIban;
@ -3212,7 +3215,7 @@ class Shop
return (string)$this->senderIban;
}
public function setSenderIban(string $var): void
public function setSenderIban(?string $var): void
{
$this->senderIban = $var;
}
@ -3222,7 +3225,7 @@ class Shop
return (string)$this->senderLId;
}
public function setSenderLId(string $var): void
public function setSenderLId(?string $var): void
{
$this->senderLId = $var;
}
@ -3232,7 +3235,7 @@ class Shop
return (string)$this->senderUstId;
}
public function setSenderUstId(string $var): void
public function setSenderUstId(?string $var): void
{
$this->senderUstId = $var;
}
@ -3242,9 +3245,40 @@ class Shop
return (string)$this->senderSteuerId;
}
public function setSenderSteuerId(string $var): void
public function setSenderSteuerId(?string $var): void
{
$this->senderSteuerId = $var;
}
public function getSenderPhone(): string
{
return (string)$this->senderPhone;
}
public function setSenderPhone(?string $var): void
{
$this->senderPhone = $var;
}
public function getOperator(): Operator
{
$operator = new Operator();
$operator->setIban($this->senderIban);
$operator->setSteuerId($this->senderSteuerId);
$operator->setUstId($this->senderUstId);
$operator->setLid($this->senderLId);
$operator->setFirstname($this->senderFirstname);
$operator->setLastname($this->senderLastname);
$operator->setCompany($this->senderCompany);
$operator->setPhone($this->senderPhone);
$operator->setMobilePhone($this->senderMobile);
$operator->setEmail($this->senderEmail);
$operator->setStreet($this->senderStreet);
$operator->setHouseNumber($this->senderHouseNumber);
$operator->setZip($this->senderZip);
$operator->setCity($this->senderCity);
$operator->setCountry($this->senderCountry);
return $operator;
}
}

View File

@ -27,7 +27,7 @@ use Ramsey\Uuid\Uuid;
class Product
{
/**
* @var \DateTime
* @var \DateTime
*/
protected $ablaufDatum;
protected $ansprechPartner;
@ -54,70 +54,70 @@ class Product
protected $weight;
protected $text;
/**
* @var integer
* @var integer
*/
protected $collectingOrdersAccount;
/**
* @var integer
* @var integer
*/
protected $baseUnit = 0;
/**
* @var integer
* @var integer
*/
protected $salesUnit = 0;
/**
* @var integer
* @var integer
*/
protected $packagingUnit;
/**
* @var integer
* @var integer
*/
protected $collectingOrdersAccountFilter;
/**
* @var boolean
* @var boolean
*/
protected $collectingOrdersChangePicture;
/**
* @var boolean
* @var boolean
*/
protected $collectingOrdersCopy;
/**
* @var boolean
* @var boolean
*/
protected $collectingOrdersNewContact;
/**
* @var boolean
* @var boolean
*/
protected $collectingOrdersInviteContact;
/**
* @var boolean
* @var boolean
*/
protected $collectingOrdersIntegrated;
/**
* @var bool
* @var bool
*/
protected $uploadFromLatestOrder;
/**
* @var integer
* @var integer
*/
protected $uploadFromLatestOrderInitalStatus;
/**
* @var bool
* @var bool
*/
protected $uploadProvided;
/**
* @var string
* @var string
*/
protected $uploadProvidedFile;
/**
* @var integer
* @var integer
*/
protected $uploadProvidedInitalStatus;
/**
* @var bool
* @var bool
*/
protected $uploadProvidedDownload;
@ -138,16 +138,16 @@ class Product
}
/**
* @var boolean
* @var boolean
*/
protected $hintEnable;
/**
* @var boolean
* @var boolean
*/
protected $customTabEnable;
/**
* @var array
* @var array
*/
protected $pluginSettings = [];

View File

@ -8,6 +8,7 @@ use PSC\Shop\AccountBundle\Model\Account;
use PSC\Shop\ContactBundle\Model\Address;
use PSC\Shop\ContactBundle\Model\Contact;
use PSC\Shop\OrderBundle\Model\Order\Discount;
use PSC\Shop\OrderBundle\Model\Order\Operator;
use PSC\Shop\PaymentBundle\Model\Payment;
use PSC\Shop\OrderBundle\Model\Order\Position;
use PSC\Shop\ShippingBundle\Model\Shipping;
@ -42,11 +43,13 @@ abstract class Base
*/
#[\OpenApi\Attributes\Property(ref: new Model(type: \PSC\Shop\ContactBundle\Model\Address::class))]
private $deliveryAddress;
/**
* @var Address
*/
#[\OpenApi\Attributes\Property(ref: new Model(type: \PSC\Shop\ContactBundle\Model\Address::class))]
private $senderAddress;
private Address $senderAddress;
#[\OpenApi\Attributes\Property(ref: new Model(type: Operator::class), nullable: true)]
private ?Operator $operator;
/**
* @var Address
*/
@ -204,6 +207,7 @@ abstract class Base
$this->basketField2 = "";
$this->status = 10;
$this->pluginSettings = [];
$this->operator = null;
}
public function getTypeAsString(): string
@ -837,4 +841,12 @@ abstract class Base
return $this->vatWithDiscount;
}
public function setOperator(?Operator $operator): void
{
$this->operator = $operator;
}
public function getOperator(): ?Operator
{
return $this->operator;
}
}

View File

@ -0,0 +1,173 @@
<?php
namespace PSC\Shop\OrderBundle\Model\Order;
use OpenApi\Attributes\Property;
class Operator
{
#[Property(type: 'string')]
private ?string $company = "";
#[Property(type: 'string')]
private ?string $email = "";
#[Property(type: 'string')]
private ?string $lastname = "";
#[Property(type: 'string')]
private ?string $firstname = "";
#[Property(type: 'string')]
private ?string $iban = "";
#[Property(type: 'string')]
private ?string $phone = "";
#[Property(type: 'string')]
private ?string $mobilePhone = "";
#[Property(type: 'string')]
private ?string $ustId = "";
#[Property(type: 'string')]
private ?string $steuerId = "";
#[Property(type: 'string')]
private ?string $street = "";
#[Property(type: 'string')]
private ?string $houseNumber = "";
#[Property(type: 'string')]
private ?string $zip = "";
#[Property(type: 'string')]
private ?string $country = "";
#[Property(type: 'string')]
private ?string $city = "";
#[Property(type: 'string')]
private ?string $lid = "";
public function getCompany(): ?string
{
return $this->company;
}
public function setCompany(?string $var): void
{
$this->company = $var;
}
public function setEmail(?string $email): void
{
$this->email = $email;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setLastname(?string $lastname): void
{
$this->lastname = $lastname;
}
public function getLastname(): ?string
{
return $this->lastname;
}
public function setFirstname(?string $firstname): void
{
$this->firstname = $firstname;
}
public function getFirstname(): ?string
{
return $this->firstname;
}
public function setIban(?string $iban): void
{
$this->iban = $iban;
}
public function getIban(): ?string
{
return $this->iban;
}
public function setPhone(?string $phone): void
{
$this->phone = $phone;
}
public function getPhone(): ?string
{
return $this->phone;
}
public function setUstId(?string $ustId): void
{
$this->ustId = $ustId;
}
public function getUstId(): ?string
{
return $this->ustId;
}
public function setStreet(?string $street): void
{
$this->street = $street;
}
public function getStreet(): ?string
{
return $this->street;
}
public function setHouseNumber(?string $houseNumber): void
{
$this->houseNumber = $houseNumber;
}
public function getHouseNumber(): ?string
{
return $this->houseNumber;
}
public function setZip(?string $zip): void
{
$this->zip = $zip;
}
public function getZip(): ?string
{
return $this->zip;
}
public function setCity(?string $city): void
{
$this->city = $city;
}
public function getCity(): ?string
{
return $this->city;
}
public function setCountry(?string $country): void
{
$this->country = $country;
}
public function getCountry(): ?string
{
return $this->country;
}
public function setSteuerId(?string $steuerId): void
{
$this->steuerId = $steuerId;
}
public function getSteuerId(): ?string
{
return $this->steuerId;
}
public function setMobilePhone(?string $mobilePhone): void
{
$this->mobilePhone = $mobilePhone;
}
public function getMobilePhone(): ?string
{
return $this->mobilePhone;
}
public function setLid(?string $lid): void
{
$this->lid = $lid;
}
public function getLid():?string {
return $this->lid;
}
}

View File

@ -5,10 +5,13 @@ namespace PSC\Shop\OrderBundle\Transformer;
use PSC\Shop\ContactBundle\Transformer\Order\Address;
use PSC\Shop\ContactBundle\Transformer\Order\Contact;
use PSC\Shop\EntityBundle\Document\Embed\ContactAddress;
use PSC\Shop\EntityBundle\Document\Embed\Operator as PSCOperator;
use PSC\Shop\OrderBundle\Model\Order\Discount;
use PSC\Shop\OrderBundle\Model\Order\Operator as AliasedOperator;
use PSC\Shop\OrderBundle\Model\Order\Tax;
use PSC\Shop\OrderBundle\Model\Order\TaxEnum;
use PSC\Shop\OrderBundle\Transformer\Order\Account;
use PSC\Shop\OrderBundle\Transformer\Order\Operator;
use PSC\Shop\PaymentBundle\Transformer\Payment;
use PSC\Shop\ShippingBundle\Transformer\Shipping;
use PSC\Shop\VoucherBundle\Model\Voucher;
@ -29,12 +32,14 @@ class Order extends Base
private Payment $paymentTransformer;
private Operator $operatorTransformer;
private SerializerInterface $serializer;
private Shipping $shippingTransformer;
private \PSC\Component\ApiBundle\Transformer\Shop $shopTransformer;
#[\Symfony\Contracts\Service\Attribute\Required]
public function setAddressTransformer(SerializerInterface $serializer, Address $addressTransformer, Contact $contactTransformer, Account $accountTransformer, Payment $paymentTransformer, Shipping $shippingTransformer, \PSC\Component\ApiBundle\Transformer\Shop $shopTransformer)
public function setAddressTransformer(SerializerInterface $serializer, Address $addressTransformer, Contact $contactTransformer, Account $accountTransformer, Payment $paymentTransformer, Shipping $shippingTransformer, \PSC\Component\ApiBundle\Transformer\Shop $shopTransformer, Operator $operatorTransformer)
{
$this->addressTransformer = $addressTransformer;
$this->contactTransformer = $contactTransformer;
@ -43,9 +48,10 @@ class Order extends Base
$this->shippingTransformer = $shippingTransformer;
$this->shopTransformer = $shopTransformer;
$this->serializer = $serializer;
$this->operatorTransformer = $operatorTransformer;
}
public function fromDb(\PSC\Shop\OrderBundle\Model\Base $order, \PSC\Shop\EntityBundle\Entity\Order $orderEntity, \PSC\Shop\EntityBundle\Document\Order $orderDoc)
public function fromDb(\PSC\Shop\OrderBundle\Model\Base $order, \PSC\Shop\EntityBundle\Entity\Order $orderEntity, \PSC\Shop\EntityBundle\Document\Order $orderDoc): void
{
$order->setUuid($orderEntity->getUuid());
$order->setCreated($orderEntity->getCreated());
@ -110,6 +116,14 @@ class Order extends Base
if ($orderDoc->getVouchers() != "") {
$order->setVouchers($this->serializer->deserialize($orderDoc->getVouchers(), Voucher::class.'[]', 'json'));
}
$operator = new AliasedOperator();
if ($orderDoc->getOperator() != null) {
$this->operatorTransformer->fromDb($operator, $orderDoc->getOperator());
} else {
$this->operatorTransformer->fromFallBackDb($operator, $order->getShop());
}
$order->setOperator($operator);
if ($orderDoc->getDiscounts() != "") {
$net = 0;
$gross = 0;
@ -126,7 +140,7 @@ class Order extends Base
}
}
public function toDb(\PSC\Shop\OrderBundle\Model\Base $order, \PSC\Shop\EntityBundle\Entity\Order $orderEntity, \PSC\Shop\EntityBundle\Document\Order $orderDoc)
public function toDb(\PSC\Shop\OrderBundle\Model\Base $order, \PSC\Shop\EntityBundle\Entity\Order $orderEntity, \PSC\Shop\EntityBundle\Document\Order $orderDoc): void
{
$orderEntity->setUuid($order->getUuid());
$orderEntity->setCreated(new \DateTime());
@ -178,6 +192,16 @@ class Order extends Base
$order->setSenderAddress($this->shopService->getMongoShopByUid($shopEntity->getUID())->getSenderAddress());
}
$this->addressTransformer->toDb($order->getSenderAddress(), $senderDoc);
if ($order->getOperator()) {
$operatorDoc = new PSCOperator();
$this->operatorTransformer->toDb($order->getOperator(), $operatorDoc);
$orderDoc->setOperator($operatorDoc);
} else {
$shopDoc = $this->shopService->getMongoShopByUid($order->getShop()->getId());
$orderDoc->setOperator($shopDoc->getOperator());
}
$orderDoc->setSenderAddressSaved($senderDoc);
$orderDoc->setExternalOrderNumber($order->getExternalOrderNumber());
$orderDoc->setDraft($order->isDraft());

View File

@ -0,0 +1,54 @@
<?php
namespace PSC\Shop\OrderBundle\Transformer\Order;
use PSC\Component\ApiBundle\Model\Shop;
use PSC\Shop\EntityBundle\Document\Embed\Operator as PSCOperator;
use PSC\System\SettingsBundle\Service\Shop as PSCShop;
class Operator
{
public function __construct(private PSCShop $shopService)
{
}
public function toDb(\PSC\Shop\OrderBundle\Model\Order\Operator $operator, PSCOperator $operatorDoc): void
{
$operatorDoc->setIban($operator->getIban());
$operatorDoc->setSteuerId($operator->getSteuerId());
$operatorDoc->setFirstname($operator->getFirstname());
$operatorDoc->setLastname($operator->getLastname());
$operatorDoc->setCompany($operator->getCompany());
}
public function fromDb(\PSC\Shop\OrderBundle\Model\Order\Operator $operator, PSCOperator $operatorDoc): void
{
$operator->setIban($operatorDoc->getIban());
$operator->setSteuerId($operatorDoc->getSteuerId());
$operator->setFirstname($operatorDoc->getFirstname());
$operator->setLastname($operatorDoc->getLastname());
$operator->setCompany($operatorDoc->getCompany());
}
public function fromFallBackDb(\PSC\Shop\OrderBundle\Model\Order\Operator $operator, Shop $shop): void
{
$doc = $this->shopService->getMongoShopByUid($shop->getId());
if ($doc) {
$operator->setCompany($doc->getOperator()->getCompany());
$operator->setFirstname($doc->getOperator()->getFirstname());
$operator->setLastname($doc->getOperator()->getLastname());
$operator->setEmail($doc->getOperator()->getEmail());
$operator->setUstId($doc->getOperator()->getUstId());
$operator->setLid($doc->getOperator()->getLid());
$operator->setStreet($doc->getOperator()->getStreet());
$operator->setZip($doc->getOperator()->getZip());
$operator->setCity($doc->getOperator()->getCity());
$operator->setPhone($doc->getOperator()->getPhone());
$operator->setMobilePhone($doc->getOperator()->getMobilePhone());
$operator->setSteuerId($doc->getOperator()->getSteuerId());
$operator->setIban($doc->getOperator()->getIban());
$operator->setCountry($doc->getOperator()->getCountry());
$operator->setHouseNumber($doc->getOperator()->getHouseNumber());
}
}
}

View File

@ -629,7 +629,7 @@ class EditController extends AbstractController
);
$subProduct = false;
if($product->getOriginalProduct() != 0) {
if ($product->getOriginalProduct() != 0) {
$subProduct = $entityManager->getRepository(Product::class)->find($product->getOriginalProduct());
}

View File

@ -64,11 +64,11 @@ class PermissionController extends AbstractController
* @throws \Doctrine\ORM\ORMException
*/
#[Route(path: '/permission/index/{product}', name: 'backend_production_product_permission_index')]
public function indexAction(Request $request, Shop $shopService, EntityManagerInterface $entityManager, PaginatorInterface $paginator, $product)
public function indexAction(Request $request, Shop $shopService, EntityManagerInterface $entityManager, PaginatorInterface $paginator, string $product)
{
$selectedShop = $shopService->getSelectedShop();
/** @var Product $product */
/** @var Product $product */
$product = $entityManager
->getRepository('PSC\Shop\EntityBundle\Entity\Product')->findOneBy(array('uuid' => $product, 'shop' => $selectedShop));
$form = $this->createForm(PermissionType::class, $product);

View File

@ -19,7 +19,6 @@ use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderUpdaterInterface;
use PSC\Shop\EntityBundle\Entity\Motiv;
use PSC\Shop\ProductBundle\Form\Backend\Productgroup\SearchType;
use PSC\Shop\ProductBundle\Form\Backend\ProductSearchType;
use PSC\System\SettingsBundle\Service\DeprecatedFile;
use PSC\System\SettingsBundle\Service\Shop;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
@ -53,7 +52,6 @@ class ListController extends AbstractController
* @param Shop $shopService
* @param EntityManagerInterface $entityManager
* @param PaginatorInterface $paginator
* @param DeprecatedFile $deprecatedFile
* @return array|View
* @throws \Doctrine\ORM\ORMException
*/

View File

@ -83,8 +83,8 @@ class EditController extends AbstractController
$builder->add('submit', SubmitType::class, array('label' => 'Speichern'));
$form = $builder->getForm();
$form->handleRequest($request);
$docQueue = new Queue();
if ($form->isSubmitted() && $form->isValid()) {
$docQueue = new Queue();
$docQueue->setName($form->get('name')->getData());
$docQueue->setPos($form->get('pos')->getData());
$docQueue->setQueueType($queue->getType());
@ -99,11 +99,11 @@ class EditController extends AbstractController
$documentManager->persist($docQueue);
$documentManager->flush();
return $this->redirectToRoute('psc_shop_queue_backend_list_index');
return $this->redirectToRoute('psc_shop_queue_backend_edit_edit', ['uuid' => $docQueue->getId()]);
}
return array('queue' => $queue, 'help' => [], 'form' => $form->createView());
return array('queue' => $queue, 'objQueue' => $docQueue, 'help' => [], 'form' => $form->createView());
}
/**
@ -129,7 +129,7 @@ class EditController extends AbstractController
$uuid
) {
$selectedShop = $shopService->getSelectedShop();
/** @var \PSC\Shop\EntityBundle\Document\Queue $objQueue */
/** @var \PSC\Shop\EntityBundle\Document\Queue $objQueue */
$objQueue = $documentManager
->getRepository('PSC\Shop\EntityBundle\Document\Queue')
->findOneBy(array('id' => (string)$uuid));
@ -184,7 +184,7 @@ class EditController extends AbstractController
$documentManager->flush();
}
return array('queue' => $queue , 'help' => $objEvent->getHelp(), 'form' => $form->createView(), 'event' => $objEvent);
return array('queue' => $queue , 'objQueue' => $objQueue, 'help' => $objEvent->getHelp(), 'form' => $form->createView(), 'event' => $objEvent);
}
/**
@ -223,7 +223,7 @@ class EditController extends AbstractController
{
$obj = ['which' => 1];
/** @var Queue $objQueue */
/** @var Queue $objQueue */
$objQueue = $documentManager
->getRepository('PSC\Shop\EntityBundle\Document\Queue')
->findOneBy(array('id' => (string)$uuid));

View File

@ -92,6 +92,7 @@ class ShopSettingsType extends AbstractType
->add('senderTel', TextType::class, array('required' => false, 'label' => 'Phone'))
->add('senderFax', TextType::class, array('required' => false, 'label' => 'Fax'))
->add('senderMobile', TextType::class, array('required' => false, 'label' => 'mobilephonenumber'))
->add('senderPhone', TextType::class, array('required' => false, 'label' => 'phonenumber'))
->add('senderEmail', TextType::class, array('required' => false, 'label' => 'EMail'))
->add('senderIban', TextType::class, array('required' => false, 'label' => 'Iban'))
->add('senderLId', TextType::class, array('required' => false, 'label' => 'Leitweg Id'))

View File

@ -62,6 +62,7 @@ Countries: Länder
Street: Straße
housenumber: Hausnummer
mobilephonenumber: Mobilnummer
phonenumber: Telefonnummer
offer: Angebot
cancelation: Storno
credit: Gutschrift

View File

@ -537,7 +537,7 @@
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="col-md-6">
<div class="row mb-3">
<label class="col-md-3 form-control-label">
{{ form_label(form.senderTel) }}
@ -548,7 +548,7 @@
{{ form_errors(form.senderTel) }}
</div>
</div>
<div class="col-md-4">
<div class="col-md-6">
<div class="row mb-3">
<label class="col-md-3 form-control-label">
{{ form_label(form.senderFax) }}
@ -559,7 +559,20 @@
{{ form_errors(form.senderFax) }}
</div>
</div>
<div class="col-md-4">
</div>
<div class="row">
<div class="col-md-6">
<div class="row mb-3">
<label class="col-md-3 form-control-label">
{{ form_label(form.senderPhone) }}
</label>
<div class="col-md-9">
{{ form_widget(form.senderPhone) }}
</div>
{{ form_errors(form.senderPhone) }}
</div>
</div>
<div class="col-md-6">
<div class="row mb-3">
<label class="col-md-3 form-control-label">
{{ form_label(form.senderMobile) }}
@ -570,6 +583,7 @@
{{ form_errors(form.senderMobile) }}
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">

View File

@ -1,16 +1,16 @@
<ul class="px-6 space-y-3">
<li>
<button class="flex items-center justify-between w-full"><div class="flex items-center gap-4 text-gray-600 dark:text-gray-300"><p class="flex-1 font-bold uppercase text-xs tracking-wider">Systemeinstellungen</p></div></button>
<button class="flex items-center justify-between w-full mt-4"><div class="flex items-center gap-4 text-gray-600 dark:text-gray-300"><p class="flex-1 font-bold uppercase text-xs tracking-wider">Systemeinstellungen</p></div></button>
{{ knp_menu_render('backend.menu.system', {'template': '@PSCBackendDashboard/menu/knp_tailwind_menu.html.twig', 'ancestorClass': 'open', 'currentClass': 'active'}) }}
</li>
<li>
<ul class="text-sm pl-4 space-y-1 -mx-3 mt-2">
<ul class="text-sm space-y-1 -mx-3 mt-2">
<li class="nav-item">
<div>
<a href="{{ path("psc_system_plugin_backend_list") }}" class="flex items-center justify-center gap-3 px-3 py-2 rounded-lg font-medium transition hover:bg-psc-500 focus:bg-psc-500 hover:text-white focus:text-white">
<i class="fab fa-lg fa-app-store"></i>
<span class="flex flex-1">Apps & App Store</span>
<div class="flex flex-1" x-show="$store.sideBar.isOpen">Apps & App Store</div>
</a></div>
</li>
</ul>

View File

@ -32,7 +32,7 @@ class Assets
$this->kernel = $kernel;
}
public function install()
public function install(): void
{
// Create the bundles directory otherwise symlink will fail.
@ -63,15 +63,7 @@ class Assets
$this->filesystem->remove($dirsToRemove);
}
/**
* Copies origin to target.
*
* @param string $originDir
* @param string $targetDir
*
* @return string
*/
private function hardCopy($originDir, $targetDir)
private function hardCopy($originDir, $targetDir): void
{
$this->filesystem->mkdir($targetDir, 0777);
// We use a custom iterator to ignore VCS files

View File

@ -1,48 +0,0 @@
<?php
namespace PSC\System\SettingsBundle\Service;
use Doctrine\ORM\EntityManagerInterface;
use Imagine\Image\ImagineInterface;
use Imagine\Imagick\Imagine;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
/**
* Shop
*
* @author Thomas Peterson
*/
class DeprecatedFile
{
protected $entityManager;
protected $liip_imagine;
public function __construct(EntityManagerInterface $em, CacheManager $liip_imagine)
{
$this->entityManager = $em;
$this->liip_imagine = $liip_imagine;
}
/**
* @return string
*/
public function getFilePath($fileUUID)
{
if (strlen($fileUUID) <= 30) {
}
$file1 = $this->entityManager->getRepository('PSC\Shop\EntityBundle\Entity\Image')->findOneBy(['uid' => $fileUUID]);
if (!$file1 || !file_exists(str_replace("temp", "uploads_backend", $file1->getPath()))) {
return false;
} else {
if (!file_exists('uploads_backend/' . md5($file1->getPath()) . '.png')) {
$imagine = $this->imagine->open(str_replace("temp", "uploads_backend", $file1->getPath()));
$this->imagine->save('uploads_backend/' . md5($file1->getPath()) . '.png');
}
return 'uploads_backend/' . md5($file1->getPath()) . '.png';
}
}
}

View File

@ -24,57 +24,22 @@ class PaperDB implements ObjectRepository
}
/**
* Finds an object by its primary key / identifier.
*
* @param mixed $id The identifier.
*
* @return object|null The object.
*/
public function find($id)
public function find($id): ?Paper
{
// TODO: Implement find() method.
return null;
}
/**
* Finds all objects in the repository.
*
* @return array The objects.
*/
public function findAll()
public function findAll(): array
{
// TODO: Implement findAll() method.
return [];
}
/**
* Finds objects by a set of criteria.
*
* Optionally sorting and limiting details can be passed. An implementation may throw
* an UnexpectedValueException if certain values of the sorting or limiting details are
* not supported.
*
* @param array $criteria
* @param array|null $orderBy
* @param int|null $limit
* @param int|null $offset
*
* @return array The objects.
*
* @throws \UnexpectedValueException
*/
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null): array
{
// TODO: Implement findBy() method.
return [];
}
/**
* Finds a single object by a set of criteria.
*
* @param array $criteria The criteria.
*
* @return object|null The object.
*/
public function findOneBy(array $criteria)
public function findOneBy(array $criteria): ?Paper
{
/** @var Paper $paper */
$paper = $this->entityManager->getRepository(Paper::class)->findOneBy($criteria);
@ -115,17 +80,12 @@ class PaperDB implements ObjectRepository
return $paper;
}
/**
* Returns the class name of the object managed by the repository.
*
* @return string
*/
public function getClassName()
public function getClassName(): string
{
// TODO: Implement getClassName() method.
return self::class;
}
public function getNewObject()
public function getNewObject(): Paper
{
return new Paper();
}

View File

@ -74,19 +74,18 @@ class Printing
->addDocumentNote('Rechnung gemäß Bestellung vom ' . $orderModel->getCreated()->format('d.m.Y'))
->setDocumentSupplyChainEvent($orderModel->getCreated())
->setDocumentBuyerReference($orderModel->getInvoiceAddress()->getLId())
->setDocumentSeller($orderModel->getSenderAddress()->getCompany() . ' ' . $orderModel->getSenderAddress()->getFirstname() . ' ' . $orderModel->getSenderAddress()->getLastname(), "")
->setDocumentSellerAddress($orderModel->getSenderAddress()->getStreet() . ' ' . $orderModel->getSenderAddress()->getHouseNumber(), "", "", $orderModel->getSenderAddress()->getZip(), $orderModel->getSenderAddress()->getCity(), $orderModel->getSenderAddress()->getCountry() ?? 'DE')
->setDocumentSellerContact($orderModel->getSenderAddress()->getFirstname() . ' ' . $orderModel->getSenderAddress()->getLastname(), $orderModel->getSenderAddress()->getCompany(), $orderModel->getSenderAddress()->getPhone(), $orderModel->getSenderAddress()->getMobilPhone(), $orderModel->getSenderAddress()->getEmail())
->setDocumentSellerCommunication("EM", $orderModel->getSenderAddress()->getEmail())
->setDocumentBuyer($orderModel->getInvoiceAddress()->getCompany() . ' ' . $orderModel->getInvoiceAddress()->getFirstname() . ' ' . $orderModel->getInvoiceAddress()->getLastname(), $orderModel->getInvoiceAddress()->getKundenNr())
->setDocumentBuyerAddress($orderModel->getInvoiceAddress()->getStreet() . ' ' . $orderModel->getInvoiceAddress()->getHouseNumber(), "", "", $orderModel->getInvoiceAddress()->getZip(), $orderModel->getInvoiceAddress()->getCity(), $orderModel->getInvoiceAddress()->getCountry() ?? 'DE')
->setDocumentBuyerCommunication("EM", $orderModel->getInvoiceAddress()->getEmail())
->addDocumentPaymentMean(ZugferdPaymentMeans::UNTDID_4461_58, null, null, null, null, null, $orderModel->getSenderAddress()->getIban(), null, null, null)
->addDocumentPaymentTermXRechnung($orderModel->getPayment()->getTitle(), [], [], [], null, null)
->addDocumentSellerVATRegistrationNumber($orderModel->getSenderAddress()->getUstId())
->addDocumentSellerTaxNumber($orderModel->getSenderAddress()->getSteuerId())
->addDocumentPaymentMean(ZugferdPaymentMeans::UNTDID_4461_58, null, null, null, null, null, $orderModel->getOperator()->getIban(), null, null, null)
->setDocumentSellerContact($orderModel->getOperator()->getFirstname() . ' ' . $orderModel->getOperator()->getLastname(), $orderModel->getOperator()->getCompany(), $orderModel->getOperator()->getPhone(), $orderModel->getOperator()->getMobilePhone(), $orderModel->getOperator()->getEmail())
->addDocumentSellerVATRegistrationNumber($orderModel->getOperator()->getUstId())
->addDocumentSellerTaxNumber($orderModel->getOperator()->getSteuerId())
->setDocumentSellerCommunication("EM", $orderModel->getOperator()->getEmail())
->setDocumentSeller($orderModel->getOperator()->getCompany() . ' ' . $orderModel->getOperator()->getFirstname() . ' ' . $orderModel->getOperator()->getLastname(), "")
->setDocumentSellerAddress($orderModel->getOperator()->getStreet() . ' ' . $orderModel->getOperator()->getHouseNumber(), "", "", $orderModel->getOperator()->getZip(), $orderModel->getOperator()->getCity(), $orderModel->getOperator()->getCountry() ?? 'DE')
;
foreach ($orderModel->getTaxes() as $tax) {
@ -291,28 +290,87 @@ class Printing
->setDocumentInformation($orderModel->getAlias(), "380", $orderModel->getCreated(), "EUR")
->addDocumentNote('Rechnung gemäß Bestellung vom ' . $orderModel->getCreated()->format('d.m.Y'))
->setDocumentSupplyChainEvent($orderModel->getCreated())
->setDocumentSeller($orderModel->getSenderAddress()->getCompany() . ' ' . $orderModel->getSenderAddress()->getFirstname() . ' ' . $orderModel->getSenderAddress()->getLastname(), "549910")
->setDocumentSellerAddress($orderModel->getSenderAddress()->getStreet() . ' ' . $orderModel->getSenderAddress()->getHouseNumber(), "", "", $orderModel->getSenderAddress()->getZip(), $orderModel->getSenderAddress()->getCity(), $orderModel->getSenderAddress()->getCountry() ?? 'DE')
->setDocumentBuyerReference($orderModel->getInvoiceAddress()->getLId())
->setDocumentBuyer($orderModel->getInvoiceAddress()->getCompany() . ' ' . $orderModel->getInvoiceAddress()->getFirstname() . ' ' . $orderModel->getInvoiceAddress()->getLastname(), $orderModel->getInvoiceAddress()->getKundenNr())
->setDocumentBuyerAddress($orderModel->getInvoiceAddress()->getStreet() . ' ' . $orderModel->getInvoiceAddress()->getHouseNumber(), "", "", $orderModel->getInvoiceAddress()->getZip(), $orderModel->getInvoiceAddress()->getCity(), $orderModel->getInvoiceAddress()->getCountry() ?? 'DE');
->setDocumentBuyerAddress($orderModel->getInvoiceAddress()->getStreet() . ' ' . $orderModel->getInvoiceAddress()->getHouseNumber(), "", "", $orderModel->getInvoiceAddress()->getZip(), $orderModel->getInvoiceAddress()->getCity(), $orderModel->getInvoiceAddress()->getCountry() ?? 'DE')
->setDocumentBuyerCommunication("EM", $orderModel->getInvoiceAddress()->getEmail())
->addDocumentPaymentTermXRechnung($orderModel->getPayment()->getTitle(), [], [], [], null, null)
->addDocumentPaymentMean(ZugferdPaymentMeans::UNTDID_4461_58, null, null, null, null, null, $orderModel->getOperator()->getIban(), null, null, null)
->setDocumentSellerContact($orderModel->getOperator()->getFirstname() . ' ' . $orderModel->getOperator()->getLastname(), $orderModel->getOperator()->getCompany(), $orderModel->getOperator()->getPhone(), $orderModel->getOperator()->getMobilePhone(), $orderModel->getOperator()->getEmail())
->addDocumentSellerVATRegistrationNumber($orderModel->getOperator()->getUstId())
->addDocumentSellerTaxNumber($orderModel->getOperator()->getSteuerId())
->setDocumentSellerCommunication("EM", $orderModel->getOperator()->getEmail())
->setDocumentSeller($orderModel->getOperator()->getCompany() . ' ' . $orderModel->getOperator()->getFirstname() . ' ' . $orderModel->getOperator()->getLastname(), "")
->setDocumentSellerAddress($orderModel->getOperator()->getStreet() . ' ' . $orderModel->getOperator()->getHouseNumber(), "", "", $orderModel->getOperator()->getZip(), $orderModel->getOperator()->getCity(), $orderModel->getOperator()->getCountry() ?? 'DE')
;
foreach ($orderModel->getTaxes() as $tax) {
$document->addDocumentTax("S", "VAT", $tax->getValue() / 100, $tax->getValue() / 100, $tax->getName() / 100);
if ($tax->getCalculatedAmount() > 0) {
$document->addDocumentTax("S", "VAT", $tax->getBasisAmount() / 100, $tax->getCalculatedAmount() / 100, $tax->getName() / 100);
}
}
$document
->setDocumentSummation($orderModel->getGross() / 100, $orderModel->getGross() / 100, $orderModel->getNet() / 100, 0.0, 0.0, $orderModel->getNet() / 100, $orderModel->getTaxesSum() / 100, null, 0.0);
->setDocumentSummation(
$orderModel->getGross() / 100,
$orderModel->getGross() / 100,
$orderModel->getPositionsNet() / 100,
$orderModel->getSurcharges() / 100,
0.0,
$orderModel->getNet() / 100,
$orderModel->getTaxesSum() / 100,
null,
0.0
);
foreach ($orderModel->getPositions() as $position) {
$document
->addNewPosition($position->getPos())
->setDocumentPositionProductDetails($position->getProduct()->getTitle())
->setDocumentPositionGrossPrice($position->getPrice()->getGross() / 100)
// ->setDocumentPositionGrossPrice($position->getPrice()->getGross() / 100)
->setDocumentPositionNetPrice($position->getPrice()->getNet() / 100)
->setDocumentPositionQuantity(1, "H87")
->addDocumentPositionTax('S', 'VAT', $position->getPrice()->getTax()->getName() / 100)
->setDocumentPositionLineSummation($position->getPrice()->getNet() / 100)
;
}
if ($orderModel->getPayment()->getCalcPrice()->net > 0) {
$document
->addDocumentAllowanceCharge(
$orderModel->getPayment()->getCalcPrice()->net / 100,
true,
'S',
'VAT',
$orderModel->getPayment()->getCalcPrice()->tax->getName() / 100,
null,
null,
null,
null,
null,
'CAL',
'PaymentCoast'
);
}
if ($orderModel->getShipping()->getCalcPrice()->net > 0) {
$document
->addDocumentAllowanceCharge(
$orderModel->getShipping()->getCalcPrice()->net / 100,
true,
'S',
'VAT',
$orderModel->getShipping()->getCalcPrice()->tax->getName() / 100,
null,
null,
null,
null,
null,
'SAA',
'ShippingCoast'
);
}
$output = $this->mpdf->Output(null, \Mpdf\Output\Destination::STRING_RETURN);
$output = (new ZugferdDocumentPdfMerger($document->getContent(), $output))->generateDocument()->downloadString("file");
} else {

View File

@ -15,8 +15,10 @@
{% block stylesheets %}
{{ encore_entry_link_tags('backend/tailwind') }}
{% endblock %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="apple-touch-icon" sizes="57x57" href="/apps/icons/apple-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/apps/icons/apple-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/apps/icons/apple-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/apps/icons/apple-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/apps/icons/apple-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/apps/icons/apple-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/apps/icons/apps/icons/apple-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/apps/icons/apple-icon-152x152.png"><link rel="apple-touch-icon" sizes="180x180" href="/apps/icons/apple-icon-180x180.png"><link rel="icon" type="image/png" sizes="192x192" href="/apps/icons/android-icon-192x192.png"><link rel="icon" type="image/png" sizes="32x32" href="/apps/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="96x96" href="/apps/icons/favicon-96x96.png"><link rel="icon" type="image/png" sizes="16x16" href="/apps/icons/favicon-16x16.png"><link rel="manifest" href="/apps/icons/manifest.json"><meta name="msapplication-TileColor" content="#ffffff"><meta name="msapplication-TileImage" content="/apps/icons/ms-icon-144x144.png"><meta name="theme-color" content="#ffffff">
</head>
<body class="min-h-screen bg-gray-100 text-gray-900 overflow-y-auto dark:text-gray-100 dark:bg-gray-900">
<div class="flex h-full w-full overflow-x-clip">
@ -43,7 +45,6 @@
<ul class="px-6 space-y-3">
<li>
<button class="flex items-center justify-between w-full"><div class="flex items-center gap-4 text-gray-600 dark:text-gray-300"><p class="flex-1 font-bold uppercase text-xs tracking-wider">Shop</p></div></button>
{{ knp_menu_render('backend.menu.main', {'template': '@PSCBackendDashboard/menu/knp_tailwind_menu.html.twig', 'ancestorClass': 'open', 'currentClass': 'active'}) }}
</li>
</ul>
@ -63,11 +64,11 @@
</svg>
</button>
<div class="flex items-center justify-between flex-1">
<div class="flex-1 flex flex-row">
<div class="flex-1 flex flex-col md:flex-row">
<div class="mr-3">
{{ render(controller('PSC\\Backend\\DashboardBundle\\Controller\\ShopController::myEditableShopsTailwindAction', { tw: true })) }}
</div>
<div class="swarm">
<div class="hidden md:block swarm">
</div>
</div>
<div>

View File

@ -0,0 +1,271 @@
<?php
namespace Tests\PSC\Shop\Order\Api;
use PSC\Shop\EntityBundle\Repository\JobRepository;
use Tests\RefreshDatabaseTrait;
use PSC\Shop\EntityBundle\Entity\Shop;
use PSC\Shop\EntityBundle\Repository\ShopRepository;
use PSC\Shop\PaymentBundle\Repository\PaymentRepository;
use PSC\Shop\ShippingBundle\Repository\ShippingRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class XRechnungOperatorFromShopTest extends WebTestCase
{
use RefreshDatabaseTrait;
public function testCreateOrderDefault(): void
{
$client = static::createClient();
$shopRepository = static::getContainer()->get(ShopRepository::class);
/**
* @var Shop $shop
*/
$shop = $shopRepository->findOneBy(['title' => 'Printchampion']);
$shippingRepository = static::getContainer()->get(ShippingRepository::class);
$paymentRepository = static::getContainer()->get(PaymentRepository::class);
$client->jsonRequest(
'POST',
'/api/order/create',
[
'shop' => [
'uuid' => (string)$shop->getUuid()
],
'type' => 2,
'shipping' => [
'uid' => $shippingRepository->findOneBy(['title' => 'Deutschlandweit'])->getUid()
],
'payment' => [
'uid' => $paymentRepository->findOneBy(['title' => 'per Rechnung'])->getUid()
],
'draft' => false,
'deliveryAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17506',
'city' => 'Gribow'
],
'invoiceAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17400',
'city' => 'Berlin'
],
'positions' => [
[
'count' => 1,
'product' => [
'title' => 'test XML',
'specialProductTypeObject' => [
'typ' => 6,
'taxClass' => 1900,
'xml' => '<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>Blocks A5 25blatt geleimt</name>
<kommentar>kein</kommentar>
<option id="auflage" name="Auflage" type="Input" width="3" require="true" default="1">
<auflage>
<grenze formel="(10*5)">1-</grenze>
</auflage>
</option>
</artikel>
</kalkulation>'
]
]
],
[
'count' => 1,
'product' => [
'title' => 'test Manual Position',
'specialProductTypeObject' => [
'typ' => 1,
'cent' => true,
'net' => 145,
'taxClass' => 1900
]
]
]
]
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertSame(200, $client->getResponse()->getStatusCode());
$data = json_decode($client->getResponse()->getContent(), true);
$client->jsonRequest(
'POST',
'/api/order/getonebyuuid',
[
'uuid' => $data['uuid'],
],
['HTTP_apiKey' => $shop->getApiKey()]
);
$data = json_decode($client->getResponse()->getContent(), true);
self::assertSame(7647, $data['gross']);
self::assertSame('SAN-'.date("Ym").'-1', $data['alias']);
self::assertSame('Berlin', $data['invoiceAddress']['city']);
self::assertSame('Gribow', $data['deliveryAddress']['city']);
self::assertSame('ShopMusterIban', $data['operator']['iban']);
self::assertSame('ShopMusterSteuerId', $data['operator']['steuerId']);
self::assertSame(200, $client->getResponse()->getStatusCode());
/**
* @var JobRepository $jobs
*/
$jobs = static::getContainer()->get(JobRepository::class);
self::assertCount(0, $jobs->findBy(['data.order' => $data['uuid']]));
}
public function testCreateOrderWithCreateActionDefault(): void
{
$client = static::createClient();
$shopRepository = static::getContainer()->get(ShopRepository::class);
/**
* @var Shop $shop
*/
$shop = $shopRepository->findOneBy(['title' => 'Printchampion']);
$shippingRepository = static::getContainer()->get(ShippingRepository::class);
$paymentRepository = static::getContainer()->get(PaymentRepository::class);
$client->jsonRequest(
'POST',
'/api/order/create',
[
'shop' => [
'uuid' => (string)$shop->getUuid()
],
'type' => 2,
'shipping' => [
'uid' => $shippingRepository->findOneBy(['title' => 'Deutschlandweit'])->getUid()
],
'payment' => [
'uid' => $paymentRepository->findOneBy(['title' => 'per Rechnung'])->getUid()
],
'draft' => false,
'deliveryAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17506',
'city' => 'Gribow'
],
'invoiceAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17400',
'city' => 'Berlin'
],
'positions' => [
[
'count' => 1,
'product' => [
'title' => 'test XML',
'specialProductTypeObject' => [
'typ' => 6,
'taxClass' => 1900,
'xml' => '<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>Blocks A5 25blatt geleimt</name>
<kommentar>kein</kommentar>
<option id="auflage" name="Auflage" type="Input" width="3" require="true" default="1">
<auflage>
<grenze formel="(10*5)">1-</grenze>
</auflage>
</option>
</artikel>
</kalkulation>'
]
]
],
[
'count' => 1,
'product' => [
'title' => 'test Manual Position',
'specialProductTypeObject' => [
'typ' => 1,
'cent' => true,
'net' => 145,
'taxClass' => 1900
]
]
]
]
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertSame(200, $client->getResponse()->getStatusCode());
$data = json_decode($client->getResponse()->getContent(), true);
$client->jsonRequest(
'POST',
'/api/order/getonebyuuid',
[
'uuid' => $data['uuid'],
],
['HTTP_apiKey' => $shop->getApiKey()]
);
$data = json_decode($client->getResponse()->getContent(), true);
self::assertSame(7647, $data['gross']);
self::assertSame('SAN-'.date("Ym").'-1', $data['alias']);
self::assertSame('Berlin', $data['invoiceAddress']['city']);
self::assertSame('Gribow', $data['deliveryAddress']['city']);
// FIXME: self::assertCount(1, $data['taxes']);
self::assertCount(4, $data['allTaxes']);
self::assertSame(200, $client->getResponse()->getStatusCode());
/**
* @var JobRepository $jobs
*/
$jobs = static::getContainer()->get(JobRepository::class);
$client->jsonRequest(
'GET',
'/api/order/action/create/' . $data['uuid'],
[
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertCount(1, $jobs->findBy(['data.order' => $data['uuid']]));
}
}

View File

@ -0,0 +1,275 @@
<?php
namespace Tests\PSC\Shop\Order\Api;
use PSC\Shop\EntityBundle\Repository\JobRepository;
use Tests\RefreshDatabaseTrait;
use PSC\Shop\EntityBundle\Entity\Shop;
use PSC\Shop\EntityBundle\Repository\ShopRepository;
use PSC\Shop\PaymentBundle\Repository\PaymentRepository;
use PSC\Shop\ShippingBundle\Repository\ShippingRepository;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class XRechnungOperatorProvidedTest extends WebTestCase
{
use RefreshDatabaseTrait;
public function testCreateOrderDefault(): void
{
$client = static::createClient();
$shopRepository = static::getContainer()->get(ShopRepository::class);
/**
* @var Shop $shop
*/
$shop = $shopRepository->findOneBy(['title' => 'Printchampion']);
$shippingRepository = static::getContainer()->get(ShippingRepository::class);
$paymentRepository = static::getContainer()->get(PaymentRepository::class);
$client->jsonRequest(
'POST',
'/api/order/create',
[
'shop' => [
'uuid' => (string)$shop->getUuid()
],
'type' => 2,
'shipping' => [
'uid' => $shippingRepository->findOneBy(['title' => 'Deutschlandweit'])->getUid()
],
'payment' => [
'uid' => $paymentRepository->findOneBy(['title' => 'per Rechnung'])->getUid()
],
'draft' => false,
'operator' => [
'iban' => 'iban',
'steuerId' => 'steuerId'
],
'deliveryAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17506',
'city' => 'Gribow'
],
'invoiceAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17400',
'city' => 'Berlin'
],
'positions' => [
[
'count' => 1,
'product' => [
'title' => 'test XML',
'specialProductTypeObject' => [
'typ' => 6,
'taxClass' => 1900,
'xml' => '<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>Blocks A5 25blatt geleimt</name>
<kommentar>kein</kommentar>
<option id="auflage" name="Auflage" type="Input" width="3" require="true" default="1">
<auflage>
<grenze formel="(10*5)">1-</grenze>
</auflage>
</option>
</artikel>
</kalkulation>'
]
]
],
[
'count' => 1,
'product' => [
'title' => 'test Manual Position',
'specialProductTypeObject' => [
'typ' => 1,
'cent' => true,
'net' => 145,
'taxClass' => 1900
]
]
]
]
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertSame(200, $client->getResponse()->getStatusCode());
$data = json_decode($client->getResponse()->getContent(), true);
$client->jsonRequest(
'POST',
'/api/order/getonebyuuid',
[
'uuid' => $data['uuid'],
],
['HTTP_apiKey' => $shop->getApiKey()]
);
$data = json_decode($client->getResponse()->getContent(), true);
self::assertSame(7647, $data['gross']);
self::assertSame('SAN-'.date("Ym").'-1', $data['alias']);
self::assertSame('Berlin', $data['invoiceAddress']['city']);
self::assertSame('Gribow', $data['deliveryAddress']['city']);
self::assertSame('iban', $data['operator']['iban']);
self::assertSame('steuerId', $data['operator']['steuerId']);
self::assertSame(200, $client->getResponse()->getStatusCode());
/**
* @var JobRepository $jobs
*/
$jobs = static::getContainer()->get(JobRepository::class);
self::assertCount(0, $jobs->findBy(['data.order' => $data['uuid']]));
}
public function testCreateOrderWithCreateActionDefault(): void
{
$client = static::createClient();
$shopRepository = static::getContainer()->get(ShopRepository::class);
/**
* @var Shop $shop
*/
$shop = $shopRepository->findOneBy(['title' => 'Printchampion']);
$shippingRepository = static::getContainer()->get(ShippingRepository::class);
$paymentRepository = static::getContainer()->get(PaymentRepository::class);
$client->jsonRequest(
'POST',
'/api/order/create',
[
'shop' => [
'uuid' => (string)$shop->getUuid()
],
'type' => 2,
'shipping' => [
'uid' => $shippingRepository->findOneBy(['title' => 'Deutschlandweit'])->getUid()
],
'payment' => [
'uid' => $paymentRepository->findOneBy(['title' => 'per Rechnung'])->getUid()
],
'draft' => false,
'deliveryAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17506',
'city' => 'Gribow'
],
'invoiceAddress' => [
'firstname' => 'Thomas',
'lastname' => 'Peterson',
'street' => 'Chausseestr.',
'houseNumber' => '24',
'zip' => '17400',
'city' => 'Berlin'
],
'positions' => [
[
'count' => 1,
'product' => [
'title' => 'test XML',
'specialProductTypeObject' => [
'typ' => 6,
'taxClass' => 1900,
'xml' => '<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>Blocks A5 25blatt geleimt</name>
<kommentar>kein</kommentar>
<option id="auflage" name="Auflage" type="Input" width="3" require="true" default="1">
<auflage>
<grenze formel="(10*5)">1-</grenze>
</auflage>
</option>
</artikel>
</kalkulation>'
]
]
],
[
'count' => 1,
'product' => [
'title' => 'test Manual Position',
'specialProductTypeObject' => [
'typ' => 1,
'cent' => true,
'net' => 145,
'taxClass' => 1900
]
]
]
]
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertSame(200, $client->getResponse()->getStatusCode());
$data = json_decode($client->getResponse()->getContent(), true);
$client->jsonRequest(
'POST',
'/api/order/getonebyuuid',
[
'uuid' => $data['uuid'],
],
['HTTP_apiKey' => $shop->getApiKey()]
);
$data = json_decode($client->getResponse()->getContent(), true);
self::assertSame(7647, $data['gross']);
self::assertSame('SAN-'.date("Ym").'-1', $data['alias']);
self::assertSame('Berlin', $data['invoiceAddress']['city']);
self::assertSame('Gribow', $data['deliveryAddress']['city']);
// FIXME: self::assertCount(1, $data['taxes']);
self::assertCount(4, $data['allTaxes']);
self::assertSame(200, $client->getResponse()->getStatusCode());
/**
* @var JobRepository $jobs
*/
$jobs = static::getContainer()->get(JobRepository::class);
$client->jsonRequest(
'GET',
'/api/order/action/create/' . $data['uuid'],
[
],
['HTTP_apiKey' => $shop->getApiKey()]
);
self::assertCount(1, $jobs->findBy(['data.order' => $data['uuid']]));
}
}

View File

@ -1,5 +1,5 @@
<?php
namespace App\Tests\PSC\Shop\Payment\Controller;
namespace Tests\PSC\Shop\Payment\Controller;
use Tests\RefreshDatabaseTrait;
use PSC\Shop\ContactBundle\Repository\ContactRepository;
@ -30,4 +30,4 @@ class ListTest extends WebTestCase
$crawler = $crawler->filter('.table > tbody > tr');
$this->assertSame(4, $crawler->count());
}
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace Tests\PSC\Shop\Payment\E2E;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Symfony\Component\Panther\Client;
use Symfony\Component\Panther\PantherTestCase;
use Tests\RefreshDatabaseTrait;
class ListTest extends PantherTestCase
{
use RefreshDatabaseTrait;
protected $client;
public function setUp(): void
{
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments(['--window-size=1200,1100', '--disable-gpu']);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);
$this->client = Client::createSeleniumClient(
'http://chrome:4444',
$capabilities,
'http://application:9001'
);
static::startWebServer(['hostname' => 'application']);
}
public function tearDown(): void
{
$this->client->close();
unset($this->client);
static::stopWebServer();
}
public function testPaymentList(): void
{
$this->client->get('/backend/login');
$crawler = $this->client->submitForm('login', ['username' => 'admin@shop.de', 'password' => 'shop2014']);
$crawler = $this->client->get('/backend/dashboard');
self::assertSame('Dashboard', $this->client->getCrawler()->filter('h1')->text());
$crawler = $this->client->clickLink('Zahlarten');
self::assertStringContainsString('Zahlarten', $this->client->getCrawler()->filter('h3')->text());
}
}

View File

@ -1,5 +1,5 @@
<?php
namespace App\Tests\PSC\Shop\Payment\Controller;
namespace Tests\PSC\Shop\Payment\Controller;
use Tests\RefreshDatabaseTrait;
use PSC\Shop\PaymentBundle\Repository\PaymentRepository;
@ -15,11 +15,11 @@ class PriceTest extends KernelTestCase
{
$priceService = static::getContainer()->get(Price::class);
$paymentRepository = static::getContainer()->get(paymentRepository::class);
$paymentRepository = static::getContainer()->get(PaymentRepository::class);
$paymentTransformer = static::getContainer()->get(Payment::class);
$paymentModel = new \PSC\Shop\PaymentBundle\Model\payment();
$paymentModel = new \PSC\Shop\PaymentBundle\Model\Payment();
$paymentTransformer->fromDb($paymentModel, $paymentRepository->findOneBy(['title' => 'per Rechnung']));
/** @var Price $price */
@ -32,4 +32,4 @@ class PriceTest extends KernelTestCase
$this->assertSame($price->vat, 101);
}
}
}

View File

@ -1,52 +1,48 @@
<?php
namespace Plugins\System\PSC\Invoice\App;
namespace Tests\Plugins\System\PSC\Invoice\App;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Symfony\Component\BrowserKit\AbstractBrowser;
use Symfony\Component\Panther\Client;
use Symfony\Component\Panther\PantherTestCase;
use Symfony\Component\Panther\ServerExtension;
use Tests\RefreshDatabaseTrait;
class LoginPantherTest extends PantherTestCase
{
use RefreshDatabaseTrait;
protected $client;
private function createClientManually(): Client
public function setUp(): void
{
self::bootKernel();
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments(['--window-size=1200,1100', '--disable-gpu',]);
$chromeOptions->addArguments(['--window-size=1200,1100', '--disable-gpu']);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);
self::$pantherClient = Client::createSeleniumClient(
$this->client = Client::createSeleniumClient(
'http://chrome:4444',
$capabilities,
'http://application:9001'
);
ServerExtension::registerClient(self::$pantherClient);
// you can avoid having to use Closure::bind if you use PantherTestCaseTrait directly
\Closure::bind(function(AbstractBrowser $client) {
// contrary to the name, calling it with argument will set local static variable inside getClient method
self::getClient($client);
}, null, PantherTestCase::class)(self::$pantherClient);
return self::$pantherClient;
static::startWebServer(['hostname' => 'application']);
}
public function testLogin(): void
public function tearDown(): void
{
$this->client->close();
unset($this->client);
static::stopWebServer();
}
public function testPaymentList(): void
{
static::startWebServer(['hostname' => 'application']);
$this->client = $this->createClientManually();
$this->client->get('/backend/login');
$crawler = $this->client->submitForm('login', ['username' => 'admin@shop.de', 'password' => 'shop2014']);
$this->client->get('/backend/dashboard');
$this->assertSelectorTextContains('h1', 'Dashboard');
self::assertSame('Dashboard', $this->client->getCrawler()->filter('h1')->text());
$this->client->clickLink('CMS');
$this->assertSelectorTextContains('h3', 'CMS');
// $this->assertSelectorTextContains('h3', 'CMS');
}
}

View File

@ -116,6 +116,7 @@ trait RefreshDatabaseTrait
$shop->setSenderLId("ShopMusterLeitwegId");
$shop->setSenderIban("ShopMusterIban");
$shop->setSenderEmail("ShopMusterEmail");
$shop->setSenderSteuerId("ShopMusterSteuerId");
$doc->persist($shop);
$doc->flush();

View File

@ -0,0 +1,51 @@
<?php
namespace Plugin\Custom\BUW\Orderimport\Controller;
use Ddeboer\Imap\Server;
use Doctrine\ODM\MongoDB\DocumentManager;
use PSC\Shop\EntityBundle\Document\Queue;
use PSC\System\SettingsBundle\Service\Shop;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/check')]
class CheckController extends AbstractController
{
public function __construct(private Shop $shopService, private DocumentManager $documentManager)
{
}
#[Route('/{uuid}', name: 'psc_plugin_custom_buw_orderimport_check')]
public function indexAction(string $uuid): JsonResponse
{
$queue = $this->documentManager->getRepository(Queue::class)->find($uuid);
$queueDocument = $queue->getQueueDocument();
if ($queueDocument->getImapFlags() == "") {
$server = new Server($queueDocument->getImapServer(), $queueDocument->getImapPort());
} else {
$server = new Server($queueDocument->getImapServer(), $queueDocument->getImapPort(), $queueDocument->getImapFlags());
}
$connection = $server->authenticate($queueDocument->getImapUsername(), $queueDocument->getImapPassword());
$data = $connection->getMailboxes();
$temp = [];
foreach ($data as $row) {
$temp[] = [
'key' => $row->getName(),
'name' => $row->getName() . '(' . $row->count() . ')'
];
}
return new JsonResponse(['success' => true, 'data' => $temp, 'count' => count($temp)]);
}
}

View File

@ -0,0 +1,114 @@
<?php
namespace Plugin\Custom\BUW\Orderimport\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument;
use Doctrine\ODM\MongoDB\Mapping\Annotations\Field;
#[EmbeddedDocument]
class Import
{
#[Field(type: 'string')]
protected $folder;
#[Field(type: 'string')]
protected $imapFolder;
#[Field(type: 'string')]
protected $imapFinishFolder;
#[Field(type: 'string')]
protected $imapServer;
#[Field(type: 'string')]
protected $imapPort;
#[Field(type: 'string')]
protected $imapUsername;
#[Field(type: 'string')]
protected $imapFlags;
#[Field(type: 'string')]
protected $imapPassword;
public function getFolder(): string
{
return $this->folder;
}
public function setFolder(?string $folder): void
{
$this->folder = $folder;
}
public function getFinishImapFolder(): string
{
return (string)$this->imapFinishFolder;
}
public function setFinishImapFolder(?string $var): void
{
$this->imapFinishFolder = $var;
}
public function getImapServer(): string
{
return (string)$this->imapServer;
}
public function setImapServer(?string $imapServer): void
{
$this->imapServer = $imapServer;
}
public function getImapUsername(): string
{
return (string)$this->imapUsername;
}
public function setImapUsername(?string $imapUsername): void
{
$this->imapUsername = $imapUsername;
}
public function getImapPassword(): string
{
return (string)$this->imapPassword;
}
public function setImapPassword(?string $imapPassword): void
{
$this->imapPassword = $imapPassword;
}
public function getImapFolder(): string
{
return (string)$this->imapFolder;
}
public function setImapFolder(?string $imapFolder): void
{
$this->imapFolder = $imapFolder;
}
public function getImapFlags(): string
{
return (string)$this->imapFlags;
}
public function setImapFlags(?string $var): void
{
$this->imapFlags = $var;
}
public function getImapPort(): string
{
return (string)$this->imapPort;
}
public function setImapPort(?string $var): void
{
$this->imapPort = $var;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Plugin\Custom\BUW\Orderimport;
use PSC\System\PluginBundle\Plugin\Base;
class Plugin extends Base implements \PSC\System\PluginBundle\Interfaces\Plugin
{
protected $name = 'Import Plugin';
protected $defaultInstall = true;
public function getType()
{
return Plugin::Queues;
}
public function getDescription()
{
return 'Importiert Aufträge aus einem Imap Konto und erzeugt XML';
}
public function getVersion()
{
return 1;
}
}

View File

@ -0,0 +1,168 @@
<?php
namespace Plugin\Custom\BUW\Orderimport\Queue;
use Ddeboer\Imap\Server;
use Doctrine\ORM\EntityManagerInterface;
use PSC\Shop\EntityBundle\Document\Queue;
use PSC\Shop\EntityBundle\Entity\Contact;
use PSC\Shop\EntityBundle\Entity\Shop as PSCShop;
use PSC\Shop\OrderBundle\Service\Order;
use PSC\Shop\QueueBundle\Event\EventInterface;
use PSC\Shop\QueueBundle\Type\ConfigurableElementInterface;
use PSC\Shop\QueueBundle\Type\QueueInterface;
use PSC\System\SettingsBundle\Document\LogEntry;
use PSC\System\SettingsBundle\Service\Log;
use PSC\System\SettingsBundle\Service\Shop;
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
#[AutoconfigureTag(name: "queues")]
class Import implements QueueInterface, ConfigurableElementInterface
{
public function __construct(
private FormFactoryInterface $formFactory,
private TokenStorageInterface $securityContext,
private Order $orderService,
private Shop $shopService,
private EntityManagerInterface $entityManager,
private Log $logService
) {
}
/**
* @return string
*/
public function getType(): string
{
return 'psc_plugin_custom_buw_orderimport_import';
}
/**
* @return string
*/
public function getGroup(): string
{
return 'Allgemeines';
}
public function getDescription(): string
{
return 'XML (Imap) Import Plugin';
}
public function getName(): string
{
return 'XML (Imap) Import Plugin';
}
public function getForm(FormBuilderInterface $builder, $form_options, EventInterface $event): void
{
$builder->add("imapUsername", TextType::class, array('label' => 'Imap Username', 'attr' => array('class' => 'form-element')));
$builder->add("imapPassword", PasswordType::class, array('label' => 'Imap Password', 'required' => false, 'attr' => array('class' => 'form-element')));
$builder->add("imapServer", TextType::class, array('label' => 'Imap Server', 'attr' => array('class' => 'form-element')));
$builder->add("imapFolder", TextType::class, array('label' => 'Import Folder Imap', 'required' => false, 'attr' => array('class' => 'form-element')));
$builder->add("imapFinishFolder", TextType::class, array('label' => 'Finish Folder Imap', 'required' => false, 'attr' => array('class' => 'form-element')));
$builder->add("imapFlags", TextType::class, array('label' => 'Imap Flags', 'required' => false, 'attr' => array('class' => 'form-element')));
$builder->add("imapPort", TextType::class, array('label' => 'Imap Port', 'attr' => array('class' => 'form-element')));
$builder->add("folder", TextType::class, array('label' => 'Folder', 'attr' => array('class' => 'form-element')));
}
public function injectDocument(Form $form, EventInterface $event, Queue $objQueue): void
{
$url = new \Plugin\Custom\BUW\Orderimport\Document\Import();
if ($objQueue->getQueueDocument() != null) {
$url = $objQueue->getQueueDocument();
}
$url->setImapUsername($form->get('imapUsername')->getData());
if ($form->get('imapPassword')->getData() != "") {
$url->setImapPassword($form->get('imapPassword')->getData());
}
$url->setImapServer($form->get('imapServer')->getData());
$url->setFolder($form->get('folder')->getData());
$url->setImapFolder($form->get('imapFolder')->getData());
$url->setFinishImapFolder($form->get('imapFinishFolder')->getData());
$url->setImapPort($form->get('imapPort')->getData());
$url->setImapFlags($form->get('imapFlags')->getData());
$objQueue->setQueueDocument($url);
}
public function setFormData(Form $form, EventInterface $event, Queue $queueObj): void
{
$form->get('imapFolder')->setData($queueObj->getQueueDocument()->getImapFolder());
$form->get('folder')->setData($queueObj->getQueueDocument()->getFolder());
$form->get('imapServer')->setData($queueObj->getQueueDocument()->getImapServer());
$form->get('imapUsername')->setData($queueObj->getQueueDocument()->getImapUsername());
$form->get('imapPort')->setData($queueObj->getQueueDocument()->getImapPort());
$form->get('imapFinishFolder')->setData($queueObj->getQueueDocument()->getFinishImapFolder());
$form->get('imapFlags')->setData($queueObj->getQueueDocument()->getImapFlags());
$form->get('imapPassword')->setData($queueObj->getQueueDocument()->getImapPassword());
}
public function getTemplate(): string
{
return '@PluginCustomBUWOrderimport/queue/import.html.twig';
}
public function execute(EventInterface $event, Queue $doc): bool
{
try {
/** @var \Plugin\Custom\BUW\Orderimport\Document\Import $queueSettings */
$queueSettings = $doc->getQueueDocument();
if (false && file_exists($queueSettings->getFolder() . "/run_oi.txt")) {
return true;
}
file_put_contents($queueSettings->getFolder() . "/run_oi.txt", "import");
set_time_limit(0);
if ($queueSettings->getImapFlags() == "") {
$server = new Server($queueSettings->getImapServer(), $queueSettings->getImapPort());
} else {
$server = new Server($queueSettings->getImapServer(), $queueSettings->getImapPort(), $queueSettings->getImapFlags());
}
$connection = $server->authenticate($queueSettings->getImapUsername(), $queueSettings->getImapPassword());
$messages = $connection->getMailbox($queueSettings->getImapFolder())->getMessages();
$finishFolder = $connection->getMailbox($queueSettings->getFinishImapFolder());
foreach ($messages as $message) {
$attachments = $message->getAttachments();
foreach ($attachments as $attachment) {
file_put_contents(
$queueSettings->getFolder().'/' . $attachment->getFilename(),
$attachment->getDecodedContent()
);
$this->logService->createLogEntry(new PSCShop(), new Contact(), LogEntry::INFO, self::class, "orderimport", "Order Import Imap", ['file' => $attachment->getFilename()]);
}
$message->move($finishFolder);
}
$connection->expunge();
unlink($queueSettings->getFolder() . "/run_oi.txt");
} catch (\Exception $e) {
echo $e->getMessage();
return false;
}
return true;
}
public function getError(): string
{
return $this->_error;
}
}

View File

@ -0,0 +1,4 @@
psc_plugin_custom_Weber:
resource: "@PluginCustomBUWOrderimport/Controller"
type: annotation
prefix: /plugin/custom/buw

View File

@ -0,0 +1,7 @@
services:
_defaults:
autowire: true
autoconfigure: true
Plugin\Custom\BUW\Orderimport\:
resource: '../../*/*'

View File

@ -0,0 +1,122 @@
<div class="panel">
<div class="header">
<h4>Details</h4>
</div>
<div class="body">
<div class="row">
<div class="col-md-4">
<div class="form-group row">
<label class="col-md-3 form-control-label">{{ form_label(form.imapUsername) }}</label>
<div class="col-md-9">
{{ form_widget(form.imapUsername) }}
</div>
</div>
</div>
<div class="col-md-4">
<div class="form-group row">
<label class="col-md-3 form-control-label">{{ form_label(form.imapPassword) }}</label>
<div class="col-md-9">
{{ form_widget(form.imapPassword) }}
</div>
</div>
</div>
<div class="col-md-4">
<div class="form-group row">
<label class="col-md-3 form-control-label">{{ form_label(form.imapServer) }}</label>
<div class="col-md-9">
{{ form_widget(form.imapServer) }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group row">
<label class="col-md-3 form-control-label">{{ form_label(form.imapPort) }}</label>
<div class="col-md-9">
{{ form_widget(form.imapPort) }}
</div>
</div>
</div>
<div class="col-md-4">
<div class="form-group row">
<label class="col-md-3 form-control-label">{{ form_label(form.imapFlags) }}</label>
<div class="col-md-9">
{{ form_widget(form.imapFlags) }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group row">
<label class="col-md-1 form-control-label">{{ form_label(form.imapFolder) }}</label>
<div class="col-md-11">
{{ form_widget(form.imapFolder) }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group row">
<label class="col-md-1 form-control-label">{{ form_label(form.imapFinishFolder) }}</label>
<div class="col-md-11">
{{ form_widget(form.imapFinishFolder) }}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group row">
<label class="col-md-1 form-control-label">{{ form_label(form.folder) }}</label>
<div class="col-md-11">
{{ form_widget(form.folder) }}
</div>
</div>
</div>
</div>
{% if objQueue.id != "" %}
<div class="row">
<div class="col-2">
<p><button class="btn btn-sm btn-success testImap" type="button">Test</button></p>
</div>
<div class="col-8">
<div class="resultImap"></div>
<hr/>
<table class="table resultImapDir"></table>
</div>
</div>
{% endif %}
</div>
</div>
{% block javascripts %}
{% if objQueue.id != "" %}
<script>
document.addEventListener("DOMContentLoaded", function(event) {
$('.testImap').click(function() {
$.getJSON('{{ path('psc_plugin_custom_buw_orderimport_check', {'uuid': objQueue.id}) }}', {}, function(d) {
if(d.success) {
$('.resultImap').html('<span class="alert alert-success">Verbindung erfolgreich (' + d.count + ' Elemente)</span>');
$('.resultImapDir').empty();
$( d.data ).each(function( index, element ) {
$('.resultImapDir').append('<tr><td><a class="btn btn-sm btn-default" onclick="$(\'#form_imapFolder\').val(\'' + element.key + '\')">Import Benutzen</a></td><td><a class="btn btn-sm btn-default" onclick="$(\'#form_imapFinishFolder\').val(\'' + element.key + '\')">Finish Benutzen</a></td><td>' + element.name + '</td></tr>');
});
}else{
$('.resultImap').html('<span class="alert alert-danger">Verbindung konnte nicht hergestellt werden</span>');
}
})
.fail(function() {
$('.resultImap').html('<span class="alert alert-danger">Verbindung konnte nicht hergestellt werden</span>');
});
})
})
</script>
{% endif %}
{% endblock %}

View File

@ -1,5 +1,5 @@
<div class="panel panel-default">
<div class="header"><h5>Pintess Layouter</h5></div>
<div class="header"><h5>Printess Layouter</h5></div>
<div class="body">
<div class="row">
<div class="col-md-5">

View File

@ -106,8 +106,8 @@
formFields: [
{% for row in data %}
{
name: "{{ row.name }}",
value: "{{ row.value }}"
name: '{{ row.name }}',
value: '{{ row.value|raw }}'
},
{% endfor %}
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,9 @@
{
"build/backend/login.css": "/apps/build/backend/login.5a878154.css",
"build/backend/login.css": "/apps/build/backend/login.25156160.css",
"build/backend/login.js": "/apps/build/backend/login.ab0272c2.js",
"build/backend/dashboard.css": "/apps/build/backend/dashboard.f30e17f9.css",
"build/backend/dashboard.js": "/apps/build/backend/dashboard.564e38a5.js",
"build/backend/tailwind.css": "/apps/build/backend/tailwind.420ea542.css",
"build/backend/tailwind.css": "/apps/build/backend/tailwind.42479308.css",
"build/backend/tailwind.js": "/apps/build/backend/tailwind.d1378a3a.js",
"build/runtime.js": "/apps/build/runtime.44b7f9b9.js",
"build/185.99565361.js": "/apps/build/185.99565361.js",

View File

@ -3247,6 +3247,9 @@ class UserController extends TP_Controller_Action
$contact->account_id = $account->id;
}
}
if (isset($formData ['rech'] ['account'])) {
$contact->account_id = (int)$formData ['rech'] ['account'];
}
$contact->save();
if (isset($formData ['rech'] ['custom1'])) {